private static void AvailableDGDoubleClick() { string key; try { key = GetValueBySelectedItem(UpdateView.View.AvailableDG, "Name"); } catch (Exception ex) { Logging.Log(Logger, new LogItem(ex, true)); return; } PluginDownloadItem plugin = Instance.AvailablePlugins.FirstOrDefault(p => string.Equals(p.Name, key, Constants.InvariantComparer)); if (plugin == null) { return; } switch (plugin.Status) { case PluginStatus.Installed: UnInstallByKey(plugin.Name); break; case PluginStatus.NotInstalled: case PluginStatus.UpdateAvailable: InstallByKey(plugin.Name); break; } }
private static void UnInstallByKey(string key, Action asyncAction = null) { PluginDownloadItem plugin = Instance.AvailablePlugins.FirstOrDefault(p => string.Equals(p.Name, key, Constants.InvariantComparer)); if (plugin == null) { return; } Func <bool> uninstall = delegate { try { var saveLocation = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Plugins", plugin.Name); Directory.Delete(saveLocation, true); } catch (Exception ex) { Logging.Log(Logger, new LogItem(ex, true)); } return(true); }; uninstall.BeginInvoke( delegate { DispatcherHelper.Invoke( delegate { foreach (PluginDownloadItem pluginDownloadItem in Instance.AvailablePlugins.Where(pluginDownloadItem => string.Equals(pluginDownloadItem.Name, plugin.Name))) { pluginDownloadItem.Status = PluginStatus.NotInstalled; } Instance.SetupGrouping(); PluginHost.Instance.UnloadPlugin(plugin.Name); for (var i = ShellView.View.PluginsTC.Items.Count - 1; i > 0; i--) { if (((TabItem)ShellView.View.PluginsTC.Items[i]).Name == Regex.Replace(plugin.Name, @"[^A-Za-z]", string.Empty)) { AppViewModel.Instance.PluginTabItems.RemoveAt(i); } } }, DispatcherPriority.Send); }, uninstall); }
private void AvailableDGDoubleClick() { PluginDownloadItem plugin = Instance.AvailablePlugins.Cast <PluginDownloadItem>().FirstOrDefault(p => string.Equals(p.Name, this.SelectedAvailableDG?.Name, Constants.InvariantComparer)); if (plugin == null) { return; } switch (plugin.Status) { case PluginStatus.Installed: UnInstallByKey(plugin.Name); break; case PluginStatus.NotInstalled: case PluginStatus.UpdateAvailable: InstallByKey(plugin.Name); break; } }
private static void UnInstallByKey(string key, Action asyncAction = null) { PluginDownloadItem plugin = Instance.AvailablePlugins.Cast <PluginDownloadItem>().FirstOrDefault(p => string.Equals(p.Name, key, Constants.InvariantComparer)); if (plugin == null) { return; } Task.Run(() => { try { var saveLocation = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Plugins", plugin.Name); Directory.Delete(saveLocation, true); } catch (Exception ex) { Logging.Log(Logger, new LogItem(ex, true)); } DispatcherHelper.Invoke( delegate { foreach (PluginDownloadItem pluginDownloadItem in Instance.AvailablePlugins.Cast <PluginDownloadItem>().Where(pluginDownloadItem => string.Equals(pluginDownloadItem.Name, plugin.Name))) { pluginDownloadItem.Status = PluginStatus.NotInstalled; } PluginHost.Instance.UnloadPlugin(plugin.Name); for (var i = 0; i < AppViewModel.Instance.PluginTabItems.Count; i++) { if (AppViewModel.Instance.PluginTabItems[i].Name == Regex.Replace(plugin.Name, @"[^A-Za-z]", string.Empty)) { AppViewModel.Instance.PluginTabItems.RemoveAt(i); } } }, DispatcherPriority.Send); }); }
private static void InstallByKey(string key, Action asyncAction = null) { PluginDownloadItem plugin = Instance.AvailablePlugins.FirstOrDefault(p => string.Equals(p.Name, key, Constants.InvariantComparer)); if (plugin == null) { return; } UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Visible; UpdateView.View.AvailableLoadingProgressMessage.Visibility = Visibility.Visible; Func <bool> install = delegate { var updateCount = 0; var updateLimit = plugin.Files.Count; var sb = new StringBuilder(); foreach (PluginFile pluginFile in plugin.Files) { sb.Clear(); try { using (var client = new WebClient { CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore) }) { var saveLocation = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Plugins", plugin.Name, pluginFile.Location, pluginFile.Name); Directory.CreateDirectory(Path.GetDirectoryName(saveLocation)); if (UpdateUtilities.VerifyFile(saveLocation, pluginFile.Checksum)) { // no need to download file, since it hasn't changed // count this file as "updated" for the purpose of checking if the install finished updateCount++; } else { sb.Append(plugin.SourceURI.Trim('/')); var location = pluginFile.Location.Trim('/'); if (!string.IsNullOrWhiteSpace(location)) { sb.AppendFormat("/{0}", location); } sb.AppendFormat("/{0}", pluginFile.Name.Trim('/')); var uri = new Uri(sb.ToString()); client.DownloadFileAsync(uri, saveLocation); client.DownloadProgressChanged += delegate { DispatcherHelper.Invoke( delegate { UpdateView.View.AvailableLoadingProgressMessage.Text = $"{pluginFile.Location.Trim('/')}/{pluginFile.Name}"; }); }; client.DownloadFileCompleted += delegate { updateCount++; if (updateCount >= updateLimit) { DispatcherHelper.Invoke( delegate { if (plugin.Status != PluginStatus.Installed) { plugin.Status = PluginStatus.Installed; Instance.SetupGrouping(); if (asyncAction != null) { DispatcherHelper.Invoke(asyncAction); } } UpdateView.View.AvailableLoadingProgressMessage.Text = string.Empty; UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Collapsed; UpdateView.View.AvailableLoadingProgressMessage.Visibility = Visibility.Collapsed; }, DispatcherPriority.Send); } }; } } } catch (Exception) { updateCount++; } } // need to check here aswell, since if all files mathced hash, none will be downloaded, so the DownloadFileCompleted delegate would never be triggered if (updateCount >= updateLimit) { if (plugin.Status != PluginStatus.Installed) { plugin.Status = PluginStatus.Installed; Instance.SetupGrouping(); if (asyncAction != null) { DispatcherHelper.Invoke(asyncAction); } } DispatcherHelper.Invoke( delegate { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Collapsed; UpdateView.View.AvailableLoadingProgressMessage.Visibility = Visibility.Collapsed; }, DispatcherPriority.Send); } return(true); }; install.BeginInvoke(delegate { }, install); }
public static void LoadAvailablePlugins() { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Visible; UpdateViewModel.Instance.AvailablePlugins.Clear(); UpdateView.View.PluginUpdateSpinner.Spin = true; ShellView.View.PluginUpdateSpinner.Spin = true; Func <bool> update = delegate { List <PluginSourceItem> pluginSourceList = new List <PluginSourceItem>(); try { var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://github.com/Icehunter/ffxivapp/raw/master/PACKAGES.json"); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (Stream response = httpResponse.GetResponseStream()) { var responseText = string.Empty; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !string.IsNullOrWhiteSpace(responseText)) { JArray jsonResult = JArray.Parse(responseText); foreach (JToken jToken in jsonResult) { bool enabled; bool.TryParse(jToken["Enabled"].ToString(), out enabled); var sourceURI = jToken["SourceURI"].ToString(); if (enabled) { pluginSourceList.Add( new PluginSourceItem { Enabled = true, Key = Guid.NewGuid(), SourceURI = sourceURI, }); } } } } } } catch (Exception ex) { Logging.Log(Logger, new LogItem(ex, true)); } foreach (PluginSourceItem pluginSourceItem in UpdateViewModel.Instance.AvailableSources) { if (pluginSourceList.Any(p => string.Equals(p.SourceURI, pluginSourceItem.SourceURI, Constants.InvariantComparer))) { continue; } pluginSourceList.Add(pluginSourceItem); } foreach (PluginSourceItem item in pluginSourceList) { if (item.Enabled) { try { var httpWebRequest = (HttpWebRequest)WebRequest.Create(item.SourceURI); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (Stream response = httpResponse.GetResponseStream()) { var responseText = string.Empty; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !string.IsNullOrWhiteSpace(responseText)) { JObject jsonResult = JObject.Parse(responseText); JToken pluginInfo = jsonResult["PluginInfo"]; JToken[] pluginFiles = pluginInfo["Files"].ToArray(); var pluginDownload = new PluginDownloadItem { Files = new List <PluginFile>( pluginFiles.Select( pluginFile => new PluginFile { Location = pluginFile["Location"].ToString(), Name = pluginFile["Name"].ToString(), Checksum = pluginFile["Checksum"] == null ? string.Empty : pluginFile["Checksum"].ToString(), })), Name = pluginInfo["Name"].ToString(), FriendlyName = pluginInfo["FriendlyName"] == null ? pluginInfo["Name"].ToString() : pluginInfo["FriendlyName"].ToString(), Description = pluginInfo["Description"] == null ? string.Empty : pluginInfo["Description"].ToString(), SourceURI = pluginInfo["SourceURI"].ToString(), LatestVersion = pluginInfo["Version"].ToString(), }; PluginInstance found = App.Plugins.Loaded.Find(pluginDownload.Name); if (found != null) { var latest = pluginDownload.LatestVersion; var current = found.Instance.Version; pluginDownload.CurrentVersion = current; pluginDownload.Status = PluginStatus.Installed; var latestBuild = new BuildNumber(); var currentBuild = new BuildNumber(); if (BuildUtilities.NeedsUpdate(latest, current, ref latestBuild, ref currentBuild)) { pluginDownload.Status = PluginStatus.UpdateAvailable; AppViewModel.Instance.HasNewPluginUpdate = true; DispatcherHelper.Invoke(() => UpdateViewModel.Instance.AvailablePluginUpdates++); } else { if (!found.Loaded) { pluginDownload.Status = PluginStatus.OutOfDate; } } } DispatcherHelper.Invoke(() => UpdateViewModel.Instance.AvailablePlugins.Add(pluginDownload)); } } } } catch (Exception ex) { Logging.Log(Logger, new LogItem(ex, true)); } } } DispatcherHelper.Invoke( delegate { if (UpdateView.View.AvailableDG.Items.Count == UpdateViewModel.Instance.AvailablePlugins.Count) { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Collapsed; } UpdateView.View.AvailableDG.Items.Refresh(); UpdateViewModel.Instance.SetupGrouping(); UpdateView.View.PluginUpdateSpinner.Spin = false; ShellView.View.PluginUpdateSpinner.Spin = false; }); return(true); }; update.BeginInvoke(delegate { }, update); }
public static void LoadAvailablePlugins() { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Visible; UpdateViewModel.Instance.AvailablePlugins.Clear(); Func <bool> updateCheck = delegate { var pluginSourceList = new List <PluginSourceItem>(); try { var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://github.com/Icehunter/ffxivapp/raw/master/PACKAGES.json"); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (var response = httpResponse.GetResponseStream()) { var responseText = ""; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !String.IsNullOrWhiteSpace(responseText)) { var jsonResult = JArray.Parse(responseText); pluginSourceList.AddRange(from item in jsonResult let name = item["Name"].ToString() let enabled = Boolean.Parse(item["Enabled"].ToString()) let sourceURI = item["SourceURI"].ToString() where enabled select new PluginSourceItem { Enabled = enabled, Key = Guid.NewGuid(), SourceURI = sourceURI }); } } } } catch (Exception ex) { } foreach (var pluginSourceItem in UpdateViewModel.Instance.AvailableSources) { if (pluginSourceList.Any(p => String.Equals(p.SourceURI, pluginSourceItem.SourceURI, Constants.InvariantComparer))) { continue; } pluginSourceList.Add(pluginSourceItem); } foreach (var item in pluginSourceList) { if (item.Enabled) { try { var httpWebRequest = (HttpWebRequest)WebRequest.Create(item.SourceURI); httpWebRequest.UserAgent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4"; httpWebRequest.Headers.Add("Accept-Language", "en;q=0.8"); httpWebRequest.ContentType = "application/text; charset=utf-8"; httpWebRequest.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); using (var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { using (var response = httpResponse.GetResponseStream()) { var responseText = ""; if (response != null) { using (var streamReader = new StreamReader(response)) { responseText = streamReader.ReadToEnd(); } } if (httpResponse.StatusCode == HttpStatusCode.OK || !String.IsNullOrWhiteSpace(responseText)) { var jsonResult = JObject.Parse(responseText); var pluginInfo = jsonResult["PluginInfo"]; var pluginFiles = pluginInfo["Files"].ToArray(); var pluginDownload = new PluginDownloadItem { Files = new List <PluginFile>(pluginFiles.Select(pluginFile => new PluginFile { Location = pluginFile["Location"].ToString(), Name = pluginFile["Name"].ToString() })), Name = pluginInfo["Name"].ToString(), SourceURI = pluginInfo["SourceURI"].ToString(), LatestVersion = pluginInfo["Version"].ToString() }; var found = App.Plugins.Loaded.Find(pluginDownload.Name); if (found != null) { var latest = pluginDownload.LatestVersion; var current = found.Instance.Version; pluginDownload.CurrentVersion = current; pluginDownload.Status = PluginStatus.Installed; var latestBuild = new BuildNumber(); var currentBuild = new BuildNumber(); if (BuildUtilities.NeedsUpdate(latest, current, ref latestBuild, ref currentBuild)) { pluginDownload.Status = PluginStatus.UpdateAvailable; AppViewModel.Instance.HasNewPluginUpdate = true; } } DispatcherHelper.Invoke(() => UpdateViewModel.Instance.AvailablePlugins.Add(pluginDownload)); } } } } catch (Exception ex) { } DispatcherHelper.Invoke(delegate { if (UpdateView.View.AvailableDG.Items.Count == UpdateViewModel.Instance.AvailablePlugins.Count) { UpdateView.View.AvailableLoadingInformation.Visibility = Visibility.Collapsed; } UpdateView.View.AvailableDG.Items.Refresh(); UpdateViewModel.Instance.SetupGrouping(); }); } } return(true); }; updateCheck.BeginInvoke(null, null); }