示例#1
0
 /// <summary>
 /// Запущено ли дополнение
 /// </summary>
 /// <param name="info">Информация о дополнении</param>
 /// <returns>Запущено ли оно</returns>
 internal bool IsRunning(AddonInformation info)
 {
     lock (this.runningAddons)
     {
         return(this.runningAddons.Values.Any(i => i.Info.Guid == info.Guid));
     }
 }
示例#2
0
        /// <summary>
        /// Удалить дополнение
        /// </summary>
        /// <param name="addonInformation"></param>
        internal void Uninstall(AddonInformation addonInformation)
        {
            lock (this.runningAddons)
            {
                var runningInfo = this.runningAddons.Values.FirstOrDefault(i => i.Info.Guid == addonInformation.Guid);
                if (runningInfo != null)
                {
                    UnloadAddon(runningInfo, false);
                }
            }

            var folder = Path.GetDirectoryName(addonInformation.Path);

            Directory.Delete(folder, true);
        }
示例#3
0
        /// <summary>
        /// Получить информацию о дополнении на текущем языке приложения
        /// </summary>
        /// <param name="info">Запрашиваемое дополнение</param>
        /// <returns>Инорфмация о дополнении на текущем языке</returns>
        internal static AddonLocalizationInfoAttribute GetLocalizationInfoForAddon(AddonInformation info)
        {
            AddonLocalizationInfoAttribute neutral = null;
            var culture = CultureInfo.CurrentUICulture;

            foreach (var item in info.LocalizedInfos)
            {
                if (string.IsNullOrEmpty(item.Culture))
                {
                    neutral = item;
                }
                else if (culture.Name == item.Culture)
                {
                    return(item);
                }
            }

            return(neutral);
        }
示例#4
0
        private void UpdateAddon(AddonInformation info, string updatePath)
        {
            var addonFolder     = Path.GetDirectoryName(Path.GetDirectoryName(info.Path));
            var updateLocalPath = Path.Combine(addonFolder, Path.GetFileName(updatePath));

            Task.Factory.StartNew(() =>
            {
                var webClient = new WebClient();

                var progressDialog = new MyProgressDialog()
                {
                    Text = Resources.FileDownloading
                };
                progressDialog.FormClosed += (sender2, e2) =>
                {
                    if (webClient != null)
                    {
                        webClient.CancelAsync();
                    }
                };

                webClient.Headers.Add(HttpRequestHeader.UserAgent, Program.UserAgentHeader);

                DownloadProgressChangedEventHandler downlDel = null;
                downlDel = (sender, e) =>
                {
                    progressDialog.Value = e.ProgressPercentage;
                };

                webClient.DownloadProgressChanged += downlDel;
                webClient.DownloadFileCompleted   += webClient_DownloadFileCompleted;

                webClient.DownloadFileAsync(new Uri(updatePath), updateLocalPath, new object[] { updateLocalPath, progressDialog, info });

                Application.Run(progressDialog);
            });
        }
示例#5
0
        /// <summary>
        /// Запустить дополнение
        /// </summary>
        /// <param name="info">Запускаемое дополнение</param>
        internal void RunAddon(AddonInformation info)
        {
            var thread = new Thread(arg =>
            {
                AppDomain domain = null;
                Addon addon;
                try
                {
                    domain = AppDomain.CreateDomain("Addon", AppDomain.CurrentDomain.Evidence, new AppDomainSetup {
                        ApplicationBase = Application.StartupPath, PrivateBinPath = Path.GetDirectoryName(info.Path)
                    });
                    var loader = (ObjectLoader)domain.CreateInstanceFromAndUnwrap(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CIRCe.Base.dll"), "CIRCe.Base.ObjectLoader");
                    addon      = (Addon)loader.LoadObject(info.Path, info.Info.AddonType); //domain.CreateInstanceFromAndUnwrap(info.Path, info.Info.AddonType);

                    if (Settings.Default.SearchForAddons == CheckState.Checked)            // Проверяем наличие обновления
                    {
                        if (addon.IsUpdateNeeded() && MessageBox.Show(string.Format("Дополнение \"{0}\" сообщает, что оно нуждается в обновлении. Обновить его?", GetLocalizationInfoForAddon(info).Title), Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                        {
                            var updatePath = addon.GetUpdateUri();
                            addon.Dispose();
                            AppDomain.Unload(domain);

                            UpdateAddon(info, updatePath);
                            return;
                        }
                    }

                    domain.UnhandledException += domain_UnhandledException;
                }
                catch (Exception e)
                {
                    MessageBox.Show(string.Format("Ошибка запуска дополнения {0}: {1}", GetLocalizationInfoForAddon(info).Title, e.Message), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    if (domain != null)
                    {
                        AppDomain.Unload(domain);
                    }

                    return;
                }

                //SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
                //perm.Deny();

                var addonInfo = new RunningAddonInfo {
                    Domain = domain, MainThread = Thread.CurrentThread, Info = info, Instanse = addon
                };
                lock (this.runningAddons)
                {
                    this.runningAddons[addon] = addonInfo;
                }

                var showError = true;

                try
                {
                    addon.Run(this.application);
                }
                catch (TargetInvocationException)
                {
                    MessageBox.Show(string.Format(String.Format("{0} {1}", Resources.AddonError, "Нельзя подписываться на события Цирцеи в дополнении напрямую. Используйте метод Wrap или класс EventWrapper"), info.LocalizedInfos[0].Title), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    showError = false;
                }
                catch (Exception exc)
                {
                    MessageBox.Show(string.Format(String.Format("{0} {1} {2}", Resources.AddonError, exc.Message, exc.GetType()), GetLocalizationInfoForAddon(info).Title), Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    showError = false;
                }
                finally
                {
                    UnloadAddon(addonInfo, showError: showError);
                }
            })
            {
                IsBackground = true
            };

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }
示例#6
0
 public AddonSettings(AddonInformation info)
 {
     this.info = info;
 }
示例#7
0
 public AddonSettings()
 {
     this.info = new AddonInformation();
 }