[EXPLORER][EXPLORER_NEW]
[reactos.git] / base / shell / explorer-new / util.cpp
1 #include "precomp.h"
2 #include <winver.h>
3
4 typedef struct _LANGCODEPAGE
5 {
6 WORD wLanguage;
7 WORD wCodePage;
8 } LANGCODEPAGE, *PLANGCODEPAGE;
9
10 HRESULT
11 IsSameObject(IN IUnknown *punk1, IN IUnknown *punk2)
12 {
13 HRESULT hRet;
14
15 hRet = punk1->QueryInterface(IID_PPV_ARG(IUnknown, &punk1));
16
17 if (!SUCCEEDED(hRet))
18 return hRet;
19
20 hRet = punk2->QueryInterface(IID_PPV_ARG(IUnknown, &punk2));
21
22 punk1->Release();
23
24 if (!SUCCEEDED(hRet))
25 return hRet;
26
27 punk2->Release();
28
29 /* We're dealing with the same object if the IUnknown pointers are equal */
30 return (punk1 == punk2) ? S_OK : S_FALSE;
31 }
32
33 LONG
34 SetWindowStyle(IN HWND hWnd,
35 IN LONG dwStyleMask,
36 IN LONG dwStyle)
37 {
38 LONG PrevStyle, Style;
39
40 ASSERT((~dwStyleMask & dwStyle) == 0);
41
42 PrevStyle = GetWindowLong(hWnd, GWL_STYLE);
43 if (PrevStyle != 0 &&
44 (PrevStyle & dwStyleMask) != dwStyle)
45 {
46 Style = PrevStyle & ~dwStyleMask;
47 Style |= dwStyle;
48
49 PrevStyle = SetWindowLong(hWnd, GWL_STYLE, Style);
50 }
51
52 return PrevStyle;
53 }
54
55 LONG
56 SetWindowExStyle(IN HWND hWnd,
57 IN LONG dwStyleMask,
58 IN LONG dwStyle)
59 {
60 LONG PrevStyle, Style;
61
62 ASSERT((~dwStyleMask & dwStyle) == 0);
63
64 PrevStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
65 if (PrevStyle != 0 &&
66 (PrevStyle & dwStyleMask) != dwStyle)
67 {
68 Style = PrevStyle & ~dwStyleMask;
69 Style |= dwStyle;
70
71 PrevStyle = SetWindowLong(hWnd, GWL_EXSTYLE, Style);
72 }
73
74 return PrevStyle;
75 }
76
77 HMENU
78 LoadPopupMenu(IN HINSTANCE hInstance,
79 IN LPCTSTR lpMenuName)
80 {
81 HMENU hMenu, hSubMenu = NULL;
82
83 hMenu = LoadMenu(hInstance,
84 lpMenuName);
85
86 if (hMenu != NULL)
87 {
88 hSubMenu = GetSubMenu(hMenu,
89 0);
90 if (hSubMenu != NULL &&
91 !RemoveMenu(hMenu,
92 0,
93 MF_BYPOSITION))
94 {
95 hSubMenu = NULL;
96 }
97
98 DestroyMenu(hMenu);
99 }
100
101 return hSubMenu;
102 }
103
104 HMENU
105 FindSubMenu(IN HMENU hMenu,
106 IN UINT uItem,
107 IN BOOL fByPosition)
108 {
109 MENUITEMINFO mii;
110
111 mii.cbSize = sizeof(mii);
112 mii.fMask = MIIM_SUBMENU;
113
114 if (GetMenuItemInfo(hMenu,
115 uItem,
116 fByPosition,
117 &mii))
118 {
119 return mii.hSubMenu;
120 }
121
122 return NULL;
123 }
124
125 BOOL
126 GetCurrentLoggedOnUserName(OUT LPTSTR szBuffer,
127 IN DWORD dwBufferSize)
128 {
129 DWORD dwType;
130 DWORD dwSize;
131
132 /* Query the user name from the registry */
133 dwSize = (dwBufferSize * sizeof(WCHAR)) - 1;
134 if (RegQueryValueEx(hkExplorer,
135 TEXT("Logon User Name"),
136 0,
137 &dwType,
138 (LPBYTE) szBuffer,
139 &dwSize) == ERROR_SUCCESS &&
140 (dwSize / sizeof(WCHAR)) > 1 &&
141 szBuffer[0] != _T('\0'))
142 {
143 szBuffer[dwSize / sizeof(WCHAR)] = _T('\0');
144 return TRUE;
145 }
146
147 /* Fall back to GetUserName() */
148 dwSize = dwBufferSize;
149 if (!GetUserName(szBuffer,
150 &dwSize))
151 {
152 szBuffer[0] = _T('\0');
153 return FALSE;
154 }
155
156 return TRUE;
157 }
158
159 BOOL
160 FormatMenuString(IN HMENU hMenu,
161 IN UINT uPosition,
162 IN UINT uFlags,
163 ...)
164 {
165 va_list vl;
166 MENUITEMINFO mii;
167 WCHAR szBuf[128];
168 WCHAR szBufFmt[128];
169
170 /* Find the menu item and read the formatting string */
171 mii.cbSize = sizeof(mii);
172 mii.fMask = MIIM_STRING;
173 mii.dwTypeData = (LPTSTR) szBufFmt;
174 mii.cch = sizeof(szBufFmt) / sizeof(szBufFmt[0]);
175 if (GetMenuItemInfo(hMenu,
176 uPosition,
177 uFlags,
178 &mii))
179 {
180 /* Format the string */
181 va_start(vl, uFlags);
182 _vsntprintf(szBuf,
183 (sizeof(szBuf) / sizeof(szBuf[0])) - 1,
184 szBufFmt,
185 vl);
186 va_end(vl);
187 szBuf[(sizeof(szBuf) / sizeof(szBuf[0])) - 1] = _T('\0');
188
189 /* Update the menu item */
190 mii.dwTypeData = (LPTSTR) szBuf;
191 if (SetMenuItemInfo(hMenu,
192 uPosition,
193 uFlags,
194 &mii))
195 {
196 return TRUE;
197 }
198 }
199
200 return FALSE;
201 }
202
203 BOOL
204 GetExplorerRegValueSet(IN HKEY hKey,
205 IN LPCTSTR lpSubKey,
206 IN LPCTSTR lpValue)
207 {
208 WCHAR szBuffer[MAX_PATH];
209 HKEY hkSubKey;
210 DWORD dwType, dwSize;
211 BOOL Ret = FALSE;
212
213 StringCbCopy(szBuffer, sizeof(szBuffer),
214 TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"));
215 if (FAILED_UNEXPECTEDLY(StringCbCat(szBuffer, sizeof(szBuffer),
216 _T("\\"))))
217 return FALSE;
218 if (FAILED_UNEXPECTEDLY(StringCbCat(szBuffer, sizeof(szBuffer),
219 lpSubKey)))
220 return FALSE;
221
222 dwSize = sizeof(szBuffer);
223 if (RegOpenKeyEx(hKey,
224 szBuffer,
225 0,
226 KEY_QUERY_VALUE,
227 &hkSubKey) == ERROR_SUCCESS)
228 {
229 ZeroMemory(szBuffer,
230 sizeof(szBuffer));
231
232 if (RegQueryValueEx(hkSubKey,
233 lpValue,
234 0,
235 &dwType,
236 (LPBYTE) szBuffer,
237 &dwSize) == ERROR_SUCCESS)
238 {
239 if (dwType == REG_DWORD && dwSize == sizeof(DWORD))
240 Ret = *((PDWORD) szBuffer) != 0;
241 else if (dwSize > 0)
242 Ret = *((PCHAR) szBuffer) != 0;
243 }
244
245 RegCloseKey(hkSubKey);
246 }
247 return Ret;
248 }
249
250 BOOL
251 GetVersionInfoString(IN WCHAR *szFileName,
252 IN WCHAR *szVersionInfo,
253 OUT WCHAR *szBuffer,
254 IN UINT cbBufLen)
255 {
256 LPVOID lpData = NULL;
257 WCHAR szSubBlock[128];
258 WCHAR *lpszLocalBuf = NULL;
259 LANGID UserLangId;
260 PLANGCODEPAGE lpTranslate = NULL;
261 DWORD dwLen;
262 DWORD dwHandle;
263 UINT cbTranslate;
264 UINT cbLen;
265 BOOL bRet = FALSE;
266 unsigned int i;
267
268 dwLen = GetFileVersionInfoSize(szFileName, &dwHandle);
269
270 if (dwLen > 0)
271 {
272 lpData = HeapAlloc(hProcessHeap, 0, dwLen);
273
274 if (lpData != NULL)
275 {
276 if (GetFileVersionInfo(szFileName,
277 0,
278 dwLen,
279 lpData) != 0)
280 {
281 UserLangId = GetUserDefaultLangID();
282
283 VerQueryValue(lpData,
284 TEXT("\\VarFileInfo\\Translation"),
285 (LPVOID *) &lpTranslate,
286 &cbTranslate);
287
288 for (i = 0; i < cbTranslate / sizeof(LANGCODEPAGE); i++)
289 {
290 /* If the bottom eight bits of the language id's
291 match, use this version information (since this
292 means that the version information and the users
293 default language are the same). */
294 if ((lpTranslate[i].wLanguage & 0xFF) ==
295 (UserLangId & 0xFF))
296 {
297 wnsprintf(szSubBlock,
298 sizeof(szSubBlock) / sizeof(szSubBlock[0]),
299 TEXT("\\StringFileInfo\\%04X%04X\\%s"),
300 lpTranslate[i].wLanguage,
301 lpTranslate[i].wCodePage,
302 szVersionInfo);
303
304 if (VerQueryValue(lpData,
305 szSubBlock,
306 (LPVOID *) &lpszLocalBuf,
307 &cbLen) != 0)
308 {
309 _tcsncpy(szBuffer, lpszLocalBuf, cbBufLen / sizeof(*szBuffer));
310
311 bRet = TRUE;
312 break;
313 }
314 }
315 }
316 }
317 HeapFree(hProcessHeap, 0, lpData);
318 lpData = NULL;
319 }
320 }
321
322 return bRet;
323 }