/// <summary> /// Метод-исполнитель загрузки пакета обновлений /// </summary> public static void PackageLoader(object sender, DoWorkEventArgs e) { // Разбор аргументов string[] paths = (string[])e.Argument; // Инициализация полосы загрузки SupportedLanguages al = Localization.CurrentLanguage; string report = Localization.GetText("PackageDownload", al) + Path.GetFileName(paths[1]); ((BackgroundWorker)sender).ReportProgress((int)HardWorkExecutor.ProgressBarSize, report); // Отдельная обработка ModDB if (paths[0].Contains("www.moddb.com")) { string html = AboutForm.GetHTML(paths[0]); int left, right; if ((html == "") || ((left = html.IndexOf("<a href=\"")) < 0) || ((right = html.IndexOf("/?", left)) < 0)) { e.Result = -1; return; } paths[0] = "https://www.moddb.com" + html.Substring(left + 9, right - left - 9); } // Настройка безопасности соединения ServicePointManager.SecurityProtocol = (SecurityProtocolType)0xFC0; // Принудительно открывает TLS1.0, TLS1.1 и TLS1.2; блокирует SSL3 // Запрос файла HttpWebRequest rq; try { rq = (HttpWebRequest)WebRequest.Create(paths[0]); } catch { e.Result = -1; return; } rq.Method = "GET"; rq.KeepAlive = false; rq.Timeout = 10000; // Отправка запроса HttpWebResponse resp = null; try { resp = (HttpWebResponse)rq.GetResponse(); } catch { // Любая ошибка здесь будет означать необходимость прекращения проверки e.Result = -2; return; } // Создание файла FileStream FS = null; try { FS = new FileStream(paths[1], FileMode.Create); } catch { resp.Close(); e.Result = -3; return; } // Чтение ответа Stream SR = resp.GetResponseStream(); int b; long length = 0, current = 0; try { if (paths[2].StartsWith("0x")) { length = long.Parse(paths[2].Substring(2), NumberStyles.AllowHexSpecifier); } else { length = long.Parse(paths[2]); } } catch { } while ((b = SR.ReadByte()) >= 0) { FS.WriteByte((byte)b); if ((length != 0) && (current++ % 0x1000 == 0)) { ((BackgroundWorker)sender).ReportProgress((int)(HardWorkExecutor.ProgressBarSize * current / length), report); // Возврат прогресса } // Завершение работы, если получено требование от диалога if (((BackgroundWorker)sender).CancellationPending) { SR.Close(); FS.Close(); resp.Close(); e.Result = 1; e.Cancel = true; return; } } SR.Close(); FS.Close(); resp.Close(); // Завершено. Отображение сообщения ((BackgroundWorker)sender).ReportProgress(-1, Localization.GetText("PackageSuccess", al)); Thread.Sleep(1000); e.Result = 0; return; }