[2/2] msi: Preserve existing advertise strings in the PublishComponents action.
Hans Leidekker
hans at codeweavers.com
Thu Feb 10 08:56:41 CST 2011
---
dlls/msi/action.c | 61 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 716a77f..86aa33f 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -5305,13 +5305,14 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param)
{
MSIPACKAGE *package = param;
LPCWSTR compgroupid, component, feature, qualifier, text;
- LPWSTR advertise = NULL, output = NULL;
+ LPWSTR advertise = NULL, output = NULL, existing = NULL, p, q;
HKEY hkey = NULL;
UINT rc;
MSICOMPONENT *comp;
MSIFEATURE *feat;
DWORD sz;
MSIRECORD *uirow;
+ int len;
feature = MSI_RecordGetString(rec, 5);
feat = get_loaded_feature(package, feature);
@@ -5338,30 +5339,56 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param)
rc = MSIREG_OpenUserComponentsKey(compgroupid, &hkey, TRUE);
if (rc != ERROR_SUCCESS)
goto end;
-
- text = MSI_RecordGetString(rec,4);
- advertise = create_component_advertise_string(package, comp, feature);
-
- sz = strlenW(advertise);
+ advertise = create_component_advertise_string( package, comp, feature );
+ text = MSI_RecordGetString( rec, 4 );
if (text)
- sz += lstrlenW(text);
-
- sz+=3;
- sz *= sizeof(WCHAR);
-
- output = msi_alloc_zero(sz);
- strcpyW(output,advertise);
- msi_free(advertise);
+ {
+ p = msi_alloc( (strlenW( advertise ) + strlenW( text ) + 1) * sizeof(WCHAR) );
+ strcpyW( p, advertise );
+ strcatW( p, text );
+ msi_free( advertise );
+ advertise = p;
+ }
+ existing = msi_reg_get_val_str( hkey, qualifier );
- if (text)
- strcatW(output,text);
+ sz = strlenW( advertise ) + 1;
+ if (existing)
+ {
+ for (p = existing; *p; p += len)
+ {
+ len = strlenW( p ) + 1;
+ if (strcmpW( advertise, p )) sz += len;
+ }
+ }
+ if (!(output = msi_alloc( (sz + 1) * sizeof(WCHAR) )))
+ {
+ rc = ERROR_OUTOFMEMORY;
+ goto end;
+ }
+ q = output;
+ if (existing)
+ {
+ for (p = existing; *p; p += len)
+ {
+ len = strlenW( p ) + 1;
+ if (strcmpW( advertise, p ))
+ {
+ memcpy( q, p, len * sizeof(WCHAR) );
+ q += len;
+ }
+ }
+ }
+ strcpyW( q, advertise );
+ q[strlenW( q ) + 1] = 0;
msi_reg_set_val_multi_str( hkey, qualifier, output );
end:
RegCloseKey(hkey);
- msi_free(output);
+ msi_free( output );
+ msi_free( advertise );
+ msi_free( existing );
/* the UI chunk */
uirow = MSI_CreateRecord( 2 );
--
1.7.1
More information about the wine-patches
mailing list