OSDN Git Service

na-get-lib,新構造タスクのキャンセル処理を修正。
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages / PackageListsManager.cs
index af10c01..70435c1 100644 (file)
@@ -37,16 +37,13 @@ namespace NaGet.Packages
                }\r
                \r
                /// <summary>\r
-               /// インストールログ\r
-               /// </summary>\r
-               private List<InstallationLog> systemInstalledLogList;\r
-               \r
-               /// <summary>\r
-               /// 初期化をする。ファイル群を読み込んで更新がなされる。\r
+               /// 初期化をする。データの読み込みは明示的にLoadPackageLists()を呼び出さなければならない。\r
                /// </summary>\r
                public PackageListsManager()\r
                {\r
-                       LoadPackageLists();\r
+                       availablePkgList = new PackageList<Package>();\r
+                       installedPkgList = new PackageList<InstalledPackage>();\r
+                       systemInstalledPkgList = new PackageList<InstalledPackage>();\r
                }\r
                \r
                #region ファイル読み書き\r
@@ -56,33 +53,29 @@ namespace NaGet.Packages
                /// </summary>\r
                public void LoadPackageLists()\r
                {\r
-                       try {\r
-                               availablePkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(NaGet.Env.PackageListFile);\r
-                       } catch (FileNotFoundException) {\r
+                       System.Xml.Serialization.XmlSerializer sr;\r
+                       \r
+                       // ソフトリストのパッケージリスト読み込み\r
+                       sr = new System.Xml.Serialization.XmlSerializer(typeof(PackageList<Package>));\r
+                       if (File.Exists(NaGet.Env.PackageListFile)) {\r
+                               availablePkgList = (PackageList<Package>) NaGet.Utils.GetDeserializedObject(NaGet.Env.PackageListFile, sr);\r
+                       } else {\r
                                availablePkgList = new PackageList<Package>();\r
                        }\r
                        \r
-                       try {\r
-                               installedPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.ArchiveInstalledPackageListFile);\r
-                       } catch (FileNotFoundException) {\r
+                       sr = new System.Xml.Serialization.XmlSerializer(typeof(PackageList<InstalledPackage>));\r
+                       if (File.Exists(NaGet.Env.ArchiveInstalledPackageListFile)) {\r
+                               installedPkgList = (PackageList<InstalledPackage>) NaGet.Utils.GetDeserializedObject(NaGet.Env.ArchiveInstalledPackageListFile, sr);\r
+                       } else {\r
                                installedPkgList = new PackageList<InstalledPackage>();\r
                        }\r
                        \r
-                       try {\r
-                               systemInstalledPkgList = NaGet.Utils.GetDeserializedObject<PackageList<InstalledPackage>>(NaGet.Env.SystemInstalledPackageListFile);\r
-                       } catch (FileNotFoundException) {\r
+                       //sr = new System.Xml.Serialization.XmlSerializer(typeof(PackageList<InstalledPackage>));\r
+                       if (File.Exists(NaGet.Env.SystemInstalledPackageListFile)) {\r
+                               systemInstalledPkgList = (PackageList<InstalledPackage>) NaGet.Utils.GetDeserializedObject(NaGet.Env.SystemInstalledPackageListFile, sr);\r
+                       } else {\r
                                systemInstalledPkgList = new PackageList<InstalledPackage>();\r
                        }\r
-                       \r
-                       \r
-                       systemInstalledLogList = new List<InstallationLog>();\r
-                       try {\r
-                               systemInstalledLogList.AddRange(\r
-                                       NaGet.Utils.GetDeserializedObject<InstallationLog[]>(NaGet.Env.SystemInstalledPackageLogFile)\r
-                               );\r
-                       } catch (Exception) {\r
-                               // do nothing\r
-                       }\r
                }\r
                \r
                /// <summary>\r
@@ -109,14 +102,6 @@ namespace NaGet.Packages
                {\r
                        NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageListFile, systemInstalledPkgList);\r
                }\r
-               /// <summary>\r
-               /// インストールログ\r
-               /// をファイルに書き込む。\r
-               /// </summary>\r
-               public void SaveSystemInstalledLogList()\r
-               {\r
-                       NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageLogFile, systemInstalledLogList);\r
-               }\r
                \r
                /// <summary>\r
                /// 本オブジェクトの保有しているパッケージ情報の全てをファイルに書き出す。\r
@@ -126,8 +111,6 @@ namespace NaGet.Packages
                        SaveAvailablePackageList();\r
                        SaveInstalledPackageList();\r
                        SaveSystemInstalledPackageList();\r
-                       \r
-                       SaveSystemInstalledLogList();\r
                }\r
                \r
                #endregion\r
@@ -137,7 +120,7 @@ namespace NaGet.Packages
                /// <summary>\r
                /// 本ソフトウェアを介してインストールされたパッケージを検出する。\r
                /// 具体的には<see cref="NaGet.Env.ArchiveProgramFiles" />\r
