1 /*
2  * PROJECT:     ReactOS Character Map
3  * LICENSE:     GPL - See COPYING in the top level directory
4  * FILE:        base/applications/charmap/settings.c
5  * PURPOSE:     save/load settings
6  * COPYRIGHT:   Copyright 2012 Edijs Kolesnikovics <terminedijs@yahoo.com>
7  *
8  */
9 
10 #include "precomp.h"
11 
12 #include <winreg.h>
13 #include <windowsx.h>
14 #include <tchar.h>
15 
16 const TCHAR g_szGeneralRegKey[] = _T("Software\\Microsoft\\CharMap");
17 HWND hWnd;
18 
19 LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen)
20 {
21     LONG lResult;
22     HKEY hSubKey = NULL;
23     DWORD cbData, dwType;
24 
25     if (lpSubKey)
26     {
27         lResult = RegOpenKey(hKey, lpSubKey, &hSubKey);
28         if (lResult != ERROR_SUCCESS)
29             goto done;
30         hKey = hSubKey;
31     }
32 
33     cbData = (dwBufferLen - 1) * sizeof(*pszBuffer);
34     lResult = RegQueryValueEx(hKey, lpValueName, NULL, &dwType, (LPBYTE) pszBuffer, &cbData);
35     if (lResult != ERROR_SUCCESS)
36         goto done;
37     if (dwType != REG_SZ)
38     {
39         lResult = -1;
40         goto done;
41     }
42 
43     pszBuffer[cbData / sizeof(*pszBuffer)] = _T('\0');
44 
45 done:
46     if (lResult != ERROR_SUCCESS)
47         pszBuffer[0] = _T('\0');
48     if (hSubKey)
49         RegCloseKey(hSubKey);
50     return lResult;
51 }
52 
53 extern void LoadSettings(void)
54 {
55     HKEY hKey = NULL;
56     int iItemIndex = -1;
57 
58     if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
59     {
60         TCHAR szBuffer[MAX_PATH];
61         DWORD dwAdvancedChecked;
62         DWORD type, size = sizeof(dwAdvancedChecked);
63         LSTATUS lstatus;
64 
65         /* Restore last selected font */
66         if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("Font"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
67         {
68             //Get combobox handle
69             hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
70 
71             //Search for match and return index if match found
72             iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
73             if(iItemIndex != CB_ERR)
74             {
75                 ComboBox_SetCurSel(hWnd, iItemIndex);
76                 ChangeMapFont(hCharmapDlg);
77             }
78         }
79 
80         /* Restore last selected character set */
81         if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("CodePage"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
82         {
83             //Get combobox handle
84             hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET);
85 
86             iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
87             if(iItemIndex != CB_ERR)
88             {
89                 ComboBox_SetCurSel(hWnd, iItemIndex);
90             }
91         }
92 
93         lstatus = RegQueryValueEx(hKey, _T("Advanced"), NULL, &type, (LPBYTE)&dwAdvancedChecked, &size);
94         if (lstatus == ERROR_SUCCESS && type == REG_DWORD && dwAdvancedChecked != FALSE)
95         {
96             SendDlgItemMessage(hCharmapDlg, IDC_CHECK_ADVANCED, BM_CLICK, MF_CHECKED, 0);
97         }
98 
99     RegCloseKey(hKey);
100     }
101     else
102     {
103         /* Default font seems to be Arial */
104         hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
105 
106         iItemIndex = ComboBox_FindStringExact(hWnd, -1, _T("Arial"));
107         if(iItemIndex != CB_ERR)
108         {
109             ComboBox_SetCurSel(hWnd, iItemIndex);
110             ChangeMapFont(hCharmapDlg);
111         }
112     }
113 }
114 
115 extern void SaveSettings(void)
116 {
117     HKEY hKey = NULL;
118 
119     if (RegCreateKeyEx(HKEY_CURRENT_USER, g_szGeneralRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) == ERROR_SUCCESS)
120     {
121         TCHAR szBuffer[MAX_PATH];
122 
123         hWnd = GetDlgItem(hCharmapDlg, IDC_FONTCOMBO);
124         ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
125 
126         if(*szBuffer != '\0')
127             RegSetValueEx(hKey, _T("Font"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
128 
129         hWnd = GetDlgItem(hCharmapDlg, IDC_COMBO_CHARSET);
130         ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
131 
132         if(*szBuffer != '\0')
133             RegSetValueEx(hKey, _T("CodePage"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
134 
135         RegSetValueEx(hKey, _T("Advanced"), 0, REG_DWORD, (LPBYTE)&Settings.IsAdvancedView, (DWORD) sizeof(DWORD));
136 
137         RegCloseKey(hKey);
138     }
139 }
140