コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: UpdateViewModel.cs プロジェクト: teast/ffxivapp
        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;
            }
        }
コード例 #4
0
ファイル: UpdateViewModel.cs プロジェクト: teast/ffxivapp
        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);
            });
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
        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);
        }