OSDN Git Service

AppliStation-All,タスク関連クラス群の構造変更。およびまだ未使用だが、SubTaskへの一部機能の括りだし
authorttp <ttp@users.sourceforge.jp>
Mon, 2 May 2011 14:20:47 +0000 (23:20 +0900)
committerttp <ttp@users.sourceforge.jp>
Mon, 2 May 2011 14:20:47 +0000 (23:20 +0900)
14 files changed:
AppliStation/AppliStation.Util/ExecutionProgressViewer.cs
all-get/Main.cs
na-get-lib/NaGet.Net/Downloader.cs
na-get-lib/NaGet.SubCommands.SubTask/DownloadSubTask.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands.SubTask/LocalUpdateSubTask.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands.SubTask/NaGetSubTask.cs [new file with mode: 0644]
na-get-lib/NaGet.SubCommands/NaGetDownloadToCache.cs
na-get-lib/NaGet.SubCommands/NaGetInstall.cs
na-get-lib/NaGet.SubCommands/NaGetTaskSet.cs
na-get-lib/NaGet.SubCommands/NaGetUninstall.cs
na-get-lib/NaGet.SubCommands/NaGetUpdate.cs
na-get-lib/NaGet.Tasks/Task.cs
na-get-lib/NaGet.Tasks/TaskEventArgs.cs
na-get-lib/na-get-lib.csproj

index c192294..7192d91 100644 (file)
@@ -4,6 +4,7 @@ using System.Windows.Forms;
 using System.Threading;\r
 using NaGet.SubCommands;\r
 using NaGet.Net;\r
+using NaGet.Tasks;\r
 \r
 namespace AppliStation.Util\r
 {\r
@@ -49,7 +50,7 @@ namespace AppliStation.Util
                                return;\r
                        }\r
                        \r
