diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/App.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/App.kt index 2ba8a1a..046ac70 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/App.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/App.kt @@ -9,6 +9,7 @@ import com.abdownloadmanager.desktop.utils.* import com.abdownloadmanager.desktop.utils.singleInstance.* import com.abdownloadmanager.integration.Integration import com.abdownloadmanager.utils.DownloadSystem +import com.sun.jna.platform.win32.Advapi32Util import ir.amirab.util.platform.Platform import kotlinx.coroutines.runBlocking import okio.Path.Companion.toOkioPath diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/di/Di.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/di/Di.kt index 7eeb2dd..e2f08ba 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/di/Di.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/di/Di.kt @@ -196,10 +196,8 @@ val startUpModule = module { single { Startup.getStartUpManagerForDesktop( name = AppInfo.name, - path = AppInfo.exeFile?.let { exeFile -> - "$exeFile ${AppArguments.Args.BACKGROUND}" - }, - jar = false, + path = AppInfo.exeFile, + args = listOf(AppArguments.Args.BACKGROUND), ) } } diff --git a/shared/auto-start/build.gradle.kts b/shared/auto-start/build.gradle.kts index f3ab805..ed63262 100644 --- a/shared/auto-start/build.gradle.kts +++ b/shared/auto-start/build.gradle.kts @@ -3,4 +3,6 @@ plugins { } dependencies { implementation(project(":shared:utils")) + // for windows, we use registry + implementation(libs.jna.platform) } \ No newline at end of file diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/AbstractStartupManager.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/AbstractStartupManager.kt index 66ed859..9ae6b17 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/AbstractStartupManager.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/AbstractStartupManager.kt @@ -1,11 +1,22 @@ package ir.amirab.util.startup abstract class AbstractStartupManager( - val isJar: Boolean, val name: String, val path: String, + val args: List, ) { @Throws(Exception::class) abstract fun install() abstract fun uninstall() + + fun getExecutableWithArgs(): String { + return buildList { + add(path.quoted()) + addAll(args) + }.joinToString(" ") + } + + private fun String.quoted(): String { + return "\"$this\"" + } } diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/HeadlessStartup.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/HeadlessStartup.kt index c80a3e2..de2cec5 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/HeadlessStartup.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/HeadlessStartup.kt @@ -3,11 +3,11 @@ package ir.amirab.util.startup class HeadlessStartup( name: String, path: String, - isJar: Boolean = false, + args: List, ) : AbstractStartupManager( name = name, path = path, - isJar = isJar + args = args, ) { @Throws(Exception::class) override fun install() { diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/MacOSStartup.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/MacOSStartup.kt index 2672241..83485e2 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/MacOSStartup.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/MacOSStartup.kt @@ -7,9 +7,11 @@ import java.io.PrintWriter class MacOSStartup( name: String, path: String, - isJar: Boolean, + args: List, ) : AbstractStartupManager( - path = path, name = name, isJar = isJar, + path = path, + name = name, + args = args, ) { private fun getFile(): File { if (!launchAgentsDir.exists()) { @@ -28,11 +30,7 @@ class MacOSStartup( out.println("\t" + super.name + "") out.println("\tProgramArguments") out.println("\t") - if (isJar) { - out.println("\t\tjava") - out.println("\t\t-jar") - } - out.println("\t\t" + super.path + "") + out.println("\t\t" + getExecutableWithArgs() + "") out.println("\t") out.println("\tRunAtLoad") out.println("\t") diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Startup.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Startup.kt index 5759561..5dbcef1 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Startup.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Startup.kt @@ -7,11 +7,14 @@ object Startup { * Add file to startup * @param name Name of key/file * @param path Path to file - * @param jar If file should be executed by the JVM * @throws Exception */ @Throws(Exception::class) - fun getStartUpManagerForDesktop(name: String, path: String?, jar: Boolean = false): AbstractStartupManager { + fun getStartUpManagerForDesktop( + name: String, + path: String?, + args: List, + ): AbstractStartupManager { if (path==null){ //there is no installation path provided so we use no-op return noImplStartUpManager() @@ -20,18 +23,19 @@ object Startup { val startup=when (os) { Platform.Desktop.Linux -> { if (Utils.isHeadless) { - HeadlessStartup(name, path, jar) + HeadlessStartup(name, path, args) } else { - UnixXDGStartup(name, path, jar) + UnixXDGStartup(name, path, args) } } - Platform.Desktop.MacOS -> MacOSStartup(name, path, jar) - Platform.Desktop.Windows -> WindowsStartup(name, path, jar) + + Platform.Desktop.MacOS -> MacOSStartup(name, path, args) + Platform.Desktop.Windows -> WindowsStartup(name, path, args) Platform.Android -> error("this code should not be called in android") } return startup } private fun noImplStartUpManager(): HeadlessStartup { - return HeadlessStartup("","",false) + return HeadlessStartup("", "", emptyList()) } } diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/UnixXDGStartup.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/UnixXDGStartup.kt index 12ad140..0d47cd3 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/UnixXDGStartup.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/UnixXDGStartup.kt @@ -5,38 +5,32 @@ import java.io.FileWriter import java.io.PrintWriter class UnixXDGStartup( - name:String, + name: String, path: String, - isJar:Boolean=false + args: List, ) : AbstractStartupManager( name = name, path = path, - isJar = isJar + args = args, ) { private fun getAutoStartFile(): File { if (!autostartDir.exists()) { autostartDir.mkdirs() } - return File(autostartDir, super.name + ".desktop") + return File(autostartDir, this.name + ".desktop") } + @Throws(Exception::class) override fun install() { val out = PrintWriter(FileWriter(getAutoStartFile())) out.println("[Desktop Entry]") out.println("Type=Application") - out.println("Name=" + super.name) - if (isJar) { - out.println("Exec=java -jar '" + super.path + "'") - } else { - out.println("Exec=" + super.path) - } + out.println("Name=" + this.name) + out.println("Exec=" + getExecutableWithArgs()) out.println("Terminal=false") out.println("NoDisplay=true") out.close() - - val cmd = arrayOf("chmod", "+x", super.path) - Runtime.getRuntime().exec(cmd) } override fun uninstall() { diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Utils.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Utils.kt index f23e40a..6b8bac8 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Utils.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/Utils.kt @@ -7,11 +7,6 @@ import java.io.File import java.io.InputStreamReader object Utils { - val jarFile: File - get() = File( - Utils::class.java.protectionDomain.codeSource.location.path.replace("%20", " ").replace("file:", "") - ) - @get:Throws(Exception::class) val isRoot: Boolean get() = Platform.getCurrentPlatform() !== Platform.Desktop.Windows && BufferedReader( diff --git a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/WindowsStartup.kt b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/WindowsStartup.kt index b566d20..e90ecea 100644 --- a/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/WindowsStartup.kt +++ b/shared/auto-start/src/main/kotlin/ir/amirab/util/startup/WindowsStartup.kt @@ -1,41 +1,37 @@ package ir.amirab.util.startup +import com.sun.jna.platform.win32.Advapi32Util +import com.sun.jna.platform.win32.WinReg + class WindowsStartup( name: String, path: String, - isJar: Boolean = false, + args: List, ) : AbstractStartupManager( name = name, path = path, - isJar = isJar + args = args ) { - - private fun getData(): String { - - return if (isJar) { - val javaHome = System.getProperty("java.home") + "\\bin\\javaw.exe" - "$javaHome -jar \"$path\"" - } else { - super.path - } - } @Throws(Exception::class) override fun install() { - val data=getData() - - Runtime.getRuntime().exec( - arrayOf("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\", "/v", super.name, "/t", - "REG_SZ", "/d", data, "/f" - ) + val data = getExecutableWithArgs() + Advapi32Util.registrySetStringValue( + WinReg.HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Run", + this.name, + data ) } override fun uninstall() { - Runtime.getRuntime().exec( - arrayOf( - "reg", "delete", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\", - "/v", super.name, "/f", + try { + Advapi32Util.registryDeleteValue( + WinReg.HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Run", + this.name, ) - ) + } catch (e: Exception) { + e.printStackTrace() + } } }