OSDN Git Service

na-get-lib,タスクセットの改修(NaGetTaskSet2)および、そのUnitTestを追加
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages.Install / Installation.cs
index 7b6681a..1102ea2 100644 (file)
@@ -23,8 +23,8 @@ namespace NaGet.Packages.Install
                        set {\r
                                installedPackage = value;\r
                                \r
+                               installerIndex = getPreferInstallerIndex(value);\r
                                installerFile = getArchiveFilePath();\r
-                               installerIndex = GetPreferInstallerIndex(value);\r
                        }\r
                }\r
 \r
@@ -211,23 +211,24 @@ namespace NaGet.Packages.Install
                /// </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
@@ -354,11 +355,13 @@ namespace NaGet.Packages.Install
                        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
@@ -389,14 +392,16 @@ namespace NaGet.Packages.Install
                /// <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
@@ -416,20 +421,8 @@ namespace NaGet.Packages.Install
                        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
@@ -535,6 +528,8 @@ namespace NaGet.Packages.Install
                        return string.Join(" ", strs);\r
                }\r
                \r
+               #region 便利メソッド群\r
+               \r
                /// <summary>\r
                /// パッケージ配列をインストール処理配列に変換する便利メソッド\r
                /// </summary>\r
@@ -548,5 +543,18 @@ namespace NaGet.Packages.Install
                        }\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