-                       switch (a.Type) {\r
+                       switch (a.DownloadTaskType) {\r
                                case DownloadEventType.INITED:\r
                                case DownloadEventType.CONNECTED:\r
                                        progressSubLabel.Text = a.TaskMessage;\r
@@ -85,7 +86,7 @@ namespace AppliStation.Util
                \r
                #region NaGetTaskSet関連\r
                \r
-               private void onTaskSetRaised(object sender, NaGetTaskSetEventArgs e)\r
+               private void onTaskEventRaised(object sender, TaskEventArgs e)\r
                {\r
                        NaGetTaskSet taskSet = (NaGetTaskSet) sender;\r
                        NativeMethods.ProgressBarState progressState = NativeMethods.ProgressBarState.Normal;\r
@@ -93,7 +94,7 @@ namespace AppliStation.Util
                        cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
                        \r
                        switch (e.Type) {\r
-                               case NaGetTaskSetEventType.COMPLETED:\r
+                               case TaskEventType.COMPLETED:\r
                                        logBox.AppendText("完了." + System.Environment.NewLine);\r
                                        if (taskSet.Done) {\r
                                                okButton.Enabled = true;\r
@@ -103,11 +104,11 @@ namespace AppliStation.Util
                                                autoCloseTimer.Start();\r
                                        }\r
                                        break;\r
-                               case NaGetTaskSetEventType.STARTED_TASKSET:\r
+                               case TaskEventType.STARTED_SUBTASK:\r
                                        progressLabel.Text = taskSet.TaskSetNames[taskSet.CurrentTaskSetIndex];\r
                                        logBox.AppendText("  " + e.TaskMessage + System.Environment.NewLine);\r
                                        break;\r
-                               case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+                               case TaskEventType.COMPLETED_SUBTASK:\r
                                        if (progressBarSub.Visible) progressBarSub.Hide();\r
                                        if (progressSubLabel.Visible) progressSubLabel.Hide();\r
                                        \r
@@ -116,10 +117,10 @@ namespace AppliStation.Util
                                        logBox.AppendText(string.Format(" ... 完了. [{0}%]", (int) e.ProgressPercent));\r
                                        logBox.AppendText(System.Environment.NewLine);\r
                                        break;\r
-                               case NaGetTaskSetEventType.INFO:\r
+                               case TaskEventType.INFO:\r
                                        logBox.AppendText("  " + e.TaskMessage + System.Environment.NewLine);\r
                                        break;\r
-                               case NaGetTaskSetEventType.ERROR:\r
+                               case TaskEventType.ERROR:\r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
                                        logBox.AppendText("  [エラー] " + e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
@@ -130,7 +131,7 @@ namespace AppliStation.Util
                                        okButton.Enabled = true;\r
                                        cancelButton.Enabled = false;\r
                                        break;\r
-                               case NaGetTaskSetEventType.CANCELED:\r
+                               case TaskEventType.CANCELED:\r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
                                        logBox.AppendText(e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
@@ -141,7 +142,7 @@ namespace AppliStation.Util
                                        okButton.Enabled = true;\r
                                        cancelButton.Enabled = false;\r
                                        break;\r
-                               case NaGetTaskSetEventType.WARNING:\r
+                               case TaskEventType.WARNING:\r
                                        logBox.SelectionColor = System.Drawing.Color.Red;\r
                                        logBox.AppendText("  [エラー] " + e.TaskMessage + System.Environment.NewLine);\r
                                        logBox.SelectionColor = logBox.ForeColor;\r
@@ -213,11 +214,11 @@ namespace AppliStation.Util
                {\r
                        this.taskSet = taskSet;\r
                        \r
-                       taskSet.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {\r
+                       taskSet.TaskEventRaised += delegate(object sender, TaskEventArgs e) {\r
                                if (InvokeRequired) {\r
-                                       Invoke(new EventHandler<NaGetTaskSetEventArgs>(onTaskSetRaised), taskSet, e);\r
+                                       Invoke(new EventHandler<TaskEventArgs>(onTaskEventRaised), taskSet, e);\r
                                } else {\r
-                                       onTaskSetRaised(taskSet, e);\r
+                                       onTaskEventRaised(taskSet, e);\r
                                }\r
                        };\r
                        \r
index 2792fb3..39420c9 100644 (file)
@@ -6,6 +6,7 @@ using NaGet.Net;
 using NaGet.Packages;\r
 using NaGet.Packages.Install;\r
 using NaGet.SubCommands;\r
+using NaGet.Tasks;\r
 \r
 namespace AllGet\r
 {\r
@@ -36,7 +37,7 @@ namespace AllGet
                                }\r
                        }\r
                        \r
-                       switch (a.Type) {\r
+                       switch (a.DownloadTaskType) {\r
                        case DownloadEventType.INITED:\r
                                line = "starting...";\r
                                break;\r
@@ -96,24 +97,24 @@ namespace AllGet
                public void update(bool downloadPackageListFlag)\r
                {\r
                        NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListMan, downloadPackageListFlag);\r
-                       tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+                       tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { \r
                                switch (e.Type) {\r
 //                                     case NaGetTaskSetEventType.COMPLETED_TASKSET\r
 //                                             break;\r
-                                       case NaGetTaskSetEventType.COMPLETED:\r
+                                       case TaskEventType.COMPLETED:\r
                                                Console.WriteLine("Done.");\r
                                                break;\r
-                                       case NaGetTaskSetEventType.STARTED_TASKSET:\r
+                                       case TaskEventType.STARTED_SUBTASK:\r
                                                Console.Write("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+                                       case TaskEventType.COMPLETED_SUBTASK:\r
                                                Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.INFO:\r
+                                       case TaskEventType.INFO:\r
                                                Console.WriteLine("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.ERROR:\r
-                                       case NaGetTaskSetEventType.WARNING:\r
+                                       case TaskEventType.ERROR:\r
+                                       case TaskEventType.WARNING:\r
                                                Console.WriteLine("  [Error]" + e.TaskMessage);\r
                                                break;\r
                                }\r
@@ -239,24 +240,24 @@ namespace AllGet
                                                return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
                                }\r
                        };\r
-                       tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+                       tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { \r
                                switch (e.Type) {\r
 //                                     case NaGetTaskSetEventType.COMPLETED_TASKSET\r
 //                                             break;\r
-                                       case NaGetTaskSetEventType.COMPLETED:\r
+                                       case TaskEventType.COMPLETED:\r
                                                Console.WriteLine("Done.");\r
                                                break;\r
-                                       case NaGetTaskSetEventType.STARTED_TASKSET:\r
+                                       case TaskEventType.STARTED_SUBTASK:\r
                                                Console.Write("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+                                       case TaskEventType.COMPLETED_SUBTASK:\r
                                                Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.INFO:\r
+                                       case TaskEventType.INFO:\r
                                                Console.WriteLine("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.ERROR:\r
-                                       case NaGetTaskSetEventType.WARNING:\r
+                                       case TaskEventType.ERROR:\r
+                                       case TaskEventType.WARNING:\r
                                                Console.WriteLine("  [Error] " + e.TaskMessage);\r
                                                break;\r
                                }\r
@@ -339,24 +340,24 @@ namespace AllGet
                                                return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;\r
                                }\r
                        };\r
-                       tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+                       tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { \r
                                switch (e.Type) {\r
 //                                     case NaGetTaskSetEventType.COMPLETED_TASKSET\r
 //                                             break;\r
-                                       case NaGetTaskSetEventType.COMPLETED:\r
+                                       case TaskEventType.COMPLETED:\r
                                                Console.WriteLine("Done.");\r
                                                break;\r
-                                       case NaGetTaskSetEventType.STARTED_TASKSET:\r
+                                       case TaskEventType.STARTED_SUBTASK:\r
                                                Console.Write("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+                                       case TaskEventType.COMPLETED_SUBTASK:\r
                                                Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.INFO:\r
+                                       case TaskEventType.INFO:\r
                                                Console.WriteLine("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.ERROR:\r
-                                       case NaGetTaskSetEventType.WARNING:\r
+                                       case TaskEventType.ERROR:\r
+                                       case TaskEventType.WARNING:\r
                                                Console.WriteLine("  [Error] " + e.TaskMessage);\r
                                                break;\r
                                }\r
@@ -396,24 +397,24 @@ namespace AllGet
 //                     }\r
                        \r
                        NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListMan, uninstallations);\r
-                       tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) { \r
+                       tasks.TaskEventRaised += delegate(object sender, TaskEventArgs e) { \r
                                switch (e.Type) {\r
 //                                     case NaGetTaskSetEventType.COMPLETED_TASKSET\r
 //                                             break;\r
-                                       case NaGetTaskSetEventType.COMPLETED:\r
+                                       case TaskEventType.COMPLETED:\r
                                                Console.WriteLine("Done.");\r
                                                break;\r
-                                       case NaGetTaskSetEventType.STARTED_TASKSET:\r
+                                       case TaskEventType.STARTED_SUBTASK:\r
                                                Console.Write("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
+                                       case TaskEventType.COMPLETED_SUBTASK:\r
                                                Console.WriteLine(" ... Done. [{0}%]", (int) e.ProgressPercent);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.INFO:\r
+                                       case TaskEventType.INFO:\r
                                                Console.WriteLine("  " + e.TaskMessage);\r
                                                break;\r
-                                       case NaGetTaskSetEventType.ERROR:\r
-                                       case NaGetTaskSetEventType.WARNING:\r
+                                       case TaskEventType.ERROR:\r
+                                       case TaskEventType.WARNING:\r
                                                Console.WriteLine("  [Error] " + e.TaskMessage);\r
                                                break;\r
                                }\r
index b7d7079..5a0a721 100644 (file)
@@ -16,7 +16,7 @@ public class DownloadEventArgs : TaskEventArgs
        /// <summary>\r
        /// イベントの種類\r
        /// </summary>\r
-       public DownloadEventType Type;\r
+       public DownloadEventType DownloadTaskType;\r
 \r
        /// <summary>\r
        /// ダウンロード済みのバイト数\r
@@ -37,7 +37,7 @@ public class DownloadEventArgs : TaskEventArgs
        /// <param name="max">ダウンロードする総バイト数</param>\r
        public DownloadEventArgs(DownloadEventType type, string msg, long pos, long max)\r
        {\r
-               Type = type;\r
+               DownloadTaskType = type;\r
                DownloadSize = pos;\r
                MaxSize = max;\r
                \r
@@ -279,7 +279,7 @@ public class Downloader : Task
                if (DownloadEventRaised != null) {\r
                        DownloadEventArgs e = new DownloadEventArgs(type, string.Empty, pos, max);\r
                        \r
-                       switch (e.Type) {\r
+                       switch (e.DownloadTaskType) {\r
                                case DownloadEventType.CONNECTED:\r
                                        e.TaskMessage = "接続しました";\r
                                        break;\r
diff --git a/na-get-lib/NaGet.SubCommands.SubTask/DownloadSubTask.cs b/na-get-lib/NaGet.SubCommands.SubTask/DownloadSubTask.cs
new file mode 100644 (file)
index 0000000..efd7da0
--- /dev/null
@@ -0,0 +1,343 @@
+using System;
+using System.Diagnostics;
+using System.Net;
+using System.Net.Mime;
+using System.IO;
+using System.Threading;
+using NaGet.Tasks;
+
+namespace NaGet.SubCommands.SubTask
+{
+       /// <summary>
+       /// ダウンロードタスク
+       /// </summary>
+       public class DownloadSubTask : NaGetSubTask
+       {
+               /// <summary>
+               /// アクセスURL
+               /// </summary>
+               protected Uri url;
+               
+               /// <summary>
+               /// プロキシ
+               /// </summary>
+               protected IWebProxy proxy;
+               
+               /// <summary>
+               /// 保存先
+               /// </summary>
+               protected string filepath;
+               
+               /// <summary>
+               /// リクエストオブジェクト
+               /// </summary>
+               protected WebRequest request;
+               
+               /// <summary>
+               /// レスポンスオブジェクト。応答がくるまではnullである。
+               /// </summary>
+               protected WebResponse response;
+               
+               /// <summary>
+               /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名
+               /// </summary>
+               private string downloadedFileName = null;
+               
+               /// <summary>
+               /// ダウンロード要求時のキャッシュレベル。デフォルトではキャッシュ無視
+               /// </summary>
+               public System.Net.Cache.RequestCacheLevel CacheLevel = System.Net.Cache.RequestCacheLevel.NoCacheNoStore;
+               
+               /// <summary>
+               /// キャンセルが呼ばれたか否か。
+               /// </summary>
+               private bool cancelCalled = false;
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               /// <param name="url">ダウンロード先URL</param>
+               /// <param name="filepath">保存ファイルパス</param>
+               /// <param name="proxy">プロキシ</param>
+               public DownloadSubTask(Uri url, string filepath, IWebProxy proxy)
+               {
+                       this.url = url;
+                       this.filepath = filepath;
+                       this.proxy = proxy;
+                       
+                       this.request = null;
+                       this.response = null;
+                       this.downloadedFileName = null;
+               }
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               /// <param name="url">ダウンロード先URL</param>
+               /// <param name="filepath">保存ファイルパス</param>
+               public DownloadSubTask(Uri url, string filepath)
+                       : this(url, filepath, NaGet.Env.WebProxy)
+               {
+               }
+       
+               /// <summary>
+               /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名
+               /// </summary>
+               public string DownloadedFileName {
+                       get { return downloadedFileName; }
+               }
+               
+               public override void Run()
+               {
+                       NotifyStarted();
+                       RaiseTaskSetEvent(TaskEventType.STARTED, string.Format("ダウンロード:{0}", this.url), 0);
+                       
+                       try {
+                               runBuildRequest();
+                               runHandleCancelTrigger();
+                               
+                               RaiseTaskSetEvent(TaskEventType.PING, string.Format("接続中...{0}", this.url.Host), -1);
+                               
+                               runAcquireResponse();
+                               runHandleCancelTrigger();
+                               
+                               runPrepareFile();
+                               runDownloadToFile();
+                               runHandleCancelTrigger();
+                               
+                               runPostprocess();
+                       } finally {
+                               runReleaseResponse();
+                               
+                               if (cancelCalled) {
+                                       NotifyCancelled();
+                               } else {
+                                       NotifyCompleted();
+                                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "ダウンロード終了", 100);
+                               }
+                       }
+               }
+               
+               /// <summary>
+               /// キャンセルされたかを確認して、キャンセル要求があるのならば TaskCanceledException を投げる
+               /// </summary>
+               private void runHandleCancelTrigger()
+               {
+                       if (this.cancelCalled) {
+                               throw new TaskCanceledException(string.Empty);
+                       }
+               }
+               
+               /// <summary>
+               /// requestの構築。
+               /// </summary>
+               private void runBuildRequest()
+               {
+                       request = WebRequest.Create(url);
+                       request.Proxy = this.proxy;
+                       request.CachePolicy = new System.Net.Cache.RequestCachePolicy(CacheLevel);
+                       
+                       HttpWebRequest httpRequest = request as HttpWebRequest;
+                       if (httpRequest != null) {
+                               httpRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;  
+                               // TODO User-Agent
+                               httpRequest.UserAgent = "AppliStation/1.3";
+                       }
+               }
+               
+               /// <summary>
+               /// Responseを得る
+               /// </summary>
+               private void runAcquireResponse()
+               {
+                       try {
+                               response = request.GetResponse();
+                       } catch (WebException e) {
+                               if (cancelCalled) { // キャンセル時
+                                       throw new TaskCanceledException(string.Empty, e);
+                               } else {
+                                       throw new WebException(e.Message, e);
+                               }
+                       }
+               }
+               
+               /// <summary>
+               /// ダウンロード先ファイル名の決定
+               /// </summary>
+               private void runPrepareFile()
+               {
+                       try {
+                               downloadedFileName = getFileNameFromWebResponse(response);
+                       } catch (Exception) {
+                       }
+                       
+                       if (File.Exists(filepath)) { // ファイルが存在するとき削除
+                               File.Delete(filepath);
+                       }
+               }
+               
+               private void runDownloadToFile()
+               {
+                       Stopwatch stopwatch = new Stopwatch();
+                       
+                       using (Stream stream = response.GetResponseStream() )
+                       using (FileStream fs = new FileStream(filepath,
+                                                   FileMode.Create,
+                                                   FileAccess.Write) ) {
+                               try {
+                                       File.SetAttributes(filepath, FileAttributes.Hidden);
+                                       long contentLength = response.ContentLength;
+       
+                                       stopwatch.Start();
+                                       RaiseDownloadProgressTaskSetEvent(0, contentLength, 0);
+       
+                                       Timer timer = new Timer(new TimerCallback(
+                                               delegate(object obj) {
+                                                       try {
+                                                               RaiseDownloadProgressTaskSetEvent(fs.Position, contentLength, stopwatch.ElapsedMilliseconds);
+                                                       } catch (ObjectDisposedException) {
+                                                       }
+                                               }), null, 0, 1000);
+                                       
+                                       try {
+                                               byte[] data = new byte[4096];
+                                               int size = 0;
+                                               while ((size = stream.Read(data,0,data.Length)) > 0) {
+                                                       fs.Write(data, 0, size);
+                                                       
+                                                       if (cancelCalled) {
+                                                               throw new TaskCanceledException(string.Empty);
+                                                       }
+                                               }
+                                       } finally {
+                                               timer.Dispose();
+                                       }
+                                       
+                                       File.SetAttributes(filepath, FileAttributes.Normal);
+                               } catch (IOException ex) {
+                                       if (cancelCalled) {
+                                               throw new TaskCanceledException(string.Empty);
+                                       } else {
+                                               throw new IOException(ex.Message, ex);
+                                       }
+                               } finally {
+                                       if (stopwatch != null) {
+                                               stopwatch.Stop();
+                                               stopwatch = null;
+                                       }
+                               }
+                       }
+               }
+               
+               private void runPostprocess()
+               {                       
+                       // 更新日を補完
+                       if (File.Exists(filepath)) {
+                               HttpWebResponse httpResponse = response as HttpWebResponse;
+                               FtpWebResponse  ftpResponse      = response as FtpWebResponse;
+                               
+                               if (httpResponse != null) {
+                                       File.SetLastWriteTime(filepath, httpResponse.LastModified);
+                               } else if (ftpResponse != null) {
+                                       File.SetLastWriteTime(filepath, ftpResponse.LastModified);
+                               }
+                       }
+               }
+               
+               /// <summary>
+               /// responseの開放
+               /// </summary>
+               private void runReleaseResponse()
+               {
+                       if (response != null) {
+                               response.Close();
+                       }
+               }
+               
+               /// <summary>
+               /// ダウンロード処理をキャンセルする
+               /// </summary>
+               /// <returns>キャンセルに成功したときtrue</returns>
+               public override bool Cancel()
+               {
+                       if (! this.cancelCalled && ! this.Done) {
+                               this.cancelCalled = true;
+                               if (request != null) {
+                                       try {
+                                               request.Abort();
+                                       } catch (WebException) {
+                                       }
+                               }
+                               return true;
+                       } else {
+                               return false;
+                       }
+               }
+               
+               /// <summary>
+               /// Webレスポンスからダウンロードしたファイルの名前を取得
+               /// </summary>
+               /// <remarks>Content-Dispositionヘッダから取得あるいはURLの末尾から推定します</remarks>
+               /// <param name="response">レスポンスオブジェクト</param>
+               /// <returns>取得したファイル名</returns>
+               private static string getFileNameFromWebResponse(WebResponse response)
+               {
+                       HttpWebResponse httpresp = response as HttpWebResponse;
+                       if (httpresp != null) {
+                               string contentDisposition = httpresp.Headers["Content-Disposition"];
+                               
+                               if (! string.IsNullOrEmpty(contentDisposition)) {
+                                       try {
+                                               ContentDisposition parser = new ContentDisposition(contentDisposition);
+                                               if (! string.IsNullOrEmpty(parser.FileName)) {
+                                                       return parser.FileName;
+                                               }
+                                       } catch (FormatException) {
+                                       }
+                               }
+                       }
+                       
+                       return NaGet.Utils.Url2filename(response.ResponseUri);
+               }
+               
+               /// <summary>
+               /// ダウンロード進捗メッセージを生成
+               /// </summary>
+               /// <param name="downloadsize">現在ダウンロード済みのサイズ</param>
+               /// <param name="filesize">全体のファイルサイズ。不明なときはゼロを指定。</param>
+               /// <param name="elapsedms">ダウンロード開始からの時間をms単位で。</param>
+               protected virtual void RaiseDownloadProgressTaskSetEvent(long downloadsize, long filesize, long elapsedms)
+               {
+                       float percent = -1;
+                       TimeSpan eta = new TimeSpan(0);
+                       long byteps = 0;
+                       
+                       // 進捗率の算出
+                       if (filesize > 0) {
+                               percent = 100 * ((float) downloadsize) / ((float) filesize);
+                       }
+                       
+                       // スループット・残り時間の算出
+                       if (elapsedms > 0) {
+                               byteps = 1000 * downloadsize / elapsedms;
+                               if (filesize > 0) {
+                                       eta = TimeSpan.FromSeconds((filesize - downloadsize) / byteps);
+                               }
+                       }
+                       
+                       System.Text.StringBuilder msgbuilder = new System.Text.StringBuilder();
+                       msgbuilder.AppendFormat("{0} bytes", downloadsize);
+                       if (percent > 0) {
+                               msgbuilder.AppendFormat(" ({0}%)", percent);
+                       }
+                       if (eta.Ticks > 0) {
+                               msgbuilder.AppendFormat(" ETA {0}", eta);
+                       }
+                       if (byteps > 0) {
+                               msgbuilder.AppendFormat(" ({0}/s)", NaGet.Utils.FormatSize(byteps));
+                       }
+                       
+                       RaiseTaskSetEvent(TaskEventType.PING, msgbuilder.ToString(), percent);
+               }
+       }
+}
diff --git a/na-get-lib/NaGet.SubCommands.SubTask/LocalUpdateSubTask.cs b/na-get-lib/NaGet.SubCommands.SubTask/LocalUpdateSubTask.cs
new file mode 100644 (file)
index 0000000..cf69532
--- /dev/null
@@ -0,0 +1,33 @@
+using System;
+using NaGet.Tasks;
+using NaGet.Packages;
+
+namespace NaGet.SubCommands.SubTask
+{
+       public class LocalUpdateSubTask : NaGetSubTask
+       {
+               PackageListsManager pkgListMan;
+               
+               public LocalUpdateSubTask(PackageListsManager pkgListMan)
+               {
+                       this.pkgListMan = pkgListMan;
+               }
+               
+               public override void Run()
+               {
+                       NotifyStarted();
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "リスト更新", 0);
+                       
+                       pkgListMan.DetectInstalledPkgs();
+                       pkgListMan.SaveInstalledPackageList();
+                       RaiseTaskSetEvent(TaskEventType.INFO, string.Format("{0} を更新しました", NaGet.Env.ArchiveInstalledPackageListFile), 50);
+                       
+                       pkgListMan.DetectSystemInstalledPkgs();
+                       pkgListMan.SaveSystemInstalledPackageList();
+                       RaiseTaskSetEvent(TaskEventType.INFO, string.Format("{0} を更新しました", NaGet.Env.SystemInstalledPackageListFile), 100);
+                       
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "リスト更新", 100);
+                       NotifyCompleted();
+               }
+       }
+}
diff --git a/na-get-lib/NaGet.SubCommands.SubTask/NaGetSubTask.cs b/na-get-lib/NaGet.SubCommands.SubTask/NaGetSubTask.cs
new file mode 100644 (file)
index 0000000..4661725
--- /dev/null
@@ -0,0 +1,54 @@
+using System;
+using NaGet.Tasks;
+
+namespace NaGet.SubCommands.SubTask
+{
+       /// <summary>
+       /// サブタスクの基底クラス。
+       /// </summary>
+       public abstract class NaGetSubTask : Task
+       {
+               private bool isRunning = false;
+               
+               private bool isDone = false;
+               
+               private bool isCancelled = false;
+               
+               public NaGetSubTask()
+               {
+               }
+               
+               public override bool Running {
+                       get {
+                               return isRunning;
+                       }
+               }
+               
+               public override bool Done {
+                       get {
+                               return isDone;
+                       }
+               }
+               
+               public virtual bool Cancelled {
+                       get {
+                               return isCancelled;
+                       }
+               }
+               
+               protected virtual void NotifyStarted() {
+                       isRunning = true;
+                       isDone = false;
+               }
+               
+               protected virtual void NotifyCancelled() {
+                       isRunning = false;
+                       isCancelled = true;
+               }
+               
+               protected virtual void NotifyCompleted() {
+                       isRunning = false;
+                       isDone = true;
+               }
+       }
+}
index 20596d2..ac482b6 100644 (file)
@@ -23,8 +23,8 @@ namespace NaGet.SubCommands
                                if (downloader == null) {
                                        downloader = new Downloader();
                                        downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {
-                                               if (e.Type == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.PING, string.Empty, GetProgressPercent(NaGetTaskSetEventType.PING, e.ProgressPercent));
+                                               if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {
+                                                       RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));
                                                }
                                        };
                                }
@@ -68,7 +68,7 @@ namespace NaGet.SubCommands
                
                private void initializeMainTaskSetNames()
                {
-                       List<string> taskSetNames = new List<string>();
+                       taskSetNames = new List<string>();
                        
                        for (int i =0; i < Installations.Length; i++) {
                                taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));
@@ -77,14 +77,12 @@ namespace NaGet.SubCommands
                        taskSetNames.Add("インストーラーの検証");
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));
-                       
-                       TaskSetNames = taskSetNames.ToArray();
                }
                                
                public override void Run()
                {
                        currentTaskSetIndex = 0;
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "インストール処理開始");
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "インストール処理開始");
                        
                        {
                                // ハッシュ非適合なインストーラの表
@@ -100,7 +98,7 @@ namespace NaGet.SubCommands
                                        packageInstallerDownloaded = true;
                                        
                                        
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                        
                                        // ハッシュの壊れているインストーラーを取得
                                        invalidInstallers = runCheckHashForInstaller();
@@ -123,7 +121,7 @@ namespace NaGet.SubCommands
                                                
                                                switch (result) {
                                                        case NaGetTaskQueryResult.CONTINUE:
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロード処理を再試行");
+                                                               RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行");
                                                                
                                                                foreach (Installation invalidInst in invalidInstallers) {
                                                                        invalidInst.RemoveDownloadedFile();
@@ -132,7 +130,7 @@ namespace NaGet.SubCommands
                                                                break;
                                                        //case NaGetTaskQueryResult.CANCEL:
                                                        default:
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのダウンロード処理がキャンセルされました");
+                                                               RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのダウンロード処理がキャンセルされました");
                                                                done = true;
                                                                return;
                                                }
@@ -140,7 +138,7 @@ namespace NaGet.SubCommands
                                        
                                        // もしハッシュが不適合なソフトがあるならばダウンロード処理からやり直す
                                } while (invalidInstallers == null || invalidInstallers.Count > 0);
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                currentTaskSetIndex ++;
                        }
                        
@@ -148,7 +146,7 @@ namespace NaGet.SubCommands
                        
                        done = true;
                        
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);
                }
                
                
@@ -160,59 +158,59 @@ namespace NaGet.SubCommands
                        using (DownloadScanner scanner = new DownloadScanner()) {
                                scanner.Init();
                                foreach (Installation inst in Installations) {
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                        
                                        if (! inst.Downloaded) {
                                                try {
                                                        inst.Download(Downloader);
                                                } catch (TaskCanceledException) {
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");
+                                                       RaiseTaskSetEvent(TaskEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");
                                                        done = true;
                                                        return;
                                                } catch (System.Net.WebException e) {
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);
                                                        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。");
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続されていません。");
                                                        } else {
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");
                                                        }
                                                        done = true;
                                                        return;
                                                } catch (Exception e) {
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);
+                                                       RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);
                                                        done = true;
                                                        return;
                                                }
                                        }
                                        
                                        if (! inst.Downloaded) { // ダウンロードが完了せずに終わった=失敗=エラー
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));
+                                               RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));
                                                done = true;
                                                return;
                                        }
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                        currentTaskSetIndex ++;
                                        
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                        if (! NaGet.Env.EnableScanInstallerFile) {
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");
                                        } else if (!scanner.HasScanner) {
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
                                        } else {
                                                try {
                                                        DownloadScannerResult result = inst.ScanInstallerFile(scanner);
                                                        
                                                        switch (result) {
                                                                case DownloadScannerResult.ScannerNotFound:
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
+                                                                       RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
                                                                        break;
                                                                case DownloadScannerResult.InfectedAndCleaned:
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,
+                                                                       RaiseTaskSetEvent(TaskEventType.ERROR,
                                                                                  "インストーラーファイルからウイルス感染が検出されたため、削除されました。");
                                                                        done = true;
                                                                        return;
                                                                case DownloadScannerResult.InfectedButNotCleaned:
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,
+                                                                       RaiseTaskSetEvent(TaskEventType.ERROR,
                                                                                  "インストーラーファイルからウイルス感染が検出されました。");
                                                                        done = true;
                                                                        break;
@@ -222,23 +220,23 @@ namespace NaGet.SubCommands
                                                        }
                                                        
                                                } catch (System.Runtime.InteropServices.COMException ex) {
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING,
                                                                          string.Format("{0} (E{1})", ex.Message, ex.ErrorCode));
                                                } catch (System.IO.FileNotFoundException ex) {
                                                        if (ex.InnerException is System.Runtime.InteropServices.COMException) {
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,
+                                                               RaiseTaskSetEvent(TaskEventType.WARNING,
                                                                                  string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));
                                                        }
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");
+                                                       RaiseTaskSetEvent(TaskEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");
                                                        done = true;
                                                        return;
                                                }
                                        }
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                                        currentTaskSetIndex ++;
                                        
                                        if (cancelCalled) {
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");
+                                               RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");
                                                done = true;
                                                return;
                                        }
@@ -256,16 +254,16 @@ namespace NaGet.SubCommands
                        
                        int i = 0;
                        foreach (Installation inst in Installations) {
-                               float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;
+                               float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/taskSetNames.Count;
                                
                                if (inst.GetRegisteredHashCount() > 0) {
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString(), percent);
+                                       RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString(), percent);
                                        
                                        if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {
                                                invalidInstallers.Add(inst);
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);
                                        } else {
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString() + " OK", percent);
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString() + " OK", percent);
                                        }
                                }
                                i++;
