/// <summary>
        ///     Called when the CLI invokes this command.
        /// </summary>
        /// <param name="IpcClient">Interprocess communication pipe to the application that invoked this command.</param>
        internal void Run(CommandIPC IpcClient)
        {
            VirtualPath = VirtualFileSystem.Normalize(VirtualPath);

            string ParentPath = VirtualFileSystem.GetParentPath(VirtualPath);
            string NodeName   = VirtualFileSystem.GetNodeName(VirtualPath);

            bool DeleteInProgress = false;
            bool IsComplete       = false;

            if (!Program.NetClient.IsConnected)
            {
                IpcClient.Respond("FAILED: No connection to server.");
                return;
            }

            if (!Program.NetClient.Permissions.HasPermission(UserPermissionType.Write, "", false, true))
            {
                IpcClient.Respond("FAILED: Permission denied to manage builds.");
                return;
            }

            BuildsRecievedHandler BuildsRecievedHandler = (RootPath, Builds) =>
            {
                if (RootPath == ParentPath && !DeleteInProgress)
                {
                    bool Found = false;

                    foreach (NetMessage_GetBuildsResponse.BuildInfo Info in Builds)
                    {
                        if (VirtualFileSystem.GetNodeName(Info.VirtualPath).ToLower() == NodeName.ToLower())
                        {
                            if (Info.Guid == Guid.Empty)
                            {
                                IpcClient.Respond("FAILED: Path is not a build.");
                                IsComplete = true;
                            }
                            else
                            {
                                IpcClient.Respond(string.Format("Deleting manifest with guid: {0}", Info.Guid));
                                Program.NetClient.DeleteManifest(Info.Guid);
                            }

                            Found = true;
                            break;
                        }
                    }

                    if (!Found)
                    {
                        IpcClient.Respond("FAILED: Path is not a build.");
                        IsComplete = true;
                    }

                    DeleteInProgress = true;
                }
            };

            ManifestDeleteResultRecievedHandler ManifestRecieveHandler = Id =>
            {
                IpcClient.Respond("SUCCESS: Deleted manifest.");
                IsComplete = true;
            };

            Program.NetClient.OnBuildsRecieved += BuildsRecievedHandler;
            Program.NetClient.OnManifestDeleteResultRecieved += ManifestRecieveHandler;

            if (!Program.NetClient.RequestBuilds(ParentPath))
            {
                IpcClient.Respond("FAILED: Failed to request builds for unknown reason.");
                return;
            }

            Program.PumpLoop(
                () =>
            {
                if (!Program.NetClient.IsConnected)
                {
                    IpcClient.Respond("FAILED: Lost connection to server.");
                    return(true);
                }

                return(IsComplete);
            }
                );

            Program.NetClient.OnManifestDeleteResultRecieved -= ManifestRecieveHandler;
            Program.NetClient.OnBuildsRecieved -= BuildsRecievedHandler;
        }
Example #2
0
        /// <summary>
        ///     Called when the CLI invokes this command.
        /// </summary>
        /// <param name="IpcClient">Interprocess communication pipe to the application that invoked this command.</param>
        internal void Run(CommandIPC IpcClient)
        {
            VirtualPath = VirtualFileSystem.Normalize(VirtualPath);

            if (!Program.NetClient.IsConnected)
            {
                IpcClient.Respond("FAILED: No connection to server.");
                return;
            }

            bool GotResults = false;

            BuildsRecievedHandler BuildsRecievedHandler = (RootPath, Builds) =>
            {
                if (GotResults)
                {
                    return;
                }

                if (RootPath == VirtualPath)
                {
                    string Format = "{0,-30} | {1,-40} | {2,-25}";

                    IpcClient.Respond(string.Format(Format, "Path", "Id", "Create Time"));
                    foreach (NetMessage_GetBuildsResponse.BuildInfo Info in Builds)
                    {
                        if (Info.Guid == Guid.Empty)
                        {
                            IpcClient.Respond(string.Format(Format, VirtualFileSystem.GetNodeName(Info.VirtualPath), "", ""));
                        }
                        else
                        {
                            IpcClient.Respond(string.Format(Format, VirtualFileSystem.GetNodeName(Info.VirtualPath), Info.Guid, Info.CreateTime));
                        }
                    }

                    IpcClient.Respond("");

                    GotResults = true;
                }
            };

            Program.NetClient.OnBuildsRecieved += BuildsRecievedHandler;

            if (!Program.NetClient.RequestBuilds(VirtualPath))
            {
                IpcClient.Respond("FAILED: Failed to request builds for unknown reason.");
                return;
            }

            Program.PumpLoop(
                () =>
            {
                if (!Program.NetClient.IsConnected)
                {
                    IpcClient.Respond("FAILED: Lost connection to server.");
                    return(true);
                }

                return(GotResults);
            }
                );

            Program.NetClient.OnBuildsRecieved -= BuildsRecievedHandler;
        }
Example #3
0
        /// <summary>
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PushUpdateClicked(object sender, EventArgs e)
        {
            using (OpenFileDialog Dialog = new OpenFileDialog())
            {
                Dialog.Title  = "Select Update File";
                Dialog.Filter = "Installer File (*.msi)|*.msi";
                //Dialog.InitialDirectory = Environment.CurrentDirectory;
                Dialog.CheckFileExists = true;
                Dialog.ShowHelp        = true;

                if (Dialog.ShowDialog(this) == DialogResult.OK)
                {
                    string msiVersion = InstallUtils.GetMsiProperty(Dialog.FileName, "ProductVersion");
                    if (msiVersion.Length == 0)
                    {
                        MessageBox.Show("Failed to retrieve version data from msi.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    BuildsRecievedHandler Handler = null;
                    Handler = (RootPath, Builds) =>
                    {
                        Program.NetClient.OnBuildsRecieved -= Handler;

                        // Find the next sequential build index.
                        string NewVirtualPath = RootPath + "/" + msiVersion;

                        bool Exists = false;
                        foreach (NetMessage_GetBuildsResponse.BuildInfo Build in Builds)
                        {
                            if (Build.VirtualPath.ToUpper() == NewVirtualPath.ToUpper())
                            {
                                Exists = true;
                                break;
                            }
                        }

                        if (Exists)
                        {
                            MessageBox.Show("Version is already uploaded.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }

                        // Publish a folder.
                        string TempFolder = FileUtils.GetTempDirectory();
                        File.Copy(Dialog.FileName, Path.Combine(TempFolder, "installer.msi"));

                        // Publish the build.
                        PublishBuildTask Publisher = new PublishBuildTask();
                        Publisher.Start(NewVirtualPath, TempFolder);

                        Task.Run(
                            () =>
                        {
                            bool PublishComplete = false;
                            while (!PublishComplete)
                            {
                                switch (Publisher.State)
                                {
                                case BuildPublishingState.CopyingFiles:
                                case BuildPublishingState.ScanningFiles:
                                case BuildPublishingState.UploadingManifest:
                                    {
                                        // Ignore
                                        break;
                                    }

                                case BuildPublishingState.Success:
                                    {
                                        Invoke((MethodInvoker)(() => { Publisher.Commit(); }));
                                        Publisher       = null;
                                        PublishComplete = true;
                                        break;
                                    }

                                default:
                                    {
                                        Publisher       = null;
                                        PublishComplete = true;
                                        break;
                                    }
                                }

                                Thread.Sleep(1000);
                            }
                        }
                            );
                    };

                    Program.NetClient.OnBuildsRecieved += Handler;
                    Program.NetClient.RequestBuilds("$Internal$/Updates");
                }
            }
        }