OSDN Git Service

AppliStation-All,キャッシュへのダウンロード処理を新方式(NaGetDownloadToCache2)に変更。
authorttp <ttp@users.sourceforge.jp>
Sun, 5 Jun 2011 13:39:11 +0000 (22:39 +0900)
committerttp <ttp@users.sourceforge.jp>
Sun, 5 Jun 2011 13:39:11 +0000 (22:39 +0900)
AppliStation/PackageListViewForm.cs
all-get/Main.cs
na-get-lib/NaGet.InteropServices/DownloadScannerService.cs
na-get-lib/NaGet.Packages.Install/Installation.cs
na-get-lib/NaGet.SubCommands.SubTask/DownloadSubTask.cs
na-get-lib/NaGet.SubCommands.SubTask/VerifyInstallerFileSubTask.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands.SubTask/VirusScanSubTask.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands/NaGetDownloadToCache.cs
na-get-lib/NaGet.SubCommands/NaGetDownloadToCache2.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands/NaGetInstall.cs
na-get-lib/na-get-lib.csproj

index af829a1..ba4e5c5 100644 (file)
@@ -556,7 +556,7 @@ namespace AppliStation
                {\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
index bc608b2..d34737a 100644 (file)
@@ -119,6 +119,31 @@ namespace AllGet
                                }\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
@@ -223,6 +248,7 @@ namespace AllGet
                        }\r
                }\r
                \r
+               \r
                public void Download(string[] packagenames)\r
                {\r
                        Installation[] installations = null;\r
@@ -253,54 +279,10 @@ namespace AllGet
                                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
index 008ae8b..0efd582 100644 (file)
@@ -9,9 +9,8 @@ using System.Reflection;
 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
index 9d3187a..26f3066 100644 (file)
@@ -3,6 +3,7 @@ using System.IO;
 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
@@ -81,6 +82,13 @@ namespace NaGet.Packages.Install
                        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
@@ -185,6 +193,7 @@ namespace NaGet.Packages.Install
                /// ダウンロードを行う。\r
                /// </summary>\r
                /// <param name="downloader">ダウンローダオブジェクト</param>\r
+               [Obsolete()]\r
                public void Download(Downloader downloader)\r
                {\r
                        if (! Installed) {\r
@@ -213,6 +222,7 @@ namespace NaGet.Packages.Install
                /// <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
index 2746786..f414e61 100644 (file)
@@ -345,7 +345,7 @@ namespace NaGet.SubCommands.SubTask
                        // スループット・残り時間の算出
                        if (elapsedms > 0) {
                                byteps = 1000 * downloadsize / elapsedms;
-                               if (filesize > 0) {
+                               if (filesize > 0 && byteps > 0) {
                                        eta = TimeSpan.FromSeconds((filesize - downloadsize) / byteps);
                                }
                        }
diff --git a/na-get-lib/NaGet.SubCommands.SubTask/VerifyInstallerFileSubTask.cs b/na-get-lib/NaGet.SubCommands.SubTask/VerifyInstallerFileSubTask.cs
new file mode 100644 (file)
index 0000000..829d5df
--- /dev/null
@@ -0,0 +1,55 @@
+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();
+               }
+       }
+}
diff --git a/na-get-lib/NaGet.SubCommands.SubTask/VirusScanSubTask.cs b/na-get-lib/NaGet.SubCommands.SubTask/VirusScanSubTask.cs
new file mode 100644 (file)
index 0000000..a0ec94a
--- /dev/null
@@ -0,0 +1,99 @@
+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();
+                       }
+               }
+       }
+}
index 462b3ff..f95fbe5 100644 (file)
@@ -4,6 +4,7 @@ using NaGet.Packages.Install;
 using NaGet.Packages;
 using NaGet.Net;
 using NaGet.Tasks;
+using NaGet.InteropServices;
 
 namespace NaGet.SubCommands
 {
diff --git a/na-get-lib/NaGet.SubCommands/NaGetDownloadToCache2.cs b/na-get-lib/NaGet.SubCommands/NaGetDownloadToCache2.cs
new file mode 100644 (file)
index 0000000..33dec45
--- /dev/null
@@ -0,0 +1,158 @@
+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);
+                       }
+               }
+       }
+}
index 6fad3e6..9c1fb58 100644 (file)
@@ -4,6 +4,7 @@ using NaGet.Packages.Install;
 using NaGet.Packages;\r
 using NaGet.Net;\r
 using NaGet.Tasks;\r
+using NaGet.InteropServices;\r
 \r
 namespace NaGet.SubCommands\r
 {\r
index 8cd9388..c8c7cbe 100644 (file)
     <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