@@ -277,17 +275,17 @@ namespace NaGet.SubCommands
                private void runLocalUpdate()
                {
                        // インストールトリストの更新
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                        pkgListMan.DetectInstalledPkgs();
                        pkgListMan.SaveInstalledPackageList();
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                        currentTaskSetIndex++;
                
                        // システムにインストールされているリストの更新
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                        pkgListMan.DetectSystemInstalledPkgs();
                        pkgListMan.SaveSystemInstalledPackageList();
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
                        currentTaskSetIndex++;
                }
                
index 83285c0..f76ba07 100644 (file)
@@ -23,8 +23,8 @@ namespace NaGet.SubCommands
                                if (downloader == null) {\r
                                        downloader = new Downloader();\r
                                        downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
-                                               if (e.Type == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.PING, string.Empty, GetProgressPercent(NaGetTaskSetEventType.PING, e.ProgressPercent));\r
+                                               if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
+                                                       RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));\r
                                                }\r
                                        };\r
                                }\r
@@ -68,7 +68,7 @@ namespace NaGet.SubCommands
                \r
                private void initializeMainTaskSetNames()\r
                {\r
-                       List<string> taskSetNames = new List<string>();\r
+                       taskSetNames = new List<string>();\r
                        \r
                        for (int i =0; i < Installations.Length; i++) {\r
                                taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));\r
