internal static void Install(BundleLibraryManifest manifest, string library_bundle_filename) { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); WebLibraryDetail web_library_detail = WebLibraryManager.Instance.GetLibrary(manifest.Id); if (null != web_library_detail) { MessageBoxes.Info("You already have a version of this Bundle Library. Please ensure you close all windows that use this library after the latest has been downloaded."); } string library_directory = WebLibraryDetail.GetLibraryBasePathForId(manifest.Id); Directory.CreateDirectory(library_directory); // Unzip the bundle string parameters = String.Format("-y x \"{0}\" -o\"{1}\"", library_bundle_filename, library_directory); using (Process process = ProcessSpawning.SpawnChildProcess(ConfigurationManager.Instance.Program7ZIP, parameters)) { using (ProcessOutputReader process_output_reader = new ProcessOutputReader(process)) { process.WaitForExit(); Logging.Info("7ZIP Log Bundle Install progress:\n{0}", process_output_reader.GetOutputsDumpStrings()); } } // Reflect this new bundle WebLibraryDetail new_web_library_detail = WebLibraryManager.Instance.UpdateKnownWebLibraryFromBundleLibraryManifest(manifest, suppress_flush_to_disk: false); WPFDoEvents.InvokeInUIThread(() => { MainWindowServiceDispatcher.Instance.OpenLibrary(new_web_library_detail); }); }
internal void ShowBundleLibraryJoiningControl(BundleLibraryManifest manifest) { BundleLibraryJoiningControl control = new BundleLibraryJoiningControl(); control.Show(); control.FocusOnManifest(manifest, "Automatically downloaded manifest..."); }
private void TailZIPProcess(BundleLibraryManifest manifest, Process zip_process) { string STATUS_TOKEN = "Bundle-" + manifest.Version; StatusManager.Instance.ClearCancelled(STATUS_TOKEN); int iteration = 0; while (true) { ++iteration; if (StatusManager.Instance.IsCancelled(STATUS_TOKEN)) { zip_process.Kill(); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Cancelled creation of Bundle Library."); return; } if (zip_process.HasExited) { StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Completed creation of Bundle Library."); return; } StatusManager.Instance.UpdateStatusBusy(STATUS_TOKEN, "Creating Bundle Library...", iteration, iteration + 1, true); Thread.Sleep(1000); } }
internal void FocusOnManifestFilename(string filename) { string json = File.ReadAllText(filename); BundleLibraryManifest manifest = BundleLibraryManifest.FromJSON(json); FocusOnManifest(manifest, filename); }
internal static void Install(BundleLibraryManifest manifest, string library_bundle_filename) { Library library = WebLibraryManager.Instance.GetLibrary(manifest.Id); if (null != library) { MessageBoxes.Info("You already have a version of this Bundle Library. Please ensure you close all windows that use this library after the latest has been downloaded."); } //string library_directory = @"C:\temp\LIBZZZZ"; string library_directory = Library.GetLibraryBasePathForId(manifest.Id); Directory.CreateDirectory(library_directory); // Unzip the bundle string parameters = String.Format("-y x \"{0}\" -o\"{1}\"", library_bundle_filename, library_directory); Process zip_process = Process.Start(ConfigurationManager.Instance.Program7ZIP, parameters); zip_process.WaitForExit(10000); // Reflect this new bundle WebLibraryDetail new_web_library_detail = WebLibraryManager.Instance.UpdateKnownWebLibraryFromBundleLibraryManifest(manifest); Application.Current.Dispatcher.Invoke(((Action)(() => MainWindowServiceDispatcher.Instance.OpenLibrary(new_web_library_detail.library) ))); }
private void ManageDownload(BundleLibraryManifest manifest) { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); string url = manifest.BaseUrl + @"/" + manifest.Id + Common.EXT_BUNDLE; using (UrlDownloader.DownloadAsyncTracker download_async_tracker = UrlDownloader.DownloadWithNonBlocking(url)) { string STATUS_TOKEN = "BundleDownload-" + manifest.Version; StatusManager.Instance.ClearCancelled(STATUS_TOKEN); while (!download_async_tracker.DownloadComplete) { if (ShutdownableManager.Instance.IsShuttingDown) { Logging.Error("Canceling download of Bundle Library due to signaled application shutdown"); StatusManager.Instance.SetCancelled(STATUS_TOKEN); } if (StatusManager.Instance.IsCancelled(STATUS_TOKEN)) { download_async_tracker.Cancel(); break; } StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Downloading Bundle Library...", download_async_tracker.ProgressPercentage, 100, true); ShutdownableManager.Sleep(3000); } // Check the reason for exiting if (download_async_tracker.DownloadDataCompletedEventArgs.Cancelled) { StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Cancelled download of Bundle Library."); } else if (null != download_async_tracker.DownloadDataCompletedEventArgs.Error) { MessageBoxes.Error(download_async_tracker.DownloadDataCompletedEventArgs.Error, "There was an error during the download of your Bundle Library. Please try again later or contact {0} for more information.", manifest.SupportEmail); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Error during download of Bundle Library."); } else if (null == download_async_tracker.DownloadDataCompletedEventArgs.Result) { MessageBoxes.Error(download_async_tracker.DownloadDataCompletedEventArgs.Error, "There was an error during the download of your Bundle Library. Please try again later or contact {0} for more information.", manifest.SupportEmail); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Error during download of Bundle Library."); } else { StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Completed download of Bundle Library."); if (MessageBoxes.AskQuestion("The Bundle Library named '{0}' has been downloaded. Do you want to install it now?", manifest.Title)) { LibraryBundleInstaller.Install(manifest, download_async_tracker.DownloadDataCompletedEventArgs.Result); } else { MessageBoxes.Warn("Not installing Bundle Library."); } } } }
internal static void Check(WebLibraryDetail web_library_detail) { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); // We can operate only on bundle libs if (!web_library_detail.IsBundleLibrary) { return; } // Only check every hour if (DateTime.UtcNow.Subtract(web_library_detail.LastBundleManifestDownloadTimestampUTC ?? DateTime.MinValue).TotalMinutes < 60) { return; } // Flag that we are running this update check now web_library_detail.LastBundleManifestDownloadTimestampUTC = DateTime.UtcNow; WebLibraryManager.Instance.NotifyOfChangeToWebLibraryDetail(); // Download the new manifest BundleLibraryManifest manifest_existing = BundleLibraryManifest.FromJSON(web_library_detail.BundleManifestJSON); string manifest_latest_url = manifest_existing.BaseUrl + @"/" + manifest_existing.Id + Common.EXT_BUNDLE_MANIFEST; using (MemoryStream ms = UrlDownloader.DownloadWithBlocking(manifest_latest_url)) { string manifest_latest_json = Encoding.UTF8.GetString(ms.ToArray()); BundleLibraryManifest manifest_latest = BundleLibraryManifest.FromJSON(manifest_latest_json); // It is an old version or we have this version if (0 <= String.Compare(manifest_existing.Version, manifest_latest.Version)) { return; } // It is a version the user has chosen to ignore if (web_library_detail.LastBundleManifestIgnoreVersion == manifest_latest.Version) { return; } BundleLibraryUpdateNotification blun = new BundleLibraryUpdateNotification(web_library_detail, manifest_latest); NotificationManager.Instance.AddPendingNotification( new NotificationManager.Notification( String.Format("An update is available for your Bundle Library '{0}', from version {1} to {2}.", manifest_latest.Title, manifest_existing.Version, manifest_latest.Version), "Bundle Library update available!", NotificationManager.NotificationType.Info, Icons.LibraryTypeBundle, "Download!", blun.Download, "No thanks!", blun.NoThanks ) ); } }
internal static void Check(Library library) { // We can operate only on bundle libs if (!library.WebLibraryDetail.IsBundleLibrary) { return; } // Only check every hour if (DateTime.UtcNow.Subtract(library.WebLibraryDetail.LastBundleManifestDownloadTimestampUTC ?? DateTime.MinValue).TotalMinutes < 60) { return; } // Flag that we are running this update check now library.WebLibraryDetail.LastBundleManifestDownloadTimestampUTC = DateTime.UtcNow; WebLibraryManager.Instance.NotifyOfChangeToWebLibraryDetail(); // Download the new manifest BundleLibraryManifest manifest_existing = BundleLibraryManifest.FromJSON(library.WebLibraryDetail.BundleManifestJSON); string manifest_latest_url = manifest_existing.BaseUrl + "/" + manifest_existing.Id + ".qiqqa_bundle_manifest"; MemoryStream ms; UrlDownloader.DownloadWithBlocking(ConfigurationManager.Instance.Proxy, manifest_latest_url, out ms); string manifest_latest_json = Encoding.UTF8.GetString(ms.ToArray()); BundleLibraryManifest manifest_latest = BundleLibraryManifest.FromJSON(manifest_latest_json); // It is an old version or we have this version if (0 <= String.Compare(manifest_existing.Version, manifest_latest.Version)) { return; } // It is a version the user has chosen to ignore if (library.WebLibraryDetail.LastBundleManifestIgnoreVersion == manifest_latest.Version) { return; } { BundleLibraryUpdateNotification blun = new BundleLibraryUpdateNotification(library, manifest_latest); NotificationManager.Instance.AddPendingNotification( new NotificationManager.Notification( String.Format("An update is available for your Bundle Library '{0}', from version {1} to {2}.", manifest_latest.Title, manifest_existing.Version, manifest_latest.Version), "Bundle Library update available!", NotificationManager.NotificationType.Info, Icons.LibraryTypeBundle, "Download!", blun.Download, "No thanks!", blun.NoThanks ) ); } }
private void ManageDownload(BundleLibraryManifest manifest) { string url = manifest.BaseUrl + "/" + manifest.Id + Common.EXT_BUNDLE; UrlDownloader.DownloadAsyncTracker download_async_tracker = UrlDownloader.DownloadWithNonBlocking(ConfigurationManager.Instance.Proxy, url); string STATUS_TOKEN = "BundleDownload-" + manifest.Version; StatusManager.Instance.ClearCancelled(STATUS_TOKEN); while (!download_async_tracker.DownloadComplete) { if (StatusManager.Instance.IsCancelled(STATUS_TOKEN)) { download_async_tracker.Cancel(); break; } StatusManager.Instance.UpdateStatusBusy(STATUS_TOKEN, "Downloading Bundle Library...", download_async_tracker.ProgressPercentage, 100, true); Thread.Sleep(1000); } // Check the reason for exiting if (false) { } else if (download_async_tracker.DownloadDataCompletedEventArgs.Cancelled) { StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Cancelled download of Bundle Library."); } else if (null != download_async_tracker.DownloadDataCompletedEventArgs.Error) { MessageBoxes.Error(download_async_tracker.DownloadDataCompletedEventArgs.Error, "There was an error during the download of your Bundle Library. Please try again later or contact {0} for more information.", manifest.SupportEmail); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Error during download of Bundle Library."); } else if (null == download_async_tracker.DownloadDataCompletedEventArgs.Result) { MessageBoxes.Error(download_async_tracker.DownloadDataCompletedEventArgs.Error, "There was an error during the download of your Bundle Library. Please try again later or contact {0} for more information.", manifest.SupportEmail); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Error during download of Bundle Library."); } else { StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Completed download of Bundle Library."); if (MessageBoxes.AskQuestion("The Bundle Library named '{0}' has been downloaded. Do you want to install it now?", manifest.Title)) { LibraryBundleInstaller.Install(manifest, download_async_tracker.DownloadDataCompletedEventArgs.Result); } else { MessageBoxes.Warn("Not installing Bundle Library."); } } }
private static void TailZIPProcess(BundleLibraryManifest manifest, string parameters) { using (Process zip_process = Process.Start(ConfigurationManager.Instance.Program7ZIP, parameters)) { using (ProcessOutputReader process_output_reader = new ProcessOutputReader(zip_process)) { string STATUS_TOKEN = "Bundle-" + manifest.Version; StatusManager.Instance.ClearCancelled(STATUS_TOKEN); int iteration = 0; while (true) { ++iteration; if (ShutdownableManager.Instance.IsShuttingDown) { Logging.Error("Canceling creation of Bundle Library due to signaled application shutdown"); StatusManager.Instance.SetCancelled(STATUS_TOKEN); } if (StatusManager.Instance.IsCancelled(STATUS_TOKEN)) { zip_process.Kill(); zip_process.WaitForExit(5000); Logging.Error("Canceled creation of Bundle Library:\n--- Parameters: {0}\n{1}", parameters, process_output_reader.GetOutputsDumpStrings()); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Canceled creation of Bundle Library."); return; } if (zip_process.HasExited) { Logging.Info("Completed creation of Bundle Library:\n--- Parameters: {0}\n{1}", parameters, process_output_reader.GetOutputsDumpStrings()); StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Completed creation of Bundle Library."); return; } StatusManager.Instance.UpdateStatus(STATUS_TOKEN, "Creating Bundle Library...", cancellable: true); ShutdownableManager.Sleep(3000); } } } }
private void ButtonDownload_Click(object sender, RoutedEventArgs e) { FeatureTrackingManager.Instance.UseFeature(Features.StartPage_JoinBundleLibrary); BundleLibraryManifest manifest = DataContext as BundleLibraryManifest; if (null == manifest) { MessageBoxes.Error("Please select a Bundle Library manifest file (*" + Common.EXT_BUNDLE_MANIFEST + ")."); return; } // Kick off the downloader SafeThreadPool.QueueUserWorkItem(o => ManageDownload(manifest)); Close(); }
public WebLibraryDetail UpdateKnownWebLibraryFromBundleLibraryManifest(BundleLibraryManifest manifest) { Logging.Info("+Updating known Bundle Library {0} ({1})", manifest.Title, manifest.Id); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.BundleManifestJSON = manifest.ToJSON(); new_web_library_detail.Id = manifest.Id; new_web_library_detail.Title = manifest.Title; new_web_library_detail.Description = manifest.Description; new_web_library_detail.IsReadOnly = true; new_web_library_detail.Deleted = false; UpdateKnownWebLibrary(new_web_library_detail); Logging.Info("-Updating known Bundle Library {0} ({1})", manifest.Title, manifest.Id); return(new_web_library_detail); }
internal static void Install(BundleLibraryManifest manifest, byte[] library_bundle_binary) { string temp_filename = Path.GetTempFileName(); try { File.WriteAllBytes(temp_filename, library_bundle_binary); Install(manifest, temp_filename); } finally { try { File.Delete(temp_filename); } catch (Exception ex) { Logging.Error(ex, "There was a problem deleting the temporary library bundle file."); } } }
public WebLibraryDetail UpdateKnownWebLibraryFromBundleLibraryManifest(BundleLibraryManifest manifest, bool suppress_flush_to_disk = true) { WPFDoEvents.AssertThisCodeIs_NOT_RunningInTheUIThread(); Logging.Info("+Updating known Bundle Library {0} ({1})", manifest.Title, manifest.Id); WebLibraryDetail new_web_library_detail = new WebLibraryDetail(); new_web_library_detail.BundleManifestJSON = manifest.ToJSON(); //new_web_library_detail.IsBundleLibrary = true; new_web_library_detail.Id = manifest.Id; new_web_library_detail.Title = manifest.Title; new_web_library_detail.Description = manifest.Description; new_web_library_detail.Deleted = false; UpdateKnownWebLibrary(new_web_library_detail, suppress_flush_to_disk); Logging.Info("-Updating known Bundle Library {0} ({1})", manifest.Title, manifest.Id); return(new_web_library_detail); }
public void ReflectLibrary(Library library_) { library = library_; manifest = new BundleLibraryManifest(); string bundle_title = library_.WebLibraryDetail.Title + " Bundle Library"; bundle_title = bundle_title.Replace("Library Bundle Library", "Bundle Library"); // Set the manifest manifest.Id = "BUNDLE_" + library_.WebLibraryDetail.Id; manifest.Version = DateTime.UtcNow.ToString("yyyyMMdd.HHmmss"); manifest.Title = bundle_title; manifest.Description = library_.WebLibraryDetail.Description; // GUI updates DataContext = manifest; ObjRunLibraryName.Text = library_.WebLibraryDetail.Title; ResetProgress(); }
internal void FocusOnManifest(BundleLibraryManifest manifest, string filename_prompt) { TxtManifestFilename.Text = filename_prompt; DataContext = manifest; }
public BundleLibraryUpdateNotification(Library library, BundleLibraryManifest manifest_latest) { this.library = library; this.manifest_latest = manifest_latest; }
public BundleLibraryUpdateNotification(WebLibraryDetail web_library_detail, BundleLibraryManifest manifest_latest) { this.web_library_detail = web_library_detail; this.manifest_latest = manifest_latest; }