#filter substitution // main var srDest; var err; var fProgram; logComment("initInstall"); function registerProgramFolderKey(winreg, fFolderPath) { var subkey; var err; /* set the Program Folder Path in the Mozilla key in the Windows Registry */ winreg.createKey("SOFTWARE\\$CompanyName$",""); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "CurrentVersion", "$UserAgent$"); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$"; winreg.createKey(subkey,""); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "Program Folder Path", fFolderPath); } function createShortcuts() { var subkey; var valname; var szStartMenuPrograms; var szStartMenu; var szFolderDesktop; var szFolderQuickLaunch; var szFolderSendTo; var szFolderAppData; var szStartupFolder; var winreg; var fWindows; var fTemp; var fProgram; var fDefShortcuts; var fileExe; var fileReadme; var fileLicense; var scExeDesc; var scReadmeDesc; var scLicenseDesc; var scProfileDesc; var scProfileDescParam; var scFolderName; var fFolderDesktop; var fFolderPath; var fFolderPathStr; var fFolderQuickLaunch; var is_winnt; var szCurrentVersion; var folderQuickLaunchExists; winreg = getWinRegistry(); fWindows = getFolder("Windows"); fProgram = getFolder("Program"); fDefShortcuts = getFolder("Program","defaults/shortcuts"); fTemp = fProgram + "$MainExeFile$"; fileExe = getFolder("file:///", fTemp); fileReadme = getFolder("file:///", fProgram + "readme.txt"); fileLicense = getFolder("file:///", fProgram + "license.txt"); scExeDesc = "$ProductName$"; scReadmeDesc = "Readme"; scLicenseDesc = "License"; scProfileDesc = "Profile Manager"; scProfileDescParam = "-ProfileManager"; scSafeModeDesc = "$ProductName$ (No Extensions)"; scSafeModeDescParam = "-safe-mode"; scFolderName = "$ProductName$"; fileMailIcon = getFolder("Chrome", "icons/default/messengerWindow.ico"); if(winreg != null) { /* determine if the script is running under NT or not */ winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"; szCurrentVersion = winreg.getValueString(subkey, "CurrentVersion"); logComment("szCurrentVersion: " + szCurrentVersion); if((szCurrentVersion == "") || (szCurrentVersion == null)) { is_winnt = false; } else { is_winnt = true; } logComment("is_winnt value: " + is_winnt); logComment("restrictedAccess value: " + restrictedAccess); if(!is_winnt || restrictedAccess) { winreg.setRootKey(winreg.HKEY_CURRENT_USER); subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; szStartMenuPrograms = winreg.getValueString(subkey, "Programs"); szStartMenu = winreg.getValueString(subkey, "Start Menu"); szFolderDesktop = winreg.getValueString(subkey, "Desktop"); szStartupFolder = winreg.getValueString(subkey, "Startup"); } else { winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; szStartMenuPrograms = winreg.getValueString(subkey, "Common Programs"); szStartMenu = winreg.getValueString(subkey, "Common Start Menu"); szFolderDesktop = winreg.getValueString(subkey, "Common Desktop"); szStartupFolder = winreg.getValueString(subkey, "Common Startup"); } winreg.setRootKey(winreg.HKEY_CURRENT_USER); subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; szFolderSendTo = winreg.getValueString(subkey, "SendTo"); subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; szFolderAppData = winreg.getValueString(subkey, "AppData"); // locate the Quick Launch folder szFolderQuickLaunch = szFolderAppData + "\\Microsoft\\Internet Explorer\\Quick Launch"; fFolderQuickLaunch = getFolder("file:///", szFolderQuickLaunch); folderQuickLaunchExists = File.isDirectory(fFolderQuickLaunch); if(!folderQuickLaunchExists) { subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GrpConv\\MapGroups"; szFolderQuickLaunch = winreg.getValueString(subkey, "Quick Launch"); folderQuickLaunchExists = File.isDirectory(fFolderPath); if(folderQuickLaunchExists) fFolderQuickLaunch = getFolder("file:///", szFolderQuickLaunch); } logComment("folderQuickLaunchExists: " + folderQuickLaunchExists); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main"; fFolderPathStr = winreg.getValueString(subkey, "Program Folder Path"); if((fFolderPathStr == "") || (fFolderPathStr == null)) { fTemp = szStartMenuPrograms + "\\" + scFolderName; fFolderPath = getFolder("file:///", fTemp); } else { /* convert the path string to a path folder object */ fFolderPath = getFolder("file:///", fFolderPathStr); } /* convert the path string to a path folder object */ fFolderDesktop = getFolder("file:///", szFolderDesktop); logComment("Folder StartMenuPrograms: " + szStartMenuPrograms); logComment("Folder StartMenu : " + szStartMenu); logComment("Folder FolderDesktop : " + szFolderDesktop); logComment("Folder FolderSendTo : " + szFolderSendTo); logComment("Folder FolderQuickLaunch: " + szFolderQuickLaunch); logComment("fileExe : " + fileExe); logComment("fFolderPath : " + fFolderPath); logComment("scExeDesc : " + scExeDesc); logComment("fProgram : " + fProgram); /* explicitly create the fFolderPath even though the windowsShortcut function creates the folder. * This is so that the folder creation gets logged for uninstall to remove it. */ if(winreg.getValueNumber(subkey, "Create Start Menu Shortcut") != 0 && !File.exists(fFolderPath)) File.dirCreate(fFolderPath); if(winreg.getValueNumber(subkey, "Create Start Menu Shortcut") != 0 && !File.exists(fDefShortcuts)) File.dirCreate(fDefShortcuts); /* create the shortcuts */ // Create the Shortcuts winreg.setRootKey(winreg.HKEY_CURRENT_USER); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main"; if (winreg.getValueNumber(subkey, "Create Desktop Shortcut") != 0) File.windowsShortcut(fileExe, fFolderDesktop, scExeDesc, fProgram, "", fileExe, 0); if (winreg.getValueNumber(subkey, "Create Start Menu Shortcut") != 0) { File.windowsShortcut(fileExe, fFolderPath, scExeDesc, fProgram, "", fileExe, 0); File.windowsShortcut(fileExe, fFolderPath, scProfileDesc, fProgram, scProfileDescParam, fileExe, 0); File.windowsShortcut(fileExe, fFolderPath, scSafeModeDesc, fProgram, scSafeModeDescParam, fileExe, 0); File.windowsShortcut(fileReadme, fFolderPath, scReadmeDesc, fProgram, "", fileReadme, 0); File.windowsShortcut(fileLicense, fFolderPath, scLicenseDesc, fProgram, "", fileLicense, 0); } File.windowsShortcut(fileExe, fDefShortcuts, scExeDesc, fProgram, "", fileExe, 0); File.windowsShortcut(fileExe, fDefShortcuts, scSafeModeDesc, fProgram, scSafeModeDescParam, fileExe, 0); // create shortcut in the Quick Launch folder if (winreg.getValueNumber(subkey, "Create Quick Launch Shortcut") != 0 && folderQuickLaunchExists) File.windowsShortcut(fileExe, fFolderQuickLaunch, scExeDesc, fProgram, "", fileExe, 0); // Clean up after ourselves winreg.deleteValue(subkey, "Create Desktop Shortcut"); winreg.deleteValue(subkey, "Create Quick Launch Shortcut"); winreg.deleteValue(subkey, "Create Start Menu Shortcut"); if(!restrictedAccess) { winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); registerProgramFolderKey(winreg, fFolderPath); } winreg.setRootKey(winreg.HKEY_CURRENT_USER); registerProgramFolderKey(winreg, fFolderPath); // Register as a windows XP mail application if( IsWinnt() ) { subkey = "Software\\Clients\\Mail\\$ProductNameInternal$"; winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); winreg.createKey(subkey,""); winreg.createKey(subkey + "\\DefaultIcon", ""); winreg.createKey(subkey + "\\shell", ""); winreg.createKey(subkey + "\\shell\\open", ""); winreg.createKey(subkey + "\\shell\\open\\command", ""); winreg.createKey(subkey + "\\InstallInfo",""); winreg.setValueString(subkey, "", "$ProductName$"); // path does not need to be quoted per MS doc data = fProgram + "chrome\\icons\\default\\messengerWindow.ico,0"; winreg.setValueString(subkey + "\\DefaultIcon", "", data); data = "\"" + fProgram + "$MainExeFile$\""; winreg.setValueString(subkey + "\\shell\\open\\command", "", data); data = "\"" + fProgram + "uninstall\\uninstall.exe\" /ua \"$UserAgent$\" /hs"; winreg.setValueString(subkey + "\\InstallInfo", "HideIconsCommand", data); // set this value to 0 because we're not creating the mail shortcuts yet. winreg.setValueNumber(subkey + "\\InstallInfo", "IconsVisible", 0); data = "\"" + fProgram + "$MainExeFile$\" -silent -nosplash -setDefaultMail"; winreg.setValueString(subkey + "\\InstallInfo", "ReinstallCommand", data); data = "\"" + fProgram + "uninstall\\uninstall.exe\" /ua \"$UserAgent$\" /ss mail"; winreg.setValueString(subkey + "\\InstallInfo", "ShowIconsCommand", data); } } else { logComment("winreg is null"); } } function IsWinnt() { /* Determines if the script is running under NT or not. * */ var winreg = getWinRegistry(); var subkey; var szCurrentVersion; winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); subkey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"; szCurrentVersion = winreg.getValueString(subkey, "CurrentVersion"); logComment("szCurrentVersion: " + szCurrentVersion); return szCurrentVersion != ""; } function registerMainKeys(winreg) { var subkey; //the name of the subkey you are poking around in var data; var err; winreg.createKey("SOFTWARE\\$CompanyName$",""); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "CurrentVersion", "$UserAgent$"); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$"; winreg.createKey(subkey,""); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "Install Directory", fProgram); // now set Mozilla\Mozilla Thunderbird\bin\PathToExe so 3rd party vendors can find our app subkey = "SOFTWARE\\Mozilla\\$ProductName$ $UserAgentShort$\\bin"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "PathToExe", fProgram + "$MainExeFile$"); subkey = "SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main"; err = winreg.setValueString(subkey, "PathToExe", fProgram + "$MainExeFile$"); } function updateWinReg() { //Notes: // can't use a double backslash before subkey - Windows already puts it in. // subkeys have to exist before values can be put in. var winreg = getWinRegistry(); var subkey; //the name of the subkey you are poking around in var err; var ikwDefined; if(winreg != null) { /* This will check to see if the user has restricted access or not. * It checks to see if HKEY_LOCALMACHINE\SOFTWARE is writable. If * it is, then access is not restricted. This is only used to * determine which Desktop, Programs, and Start Menu folders * are to used: common or per user */ restrictedAccess = false; ikwDefined = typeof(winreg.isKeyWritable); logComment("winreg.isKeyWritable(): " + ikwDefined); if(ikwDefined == "function") { winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); if(!winreg.isKeyWritable("SOFTWARE")) restrictedAccess = true; } logComment("restrictedAccess value: " + restrictedAccess); if(!restrictedAccess) { winreg.setRootKey(winreg.HKEY_LOCAL_MACHINE); registerMainKeys(winreg); // set the App Paths key here subkey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\$MainExeFile$"; winreg.createKey(subkey,""); err = winreg.setValueString(subkey, "", fProgram + "$MainExeFile$"); err = winreg.setValueString(subkey, "Path", fProgram); } winreg.setRootKey(winreg.HKEY_CURRENT_USER); registerMainKeys(winreg); } } function upgradeCleanup() { // Now clean up Uninstall entries that may be laying around in the // registry for older versions of the software that we're overwriting/ // upgrading... var wr = getWinRegistry(); wr.setRootKey(wr.HKEY_LOCAL_MACHINE); var i = 0; const uninstallKey = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; do { var key = wr.enumKeys(uninstallKey, i++); if (!key) break; key = uninstallKey + "\\" + key; // For us to remove the entry from the ARP uninstall list, the install // folder paths must *match* and the display version strings must *NOT // MATCH* - i.e. we don't want to remove the entry we just created for // this version. var itemInstallFolder = wr.getValueString(key, "InstallLocation"); var thisInstallFolder = wr.getValueString("SOFTWARE\\$CompanyName$\\$ProductName$\\$UserAgent$\\Main", "Install Directory"); var itemInstallFolderShortName = File.windowsGetShortName(getFolder("file:///", itemInstallFolder)); var thisInstallFolderShortName = File.windowsGetShortName(getFolder("file:///", thisInstallFolder)); var itemDisplayVersion = wr.getValueString(key, "DisplayVersion"); var thisDisplayVersion = "$UserAgent$"; // It is possible that a user might have installed several products into // the same directory that have the same "DisplayVersion" (e.g. "1.0")... // in this case we don't want to trash the Uninstall info for the others // so we have to be sure to make sure Comment matches... we use Comment // instead of DisplayName since DisplayName varies from version to version // as it contains the version number, and this instance of javascript is // crippled so as not to contain any useful string parsing. var itemComment = wr.getValueString(key, "Comment"); var thisComment = "$ProductName$"; if ((itemComment == thisComment || itemComment == "Reclaim Your Inbox.") && itemInstallFolderShortName == thisInstallFolderShortName && thisDisplayVersion != itemDisplayVersion && wr.isKeyWritable(key)) { wr.deleteKey(key); logComment("Removing obsolete uninstall key with upgrade: " + key); } } while (true); } // end // end - OS type detection srDest = $SpaceRequired$:bin; err = initInstall("@AB_CD@ Langpack", "@AB_CD@", "$Version$"); logComment("initInstall: " + err); fProgram = getFolder("Program"); logComment("fProgram: " + fProgram); if(verifyDiskSpace(fProgram, srDest)) { var chromeType = LOCALE; err = addDirectory("", "bin", // dir name in jar to extract fProgram, // Where to put this file (Returned from GetFolder) ""); // Force Flag logComment("addDirectory() returned: " + err); setPackageFolder(fProgram); upgradeCleanup(); registerChrome(LOCALE | DELAYED_CHROME, getFolder("Chrome", "@AB_CD@.jar"), "locale/@AB_CD@/editor/"); registerChrome(LOCALE | DELAYED_CHROME, getFolder("Chrome", "@AB_CD@.jar"), "locale/@AB_CD@/wallet/"); // check return value if (err == SUCCESS) { updateWinReg(); // Finish registering above marshalling dll's createShortcuts(); err = performInstall(); logComment("performInstall() returned: " + err); } else { cancelInstall(err); logComment("cancelInstall due to error: " + err); } } else cancelInstall(INSUFFICIENT_DISK_SPACE); // end main