@@ -80,14 +80,12 @@ namespace NaGet.SubCommands
                        }\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
-                       \r
-                       TaskSetNames = taskSetNames.ToArray();\r
                }\r
                                \r
                public override void Run()\r
                {\r
                        currentTaskSetIndex = 0;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "インストール処理開始");\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "インストール処理開始");\r
                        \r
                        {\r
                                // ハッシュ非適合なインストーラの表\r
@@ -103,7 +101,7 @@ namespace NaGet.SubCommands
                                        packageInstallerDownloaded = true;\r
                                        \r
                                        \r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                        \r
                                        // ハッシュの壊れているインストーラーを取得\r
                                        invalidInstallers = runCheckHashForInstaller();\r
@@ -127,11 +125,11 @@ namespace NaGet.SubCommands
                                                \r
                                                switch (result) {\r
                                                        case NaGetTaskQueryResult.CONTINUE:\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ハッシュの非整合を無視してインストールを継続");\r
+                                                               RaiseTaskSetEvent(TaskEventType.WARNING, "ハッシュの非整合を無視してインストールを継続");\r
                                                                invalidInstallers.Clear(); // ハッシュ非適合パッケージを強制的に抹消\r
                                                                break;\r
                                                        case NaGetTaskQueryResult.RETRY:\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロード処理を再試行");\r
+                                                               RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行");\r
                                                                \r
                                                                foreach (Installation invalidInst in invalidInstallers) {\r
                                                                        invalidInst.RemoveDownloadedFile();\r
@@ -140,7 +138,7 @@ namespace NaGet.SubCommands
                                                                break;\r
                                                        //case NaGetTaskQueryResult.CANCEL:\r
                                                        default:\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
+                                                               RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
                                                                done = true;\r
                                                                return;\r
                                                }\r
@@ -148,17 +146,17 @@ namespace NaGet.SubCommands
                                        \r
                                        // もしハッシュが不適合なソフトがあるならばダウンロード処理からやり直す\r
                                } while (invalidInstallers == null || invalidInstallers.Count > 0);\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                currentTaskSetIndex ++;\r
                        }\r
                        \r
                        foreach (Installation inst in Installations) {\r
-                               string installTaskMsg = TaskSetNames[currentTaskSetIndex];\r
+                               string installTaskMsg = taskSetNames[currentTaskSetIndex];\r
                                if (inst.Silent && (!inst.SupportsSilentOnly)) {\r
                                        installTaskMsg += " (サイレントインストール)";\r
                                }\r
                                \r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, installTaskMsg);\r
