\r
namespace NaGet.Net\r
{\r
+ public enum DownloadScannerResult : uint {\r
+ OK = 0, // S_OK\r
+ InfectedAndCleaned = 1, // S_FALSE\r
+ InfectedButNotCleaned = 0x80004005, // E_FAIL\r
+ ErrorNotFound = 2, // ERROR_NOT_FOUND\r
+ \r
+ ScannerNotFound = 0xFFFFFFFF,\r
+ }\r
+ \r
/// <summary>\r
/// ダウンロードしたファイルをスキャンする\r
/// </summary>\r
[Guid("56FFCC30-D398-11D0-B2AE-00A0C908FA49")]\r
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]\r
private interface IOfficeAntiVirus {\r
- void Scan(ref MSOAVINFO pmsoavinfo);\r
+ [PreserveSig()]\r
+ uint Scan(ref MSOAVINFO pmsoavinfo);\r
}\r
#endregion\r
\r
/// <param name="path">ファイルのパス</param>\r
/// <param name="origin">ファイルをダウンロードしたURL。nullであってはならない</param>\r
/// <exception cref="COMException">COMのエラー発生時。たとえば、AVGではウイルスと検出されたのにユーザが「無視」を指定したときにも投げられる。</exception>\r
- /// <returns>ウイルススキャンがされたか否か</returns>\r
+ /// <returns>ウイルススキャン結果。</returns>\r
/// <remarks>Init()呼出し後に使える</remarks>\r
- public bool Scan(string path, string origin)\r
+ public DownloadScannerResult Scan(string path, string origin)\r
{\r
- if (scanners.Count <= 0) {\r
- return false;\r
- }\r
- \r
MSOAVINFO info = new MSOAVINFO();\r
info.cbsize = Marshal.SizeOf(info);\r
info.uFlags = MSOAVINFOFLAG.fPath | MSOAVINFOFLAG.fHttpDownload;\r
info.pwzHostName = HostName;\r
info.pwzOrigURL = origin;\r
\r
+ DownloadScannerResult result = DownloadScannerResult.ScannerNotFound;\r
foreach (IOfficeAntiVirus i in scanners) {\r
- if (! System.IO.File.Exists(path)) break;\r
- i.Scan(ref info);\r
+ if (System.IO.File.Exists(path)) {\r
+ result = (DownloadScannerResult) i.Scan(ref info);\r
+ if (result == DownloadScannerResult.OK && System.IO.File.Exists(path) == false) {\r
+ result = DownloadScannerResult.InfectedAndCleaned;\r
+ }\r
+ } else {\r
+ result = DownloadScannerResult.ErrorNotFound;\r
+ }\r
+ \r
+ if (result != DownloadScannerResult.OK) {\r
+ break;\r
+ }\r
}\r
- return true;\r
+ \r
+ return result;\r
}\r
}\r
}\r
/// </summary>\r
/// <remarks>ウイルスのため退避・削除されたときも例外を投げずにあたかも正常かのように動作しえます。</remarks>\r
/// <exception cref="ComException">スキャンで意図せぬ動作があったとき</exception>\r
- /// <exception cref="FileNotFoundException">スキャン後にインストーラーファイルが存在しないとき</exception>\r
/// <param name="scanner">スキャナーオブジェクト</param>\r
- public void ScanInstallerFile(DownloadScanner scanner)\r
+ /// <returns>スキャン結果</returns>\r
+ public DownloadScannerResult ScanInstallerFile(DownloadScanner scanner)\r
{\r
+ DownloadScannerResult result;\r
Exception e = null;\r
try {\r
- scanner.Scan(installerFile, InstalledPackage.Installer[installerIndex].Url.Href);\r
- } catch (System.Runtime.InteropServices.COMException ex) {\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 (! File.Exists(installerFile)) {\r
- // ファイルが消されているならばFileNotFoundExceptionを出す\r
- throw new FileNotFoundException(string.Empty, installerFile, e);\r
- } else if ( e != null ) {\r
+ if ( e != null ) {\r
// ファイルが消されていないが例外が発生していたときは、その例外を投げる\r
throw e;\r
+ } else {\r
+ return result;\r
}\r
}\r
\r
\r
RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
if (! NaGet.Env.EnableScanInstallerFile) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした"));\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ウイルススキャンを行わない設定のため、ダウンロードしたファイルはウイルススキャンされませんでした");\r
} else if (!scanner.HasScanner) {\r
- RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, string.Format("ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)"));\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
} else {\r
try {\r
- inst.ScanInstallerFile(scanner);\r
+ DownloadScannerResult result = inst.ScanInstallerFile(scanner);\r
+ \r
+ switch (result) {\r
+ case DownloadScannerResult.ScannerNotFound:\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.INFO, "ダウンロードしたファイルはウイルススキャンされませんでした(ウイルススキャンソフトが検出できませんでした)");\r
+ break;\r
+ case DownloadScannerResult.InfectedAndCleaned:\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.ERROR,\r
+ "インストーラーファイルからウイルス感染が検出されたため、削除されました。");\r
+ done = true;\r
+ return;\r
+ case DownloadScannerResult.InfectedButNotCleaned:\r
+ RaiseTaskSetEvent(NaGetTaskSetEventType.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(NaGetTaskSetEventType.WARNING,\r
string.Format("{0} (E{1})", ex.Message, ex.ErrorCode));\r