OSDN Git Service

initial build for opensource
[applistation/AppliStation.git] / na-get-lib / NaGet.SubCommands / NaGetUpdate.cs
1 using System;\r
2 using System.IO;\r
3 using NaGet.Packages;\r
4 using NaGet.Packages.Install;\r
5 using NaGet.Net;\r
6 using NaGet.SubCommands;\r
7 \r
8 namespace NaGet.SubCommands\r
9 {\r
10         public class NaGetUpdate : NaGetTaskSet\r
11         {\r
12                 private ProviderList providerList;\r
13                 \r
14                 private PackageListsManager pkgListMan;\r
15                 \r
16                 private bool downloadPackageLists = false;\r
17                 \r
18                 private bool packageListsDownloaded = true;\r
19                 \r
20                 public Downloader Downloader; // TODO 参照をしてセットするように\r
21                 \r
22                 private int currentTaskSetIndex = -1;\r
23                 \r
24                 private bool done = false;\r
25                 \r
26                 public override int CurrentTaskSetIndex {\r
27                         get { return currentTaskSetIndex; }\r
28                 }\r
29                 \r
30                 public override bool Cancelable {\r
31                         get { return ! packageListsDownloaded; }\r
32                 }\r
33                 \r
34                 public NaGetUpdate(PackageListsManager pkgListMan)\r
35                         : this(pkgListMan, true)\r
36                 {\r
37                 }\r
38                 \r
39                 public NaGetUpdate(PackageListsManager pkgMan, bool downloadPackageListsFlag)\r
40                 {\r
41                         pkgListMan = pkgMan;\r
42                         downloadPackageLists = downloadPackageListsFlag;\r
43                         \r
44                         System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
45                         if (downloadPackageLists) {\r
46                                 providerList = new ProviderList(NaGet.Env.ProviderListFile);\r
47                                 \r
48                                 foreach (string url in providerList.Urls) {\r
49                                         taskSetNames.Add(string.Format("リスト取得: {0}", url));\r
50                                 }\r
51                                 taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.PackageListFile));\r
52                         }\r
53                         taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
54                         taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
55                         \r
56                         TaskSetNames = taskSetNames.ToArray();\r
57                 }\r
58 \r
59                 public override void Run()\r
60                 {\r
61                         currentTaskSetIndex ++;\r
62                         RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "リスト更新処理開始");\r
63                         \r
64                         try {\r
65                                 // リストのダウンロード\r
66                                 if (downloadPackageLists) {\r
67                                         packageListsDownloaded = false;\r
68                                         try {\r
69                                                 runDownloadPackages();\r
70                                         } catch (NaGetTaskCanceledException) {\r
71                                                 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
72                                         } catch (System.Net.WebException e) {\r
73                                                 RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
74                                                 if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
75                                                         RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続されていません。");\r
76                                                 } else {\r
77                                                         RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
78                                                 }\r
79                                         } finally {\r
80                                                 currentTaskSetIndex = providerList.Urls.Length + 1;\r
81                                         }\r
82                                         packageListsDownloaded = true;\r
83                                 }\r
84                                 \r
85                                 runLocalUpdate();\r
86                         } finally {\r
87                                 done = true;\r
88                         }\r
89                         \r
90                         RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);\r
91                 }\r
92                 \r
93                 private void runDownloadPackages()\r
94                 {\r
95                         PackageList<Package> avaiablePackageList = new PackageList<Package>();\r
96                         foreach(string provider in providerList.Urls) {\r
97                                 RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
98                                 \r
99                                 string tmpfileName = Path.GetTempFileName();\r
100                                 try {\r
101                                         Downloader.Download(provider, tmpfileName);\r
102                                         \r
103                                         avaiablePackageList.AddPackages(NaGet.Utils.GetDeserializedObject<PackageList<Package>>(tmpfileName).Packages);\r
104                                 } finally {\r
105                                         if (File.Exists(tmpfileName)) {\r
106                                                 File.Delete(tmpfileName);\r
107                                         }\r
108                                 }\r
109                                 \r
110                                 currentTaskSetIndex ++;\r
111                                 RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
112                         }\r
113                         \r
114                         RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
115                         pkgListMan.availablePkgList = avaiablePackageList; // Mediatorのリストを更新\r
116                         pkgListMan.SaveAvailablePackageList();\r
117                         currentTaskSetIndex ++;\r
118                         RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
119                 }\r
120                 \r
121                 private void runLocalUpdate()\r
122                 {\r
123                         // インストールトリストの更新\r
124                         RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
125                         pkgListMan.DetectInstalledPkgs();\r
126                         pkgListMan.SaveInstalledPackageList();\r
127                         currentTaskSetIndex++;\r
128                         RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
129                 \r
130                         // システムにインストールされているリストの更新\r
131                         RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
132                         pkgListMan.DetectSystemInstalledPkgs();\r
133                         pkgListMan.SaveSystemInstalledPackageList();\r
134                         currentTaskSetIndex++;\r
135                         RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
136                 }\r
137                 \r
138                 public override bool Cancel()\r
139                 {\r
140                         return Downloader.Cancel();\r
141                 }\r
142 \r
143                 public override bool Done {\r
144                         get { return done; }\r
145                 }\r
146         }\r
147 }\r