+                               RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, installTaskMsg);\r
                                \r
                                try {\r
                                        \r
@@ -166,20 +164,20 @@ namespace NaGet.SubCommands
                                        inst.OutputDataReceived += this.ReceivedOutputData;\r
                                        int exitCode = inst.Install();\r
                                        if (exitCode != 0) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode);\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode);\r
                                        }\r
                                        \r
                                        pkgListMan.WriteInstallationLog(inst);\r
                                } catch (Exception e) {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+                                       RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);\r
                                        done = true;\r
                                        return;\r
                                }\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, installTaskMsg);\r
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, installTaskMsg);\r
                                currentTaskSetIndex ++;\r
                                \r
                                if (cancelCalled) {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
+                                       RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
                                        done = true;\r
                                        return;\r
                                }\r
@@ -189,7 +187,7 @@ namespace NaGet.SubCommands
                        \r
                        done = true;\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);\r
                }\r
                \r
                \r
@@ -204,64 +202,64 @@ namespace NaGet.SubCommands
                                        if (! inst.IsInstallablePackage()) {\r
                                                string msg = string.Format("{0}はインストールすることができません", inst.ToString());\r
                                                \r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg);\r
+                                               RaiseTaskSetEvent(TaskEventType.ERROR, msg);\r
                                                done = true;\r
                                                return;\r
                                        }\r
                                        \r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                        \r
                                        if (! inst.Downloaded) {\r
                                                try {\r
                                                        inst.Download(Downloader);\r
                                                } catch (TaskCanceledException) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");\r
+                                                       RaiseTaskSetEvent(TaskEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");\r
                                                        done = true;\r
                                                        return;\r
                                                } catch (System.Net.WebException e) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);\r
                                                        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。");\r
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続されていません。");\r
                                                        } else {\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
                                                        }\r
                                                        done = true;\r
                                                        return;\r
                                                } catch (Exception e) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+                                                       RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);\r
                                                        done = true;\r
                                                        return;\r
                                                }\r
                                        }\r
                                        \r
                                        if (! inst.Downloaded) { // ダウンロードが完了せずに終わった=失敗=エラー\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));\r
+                                               RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));\r
                                                done = true;\r
                                                return;\r
                                        }\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                        currentTaskSetIndex ++;\r
                                        \r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                        if (! NaGet.Env.EnableScanInstallerFile) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");\r
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");\r
                                        } else if (!scanner.HasScanner) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
                                        } else {\r
                                                try {\r
                                                        DownloadScannerResult result = inst.ScanInstallerFile(scanner);\r
                                                        \r
                                                        switch (result) {\r
                                                                case DownloadScannerResult.ScannerNotFound:\r
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
+                                                                       RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
                                                                        break;\r
                                                                case DownloadScannerResult.InfectedAndCleaned:\r
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,\r
+                                                                       RaiseTaskSetEvent(TaskEventType.ERROR,\r
                                                                                  "インストーラーファイルからウイルス感染が検出されたため、削除されました。");\r
                                                                        done = true;\r
                                                                        return;\r
                                                                case DownloadScannerResult.InfectedButNotCleaned:\r
-                                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,\r
+                                                                       RaiseTaskSetEvent(TaskEventType.ERROR,\r
                                                                                  "インストーラーファイルからウイルス感染が検出されました。");\r
                                                                        done = true;\r
                                                                        break;\r
@@ -271,23 +269,23 @@ namespace NaGet.SubCommands
                                                        }\r
                                                        \r
                                                } catch (System.Runtime.InteropServices.COMException ex) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING,\r
                                                                          string.Format("{0} (E{1})", ex.Message, ex.ErrorCode));\r
                                                } catch (System.IO.FileNotFoundException ex) {\r
                                                        if (ex.InnerException is System.Runtime.InteropServices.COMException) {\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,\r
+                                                               RaiseTaskSetEvent(TaskEventType.WARNING,\r
                                                                                  string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));\r
                                                        }\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");\r
