Lei Zhang : shlwapi: Refactor get executable code in IQueryAssociations_fnGetString.
Alexandre Julliard
julliard at winehq.org
Tue Oct 14 08:30:19 CDT 2008
Module: wine
Branch: master
Commit: 4e0c0ec1574d7c168a7fce6f3c0369abaeedba1c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e0c0ec1574d7c168a7fce6f3c0369abaeedba1c
Author: Lei Zhang <thestig at google.com>
Date: Mon Oct 13 18:07:15 2008 -0700
shlwapi: Refactor get executable code in IQueryAssociations_fnGetString.
---
dlls/shlwapi/assoc.c | 152 +++++++++++++++++++++++++++-----------------------
1 files changed, 82 insertions(+), 70 deletions(-)
diff --git a/dlls/shlwapi/assoc.c b/dlls/shlwapi/assoc.c
index 0d8baa0..61ac84b 100644
--- a/dlls/shlwapi/assoc.c
+++ b/dlls/shlwapi/assoc.c
@@ -590,6 +590,86 @@ static HRESULT ASSOC_GetValue(HKEY hkey, WCHAR ** pszText)
return S_OK;
}
+static HRESULT ASSOC_GetExecutable(IQueryAssociationsImpl *This,
+ LPCWSTR pszExtra, LPWSTR path,
+ DWORD pathlen, DWORD *len)
+{
+ HKEY hkeyCommand;
+ HKEY hkeyFile;
+ HKEY hkeyShell;
+ HKEY hkeyVerb;
+ HRESULT hr;
+ LONG ret;
+ WCHAR * pszCommand;
+ WCHAR * pszEnd;
+ WCHAR * pszExtraFromReg;
+ WCHAR * pszFileType;
+ WCHAR * pszStart;
+ static const WCHAR commandW[] = { 'c','o','m','m','a','n','d',0 };
+ static const WCHAR shellW[] = { 's','h','e','l','l',0 };
+
+ assert(len);
+
+ hr = ASSOC_GetValue(This->hkeySource, &pszFileType);
+ if (FAILED(hr))
+ return hr;
+ ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, pszFileType, 0, KEY_READ, &hkeyFile);
+ HeapFree(GetProcessHeap(), 0, pszFileType);
+ if (ret != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(ret);
+
+ ret = RegOpenKeyExW(hkeyFile, shellW, 0, KEY_READ, &hkeyShell);
+ RegCloseKey(hkeyFile);
+ if (ret != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(ret);
+
+ if (!pszExtra)
+ {
+ hr = ASSOC_GetValue(hkeyShell, &pszExtraFromReg);
+ if (FAILED(hr))
+ {
+ RegCloseKey(hkeyShell);
+ return hr;
+ }
+ }
+
+ ret = RegOpenKeyExW(hkeyShell, pszExtra ? pszExtra : pszExtraFromReg, 0,
+ KEY_READ, &hkeyVerb);
+ HeapFree(GetProcessHeap(), 0, pszExtraFromReg);
+ RegCloseKey(hkeyShell);
+ if (ret != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(ret);
+
+ ret = RegOpenKeyExW(hkeyVerb, commandW, 0, KEY_READ, &hkeyCommand);
+ RegCloseKey(hkeyVerb);
+ if (ret != ERROR_SUCCESS)
+ return HRESULT_FROM_WIN32(ret);
+ hr = ASSOC_GetValue(hkeyCommand, &pszCommand);
+ RegCloseKey(hkeyCommand);
+ if (FAILED(hr))
+ return hr;
+
+ /* cleanup pszCommand */
+ if (pszCommand[0] == '"')
+ {
+ pszStart = pszCommand + 1;
+ pszEnd = strchrW(pszStart, '"');
+ }
+ else
+ {
+ pszStart = pszCommand;
+ pszEnd = strchrW(pszStart, ' ');
+ }
+ if (pszEnd)
+ *pszEnd = 0;
+
+ *len = SearchPathW(NULL, pszStart, NULL, pathlen, path, NULL);
+ HeapFree(GetProcessHeap(), 0, pszCommand);
+ if (!*len)
+ return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
+ return S_OK;
+}
+
/**************************************************************************
* IQueryAssociations_GetString {SHLWAPI}
*
@@ -617,21 +697,9 @@ static HRESULT WINAPI IQueryAssociations_fnGetString(
{
IQueryAssociationsImpl *This = (IQueryAssociationsImpl *)iface;
const ASSOCF cfUnimplemented = ~(0);
- DWORD len;
- HKEY hkeyCommand;
- HKEY hkeyFile;
- HKEY hkeyShell;
- HKEY hkeyVerb;
+ DWORD len = 0;
HRESULT hr;
- LONG ret;
WCHAR path[MAX_PATH];
- WCHAR * pszCommand;
- WCHAR * pszEnd;
- WCHAR * pszExtraFromReg;
- WCHAR * pszFileType;
- WCHAR * pszStart;
- static const WCHAR commandW[] = { 'c','o','m','m','a','n','d',0 };
- static const WCHAR shellW[] = { 's','h','e','l','l',0 };
TRACE("(%p,0x%8x,0x%8x,%s,%p,%p)\n", This, cfFlags, str,
debugstr_w(pszExtra), pszOut, pcchOut);
@@ -646,65 +714,9 @@ static HRESULT WINAPI IQueryAssociations_fnGetString(
{
case ASSOCSTR_EXECUTABLE:
{
- hr = ASSOC_GetValue(This->hkeySource, &pszFileType);
- if (FAILED(hr))
- return hr;
- ret = RegOpenKeyExW(HKEY_CLASSES_ROOT, pszFileType, 0, KEY_READ,
- &hkeyFile);
- HeapFree(GetProcessHeap(), 0, pszFileType);
- if (ret != ERROR_SUCCESS)
- return HRESULT_FROM_WIN32(ret);
-
- ret = RegOpenKeyExW(hkeyFile, shellW, 0, KEY_READ, &hkeyShell);
- RegCloseKey(hkeyFile);
- if (ret != ERROR_SUCCESS)
- return HRESULT_FROM_WIN32(ret);
-
- if (!pszExtra)
- {
- hr = ASSOC_GetValue(hkeyShell, &pszExtraFromReg);
- if (FAILED(hr))
- {
- RegCloseKey(hkeyShell);
- return hr;
- }
- }
-
- ret = RegOpenKeyExW(hkeyShell, pszExtra ? pszExtra : pszExtraFromReg,
- 0, KEY_READ, &hkeyVerb);
- HeapFree(GetProcessHeap(), 0, pszExtraFromReg);
- RegCloseKey(hkeyShell);
- if (ret != ERROR_SUCCESS)
- return HRESULT_FROM_WIN32(ret);
-
- ret = RegOpenKeyExW(hkeyVerb, commandW, 0, KEY_READ, &hkeyCommand);
- RegCloseKey(hkeyVerb);
- if (ret != ERROR_SUCCESS)
- return HRESULT_FROM_WIN32(ret);
- hr = ASSOC_GetValue(hkeyCommand, &pszCommand);
- RegCloseKey(hkeyCommand);
+ hr = ASSOC_GetExecutable(This, pszExtra, path, MAX_PATH, &len);
if (FAILED(hr))
return hr;
-
- /* cleanup pszCommand */
- if (pszCommand[0] == '"')
- {
- pszStart = pszCommand + 1;
- pszEnd = strchrW(pszStart, '"');
- }
- else
- {
- pszStart = pszCommand;
- pszEnd = strchrW(pszStart, ' ');
- }
- if (pszEnd)
- *pszEnd = 0;
-
- len = SearchPathW(NULL, pszStart, NULL, MAX_PATH, path, NULL);
- HeapFree(GetProcessHeap(), 0, pszCommand);
- if (!len)
- return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
-
len++;
if (pszOut)
{
More information about the wine-cvs
mailing list