set {\r
installedPackage = value;\r
\r
+ installerIndex = getPreferInstallerIndex(value);\r
installerFile = getArchiveFilePath();\r
- installerIndex = GetPreferInstallerIndex(value);\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
return exitCode;\r
}\r
\r
+ #region インストーラーファイル設定時の処理\r
+ \r
/// <summary>\r
/// もっともふさわしいインストーラー番号を返す\r
/// </summary>\r
/// <returns></returns>\r
- public static int GetPreferInstallerIndex(Package InstalledPackage)\r
+ private static int getPreferInstallerIndex(Package InstalledPackage)\r
{\r
if (InstalledPackage.Type == InstallerType.CANNOT_INSTALL) { // インストール不能パッケージ\r
return -1;\r
/// <summary>\r
/// インストーラーの保存先パスを生成\r
/// </summary>\r
+ /// <remarks>installerIndexが求まっているものとして仮定して処理する</remarks>\r
private string getArchiveFilePath()\r
{\r
Package package = this.InstalledPackage;\r
\r
string folderName = string.Format("{0}({1})", package.Name, package.Version);\r
+ string subFolderName = string.Format("installer.{0}", (installerIndex >= 0)? installerIndex.ToString("D") : "X");\r
string fileName = NaGet.Utils.Url2filename(new Uri(package.Installer[0].Url.Href));\r
\r
- string folder = Path.Combine(NaGet.Env.ArchiveFolderPath, folderName);\r
+ string folder = Path.Combine(NaGet.Env.ArchiveFolderPath, Path.Combine(folderName, subFolderName));\r
\r
if (! File.Exists(Path.Combine(folder, fileName))) {\r
if (Directory.Exists(folder)) {\r
return Path.Combine(folder, fileName);\r
}\r
\r
- /// <summary>\r
- /// すでにインストールされているパッケージを取得する\r
- /// </summary>\r
- /// <param name="installedPkgs">\r
- /// インストールドリスト\r
- /// </param>\r
- /// <returns>\r
- /// インストールされているパッケージの情報。インストールされたパッケージが見つからないならばnullを返す \r
- /// </returns>\r
- public InstalledPackage GetInstalledPackage(PackageList<InstalledPackage> installedPkgs)\r
- {\r
- return installedPkgs.GetPackageForName(InstalledPackage.Name);\r
- }\r
- \r
+ #endregion\r
+ \r
/// <summary>\r
/// インストーラーファイルを探す\r
/// </summary>\r
return string.Join(" ", strs);\r
}\r
\r
+ #region 便利メソッド群\r
+ \r
/// <summary>\r
/// パッケージ配列をインストール処理配列に変換する便利メソッド\r
/// </summary>\r
}\r
return insts;\r
}\r
+ \r
+ /// <summary>\r
+ /// パッケージがインストール可能かを戻します。\r
+ /// </summary>\r
+ /// <param name="pkg">検査対象のパッケージ</param>\r
+ /// <returns>インストール可能か否か</returns>\r
+ public static bool IsInstallablePackage(Package pkg)\r
+ {\r
+ int installerIndex = getPreferInstallerIndex(pkg);\r
+ return installerIndex >= 0;\r
+ }\r
+ \r
+ #endregion\r
}\r
}\r