+                                                       RaiseTaskSetEvent(TaskEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");\r
                                                        done = true;\r
                                                        return;\r
                                                }\r
                                        }\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                        currentTaskSetIndex ++;\r
                                        \r
                                        if (cancelCalled) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
+                                               RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
                                                done = true;\r
                                                return;\r
                                        }\r
@@ -305,16 +303,16 @@ namespace NaGet.SubCommands
                        \r
                        int i = 0;\r
                        foreach (Installation inst in Installations) {\r
-                               float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/TaskSetNames.Length;\r
+                               float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/taskSetNames.Count;\r
                                \r
                                if (inst.GetRegisteredHashCount() > 0) {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString(), percent);\r
+                                       RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString(), percent);\r
                                        \r
                                        if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
                                                invalidInstallers.Add(inst);\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);\r
                                        } else {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "検証: "+inst.ToString() + " OK", percent);\r
+                                               RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString() + " OK", percent);\r
                                        }\r
                                }\r
                                i++;\r
@@ -326,17 +324,17 @@ namespace NaGet.SubCommands
                private void runLocalUpdate()\r
                {\r
                        // インストールトリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectInstalledPkgs();\r
                        pkgListMan.SaveInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                \r
                        // システムにインストールされているリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectSystemInstalledPkgs();\r
                        pkgListMan.SaveSystemInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                }\r
                \r
index 41a8d7a..0088c57 100644 (file)
@@ -1,67 +1,10 @@
 using System;\r
+using System.Collections.Generic;\r
+using System.Collections.ObjectModel;\r
 using NaGet.Tasks;\r
 \r
 namespace NaGet.SubCommands\r
-{\r
-       #region EventHandler<NaGetTaskSetEventArgs>\8aÖ\98A\r
-       \r
-       public class NaGetTaskSetEventArgs : TaskEventArgs\r
-       {\r
-               public NaGetTaskSetEventType Type;\r
-               \r
-               public NaGetTaskSetEventArgs(NaGetTaskSetEventType type, string message, float processPercent)\r
-               {\r
-                       this.Type = type;\r
-                       this.TaskMessage = message;\r
-                       this.ProgressPercent = processPercent;\r
-               }\r
-       }\r
-       \r
-       /// <summary>\r
-       /// \83^\83X\83N\82Ì\8eí\97Þ\r
-       /// </summary>\r
-       public enum NaGetTaskSetEventType\r
-       {\r
-               /// <summary>\r
-               /// \8aJ\8en\r
-               /// </summary>\r
-               STARTED,\r
-               /// <summary>\r
-               /// \8a®\97¹\82µ\82½(\82·\82×\82Ä\82ð\8a®\97¹)\r
-               /// </summary>\r
-               COMPLETED,\r
-               /// <summary>\r
-               /// \8dì\8bÆ\82ª\83L\83\83\83\93\83Z\83\8b\82³\82ê\82½\r
-               /// </summary>\r
-               CANCELED,\r
-               /// <summary>\r
-               /// \83G\83\89\81[\82ð\94­\90\82µ(\92\86\92f\82µ\82½)\r
-               /// </summary>\r
-               ERROR,\r
-               /// <summary>\r
-               /// \83G\83\89\81[\82ª\94­\90\82µ\82½\82ª\8cp\91±\r
-               /// </summary>\r
-               WARNING,\r
-               /// <summary>\r
-               /// \82»\82Ì\82Ù\82©\82Ì\8fî\95ñ\r
-               /// </summary>\r
-               INFO,\r
-               /// <summary>\r
-               /// \8dì\8bÆ\82ð\8aJ\8en\r
-               /// </summary>\r
-               STARTED_TASKSET,\r
-               /// <summary>\r
-               /// \8dì\8bÆ\82ð\8fI\97¹\r
-               /// </summary>\r
-               COMPLETED_TASKSET,\r
-               /// <summary>\r
-               /// \93®\8dì\90i\92»\81E\92Ê\92m\82Ì\82Ý\r
-               /// </summary>\r
-               PING,\r
-       }\r
-       \r
-       #endregion\r
-       \r
+{      \r
        #region NaGetTaskQueryHandler\8aÖ\98A\r
        \r
        public delegate NaGetTaskQueryResult NaGetTaskQueryHandler(object sender, NaGetTaskQueryArgs e);\r
@@ -118,19 +61,23 @@ namespace NaGet.SubCommands
        public abstract class NaGetTaskSet : Task\r
        {\r
                /// <summary>\r
-               /// \83^\83X\83N\8f\88\97\9d\82Ì\83C\83x\83\93\83g\83n\83\93\83h\83\89\r
+               /// \83^\83X\83N\8f\88\97\9d\92\86\82Ì\8e¿\96â\82Ì\83n\83\93\83h\83\89\r
                /// </summary>\r
-               public event EventHandler<NaGetTaskSetEventArgs> TaskSetRaised;\r
+               public event NaGetTaskQueryHandler TaskQueryRaised;\r
                \r
                /// <summary>\r
-               /// \83^\83X\83N\8f\88\97\9d\92\86\82Ì\8e¿\96â\82Ì\83n\83\93\83h\83\89\r
+               /// \95\8e\9a\97ñ\82Å\95\\8c»\82µ\82½\8dì\8bÆ\88ê\97\97\83\8a\83X\83g\r
                /// </summary>\r
-               public event NaGetTaskQueryHandler TaskQueryRaised;\r
+               protected IList<string> taskSetNames;\r
                \r
                /// <summary>\r
                /// \95\8e\9a\97ñ\82Å\95\\8c»\82µ\82½\8dì\8bÆ\88ê\97\97\83\8a\83X\83g\r
                /// </summary>\r
-               public string[] TaskSetNames;\r
+               public virtual IList<string> TaskSetNames {\r
+                       get {\r
+                               return new ReadOnlyCollection<string>(taskSetNames);\r
+                       }\r
+               }\r
                \r
                /// <summary>\r
                /// \8c»\8dÝ\8eÀ\8ds\92\86\82Ì\8dì\8bÆ\94Ô\8d\86\r
@@ -145,53 +92,50 @@ namespace NaGet.SubCommands
                /// <param name="type">\8dì\8bÆ\82Ì\8fó\91Ô</param>\r
                /// <param name="subTaskProgress">\83T\83u\83^\83X\83N\82Ì\90i\92»</param>\r
                /// <returns>\8c»\8dÝ\82Ì\90i\92»</returns>\r
-               protected virtual float GetProgressPercent(NaGetTaskSetEventType type, float subTaskProgress)\r
+               protected virtual float GetProgressPercent(TaskEventType type, float subTaskProgress)\r
                {\r
                        if (CurrentTaskSetIndex >= 0) {\r
                                if (subTaskProgress >= 0) {\r
-                                       return (CurrentTaskSetIndex * 100 + subTaskProgress) / TaskSetNames.Length;\r
+                                       return (CurrentTaskSetIndex * 100 + subTaskProgress) / taskSetNames.Count;\r
                                }\r
                                switch (type) {\r
-                                       case NaGetTaskSetEventType.STARTED:\r
+                                       case TaskEventType.STARTED:\r
                                                return 0;\r
-                                       case NaGetTaskSetEventType.COMPLETED:\r
+                                       case TaskEventType.COMPLETED:\r
                                                return 100;\r
-                                       case NaGetTaskSetEventType.COMPLETED_TASKSET:\r
-                                               return ((CurrentTaskSetIndex+1) * 100) / TaskSetNames.Length;\r
+                                       case TaskEventType.COMPLETED_SUBTASK:\r
+                                               return ((CurrentTaskSetIndex+1) * 100) / taskSetNames.Count;\r
                                        default:\r
-                                               return (CurrentTaskSetIndex * 100) / TaskSetNames.Length;\r
+                                               return (CurrentTaskSetIndex * 100) / taskSetNames.Count;\r
                                }\r
                        }\r
                        \r
                        return -1;\r
                }\r
                \r
-               protected virtual void RaiseTaskSetEvent(NaGetTaskSetEventType type, string message)\r
-               {\r
-                       RaiseTaskSetEvent(type, message, GetProgressPercent(type, -1));\r
-               }\r
+               #region TaskEvent\95Ö\97\98\83\81\83\\83b\83h\r
                \r
-               protected virtual void RaiseTaskSetEvent(NaGetTaskSetEventType type, string message, float percent)\r
+               protected virtual void RaiseTaskSetEvent(TaskEventType type, string message)\r
                {\r
-                       if (TaskSetRaised != null) {\r
-                               TaskSetRaised(this, new NaGetTaskSetEventArgs(type, message, percent));\r
-                       }\r
+                       RaiseTaskSetEvent(type, message, GetProgressPercent(type, -1));\r
                }\r
                \r
                protected virtual void ReceivedErrorData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)\r
                {\r
                        if (! string.IsNullOrEmpty(e.Data)) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Data);\r
+                               RaiseTaskSetEvent(TaskEventType.WARNING, e.Data);\r
                        }\r
                }\r
                \r
                protected virtual void ReceivedOutputData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)\r
                {\r
                        if (! string.IsNullOrEmpty(e.Data)) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, e.Data);\r