-               /// で指定されたフォルダの下を見る。\r
+               /// ã\81§æ\8c\87å®\9aã\81\95ã\82\8cã\81\9fã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81®ä¸\8bã\82\92è¦\8bã\82\8bã\80\82\r
                /// </summary>\r
                public void DetectInstalledPkgs()\r
                {\r
@@ -158,6 +141,8 @@ namespace NaGet.Packages
                public void DetectSystemInstalledPkgs()\r
                {\r
                        List<InstalledPackage> installedPkgList = new List<InstalledPackage>();\r
+                       List<InstallationLog>  systemInstalledLogList = getSystemInstallerLog();\r
+                       \r
                        installedPkgList.AddRange(RegistriedUninstallers.DetectInstalledPackages(availablePkgList));\r
                        \r
                        // インストールのログを見て可能な限りパッケージ情報を補完する。\r
@@ -175,7 +160,7 @@ namespace NaGet.Packages
                                                \r
                                                // 補完したパッケージ情報への差し替え\r
                                                UninstallInformation pkgUninstInfo = pkg.UninstallInfo;\r
-                                               NaGet.Utils.FieldCopy((Package) log.Package, ref pkg);\r
+                                               NaGet.Utils.FieldCopy<Package,InstalledPackage>(log.Package, ref pkg);\r
                                                pkg.UninstallInfo = pkgUninstInfo;\r
                                                if (pkg.UninstallInfo.InstallDate == null) { // インストール日時の補完\r
                                                        pkg.UninstallInfo.InstallDate = log.Date;\r
@@ -185,7 +170,8 @@ namespace NaGet.Packages
                                        }\r
                                }\r
                        }\r
-                       this.systemInstalledPkgList.Packages = installedPkgList.ToArray();\r
+                       \r
+                       this.systemInstalledPkgList.SetPackages(installedPkgList);\r
                }\r
                \r
                #endregion\r
@@ -199,7 +185,7 @@ namespace NaGet.Packages
                /// <returns>全てのインストールされたパッケージのイテレータ</returns>\r
                public IEnumerable<InstalledPackage> GetAllInstalledPackages()\r
                {\r
-                       return NaGet.Utils.MeargeEnumerable<InstalledPackage>(\r
+                       return NaGet.Utils.MergeEnumerable<InstalledPackage>(\r
                                installedPkgList.GetEnumerator(),\r
                                systemInstalledPkgList.GetEnumerator()\r
                        );\r
@@ -211,34 +197,48 @@ namespace NaGet.Packages
                /// <returns>パッケージのイテレータ</returns>\r
                public IEnumerable<Package> GetAllPackages()\r
                {\r
-                       return NaGet.Utils.MeargeEnumerable<Package>(\r
+                       return NaGet.Utils.MergeEnumerable<Package>(\r
                                availablePkgList.GetEnumerator(),\r
                                (IEnumerator<Package>) GetAllInstalledPackages().GetEnumerator()\r
                        );\r
                }\r
                \r
+               #endregion\r
+               \r
+               #region インストールログ関連\r
+               \r
                /// <summary>\r
-               /// 与えられたパッケージ参照エントリに対応するパッケージはインストール済みか否かを返す\r
+               /// インストールログのリストを作って返す。\r
                /// </summary>\r
-               /// <seealso cref="PackageList.GetPackageForEntry(Entry)" />\r
-               /// <param name="entry">パッケージ参照エントリ</param>\r
-               /// <returns>対応するパッケージがインストール済みならば<code>true</code></returns>\r
-               public bool IsInstalledFor(Entry entry)\r
+               /// <returns>インストールログのリスト</returns>\r
+               private static List<InstallationLog> getSystemInstallerLog()\r
                {\r
-                       return (installedPkgList.GetPackageForEntry(entry) != null) ||\r
-                               (systemInstalledPkgList.GetPackageForEntry(entry) != null);\r
+                       List<InstallationLog> systemInstalledLogList;\r
+                       \r
+                       try {\r
+                               systemInstalledLogList = NaGet.Utils.GetDeserializedObject<List<InstallationLog>>(NaGet.Env.SystemInstalledPackageLogFile);\r
+                       } catch (Exception) {\r
+                               systemInstalledLogList = new List<InstallationLog>();   \r
+                       }\r
+                       \r
+                       return systemInstalledLogList;\r
                }\r
                \r
-               #endregion\r
-               \r
-               #region インストールログ関連\r
+               /// <summary>\r
+               /// インストールログを保存する。\r
+               /// </summary>\r
+               /// <param name="systemInstalledLogList">インストールログデータ</param>\r
+               private static void setSystemInstallerLog(List<InstallationLog> systemInstalledLogList)\r
+               {\r
+                       NaGet.Utils.PutSerializeObject(NaGet.Env.SystemInstalledPackageLogFile, systemInstalledLogList);\r
+               }\r
                \r
                /// <summary>\r
                /// 指定パッケージ名に対応するログを判定するPredicate\r
                /// </summary>\r
                /// <param name="pkg">判定する指定パッケージ</param>\r
                /// <returns>Predicate</returns>\r
-               private Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
+               private static Predicate<InstallationLog> createPackageNamePredicator(Package pkg)\r
                {\r
                        return delegate(InstallationLog log) {\r
                                return log.Package.Name == pkg.Name;\r
@@ -253,6 +253,8 @@ namespace NaGet.Packages
                /// <param name="inst">書き込むインストール情報</param>\r
                public void WriteInstallationLog(Installation inst)\r
                {\r
+                       List<InstallationLog> systemInstalledLogList = getSystemInstallerLog();\r
+                       \r
                        // 重複は削除\r
                        systemInstalledLogList.RemoveAll(createPackageNamePredicator(inst.InstalledPackage));\r
                        \r
@@ -261,6 +263,8 @@ namespace NaGet.Packages
                        newLog.Package = inst.InstalledPackage;\r
                        \r
                        systemInstalledLogList.Add(newLog);\r
+                       \r
+                       setSystemInstallerLog(systemInstalledLogList);\r
                }\r
                \r
                #endregion\r