Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / platform / win / SystemInfo.cpp
1 /*
2  * Copyright (C) 2009 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "SystemInfo.h"
28
29 #include <windows.h>
30 #include <wtf/text/WTFString.h>
31
32 namespace WebCore {
33
34 WindowsVersion windowsVersion(int* major, int* minor)
35 {
36     static bool initialized = false;
37     static WindowsVersion version;
38     static int majorVersion, minorVersion;
39
40     if (!initialized) {
41         initialized = true;
42         OSVERSIONINFOEX versionInfo;
43         ZeroMemory(&versionInfo, sizeof(versionInfo));
44         versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
45         GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&versionInfo));
46         majorVersion = versionInfo.dwMajorVersion;
47         minorVersion = versionInfo.dwMinorVersion;
48
49         if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32s)
50             version = Windows3_1;
51         else if (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
52             if (!minorVersion)
53                 version = Windows95;
54             else
55                 version = (minorVersion == 10) ? Windows98 : WindowsME;
56         } else {
57             if (majorVersion == 5) {
58                 if (!minorVersion)
59                     version = Windows2000;
60                 else
61                     version = (minorVersion == 1) ? WindowsXP : WindowsServer2003;
62             } else if (majorVersion >= 6) {
63                 if (versionInfo.wProductType == VER_NT_WORKSTATION)
64                     version = (majorVersion == 6 && !minorVersion) ? WindowsVista : Windows7;
65                 else
66                     version = WindowsServer2008;
67             } else
68                 version = (majorVersion == 4) ? WindowsNT4 : WindowsNT3;
69         }
70     }
71
72     if (major)
73         *major = majorVersion;
74     if (minor)
75         *minor = minorVersion;
76     return version;
77 }
78
79 static String osVersionForUAString()
80 {
81     int major, minor;
82     WindowsVersion version = windowsVersion(&major, &minor);
83     switch (version) {
84     case WindowsCE1:
85     case WindowsCE2:
86     case WindowsCE3:
87         return "Windows CE";
88     case WindowsCE4:
89         return "Windows CE .NET";
90     case Windows3_1:
91         return "Windows 3.1";
92     case Windows95:
93         return "Windows 95";
94     case Windows98:
95         return "Windows 98";
96     case WindowsME:
97         return "Windows 98; Win 9x 4.90";
98     case WindowsNT4:
99         return "WinNT4.0";
100     }
101
102     const char* familyName = (version >= WindowsNT3) ? "Windows NT " : "Windows CE ";
103     return familyName + String::number(major) + '.' + String::number(minor);
104 }
105
106 static bool isWOW64()
107 {
108     static bool initialized = false;
109     static bool wow64 = false;
110
111     if (!initialized) {
112         initialized = true;
113         HMODULE kernel32Module = GetModuleHandleA("kernel32.dll");
114         if (!kernel32Module)
115             return wow64;
116         typedef BOOL (WINAPI* IsWow64ProcessFunc)(HANDLE, PBOOL);
117         IsWow64ProcessFunc isWOW64Process = reinterpret_cast<IsWow64ProcessFunc>(GetProcAddress(kernel32Module, "IsWow64Process"));
118         if (isWOW64Process) {
119             BOOL result = FALSE;
120             wow64 = isWOW64Process(GetCurrentProcess(), &result) && result;
121         }
122     }
123
124     return wow64;
125 }
126
127 static WORD processorArchitecture()
128 {
129     static bool initialized = false;
130     static WORD architecture = PROCESSOR_ARCHITECTURE_INTEL;
131
132     if (!initialized) {
133         initialized = true;
134         HMODULE kernel32Module = GetModuleHandleA("kernel32.dll");
135         if (!kernel32Module)
136             return architecture;
137         typedef VOID (WINAPI* GetNativeSystemInfoFunc)(LPSYSTEM_INFO);
138         GetNativeSystemInfoFunc getNativeSystemInfo = reinterpret_cast<GetNativeSystemInfoFunc>(GetProcAddress(kernel32Module, "GetNativeSystemInfo"));
139         if (getNativeSystemInfo) {
140             SYSTEM_INFO systemInfo;
141             ZeroMemory(&systemInfo, sizeof(systemInfo));
142             getNativeSystemInfo(&systemInfo);
143             architecture = systemInfo.wProcessorArchitecture;
144         }
145     }
146
147     return architecture;
148 }
149
150 static String architectureTokenForUAString()
151 {
152     if (isWOW64())
153         return "; WOW64";
154     if (processorArchitecture() == PROCESSOR_ARCHITECTURE_AMD64)
155         return "; Win64; x64";
156     if (processorArchitecture() == PROCESSOR_ARCHITECTURE_IA64)
157         return "; Win64; IA64";
158     return String();
159 }
160
161 String windowsVersionForUAString()
162 {
163     return osVersionForUAString() + architectureTokenForUAString();
164 }
165
166 } // namespace WebCore