Пример #1
0
        internal static void EnsureCanonicalFoldersArePresent()
        {
            var root = PackageManagerSettings.CoAppRootDirectory;
            // try to make a convenience symlink:  %SYSTEMDRIVE%:\apps
            var appsdir = "{0}:\\apps".format(root[0]);

            if (!Directory.Exists(appsdir) && !File.Exists(appsdir))
            {
                Symlink.MakeDirectoryLink("{0}:\\apps".format(root[0]), root);
            }

            var pathext = EnvironmentUtility.GetSystemEnvironmentVariable("PATHEXT");

            if (pathext.IndexOf(".lnk", StringComparison.CurrentCultureIgnoreCase) == -1)
            {
                EnvironmentUtility.SetSystemEnvironmentVariable("PATHEXT", pathext + ";.lnk");
            }

            foreach (var path in CanonicalFolders.Select(folder => Path.Combine(root, folder)).Where(path => !Directory.Exists(path)))
            {
                Directory.CreateDirectory(path);
            }

            // make sure system paths are updated.
            var binPath = Path.Combine(root, "bin");
            var psPath  = Path.Combine(root, "powershell");

            if (!EnvironmentUtility.SystemPath.Contains(binPath))
            {
                EnvironmentUtility.SystemPath = EnvironmentUtility.SystemPath.Prepend(binPath);
            }
            if (!EnvironmentUtility.PowershellModulePath.Contains(psPath))
            {
                EnvironmentUtility.PowershellModulePath = EnvironmentUtility.PowershellModulePath.Prepend(psPath);
            }

            EnvironmentUtility.BroadcastChange();
        }
Пример #2
0
        public Installer(string filename)
        {
            try {
                MsiFilename = filename;
                Quiet       = ((AppDomain.CurrentDomain.GetData("QUIET") as string) ?? "false").IsTrue();
                Passive     = ((AppDomain.CurrentDomain.GetData("PASSIVE") as string) ?? "false").IsTrue();
                Remove      = ((AppDomain.CurrentDomain.GetData("REMOVE") as string) ?? "false").IsTrue();

                Logger.Message("Quiet {0}/Passive {1}/Remove {2}", Quiet, Passive, Remove);

                // was coapp just installed by the bootstrapper?
                var tsk = Task.Factory.StartNew(() => {
                    if (((AppDomain.CurrentDomain.GetData("COAPP_INSTALLED") as string) ?? "false").IsTrue())
                    {
                        // we'd better make sure that the most recent version of the service is running.
                        EngineServiceManager.InstallAndStartService();
                        EnvironmentUtility.BroadcastChange();
                    }
                    bool wasCreated;
                    var ewhSec = new EventWaitHandleSecurity();
                    ewhSec.AddAccessRule(new EventWaitHandleAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), EventWaitHandleRights.FullControl, AccessControlType.Allow));
                    _ping = new EventWaitHandle(false, EventResetMode.ManualReset, "BootstrapperPing", out wasCreated, ewhSec);
                });

                // force the explorer process to pick up changes to the environment.
                EnvironmentUtility.BroadcastChange();

                var ts2 = tsk.Continue(() => {
                    // gets the package data for the likely suspects.
                    _packageManager.AddSessionFeed(Path.GetDirectoryName(Path.GetFullPath(MsiFilename))).Continue(() => {
                        _packageManager.GetPackageFromFile(Path.GetFullPath(MsiFilename)).Continue(pkg =>
                                                                                                   Task.WaitAll(new[] { pkg.InstalledNewest, pkg.AvailableNewestUpdate, pkg.AvailableNewestUpgrade }
                                                                                                                .Select(each => each != null ? _packageManager.GetPackage(each.CanonicalName, true)
                                                                                                                        .Continue(() => { _packageManager.GetPackageDetails(each.CanonicalName); })
                                : "".AsResultTask())
                                                                                                                .UnionSingleItem(_packageManager.GetPackageDetails(pkg).Continue(() => { PrimaryPackage = pkg; }))
                                                                                                                .ToArray()));
                    });
                });

                tsk.ContinueOnFail(error => {
                    DoError(InstallerFailureState.FailedToGetPackageFromFile, error);
                    ExitQuick();
                });

                try {
                    Application.ResourceAssembly = Assembly.GetExecutingAssembly();
                } catch {
                }

                ts2.Wait();

                if (!Quiet)
                {
                    _window = new InstallerMainWindow(this);
                    if (Remove)
                    {
                        _window.Loaded += (sender, args) => _window.RemoveButtonClick(sender, args);
                    }
                    else if (Passive)
                    {
                        _window.Loaded += (sender, args) => _window.InstallButtonClick(sender, args);
                    }

                    _window.ShowDialog();

                    if (Application.Current != null)
                    {
                        Application.Current.Shutdown(0);
                    }
                }
                else
                {
                    // when quiet
                    var discard  = RemoveChoices.ToArray();
                    var discard2 = InstallChoices.ToArray();

                    if (Remove)
                    {
                        if (CanRemove)
                        {
                            RemoveAll().Wait();
                        }
                    }
                    else
                    {
                        Logger.Message("Thinkin' about installin' {0}", CanInstall);
                        Debugger.Break();
                        if (CanInstall)
                        {
                            Install().Wait();
                        }
                    }
                }
                ExitQuick();
            }
            catch (Exception e) {
                DoError(InstallerFailureState.FailedToGetPackageDetails, e);
            }
        }