+                               RaiseTaskSetEvent(TaskEventType.INFO, e.Data);\r
                        }\r
                }\r
                \r
+               #endregion\r
+               \r
                protected virtual NaGetTaskQueryResult RaiseTaskSetQueryEvent(string message, NaGetTaskQueryResult selection)\r
                {\r
                        if (TaskQueryRaised != null) {\r
index 2d1e4da..7b5270a 100644 (file)
@@ -2,6 +2,7 @@ using System;
 using NaGet.Packages.Install;\r
 using NaGet.Packages;\r
 using NaGet.Net;\r
+using NaGet.Tasks;\r
 \r
 namespace NaGet.SubCommands\r
 {\r
@@ -48,24 +49,22 @@ namespace NaGet.SubCommands
                \r
                private void initializeMainTaskSetNames()\r
                {\r
-                       System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+                       taskSetNames = new System.Collections.Generic.List<string>();\r
                        \r
                        for (int i =0; i < Uninstallations.Length; i++) {\r
                                taskSetNames.Add(string.Format("\83A\83\93\83C\83\93\83X\83g\81[\83\8b: {0}", Uninstallations[i].ToString()));\r
                        }\r
                        taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
                        taskSetNames.Add(string.Format("\83\8a\83X\83g\8dX\90V: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
-                       \r
-                       TaskSetNames = taskSetNames.ToArray();\r
                }\r
                \r
                public override void Run()\r
                {\r
                        currentTaskSetIndex ++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\8aJ\8en");\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\8aJ\8en");\r
                        \r
                        foreach (Uninstallation uninst in Uninstallations) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, uninst.ToString());\r
+                               RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, uninst.ToString());\r
                                \r
                                if (uninst.Installed) {\r
                                        try {\r
@@ -73,41 +72,41 @@ namespace NaGet.SubCommands
                                                uninst.ErrorDataReceived += this.ReceivedErrorData;\r
                                                int exitCode = uninst.Uninstall();\r
                                                if (exitCode != 0) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83v\83\8d\83Z\83X\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82ª\90³\8fí\82É\8fI\82¦\82Ä\82¢\82È\82¢\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\83v\83\8d\83Z\83X\82Ì\8fI\97¹\83R\81[\83h:"+exitCode);\r
                                                }\r
                                        } catch (Exception e) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+                                               RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);\r
                                                done = true;\r
                                                return;\r
                                        }\r
                                } else {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, string.Format("{0}\82Í\8aù\82É\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82©\81A\83\\83t\83g\82Ì\91\8dÝ\82ð\8am\94F\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½", uninst));\r
+                                       RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("{0}\82Í\8aù\82É\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\82©\81A\83\\83t\83g\82Ì\91\8dÝ\82ð\8am\94F\82Å\82«\82Ü\82¹\82ñ\82Å\82µ\82½", uninst));\r
                                }\r
                                \r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, uninst.ToString());\r
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, uninst.ToString());\r
                        }\r
                        \r
                        runLocalUpdate();\r
                        \r
                        done = true;\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "\8fI\97¹", 100);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "\8fI\97¹", 100);\r
                }\r
                \r
                private void runLocalUpdate()\r
                {\r
                        // \83C\83\93\83X\83g\81[\83\8b\83g\83\8a\83X\83g\82Ì\8dX\90V\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectInstalledPkgs();\r
                        pkgListMan.SaveInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                \r
                        // \83V\83X\83e\83\80\82É\83C\83\93\83X\83g\81[\83\8b\82³\82ê\82Ä\82¢\82é\83\8a\83X\83g\82Ì\8dX\90V\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectSystemInstalledPkgs();\r
                        pkgListMan.SaveSystemInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                }\r
                \r
index 2a0c5a8..3a6644a 100644 (file)
@@ -27,8 +27,8 @@ namespace NaGet.SubCommands
                                if (downloader == null) {\r
                                        downloader = new Downloader();\r
                                        downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
-                                               if (e.Type == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.PING, string.Empty, GetProgressPercent(NaGetTaskSetEventType.PING, e.ProgressPercent));\r
+                                               if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
+                                                       RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));\r
                                                }\r
                                        };\r
                                }\r
@@ -60,7 +60,7 @@ namespace NaGet.SubCommands
                        pkgListMan = pkgMan;\r
                        downloadPackageLists = downloadPackageListsFlag;\r
                        \r
-                       System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+                       taskSetNames = new System.Collections.Generic.List<string>();\r
                        if (downloadPackageLists) {\r
                                // repos.list.xmlがあるとき、そこからよみとる。\r
                                repoList = NaGet.Utils.GetDeserializedObject<RepositoriesList>(NaGet.Env.RepositoriesListFile);\r
@@ -72,14 +72,12 @@ namespace NaGet.SubCommands
                        }\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
