ReactOS 0.4.15-dev-7889-g76290a6
settings.c
Go to the documentation of this file.
1
2#include "precomp.h"
3
4/* update NUM_SETTINGS in precomp.h */
6{
7 L"desktopwidth",
8 L"desktopheight",
9 L"session bpp",
10 L"full address",
11 L"username",
12 L"screen mode id",
13};
14
15VOID
17{
18 INT ret;
19 WCHAR szValue[MAXVALUE];
20
21 /* server */
24 szValue,
25 MAXVALUE))
26 {
28 L"full address",
29 szValue);
30 }
31
32 /* resolution and fullscreen*/
36 0,
37 0);
38 if (ret != -1)
39 {
41 L"screen mode id",
44 L"desktopwidth",
47 L"desktopheight",
49 }
50
51 /* bpp */
55 0,
56 0);
57 if (ret != CB_ERR)
58 {
62 ret,
63 0);
64 if (ret != CB_ERR)
65 {
67 L"session bpp",
68 ret);
69 }
70 }
71
72 /* user name */
75 szValue,
76 MAXVALUE))
77 {
79 L"username",
80 szValue);
81 }
82}
83
84
85BOOL
88 INT Value)
89{
90 BOOL bRet = FALSE;
91
92 if (pRdpSettings)
93 {
94 INT i;
95
96 for (i = 0; i < pRdpSettings->NumSettings; i++)
97 {
98 if (wcscmp(pRdpSettings->pSettings[i].Key, lpKey) == 0)
99 {
100 if (pRdpSettings->pSettings[i].Type == 0)
101 pRdpSettings->pSettings[i].Type = L'i';
102
103 pRdpSettings->pSettings[i].Value.i = Value;
104 bRet = TRUE;
105 break;
106 }
107 }
108 }
109
110 return bRet;
111}
112
113
114BOOL
117 LPWSTR lpValue)
118{
119 BOOL bRet = FALSE;
120
121 if (pRdpSettings)
122 {
123 INT i;
124
125 for (i = 0; i < pRdpSettings->NumSettings; i++)
126 {
127 if (wcscmp(pRdpSettings->pSettings[i].Key, lpKey) == 0)
128 {
129 if (pRdpSettings->pSettings[i].Type == 0)
130 pRdpSettings->pSettings[i].Type = L's';
131
132 wcscpy(pRdpSettings->pSettings[i].Value.s, lpValue);
133 bRet = TRUE;
134 break;
135 }
136 }
137 }
138
139 return bRet;
140}
141
142
143INT
146{
147 INT Value = -1;
148
149 if (pRdpSettings)
150 {
151 INT i;
152
153 for (i = 0; i < pRdpSettings->NumSettings; i++)
154 {
155 if (wcscmp(pRdpSettings->pSettings[i].Key, lpKey) == 0)
156 {
157 if (pRdpSettings->pSettings[i].Type == L'i')
158 {
159 Value = pRdpSettings->pSettings[i].Value.i;
160 break;
161 }
162 }
163 }
164 }
165
166 return Value;
167}
168
169
170LPWSTR
173{
174 LPWSTR lpValue = NULL;
175
176 if (pRdpSettings)
177 {
178 INT i;
179
180 for (i = 0; i < pRdpSettings->NumSettings; i++)
181 {
182 if (wcscmp(pRdpSettings->pSettings[i].Key, lpKey) == 0)
183 {
184 if (pRdpSettings->pSettings[i].Type == L's')
185 {
186 lpValue = pRdpSettings->pSettings[i].Value.s;
187 break;
188 }
189 }
190 }
191 }
192
193 return lpValue;
194}
195
196
197static BOOL
199 PRDPSETTINGS pRdpSettings)
200{
201 WCHAR line[MAXKEY + MAXVALUE + 4];
202 SIZE_T BytesToWrite;
204 BOOL bRet;
205 INT i, k;
206
207 for (i = 0; i < pRdpSettings->NumSettings; i++)
208 {
209 /* only write out values in the lpSettings struct */
210 for (k = 0; k < NUM_SETTINGS; k++)
211 {
212 if (wcscmp(lpSettings[k], pRdpSettings->pSettings[i].Key) == 0)
213 {
214 if (pRdpSettings->pSettings[i].Type == L'i')
215 {
216 _snwprintf(line, MAXKEY + MAXVALUE + 4, L"%s:i:%d\r\n",
217 pRdpSettings->pSettings[i].Key,
218 pRdpSettings->pSettings[i].Value.i);
219 }
220 else
221 {
222 _snwprintf(line, MAXKEY + MAXVALUE + 4, L"%s:s:%s\r\n",
223 pRdpSettings->pSettings[i].Key,
224 pRdpSettings->pSettings[i].Value.s);
225 }
226
227 BytesToWrite = wcslen(line) * sizeof(WCHAR);
228
229 bRet = WriteFile(hFile,
230 line,
231 BytesToWrite,
233 NULL);
234 if (!bRet || BytesWritten == 0)
235 return FALSE;
236 }
237 }
238 }
239
240 return TRUE;
241}
242
243
244static VOID
247{
248 LPWSTR lpStr = lpBuffer;
249 WCHAR szSeps[] = L":\r\n";
250 WCHAR szNewline[] = L"\r\n";
251 LPWSTR lpToken;
252 BOOL bFound;
253 INT i;
254
255 /* move past unicode byte order */
256 if (lpStr[0] == 0xFEFF || lpStr[0] == 0xFFFE)
257 lpStr += 1;
258
259 lpToken = wcstok(lpStr, szSeps);
260 while (lpToken)
261 {
262 bFound = FALSE;
263
264 for (i = 0; i < pRdpSettings->NumSettings && !bFound; i++)
265 {
266 if (wcscmp(lpToken, pRdpSettings->pSettings[i].Key) == 0)
267 {
268 lpToken = wcstok(NULL, szSeps);
269 if (lpToken[0] == L'i')
270 {
271 pRdpSettings->pSettings[i].Type = lpToken[0];
272 lpToken = wcstok(NULL, szSeps);
273 if (lpToken != NULL)
274 pRdpSettings->pSettings[i].Value.i = _wtoi(lpToken);
275 }
276 else if (lpToken[0] == L's')
277 {
278 pRdpSettings->pSettings[i].Type = lpToken[0];
279 if (lpToken[2] == 13 || lpToken[2] == 10 || lpToken[2] == 0)
280 lpToken[0] = 0; // terminate string
281 else
282 lpToken = wcstok(NULL, szNewline);
283 if (lpToken != NULL)
284 wcscpy(pRdpSettings->pSettings[i].Value.s, lpToken);
285 }
286 bFound = TRUE;
287 }
288 }
289
290 /* move past the type and value */
291 if (!bFound)
292 lpToken = wcstok(NULL, szNewline);
293
294 /* move to next key */
295 lpToken = wcstok(NULL, szSeps);
296 }
297}
298
299
300static LPWSTR
302{
304 DWORD BytesToRead, BytesRead;
305 BOOL bRes;
306
307 if (hFile)
308 {
309 BytesToRead = GetFileSize(hFile, NULL);
310 if (BytesToRead)
311 {
313 0,
314 BytesToRead + 2);
315 if (lpBuffer)
316 {
317 bRes = ReadFile(hFile,
318 lpBuffer,
319 BytesToRead,
320 &BytesRead,
321 NULL);
322 if (bRes)
323 {
324 lpBuffer[BytesRead / 2] = 0;
325 }
326 else
327 {
329 0,
330 lpBuffer);
331
332 lpBuffer = NULL;
333 }
334 }
335 }
336 }
337
338 return lpBuffer;
339}
340
341
342static HANDLE
344{
345 HANDLE hFile = NULL;
346
347 if (path)
348 {
350 bWrite ? GENERIC_WRITE : GENERIC_READ,
351 0,
352 NULL,
353 bWrite ? CREATE_ALWAYS : OPEN_EXISTING,
355 NULL);
356 }
357
358 return hFile;
359}
360
361
362static VOID
364{
365 if (hFile)
367}
368
369
370BOOL
372 PRDPSETTINGS pRdpSettings)
373{
374 WCHAR pszPath[MAX_PATH];
376 BOOL bRet = FALSE;
377
378 /* use default file */
379 if (lpFile == NULL)
380 {
381 HRESULT hr;
382 LPITEMIDLIST lpidl= NULL;
383
386 NULL,
387 0,
388 &lpidl);
389 if (hr == S_OK)
390 {
391 if (SHGetPathFromIDListW(lpidl, pszPath))
392 {
393 wcscat(pszPath, L"\\Default.rdp");
394 lpFile = pszPath;
395 CoTaskMemFree(lpidl);
396 }
397 }
398 }
399
400 if (lpFile)
401 {
402 hFile = OpenRdpFile(lpFile, TRUE);
403 if (hFile)
404 {
405 if (WriteRdpFile(hFile, pRdpSettings))
406 {
407 bRet = TRUE;
408 }
409
411 }
412 }
413
414 return bRet;
415}
416
417
418BOOL
420 LPWSTR lpFile)
421{
422 WCHAR pszPath[MAX_PATH];
424 BOOL bRet = FALSE;
425
426 /* use default file */
427 if (lpFile == NULL)
428 {
429 HRESULT hr;
430 LPITEMIDLIST lpidl= NULL;
431
434 NULL,
435 0,
436 &lpidl);
437 if (hr == S_OK)
438 {
439 if (SHGetPathFromIDListW(lpidl, pszPath))
440 {
441 wcscat(pszPath, L"\\Default.rdp");
442 lpFile = pszPath;
443 CoTaskMemFree(lpidl);
444 }
445 }
446 }
447
448 if (lpFile)
449 {
451
452 hFile = OpenRdpFile(lpFile, FALSE);
453 if (hFile)
454 {
456 if (lpBuffer)
457 {
458 ParseSettings(pRdpSettings, lpBuffer);
459
461 0,
462 lpBuffer);
463
464 bRet = TRUE;
465 }
466
468 }
469 }
470
471 return bRet;
472}
473
474
475BOOL
477{
478 BOOL bRet = FALSE;
479
480 pRdpSettings->pSettings = HeapAlloc(GetProcessHeap(),
481 0,
482 sizeof(SETTINGS) * NUM_SETTINGS);
483 if (pRdpSettings->pSettings)
484 {
485 INT i;
486
487 for (i = 0; i < NUM_SETTINGS; i++)
488 {
489 wcscpy(pRdpSettings->pSettings[i].Key, lpSettings[i]);
490 pRdpSettings->pSettings[i].Type = (WCHAR)0;
491 pRdpSettings->pSettings[i].Value.i = 0;
492 }
493
494 pRdpSettings->NumSettings = NUM_SETTINGS;
495
496 bRet = TRUE;
497 }
498
499 return bRet;
500}
#define MAXKEY
Definition: precomp.h:28
#define MAXVALUE
Definition: precomp.h:29
#define NUM_SETTINGS
Definition: precomp.h:30
#define IDC_BPPCOMBO
Definition: resource.h:20
#define IDC_NAMEEDIT
Definition: resource.h:22
#define IDC_GEOSLIDER
Definition: resource.h:19
#define IDC_SERVERCOMBO
Definition: resource.h:15
static VOID ParseSettings(PRDPSETTINGS pRdpSettings, LPWSTR lpBuffer)
Definition: settings.c:245
BOOL SetStringToSettings(PRDPSETTINGS pRdpSettings, LPWSTR lpKey, LPWSTR lpValue)
Definition: settings.c:115
static LPWSTR ReadRdpFile(HANDLE hFile)
Definition: settings.c:301
static VOID CloseRdpFile(HANDLE hFile)
Definition: settings.c:363
static BOOL WriteRdpFile(HANDLE hFile, PRDPSETTINGS pRdpSettings)
Definition: settings.c:198
VOID SaveAllSettings(PINFO pInfo)
Definition: settings.c:16
LPWSTR GetStringFromSettings(PRDPSETTINGS pRdpSettings, LPWSTR lpKey)
Definition: settings.c:171
LPWSTR lpSettings[NUM_SETTINGS]
Definition: settings.c:5
BOOL LoadRdpSettingsFromFile(PRDPSETTINGS pRdpSettings, LPWSTR lpFile)
Definition: settings.c:419
BOOL InitRdpSettings(PRDPSETTINGS pRdpSettings)
Definition: settings.c:476
BOOL SaveRdpSettingsToFile(LPWSTR lpFile, PRDPSETTINGS pRdpSettings)
Definition: settings.c:371
INT GetIntegerFromSettings(PRDPSETTINGS pRdpSettings, LPWSTR lpKey)
Definition: settings.c:144
BOOL SetIntegerToSettings(PRDPSETTINGS pRdpSettings, LPWSTR lpKey, INT Value)
Definition: settings.c:86
static HANDLE OpenRdpFile(LPWSTR path, BOOL bWrite)
Definition: settings.c:343
static LPCTSTR lpKey
Definition: virtmem.c:102
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define HeapAlloc
Definition: compat.h:733
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3124
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
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
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
_Check_return_ _CRTIMP int __cdecl _wtoi(_In_z_ const wchar_t *_Str)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define S_OK
Definition: intsafe.h:52
#define CREATE_ALWAYS
Definition: disk.h:72
int _snwprintf(wchar_t *buffer, size_t count, const wchar_t *format,...)
int k
Definition: mpi.c:3369
_In_ HANDLE hFile
Definition: mswsock.h:90
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1353
#define TBM_GETPOS
Definition: commctrl.h:2031
#define TBM_GETRANGEMAX
Definition: commctrl.h:2033
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscat(_Inout_updates_z_(_String_length_(_Dest)+_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP wchar_t *__cdecl wcstok(_Inout_opt_z_ wchar_t *_Str, _In_z_ const wchar_t *_Delim)
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_PERSONAL
Definition: shlobj.h:2163
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
PRESOLUTION_INFO Resolutions
Definition: precomp.h:77
Definition: precomp.h:84
PDISPLAY_DEVICE_ENTRY DisplayDeviceList
Definition: precomp.h:86
HWND hGeneralPage
Definition: precomp.h:90
PRDPSETTINGS pRdpSettings
Definition: precomp.h:85
HWND hDisplayPage
Definition: precomp.h:91
PSETTINGS pSettings
Definition: precomp.h:45
INT NumSettings
Definition: precomp.h:46
DWORD dmPelsWidth
Definition: precomp.h:54
DWORD dmPelsHeight
Definition: precomp.h:55
WCHAR Type
Definition: precomp.h:36
WCHAR Key[MAXKEY]
Definition: precomp.h:35
union _SETTINGS::@13 Value
INT i
Definition: precomp.h:38
WCHAR s[MAXVALUE]
Definition: precomp.h:39
Definition: parser.c:49
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
int ret
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesWritten
Definition: wdfiotarget.h:960
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS _Out_opt_ PULONG_PTR BytesRead
Definition: wdfiotarget.h:870
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define GetDlgItemText
Definition: winuser.h:5785
#define CB_ERR
Definition: winuser.h:2435
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CB_GETITEMDATA
Definition: winuser.h:1950
#define CB_GETCURSEL
Definition: winuser.h:1943
#define SendDlgItemMessage
Definition: winuser.h:5842
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184