OSDN Git Service

AppliStation-All,インストール処理を新方式(NaGetInstall2)に変更。
authorttp <ttp@users.sourceforge.jp>
Sun, 12 Jun 2011 15:06:43 +0000 (00:06 +0900)
committerttp <ttp@users.sourceforge.jp>
Sun, 12 Jun 2011 15:06:43 +0000 (00:06 +0900)
AppliStation/PackageListViewForm.cs
all-get/Main.cs
na-get-lib/NaGet.SubCommands/NaGetInstall2.cs [new file with mode: 0644]
na-get-lib/na-get-lib.csproj

index ba4e5c5..a66d9a6 100644 (file)
@@ -416,7 +416,7 @@ namespace AppliStation
                {\r
                        AppliStation.Util.ExecutionProgressViewer prog = new AppliStation.Util.ExecutionProgressViewer();\r
                        prog.Shown += delegate(object sender2, EventArgs e2) {\r
-                               NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListsMan, insts);\r
+                               NaGet.SubCommands.NaGetInstall2 tasks = new NaGet.SubCommands.NaGetInstall2(pkgListsMan, insts);\r
                                prog.SetTaskSet(tasks);\r
                                prog.Refresh();\r
                                prog.StartTaskSet();\r
index d34737a..d69d548 100644 (file)
@@ -311,13 +311,6 @@ namespace AllGet
                                installations = new Installation[downloadList.Count];\r
                                for (int i = 0; i < installations.Length; i++) {\r
                                        installations[i] = new Installation(downloadList[i]);\r
-                                       \r
-                                       installations[i].Silent = silent; // サイレントインストールのフラグの設定\r
-                                       \r
-                                       if (! installations[i].IsInstallablePackage()) {\r
-                                               Console.WriteLine("E: Can not install package {0} to your PC.", installations[i].ToString());\r
-                                               Environment.Exit(1);\r
-                                       }\r
                                }\r
                        }\r
                        \r
@@ -335,54 +328,10 @@ namespace AllGet
                                Environment.Exit(0);\r
                        }\r
                        \r
-                       NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(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.NaGetInstall2 tasks = new NaGet.SubCommands.NaGetInstall2(pkgListMan, installations);\r
+                       tasks.TaskEventRaised += TaskSetEventHandlers.OnTaskSetEvent;\r
+                       tasks.SubTaskEventRaised += TaskSetEventHandlers.OnDownloadSubTaskEvent;\r
+                       tasks.TaskQueryRaised += TaskSetEventHandlers.OnTaskQueryEvent;\r
                        \r
                        tasks.Run();\r
                }\r
diff --git a/na-get-lib/NaGet.SubCommands/NaGetInstall2.cs b/na-get-lib/NaGet.SubCommands/NaGetInstall2.cs
new file mode 100644 (file)
index 0000000..7cf9cbe
--- /dev/null
@@ -0,0 +1,202 @@
+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 NaGetInstall2 : NaGetTaskSet2
+       {
+               private IList<Installation> installations;
+               
+               private DownloadScannerService scanner;
+               
+               private PackageListsManager pkgListMan;
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               /// <param name="pkgs">インストールするパッケージ</param>
+               public NaGetInstall2(PackageListsManager pkgListMan, Package[] pkgs)
+                       : this(pkgListMan, Installation.ConvertInstallations(pkgs))
+               {
+               }
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               /// <param name="installations">インストール処理の配列</param>
+               public NaGetInstall2(PackageListsManager pkgMan, IList<Installation> insts)
+               {
+                       pkgListMan = pkgMan;
+                       installations = insts;
+                       
+                       scanner = new DownloadScannerService();
+                       scanner.Init();
+                       
+                       initializeSubTasks();
+               }
+               
+               private void initializeSubTasks()
+               {
+                       // taskセットの初期化
+                       initSubTask();
+                       foreach (Installation inst in installations) {
+                               VirusScanSubTask scanSTask = new VirusScanSubTask(scanner, inst.InstallerFile, inst.InstallerURL);
+                               
+                               if (! inst.Downloaded) {
+                                       DownloadSubTask dlSTask = new DownloadSubTask(inst.InstallerURL, inst.InstallerFile);
+                               
+                                       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(installations));
+                       foreach (Installation inst in installations) {
+                               bool isSilentInstall = (inst.Silent && inst.IsSupportsSilent);
+                               string msg = string.Format("インストール: {0}{1}",
+                                                          inst.ToString(),
+                                                          (isSilentInstall)? " (サイレントインストール)" : string.Empty);
+                               registSubTask(msg,
+                                             new FunctionalSubTask(runInstall, inst));
+                       }
+                       registSubTask("インストール済みのソフトリスト更新",
+                                     new LocalUpdateSubTask(pkgListMan));
+               }
+               
+               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;
+                                               initializeSubTasks();
+                                               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.RETRY
+                                                                               | NaGetTaskQueryResult.CANCEL);
+                                       }
+                                       
+                                       switch (result) {
+                                               case NaGetTaskQueryResult.CONTINUE:
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "ハッシュの非整合を無視してインストールを継続");
+                                                       ret = true;
+                                                       break;
+                                               case NaGetTaskQueryResult.RETRY:
+                                                       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;
+               }
+               
+               private void runInstall(object uninstObj)
+               {
+                       Installation inst = (Installation) uninstObj;
+                       
+                       if (! inst.IsInstallablePackage()) {
+                               string msg = string.Format("{0}はインストールすることができません", inst.ToString());
+                               throw new ApplicationException(msg);
+                       }
+                       
+                       inst.ErrorDataReceived += this.ReceivedErrorData;
+                       inst.OutputDataReceived += this.ReceivedOutputData;
+                       int exitCode = inst.Install();
+                       if (exitCode != 0) {
+                               RaiseTaskSetEvent(TaskEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode);
+                       }
+                       
+                       pkgListMan.WriteInstallationLog(inst);
+               }
+               
+               public override bool Cancelable {
+                       get {
+                               return !cancelCalled && Running && isDuringDownloading;
+                       }
+               }
+               
+               private bool isDuringDownloading {
+                       get {
+                               return Running && (currentSubTask is DownloadSubTask);
+                       }
+               }
+       }
+}
index c8c7cbe..572fc26 100644 (file)
@@ -77,6 +77,7 @@
     <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\NaGetInstall2.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetTaskSet.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetTaskSet2.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetUninstall.cs" />\r