172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/sys_info.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/logging.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/stringprintf.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/win/windows_version.h"
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::NumberOfProcessors() {
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return win::OSInfo::GetInstance()->processors();
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfPhysicalMemory() {
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MEMORYSTATUSEX memory_info;
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memory_info.dwLength = sizeof(memory_info);
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!GlobalMemoryStatusEx(&memory_info)) {
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    NOTREACHED();
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return 0;
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 rv = static_cast<int64>(memory_info.ullTotalPhys);
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (rv < 0)
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    rv = kint64max;
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return rv;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint64 SysInfo::AmountOfFreeDiskSpace(const FilePath& path) {
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ULARGE_INTEGER available, total, free;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!GetDiskFreeSpaceExW(path.value().c_str(), &available, &total, &free)) {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return -1;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int64 rv = static_cast<int64>(available.QuadPart);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (rv < 0)
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    rv = kint64max;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return rv;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemName() {
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return "Windows NT";
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::OperatingSystemVersion() {
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  win::OSInfo* os_info = win::OSInfo::GetInstance();
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  win::OSInfo::VersionNumber version_number = os_info->version_number();
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string version(StringPrintf("%d.%d", version_number.major,
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   version_number.minor));
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  win::OSInfo::ServicePack service_pack = os_info->service_pack();
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (service_pack.major != 0) {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    version += StringPrintf(" SP%d", service_pack.major);
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (service_pack.minor != 0)
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      version += StringPrintf(".%d", service_pack.minor);
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return version;
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO: Implement OperatingSystemVersionComplete, which would include
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// patchlevel/service pack number.
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// See chrome/browser/ui/views/bug_report_view.cc, BugReportView::SetOSVersion.
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::string SysInfo::CPUArchitecture() {
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // TODO: Make this vary when we support any other architectures.
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return "x86";
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid SysInfo::GetPrimaryDisplayDimensions(int* width, int* height) {
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (width)
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *width = GetSystemMetrics(SM_CXSCREEN);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (height)
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    *height = GetSystemMetrics(SM_CYSCREEN);
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottint SysInfo::DisplayCount() {
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return GetSystemMetrics(SM_CMONITORS);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottsize_t SysInfo::VMAllocationGranularity() {
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return win::OSInfo::GetInstance()->allocation_granularity();
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// static
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid SysInfo::OperatingSystemVersionNumbers(int32* major_version,
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            int32* minor_version,
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                            int32* bugfix_version) {
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  win::OSInfo* os_info = win::OSInfo::GetInstance();
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  *major_version = os_info->version_number().major;
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  *minor_version = os_info->version_number().minor;
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  *bugfix_version = 0;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
109