root / trunk / NetSparkle / NetSparkleDeviceInventory.cs @ 049333d2
History | View | Annotate | Download (3.9 kB)
1 |
using System; |
---|---|
2 |
using System.Collections.Generic; |
3 |
using System.Linq; |
4 |
using System.Text; |
5 |
using System.Runtime.InteropServices; |
6 |
using System.Management; |
7 |
using System.Threading; |
8 |
|
9 |
namespace AppLimit.NetSparkle |
10 |
{ |
11 |
internal class NetSparkleDeviceInventory |
12 |
{ |
13 |
public Boolean x64System { get; set; } |
14 |
public uint ProcessorSpeed { get; set; } |
15 |
public Int64 MemorySize { get; set; } |
16 |
public string OsVersion { get; set; } |
17 |
public int CPUCount { get; set; } |
18 |
|
19 |
private NetSparkleConfiguration _config; |
20 |
|
21 |
public NetSparkleDeviceInventory(NetSparkleConfiguration config) |
22 |
{ |
23 |
_config = config; |
24 |
} |
25 |
|
26 |
public void CollectInventory() |
27 |
{ |
28 |
// x64 |
29 |
CollectProcessorBitnes(); |
30 |
|
31 |
// cpu speed |
32 |
CollectCPUSpeed(); |
33 |
|
34 |
// cpu count |
35 |
CollectCPUCount(); |
36 |
|
37 |
// ram size |
38 |
CollectRamSize(); |
39 |
|
40 |
// windows |
41 |
CollectWindowsVersion(); |
42 |
} |
43 |
|
44 |
public String BuildRequestUrl(String baseRequestUrl) |
45 |
{ |
46 |
String retValue = baseRequestUrl; |
47 |
|
48 |
// x64 |
49 |
retValue += "cpu64bit=" + (x64System ? "1" : "0") + "&"; |
50 |
|
51 |
// cpu speed |
52 |
retValue += "cpuFreqMHz=" + ProcessorSpeed + "&"; |
53 |
|
54 |
// ram size |
55 |
retValue += "ramMB=" + MemorySize + "&"; |
56 |
|
57 |
// Application name (as indicated by CFBundleName) |
58 |
retValue += "appName=" + _config.ApplicationName + "&"; |
59 |
|
60 |
// Application version (as indicated by CFBundleVersion) |
61 |
retValue += "appVersion=" + _config.InstalledVersion + "&"; |
62 |
|
63 |
// User’s preferred language |
64 |
retValue += "lang=" + Thread.CurrentThread.CurrentUICulture.ToString() + "&"; |
65 |
|
66 |
// Windows version |
67 |
retValue += "osVersion=" + OsVersion + "&"; |
68 |
|
69 |
// CPU type/subtype (see mach/machine.h for decoder information on this data) |
70 |
// ### TODO: cputype, cpusubtype ### |
71 |
|
72 |
// Mac model |
73 |
// ### TODO: model ### |
74 |
|
75 |
// Number of CPUs (or CPU cores, in the case of something like a Core Duo) |
76 |
// ### TODO: ncpu ### |
77 |
retValue += "ncpu=" + CPUCount + "&"; |
78 |
|
79 |
// sanitize url |
80 |
retValue = retValue.TrimEnd('&'); |
81 |
|
82 |
// go ahead |
83 |
return retValue; |
84 |
} |
85 |
|
86 |
private void CollectWindowsVersion() |
87 |
{ |
88 |
OperatingSystem osInfo = Environment.OSVersion; |
89 |
OsVersion = string.Format("{0}.{1}.{2}.{3}", osInfo.Version.Major, osInfo.Version.Minor, osInfo.Version.Build, osInfo.Version.Revision); |
90 |
} |
91 |
|
92 |
private void CollectProcessorBitnes() |
93 |
{ |
94 |
if (Marshal.SizeOf(typeof(IntPtr)) == 8) |
95 |
x64System = true; |
96 |
else |
97 |
x64System = false; |
98 |
} |
99 |
|
100 |
private void CollectCPUCount() |
101 |
{ |
102 |
CPUCount = Environment.ProcessorCount; |
103 |
} |
104 |
|
105 |
private void CollectCPUSpeed() |
106 |
{ |
107 |
ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'"); |
108 |
ProcessorSpeed = (uint)(Mo["CurrentClockSpeed"]); |
109 |
Mo.Dispose(); |
110 |
} |
111 |
|
112 |
private void CollectRamSize() |
113 |
{ |
114 |
MemorySize = 0; |
115 |
|
116 |
// RAM size |
117 |
ManagementScope oMs = new ManagementScope(); |
118 |
ObjectQuery oQuery = new ObjectQuery("SELECT Capacity FROM Win32_PhysicalMemory"); |
119 |
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery); |
120 |
ManagementObjectCollection oCollection = oSearcher.Get(); |
121 |
|
122 |
Int64 mCap = 0; |
123 |
|
124 |
// In case more than one Memory sticks are installed |
125 |
foreach (ManagementObject mobj in oCollection) |
126 |
{ |
127 |
mCap = Convert.ToInt64(mobj["Capacity"]); |
128 |
MemorySize += mCap; |
129 |
} |
130 |
|
131 |
MemorySize = (MemorySize / 1024) / 1024; |
132 |
} |
133 |
} |
134 |
} |