-                       \r
-                       TaskSetNames = taskSetNames.ToArray();\r
                }\r
 \r
                public override void Run()\r
                {\r
                        currentTaskSetIndex ++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "リスト更新処理開始");\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "リスト更新処理開始");\r
                        \r
                        try {\r
                                // リストのダウンロード\r
@@ -88,14 +86,14 @@ namespace NaGet.SubCommands
                                        try {\r
                                                runDownloadPackageLists();\r
                                        } catch (TaskCanceledException) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
                                                pkgListMan.LoadPackageLists();\r
                                        } catch (System.Net.WebException e) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);\r
                                                if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続されていません。");\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続されていません。");\r
                                                } else {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
                                                }\r
                                                pkgListMan.LoadPackageLists();\r
                                        } finally {\r
@@ -110,14 +108,14 @@ namespace NaGet.SubCommands
                                done = true;\r
                        }\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);\r
                }\r
                \r
                private void runDownloadPackageLists()\r
                {\r
                        PackageList<Package> avaiablePackageList = new PackageList<Package>();\r
                        foreach(RepositoryInfo repo in repoList.EnabledRepositories) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                               RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                \r
                                if (Uri.IsWellFormedUriString(repo.Url.Href, UriKind.Absolute)) {\r
                                        string tmpfileName = Path.GetTempFileName();\r
@@ -133,10 +131,10 @@ namespace NaGet.SubCommands
                                                                \r
                                                                avaiablePackageList.AddPackages(pkgList);\r
                                                        } catch (InvalidOperationException) {\r
-                                                               RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("レポジトリ'{0}'はAppliStation Native XML softlist形式ではありません。", repo.Name ?? repo.Url.Href));\r
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("レポジトリ'{0}'はAppliStation Native XML softlist形式ではありません。", repo.Name ?? repo.Url.Href));\r
                                                        }\r
                                                } else {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, string.Format("レポジトリ'{0}'の設定が不正です。", repo.Name ?? repo.Url.Href));\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'の設定が不正です。", repo.Name ?? repo.Url.Href));\r
                                                }\r
                                        } finally {\r
                                                if (File.Exists(tmpfileName)) {\r
@@ -144,10 +142,10 @@ namespace NaGet.SubCommands
                                                }\r
                                        }\r
                                } else {\r
-                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, string.Format("レポジトリ'{0}'のURLが不正なため、ソフトリストは取得できませんでした。", repo.Name ?? repo.Url.Href));\r
+                                       RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'のURLが不正なため、ソフトリストは取得できませんでした。", repo.Name ?? repo.Url.Href));\r
                                }\r
                                \r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                currentTaskSetIndex ++;\r
                        }\r
                        \r
@@ -156,27 +154,27 @@ namespace NaGet.SubCommands
                                NaGet.Utils.PutSerializeObject(NaGet.Env.RepositoriesListFile, repoList);\r
                        }\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.availablePkgList = avaiablePackageList; // Mediatorのリストを更新\r
                        pkgListMan.SaveAvailablePackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex ++;\r
                }\r
                \r
                private void runLocalUpdate()\r
                {\r
                        // インストールトリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectInstalledPkgs();\r
                        pkgListMan.SaveInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                \r
                        // システムにインストールされているリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectSystemInstalledPkgs();\r
                        pkgListMan.SaveSystemInstalledPackageList();\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
                }\r
                \r
index dd24112..3b8feb2 100644 (file)
@@ -1,45 +1,61 @@
-using System;\r
+using System;\r
 \r
 namespace NaGet.Tasks\r
 {\r
        /// <summary>\r
-       /// NaGet\82Ì\83R\83}\83\93\83h\83^\83X\83N\82Ì\92\8a\8fÛ\83N\83\89\83X\r
+       /// NaGetのコマンドタスクの抽象クラス\r
        /// </summary>\r
        public abstract class Task\r
        {\r
                /// <summary>\r
-               /// \8eÀ\8ds\82·\82é\r
+               /// タスク処理のイベントハンドラ\r
+               /// </summary>\r
+               public virtual event EventHandler<TaskEventArgs> TaskEventRaised;\r
+               \r
+               /// <summary>\r
+               /// 実行する\r
                /// </summary>\r
                public abstract void Run();\r
                \r
                /// <summary>\r
-               /// \8eÀ\8ds\8fó\91Ô\82©\94Û\82©\82ð\93¾\82é\r
+               /// 実行状態か否かを得る\r
                /// </summary>\r
                public abstract bool Running {\r
                        get;\r
                }\r
                \r
                /// <summary>\r
-               /// \8fI\97¹\82µ\82Ä\82¢\82é\82©\94Û\82©\81B\r
+               /// 終了しているか否か。\r
                /// </summary>\r
                public abstract bool Done {\r
                        get;\r
                }\r
                \r
                /// <summary>\r
-               /// \83L\83\83\83\93\83Z\83\8b\89Â\94\\82©\94Û\82©\82ð\95Ô\82·\r
+               /// キャンセル可能か否かを返す\r
                /// </summary>\r
                public virtual bool Cancelable {\r
                        get { return false; }\r
                }\r
                \r
                /// <summary>\r
-               /// \92\86\92f\82³\82¹\82é\r
+               /// 中断させる\r
                /// </summary>\r
-               /// <returns>\90¬\8c÷\82µ\82½\82©\82¢\82È\82©</returns>\r
+               /// <returns>成功したかいなか</returns>\r
                public virtual bool Cancel()\r
                {\r
                        return false;\r
                }\r
+               \r
+               #region TaskEvent便利メソッド\r
+                               \r
+               protected virtual void RaiseTaskSetEvent(TaskEventType type, string message, float percent)\r
+               {\r
+                       if (TaskEventRaised != null) {\r
+                               TaskEventRaised(this, new TaskEventArgs(type, message, percent));\r
+                       }\r
+               }\r
+               \r
+               #endregion\r
        }\r
 }\r
index 99dc3e8..aa1c49f 100644 (file)
@@ -2,9 +2,60 @@
 
 namespace NaGet.Tasks
 {
+       /// <summary>
+       /// タスクイベントの種類
+       /// </summary>
+       public enum TaskEventType
+       {
+               /// <summary>
+               /// 動作進捗・通知のみ
+               /// </summary>
+               PING,
+               /// <summary>
+               /// 開始
+               /// </summary>
+               STARTED,
+               /// <summary>
+               /// 完了した(すべてを完了)
+               /// </summary>
+               COMPLETED,
+               /// <summary>
+               /// 作業がキャンセルされた
+               /// </summary>
+               CANCELED,
+               /// <summary>
+               /// エラーを発生し(中断した)
+               /// </summary>
+               ERROR,
+               /// <summary>
+               /// エラーが発生したが継続
+               /// </summary>
+               WARNING,
+               /// <summary>
+               /// そのほかの情報
+               /// </summary>
+               INFO,
+               /// <summary>
+               /// 子作業を開始
+               /// </summary>
+               STARTED_SUBTASK,
+               /// <summary>
+               /// 子作業を終了
+               /// </summary>
+               COMPLETED_SUBTASK,
+       }
+       
+       /// <summary>
+       /// タスクのイベント
+       /// </summary>
        public class TaskEventArgs : EventArgs
        {
                /// <summary>
+               /// タスクイベントの種類
+               /// </summary>
+               public TaskEventType Type = TaskEventType.PING;
+               
+               /// <summary>
                /// タスクの進捗状況の百分率表示
                /// </summary>
                public float ProgressPercent = -1;
@@ -13,5 +64,23 @@ namespace NaGet.Tasks
                /// タスクの現況のメッセージ
                /// </summary>
                public string TaskMessage;
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               public TaskEventArgs()
+                       : this(TaskEventType.PING, null, -1)
+               {
+               }
+               
+               /// <summary>
+               /// コンストラクタ
+               /// </summary>
+               public TaskEventArgs(TaskEventType type, string message, float percent)
+               {
+                       this.Type = type;
+                       this.TaskMessage = message;
+                       this.ProgressPercent = percent;
+               }
        }
 }
index 455b982..949645f 100644 (file)
@@ -68,6 +68,8 @@
     <Compile Include="NaGet.Packages\PackageListsManager.cs" />\r
     <Compile Include="NaGet.Packages\RepositoriesList.cs" />\r
     <Compile Include="NaGet.Packages\VersionComparetor.cs" />\r
+    <Compile Include="NaGet.SubCommands.SubTask\DownloadSubTask.cs" />\r
+    <Compile Include="NaGet.SubCommands.SubTask\NaGetSubTask.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetDownloadToCache.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetInstall.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetTaskSet.cs" />\r
     <Compile Include="NaGet.Packages.Install\UninstallInformation.cs" />\r
     <Compile Include="NaGet.Packages.Install\InstalledPackage.cs" />\r
     <Compile Include="NaGet.SubCommands\NaGetUpdate.cs" />\r
+    <None Include="NaGet.SubCommands.SubTask\LocalUpdateSubTask.cs" />\r
   </ItemGroup>\r
   <ItemGroup>\r
     <Folder Include="NaGet.InteropServices" />\r
     <Folder Include="NaGet.SubCommands" />\r
+    <Folder Include="NaGet.SubCommands.SubTask" />\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file