CLSCTX_ALL = CLSCTX_SERVER|CLSCTX_INPROC_HANDLER,\r
}\r
\r
+ /// <summary>\r
+ /// 初期化禁止\r
+ /// </summary>\r
private ComDirectAccess()\r
{\r
}\r
\r
+ /// <summary>\r
+ /// COMオブジェクトを生成する。CoCreateInstanceのラッパメソッド\r
+ /// </summary>\r
+ /// <param name="rclsid">オブジェクトのCLSID</param>\r
+ /// <param name="pUnkOuter">アグリゲートオブジェクト</param>\r
+ /// <param name="dwClsContext">コンテキスト</param>\r
+ /// <param name="riid">オブジェクトのIID</param>\r
+ /// <returns>生成されたCOMオブジェクト</returns>\r
public static object CreateInstance(Guid rclsid, object pUnkOuter, CLSCTX dwClsContext, Guid riid)\r
{\r
return CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid);\r
}\r
\r
+ /// <summary>\r
+ /// COMオブジェクトを生成する。COMオブジェクトの型はテンプレートTから自動取得・キャストされる。\r
+ /// </summary>\r
+ /// <param name="clsid">オブジェクトのCLSID</param>\r
+ /// <param name="dwClsContext">コンテキスト</param>\r
+ /// <returns>生成されたCOMオブジェクト</returns>\r
public static T CreateInstance<T>(Guid clsid, CLSCTX dwClsContext)\r
{\r
Guid riid = new Guid(((GuidAttribute) Attribute.GetCustomAttribute(typeof(T), typeof(GuidAttribute))).Value);\r
-using System;\r
+/*\r
+ * This code is based on /mozilla/source/toolkit/components/downloads/src/nsDownloadScanner.cpp\r
+ * and sample code at https://bugzilla.mozilla.org/show_bug.cgi?id=103487,\r
+ * created by Rob Arnold.\r
+ */\r
+\r
+using System;\r
using System.Reflection;\r
using System.Collections.Generic;\r
using System.Runtime.InteropServices;\r
\r
namespace NaGet.Net\r
{\r
+ /// <summary>\r
+ /// ダウンロードしたファイルをスキャンする\r
+ /// </summary>\r
public class DownloadScanner : IDisposable\r
{\r
#region COMInterop\r
}\r
\r
private List<IOfficeAntiVirus> scanners;\r
- \r
+\r
+ /// <summary>\r
+ /// コンストラクタ。内部でCOM呼び出し初期化(CoInitialize)されます。\r
+ /// </summary>\r
public DownloadScanner()\r
{\r
ComDirectAccess.CoInitialize(IntPtr.Zero);\r
}\r
\r
+ /// <summary>\r
+ /// 内部でCOM開放(CoUninitialize)します。必ず呼び出す必要があります。\r
+ /// </summary>\r
public void Dispose()\r
{\r
- if ((scanners != null) && (scanners.Count > 0)) {\r
- foreach (IOfficeAntiVirus i in scanners) {\r
- Marshal.ReleaseComObject(i);\r
- }\r
- scanners.Clear();\r
- }\r
- \r
+ Release();\r
ComDirectAccess.CoUninitialize();\r
}\r
\r
+ /// <summary>\r
+ /// ウイルススキャンがあるかないか\r
+ /// </summary>\r
+ /// <remarks>Init()呼出し後に使える</remarks>\r
public bool HasScanner {\r
get { return scanners.Count > 0; }\r
}\r
\r
+ /// <summary>\r
+ /// 初期化処理としてウイルススキャンを探す。\r
+ /// </summary>\r
public void Init()\r
{\r
scanners = new List<IOfficeAntiVirus>();\r
}\r
}\r
\r
+ /// <summary>\r
+ /// ウイルススキャンのオブジェクトを開放しInitの前の状態に戻す。\r
+ /// </summary>\r
+ public void Release()\r
+ {\r
+ if ((scanners != null) && (scanners.Count > 0)) {\r
+ foreach (IOfficeAntiVirus i in scanners) {\r
+ Marshal.ReleaseComObject(i);\r
+ }\r
+ scanners.Clear();\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
+ /// ファイルをスキャンする。ウイルススキャンが複数個見つかっている\r
+ /// ならばそれらすべてでスキャンする。\r
+ /// ウイルススキャンの実装によるが、ウイルス発見時にはダイアログが開く。\r
+ /// ウイルスの処理はユーザに委ねられるので、それの制御は一切できない。\r
+ /// </summary>\r
+ /// <remarks>ウイルスが見つかったか否かは取得できない。</remarks>\r
+ /// <remarks>本メソッド呼び出し後にウイルスが退避されているかもしれないが、ファイルの存在確認でしかそれをチェックできない</remarks>\r
+ /// <param name="path">ファイルのパス</param>\r
+ /// <param name="origin">ファイルをダウンロードしたURL。nullであってはならない</param>\r
+ /// <exception cref="COMException">COMのエラー発生時。たとえば、AVGではウイルスと検出されたのにユーザが「無視」を指定したときにも投げられる。</exception>\r
+ /// <returns>ウイルススキャンがされたか否か</returns>\r
+ /// <remarks>Init()呼出し後に使える</remarks>\r
public bool Scan(string path, string origin)\r
{\r
if (scanners.Count <= 0) {\r
/// </summary>\r
private void runDownloadAndVirusCheckInstallers()\r
{\r
- using (DownloadScanner scanner = new DownloadScanner()) {\r
- scanner.Init();\r
- foreach (Installation inst in Installations) {\r
- if (! inst.IsInstallablePackage()) {\r
- string msg = string.Format("{0}はインストールすることができません", inst.ToString());\r
- \r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg);\r
- done = true;\r
- return;\r
- }\r
- \r
- RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
- \r
- if (! inst.Downloaded) {\r
- try {\r
- inst.Download(Downloader);\r
- } catch (NaGetTaskCanceledException) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラのダウンロード処理がキャンセルされました");\r
+ using (DownloadScanner scanner = new DownloadScanner()) {\r
+ scanner.Init();\r
+ foreach (Installation inst in Installations) {\r
+ if (! inst.IsInstallablePackage()) {\r
+ string msg = string.Format("{0}はインストールすることができません", inst.ToString());\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, msg);\r
done = true;\r
return;\r
- } catch (System.Net.WebException e) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
- if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。");\r
- } else {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+ }\r
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ \r
+ if (! inst.Downloaded) {\r
+ try {\r
+ inst.Download(Downloader);\r
+ } catch (NaGetTaskCanceledException) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.CANCELED, "インストーラのダウンロード処理がキャンセルされました");\r
+ done = true;\r
+ return;\r
+ } catch (System.Net.WebException e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+ if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続されていません。");\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+ }\r
+ done = true;\r
+ return;\r
+ } catch (Exception e) {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+ done = true;\r
+ return;\r
}\r
- done = true;\r
- return;\r
- } catch (Exception e) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, e.Message);\r
+ }\r
+ currentTaskSetIndex ++;\r
+ \r
+ if (inst.Downloaded) { // 正常終了\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ } else { // インストールが完了せずに終わった=失敗=エラー\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラを正常にダウンロードできませんでした", inst.ToString()));\r
done = true;\r
return;\r
}\r
- }\r
- currentTaskSetIndex ++;\r
- \r
- if (inst.Downloaded) { // 正常終了\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
- } else { // インストールが完了せずに終わった=失敗=エラー\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, string.Format("{0}のインストーラを正常にダウンロードできませんでした", inst.ToString()));\r
- done = true;\r
- return;\r
- }\r
- \r
- RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
- if (scanner.HasScanner) {\r
- try {\r
- inst.ScanInstallerFile(scanner);\r
- } catch (System.Runtime.InteropServices.COMException ex) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.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
+ \r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+ if (scanner.HasScanner) {\r
+ try {\r
+ inst.ScanInstallerFile(scanner);\r
+ } catch (System.Runtime.InteropServices.COMException ex) {\r
RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING,\r
- string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));\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
+ string.Format("{0} (E{1})", ex.InnerException.Message, ((System.Runtime.InteropServices.COMException) ex.InnerException).ErrorCode));\r
+ }\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "インストーラがウイルススキャナによって削除されました。");\r
+ done = true;\r
+ return;\r
}\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR, "インストーラがウイルススキャナによって削除されました。");\r
- done = true;\r
- return;\r
+ } else {\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"));\r
}\r
- } else {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"));\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
}\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
}\r
}\r
- }\r
\r
/// <summary>\r
/// ダウンロードしたパッケージが整合したか否かハッシュでチェック\r