/// <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; }
/// <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; }
/// <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"); } } }