using System.Windows.Forms;\r
using System.Threading;\r
using NaGet.SubCommands;\r
-using NaGet.Net;\r
using NaGet.Tasks;\r
\r
namespace AppliStation.Util\r
/// </summary>\r
public partial class ExecutionProgressViewer : Form\r
{\r
- private NaGetTaskSet taskSet;\r
+ private NaGetTaskSet2 taskSet;\r
\r
private Thread tasksetRunningThread = null;\r
\r
string.Format("エラーがなく正常に終了した場合、{0}秒後に自動的にこのダイアログを閉じます", autoCloseTimer.Interval/1000));\r
}\r
\r
- #region Downloader関連\r
- \r
- private void onDownloadEvent(object sender, DownloadEventArgs a)\r
- {\r
- if (InvokeRequired) {\r
- Invoke(new EventHandler<DownloadEventArgs>(onDownloadEvent), sender, a);\r
- return;\r
- }\r
- \r
- switch (a.DownloadTaskType) {\r
- case DownloadEventType.INITED:\r
- case DownloadEventType.CONNECTED:\r
- progressSubLabel.Text = a.TaskMessage;\r
- \r
- progressBarSub.Visible = true;\r
- progressSubLabel.Visible = true;\r
- break;\r
- case DownloadEventType.DOWNLOADING:\r
- progressSubLabel.Text = a.TaskMessage;\r
- break;\r
- case DownloadEventType.COMPLETED:\r
- progressBarSub.Visible = false;\r
- progressSubLabel.Visible = false;\r
- break;\r
- case DownloadEventType.ERROR:\r
- progressBarSub.Visible = false;\r
- progressSubLabel.Visible = false;\r
- \r
- logBox.SelectionColor = System.Drawing.Color.Red;\r
- logBox.AppendText(" [エラー] " + a.TaskMessage + System.Environment.NewLine);\r
- logBox.SelectionColor = logBox.ForeColor;\r
- break;\r
- }\r
- \r
- // ダウンロードの進捗を表示\r
- if (a.ProgressPercent >= 0) {\r
- progressBarSub.Value = (int) a.ProgressPercent;\r
- progressBarSub.Style = ProgressBarStyle.Continuous;\r
- } else {\r
- progressBarSub.Style = ProgressBarStyle.Marquee;\r
- }\r
- }\r
- \r
- #endregion\r
- \r
#region NaGetTaskSet関連\r
\r
private void onTaskEventRaised(object sender, TaskEventArgs e)\r
{\r
- NaGetTaskSet taskSet = (NaGetTaskSet) sender;\r
NativeMethods.ProgressBarState progressState = NativeMethods.ProgressBarState.Normal;\r
\r
cancelButton.Enabled = taskSet.Running && taskSet.Cancelable;\r
}\r
}\r
\r
- public void SetTaskSet(NaGetTaskSet taskSet)\r
+ public void SetTaskSet(NaGetTaskSet2 taskSet)\r
{\r
this.taskSet = taskSet;\r
\r
}\r
};\r
\r
- NaGetTaskSet2 taskSet2 = taskSet as NaGetTaskSet2;\r
- if (taskSet2 != null) {\r
- taskSet2.SubTaskEventRaised += delegate(object sender, TaskEventArgs e) {\r
- if (InvokeRequired) {\r
- Invoke(new EventHandler<TaskEventArgs>(onSubTaskEventRaised), sender, e);\r
- } else {\r
- onSubTaskEventRaised(sender, e);\r
- }\r
- };\r
- } else { // 古いコード\r
- System.Reflection.PropertyInfo fDownloader = taskSet.GetType().GetProperty("Downloader");\r
- if (fDownloader != null && (fDownloader.PropertyType == typeof(Downloader))) {\r
- ((Downloader) fDownloader.GetValue(taskSet, null)).DownloadEventRaised += onDownloadEvent;\r
+ taskSet.SubTaskEventRaised += delegate(object sender, TaskEventArgs e) {\r
+ if (InvokeRequired) {\r
+ Invoke(new EventHandler<TaskEventArgs>(onSubTaskEventRaised), sender, e);\r
+ } else {\r
+ onSubTaskEventRaised(sender, e);\r
}\r
- }\r
+ };\r
\r
taskSet.TaskQueryRaised += onTaskQueryRaised;\r
}\r
using System;\r
using System.IO;\r
using System.Collections.Generic;\r
-using NaGet.Net;\r
using NaGet.Packages;\r
using NaGet.Packages.Install;\r
using NaGet.SubCommands;\r
\r
namespace AllGet\r
{\r
-\r
- class DownloadListener\r
- {\r
- private string line = null;\r
- \r
- /// <summary>\r
- /// lineのコンソール上における長さ\r
- /// </summary>\r
- private int lineWidth = 0;\r
- \r
- public void OnDownload(object sender, DownloadEventArgs a) {\r
- if (line != null) {\r
- lock (line) {\r
- int newpos = (lineWidth <= 0)? 0 : Console.CursorLeft - lineWidth;\r
- if (newpos < 0) newpos = 0;\r
- \r
- // 空白で埋める\r
- Console.CursorLeft = newpos;\r
- for (int i = 0; i < lineWidth && Console.CursorLeft < Console.BufferWidth; i++) {\r
- Console.Write(' ');\r
- }\r
- Console.CursorLeft = newpos;\r
- \r
- line = null; lineWidth = 0;\r
- }\r
- }\r
- \r
- switch (a.DownloadTaskType) {\r
- case DownloadEventType.INITED:\r
- line = "starting...";\r
- break;\r
- case DownloadEventType.CONNECTED:\r
- case DownloadEventType.DOWNLOADING:\r
- line = a.TaskMessage;\r
- break;\r
- case DownloadEventType.COMPLETED:\r
- //\r
- line = null;\r
- break;\r
- case DownloadEventType.ERROR:\r
- Console.Write("interrupted! ERROR!");\r
- line = null;\r
- break;\r
- }\r
- \r
- if (line != null) {\r
- int posOld = Console.CursorLeft;\r
- Console.Write(line);\r
- lineWidth = Console.CursorLeft - posOld;\r
- }\r
- }\r
- }\r
-\r
sealed class TaskSetEventHandlers\r
{\r
public static void OnTaskSetEvent(object sender, TaskEventArgs e) { \r
\r
class MainClass\r
{\r
- private Downloader downloader;\r
- \r
private PackageListsManager pkgListMan;\r
\r
/// <summary>\r
\r
public MainClass()\r
{\r
- downloader = new Downloader();\r
- DownloadListener dl = new DownloadListener();\r
- downloader.DownloadEventRaised += new EventHandler<DownloadEventArgs>(dl.OnDownload);\r
- \r
pkgListMan = new PackageListsManager();\r
pkgListMan.LoadPackageLists();\r
}\r
+++ /dev/null
-using System;\r
-using System.Net;\r
-using System.Net.Mime;\r
-using System.IO;\r
-using System.Threading;\r
-using NaGet.Tasks;\r
-\r
-namespace NaGet.Net\r
-{\r
-\r
-/// <summary>\r
-/// ダウンロードイベントオブジェクト\r
-/// </summary>\r
-public class DownloadEventArgs : TaskEventArgs\r
-{\r
- /// <summary>\r
- /// イベントの種類\r
- /// </summary>\r
- public DownloadEventType DownloadTaskType;\r
-\r
- /// <summary>\r
- /// ダウンロード済みのバイト数\r
- /// </summary>\r
- public long DownloadSize;\r
-\r
- /// <summary>\r
- /// ダウンロードする総バイト数\r
- /// </summary>\r
- public long MaxSize;\r
- \r
- /// <summary>\r
- /// コンストラクタ\r
- /// </summary>\r
- /// <param name="type">イベントの種類</param>\r
- /// <param name="msg">イベントメッセージ</param>\r
- /// <param name="pos">ダウンロード済みのバイト数</param>\r
- /// <param name="max">ダウンロードする総バイト数</param>\r
- public DownloadEventArgs(DownloadEventType type, string msg, long pos, long max)\r
- {\r
- DownloadTaskType = type;\r
- DownloadSize = pos;\r
- MaxSize = max;\r
- \r
- TaskMessage = msg;\r
- ProgressPercent = (max > 0)? (100.0f * pos / max) : -1;\r
- }\r
-}\r
-\r
-/// <summary>\r
-/// DownloadEventArgsでのイベントの種類\r
-/// </summary>\r
-public enum DownloadEventType {\r
- INITED,\r
- CONNECTED,\r
- STARTED,\r
- DOWNLOADING,\r
- ERROR,\r
- COMPLETED\r
-}\r
-\r
-/// <summary>\r
-/// ダウンロード処理を行うクラス\r
-/// </summary>\r
-public class Downloader : Task\r
-{\r
- public IWebProxy proxy;\r
- \r
- /// <summary>\r
- /// イベントハンドラ\r
- /// </summary>\r
- public event EventHandler<DownloadEventArgs> DownloadEventRaised;\r
- \r
- /// <summary>\r
- /// アクセスURL\r
- /// </summary>\r
- protected Uri url;\r
- \r
- /// <summary>\r
- /// 保存先\r
- /// </summary>\r
- protected string filepath;\r
- \r
- /// <summary>\r
- /// リクエストオブジェクト\r
- /// </summary>\r
- protected WebRequest request;\r
- \r
- /// <summary>\r
- /// レスポンスオブジェクト。応答がくるまではnullである。\r
- /// </summary>\r
- protected WebResponse response;\r
- \r
- /// <summary>\r
- /// ダウンロード要求時のキャッシュレベル。デフォルトではキャッシュ無視\r
- /// </summary>\r
- public System.Net.Cache.RequestCacheLevel CacheLevel = System.Net.Cache.RequestCacheLevel.NoCacheNoStore;\r
- \r
- private bool cancelCalled = false;\r
- \r
- private bool done = false;\r
- \r
- /// <summary>\r
- /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名\r
- /// </summary>\r
- private string downloadedFileName = null;\r
- \r
- /// <summary>\r
- /// ウェブアクセスに使うプロキシ\r
- /// </summary>\r
- public IWebProxy Proxy {\r
- get { return proxy ?? NaGet.Env.WebProxy; }\r
- set { proxy = value; }\r
- }\r
- \r
- /// <summary>\r
- /// ダウンロード時にHTTPヘッダなどから取得した本来のファイル名\r
- /// </summary>\r
- public string DownloadedFileName {\r
- get { return downloadedFileName; }\r
- }\r
- \r
- /* ダウンロードの処理時間計測器 */\r
- private System.Diagnostics.Stopwatch stopwatch;\r
-\r
- /// <summary>\r
- /// ダウンロードを行う\r
- /// </summary>\r
- /// <param name="url">ダウンロードするリソースのURL</param>\r
- /// <param name="filepath">保存先ファイルパス</param>\r
- public void Download(string url, string filepath)\r
- {\r
- this.url = new Uri(url);\r
- this.filepath = filepath;\r
- \r
- try {\r
- Run();\r
- } catch (NotSupportedException e) {\r
- throw new NotSupportedException("Not supported download location for downloader.", e);\r
- }\r
- }\r
- \r
- /// <summary>\r
- /// 処理が終了したか否かのフラグ\r
- /// </summary>\r
- public override bool Done {\r
- get { return done; }\r
- }\r
- \r
- /// <summary>\r
- /// 現在ダウンロード処理実行中であるかのフラグ\r
- /// </summary>\r
- public override bool Running {\r
- get { return request != null && (!done); }\r
- }\r
-\r
- /// <summary>\r
- /// ダウンロード処理を実行する\r
- /// </summary>\r
- public override void Run()\r
- {\r
- RaiseDownloadEvent(DownloadEventType.INITED, 0, -1);\r
- \r
- try {\r
- request = WebRequest.Create(url);\r
- request.Proxy = this.Proxy;\r
- request.CachePolicy = new System.Net.Cache.RequestCachePolicy(CacheLevel);\r
- \r
- HttpWebRequest httpRequest = request as HttpWebRequest;\r
- if (httpRequest != null) {\r
- httpRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; \r
- httpRequest.UserAgent = "AppliStation/1.3";\r
- }\r
- \r
- if (cancelCalled) {\r
- throw new TaskCanceledException(string.Empty);\r
- }\r
- \r
- try {\r
- response = request.GetResponse();\r
- } catch (WebException e) {\r
- if (cancelCalled) { // キャンセル時\r
- throw new TaskCanceledException(string.Empty, e);\r
- } else {\r
- throw new WebException(e.Message, e);\r
- }\r
- }\r
- \r
- if (cancelCalled) {\r
- throw new TaskCanceledException(string.Empty);\r
- }\r
- \r
- try {\r
- downloadedFileName = getFileNameFromWebResponse(response);\r
- } catch (Exception) {\r
- }\r
- \r
- if (File.Exists(filepath)) { // ファイルが存在するとき削除\r
- File.Delete(filepath);\r
- }\r
- \r
- RaiseDownloadEvent(DownloadEventType.CONNECTED, 0, -1);\r
- \r
- using (Stream stream = response.GetResponseStream() )\r
- using (FileStream fs = new FileStream(filepath,\r
- FileMode.Create,\r
- FileAccess.Write) ) {\r
- try {\r
- File.SetAttributes(filepath, FileAttributes.Hidden);\r
- long contentLength = response.ContentLength;\r
- \r
- RaiseDownloadEvent(DownloadEventType.STARTED, 0, contentLength);\r
- \r
- stopwatch = new System.Diagnostics.Stopwatch();\r
- stopwatch.Start();\r
- \r
- Timer timer = new Timer(new TimerCallback(\r
- delegate(object obj) {\r
- try {\r
- RaiseDownloadEvent(DownloadEventType.DOWNLOADING, fs.Position, contentLength);\r
- } catch (ObjectDisposedException) {\r
- }\r
- }), null, 0, 1000);\r
- \r
- try {\r
- byte[] data = new byte[4096];\r
- int size = 0;\r
- while ((size = stream.Read(data,0,data.Length)) > 0) {\r
- fs.Write(data, 0, size);\r
- \r
- if (cancelCalled) {\r
- throw new TaskCanceledException(string.Empty);\r
- }\r
- }\r
- } finally {\r
- timer.Dispose();\r
- }\r
- \r
- File.SetAttributes(filepath, FileAttributes.Normal);\r
- \r
- RaiseDownloadEvent(DownloadEventType.COMPLETED, fs.Position, contentLength);\r
- } catch (IOException ex) {\r
- if (cancelCalled) {\r
- throw new TaskCanceledException(string.Empty);\r
- } else {\r
- RaiseDownloadEvent(DownloadEventType.ERROR, 0, 0);\r
- throw new IOException(ex.Message, ex);\r
- }\r
- } finally {\r
- if (stopwatch != null) {\r
- stopwatch.Stop();\r
- stopwatch = null;\r
- }\r
- }\r
- }\r
- \r
- // 更新日を補完\r
- if (File.Exists(filepath)) {\r
- HttpWebResponse httpResponse = response as HttpWebResponse;\r
- FtpWebResponse ftpResponse = response as FtpWebResponse;\r
- \r
- if (httpResponse != null) {\r
- File.SetLastWriteTime(filepath, httpResponse.LastModified);\r
- } else if (ftpResponse != null) {\r
- File.SetLastWriteTime(filepath, ftpResponse.LastModified);\r
- }\r
- }\r
- } finally {\r
- if (response != null) {\r
- response.Close();\r
- }\r
- \r
- request = null;\r
- done = true;\r
- }\r
- }\r
- \r
- protected void RaiseDownloadEvent(DownloadEventType type, long pos, long max)\r
- {\r
- if (DownloadEventRaised != null) {\r
- DownloadEventArgs e = new DownloadEventArgs(type, string.Empty, pos, max);\r
- \r
- switch (e.DownloadTaskType) {\r
- case DownloadEventType.CONNECTED:\r
- e.TaskMessage = "接続しました";\r
- break;\r
- case DownloadEventType.STARTED:\r
- case DownloadEventType.DOWNLOADING:\r
- case DownloadEventType.COMPLETED:\r
- if (e.ProgressPercent >= 0) {\r
- e.TaskMessage = string.Format("{0} bytes ({1} %)", e.DownloadSize, (int) e.ProgressPercent);\r
- } else {\r
- e.TaskMessage = string.Format("{0} bytes", e.DownloadSize);\r
- }\r
- \r
- \r
- if (stopwatch != null && stopwatch.IsRunning && stopwatch.ElapsedMilliseconds > 3000) {\r
- long bpers = e.DownloadSize * 1000 / stopwatch.ElapsedMilliseconds;\r
- if ((e.ProgressPercent >= 0) && (bpers > 0)) {\r
- TimeSpan rest = TimeSpan.FromSeconds((max - e.DownloadSize) / bpers);\r
- e.TaskMessage += string.Format(" 推定残り時間:{0} ({1}/s)", rest, NaGet.Utils.FormatSize(bpers));\r
- } else {\r
- e.TaskMessage += string.Format(" ({0}/s)", NaGet.Utils.FormatSize(bpers));\r
- }\r
- }\r
- \r
- break;\r
- }\r
- \r
- DownloadEventRaised(this, e);\r
- }\r
- }\r
- \r
- /// <summary>\r
- /// キャンセル可能かを返す\r
- /// </summary>\r
- public override bool Cancelable {\r
- get { return !(this.Done || cancelCalled); }\r
- }\r
- \r
- /// <summary>\r
- /// ダウンロード処理をキャンセルする\r
- /// </summary>\r
- /// <returns>キャンセルに成功したときtrue</returns>\r
- public override bool Cancel()\r
- {\r
- if (this.Done || cancelCalled) {\r
- return false;\r
- }\r
- \r
- cancelCalled = true;\r
- if (request != null) {\r
- try {\r
- request.Abort();\r
- } catch (WebException) {\r
- }\r
- }\r
- return true;\r
- }\r
- \r
- /// <summary>\r
- /// Webレスポンスからダウンロードしたファイルの名前を取得\r
- /// </summary>\r
- /// <remarks>Content-Dispositionヘッダから取得あるいはURLの末尾から推定します</remarks>\r
- /// <param name="response">レスポンスオブジェクト</param>\r
- /// <returns>取得したファイル名</returns>\r
- private static string getFileNameFromWebResponse(WebResponse response)\r
- {\r
- HttpWebResponse httpresp = response as HttpWebResponse;\r
- if (httpresp != null) {\r
- string contentDisposition = httpresp.Headers["Content-Disposition"];\r
- \r
- if (! string.IsNullOrEmpty(contentDisposition)) {\r
- try {\r
- ContentDisposition parser = new ContentDisposition(contentDisposition);\r
- if (! string.IsNullOrEmpty(parser.FileName)) {\r
- return parser.FileName;\r
- }\r
- } catch (FormatException) {\r
- }\r
- }\r
- }\r
- \r
- return NaGet.Utils.Url2filename(response.ResponseUri);\r
- }\r
-}\r
-\r
-}\r
-\r
-\r
using System;\r
using System.IO;\r
using System.Diagnostics;\r
-using NaGet.Net;\r
using NaGet.SubCommands;\r
using NaGet.InteropServices;\r
using System.Xml.Serialization;\r
#endregion\r
\r
/// <summary>\r
- /// ダウンロードを行う。\r
- /// </summary>\r
- /// <param name="downloader">ダウンローダオブジェクト</param>\r
- [Obsolete()]\r
- public void Download(Downloader downloader)\r
- {\r
- if (! Installed) {\r
- string url = InstalledPackage.Installer[installerIndex].Url.Href;\r
- downloader.Download(url, installerFile);\r
- \r
- // サーバ指定のファイル名に変更する\r
- if (! string.IsNullOrEmpty(downloader.DownloadedFileName)) {\r
- string newFile = Path.Combine(Path.GetDirectoryName(installerFile), downloader.DownloadedFileName);\r
- File.Move(installerFile, newFile);\r
- installerFile = newFile;\r
- }\r
- \r
- // 権限を親フォルダーに落とす\r
- try {\r
- string targetDir = Path.GetDirectoryName(installerFile);\r
- NaGet.Utils.SetAccessControlRecursive(targetDir, File.GetAccessControl(Path.GetDirectoryName(targetDir)));\r
- } catch (Exception) {} // 失敗時は何もしない\r
- }\r
- }\r
- \r
- /// <summary>\r
- /// インストーラーファイルをスキャンする\r
- /// </summary>\r
- /// <remarks>ウイルスのため退避・削除されたときも例外を投げずにあたかも正常かのように動作しえます。</remarks>\r
- /// <exception cref="ComException">スキャンで意図せぬ動作があったとき</exception>\r
- /// <param name="scanner">スキャナーオブジェクト</param>\r
- /// <returns>スキャン結果</returns>\r
- [Obsolete()]\r
- public DownloadScannerResult ScanInstallerFile(DownloadScannerService scanner)\r
- {\r
- DownloadScannerResult result;\r
- Exception e = null;\r
- try {\r
- result = scanner.Scan(installerFile, InstalledPackage.Installer[installerIndex].Url.Href);\r
- } catch (Exception ex) {\r
- result = DownloadScannerResult.ScannerNotFound;\r
- e = ex;\r
- }\r
- \r
- if ( e != null ) {\r
- // ファイルが消されていないが例外が発生していたときは、その例外を投げる\r
- throw e;\r
- } else {\r
- return result;\r
- }\r
- }\r
- \r
- /// <summary>\r
/// ハッシュ検証のためのハッシュの種類の数を返す\r
/// </summary>\r
/// <returns>ハッシュの個数</returns>\r
+++ /dev/null
-using System;
-using System.Collections.Generic;
-using NaGet.Packages.Install;
-using NaGet.Packages;
-using NaGet.Net;
-using NaGet.Tasks;
-using NaGet.InteropServices;
-
-namespace NaGet.SubCommands
-{
- public class NaGetDownloadToCache : NaGetTaskSet
- {
- private bool done = false;
-
- private int currentTaskSetIndex = -1;
-
- private PackageListsManager pkgListMan;
-
- /// <summary>
- /// ダウンロードに使うダウンローダオブジェクト
- /// </summary>
- public Downloader Downloader {
- get {
- if (downloader == null) {
- downloader = new Downloader();
- downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {
- if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {
- RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));
- }
- };
- }
- return downloader;
- }
- }
-
- private Downloader downloader;
-
- private bool packageInstallerDownloaded = false;
-
- public override bool Cancelable {
- get { return ! done; }
- }
-
- /// <summary>
- /// ダウンロードするパッケージ
- /// </summary>
- public Installation[] Installations;
-
- /// <summary>
- /// コンストラクタ
- /// </summary>
- /// <param name="pkgs">インストールするパッケージ</param>
- public NaGetDownloadToCache(PackageListsManager pkgListMan, Package[] pkgs)
- : this(pkgListMan, Installation.ConvertInstallations(pkgs))
- {
- }
-
- /// <summary>
- /// コンストラクタ
- /// </summary>
- /// <param name="installations">インストール処理の配列</param>
- public NaGetDownloadToCache(PackageListsManager pkgMan, Installation[] installations)
- {
- pkgListMan = pkgMan;
-
- Installations = installations;
- initializeMainTaskSetNames();
- }
-
- private void initializeMainTaskSetNames()
- {
- taskSetNames = new List<string>();
-
- for (int i =0; i < Installations.Length; i++) {
- taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));
- taskSetNames.Add(string.Format("ウイルススキャン: {0}", Installations[i].ToString()));
- }
- taskSetNames.Add("インストーラーの検証");
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));
- }
-
- public override void Run()
- {
- currentTaskSetIndex = 0;
- RaiseTaskSetEvent(TaskEventType.STARTED, "インストール処理開始");
-
- {
- // ハッシュ非適合なインストーラの表
- List<Installation> invalidInstallers = null;
-
- do {
- currentTaskSetIndex = 0;
- packageInstallerDownloaded = false;
-
- runDownloadAndVirusCheckInstallers();
- if (done) return; // もしrunDownloadInstallers()内でエラー終了していたなら終了
-
- packageInstallerDownloaded = true;
-
-
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
-
- // ハッシュの壊れているインストーラーを取得
- invalidInstallers = runCheckHashForInstaller();
-
- // ハッシュが壊れているときの対策
- if (invalidInstallers.Count > 0) {
- System.Text.StringBuilder invalidInstallerNames = new System.Text.StringBuilder();
- foreach (Installation invalidInst in invalidInstallers) {
- invalidInstallerNames.AppendFormat(" - {0}\n", invalidInst.ToString());
- }
-
- string msg = string.Format("以下の{0}個のパッケージでファイルが壊れている可能性があります。\n{1}\nダウンロードし直しますか?",
- invalidInstallers.Count, invalidInstallerNames.ToString());
- NaGetTaskQueryResult result = NaGetTaskQueryResult.CANCEL;
-
- if (!cancelCalled) {
- result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE
- | NaGetTaskQueryResult.CANCEL);
- }
-
- switch (result) {
- case NaGetTaskQueryResult.CONTINUE:
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行");
-
- foreach (Installation invalidInst in invalidInstallers) {
- invalidInst.RemoveDownloadedFile();
- }
-
- break;
- //case NaGetTaskQueryResult.CANCEL:
- default:
- RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのダウンロード処理がキャンセルされました");
- done = true;
- return;
- }
- }
-
- // もしハッシュが不適合なソフトがあるならばダウンロード処理からやり直す
- } while (invalidInstallers == null || invalidInstallers.Count > 0);
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- currentTaskSetIndex ++;
- }
-
- runLocalUpdate();
-
- done = true;
-
- RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);
- }
-
-
- /// <summary>
- /// 処理内容のダウンロード・ウイルススキャン部分のサブルーチン
- /// </summary>
- private void runDownloadAndVirusCheckInstallers()
- {
- using (DownloadScannerService scanner = new DownloadScannerService()) {
- scanner.Init();
- foreach (Installation inst in Installations) {
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
-
- if (! inst.Downloaded) {
- try {
- inst.Download(Downloader);
- } catch (TaskCanceledException) {
- RaiseTaskSetEvent(TaskEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");
- done = true;
- return;
- } catch (System.Net.WebException e) {
- RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);
- if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {
- RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続されていません。");
- } else {
- RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");
- }
- done = true;
- return;
- } catch (Exception e) {
- RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);
- done = true;
- return;
- }
- }
-
- if (! inst.Downloaded) { // ダウンロードが完了せずに終わった=失敗=エラー
- RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));
- done = true;
- return;
- }
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- currentTaskSetIndex ++;
-
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- if (! NaGet.Env.EnableScanInstallerFile) {
- RaiseTaskSetEvent(TaskEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");
- } else if (!scanner.HasScanner) {
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
- } else {
- try {
- DownloadScannerResult result = inst.ScanInstallerFile(scanner);
-
- switch (result) {
- case DownloadScannerResult.ScannerNotFound:
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");
- break;
- case DownloadScannerResult.InfectedAndCleaned:
- RaiseTaskSetEvent(TaskEventType.ERROR,
- "インストーラーファイルからウイルス感染が検出されたため、削除されました。");
- done = true;
- return;
- case DownloadScannerResult.InfectedButNotCleaned:
- RaiseTaskSetEvent(TaskEventType.ERROR,
- "インストーラーファイルからウイルス感染が検出されました。");
- done = true;
- break;
- case DownloadScannerResult.ErrorNotFound:
- throw new System.IO.FileNotFoundException(string.Empty);
- //break;
- }
-
- } catch (System.Runtime.InteropServices.COMException ex) {
- 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(TaskEventType.WARNING,
- string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));
- }
- RaiseTaskSetEvent(TaskEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");
- done = true;
- return;
- }
- }
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- currentTaskSetIndex ++;
-
- if (cancelCalled) {
- RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");
- done = true;
- return;
- }
- }
- }
- }
-
- /// <summary>
- /// ダウンロードしたパッケージが整合したか否かハッシュでチェック
- /// </summary>
- /// <returns>整合しなかったインストーラーのリスト</returns>
- private List<Installation> runCheckHashForInstaller()
- {
- List<Installation> invalidInstallers = new List<Installation>();
-
- int i = 0;
- foreach (Installation inst in Installations) {
- float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/taskSetNames.Count;
-
- if (inst.GetRegisteredHashCount() > 0) {
- RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString(), percent);
-
- if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {
- invalidInstallers.Add(inst);
- RaiseTaskSetEvent(TaskEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);
- } else {
- RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString() + " OK", percent);
- }
- }
- i++;
- }
-
- return invalidInstallers;
- }
-
- private void runLocalUpdate()
- {
- // インストールトリストの更新
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- pkgListMan.DetectInstalledPkgs();
- pkgListMan.SaveInstalledPackageList();
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- currentTaskSetIndex++;
-
- // システムにインストールされているリストの更新
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- pkgListMan.DetectSystemInstalledPkgs();
- pkgListMan.SaveSystemInstalledPackageList();
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);
- currentTaskSetIndex++;
- }
-
- public override bool Done {
- get { return done; }
- }
-
- public override int CurrentTaskSetIndex {
- get { return currentTaskSetIndex; }
- }
-
- private bool cancelCalled = false;
-
- public override bool Cancel()
- {
- cancelCalled = true;
- if (! packageInstallerDownloaded) {
- return Downloader.Cancel();
- } else return true;
- }
- }
-}
+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using NaGet.Packages.Install;\r
-using NaGet.Packages;\r
-using NaGet.Net;\r
-using NaGet.Tasks;\r
-using NaGet.InteropServices;\r
-\r
-namespace NaGet.SubCommands\r
-{\r
- public class NaGetInstall : NaGetTaskSet\r
- {\r
- private bool done = false;\r
- \r
- private int currentTaskSetIndex = -1;\r
- \r
- private PackageListsManager pkgListMan;\r
- \r
- /// <summary>\r
- /// ダウンロードに使うダウンローダオブジェクト\r
- /// </summary>\r
- public Downloader Downloader {\r
- get {\r
- if (downloader == null) {\r
- downloader = new Downloader();\r
- downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
- if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
- RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));\r
- }\r
- };\r
- }\r
- return downloader;\r
- }\r
- }\r
- \r
- private Downloader downloader;\r
- \r
- private bool packageInstallerDownloaded = false;\r
- \r
- public override bool Cancelable {\r
- get { return ! done; }\r
- }\r
- \r
- /// <summary>\r
- /// インストールするパッケージ\r
- /// </summary>\r
- public Installation[] Installations;\r
- \r
- /// <summary>\r
- /// コンストラクタ\r
- /// </summary>\r
- /// <param name="pkgs">インストールするパッケージ</param>\r
- public NaGetInstall(PackageListsManager pkgListMan, Package[] pkgs)\r
- : this(pkgListMan, Installation.ConvertInstallations(pkgs))\r
- {\r
- }\r
- \r
- /// <summary>\r
- /// コンストラクタ\r
- /// </summary>\r
- /// <param name="installations">インストール処理の配列</param>\r
- public NaGetInstall(PackageListsManager pkgMan, Installation[] installations)\r
- {\r
- pkgListMan = pkgMan;\r
- \r
- Installations = installations;\r
- initializeMainTaskSetNames();\r
- }\r
- \r
- private void initializeMainTaskSetNames()\r
- {\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
- taskSetNames.Add(string.Format("ウイルススキャン: {0}", Installations[i].ToString()));\r
- }\r
- taskSetNames.Add("インストーラーの検証");\r
- for (int i =0; i < Installations.Length; i++) {\r
- taskSetNames.Add(string.Format("インストール: {0}", Installations[i].ToString()));\r
- }\r
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
- }\r
- \r
- public override void Run()\r
- {\r
- currentTaskSetIndex = 0;\r
- RaiseTaskSetEvent(TaskEventType.STARTED, "インストール処理開始");\r
- \r
- {\r
- // ハッシュ非適合なインストーラの表\r
- List<Installation> invalidInstallers = null;\r
- \r
- do {\r
- currentTaskSetIndex = 0;\r
- packageInstallerDownloaded = false;\r
- \r
- runDownloadAndVirusCheckInstallers();\r
- if (done) return; // もしrunDownloadInstallers()内でエラー終了していたなら終了\r
- \r
- packageInstallerDownloaded = true;\r
- \r
- \r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- \r
- // ハッシュの壊れているインストーラーを取得\r
- invalidInstallers = runCheckHashForInstaller();\r
- \r
- // ハッシュが壊れているときの対策\r
- if (invalidInstallers.Count > 0) {\r
- System.Text.StringBuilder invalidInstallerNames = new System.Text.StringBuilder();\r
- foreach (Installation invalidInst in invalidInstallers) {\r
- invalidInstallerNames.AppendFormat(" - {0}\n", invalidInst.ToString());\r
- }\r
- \r
- string msg = string.Format("以下の{0}個のパッケージでファイルが壊れている可能性があります。\n{1}\n強制的にインストールを続行しますか?",\r
- invalidInstallers.Count, invalidInstallerNames.ToString());\r
- NaGetTaskQueryResult result = NaGetTaskQueryResult.CANCEL;\r
- \r
- if (!cancelCalled) {\r
- result = RaiseTaskSetQueryEvent(msg, NaGetTaskQueryResult.CONTINUE\r
- | NaGetTaskQueryResult.RETRY\r
- | NaGetTaskQueryResult.CANCEL);\r
- }\r
- \r
- switch (result) {\r
- case NaGetTaskQueryResult.CONTINUE:\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "ハッシュの非整合を無視してインストールを継続");\r
- invalidInstallers.Clear(); // ハッシュ非適合パッケージを強制的に抹消\r
- break;\r
- case NaGetTaskQueryResult.RETRY:\r
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロード処理を再試行");\r
- \r
- foreach (Installation invalidInst in invalidInstallers) {\r
- invalidInst.RemoveDownloadedFile();\r
- }\r
- \r
- break;\r
- //case NaGetTaskQueryResult.CANCEL:\r
- default:\r
- RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
- done = true;\r
- return;\r
- }\r
- }\r
- \r
- // もしハッシュが不適合なソフトがあるならばダウンロード処理からやり直す\r
- } while (invalidInstallers == null || invalidInstallers.Count > 0);\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex ++;\r
- }\r
- \r
- foreach (Installation inst in Installations) {\r
- string installTaskMsg = taskSetNames[currentTaskSetIndex];\r
- if (inst.Silent && (!inst.SupportsSilentOnly)) {\r
- installTaskMsg += " (サイレントインストール)";\r
- }\r
- \r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, installTaskMsg);\r
- \r
- try {\r
- \r
- inst.ErrorDataReceived += this.ReceivedErrorData;\r
- inst.OutputDataReceived += this.ReceivedOutputData;\r
- int exitCode = inst.Install();\r
- if (exitCode != 0) {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "インストールが正常に終えていない可能性があります。プロセスの終了コード:"+exitCode);\r
- }\r
- \r
- pkgListMan.WriteInstallationLog(inst);\r
- } catch (Exception e) {\r
- RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);\r
- done = true;\r
- return;\r
- }\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, installTaskMsg);\r
- currentTaskSetIndex ++;\r
- \r
- if (cancelCalled) {\r
- RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
- done = true;\r
- return;\r
- }\r
- }\r
- \r
- runLocalUpdate();\r
- \r
- done = true;\r
- \r
- RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);\r
- }\r
- \r
- \r
- /// <summary>\r
- /// 処理内容のダウンロード・ウイルススキャン部分のサブルーチン\r
- /// </summary>\r
- private void runDownloadAndVirusCheckInstallers()\r
- {\r
- using (DownloadScannerService scanner = new DownloadScannerService()) {\r
- scanner.Init();\r
- foreach (Installation inst in Installations) {\r
- if (! inst.IsInstallablePackage()) {\r
- string msg = string.Format("{0}はインストールすることができません", inst.ToString());\r
- \r
- RaiseTaskSetEvent(TaskEventType.ERROR, msg);\r
- done = true;\r
- return;\r
- }\r
- \r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- \r
- if (! inst.Downloaded) {\r
- try {\r
- inst.Download(Downloader);\r
- } catch (TaskCanceledException) {\r
- RaiseTaskSetEvent(TaskEventType.CANCELED, "インストーラーのダウンロード処理がキャンセルされました");\r
- done = true;\r
- return;\r
- } catch (System.Net.WebException e) {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);\r
- if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
- RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続されていません。");\r
- } else {\r
- RaiseTaskSetEvent(TaskEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
- }\r
- done = true;\r
- return;\r
- } catch (Exception e) {\r
- RaiseTaskSetEvent(TaskEventType.ERROR, e.Message);\r
- done = true;\r
- return;\r
- }\r
- }\r
- \r
- if (! inst.Downloaded) { // ダウンロードが完了せずに終わった=失敗=エラー\r
- RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("{0}のインストーラーファイルを正常にダウンロードできませんでした", inst.ToString()));\r
- done = true;\r
- return;\r
- }\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex ++;\r
- \r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- if (! NaGet.Env.EnableScanInstallerFile) {\r
- RaiseTaskSetEvent(TaskEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");\r
- } else if (!scanner.HasScanner) {\r
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
- } else {\r
- try {\r
- DownloadScannerResult result = inst.ScanInstallerFile(scanner);\r
- \r
- switch (result) {\r
- case DownloadScannerResult.ScannerNotFound:\r
- RaiseTaskSetEvent(TaskEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
- break;\r
- case DownloadScannerResult.InfectedAndCleaned:\r
- RaiseTaskSetEvent(TaskEventType.ERROR,\r
- "インストーラーファイルからウイルス感染が検出されたため、削除されました。");\r
- done = true;\r
- return;\r
- case DownloadScannerResult.InfectedButNotCleaned:\r
- RaiseTaskSetEvent(TaskEventType.ERROR,\r
- "インストーラーファイルからウイルス感染が検出されました。");\r
- done = true;\r
- break;\r
- case DownloadScannerResult.ErrorNotFound:\r
- throw new System.IO.FileNotFoundException(string.Empty);\r
- //break;\r
- }\r
- \r
- } catch (System.Runtime.InteropServices.COMException ex) {\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(TaskEventType.WARNING,\r
- string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));\r
- }\r
- RaiseTaskSetEvent(TaskEventType.ERROR, "インストーラーファイルがウイルススキャナーによって削除されました。");\r
- done = true;\r
- return;\r
- }\r
- }\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex ++;\r
- \r
- if (cancelCalled) {\r
- RaiseTaskSetEvent(TaskEventType.CANCELED, "パッケージのインストール処理がキャンセルされました");\r
- done = true;\r
- return;\r
- }\r
- }\r
- }\r
- }\r
- \r
- /// <summary>\r
- /// ダウンロードしたパッケージが整合したか否かハッシュでチェック\r
- /// </summary>\r
- /// <returns>整合しなかったインストーラーのリスト</returns>\r
- private List<Installation> runCheckHashForInstaller()\r
- {\r
- List<Installation> invalidInstallers = new List<Installation>();\r
- \r
- int i = 0;\r
- foreach (Installation inst in Installations) {\r
- float percent = (CurrentTaskSetIndex+((float)i / Installations.Length))*100f/taskSetNames.Count;\r
- \r
- if (inst.GetRegisteredHashCount() > 0) {\r
- RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString(), percent);\r
- \r
- if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {\r
- invalidInstallers.Add(inst);\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "検証: "+inst.ToString() + " 非整合", percent);\r
- } else {\r
- RaiseTaskSetEvent(TaskEventType.INFO, "検証: "+inst.ToString() + " OK", percent);\r
- }\r
- }\r
- i++;\r
- }\r
- \r
- return invalidInstallers;\r
- }\r
- \r
- private void runLocalUpdate()\r
- {\r
- // インストールトリストの更新\r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectInstalledPkgs();\r
- pkgListMan.SaveInstalledPackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex++;\r
- \r
- // システムにインストールされているリストの更新\r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectSystemInstalledPkgs();\r
- pkgListMan.SaveSystemInstalledPackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex++;\r
- }\r
- \r
- public override bool Done {\r
- get { return done; }\r
- }\r
- \r
- public override int CurrentTaskSetIndex {\r
- get { return currentTaskSetIndex; }\r
- }\r
- \r
- private bool cancelCalled = false;\r
- \r
- public override bool Cancel()\r
- {\r
- cancelCalled = true;\r
- if (! packageInstallerDownloaded) {\r
- return Downloader.Cancel();\r
- } else return true;\r
- }\r
- }\r
-}\r
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using NaGet.Tasks;
+
+namespace NaGet.SubCommands
+{
+ public delegate NaGetTaskQueryResult NaGetTaskQueryHandler(object sender, NaGetTaskQueryArgs e);
+
+ public class NaGetTaskQueryArgs
+ {
+ /// <summary>
+ /// タスクの現況のメッセージ
+ /// </summary>
+ public string Message;
+
+ /// <summary>
+ /// 回答の種類のフラグ
+ /// </summary>
+ public NaGetTaskQueryResult SelectionFlag;
+
+ public NaGetTaskQueryArgs(string message, NaGetTaskQueryResult selectionFlag)
+ {
+ this.Message = message;
+ this.SelectionFlag = selectionFlag;
+ }
+ }
+
+ /// <summary>
+ /// 質問の答え
+ /// </summary>
+ [Flags()]
+ public enum NaGetTaskQueryResult : uint
+ {
+ /// <summary>
+ /// 継続(=OK)
+ /// </summary>
+ CONTINUE = 0x01,
+ /// <summary>
+ /// 再試行
+ /// </summary>
+ RETRY = 0x02,
+ /// <summary>
+ /// キャンセル、中止
+ /// </summary>
+ CANCEL = 0x04,
+ /// <summary>
+ /// 自動的なキャンセル(ユーザの手ではないもの)
+ /// </summary>
+ CANCELED_AUTOMATICALLY = 0x00,
+ }
+
+}
using NaGet.Tasks;\r
\r
namespace NaGet.SubCommands\r
-{ \r
- #region NaGetTaskQueryHandler\8aÖ\98A\r
- \r
- public delegate NaGetTaskQueryResult NaGetTaskQueryHandler(object sender, NaGetTaskQueryArgs e);\r
- \r
- public class NaGetTaskQueryArgs\r
- {\r
- /// <summary>\r
- /// \83^\83X\83N\82Ì\8c»\8bµ\82Ì\83\81\83b\83Z\81[\83W\r
- /// </summary>\r
- public string Message;\r
- \r
- /// <summary>\r
- /// \89ñ\93\9a\82Ì\8eí\97Þ\82Ì\83t\83\89\83O\r
- /// </summary>\r
- public NaGetTaskQueryResult SelectionFlag;\r
- \r
- public NaGetTaskQueryArgs(string message, NaGetTaskQueryResult selectionFlag)\r
- {\r
- this.Message = message;\r
- this.SelectionFlag = selectionFlag;\r
- }\r
- }\r
- \r
- /// <summary>\r
- /// \8e¿\96â\82Ì\93\9a\82¦\r
- /// </summary>\r
- [Flags()]\r
- public enum NaGetTaskQueryResult : uint\r
- {\r
- /// <summary>\r
- /// \8cp\91±(=OK)\r
- /// </summary>\r
- CONTINUE = 0x01,\r
- /// <summary>\r
- /// \8dÄ\8e\8e\8ds\r
- /// </summary>\r
- RETRY = 0x02,\r
- /// <summary>\r
- /// \83L\83\83\83\93\83Z\83\8b\81A\92\86\8e~\r
- /// </summary>\r
- CANCEL = 0x04,\r
- /// <summary>\r
- /// \8e©\93®\93I\82È\83L\83\83\83\93\83Z\83\8b(\83\86\81[\83U\82Ì\8eè\82Å\82Í\82È\82¢\82à\82Ì)\r
- /// </summary>\r
- CANCELED_AUTOMATICALLY = 0x00,\r
- }\r
- \r
- \r
- #endregion\r
- \r
+{\r
/// <summary>\r
/// NaGet\83^\83X\83N\8f\88\97\9d\82Ì\83p\83b\83N\r
/// </summary>\r
+ [Obsolete]\r
public abstract class NaGetTaskSet : Task\r
{\r
/// <summary>\r
using System;
using System.Collections.Generic;
+using System.Collections.ObjectModel;
using NaGet.SubCommands.SubTask;
using NaGet.Tasks;
/// <summary>
/// NaGetタスク処理のパック
/// </summary>
- public abstract class NaGetTaskSet2 : NaGetTaskSet
+ public abstract class NaGetTaskSet2 : Task
{
/// <summary>
/// サブタスクのハンドラ
public virtual event EventHandler<TaskEventArgs> SubTaskEventRaised;
/// <summary>
+ /// タスク処理中の質問のハンドラ
+ /// </summary>
+ public event NaGetTaskQueryHandler TaskQueryRaised;
+
+ /// <summary>
/// サブタスクのリスト
/// </summary>
protected IList<NaGetSubTask> subTasks;
/// <summary>
+ /// 文字列で表現した作業一覧リスト
+ /// </summary>
+ protected IList<string> taskSetNames;
+
+ /// <summary>
/// 現在実行中のサブタスクのインデックス
/// </summary>
private int currentSubTaskIndex = -1;
}
}
- public override int CurrentTaskSetIndex {
+ public virtual int CurrentTaskSetIndex {
get { return currentSubTaskIndex; }
}
get { return isCancelled; }
}
+ public override bool Running {
+ get { return CurrentTaskSetIndex >= 0 && !Done; }
+ }
+
+ /// <summary>
+ /// 文字列で表現した作業一覧リスト
+ /// </summary>
+ public virtual IList<string> TaskSetNames {
+ get {
+ return new ReadOnlyCollection<string>(taskSetNames);
+ }
+ }
+
+ /// <summary>
+ /// 現在の進捗を戻す。
+ /// </summary>
+ /// <param name="type">作業の状態</param>
+ /// <param name="subTaskProgress">サブタスクの進捗</param>
+ /// <returns>現在の進捗</returns>
+ protected virtual float GetProgressPercent(TaskEventType type, float subTaskProgress)
+ {
+ if (CurrentTaskSetIndex >= 0) {
+ if (subTaskProgress >= 0) {
+ return (CurrentTaskSetIndex * 100 + subTaskProgress) / taskSetNames.Count;
+ }
+ switch (type) {
+ case TaskEventType.STARTED:
+ return 0;
+ case TaskEventType.COMPLETED:
+ return 100;
+ case TaskEventType.COMPLETED_SUBTASK:
+ return ((CurrentTaskSetIndex+1) * 100) / taskSetNames.Count;
+ default:
+ return (CurrentTaskSetIndex * 100) / taskSetNames.Count;
+ }
+ }
+
+ return -1;
+ }
+
#region フラグ処理の便利メソッド
/// <summary>
#endregion
+ #region TaskEvent便利メソッド
+
+ protected virtual void RaiseTaskSetEvent(TaskEventType type, string message)
+ {
+ RaiseTaskSetEvent(type, message, GetProgressPercent(type, -1));
+ }
+
+ protected virtual void ReceivedErrorData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)
+ {
+ if (! string.IsNullOrEmpty(e.Data)) {
+ RaiseTaskSetEvent(TaskEventType.WARNING, e.Data);
+ }
+ }
+
+ protected virtual void ReceivedOutputData(object sender, NaGet.Utils.AnyDataEventArgs<string> e)
+ {
+ if (! string.IsNullOrEmpty(e.Data)) {
+ RaiseTaskSetEvent(TaskEventType.INFO, e.Data);
+ }
+ }
+
+ protected virtual NaGetTaskQueryResult RaiseTaskSetQueryEvent(string message, NaGetTaskQueryResult selection)
+ {
+ if (TaskQueryRaised != null) {
+ return TaskQueryRaised(this, new NaGetTaskQueryArgs(message, selection));
+ }
+ return NaGetTaskQueryResult.CANCELED_AUTOMATICALLY;
+ }
+
+ #endregion
+
#region サブタスク初期化・登録便利メソッド
protected void initSubTask()
+++ /dev/null
-using System;\r
-using NaGet.Packages.Install;\r
-using NaGet.Packages;\r
-using NaGet.Net;\r
-using NaGet.Tasks;\r
-\r
-namespace NaGet.SubCommands\r
-{\r
- public class NaGetUninstall : NaGetTaskSet\r
- {\r
- private bool done = false;\r
- \r
- private int currentTaskSetIndex = -1;\r
- \r
- private PackageListsManager pkgListMan;\r
- \r
- /// <summary>\r
- /// \83A\83\93\83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W\r
- /// </summary>\r
- public Uninstallation[] Uninstallations;\r
- \r
- /// <summary>\r
- /// \83R\83\93\83X\83g\83\89\83N\83^\r
- /// </summary>\r
- /// <param name="pkgs">\83A\83\93\83C\83\93\83X\83g\81[\83\8b\82·\82é\83p\83b\83P\81[\83W</param>\r
- public NaGetUninstall(PackageListsManager pkgMan, InstalledPackage[] pkgs)\r
- {\r
- pkgListMan = pkgMan;\r
- \r
- Uninstallations = new Uninstallation[pkgs.Length];\r
- for (int i = 0; i < pkgs.Length; i++) {\r
- Uninstallations[i] = new Uninstallation(pkgs[i]);\r
- }\r
- \r
- initializeMainTaskSetNames();\r
- }\r
- \r
- /// <summary>\r
- /// \83R\83\93\83X\83g\83\89\83N\83^\r
- /// </summary>\r
- /// <param name="uninstallations">\83A\83\93\83C\83\93\83X\83g\81[\83\8b\8f\88\97\9d\82Ì\94z\97ñ</param>\r
- public NaGetUninstall(PackageListsManager pkgMan, Uninstallation[] uninstallations)\r
- {\r
- pkgListMan = pkgMan;\r
- \r
- Uninstallations = uninstallations;\r
- initializeMainTaskSetNames();\r
- }\r
- \r
- private void initializeMainTaskSetNames()\r
- {\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
- \r
- public override void Run()\r
- {\r
- currentTaskSetIndex ++;\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(TaskEventType.STARTED_SUBTASK, uninst.ToString());\r
- \r
- if (uninst.Installed) {\r
- try {\r
- uninst.OutputDataReceived += this.ReceivedOutputData;\r
- uninst.ErrorDataReceived += this.ReceivedErrorData;\r
- int exitCode = uninst.Uninstall();\r
- if (exitCode != 0) {\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(TaskEventType.ERROR, e.Message);\r
- done = true;\r
- return;\r
- }\r
- } else {\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(TaskEventType.COMPLETED_SUBTASK, uninst.ToString());\r
- }\r
- \r
- runLocalUpdate();\r
- \r
- done = true;\r
- \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(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectInstalledPkgs();\r
- pkgListMan.SaveInstalledPackageList();\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(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectSystemInstalledPkgs();\r
- pkgListMan.SaveSystemInstalledPackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex++;\r
- }\r
- \r
- public override bool Done {\r
- get { return done; }\r
- }\r
- \r
- public override int CurrentTaskSetIndex {\r
- get { return currentTaskSetIndex; }\r
- }\r
- }\r
-}\r
+++ /dev/null
-using System;\r
-using System.IO;\r
-using NaGet.Packages;\r
-using NaGet.Packages.Install;\r
-using NaGet.Net;\r
-using NaGet.SubCommands;\r
-using NaGet.Tasks;\r
-\r
-namespace NaGet.SubCommands\r
-{\r
- public class NaGetUpdate : NaGetTaskSet\r
- {\r
- private RepositoriesList repoList;\r
- \r
- private PackageListsManager pkgListMan;\r
- \r
- private bool downloadPackageLists = false;\r
- \r
- private bool packageListsDownloaded = true;\r
- \r
- \r
- /// <summary>\r
- /// ダウンロードに使うダウンローダオブジェクト\r
- /// </summary>\r
- public Downloader Downloader {\r
- get {\r
- if (downloader == null) {\r
- downloader = new Downloader();\r
- downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
- if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
- RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));\r
- }\r
- };\r
- }\r
- return downloader;\r
- }\r
- }\r
- \r
- private Downloader downloader;\r
- \r
- private int currentTaskSetIndex = -1;\r
- \r
- private bool done = false;\r
- \r
- public override int CurrentTaskSetIndex {\r
- get { return currentTaskSetIndex; }\r
- }\r
- \r
- public override bool Cancelable {\r
- get { return ! packageListsDownloaded; }\r
- }\r
- \r
- public NaGetUpdate(PackageListsManager pkgListMan)\r
- : this(pkgListMan, true)\r
- {\r
- }\r
- \r
- public NaGetUpdate(PackageListsManager pkgMan, bool downloadPackageListsFlag)\r
- {\r
- pkgListMan = pkgMan;\r
- downloadPackageLists = downloadPackageListsFlag;\r
- \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
- \r
- foreach (RepositoryInfo repo in repoList.EnabledRepositories) {\r
- taskSetNames.Add(string.Format("リスト取得: {0}", repo.Url.Href));\r
- }\r
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.PackageListFile));\r
- }\r
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
- taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
- }\r
-\r
- public override void Run()\r
- {\r
- currentTaskSetIndex ++;\r
- RaiseTaskSetEvent(TaskEventType.STARTED, "リスト更新処理開始");\r
- \r
- try {\r
- // リストのダウンロード\r
- if (downloadPackageLists) {\r
- packageListsDownloaded = false;\r
- try {\r
- runDownloadPackageLists();\r
- } catch (TaskCanceledException) {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
- pkgListMan.LoadPackageLists();\r
- } catch (System.Net.WebException e) {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);\r
- if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続されていません。");\r
- } else {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
- }\r
- pkgListMan.LoadPackageLists();\r
- } finally {\r
- int numOfEnabledRepos = NaGet.Utils.IEnumerable2Array(repoList.EnabledRepositories).Length;\r
- currentTaskSetIndex = numOfEnabledRepos + 1;\r
- }\r
- packageListsDownloaded = true;\r
- }\r
- \r
- runLocalUpdate();\r
- } finally {\r
- done = true;\r
- }\r
- \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(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- \r
- if (Uri.IsWellFormedUriString(repo.Url.Href, UriKind.Absolute)) {\r
- string tmpfileName = Path.GetTempFileName();\r
- try {\r
- Downloader.Download(repo.Url.Href, tmpfileName);\r
- if (repo.Type == RepositoryType.APPLISTATION_NATIVE_XML_1_0) {\r
- try {\r
- PackageList<Package> pkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(tmpfileName);\r
- pkgList.FixPackageListName(); // PackageListNameとの紐付けを行う\r
- \r
- // RepositoryReferenceの名前を読み込む // TODO RepositoryReferenceの名前を読み込む処理はここでいいのか?\r
- repo.Name = (string.IsNullOrEmpty(pkgList.Name))? repo.Name : pkgList.Name;\r
- \r
- avaiablePackageList.AddPackages(pkgList);\r
- } catch (InvalidOperationException) {\r
- RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("レポジトリ'{0}'はAppliStation Native XML softlist形式ではありません。", repo.Name ?? repo.Url.Href));\r
- }\r
- } else {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'の設定が不正です。", repo.Name ?? repo.Url.Href));\r
- }\r
- } finally {\r
- if (File.Exists(tmpfileName)) {\r
- File.Delete(tmpfileName);\r
- }\r
- }\r
- } else {\r
- RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'のURLが不正なため、ソフトリストは取得できませんでした。", repo.Name ?? repo.Url.Href));\r
- }\r
- \r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex ++;\r
- }\r
- \r
- // TODO 暫定的にかならず常にrepositoryリストに書き込む。\r
- if ( true ) {\r
- NaGet.Utils.PutSerializeObject(NaGet.Env.RepositoriesListFile, repoList);\r
- }\r
- \r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.availablePkgList = avaiablePackageList; // Mediatorのリストを更新\r
- pkgListMan.SaveAvailablePackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex ++;\r
- }\r
- \r
- private void runLocalUpdate()\r
- {\r
- // インストールトリストの更新\r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectInstalledPkgs();\r
- pkgListMan.SaveInstalledPackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex++;\r
- \r
- // システムにインストールされているリストの更新\r
- RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
- pkgListMan.DetectSystemInstalledPkgs();\r
- pkgListMan.SaveSystemInstalledPackageList();\r
- RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
- currentTaskSetIndex++;\r
- }\r
- \r
- public override bool Cancel()\r
- {\r
- return Downloader.Cancel();\r
- }\r
-\r
- public override bool Done {\r
- get { return done; }\r
- }\r
- }\r
-}\r
using System.Net;
using NaGet.Packages;
using NaGet.Packages.Install;
-using NaGet.Net;
using NaGet.SubCommands;
using NaGet.SubCommands.SubTask;
using NaGet.Tasks;
<Compile Include="NaGet.SubCommands.SubTask\NaGetSubTask.cs" />\r
<Compile Include="NaGet.SubCommands.SubTask\VerifyInstallerFileSubTask.cs" />\r
<Compile Include="NaGet.SubCommands.SubTask\VirusScanSubTask.cs" />\r
- <Compile Include="NaGet.SubCommands\NaGetDownloadToCache.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetDownloadToCache2.cs" />\r
- <Compile Include="NaGet.SubCommands\NaGetInstall.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetInstall2.cs" />\r
+ <Compile Include="NaGet.SubCommands\NaGetTaskQueryArgs.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetTaskSet.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetTaskSet2.cs" />\r
- <Compile Include="NaGet.SubCommands\NaGetUninstall.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetUninstall2.cs" />\r
<Compile Include="NaGet.SubCommands\NaGetUpdate2.cs" />\r
<Compile Include="NaGet.Tasks\Task.cs" />\r
<Compile Include="NaGet\Env.cs" />\r
<Compile Include="NaGet\NaGetLibPref.cs" />\r
<Compile Include="NaGet\Utils.cs" />\r
- <Compile Include="NaGet.Net\Downloader.cs" />\r
<Compile Include="NaGet.Packages\HashValue.cs" />\r
<Compile Include="NaGet.Packages\Package.cs" />\r
<Compile Include="NaGet.Packages\Platform.cs" />\r
<Compile Include="NaGet.Packages.Install\Uninstallation.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
</ItemGroup>\r
<ItemGroup>\r
<Folder Include="NaGet.InteropServices" />\r