OSDN Git Service

all-get,サブコマンドの一部修正および追加
[applistation/AppliStation.git] / na-get-lib / NaGet.Packages / Platform.cs
1 using System;\r
2 using System.Reflection;\r
3 using System.Xml.Serialization;\r
4 \r
5 namespace NaGet.Packages\r
6 {\r
7         /// <summary>\r
8         /// PlatformのOSの種類をあらわす\r
9         /// </summary>\r
10         public enum PlatformOSType\r
11         {\r
12                 WIN95,\r
13                 WIN98,\r
14                 WINME,\r
15                 \r
16                 WINNT4,\r
17                 WIN2K,\r
18                 WINXP,\r
19                 WIN2003,\r
20                 VISTA,\r
21                 WIN2008,\r
22         }\r
23         \r
24         public class Platform\r
25         {\r
26                 /// <summary>\r
27                 /// ソフトの動作するアーキテクチャ\r
28                 /// </summary>\r
29                 [XmlAttribute]\r
30                 public ProcessorArchitecture Arch = ProcessorArchitecture.X86;\r
31                 \r
32                 /// <summary>\r
33                 /// 動作するOSの種類の配列\r
34                 /// </summary>\r
35                 [XmlIgnore]\r
36                 public PlatformOSType[] OsType;\r
37                 \r
38                 /// <summary>\r
39                 /// OsTypeの文字列表現\r
40                 /// </summary>\r
41                 [XmlAttribute]\r
42                 public string Os {\r
43                         get {\r
44                                 if (OsType == null) return null;\r
45                                 string[] strs = new string[OsType.Length];\r
46                                 for (int i = 0; i < OsType.Length; i++) {\r
47                                         strs[i] = OsType[i].ToString("G");\r
48                                 }\r
49                                 return string.Join(",", strs);\r
50                         }\r
51                         set {\r
52                                 string[] strs = (value ?? "").Split(',');\r
53                                 System.Collections.Generic.List<PlatformOSType> list = new System.Collections.Generic.List<PlatformOSType>();\r
54                                 for (int i = 0; i < strs.Length; i++) {\r
55                                         try {\r
56                                                 list.Add((PlatformOSType) Enum.Parse(typeof(PlatformOSType), strs[i], true));\r
57                                         } catch (ArgumentException) {\r
58                                         }\r
59                                 }\r
60                                 OsType = list.ToArray();\r
61                         }\r
62                 }\r
63                 \r
64                 /// <summary>\r
65                 /// 現在のプラットホームで動くか否か?\r
66                 /// </summary>\r
67                 /// <returns>動く場合はtrue</returns>\r
68                 public bool IsRunnable()\r
69                 {\r
70                         return IsRunnableArch() && IsRunnableOS();\r
71                 }\r
72                 \r
73                 /// <summary>\r
74                 /// 現在のマシンのアーキテクチャで動くか否か?\r
75                 /// </summary>\r
76                 /// <returns>動く場合はtrue</returns>\r
77                 public bool IsRunnableArch()\r
78                 {\r
79                         return Arch == GetArch() ||\r
80                                 Arch == ProcessorArchitecture.None ||\r
81                                 Arch == ProcessorArchitecture.MSIL;\r
82                 }\r
83                 \r
84                 /// <summary>\r
85                 /// 現在のマシンのアーキテクチャで動かないが、Wow64で動くか否か?\r
86                 /// 64ビット環境でない場合は常にfalse\r
87                 /// </summary>\r
88                 /// <returns></returns>\r
89                 public bool IsRunnableArchOnWow64()\r
90                 {\r
91                         if (IntPtr.Size == 8) {\r
92                                 return Arch == ProcessorArchitecture.X86;\r
93                         } else {\r
94                                 return false;\r
95                         }\r
96                 }\r
97                 \r
98                 /// <summary>\r
99                 /// 現在のマシンのアーキテクチャを得る\r
100                 /// </summary>\r
101                 /// <returns>現在のマシンのアーキテクチャ</returns>\r
102                 public static ProcessorArchitecture GetArch()\r
103                 {\r
104                         Module[] moduleArray = Assembly.GetExecutingAssembly().GetModules();\r
105                         Module md = moduleArray[0];\r
106 \r
107                         PortableExecutableKinds pekinds;\r
108                         ImageFileMachine ifm;\r
109                         md.GetPEKind(out pekinds, out ifm);\r
110                         \r
111                         switch (ifm) {\r
112                                 case ImageFileMachine.AMD64:\r
113                                         return ProcessorArchitecture.Amd64;\r
114                                 case ImageFileMachine.I386:\r
115                                         return (IntPtr.Size == 4)? ProcessorArchitecture.X86 : ProcessorArchitecture.Amd64;\r
116                                 case ImageFileMachine.IA64:\r
117                                         return ProcessorArchitecture.IA64;\r
118                                 default:\r
119                                         return ProcessorArchitecture.None;\r
120                         }\r
121                 }\r
122                 \r
123                 /// <summary>\r
124                 /// 現在のマシンのアーキテクチャを得る\r
125                 /// </summary>\r
126                 /// <returns>現在のマシンのアーキテクチャ</returns>\r
127                 public bool IsRunnableOS()\r
128                 {\r
129                         if (OsType == null || OsType.Length <= 0) {\r
130                                 return true; // 記述なしはOS全部で動く扱い\r
131                         }\r
132                         \r
133                         PlatformOSType? thisOs = GetOSType();\r
134                         return thisOs != null && Array.BinarySearch(OsType, (PlatformOSType) thisOs) >= 0;\r
135                 }\r
136                 \r
137                 /// <summary>\r
138                 /// 現在のマシンのOSを得る\r
139                 /// </summary>\r
140                 /// <returns>現在のマシンのOS</returns>\r
141                 public static PlatformOSType? GetOSType()\r
142                 {\r
143                         OperatingSystem os = Environment.OSVersion;\r
144                         Version osVer = os.Version;\r
145                         \r
146                         switch (os.Platform) {\r
147                                 case PlatformID.Win32Windows:\r
148                                         if (osVer.Major == 4) {\r
149                                                 switch (osVer.Minor) {\r
150                                                         case 4:\r
151                                                                 return PlatformOSType.WIN95;\r
152                                                         case 10:\r
153                                                                 return PlatformOSType.WIN98;\r
154                                                         case 99:\r
155                                                                 return PlatformOSType.WINME;\r
156                                                 }\r
157                                         }\r
158                                         break;\r
159                                 case PlatformID.Win32NT:\r
160                                         if (osVer.Major == 4) {\r
161                                                 return PlatformOSType.WINNT4;\r
162                                         } else if (osVer.Major == 5) {\r
163                                                 switch (osVer.Minor) {\r
164                                                         case 0:\r
165                                                                 return PlatformOSType.WIN2K;\r
166                                                         case 1:\r
167                                                                 return PlatformOSType.WINXP;\r
168                                                         case 2:\r
169                                                                 return PlatformOSType.WIN2003;\r
170                                                 }\r
171                                         } else if (osVer.Major == 6) {\r
172                                                 switch (osVer.Minor) {\r
173                                                         case 0:\r
174                                                                 return PlatformOSType.VISTA;\r
175                                                         case 1:\r
176                                                                 return PlatformOSType.WIN2008;\r
177                                                 }\r
178                                         }\r
179                                         break;\r
180 //                              case PlatformID.WinCE:\r
181 //                                      return null;\r
182 //                              case PlatformID.Unix:\r
183 //                                      return null;\r
184                         }\r
185                         \r
186                         return null;\r
187                 }\r
188         }\r
189 }\r