summaryrefslogtreecommitdiffstats
path: root/xpcom/base/nsSystemInfo.h
blob: 9d47b5d4f6308b264de6cae717d475fe3f8a38d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _NSSYSTEMINFO_H_
#define _NSSYSTEMINFO_H_

#include "nsHashPropertyBag.h"
#include "nsISystemInfo.h"
#include "mozilla/MozPromise.h"

#ifdef MOZ_WIDGET_ANDROID
#  include "mozilla/dom/PContent.h"
#endif  // MOZ_WIDGET_ANDROID

#if defined(XP_WIN)
#  include <inspectable.h>

// The UUID comes from winrt/windows.system.profile.idl
// in the Windows SDK
MIDL_INTERFACE("7D1D81DB-8D63-4789-9EA5-DDCF65A94F3C")
IWindowsIntegrityPolicyStatics : public IInspectable {
 public:
  virtual HRESULT STDMETHODCALLTYPE get_IsEnabled(bool* value) = 0;
};
#endif

class nsISerialEventTarget;

struct FolderDiskInfo {
  nsCString model;
  nsCString revision;
  bool isSSD;
};

struct DiskInfo {
  FolderDiskInfo binary;
  FolderDiskInfo profile;
  FolderDiskInfo system;
};

struct OSInfo {
  uint32_t installYear;
  bool hasSuperfetch;
  bool hasPrefetch;
};

struct ProcessInfo {
  bool isWow64 = false;
  bool isWowARM64 = false;
  // Whether or not the system is Windows 10 or 11 in S Mode.
  // S Mode existed prior to us being able to query it, so this
  // is unreliable on Windows versions prior to 1810.
  bool isWindowsSMode = false;
  int32_t cpuCount = 0;
  int32_t cpuCores = 0;
  nsCString cpuVendor;
  nsCString cpuName;
  int32_t cpuFamily = 0;
  int32_t cpuModel = 0;
  int32_t cpuStepping = 0;
  int32_t l2cacheKB = 0;
  int32_t l3cacheKB = 0;
  int32_t cpuSpeed = 0;
};

typedef mozilla::MozPromise<DiskInfo, nsresult, /* IsExclusive */ false>
    DiskInfoPromise;

typedef mozilla::MozPromise<nsAutoString, nsresult, /* IsExclusive */ false>
    CountryCodePromise;

typedef mozilla::MozPromise<OSInfo, nsresult, /* IsExclusive */ false>
    OSInfoPromise;

typedef mozilla::MozPromise<ProcessInfo, nsresult, /* IsExclusive */ false>
    ProcessInfoPromise;

// Synchronous info collection, avoid calling it from the main thread, consider
// using the promise-based `nsISystemInfo::GetProcessInfo()` instead.
// Note that only known fields will be written.
nsresult CollectProcessInfo(ProcessInfo& info);

class nsSystemInfo final : public nsISystemInfo, public nsHashPropertyBag {
 public:
  NS_DECL_ISUPPORTS_INHERITED
  NS_DECL_NSISYSTEMINFO

  nsSystemInfo();

  nsresult Init();

  // Slot for NS_InitXPCOM to pass information to nsSystemInfo::Init.
  // See comments above the variable definition and in NS_InitXPCOM.
  static uint32_t gUserUmask;

#ifdef MOZ_WIDGET_ANDROID
  static void GetAndroidSystemInfo(mozilla::dom::AndroidSystemInfo* aInfo);

 protected:
  void SetupAndroidInfo(const mozilla::dom::AndroidSystemInfo&);
#endif

 protected:
  void SetInt32Property(const nsAString& aPropertyName, const int32_t aValue);
  void SetUint32Property(const nsAString& aPropertyName, const uint32_t aValue);
  void SetUint64Property(const nsAString& aPropertyName, const uint64_t aValue);

 private:
  ~nsSystemInfo();

  RefPtr<DiskInfoPromise> mDiskInfoPromise;
  RefPtr<CountryCodePromise> mCountryCodePromise;
  RefPtr<OSInfoPromise> mOSInfoPromise;
  RefPtr<ProcessInfoPromise> mProcessInfoPromise;
  RefPtr<nsISerialEventTarget> mBackgroundET;
  RefPtr<nsISerialEventTarget> GetBackgroundTarget();
};

#define NS_SYSTEMINFO_CONTRACTID "@mozilla.org/system-info;1"
#define NS_SYSTEMINFO_CID                            \
  {                                                  \
    0xd962398a, 0x99e5, 0x49b2, {                    \
      0x85, 0x7a, 0xc1, 0x59, 0x04, 0x9c, 0x7f, 0x6c \
    }                                                \
  }

#endif /* _NSSYSTEMINFO_H_ */