Juan Lang : msi: Split up ACTION_AppSearchReg.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jul 12 14:21:08 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: ab24569b85271ea0b0d14b7f15c5821cdaa9b40c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=ab24569b85271ea0b0d14b7f15c5821cdaa9b40c
Author: Juan Lang <juan_lang at yahoo.com>
Date: Wed Jul 12 09:55:13 2006 -0700
msi: Split up ACTION_AppSearchReg.
---
dlls/msi/appsearch.c | 94 +++++++++++++++++++++++++++-----------------------
1 files changed, 51 insertions(+), 43 deletions(-)
diff --git a/dlls/msi/appsearch.c b/dlls/msi/appsearch.c
index 6f173dc..9a5bec2 100644
--- a/dlls/msi/appsearch.c
+++ b/dlls/msi/appsearch.c
@@ -236,6 +236,54 @@ end:
return rc;
}
+static void ACTION_ConvertRegValue(DWORD regType, const BYTE *value, DWORD sz,
+ LPWSTR *appValue)
+{
+ static const WCHAR dwordFmt[] = { '#','%','d','\0' };
+ static const WCHAR expandSzFmt[] = { '#','%','%','%','s','\0' };
+ static const WCHAR binFmt[] = { '#','x','%','x','\0' };
+ DWORD i;
+
+ switch (regType)
+ {
+ case REG_SZ:
+ if (*(LPWSTR)value == '#')
+ {
+ /* escape leading pound with another */
+ *appValue = msi_alloc(sz + sizeof(WCHAR));
+ (*appValue)[0] = '#';
+ strcpyW(*appValue + 1, (LPCWSTR)value);
+ }
+ else
+ {
+ *appValue = msi_alloc(sz);
+ strcpyW(*appValue, (LPCWSTR)value);
+ }
+ break;
+ case REG_DWORD:
+ /* 7 chars for digits, 1 for NULL, 1 for #, and 1 for sign
+ * char if needed
+ */
+ *appValue = msi_alloc(10 * sizeof(WCHAR));
+ sprintfW(*appValue, dwordFmt, *(const DWORD *)value);
+ break;
+ case REG_EXPAND_SZ:
+ /* space for extra #% characters in front */
+ *appValue = msi_alloc(sz + 2 * sizeof(WCHAR));
+ sprintfW(*appValue, expandSzFmt, (LPCWSTR)value);
+ break;
+ case REG_BINARY:
+ /* 3 == length of "#x<nibble>" */
+ *appValue = msi_alloc((sz * 3 + 1) * sizeof(WCHAR));
+ for (i = 0; i < sz; i++)
+ sprintfW(*appValue + i * 3, binFmt, value[i]);
+ break;
+ default:
+ WARN("unimplemented for values of type %ld\n", regType);
+ *appValue = NULL;
+ }
+}
+
static UINT ACTION_AppSearchReg(MSIPACKAGE *package, BOOL *appFound,
MSISIGNATURE *sig)
{
@@ -247,9 +295,6 @@ static UINT ACTION_AppSearchReg(MSIPACKA
'R','e','g','L','o','c','a','t','o','r',' ',
'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e','_',' ','=',' ',
'\'','%','s','\'',0};
- static const WCHAR dwordFmt[] = { '#','%','d','\0' };
- static const WCHAR expandSzFmt[] = { '#','%','%','%','s','\0' };
- static const WCHAR binFmt[] = { '#','x','%','x','\0' };
TRACE("(package %p, appFound %p, sig %p)\n", package, appFound, sig);
*appFound = FALSE;
@@ -260,7 +305,7 @@ static UINT ACTION_AppSearchReg(MSIPACKA
LPWSTR keyPath = NULL, valueName = NULL, propertyValue = NULL;
int root, type;
HKEY rootKey, key = NULL;
- DWORD sz = 0, regType, i;
+ DWORD sz = 0, regType;
LPBYTE value = NULL;
rc = MSI_ViewExecute(view, 0);
@@ -342,45 +387,8 @@ static UINT ACTION_AppSearchReg(MSIPACKA
rc = ERROR_SUCCESS;
goto end;
}
-
- switch (regType)
- {
- case REG_SZ:
- if (*(LPWSTR)value == '#')
- {
- /* escape leading pound with another */
- propertyValue = msi_alloc( sz + sizeof(WCHAR));
- propertyValue[0] = '#';
- strcpyW(propertyValue + 1, (LPWSTR)value);
- }
- else
- {
- propertyValue = msi_alloc( sz);
- strcpyW(propertyValue, (LPWSTR)value);
- }
- break;
- case REG_DWORD:
- /* 7 chars for digits, 1 for NULL, 1 for #, and 1 for sign
- * char if needed
- */
- propertyValue = msi_alloc( 10 * sizeof(WCHAR));
- sprintfW(propertyValue, dwordFmt, *(DWORD *)value);
- break;
- case REG_EXPAND_SZ:
- /* space for extra #% characters in front */
- propertyValue = msi_alloc( sz + 2 * sizeof(WCHAR));
- sprintfW(propertyValue, expandSzFmt, (LPWSTR)value);
- break;
- case REG_BINARY:
- /* 3 == length of "#x<nibble>" */
- propertyValue = msi_alloc( (sz * 3 + 1) * sizeof(WCHAR));
- for (i = 0; i < sz; i++)
- sprintfW(propertyValue + i * 3, binFmt, value[i]);
- break;
- default:
- WARN("unimplemented for values of type %ld\n", regType);
- goto end;
- }
+
+ ACTION_ConvertRegValue(regType, value, sz, &propertyValue);
TRACE("found registry value, setting %s to %s\n",
debugstr_w(sig->Property), debugstr_w(propertyValue));
More information about the wine-cvs
mailing list