ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

classes.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.