Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenclasses.cpp
Go to the documentation of this file.
00001 /* 00002 * file type mapping 00003 * (HKEY_CLASSES_ROOT - Stuff) 00004 * 00005 * Copyright 1998, 1999, 2000 Juergen Schmied 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00020 */ 00021 00022 #include <precomp.h> 00023 00024 WINE_DEFAULT_DEBUG_CHANNEL(shell); 00025 00026 #define MAX_EXTENSION_LENGTH 20 00027 00028 BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, LONG len, BOOL bPrependDot) 00029 { 00030 HKEY hkey; 00031 WCHAR szTemp[MAX_EXTENSION_LENGTH + 2]; 00032 00033 TRACE("%s %p\n", debugstr_w(szExtension), debugstr_w(szFileType)); 00034 00035 /* added because we do not want to have double dots */ 00036 if (szExtension[0] == '.') 00037 bPrependDot = 0; 00038 00039 if (bPrependDot) 00040 szTemp[0] = '.'; 00041 00042 lstrcpynW(szTemp + (bPrependDot ? 1 : 0), szExtension, MAX_EXTENSION_LENGTH); 00043 00044 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, KEY_READ, &hkey) != ERROR_SUCCESS) 00045 return FALSE; 00046 00047 if (RegQueryValueW(hkey, NULL, szFileType, &len) != ERROR_SUCCESS) 00048 { 00049 RegCloseKey(hkey); 00050 return FALSE; 00051 } 00052 00053 RegCloseKey(hkey); 00054 00055 TRACE("--UE;\n} %s\n", debugstr_w(szFileType)); 00056 00057 return TRUE; 00058 } 00059 00060 BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, LONG len, BOOL bPrependDot) 00061 { 00062 HKEY hkey; 00063 char szTemp[MAX_EXTENSION_LENGTH + 2]; 00064 00065 TRACE("%s %p\n", szExtension, szFileType); 00066 00067 /* added because we do not want to have double dots */ 00068 if (szExtension[0] == '.') 00069 bPrependDot = 0; 00070 00071 if (bPrependDot) 00072 szTemp[0] = '.'; 00073 00074 lstrcpynA(szTemp + (bPrependDot ? 1 : 0), szExtension, MAX_EXTENSION_LENGTH); 00075 00076 if (RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_READ, &hkey)) 00077 { 00078 return FALSE; 00079 } 00080 00081 if (RegLoadMUIStringA(hkey, "FriendlyTypeName", szFileType, len, NULL, 0, NULL) == ERROR_SUCCESS) 00082 { 00083 RegCloseKey(hkey); 00084 return TRUE; 00085 } 00086 00087 if (RegQueryValueA(hkey, NULL, szFileType, &len)) 00088 { 00089 RegCloseKey(hkey); 00090 return FALSE; 00091 } 00092 00093 RegCloseKey(hkey); 00094 00095 TRACE("--UE;\n} %s\n", szFileType); 00096 00097 return TRUE; 00098 } 00099 00100 static const WCHAR swShell[] = L"shell\\"; 00101 static const WCHAR swOpen[] = L"open"; 00102 static const WCHAR swCommand[] = L"\\command"; 00103 00104 BOOL HCR_GetDefaultVerbW(HKEY hkeyClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len) 00105 { 00106 WCHAR sTemp[MAX_PATH]; 00107 LONG size; 00108 HKEY hkey; 00109 00110 TRACE("%p %s %p\n", hkeyClass, debugstr_w(szVerb), szDest); 00111 00112 if (szVerb) 00113 { 00114 lstrcpynW(szDest, szVerb, len); 00115 return TRUE; 00116 } 00117 00118 size = len; 00119 *szDest = '\0'; 00120 if (RegQueryValueW(hkeyClass, L"shell", szDest, &size) == ERROR_SUCCESS && *szDest) 00121 { 00122 /* The MSDN says to first try the default verb */ 00123 wcscpy(sTemp, swShell); 00124 wcscat(sTemp, szDest); 00125 wcscat(sTemp, swCommand); 00126 if (RegOpenKeyExW(hkeyClass, sTemp, 0, KEY_READ, &hkey) == ERROR_SUCCESS) 00127 { 00128 RegCloseKey(hkey); 00129 TRACE("default verb=%s\n", debugstr_w(szDest)); 00130 return TRUE; 00131 } 00132 } 00133 00134 /* then fallback to 'open' */ 00135 wcscpy(sTemp, swShell); 00136 wcscat(sTemp, swOpen); 00137 wcscat(sTemp, swCommand); 00138 if (RegOpenKeyExW(hkeyClass, sTemp, 0, KEY_READ, &hkey) == ERROR_SUCCESS) 00139 { 00140 RegCloseKey(hkey); 00141 lstrcpynW(szDest, swOpen, len); 00142 TRACE("default verb=open\n"); 00143 return TRUE; 00144 } 00145 00146 /* and then just use the first verb on Windows >= 2000 */ 00147 if (RegOpenKeyExW(hkeyClass, L"shell", 0, KEY_READ, &hkey) == ERROR_SUCCESS) 00148 { 00149 if (RegEnumKeyW(hkey, 0, szDest, len) == ERROR_SUCCESS && *szDest) 00150 { 00151 TRACE("default verb=first verb=%s\n", debugstr_w(szDest)); 00152 RegCloseKey(hkey); 00153 return TRUE; 00154 } 00155 RegCloseKey(hkey); 00156 } 00157 00158 00159 TRACE("no default verb!\n"); 00160 return FALSE; 00161 } 00162 00163 BOOL HCR_GetExecuteCommandW(HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len) 00164 { 00165 WCHAR sTempVerb[MAX_PATH]; 00166 BOOL ret; 00167 00168 TRACE("%p %s %s %p\n", hkeyClass, debugstr_w(szClass), debugstr_w(szVerb), szDest); 00169 00170 if (szClass) 00171 RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, KEY_READ, &hkeyClass); 00172 if (!hkeyClass) 00173 return FALSE; 00174 ret = FALSE; 00175 00176 if (HCR_GetDefaultVerbW(hkeyClass, szVerb, sTempVerb, sizeof(sTempVerb))) 00177 { 00178 WCHAR sTemp[MAX_PATH]; 00179 wcscpy(sTemp, swShell); 00180 wcscat(sTemp, sTempVerb); 00181 wcscat(sTemp, swCommand); 00182 ret = (ERROR_SUCCESS == SHGetValueW(hkeyClass, sTemp, NULL, NULL, szDest, &len)); 00183 } 00184 if (szClass) 00185 RegCloseKey(hkeyClass); 00186 00187 TRACE("-- %s\n", debugstr_w(szDest)); 00188 return ret; 00189 } 00190 00191 /*************************************************************************************** 00192 * HCR_GetDefaultIcon [internal] 00193 * 00194 * Gets the icon for a filetype 00195 */ 00196 static BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey) 00197 { 00198 WCHAR xriid[50]; 00199 swprintf(xriid, L"CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", 00200 riid.Data1, riid.Data2, riid.Data3, 00201 riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3], 00202 riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7] ); 00203 00204 TRACE("%S\n", xriid); 00205 00206 return (RegOpenKeyExW(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey) == ERROR_SUCCESS); 00207 } 00208 00209 static BOOL HCR_RegGetDefaultIconW(HKEY hkey, LPWSTR szDest, DWORD len, int* picon_idx) 00210 { 00211 DWORD dwType; 00212 WCHAR sTemp[MAX_PATH]; 00213 WCHAR sNum[7]; 00214 00215 if (!RegQueryValueExW(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len)) 00216 { 00217 if (dwType == REG_EXPAND_SZ) 00218 { 00219 ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH); 00220 lstrcpynW(szDest, sTemp, len); 00221 } 00222 if (ParseFieldW (szDest, 2, sNum, _countof(sNum))) 00223 *picon_idx = atoiW(sNum); 00224 else 00225 *picon_idx = 0; /* sometimes the icon number is missing */ 00226 ParseFieldW (szDest, 1, szDest, len); 00227 PathUnquoteSpacesW(szDest); 00228 return TRUE; 00229 } 00230 return FALSE; 00231 } 00232 00233 static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, int* picon_idx) 00234 { 00235 DWORD dwType; 00236 char sTemp[MAX_PATH]; 00237 char sNum[5]; 00238 00239 if (!RegQueryValueExA(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len)) 00240 { 00241 if (dwType == REG_EXPAND_SZ) 00242 { 00243 ExpandEnvironmentStringsA(szDest, sTemp, MAX_PATH); 00244 lstrcpynA(szDest, sTemp, len); 00245 } 00246 if (ParseFieldA (szDest, 2, sNum, 5)) 00247 *picon_idx = atoi(sNum); 00248 else 00249 *picon_idx = 0; /* sometimes the icon number is missing */ 00250 ParseFieldA (szDest, 1, szDest, len); 00251 PathUnquoteSpacesA(szDest); 00252 return TRUE; 00253 } 00254 return FALSE; 00255 } 00256 00257 BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, int* picon_idx) 00258 { 00259 static const WCHAR swDefaultIcon[] = L"\\DefaultIcon"; 00260 HKEY hKey; 00261 WCHAR sTemp[MAX_PATH]; 00262 BOOL ret = FALSE; 00263 00264 TRACE("%s\n", debugstr_w(szClass) ); 00265 00266 lstrcpynW(sTemp, szClass, MAX_PATH); 00267 wcscat(sTemp, swDefaultIcon); 00268 00269 if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, KEY_READ, &hKey)) 00270 { 00271 ret = HCR_RegGetDefaultIconW(hKey, szDest, len, picon_idx); 00272 RegCloseKey(hKey); 00273 } 00274 00275 if(ret) 00276 TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx); 00277 else 00278 TRACE("-- not found\n"); 00279 00280 return ret; 00281 } 00282 00283 BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, int* picon_idx) 00284 { 00285 HKEY hKey; 00286 char sTemp[MAX_PATH]; 00287 BOOL ret = FALSE; 00288 00289 TRACE("%s\n", szClass ); 00290 00291 sprintf(sTemp, "%s\\DefaultIcon", szClass); 00292 00293 if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, KEY_READ, &hKey)) 00294 { 00295 ret = HCR_RegGetDefaultIconA(hKey, szDest, len, picon_idx); 00296 RegCloseKey(hKey); 00297 } 00298 TRACE("-- %s %i\n", szDest, *picon_idx); 00299 return ret; 00300 } 00301 00302 BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, int* picon_idx) 00303 { 00304 HKEY hKey; 00305 BOOL ret = FALSE; 00306 00307 if (HCR_RegOpenClassIDKey(riid, &hKey)) 00308 { 00309 ret = HCR_RegGetDefaultIconW(hKey, szDest, len, picon_idx); 00310 RegCloseKey(hKey); 00311 } 00312 TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx); 00313 return ret; 00314 } 00315 00316 /*************************************************************************************** 00317 * HCR_GetClassName [internal] 00318 * 00319 * Gets the name of a registered class 00320 */ 00321 static const WCHAR swEmpty[] = {0}; 00322 00323 BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) 00324 { 00325 HKEY hKey; 00326 BOOL ret = FALSE; 00327 DWORD buflen = len; 00328 WCHAR szName[100]; 00329 LPOLESTR pStr; 00330 00331 szDest[0] = 0; 00332 00333 if (StringFromCLSID(riid, &pStr) == S_OK) 00334 { 00335 DWORD dwLen = buflen * sizeof(WCHAR); 00336 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr); 00337 if (RegGetValueW(HKEY_CURRENT_USER, szName, NULL, RRF_RT_REG_SZ, NULL, (PVOID)szDest, &dwLen) == ERROR_SUCCESS) 00338 { 00339 ret = TRUE; 00340 } 00341 CoTaskMemFree(pStr); 00342 } 00343 if (!ret && HCR_RegOpenClassIDKey(riid, &hKey)) 00344 { 00345 static const WCHAR wszLocalizedString[] = L"LocalizedString"; 00346 00347 if (RegLoadMUIStringW(hKey, wszLocalizedString, szDest, len, NULL, 0, NULL) == ERROR_SUCCESS || 00348 RegQueryValueExW(hKey, swEmpty, 0, NULL, (LPBYTE)szDest, &len) == ERROR_SUCCESS) 00349 { 00350 ret = TRUE; 00351 } 00352 RegCloseKey(hKey); 00353 } 00354 00355 if (!ret || !szDest[0]) 00356 { 00357 if(IsEqualIID(riid, CLSID_ShellDesktop)) 00358 { 00359 if (LoadStringW(shell32_hInstance, IDS_DESKTOP, szDest, buflen)) 00360 ret = TRUE; 00361 } 00362 else if (IsEqualIID(riid, CLSID_MyComputer)) 00363 { 00364 if(LoadStringW(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen)) 00365 ret = TRUE; 00366 } 00367 else if (IsEqualIID(riid, CLSID_MyDocuments)) 00368 { 00369 if(LoadStringW(shell32_hInstance, IDS_PERSONAL, szDest, buflen)) 00370 ret = TRUE; 00371 } 00372 else if (IsEqualIID(riid, CLSID_RecycleBin)) 00373 { 00374 if(LoadStringW(shell32_hInstance, IDS_RECYCLEBIN_FOLDER_NAME, szDest, buflen)) 00375 ret = TRUE; 00376 } 00377 else if (IsEqualIID(riid, CLSID_ControlPanel)) 00378 { 00379 if(LoadStringW(shell32_hInstance, IDS_CONTROLPANEL, szDest, buflen)) 00380 ret = TRUE; 00381 } 00382 else if (IsEqualIID(riid, CLSID_AdminFolderShortcut)) 00383 { 00384 if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen)) 00385 ret = TRUE; 00386 } 00387 } 00388 00389 TRACE("-- %s\n", debugstr_w(szDest)); 00390 return ret; 00391 } 00392 00393 BOOL HCR_GetClassNameA(REFIID riid, LPSTR szDest, DWORD len) 00394 { HKEY hKey; 00395 BOOL ret = FALSE; 00396 DWORD buflen = len; 00397 00398 szDest[0] = 0; 00399 if (HCR_RegOpenClassIDKey(riid, &hKey)) 00400 { 00401 if (!RegLoadMUIStringA(hKey, "LocalizedString", szDest, len, NULL, 0, NULL) || 00402 !RegQueryValueExA(hKey, "", 0, NULL, (LPBYTE)szDest, &len)) 00403 { 00404 ret = TRUE; 00405 } 00406 RegCloseKey(hKey); 00407 } 00408 00409 if (!ret || !szDest[0]) 00410 { 00411 if(IsEqualIID(riid, CLSID_ShellDesktop)) 00412 { 00413 if (LoadStringA(shell32_hInstance, IDS_DESKTOP, szDest, buflen)) 00414 ret = TRUE; 00415 } 00416 else if (IsEqualIID(riid, CLSID_MyComputer)) 00417 { 00418 if(LoadStringA(shell32_hInstance, IDS_MYCOMPUTER, szDest, buflen)) 00419 ret = TRUE; 00420 } 00421 } 00422 00423 TRACE("-- %s\n", szDest); 00424 00425 return ret; 00426 } 00427 00428 /****************************************************************************** 00429 * HCR_GetFolderAttributes [Internal] 00430 * 00431 * Query the registry for a shell folders' attributes 00432 * 00433 * PARAMS 00434 * pidlFolder [I] A simple pidl of type PT_GUID. 00435 * pdwAttributes [IO] In: Attributes to be queried, OUT: Resulting attributes. 00436 * 00437 * RETURNS 00438 * TRUE: Found information for the attributes in the registry 00439 * FALSE: No attribute information found 00440 * 00441 * NOTES 00442 * If queried for an attribute, which is set in the CallForAttributes registry 00443 * value, the function binds to the shellfolder objects and queries it. 00444 */ 00445 BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes) 00446 { 00447 HKEY hSFKey; 00448 LPOLESTR pwszCLSID; 00449 LONG lResult; 00450 DWORD dwTemp, dwLen; 00451 static const WCHAR wszAttributes[] = L"Attributes"; 00452 static const WCHAR wszCallForAttributes[] = L"CallForAttributes"; 00453 WCHAR wszShellFolderKey[] = L"CLSID\\{00021400-0000-0000-C000-000000000046}\\ShellFolder"; 00454 00455 TRACE("(pidlFolder=%p, pdwAttributes=%p)\n", pidlFolder, pdwAttributes); 00456 00457 if (!_ILIsPidlSimple(pidlFolder)) 00458 { 00459 ERR("should be called for simple PIDL's only!\n"); 00460 return FALSE; 00461 } 00462 00463 if (!_ILIsDesktop(pidlFolder)) 00464 { 00465 if (FAILED(StringFromCLSID(*_ILGetGUIDPointer(pidlFolder), &pwszCLSID))) 00466 return FALSE; 00467 memcpy(&wszShellFolderKey[6], pwszCLSID, 38 * sizeof(WCHAR)); 00468 CoTaskMemFree(pwszCLSID); 00469 } 00470 00471 lResult = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszShellFolderKey, 0, KEY_READ, &hSFKey); 00472 if (lResult != ERROR_SUCCESS) 00473 { 00474 ERR("Cannot open key: %ls\n", wszShellFolderKey); 00475 return FALSE; 00476 } 00477 00478 dwLen = sizeof(DWORD); 00479 lResult = RegQueryValueExW(hSFKey, wszCallForAttributes, 0, NULL, (LPBYTE)&dwTemp, &dwLen); 00480 if ((lResult == ERROR_SUCCESS) && (dwTemp & *pdwAttributes)) 00481 { 00482 CComPtr<IShellFolder> psfDesktop; 00483 CComPtr<IShellFolder> psfFolder; 00484 HRESULT hr; 00485 00486 RegCloseKey(hSFKey); 00487 hr = SHGetDesktopFolder(&psfDesktop); 00488 if (SUCCEEDED(hr)) 00489 { 00490 hr = psfDesktop->BindToObject(pidlFolder, NULL, IID_IShellFolder, 00491 (LPVOID*)&psfFolder); 00492 if (SUCCEEDED(hr)) 00493 hr = psfFolder->GetAttributesOf(0, NULL, pdwAttributes); 00494 } 00495 if (FAILED(hr)) 00496 return FALSE; 00497 } 00498 else 00499 { 00500 lResult = RegQueryValueExW(hSFKey, wszAttributes, 0, NULL, (LPBYTE)&dwTemp, &dwLen); 00501 RegCloseKey(hSFKey); 00502 if (lResult == ERROR_SUCCESS) 00503 *pdwAttributes &= dwTemp; 00504 else 00505 return FALSE; 00506 } 00507 00508 TRACE("-- *pdwAttributes == 0x%08x\n", *pdwAttributes); 00509 00510 return TRUE; 00511 } Generated on Sun May 27 2012 04:26:16 for ReactOS by
1.7.6.1
|