{\r
AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
prog.Shown += delegate(object sender2, EventArgs e2) {\r
- NaGet.SubCommands.NaGetDownloadToCache tasks = new NaGet.SubCommands.NaGetDownloadToCache(pkgListsMan, pkgs);\r
+ NaGet.SubCommands.NaGetDownloadToCache2 tasks = new NaGet.SubCommands.NaGetDownloadToCache2(pkgListsMan, pkgs);\r
prog.SetTaskSet(tasks);\r
prog.Refresh();\r
prog.StartTaskSet();\r
}\r
}\r
}\r
+ \r
+ public static NaGetTaskQueryResult OnTaskQueryEvent(object sender, NaGetTaskQueryArgs e)\r
+ {\r
+ char result = '\u0000';\r
+ if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
+ result = AllGet.Util.Query(e.Message + " [y/R/n]?", "yrn", 'r');\r
+ } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
+ result = AllGet.Util.Query(e.Message + " [R/n]?", "rn", 'r');\r
+ } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) {\r
+ result = AllGet.Util.Query(e.Message + " [Y]?", "y", 'y');\r
+ } else {\r
+ result = AllGet.Util.Query(e.Message + " [Y/n]?", "yn", 'y');\r
+ }\r
+ \r
+ switch (result) {\r
+ case 'y':\r
+ return NaGetTaskQueryResult.CONTINUE;\r
+ case 'n':\r
+ return NaGetTaskQueryResult.CANCEL;\r
+ case 'r':\r
+ return NaGetTaskQueryResult.RETRY;\r
+ default:\r
+ return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
+ }\r
+ }\r
}\r
\r
\r
}\r
}\r
\r
+ \r
public void Download(string[] packagenames)\r
{\r
Installation[] installations = null;\r
Environment.Exit(0);\r
}\r
\r
- NaGet.SubCommands.NaGetDownloadToCache tasks = new NaGet.SubCommands.NaGetDownloadToCache(pkgListMan, installations);\r
- tasks.TaskQueryRaised += delegate(object sender, NaGetTaskQueryArgs e) {\r
- char result = '\u0000';\r
- if (e.SelectionFlag == (NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
- result = AllGet.Util.Query(e.Message + " [y/R/n]?", "yrn", 'r');\r
- } else if (e.SelectionFlag == (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL)) {\r
- result = AllGet.Util.Query(e.Message + " [R/n]?", "rn", 'r');\r
- } else if (e.SelectionFlag == NaGetTaskQueryResult.CONTINUE) {\r
- result = AllGet.Util.Query(e.Message + " [Y]?", "y", 'y');\r
- } else {\r
- result = AllGet.Util.Query(e.Message + " [Y/n]?", "yn", 'y');\r
- }\r
- \r
- switch (result) {\r
- case 'y':\r
- return NaGetTaskQueryResult.CONTINUE;\r
- case 'n':\r
- return NaGetTaskQueryResult.CANCEL;\r
- case 'r':\r
- return NaGetTaskQueryResult.RETRY;\r
- default:\r
- return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
- }\r
- };\r
- tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { \r
- switch (e.Type) {\r
-// case NaGetTaskSetEventType.COMPLETED_TASKSET\r
-// break;\r
- case TaskEventType.COMPLETED:\r
- Console.WriteLine("Done.");\r
- break;\r
- case TaskEventType.STARTED_SUBTASK:\r
- Console.Write(" " + e.TaskMessage);\r
- break;\r
- case TaskEventType.COMPLETED_SUBTASK:\r
- Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent);\r
- break;\r
- case TaskEventType.INFO:\r
- Console.WriteLine(" " + e.TaskMessage);\r
- break;\r
- case TaskEventType.ERROR:\r
- case TaskEventType.WARNING:\r
- Console.WriteLine(" [Error] " + e.TaskMessage);\r
- break;\r
- }\r
- };\r
- DownloadListener dl = new DownloadListener();\r
- tasks.Downloader.DownloadEventRaised += dl.OnDownload;\r
+ NaGet.SubCommands.NaGetDownloadToCache2 tasks = new NaGet.SubCommands.NaGetDownloadToCache2(pkgListMan, installations);\r
+ tasks.TaskEventRaised += TaskSetEventHandlers.OnTaskSetEvent;\r
+ tasks.SubTaskEventRaised += TaskSetEventHandlers.OnDownloadSubTaskEvent;\r
+ tasks.TaskQueryRaised += TaskSetEventHandlers.OnTaskQueryEvent;\r
\r
tasks.Run();\r
}\r
using System.Collections.Generic;\r
using System.Runtime.InteropServices;\r
using System.Runtime.InteropServices.ComTypes;\r
-using NaGet.InteropServices;\r
\r
-namespace NaGet.Net\r
+namespace NaGet.InteropServices\r
{\r
public enum DownloadScannerResult : uint {\r
OK = 0, // S_OK\r
using System.Diagnostics;\r
using NaGet.Net;\r
using NaGet.SubCommands;\r
+using NaGet.InteropServices;\r
using System.Xml.Serialization;\r
\r
namespace NaGet.Packages.Install\r
get { return installerFile; }\r
}\r
\r
+ /// <summary>\r
+ /// インストーラーURLを取得する\r
+ /// </summary>\r
+ public string InstallerURL {\r
+ get { return InstalledPackage.Installer[installerIndex].Url.Href; }\r
+ }\r
+ \r
\r
#region インストール状態チェック関連\r
\r
/// ダウンロードを行う。\r
/// </summary>\r
/// <param name="downloader">ダウンローダオブジェクト</param>\r
+ [Obsolete()]\r
public void Download(Downloader downloader)\r
{\r
if (! Installed) {\r
/// <exception cref="ComException">スキャンで意図せぬ動作があったとき</exception>\r
/// <param name="scanner">スキャナーオブジェクト</param>\r
/// <returns>スキャン結果</returns>\r
+ [Obsolete()]\r
public DownloadScannerResult ScanInstallerFile(DownloadScannerService scanner)\r
{\r
DownloadScannerResult result;\r
// スループット・残り時間の算出
if (elapsedms > 0) {
byteps = 1000 * downloadsize / elapsedms;
- if (filesize > 0) {
+ if (filesize > 0 && byteps > 0) {
eta = TimeSpan.FromSeconds((filesize - downloadsize) / byteps);
}
}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using NaGet.Tasks;
+using NaGet.Packages;
+using NaGet.Packages.Install;
+
+namespace NaGet.SubCommands.SubTask
+{
+ public class VerifyInstallerFileSubTask : NaGetSubTask
+ {
+ IList<Installation> installations = null;
+
+ IList<Installation> invalidInstallers = null;
+
+ public VerifyInstallerFileSubTask(IList<Installation> insts)
+ {
+ installations = insts;
+ }
+
+ public IList<Installation> InvalidInstallers {
+ get { return invalidInstallers; }
+ }
+
+ public override void Run()
+ {
+ NotifyStarted();
+
+ List<Installation> invalidInstallers = new List<Installation>();
+
+ for (int i = 0; i < installations.Count; i++) {
+ Installation inst = installations[i];
+ float percent = 100.0f * i / installations.Count;
+
+ if (inst.GetRegisteredHashCount() > 0) {
+ if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {
+ invalidInstallers.Add(inst);
+ RaiseTaskSetEvent(TaskEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);
+ } else {
+ RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString() + " OK", percent);
+ }
+ } else {
+ RaiseTaskSetEvent(TaskEventType.PING, string.Empty, percent);
+ }
+ }
+
+ if (invalidInstallers.Count > 0) {
+ this.invalidInstallers = invalidInstallers.AsReadOnly();
+ } else {
+ this.invalidInstallers = null;
+ }
+
+ NotifyCompleted();
+ }
+ }
+}
--- /dev/null
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using NaGet.Tasks;
+using NaGet.InteropServices;
+
+namespace NaGet.SubCommands.SubTask
+{
+ public class VirusScanSubTask : NaGetSubTask
+ {
+ private string targetFilePath = null;
+
+ private string targetUrl = null;
+
+ private DownloadScannerService scanner = null;
+
+ public VirusScanSubTask(DownloadScannerService scanner)
+ : this(scanner, null, null)
+ {
+ }
+
+ public VirusScanSubTask(DownloadScannerService scanner, string targetFilePath, string targetUrl)
+ {
+ this.scanner = scanner;
+ this.targetFilePath = targetFilePath;
+ this.targetUrl = targetUrl;
+ }
+
+ public string TargetFilePath {
+ get { return targetFilePath; }
+ set { targetFilePath = value; }
+ }
+
+ public string TargetUrl {
+ get { return targetUrl; }
+ set { targetUrl = value; }
+ }
+
+ private void runScanFile()
+ {
+ DownloadScannerResult result;
+ try {
+ RaiseTaskSetEvent(TaskEventType.PING, string.Empty, -1);
+ result = scanner.Scan(targetFilePath, targetUrl);
+ } catch (COMException ex) {
+ result = DownloadScannerResult.ScannerNotFound;
+ RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("{0} (E{1})", ex.Message, ex.ErrorCode), 0);
+ } catch (FileNotFoundException) {
+ result = DownloadScannerResult.ErrorNotFound;
+ } catch (Exception) {
+ result = DownloadScannerResult.ScannerNotFound;
+ }
+
+ Exception e = null;
+ switch (result) {
+ case DownloadScannerResult.OK:
+ RaiseTaskSetEvent(TaskEventType.PING, string.Empty, 100);
+ break;
+ case DownloadScannerResult.ScannerNotFound:
+ RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルへのウイルススキャンはされなかったか、スキャン結果は無視されました", 0);
+ break;
+ case DownloadScannerResult.InfectedAndCleaned:
+ e = new ApplicationException("インストーラーファイルからウイルス感染が検出されたため、削除されました。");
+ break;
+ case DownloadScannerResult.InfectedButNotCleaned:
+ e = new ApplicationException("インストーラーファイルからウイルス感染が検出されました。");
+ break;
+ case DownloadScannerResult.ErrorNotFound:
+ e = new FileNotFoundException(string.Empty);
+ break;
+ }
+
+ if (e != null) {
+ throw e;
+ }
+ }
+
+ public override void Run()
+ {
+ NotifyStarted();
+ RaiseTaskSetEvent(TaskEventType.STARTED, string.Format("ウイルススキャン: {0}", targetFilePath), 0);
+
+ try {
+ if (! NaGet.Env.EnableScanInstallerFile) {
+ RaiseTaskSetEvent(TaskEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした", 0);
+ } else if (!scanner.HasScanner) {
+ RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)", 0);
+ } else if (! File.Exists(targetFilePath)) {
+ RaiseTaskSetEvent(TaskEventType.ERROR, "ダウンロードしたファイルは存在しませんでした(ウイルススキャンソフトが自動的に即座に削除した可能性があります)", 0);
+ } else {
+ runScanFile();
+ }
+ } finally {
+ RaiseTaskSetEvent(TaskEventType.COMPLETED, string.Format("ウイルススキャン: {0}", targetFilePath), 0);
+ NotifyCompleted();
+ }
+ }
+ }
+}
using NaGet.Packages;
using NaGet.Net;
using NaGet.Tasks;
+using NaGet.InteropServices;
namespace NaGet.SubCommands
{
--- /dev/null
+using System;
+using System.Collections.Generic;
+using NaGet.Packages;
+using NaGet.Packages.Install;
+using NaGet.SubCommands;
+using NaGet.SubCommands.SubTask;
+using NaGet.Tasks;
+using NaGet.InteropServices;
+
+namespace NaGet.SubCommands
+{
+ /// <summary>
+ /// キャッシュへのインストーラファイルのダウンロード処理
+ /// </summary>
+ public class NaGetDownloadToCache2 : NaGetTaskSet2
+ {
+ private IList<Installation> installations;
+
+ private DownloadScannerService scanner;
+
+ /// <summary>
+ /// コンストラクタ
+ /// </summary>
+ /// <param name="pkgs">インストールするパッケージ</param>
+ public NaGetDownloadToCache2(PackageListsManager pkgListMan, Package[] pkgs)
+ : this(pkgListMan, Installation.ConvertInstallations(pkgs))
+ {
+ }
+
+ /// <summary>
+ /// コンストラクタ
+ /// </summary>
+ /// <param name="installations">インストール処理の配列</param>
+ public NaGetDownloadToCache2(PackageListsManager pkgMan, IList<Installation> insts)
+ {
+ installations = insts;
+
+ scanner = new DownloadScannerService();
+ scanner.Init();
+
+ // taskセットの初期化
+ initSubTask();
+ foreach (Installation inst in installations) {
+ DownloadSubTask dlSTask = new DownloadSubTask(inst.InstallerURL, inst.InstallerFile);
+ VirusScanSubTask scanSTask = new VirusScanSubTask(scanner, inst.InstallerFile, inst.InstallerURL);
+
+ dlSTask.TaskEventRaised += delegate(object sender, TaskEventArgs e) {
+ if (e.Type == TaskEventType.COMPLETED) {
+ scanSTask.TargetFilePath = inst.InstallerFile;
+ }
+ };
+
+ registSubTask(string.Format("ダウンロード: {0}", inst),
+ dlSTask);
+ registSubTask(string.Format("ウイルススキャン: {0}", inst),
+ scanSTask);
+ }
+ registSubTask("インストーラーの検証",
+ new VerifyInstallerFileSubTask(insts));
+ registSubTask("インストール済みのソフトリスト更新",
+ new LocalUpdateSubTask(pkgMan));
+ }
+
+ public override void Run()
+ {
+ NotifyStarted();
+ RaiseTaskSetEvent(TaskEventType.STARTED, string.Empty);
+
+ try {
+ while (hasMoreSubTask) {
+ bool canGoToNextSubTask = true;
+
+ RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, currentSubTaskName);
+ currentSubTask.Run();
+ RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, currentSubTaskName);
+
+ if (runCheckVerify() == false) {
+ canGoToNextSubTask = false;
+ NotifyGoToSubTask(0); // 最初からやり直し。
+ }
+ if (cancelCalled) {
+ throw new TaskCanceledException("cancel is called");
+ }
+
+ if (canGoToNextSubTask) {
+ NotifyGoToNextSubTask();
+ }
+ }
+ } catch (TaskCanceledException) {
+ cancelCalled = true;
+ } catch (Exception e) {
+ RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);
+ }
+
+ if (cancelCalled) {
+ NotifyCancelled();
+ RaiseTaskSetEvent(TaskEventType.CANCELED, "キャンセルされました");
+ } else {
+ NotifyCompleted();
+ RaiseTaskSetEvent(TaskEventType.COMPLETED, string.Empty);
+ }
+ }
+
+ private bool runCheckVerify()
+ {
+ bool ret = true;
+
+ if (currentSubTask is VerifyInstallerFileSubTask) {
+ VerifyInstallerFileSubTask verifySTask = currentSubTask as VerifyInstallerFileSubTask;
+ if (verifySTask.InvalidInstallers != null && verifySTask.InvalidInstallers.Count > 0) {
+ System.Text.StringBuilder invalidInstallerNames = new System.Text.StringBuilder();
+ foreach (Installation invalidInst in verifySTask.InvalidInstallers) {
+ invalidInstallerNames.AppendFormat(" - {0}\n", invalidInst.ToString());
+ }
+
+ string msg = string.Format("以下の{0}個のパッケージでファイルが壊れている可能性があります。\n{1}\nダウンロードし直しますか?",
+ verifySTask.InvalidInstallers.Count, invalidInstallerNames.ToString());
+ NaGetTaskQueryResult result = NaGetTaskQueryResult.CANCEL;
+
+ if (!cancelCalled) {
+ result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE | NaGetTaskQueryResult.CANCEL);
+ }
+
+ switch (result) {
+ case NaGetTaskQueryResult.CONTINUE:
+ RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行");
+
+ foreach (Installation invalidInst in verifySTask.InvalidInstallers) {
+ invalidInst.RemoveDownloadedFile();
+ }
+ ret = false;
+
+ break;
+ case NaGetTaskQueryResult.CANCEL:
+ case NaGetTaskQueryResult.CANCELED_AUTOMATICALLY:
+ default:
+ ret = false;
+ throw new TaskCanceledException("処理の継続のキャンセルが選択されました");
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ public override bool Cancelable {
+ get {
+ return !cancelCalled && Running && isDuringDownloading;
+ }
+ }
+
+ private bool isDuringDownloading {
+ get {
+ return Running && (currentSubTask is DownloadSubTask);
+ }
+ }
+ }
+}
using NaGet.Packages;\r
using NaGet.Net;\r
using NaGet.Tasks;\r
+using NaGet.InteropServices;\r
\r
namespace NaGet.SubCommands\r
{\r
<Compile Include="NaGet.SubCommands.SubTask\DownloadSubTask.cs" />\r
<Compile Include="NaGet.SubCommands.SubTask\LocalUpdateSubTask.cs" />\r
<Compile Include="NaGet.SubCommands.SubTask\NaGetSubTask.cs" />\r
+ <Compile Include="NaGet.SubCommands.SubTask\VerifyInstallerFileSubTask.cs" />\r
+ <Compile Include="NaGet.SubCommands.SubTask\VirusScanSubTask.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetDownloadToCache.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetDownloadToCache2.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetInstall.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetTaskSet.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetTaskSet2.cs" />\r