ReactOS  0.4.15-dev-1201-gb2cf5a4
CConfiguration.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Automatic Testing Utility
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Class for managing all the configuration parameters
5  * COPYRIGHT: Copyright 2009-2011 Colin Finck (colin@reactos.org)
6  */
7 
8 #include "precomp.h"
9 
10 #define CONFIGURATION_FILENAMEA "rosautotest.ini"
11 #define CONFIGURATION_FILENAMEW L"rosautotest.ini"
12 
14 
19  : m_CrashRecovery(false),
20  m_IsInteractive(false),
21  m_PrintToConsole(true),
22  m_RepeatCount(1),
23  m_Shutdown(false),
24  m_Submit(false),
25  m_ListModules(false)
26 {
27  WCHAR WindowsDirectory[MAX_PATH];
28  WCHAR Interactive[32];
29 
30  /* Check if we are running under ReactOS from the SystemRoot directory */
31  if(!GetWindowsDirectoryW(WindowsDirectory, MAX_PATH))
32  FATAL("GetWindowsDirectoryW failed\n");
33 
34  m_IsReactOS = !_wcsnicmp(&WindowsDirectory[3], L"reactos", 7);
35 
36  if(GetEnvironmentVariableW(L"WINETEST_INTERACTIVE", Interactive, _countof(Interactive)))
38 }
39 
49 void
51 {
52  /* Parse the command line arguments */
53  for(int i = 1; i < argc; i++)
54  {
55  if(argv[i][0] == '-' || argv[i][0] == '/')
56  {
57  unsigned long tmp_RepeatCount;
58 
59  switch(argv[i][1])
60  {
61  case 'c':
62  ++i;
63  if (i >= argc)
64  {
66  }
67 
69  break;
70 
71  case 'n':
72  m_PrintToConsole = false;
73  break;
74 
75  case 'r':
76  m_CrashRecovery = true;
77  break;
78 
79  case 's':
80  m_Shutdown = true;
81  break;
82 
83  case 'w':
84  m_Submit = true;
85  break;
86 
87  case 't':
88  ++i;
89  if (i >= argc)
90  {
92  }
93 
94  tmp_RepeatCount = wcstoul(argv[i], NULL, 10);
95 
96  if (tmp_RepeatCount == 0 || tmp_RepeatCount > 10000)
97  {
99  }
100 
101  m_RepeatCount = tmp_RepeatCount;
102  break;
103 
104  case 'l':
105  m_ListModules = true;
106  break;
107 
108  default:
110  }
111  }
112  else
113  {
114  /* Which parameter is this? */
115  if(m_Module.empty())
116  {
117  /* Copy the parameter */
118  m_Module = argv[i];
119  }
120  else if(m_Test.empty())
121  {
122  /* Copy the parameter converted to ASCII */
124  }
125  else
126  {
128  }
129  }
130  }
131 
132  /* The /r and /w options shouldn't be used in conjunction */
135 }
136 
140 void
142 {
143  char ProductType;
144  GETSYSINFO GetSysInfo;
145  HMODULE hKernel32;
146  OSVERSIONINFOEXW os;
148  SYSTEM_INFO si;
149 
150  /* Get the build from the define */
151  ss << "&revision=";
152  ss << KERNEL_VERSION_COMMIT_HASH;
153 
154  ss << "&platform=";
155 
156  if(m_IsReactOS)
157  {
158  ss << "reactos";
159  }
160  else
161  {
162  /* No, then use the info from GetVersionExW */
163  os.dwOSVersionInfoSize = sizeof(os);
164 
166  FATAL("GetVersionExW failed\n");
167 
168  if(os.dwMajorVersion < 5)
169  EXCEPTION("Application requires at least Windows 2000!\n");
170 
171  if(os.wProductType == VER_NT_WORKSTATION)
172  ProductType = 'w';
173  else
174  ProductType = 's';
175 
176  /* Print all necessary identification information into the Platform string */
177  ss << os.dwMajorVersion << '.'
178  << os.dwMinorVersion << '.'
179  << os.dwBuildNumber << '.'
180  << os.wServicePackMajor << '.'
181  << os.wServicePackMinor << '.'
182  << ProductType << '.';
183  }
184 
185  /* We also need to know about the processor architecture.
186  To retrieve this information accurately, check whether "GetNativeSystemInfo" is exported and use it then, otherwise fall back to "GetSystemInfo". */
187  hKernel32 = GetModuleHandleW(L"KERNEL32.DLL");
188  GetSysInfo = (GETSYSINFO)GetProcAddress(hKernel32, "GetNativeSystemInfo");
189 
190  if(!GetSysInfo)
191  GetSysInfo = (GETSYSINFO)GetProcAddress(hKernel32, "GetSystemInfo");
192 
193  GetSysInfo(&si);
195 
197 }
198 
204 void
206 {
207  DWORD Length;
208  string Value;
209  WCHAR ConfigFile[MAX_PATH];
210 
211  /* Most values are only needed if we're going to submit anything */
212  if(m_Submit)
213  {
214  /* Build the path to the configuration file from the application's path */
215  GetModuleFileNameW(NULL, ConfigFile, MAX_PATH);
216  Length = wcsrchr(ConfigFile, '\\') - ConfigFile + 1;
217  wcscpy(&ConfigFile[Length], CONFIGURATION_FILENAMEW);
218 
219  /* Check if it exists */
221  EXCEPTION("Missing \"" CONFIGURATION_FILENAMEA "\" configuration file!\n");
222 
223  /* Get the user name */
224  m_AuthenticationRequestString = "&sourceid=";
225  Value = GetINIValue(L"Login", L"SourceID", ConfigFile);
226 
227  if(Value.empty())
228  EXCEPTION("SourceID is missing in the configuration file\n");
229 
231 
232  /* Get the password */
233  m_AuthenticationRequestString += "&password=";
234  Value = GetINIValue(L"Login", L"Password", ConfigFile);
235 
236  if(Value.empty())
237  EXCEPTION("Password is missing in the configuration file\n");
238 
240 
241  /* If we don't have any Comment string yet, try to find one in the INI file */
242  if(m_Comment.empty())
243  m_Comment = GetINIValue(L"Submission", L"Comment", ConfigFile);
244  }
245 }
#define VER_NT_WORKSTATION
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
#define FATAL(Message)
Definition: precomp.h:57
static int argc
Definition: ServiceArgs.c:12
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
void(WINAPI * GETSYSINFO)(LPSYSTEM_INFO)
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
_Check_return_ unsigned long __cdecl wcstoul(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
#define argv
Definition: mplay32.c:18
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
IN UCHAR Value
Definition: halp.h:394
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2351
#define true
Definition: osdep.h:36
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
string m_SystemInfoRequestString
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
smooth NULL
Definition: ftsmooth.c:416
#define false
Definition: osdep.h:35
void ParseParameters(int argc, wchar_t *argv[])
#define EXCEPTION(Message)
Definition: precomp.h:56
unsigned long m_RepeatCount
void GetConfigurationFromFile()
string UnicodeToAscii(PCWSTR UnicodeString)
Definition: tools.cpp:261
ULONG dwMajorVersion
Definition: rtltypes.h:247
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
string EscapeString(const char *Input)
Definition: tools.cpp:24
unsigned long DWORD
Definition: ntddk_ex.h:95
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
ULONG dwBuildNumber
Definition: rtltypes.h:249
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const WCHAR L[]
Definition: oid.c:1250
#define wcsrchr
Definition: compat.h:16
string GetINIValue(PCWCH AppName, PCWCH KeyName, PCWCH FileName)
Definition: tools.cpp:187
struct _SYSTEM_INFO * LPSYSTEM_INFO
WORD wProcessorArchitecture
Definition: winbase.h:1135
ULONG dwMinorVersion
Definition: rtltypes.h:248
#define CONFIGURATION_FILENAMEW
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
#define GetProcAddress(x, y)
Definition: compat.h:612
#define ss
Definition: i386-dis.c:432
#define CONFIGURATION_FILENAMEA
#define GetEnvironmentVariableW(x, y, z)
Definition: compat.h:614
string m_AuthenticationRequestString
void GetSystemInformation()