msi: Compare strings without depending on thread locale.
This commit is contained in:
parent
fa5839399f
commit
eaa57c5b7b
|
@ -445,7 +445,7 @@ UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si )
|
||||||
guids = msi_split_string( guid_list, ';' );
|
guids = msi_split_string( guid_list, ';' );
|
||||||
for ( i = 0; guids[i] && ret != ERROR_SUCCESS; i++ )
|
for ( i = 0; guids[i] && ret != ERROR_SUCCESS; i++ )
|
||||||
{
|
{
|
||||||
if (!lstrcmpW( guids[i], product_code ))
|
if (!strcmpW( guids[i], product_code ))
|
||||||
ret = ERROR_SUCCESS;
|
ret = ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
msi_free( guids );
|
msi_free( guids );
|
||||||
|
@ -964,6 +964,9 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param)
|
||||||
MSICOMPONENT *comp;
|
MSICOMPONENT *comp;
|
||||||
|
|
||||||
component = MSI_RecordGetString(row, 2);
|
component = MSI_RecordGetString(row, 2);
|
||||||
|
if (!component)
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
comp = get_loaded_component(package, component);
|
comp = get_loaded_component(package, component);
|
||||||
if (!comp)
|
if (!comp)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
@ -1043,6 +1046,9 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param )
|
||||||
MSICOMPONENT *comp;
|
MSICOMPONENT *comp;
|
||||||
|
|
||||||
component = MSI_RecordGetString(row, 2);
|
component = MSI_RecordGetString(row, 2);
|
||||||
|
if (!component)
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
comp = get_loaded_component(package, component);
|
comp = get_loaded_component(package, component);
|
||||||
if (!comp)
|
if (!comp)
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
@ -1218,7 +1224,7 @@ static MSIFEATURE *find_feature_by_name( MSIPACKAGE *package, LPCWSTR name )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
||||||
{
|
{
|
||||||
if ( !lstrcmpW( feature->Feature, name ) )
|
if ( !strcmpW( feature->Feature, name ) )
|
||||||
return feature;
|
return feature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1515,9 +1521,9 @@ static UINT load_folder( MSIRECORD *row, LPVOID param )
|
||||||
src_long = folder_split_path( src_short, '|' );
|
src_long = folder_split_path( src_short, '|' );
|
||||||
|
|
||||||
/* check for no-op dirs */
|
/* check for no-op dirs */
|
||||||
if (!lstrcmpW(szDot, tgt_short))
|
if (tgt_short && !strcmpW( szDot, tgt_short ))
|
||||||
tgt_short = szEmpty;
|
tgt_short = szEmpty;
|
||||||
if (!lstrcmpW(szDot, src_short))
|
if (src_short && !strcmpW( szDot, src_short ))
|
||||||
src_short = szEmpty;
|
src_short = szEmpty;
|
||||||
|
|
||||||
if (!tgt_long)
|
if (!tgt_long)
|
||||||
|
@ -1690,13 +1696,13 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW(property, szRemove) &&
|
if (strcmpW( property, szRemove ) &&
|
||||||
(feature->Level <= 0 || feature->Level > level))
|
(feature->Level <= 0 || feature->Level > level))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!strcmpW(property, szReinstall)) state = feature->Installed;
|
if (!strcmpW(property, szReinstall)) state = feature->Installed;
|
||||||
|
|
||||||
if (strcmpiW(override, szAll)==0)
|
if (!strcmpiW( override, szAll ))
|
||||||
msi_feature_set_state(package, feature, state);
|
msi_feature_set_state(package, feature, state);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2310,7 +2316,7 @@ static LPSTR parse_value(MSIPACKAGE *package, LPCWSTR value, DWORD *type,
|
||||||
else
|
else
|
||||||
ptr=value;
|
ptr=value;
|
||||||
|
|
||||||
if (strstrW(value,szMulti))
|
if (strstrW(value, szMulti))
|
||||||
*type = REG_MULTI_SZ;
|
*type = REG_MULTI_SZ;
|
||||||
|
|
||||||
/* remove initial delimiter */
|
/* remove initial delimiter */
|
||||||
|
@ -3749,7 +3755,7 @@ static UINT msi_publish_sourcelist(MSIPACKAGE *package, HKEY hkey)
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(info, &package->sourcelist_info, MSISOURCELISTINFO, entry)
|
LIST_FOR_EACH_ENTRY(info, &package->sourcelist_info, MSISOURCELISTINFO, entry)
|
||||||
{
|
{
|
||||||
if (!lstrcmpW(info->property, INSTALLPROPERTY_LASTUSEDSOURCEW))
|
if (!strcmpW( info->property, INSTALLPROPERTY_LASTUSEDSOURCEW ))
|
||||||
msi_set_last_used_source(package->ProductCode, NULL, info->context,
|
msi_set_last_used_source(package->ProductCode, NULL, info->context,
|
||||||
info->options, info->value);
|
info->options, info->value);
|
||||||
else
|
else
|
||||||
|
@ -4852,7 +4858,7 @@ static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove)
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(features[0], szAll))
|
if (!strcmpW( features[0], szAll ))
|
||||||
full_uninstall = TRUE;
|
full_uninstall = TRUE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -5783,7 +5789,7 @@ static MSIFILE *msi_find_file( MSIPACKAGE *package, LPCWSTR filename )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(file, &package->files, MSIFILE, entry)
|
LIST_FOR_EACH_ENTRY(file, &package->files, MSIFILE, entry)
|
||||||
{
|
{
|
||||||
if (!lstrcmpW(file->File, filename))
|
if (!strcmpW( file->File, filename ))
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5795,9 +5801,9 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param )
|
||||||
MSIPACKAGE *package = param;
|
MSIPACKAGE *package = param;
|
||||||
LPWSTR driver, driver_path, ptr;
|
LPWSTR driver, driver_path, ptr;
|
||||||
WCHAR outpath[MAX_PATH];
|
WCHAR outpath[MAX_PATH];
|
||||||
MSIFILE *driver_file, *setup_file;
|
MSIFILE *driver_file = NULL, *setup_file = NULL;
|
||||||
MSIRECORD *uirow;
|
MSIRECORD *uirow;
|
||||||
LPCWSTR desc;
|
LPCWSTR desc, file_key;
|
||||||
DWORD len, usage;
|
DWORD len, usage;
|
||||||
UINT r = ERROR_SUCCESS;
|
UINT r = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
@ -5810,8 +5816,11 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param )
|
||||||
|
|
||||||
desc = MSI_RecordGetString(rec, 3);
|
desc = MSI_RecordGetString(rec, 3);
|
||||||
|
|
||||||
driver_file = msi_find_file(package, MSI_RecordGetString(rec, 4));
|
file_key = MSI_RecordGetString( rec, 4 );
|
||||||
setup_file = msi_find_file(package, MSI_RecordGetString(rec, 5));
|
if (file_key) driver_file = msi_find_file( package, file_key );
|
||||||
|
|
||||||
|
file_key = MSI_RecordGetString( rec, 5 );
|
||||||
|
if (file_key) setup_file = msi_find_file( package, file_key );
|
||||||
|
|
||||||
if (!driver_file)
|
if (!driver_file)
|
||||||
{
|
{
|
||||||
|
@ -5874,9 +5883,9 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param )
|
||||||
MSIPACKAGE *package = param;
|
MSIPACKAGE *package = param;
|
||||||
LPWSTR translator, translator_path, ptr;
|
LPWSTR translator, translator_path, ptr;
|
||||||
WCHAR outpath[MAX_PATH];
|
WCHAR outpath[MAX_PATH];
|
||||||
MSIFILE *translator_file, *setup_file;
|
MSIFILE *translator_file = NULL, *setup_file = NULL;
|
||||||
MSIRECORD *uirow;
|
MSIRECORD *uirow;
|
||||||
LPCWSTR desc;
|
LPCWSTR desc, file_key;
|
||||||
DWORD len, usage;
|
DWORD len, usage;
|
||||||
UINT r = ERROR_SUCCESS;
|
UINT r = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
@ -5887,8 +5896,11 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param )
|
||||||
|
|
||||||
desc = MSI_RecordGetString(rec, 3);
|
desc = MSI_RecordGetString(rec, 3);
|
||||||
|
|
||||||
translator_file = msi_find_file(package, MSI_RecordGetString(rec, 4));
|
file_key = MSI_RecordGetString( rec, 4 );
|
||||||
setup_file = msi_find_file(package, MSI_RecordGetString(rec, 5));
|
if (file_key) translator_file = msi_find_file( package, file_key );
|
||||||
|
|
||||||
|
file_key = MSI_RecordGetString( rec, 5 );
|
||||||
|
if (file_key) setup_file = msi_find_file( package, file_key );
|
||||||
|
|
||||||
if (!translator_file)
|
if (!translator_file)
|
||||||
{
|
{
|
||||||
|
@ -6232,7 +6244,7 @@ static UINT env_parse_flags( LPCWSTR *name, LPCWSTR *value, DWORD *flags )
|
||||||
else if (lstrlenW(*value) >= prefix_len)
|
else if (lstrlenW(*value) >= prefix_len)
|
||||||
{
|
{
|
||||||
ptr += lstrlenW(ptr) - prefix_len;
|
ptr += lstrlenW(ptr) - prefix_len;
|
||||||
if (!lstrcmpW(ptr, prefix))
|
if (!strcmpW( ptr, prefix ))
|
||||||
{
|
{
|
||||||
if ((ptr-1) > *value && *(ptr-1) == szSemiColon[0])
|
if ((ptr-1) > *value && *(ptr-1) == szSemiColon[0])
|
||||||
{
|
{
|
||||||
|
@ -6403,7 +6415,7 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param )
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (flags & ENV_ACT_REMOVEMATCH && (!value || !lstrcmpW(data, value)))
|
if (flags & ENV_ACT_REMOVEMATCH && (!value || !strcmpW( data, value )))
|
||||||
{
|
{
|
||||||
action = 0x4;
|
action = 0x4;
|
||||||
res = RegDeleteValueW(env, name);
|
res = RegDeleteValueW(env, name);
|
||||||
|
@ -6943,7 +6955,7 @@ static BOOL find_assembly(struct list *assemblies, LPCWSTR file, MSIASSEMBLY **o
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(assembly, assemblies, MSIASSEMBLY, entry)
|
LIST_FOR_EACH_ENTRY(assembly, assemblies, MSIASSEMBLY, entry)
|
||||||
{
|
{
|
||||||
if (!lstrcmpW(assembly->file->File, file))
|
if (!strcmpW( assembly->file->File, file ))
|
||||||
{
|
{
|
||||||
*out = assembly;
|
*out = assembly;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -796,8 +796,8 @@ static UINT ACTION_RecurseSearchDirectory(MSIPACKAGE *package, LPWSTR *appValue,
|
||||||
if (hFind != INVALID_HANDLE_VALUE)
|
if (hFind != INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
|
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
|
||||||
lstrcmpW(findData.cFileName, szDot) &&
|
strcmpW( findData.cFileName, szDot ) &&
|
||||||
lstrcmpW(findData.cFileName, szDotDot))
|
strcmpW( findData.cFileName, szDotDot ))
|
||||||
{
|
{
|
||||||
lstrcpyW(subpath, dir);
|
lstrcpyW(subpath, dir);
|
||||||
PathAppendW(subpath, findData.cFileName);
|
PathAppendW(subpath, findData.cFileName);
|
||||||
|
@ -808,8 +808,8 @@ static UINT ACTION_RecurseSearchDirectory(MSIPACKAGE *package, LPWSTR *appValue,
|
||||||
while (rc == ERROR_SUCCESS && !*appValue &&
|
while (rc == ERROR_SUCCESS && !*appValue &&
|
||||||
FindNextFileW(hFind, &findData) != 0)
|
FindNextFileW(hFind, &findData) != 0)
|
||||||
{
|
{
|
||||||
if (!lstrcmpW(findData.cFileName, szDot) ||
|
if (!strcmpW( findData.cFileName, szDot ) ||
|
||||||
!lstrcmpW(findData.cFileName, szDotDot))
|
!strcmpW( findData.cFileName, szDotDot ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lstrcpyW(subpath, dir);
|
lstrcpyW(subpath, dir);
|
||||||
|
|
|
@ -87,7 +87,7 @@ static MSIAPPID *load_given_appid( MSIPACKAGE *package, LPCWSTR name )
|
||||||
/* check for appids already loaded */
|
/* check for appids already loaded */
|
||||||
LIST_FOR_EACH_ENTRY( appid, &package->appids, MSIAPPID, entry )
|
LIST_FOR_EACH_ENTRY( appid, &package->appids, MSIAPPID, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpiW( appid->AppID, name )==0)
|
if (!strcmpiW( appid->AppID, name ))
|
||||||
{
|
{
|
||||||
TRACE("found appid %s %p\n", debugstr_w(name), appid);
|
TRACE("found appid %s %p\n", debugstr_w(name), appid);
|
||||||
return appid;
|
return appid;
|
||||||
|
@ -192,7 +192,7 @@ static MSIPROGID *load_given_progid(MSIPACKAGE *package, LPCWSTR name)
|
||||||
/* check for progids already loaded */
|
/* check for progids already loaded */
|
||||||
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
|
||||||
{
|
{
|
||||||
if (strcmpiW( progid->ProgID,name )==0)
|
if (!strcmpiW( progid->ProgID, name ))
|
||||||
{
|
{
|
||||||
TRACE("found progid %s (%p)\n",debugstr_w(name), progid );
|
TRACE("found progid %s (%p)\n",debugstr_w(name), progid );
|
||||||
return progid;
|
return progid;
|
||||||
|
@ -323,7 +323,7 @@ static MSICLASS *load_given_class(MSIPACKAGE *package, LPCWSTR classid)
|
||||||
/* check for classes already loaded */
|
/* check for classes already loaded */
|
||||||
LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
|
LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpiW( cls->clsid, classid )==0)
|
if (!strcmpiW( cls->clsid, classid ))
|
||||||
{
|
{
|
||||||
TRACE("found class %s (%p)\n",debugstr_w(classid), cls);
|
TRACE("found class %s (%p)\n",debugstr_w(classid), cls);
|
||||||
return cls;
|
return cls;
|
||||||
|
@ -384,7 +384,7 @@ static MSIMIME *load_given_mime( MSIPACKAGE *package, LPCWSTR mime )
|
||||||
/* check for mime already loaded */
|
/* check for mime already loaded */
|
||||||
LIST_FOR_EACH_ENTRY( mt, &package->mimes, MSIMIME, entry )
|
LIST_FOR_EACH_ENTRY( mt, &package->mimes, MSIMIME, entry )
|
||||||
{
|
{
|
||||||
if (strcmpiW(mt->ContentType,mime)==0)
|
if (!strcmpiW( mt->ContentType, mime ))
|
||||||
{
|
{
|
||||||
TRACE("found mime %s (%p)\n",debugstr_w(mime), mt);
|
TRACE("found mime %s (%p)\n",debugstr_w(mime), mt);
|
||||||
return mt;
|
return mt;
|
||||||
|
@ -458,7 +458,7 @@ static MSIEXTENSION *load_given_extension( MSIPACKAGE *package, LPCWSTR name )
|
||||||
/* check for extensions already loaded */
|
/* check for extensions already loaded */
|
||||||
LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
|
LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
|
||||||
{
|
{
|
||||||
if (strcmpiW( ext->Extension, name )==0)
|
if (!strcmpiW( ext->Extension, name ))
|
||||||
{
|
{
|
||||||
TRACE("extension %s already loaded %p\n", debugstr_w(name), ext);
|
TRACE("extension %s already loaded %p\n", debugstr_w(name), ext);
|
||||||
return ext;
|
return ext;
|
||||||
|
@ -578,7 +578,7 @@ static UINT iterate_all_extensions(MSIRECORD *rec, LPVOID param)
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
|
LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
|
||||||
{
|
{
|
||||||
if (strcmpiW(extension,ext->Extension))
|
if (strcmpiW(extension, ext->Extension))
|
||||||
continue;
|
continue;
|
||||||
if (comp == ext->Component)
|
if (comp == ext->Component)
|
||||||
{
|
{
|
||||||
|
|
|
@ -456,26 +456,36 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b )
|
||||||
switch (operator)
|
switch (operator)
|
||||||
{
|
{
|
||||||
case COND_SS:
|
case COND_SS:
|
||||||
return strstrW( a, b ) ? 1 : 0;
|
return strstrW( a, b ) != 0;
|
||||||
case COND_ISS:
|
case COND_ISS:
|
||||||
return strstriW( a, b ) ? 1 : 0;
|
return strstriW( a, b ) != 0;
|
||||||
case COND_LHS:
|
case COND_LHS:
|
||||||
return 0 == strncmpW( a, b, lstrlenW( b ) );
|
{
|
||||||
|
int l = strlenW( a );
|
||||||
|
int r = strlenW( b );
|
||||||
|
if (r > l) return 0;
|
||||||
|
return !strncmpW( a, b, r );
|
||||||
|
}
|
||||||
case COND_RHS:
|
case COND_RHS:
|
||||||
{
|
{
|
||||||
int l = lstrlenW( a );
|
int l = strlenW( a );
|
||||||
int r = lstrlenW( b );
|
int r = strlenW( b );
|
||||||
if (r > l) return 0;
|
if (r > l) return 0;
|
||||||
return 0 == lstrcmpW( a + (l - r), b );
|
return !strncmpW( a + (l - r), b, r );
|
||||||
}
|
}
|
||||||
case COND_ILHS:
|
case COND_ILHS:
|
||||||
return 0 == strncmpiW( a, b, lstrlenW( b ) );
|
{
|
||||||
|
int l = strlenW( a );
|
||||||
|
int r = strlenW( b );
|
||||||
|
if (r > l) return 0;
|
||||||
|
return !strncmpiW( a, b, r );
|
||||||
|
}
|
||||||
case COND_IRHS:
|
case COND_IRHS:
|
||||||
{
|
{
|
||||||
int l = lstrlenW( a );
|
int l = strlenW( a );
|
||||||
int r = lstrlenW( b );
|
int r = strlenW( b );
|
||||||
if (r > l) return 0;
|
if (r > l) return 0;
|
||||||
return 0 == lstrcmpiW( a + (l - r), b );
|
return !strncmpiW( a + (l - r), b, r );
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
ERR("invalid substring operator\n");
|
ERR("invalid substring operator\n");
|
||||||
|
@ -500,29 +510,29 @@ static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
|
||||||
switch (operator)
|
switch (operator)
|
||||||
{
|
{
|
||||||
case COND_LT:
|
case COND_LT:
|
||||||
return -1 == lstrcmpW( a, b );
|
return strcmpW( a, b ) < 0;
|
||||||
case COND_GT:
|
case COND_GT:
|
||||||
return 1 == lstrcmpW( a, b );
|
return strcmpW( a, b ) > 0;
|
||||||
case COND_EQ:
|
case COND_EQ:
|
||||||
return 0 == lstrcmpW( a, b );
|
return strcmpW( a, b ) == 0;
|
||||||
case COND_NE:
|
case COND_NE:
|
||||||
return 0 != lstrcmpW( a, b );
|
return strcmpW( a, b ) != 0;
|
||||||
case COND_GE:
|
case COND_GE:
|
||||||
return -1 != lstrcmpW( a, b );
|
return strcmpW( a, b ) >= 0;
|
||||||
case COND_LE:
|
case COND_LE:
|
||||||
return 1 != lstrcmpW( a, b );
|
return strcmpW( a, b ) <= 0;
|
||||||
case COND_ILT:
|
case COND_ILT:
|
||||||
return -1 == lstrcmpiW( a, b );
|
return strcmpiW( a, b ) < 0;
|
||||||
case COND_IGT:
|
case COND_IGT:
|
||||||
return 1 == lstrcmpiW( a, b );
|
return strcmpiW( a, b ) > 0;
|
||||||
case COND_IEQ:
|
case COND_IEQ:
|
||||||
return 0 == lstrcmpiW( a, b );
|
return strcmpiW( a, b ) == 0;
|
||||||
case COND_INE:
|
case COND_INE:
|
||||||
return 0 != lstrcmpiW( a, b );
|
return strcmpiW( a, b ) != 0;
|
||||||
case COND_IGE:
|
case COND_IGE:
|
||||||
return -1 != lstrcmpiW( a, b );
|
return strcmpiW( a, b ) >= 0;
|
||||||
case COND_ILE:
|
case COND_ILE:
|
||||||
return 1 != lstrcmpiW( a, b );
|
return strcmpiW( a, b ) <= 0;
|
||||||
default:
|
default:
|
||||||
ERR("invalid string operator\n");
|
ERR("invalid string operator\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
#include "msiquery.h"
|
#include "msiquery.h"
|
||||||
#include "objbase.h"
|
#include "objbase.h"
|
||||||
|
@ -153,7 +154,7 @@ static UINT check_columns( const column_info *col_info )
|
||||||
/* check for two columns with the same name */
|
/* check for two columns with the same name */
|
||||||
for( c1 = col_info; c1; c1 = c1->next )
|
for( c1 = col_info; c1; c1 = c1->next )
|
||||||
for( c2 = c1->next; c2; c2 = c2->next )
|
for( c2 = c1->next; c2; c2 = c2->next )
|
||||||
if (!lstrcmpW(c1->column, c2->column))
|
if (!strcmpW( c1->column, c2->column ))
|
||||||
return ERROR_BAD_QUERY_SYNTAX;
|
return ERROR_BAD_QUERY_SYNTAX;
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
|
@ -594,7 +594,7 @@ static void handle_msi_break( LPCWSTR target )
|
||||||
if( !GetEnvironmentVariableW( MsiBreak, val, MAX_PATH ))
|
if( !GetEnvironmentVariableW( MsiBreak, val, MAX_PATH ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( lstrcmpiW( val, target ))
|
if( strcmpiW( val, target ))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msg = msi_alloc( (lstrlenW(format) + 10) * sizeof(WCHAR) );
|
msg = msi_alloc( (lstrlenW(format) + 10) * sizeof(WCHAR) );
|
||||||
|
|
|
@ -79,7 +79,7 @@ static UINT find_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm )
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !lstrcmpW( name, stat.pwcsName ) )
|
if( !strcmpW( name, stat.pwcsName ) )
|
||||||
{
|
{
|
||||||
TRACE("found %s\n", debugstr_w(name));
|
TRACE("found %s\n", debugstr_w(name));
|
||||||
*stm = stream->stm;
|
*stm = stream->stm;
|
||||||
|
@ -1136,7 +1136,7 @@ static UINT MSI_DatabaseExport( MSIDATABASE *db, LPCWSTR table,
|
||||||
if (handle == INVALID_HANDLE_VALUE)
|
if (handle == INVALID_HANDLE_VALUE)
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
if (!lstrcmpW( table, forcecodepage ))
|
if (!strcmpW( table, forcecodepage ))
|
||||||
{
|
{
|
||||||
r = msi_export_forcecodepage( handle );
|
r = msi_export_forcecodepage( handle );
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1319,7 +1319,7 @@ static BOOL merge_type_match(LPCWSTR type1, LPCWSTR type2)
|
||||||
((type2[0] == 'L') || (type2[0] == 'S')))
|
((type2[0] == 'L') || (type2[0] == 'S')))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
return !lstrcmpW(type1, type2);
|
return !strcmpW( type1, type2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT merge_verify_colnames(MSIQUERY *dbview, MSIQUERY *mergeview)
|
static UINT merge_verify_colnames(MSIQUERY *dbview, MSIQUERY *mergeview)
|
||||||
|
@ -1341,8 +1341,7 @@ static UINT merge_verify_colnames(MSIQUERY *dbview, MSIQUERY *mergeview)
|
||||||
if (!MSI_RecordGetString(mergerec, i))
|
if (!MSI_RecordGetString(mergerec, i))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (lstrcmpW(MSI_RecordGetString(dbrec, i),
|
if (strcmpW( MSI_RecordGetString( dbrec, i ), MSI_RecordGetString( mergerec, i ) ))
|
||||||
MSI_RecordGetString(mergerec, i)))
|
|
||||||
{
|
{
|
||||||
r = ERROR_DATATYPE_MISMATCH;
|
r = ERROR_DATATYPE_MISMATCH;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1405,8 +1404,7 @@ static UINT merge_verify_primary_keys(MSIDATABASE *db, MSIDATABASE *mergedb,
|
||||||
|
|
||||||
for (i = 1; i <= count; i++)
|
for (i = 1; i <= count; i++)
|
||||||
{
|
{
|
||||||
if (lstrcmpW(MSI_RecordGetString(dbrec, i),
|
if (strcmpW( MSI_RecordGetString( dbrec, i ), MSI_RecordGetString( mergerec, i ) ))
|
||||||
MSI_RecordGetString(mergerec, i)))
|
|
||||||
{
|
{
|
||||||
r = ERROR_DATATYPE_MISMATCH;
|
r = ERROR_DATATYPE_MISMATCH;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1434,7 +1432,7 @@ static LPWSTR get_key_value(MSIQUERY *view, LPCWSTR key, MSIRECORD *rec)
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
str = msi_dup_record_field(colnames, ++i);
|
str = msi_dup_record_field(colnames, ++i);
|
||||||
cmp = lstrcmpW(key, str);
|
cmp = strcmpW( key, str );
|
||||||
msi_free(str);
|
msi_free(str);
|
||||||
} while (cmp);
|
} while (cmp);
|
||||||
|
|
||||||
|
|
|
@ -578,7 +578,7 @@ static void msi_dialog_update_controls( msi_dialog *dialog, LPCWSTR property )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( control, &dialog->controls, msi_control, entry )
|
LIST_FOR_EACH_ENTRY( control, &dialog->controls, msi_control, entry )
|
||||||
{
|
{
|
||||||
if ( !lstrcmpW( control->property, property ) && control->update )
|
if ( control->property && !strcmpW( control->property, property ) && control->update )
|
||||||
control->update( dialog, control );
|
control->update( dialog, control );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -601,7 +601,7 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
|
||||||
ctrl = msi_dialog_find_control( dialog, control );
|
ctrl = msi_dialog_find_control( dialog, control );
|
||||||
if (!ctrl)
|
if (!ctrl)
|
||||||
return;
|
return;
|
||||||
if( !lstrcmpW(attribute, szText) )
|
if( !strcmpW( attribute, szText ) )
|
||||||
{
|
{
|
||||||
font_text = MSI_RecordGetString( rec , 1 );
|
font_text = MSI_RecordGetString( rec , 1 );
|
||||||
font = msi_dialog_get_style( font_text, &text );
|
font = msi_dialog_get_style( font_text, &text );
|
||||||
|
@ -610,7 +610,7 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
|
||||||
msi_free( font );
|
msi_free( font );
|
||||||
msi_dialog_check_messages( NULL );
|
msi_dialog_check_messages( NULL );
|
||||||
}
|
}
|
||||||
else if( !lstrcmpW(attribute, szProgress) )
|
else if( !strcmpW( attribute, szProgress ) )
|
||||||
{
|
{
|
||||||
DWORD func, val;
|
DWORD func, val;
|
||||||
|
|
||||||
|
@ -640,12 +640,12 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( !lstrcmpW(attribute, szProperty) )
|
else if ( !strcmpW( attribute, szProperty ) )
|
||||||
{
|
{
|
||||||
MSIFEATURE *feature = msi_seltree_get_selected_feature( ctrl );
|
MSIFEATURE *feature = msi_seltree_get_selected_feature( ctrl );
|
||||||
msi_dialog_set_property( dialog->package, ctrl->property, feature->Directory );
|
msi_dialog_set_property( dialog->package, ctrl->property, feature->Directory );
|
||||||
}
|
}
|
||||||
else if ( !lstrcmpW(attribute, szSelectionPath) )
|
else if ( !strcmpW( attribute, szSelectionPath ) )
|
||||||
{
|
{
|
||||||
LPWSTR prop = msi_dialog_dup_property( dialog, ctrl->property, TRUE );
|
LPWSTR prop = msi_dialog_dup_property( dialog, ctrl->property, TRUE );
|
||||||
LPWSTR path;
|
LPWSTR path;
|
||||||
|
@ -1368,7 +1368,7 @@ static void msi_dialog_combobox_update( msi_dialog *dialog,
|
||||||
for (j = 0; j < info->num_items; j++)
|
for (j = 0; j < info->num_items; j++)
|
||||||
{
|
{
|
||||||
tmp = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, j, 0 );
|
tmp = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, j, 0 );
|
||||||
if (!lstrcmpW( value, tmp ))
|
if (!strcmpW( value, tmp ))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1988,7 +1988,7 @@ static UINT msi_dialog_create_radiobutton( MSIRECORD *rec, LPVOID param )
|
||||||
return ERROR_FUNCTION_FAILED;
|
return ERROR_FUNCTION_FAILED;
|
||||||
control->handler = msi_dialog_radiogroup_handler;
|
control->handler = msi_dialog_radiogroup_handler;
|
||||||
|
|
||||||
if (!lstrcmpW(control->name, group->propval))
|
if (!strcmpW( control->name, group->propval ))
|
||||||
SendMessageW(control->hwnd, BM_SETCHECK, BST_CHECKED, 0);
|
SendMessageW(control->hwnd, BM_SETCHECK, BST_CHECKED, 0);
|
||||||
|
|
||||||
prop = MSI_RecordGetString( rec, 1 );
|
prop = MSI_RecordGetString( rec, 1 );
|
||||||
|
@ -2258,7 +2258,7 @@ msi_seltree_add_child_features( MSIPACKAGE *package, HWND hwnd,
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
||||||
{
|
{
|
||||||
if ( lstrcmpW( parent, feature->Feature_Parent ) )
|
if ( strcmpW( parent, feature->Feature_Parent ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( !feature->Title )
|
if ( !feature->Title )
|
||||||
|
@ -2682,7 +2682,7 @@ static void msi_dialog_update_directory_list( msi_dialog *dialog, msi_control *c
|
||||||
if ( wfd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY )
|
if ( wfd.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( !lstrcmpW( wfd.cFileName, szDot ) || !lstrcmpW( wfd.cFileName, szDotDot ) )
|
if ( !strcmpW( wfd.cFileName, szDot ) || !strcmpW( wfd.cFileName, szDotDot ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
item.mask = LVIF_TEXT;
|
item.mask = LVIF_TEXT;
|
||||||
|
@ -2846,7 +2846,7 @@ static void msi_dialog_vcl_add_columns( msi_dialog *dialog, msi_control *control
|
||||||
begin += end - begin + 1;
|
begin += end - begin + 1;
|
||||||
|
|
||||||
/* empty braces or '0' hides the column */
|
/* empty braces or '0' hides the column */
|
||||||
if ( !num[0] || !lstrcmpW( num, szZero ) )
|
if ( !num[0] || !strcmpW( num, szZero ) )
|
||||||
{
|
{
|
||||||
count++;
|
count++;
|
||||||
msi_free( num );
|
msi_free( num );
|
||||||
|
@ -3151,15 +3151,15 @@ static UINT msi_dialog_set_control_condition( MSIRECORD *rec, LPVOID param )
|
||||||
TRACE("%s control %s\n", debugstr_w(action), debugstr_w(name));
|
TRACE("%s control %s\n", debugstr_w(action), debugstr_w(name));
|
||||||
|
|
||||||
/* FIXME: case sensitive? */
|
/* FIXME: case sensitive? */
|
||||||
if(!lstrcmpW(action, szHide))
|
if (!strcmpW( action, szHide ))
|
||||||
ShowWindow(control->hwnd, SW_HIDE);
|
ShowWindow(control->hwnd, SW_HIDE);
|
||||||
else if(!strcmpW(action, szShow))
|
else if (!strcmpW( action, szShow ))
|
||||||
ShowWindow(control->hwnd, SW_SHOW);
|
ShowWindow(control->hwnd, SW_SHOW);
|
||||||
else if(!strcmpW(action, szDisable))
|
else if (!strcmpW( action, szDisable ))
|
||||||
EnableWindow(control->hwnd, FALSE);
|
EnableWindow(control->hwnd, FALSE);
|
||||||
else if(!strcmpW(action, szEnable))
|
else if (!strcmpW( action, szEnable ))
|
||||||
EnableWindow(control->hwnd, TRUE);
|
EnableWindow(control->hwnd, TRUE);
|
||||||
else if(!strcmpW(action, szDefault))
|
else if (!strcmpW( action, szDefault ))
|
||||||
SetFocus(control->hwnd);
|
SetFocus(control->hwnd);
|
||||||
else
|
else
|
||||||
FIXME("Unhandled action %s\n", debugstr_w(action));
|
FIXME("Unhandled action %s\n", debugstr_w(action));
|
||||||
|
@ -4022,11 +4022,11 @@ static UINT error_dialog_handler(MSIPACKAGE *package, LPCWSTR event,
|
||||||
'M','S','I','E','r','r','o','r','D','i','a','l','o','g','R','e','s','u','l','t',0
|
'M','S','I','E','r','r','o','r','D','i','a','l','o','g','R','e','s','u','l','t',0
|
||||||
};
|
};
|
||||||
|
|
||||||
if ( lstrcmpW( event, end_dialog ) )
|
if ( strcmpW( event, end_dialog ) )
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
|
|
||||||
if ( !lstrcmpW( argument, error_abort ) || !lstrcmpW( argument, error_cancel ) ||
|
if ( !strcmpW( argument, error_abort ) || !strcmpW( argument, error_cancel ) ||
|
||||||
!lstrcmpW( argument, error_no ) )
|
!strcmpW( argument, error_no ) )
|
||||||
{
|
{
|
||||||
msi_set_property( package->db, result_prop, error_abort );
|
msi_set_property( package->db, result_prop, error_abort );
|
||||||
}
|
}
|
||||||
|
@ -4108,7 +4108,7 @@ UINT msi_spawn_error_dialog( MSIPACKAGE *package, LPWSTR error_dialog, LPWSTR er
|
||||||
if ( r != ERROR_SUCCESS)
|
if ( r != ERROR_SUCCESS)
|
||||||
r = ERROR_SUCCESS;
|
r = ERROR_SUCCESS;
|
||||||
|
|
||||||
if ( !lstrcmpW( result, error_abort ) )
|
if ( !strcmpW( result, error_abort ) )
|
||||||
r = ERROR_FUNCTION_FAILED;
|
r = ERROR_FUNCTION_FAILED;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
|
|
@ -90,22 +90,18 @@ static UINT event_do_dialog( MSIPACKAGE *package, LPCWSTR name, msi_dialog *pare
|
||||||
static UINT ControlEvent_EndDialog(MSIPACKAGE* package, LPCWSTR argument,
|
static UINT ControlEvent_EndDialog(MSIPACKAGE* package, LPCWSTR argument,
|
||||||
msi_dialog* dialog)
|
msi_dialog* dialog)
|
||||||
{
|
{
|
||||||
static const WCHAR szExit[] = {
|
static const WCHAR szExit[] = {'E','x','i','t',0};
|
||||||
'E','x','i','t',0};
|
static const WCHAR szRetry[] = {'R','e','t','r','y',0};
|
||||||
static const WCHAR szRetry[] = {
|
static const WCHAR szIgnore[] = {'I','g','n','o','r','e',0};
|
||||||
'R','e','t','r','y',0};
|
static const WCHAR szReturn[] = {'R','e','t','u','r','n',0};
|
||||||
static const WCHAR szIgnore[] = {
|
|
||||||
'I','g','n','o','r','e',0};
|
|
||||||
static const WCHAR szReturn[] = {
|
|
||||||
'R','e','t','u','r','n',0};
|
|
||||||
|
|
||||||
if (lstrcmpW(argument,szExit)==0)
|
if (!strcmpW( argument, szExit ))
|
||||||
package->CurrentInstallState = ERROR_INSTALL_USEREXIT;
|
package->CurrentInstallState = ERROR_INSTALL_USEREXIT;
|
||||||
else if (lstrcmpW(argument, szRetry) == 0)
|
else if (!strcmpW( argument, szRetry ))
|
||||||
package->CurrentInstallState = ERROR_INSTALL_SUSPEND;
|
package->CurrentInstallState = ERROR_INSTALL_SUSPEND;
|
||||||
else if (lstrcmpW(argument, szIgnore) == 0)
|
else if (!strcmpW( argument, szIgnore ))
|
||||||
package->CurrentInstallState = ERROR_SUCCESS;
|
package->CurrentInstallState = ERROR_SUCCESS;
|
||||||
else if (lstrcmpW(argument, szReturn) == 0)
|
else if (!strcmpW( argument, szReturn ))
|
||||||
{
|
{
|
||||||
msi_dialog *parent = msi_dialog_get_parent(dialog);
|
msi_dialog *parent = msi_dialog_get_parent(dialog);
|
||||||
msi_free(package->next_dialog);
|
msi_free(package->next_dialog);
|
||||||
|
@ -172,7 +168,7 @@ static UINT ControlEvent_AddLocal(MSIPACKAGE* package, LPCWSTR argument,
|
||||||
{
|
{
|
||||||
MSIFEATURE *feature = NULL;
|
MSIFEATURE *feature = NULL;
|
||||||
|
|
||||||
if (lstrcmpW(szAll,argument))
|
if (strcmpW( szAll, argument ))
|
||||||
{
|
{
|
||||||
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_LOCAL);
|
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_LOCAL);
|
||||||
}
|
}
|
||||||
|
@ -191,7 +187,7 @@ static UINT ControlEvent_Remove(MSIPACKAGE* package, LPCWSTR argument,
|
||||||
{
|
{
|
||||||
MSIFEATURE *feature = NULL;
|
MSIFEATURE *feature = NULL;
|
||||||
|
|
||||||
if (lstrcmpW(szAll,argument))
|
if (strcmpW( szAll, argument ))
|
||||||
{
|
{
|
||||||
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_ABSENT);
|
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_ABSENT);
|
||||||
}
|
}
|
||||||
|
@ -210,7 +206,7 @@ static UINT ControlEvent_AddSource(MSIPACKAGE* package, LPCWSTR argument,
|
||||||
{
|
{
|
||||||
MSIFEATURE *feature = NULL;
|
MSIFEATURE *feature = NULL;
|
||||||
|
|
||||||
if (lstrcmpW(szAll,argument))
|
if (strcmpW( szAll, argument ))
|
||||||
{
|
{
|
||||||
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_SOURCE);
|
MSI_SetFeatureStateW(package,argument,INSTALLSTATE_SOURCE);
|
||||||
}
|
}
|
||||||
|
@ -284,10 +280,9 @@ VOID ControlEvent_FireSubscribedEvent( MSIPACKAGE *package, LPCWSTR event,
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( sub, &package->subscriptions, struct subscriber, entry )
|
LIST_FOR_EACH_ENTRY( sub, &package->subscriptions, struct subscriber, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpiW(sub->event, event))
|
if (strcmpiW( sub->event, event ))
|
||||||
continue;
|
continue;
|
||||||
msi_dialog_handle_event( sub->dialog, sub->control,
|
msi_dialog_handle_event( sub->dialog, sub->control, sub->attribute, rec );
|
||||||
sub->attribute, rec );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,7 +295,7 @@ VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog)
|
||||||
{
|
{
|
||||||
sub = LIST_ENTRY( i, struct subscriber, entry );
|
sub = LIST_ENTRY( i, struct subscriber, entry );
|
||||||
|
|
||||||
if ( lstrcmpW( msi_dialog_get_name( sub->dialog ), dialog ))
|
if (strcmpW( msi_dialog_get_name( sub->dialog ), dialog ))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
list_remove( &sub->entry );
|
list_remove( &sub->entry );
|
||||||
|
@ -441,7 +436,7 @@ UINT ControlEvent_HandleControlEvent(MSIPACKAGE *package, LPCWSTR event,
|
||||||
while( Events[i].event != NULL)
|
while( Events[i].event != NULL)
|
||||||
{
|
{
|
||||||
LPWSTR wevent = strdupAtoW(Events[i].event);
|
LPWSTR wevent = strdupAtoW(Events[i].event);
|
||||||
if (lstrcmpW(wevent,event)==0)
|
if (!strcmpW( wevent, event ))
|
||||||
{
|
{
|
||||||
msi_free(wevent);
|
msi_free(wevent);
|
||||||
rc = Events[i].handler(package,argument,dialog);
|
rc = Events[i].handler(package,argument,dialog);
|
||||||
|
|
|
@ -406,7 +406,7 @@ static BOOL add_wildcard(FILE_LIST *files, LPWSTR source, LPWSTR dest)
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY(file, &files->entry, FILE_LIST, entry)
|
LIST_FOR_EACH_ENTRY(file, &files->entry, FILE_LIST, entry)
|
||||||
{
|
{
|
||||||
if (lstrcmpW(source, file->source) < 0)
|
if (strcmpW( source, file->source ) < 0)
|
||||||
{
|
{
|
||||||
list_add_before(&file->entry, &new->entry);
|
list_add_before(&file->entry, &new->entry);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -104,7 +104,7 @@ MSICOMPONENT* get_loaded_component( MSIPACKAGE* package, LPCWSTR Component )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
|
LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW(Component,comp->Component)==0)
|
if (!strcmpW( Component, comp->Component ))
|
||||||
return comp;
|
return comp;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -116,7 +116,7 @@ MSIFEATURE* get_loaded_feature(MSIPACKAGE* package, LPCWSTR Feature )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW( Feature, feature->Feature )==0)
|
if (!strcmpW( Feature, feature->Feature ))
|
||||||
return feature;
|
return feature;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -128,7 +128,7 @@ MSIFILE* get_loaded_file( MSIPACKAGE* package, LPCWSTR key )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW( key, file->File )==0)
|
if (!strcmpW( key, file->File ))
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -141,7 +141,7 @@ int track_tempfile( MSIPACKAGE *package, LPCWSTR path )
|
||||||
TRACE("%s\n", debugstr_w(path));
|
TRACE("%s\n", debugstr_w(path));
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( temp, &package->tempfiles, MSITEMPFILE, entry )
|
LIST_FOR_EACH_ENTRY( temp, &package->tempfiles, MSITEMPFILE, entry )
|
||||||
if (!lstrcmpW( path, temp->Path ))
|
if (!strcmpW( path, temp->Path ))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
temp = msi_alloc_zero( sizeof (MSITEMPFILE) );
|
temp = msi_alloc_zero( sizeof (MSITEMPFILE) );
|
||||||
|
@ -160,7 +160,7 @@ MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir )
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( folder, &package->folders, MSIFOLDER, entry )
|
LIST_FOR_EACH_ENTRY( folder, &package->folders, MSIFOLDER, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW( dir, folder->Directory )==0)
|
if (!strcmpW( dir, folder->Directory ))
|
||||||
return folder;
|
return folder;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -262,7 +262,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
|
||||||
if (!name)
|
if (!name)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!lstrcmpW(name,cszSourceDir))
|
if (!strcmpW( name, cszSourceDir ))
|
||||||
name = cszTargetDir;
|
name = cszTargetDir;
|
||||||
|
|
||||||
f = get_loaded_folder( package, name );
|
f = get_loaded_folder( package, name );
|
||||||
|
@ -270,7 +270,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* special resolving for Target and Source root dir */
|
/* special resolving for Target and Source root dir */
|
||||||
if (!strcmpW(name,cszTargetDir))
|
if (!strcmpW( name, cszTargetDir ))
|
||||||
{
|
{
|
||||||
if (!f->ResolvedTarget && !f->Property)
|
if (!f->ResolvedTarget && !f->Property)
|
||||||
{
|
{
|
||||||
|
@ -286,7 +286,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
|
||||||
/* correct misbuilt target dir */
|
/* correct misbuilt target dir */
|
||||||
path = build_directory_name(2, check_path, NULL);
|
path = build_directory_name(2, check_path, NULL);
|
||||||
clean_spaces_from_path( path );
|
clean_spaces_from_path( path );
|
||||||
if (strcmpiW(path,check_path)!=0)
|
if (strcmpiW( path, check_path ))
|
||||||
msi_set_property( package->db, cszTargetDir, path );
|
msi_set_property( package->db, cszTargetDir, path );
|
||||||
msi_free(check_path);
|
msi_free(check_path);
|
||||||
|
|
||||||
|
@ -561,7 +561,7 @@ void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record)
|
||||||
MSIRECORD * row = 0;
|
MSIRECORD * row = 0;
|
||||||
DWORD size;
|
DWORD size;
|
||||||
|
|
||||||
if (!package->LastAction || strcmpW(package->LastAction,action))
|
if (!package->LastAction || strcmpW(package->LastAction, action))
|
||||||
{
|
{
|
||||||
row = MSI_QueryGetRecord(package->db, Query_t, action);
|
row = MSI_QueryGetRecord(package->db, Query_t, action);
|
||||||
if (!row)
|
if (!row)
|
||||||
|
@ -747,7 +747,7 @@ BOOL check_unique_action(const MSIPACKAGE *package, LPCWSTR action)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
for (i = 0; i < package->script->UniqueActionsCount; i++)
|
for (i = 0; i < package->script->UniqueActionsCount; i++)
|
||||||
if (!strcmpW(package->script->UniqueActions[i],action))
|
if (!strcmpW(package->script->UniqueActions[i], action))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
#include "msiquery.h"
|
#include "msiquery.h"
|
||||||
#include "objbase.h"
|
#include "objbase.h"
|
||||||
|
@ -117,7 +118,7 @@ static BOOL msi_columns_in_order(MSIINSERTVIEW *iv, UINT col_count)
|
||||||
iv->sv->ops->get_column_info(iv->sv, i, &a, NULL, NULL, NULL);
|
iv->sv->ops->get_column_info(iv->sv, i, &a, NULL, NULL, NULL);
|
||||||
iv->table->ops->get_column_info(iv->table, i, &b, NULL, NULL, NULL);
|
iv->table->ops->get_column_info(iv->table, i, &b, NULL, NULL, NULL);
|
||||||
|
|
||||||
res = lstrcmpW(a, b);
|
res = strcmpW( a, b );
|
||||||
msi_free(a);
|
msi_free(a);
|
||||||
msi_free(b);
|
msi_free(b);
|
||||||
|
|
||||||
|
@ -168,7 +169,7 @@ static UINT msi_arrange_record(MSIINSERTVIEW *iv, MSIRECORD **values)
|
||||||
if (r != ERROR_SUCCESS)
|
if (r != ERROR_SUCCESS)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
res = lstrcmpW(a, b);
|
res = strcmpW( a, b );
|
||||||
msi_free(b);
|
msi_free(b);
|
||||||
|
|
||||||
if (res == 0)
|
if (res == 0)
|
||||||
|
|
|
@ -519,7 +519,7 @@ UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
|
||||||
msi_free(folder->Property);
|
msi_free(folder->Property);
|
||||||
folder->Property = build_directory_name(2, szFolderPath, NULL);
|
folder->Property = build_directory_name(2, szFolderPath, NULL);
|
||||||
|
|
||||||
if (lstrcmpiW(path, folder->Property) == 0)
|
if (!strcmpiW( path, folder->Property ))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Resolved Target has not really changed, so just
|
* Resolved Target has not really changed, so just
|
||||||
|
@ -828,7 +828,7 @@ UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE* package, LPCWSTR szFeature,
|
||||||
/* update all the features that are children of this feature */
|
/* update all the features that are children of this feature */
|
||||||
LIST_FOR_EACH_ENTRY( child, &package->features, MSIFEATURE, entry )
|
LIST_FOR_EACH_ENTRY( child, &package->features, MSIFEATURE, entry )
|
||||||
{
|
{
|
||||||
if (lstrcmpW(szFeature, child->Feature_Parent) == 0)
|
if (child->Feature_Parent && !strcmpW( szFeature, child->Feature_Parent ))
|
||||||
MSI_SetFeatureStateW(package, child->Feature, iState);
|
MSI_SetFeatureStateW(package, child->Feature, iState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ static BOOL source_matches_volume(MSIMEDIAINFO *mi, LPCWSTR source_root)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return !lstrcmpW(mi->volume_label, volume_name);
|
return !strcmpW( mi->volume_label, volume_name );
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
|
static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
|
||||||
|
@ -331,7 +331,7 @@ static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lstrcmpiW(mi->cabinet, cab))
|
if (strcmpiW( mi->cabinet, cab ))
|
||||||
{
|
{
|
||||||
ERR("Continuous cabinet does not match the next cabinet in the Media table\n");
|
ERR("Continuous cabinet does not match the next cabinet in the Media table\n");
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -841,7 +841,7 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
|
||||||
|
|
||||||
/* check volume matches, change media if not */
|
/* check volume matches, change media if not */
|
||||||
if (mi->volume_label && mi->disk_id > 1 &&
|
if (mi->volume_label && mi->disk_id > 1 &&
|
||||||
lstrcmpW(mi->first_volume, mi->volume_label))
|
strcmpW( mi->first_volume, mi->volume_label ))
|
||||||
{
|
{
|
||||||
LPWSTR source = msi_dup_property(package->db, cszSourceDir);
|
LPWSTR source = msi_dup_property(package->db, cszSourceDir);
|
||||||
BOOL matches;
|
BOOL matches;
|
||||||
|
|
138
dlls/msi/msi.c
138
dlls/msi/msi.c
|
@ -983,22 +983,22 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
|
|
||||||
MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
|
MSIREG_OpenInstallProps(szProduct, context, NULL, &userdata, FALSE);
|
||||||
|
|
||||||
if (!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPLINKW) ||
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_HELPLINKW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_HELPTELEPHONEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_HELPTELEPHONEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTALLDATEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLDATEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTALLLOCATIONW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLLOCATIONW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTALLSOURCEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLSOURCEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_LOCALPACKAGEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_LOCALPACKAGEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PUBLISHERW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PUBLISHERW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_URLINFOABOUTW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_URLINFOABOUTW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_URLUPDATEINFOW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_URLUPDATEINFOW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONMINORW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_VERSIONMINORW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONMAJORW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_VERSIONMAJORW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONSTRINGW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_VERSIONSTRINGW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PRODUCTIDW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PRODUCTIDW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_REGCOMPANYW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_REGCOMPANYW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_REGOWNERW))
|
!strcmpW( szAttribute, INSTALLPROPERTY_REGOWNERW ))
|
||||||
{
|
{
|
||||||
if (!prodkey)
|
if (!prodkey)
|
||||||
{
|
{
|
||||||
|
@ -1009,25 +1009,25 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
if (!userdata)
|
if (!userdata)
|
||||||
return ERROR_UNKNOWN_PROPERTY;
|
return ERROR_UNKNOWN_PROPERTY;
|
||||||
|
|
||||||
if (!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW))
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ))
|
||||||
szAttribute = display_name;
|
szAttribute = display_name;
|
||||||
else if (!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONSTRINGW))
|
else if (!strcmpW( szAttribute, INSTALLPROPERTY_VERSIONSTRINGW ))
|
||||||
szAttribute = display_version;
|
szAttribute = display_version;
|
||||||
|
|
||||||
val = msi_reg_get_value(userdata, szAttribute, &type);
|
val = msi_reg_get_value(userdata, szAttribute, &type);
|
||||||
if (!val)
|
if (!val)
|
||||||
val = empty;
|
val = empty;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szAttribute, INSTALLPROPERTY_INSTANCETYPEW) ||
|
else if (!strcmpW( szAttribute, INSTALLPROPERTY_INSTANCETYPEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_TRANSFORMSW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_TRANSFORMSW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_LANGUAGEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_LANGUAGEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PRODUCTNAMEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PRODUCTNAMEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGECODEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PACKAGECODEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_VERSIONW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_VERSIONW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PRODUCTICONW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PRODUCTICONW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGENAMEW) ||
|
!strcmpW( szAttribute, INSTALLPROPERTY_PACKAGENAMEW ) ||
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_AUTHORIZED_LUA_APPW))
|
!strcmpW( szAttribute, INSTALLPROPERTY_AUTHORIZED_LUA_APPW ))
|
||||||
{
|
{
|
||||||
if (!prodkey)
|
if (!prodkey)
|
||||||
{
|
{
|
||||||
|
@ -1035,10 +1035,10 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW))
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_ASSIGNMENTTYPEW ))
|
||||||
szAttribute = assignment;
|
szAttribute = assignment;
|
||||||
|
|
||||||
if (!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGENAMEW))
|
if (!strcmpW( szAttribute, INSTALLPROPERTY_PACKAGENAMEW ))
|
||||||
{
|
{
|
||||||
res = RegOpenKeyW(prodkey, sourcelist, &source);
|
res = RegOpenKeyW(prodkey, sourcelist, &source);
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS)
|
||||||
|
@ -1061,7 +1061,7 @@ static UINT MSI_GetProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val != empty && type != REG_DWORD &&
|
if (val != empty && type != REG_DWORD &&
|
||||||
!lstrcmpW(szAttribute, INSTALLPROPERTY_PACKAGECODEW))
|
!strcmpW( szAttribute, INSTALLPROPERTY_PACKAGECODEW ))
|
||||||
{
|
{
|
||||||
if (lstrlenW(val) != SQUISH_GUID_SIZE - 1)
|
if (lstrlenW(val) != SQUISH_GUID_SIZE - 1)
|
||||||
badconfig = TRUE;
|
badconfig = TRUE;
|
||||||
|
@ -1324,23 +1324,23 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_HELPLINKW) ||
|
if (!strcmpW( szProperty, INSTALLPROPERTY_HELPLINKW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_HELPTELEPHONEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_HELPTELEPHONEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLDATEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_INSTALLDATEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLLOCATIONW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_INSTALLLOCATIONW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLSOURCEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_INSTALLSOURCEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_LOCALPACKAGEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_LOCALPACKAGEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PUBLISHERW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PUBLISHERW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_URLINFOABOUTW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_URLINFOABOUTW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_URLUPDATEINFOW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_URLUPDATEINFOW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_VERSIONMINORW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_VERSIONMINORW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_VERSIONMAJORW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_VERSIONMAJORW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_VERSIONSTRINGW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_VERSIONSTRINGW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PRODUCTIDW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PRODUCTIDW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_REGCOMPANYW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_REGCOMPANYW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_REGOWNERW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_REGOWNERW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_INSTANCETYPEW))
|
!strcmpW( szProperty, INSTALLPROPERTY_INSTANCETYPEW ))
|
||||||
{
|
{
|
||||||
val = msi_reg_get_value(props, package, &type);
|
val = msi_reg_get_value(props, package, &type);
|
||||||
if (!val)
|
if (!val)
|
||||||
|
@ -1353,9 +1353,9 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
|
|
||||||
msi_free(val);
|
msi_free(val);
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_INSTALLEDPRODUCTNAMEW ))
|
||||||
szProperty = displayname;
|
szProperty = displayname;
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_VERSIONSTRINGW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_VERSIONSTRINGW ))
|
||||||
szProperty = displayversion;
|
szProperty = displayversion;
|
||||||
|
|
||||||
val = msi_reg_get_value(props, szProperty, &type);
|
val = msi_reg_get_value(props, szProperty, &type);
|
||||||
|
@ -1364,14 +1364,14 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
|
|
||||||
r = msi_copy_outval(val, szValue, pcchValue);
|
r = msi_copy_outval(val, szValue, pcchValue);
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_TRANSFORMSW) ||
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_TRANSFORMSW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_LANGUAGEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_LANGUAGEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PRODUCTNAMEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PRODUCTNAMEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PACKAGECODEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PACKAGECODEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_VERSIONW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_VERSIONW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PRODUCTICONW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PRODUCTICONW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PACKAGENAMEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PACKAGENAMEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_AUTHORIZED_LUA_APPW))
|
!strcmpW( szProperty, INSTALLPROPERTY_AUTHORIZED_LUA_APPW ))
|
||||||
{
|
{
|
||||||
if (!prod && !classes)
|
if (!prod && !classes)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1389,7 +1389,7 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
|
|
||||||
r = msi_copy_outval(val, szValue, pcchValue);
|
r = msi_copy_outval(val, szValue, pcchValue);
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_PRODUCTSTATEW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_PRODUCTSTATEW ))
|
||||||
{
|
{
|
||||||
if (dwContext == MSIINSTALLCONTEXT_MACHINE)
|
if (dwContext == MSIINSTALLCONTEXT_MACHINE)
|
||||||
{
|
{
|
||||||
|
@ -1423,7 +1423,7 @@ UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
|
|
||||||
r = msi_copy_outval(val, szValue, pcchValue);
|
r = msi_copy_outval(val, szValue, pcchValue);
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_ASSIGNMENTTYPEW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_ASSIGNMENTTYPEW ))
|
||||||
{
|
{
|
||||||
if (!prod && !classes)
|
if (!prod && !classes)
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1554,7 +1554,7 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode,
|
||||||
if (dwContext == MSIINSTALLCONTEXT_MACHINE && szUserSid)
|
if (dwContext == MSIINSTALLCONTEXT_MACHINE && szUserSid)
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (!lstrcmpW(szUserSid, szLocalSid))
|
if (szUserSid && !strcmpW( szUserSid, szLocalSid ))
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (MSIREG_OpenUserDataProductKey(szProductCode, dwContext, NULL,
|
if (MSIREG_OpenUserDataProductKey(szProductCode, dwContext, NULL,
|
||||||
|
@ -1575,7 +1575,7 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode,
|
||||||
if (res != ERROR_SUCCESS)
|
if (res != ERROR_SUCCESS)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_TRANSFORMSW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_TRANSFORMSW ))
|
||||||
{
|
{
|
||||||
if (MSIREG_OpenProductKey(szProductCode, NULL, dwContext,
|
if (MSIREG_OpenProductKey(szProductCode, NULL, dwContext,
|
||||||
&prod, FALSE) != ERROR_SUCCESS)
|
&prod, FALSE) != ERROR_SUCCESS)
|
||||||
|
@ -1594,25 +1594,25 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode,
|
||||||
&udpatch, FALSE) != ERROR_SUCCESS)
|
&udpatch, FALSE) != ERROR_SUCCESS)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_LOCALPACKAGEW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_LOCALPACKAGEW ))
|
||||||
{
|
{
|
||||||
if (dwContext == MSIINSTALLCONTEXT_USERMANAGED)
|
if (dwContext == MSIINSTALLCONTEXT_USERMANAGED)
|
||||||
szProperty = szManagedPackage;
|
szProperty = szManagedPackage;
|
||||||
datakey = udpatch;
|
datakey = udpatch;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_INSTALLDATEW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_INSTALLDATEW ))
|
||||||
{
|
{
|
||||||
datakey = patch;
|
datakey = patch;
|
||||||
szProperty = szInstalled;
|
szProperty = szInstalled;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_LOCALPACKAGEW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_LOCALPACKAGEW ))
|
||||||
{
|
{
|
||||||
datakey = udpatch;
|
datakey = udpatch;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_UNINSTALLABLEW) ||
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_UNINSTALLABLEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_PATCHSTATEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_PATCHSTATEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_DISPLAYNAMEW) ||
|
!strcmpW( szProperty, INSTALLPROPERTY_DISPLAYNAMEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_MOREINFOURLW))
|
!strcmpW( szProperty, INSTALLPROPERTY_MOREINFOURLW ))
|
||||||
{
|
{
|
||||||
datakey = patch;
|
datakey = patch;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1151,6 +1151,8 @@ static const WCHAR szIntel64[] = {'I','n','t','e','l','6','4',0};
|
||||||
static const WCHAR szX64[] = {'x','6','4',0};
|
static const WCHAR szX64[] = {'x','6','4',0};
|
||||||
static const WCHAR szWow6432NodeCLSID[] = {'W','o','w','6','4','3','2','N','o','d','e','\\','C','L','S','I','D',0};
|
static const WCHAR szWow6432NodeCLSID[] = {'W','o','w','6','4','3','2','N','o','d','e','\\','C','L','S','I','D',0};
|
||||||
static const WCHAR szWow6432Node[] = {'W','o','w','6','4','3','2','N','o','d','e',0};
|
static const WCHAR szWow6432Node[] = {'W','o','w','6','4','3','2','N','o','d','e',0};
|
||||||
|
static const WCHAR szStreams[] = {'_','S','t','r','e','a','m','s',0};
|
||||||
|
static const WCHAR szStorages[] = {'_','S','t','o','r','a','g','e','s',0};
|
||||||
|
|
||||||
/* memory allocation macro functions */
|
/* memory allocation macro functions */
|
||||||
static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
|
static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
|
||||||
|
|
|
@ -75,9 +75,9 @@ UINT VIEW_find_column( MSIVIEW *table, LPCWSTR name, LPCWSTR table_name, UINT *n
|
||||||
NULL, &haystack_table_name );
|
NULL, &haystack_table_name );
|
||||||
if( r != ERROR_SUCCESS )
|
if( r != ERROR_SUCCESS )
|
||||||
return r;
|
return r;
|
||||||
x = lstrcmpW( name, col_name );
|
x = strcmpW( name, col_name );
|
||||||
if( table_name )
|
if( table_name )
|
||||||
x |= lstrcmpW( table_name, haystack_table_name );
|
x |= strcmpW( table_name, haystack_table_name );
|
||||||
msi_free( col_name );
|
msi_free( col_name );
|
||||||
msi_free( haystack_table_name );
|
msi_free( haystack_table_name );
|
||||||
if( !x )
|
if( !x )
|
||||||
|
|
|
@ -511,7 +511,7 @@ static LPWSTR get_fusion_filename(MSIPACKAGE *package)
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
/* verify existence of fusion.dll .Net 3.0 does not install a new one */
|
/* verify existence of fusion.dll .Net 3.0 does not install a new one */
|
||||||
if (lstrcmpW(ver, name) < 0)
|
if (strcmpW( ver, name ) < 0)
|
||||||
{
|
{
|
||||||
LPWSTR check;
|
LPWSTR check;
|
||||||
size = lstrlenW(windir) + lstrlenW(subdir) + lstrlenW(name) +lstrlenW(fusion) + 3;
|
size = lstrlenW(windir) + lstrlenW(subdir) + lstrlenW(name) +lstrlenW(fusion) + 3;
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
#include "msiquery.h"
|
#include "msiquery.h"
|
||||||
#include "msipriv.h"
|
#include "msipriv.h"
|
||||||
|
@ -1016,7 +1017,7 @@ BOOL MSI_RecordsAreEqual(MSIRECORD *a, MSIRECORD *b)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSIFIELD_WSTR:
|
case MSIFIELD_WSTR:
|
||||||
if (lstrcmpW(a->fields[i].u.szwVal, b->fields[i].u.szwVal))
|
if (strcmpW(a->fields[i].u.szwVal, b->fields[i].u.szwVal))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -2140,7 +2140,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
|
||||||
if (!szProductCode || !squash_guid(szProductCode, squished_pc))
|
if (!szProductCode || !squash_guid(szProductCode, squished_pc))
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (!lstrcmpW(szUserSid, szLocalSid))
|
if (szUserSid && !strcmpW( szUserSid, szLocalSid ))
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (dwContext & MSIINSTALLCONTEXT_MACHINE && szUserSid)
|
if (dwContext & MSIINSTALLCONTEXT_MACHINE && szUserSid)
|
||||||
|
|
|
@ -592,8 +592,8 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW) ||
|
if (!strcmpW( szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_DISKPROMPTW))
|
!strcmpW( szProperty, INSTALLPROPERTY_DISKPROMPTW ))
|
||||||
{
|
{
|
||||||
rc = OpenMediaSubkey(sourcekey, &media, FALSE);
|
rc = OpenMediaSubkey(sourcekey, &media, FALSE);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
|
@ -602,14 +602,14 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW ))
|
||||||
szProperty = mediapack;
|
szProperty = mediapack;
|
||||||
|
|
||||||
RegQueryValueExW(media, szProperty, 0, 0, (LPBYTE)szValue, pcchValue);
|
RegQueryValueExW(media, szProperty, 0, 0, (LPBYTE)szValue, pcchValue);
|
||||||
RegCloseKey(media);
|
RegCloseKey(media);
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW) ||
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDTYPEW))
|
!strcmpW( szProperty, INSTALLPROPERTY_LASTUSEDTYPEW ))
|
||||||
{
|
{
|
||||||
rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW,
|
rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_LASTUSEDSOURCEW,
|
||||||
0, 0, NULL, &size);
|
0, 0, NULL, &size);
|
||||||
|
@ -630,7 +630,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDTYPEW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_LASTUSEDTYPEW ))
|
||||||
{
|
{
|
||||||
if (*source != 'n' && *source != 'u' && *source != 'm')
|
if (*source != 'n' && *source != 'u' && *source != 'm')
|
||||||
{
|
{
|
||||||
|
@ -662,7 +662,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
*pcchValue = lstrlenW(ptr);
|
*pcchValue = lstrlenW(ptr);
|
||||||
msi_free(source);
|
msi_free(source);
|
||||||
}
|
}
|
||||||
else if (strcmpW(INSTALLPROPERTY_PACKAGENAMEW, szProperty)==0)
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_PACKAGENAMEW ))
|
||||||
{
|
{
|
||||||
*pcchValue = *pcchValue * sizeof(WCHAR);
|
*pcchValue = *pcchValue * sizeof(WCHAR);
|
||||||
rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_PACKAGENAMEW, 0, 0,
|
rc = RegQueryValueExW(sourcekey, INSTALLPROPERTY_PACKAGENAMEW, 0, 0,
|
||||||
|
@ -815,22 +815,22 @@ UINT WINAPI MsiSourceListSetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
}
|
}
|
||||||
|
|
||||||
property = szProperty;
|
property = szProperty;
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW))
|
if (!strcmpW( szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW ))
|
||||||
property = media_package;
|
property = media_package;
|
||||||
|
|
||||||
rc = OpenSourceKey(szProduct, &sourcekey, MSICODE_PRODUCT, dwContext, FALSE);
|
rc = OpenSourceKey(szProduct, &sourcekey, MSICODE_PRODUCT, dwContext, FALSE);
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
if (lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW) &&
|
if (strcmpW( szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW ) &&
|
||||||
dwOptions & (MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL))
|
dwOptions & (MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL))
|
||||||
{
|
{
|
||||||
RegCloseKey(sourcekey);
|
RegCloseKey(sourcekey);
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lstrcmpW(szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW) ||
|
if (!strcmpW( szProperty, INSTALLPROPERTY_MEDIAPACKAGEPATHW ) ||
|
||||||
!lstrcmpW(szProperty, INSTALLPROPERTY_DISKPROMPTW))
|
!strcmpW( szProperty, INSTALLPROPERTY_DISKPROMPTW ))
|
||||||
{
|
{
|
||||||
rc = OpenMediaSubkey(sourcekey, &media, TRUE);
|
rc = OpenMediaSubkey(sourcekey, &media, TRUE);
|
||||||
if (rc == ERROR_SUCCESS)
|
if (rc == ERROR_SUCCESS)
|
||||||
|
@ -839,7 +839,7 @@ UINT WINAPI MsiSourceListSetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
RegCloseKey(media);
|
RegCloseKey(media);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcmpW(INSTALLPROPERTY_PACKAGENAMEW, szProperty)==0)
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_PACKAGENAMEW ))
|
||||||
{
|
{
|
||||||
DWORD size = (lstrlenW(szValue) + 1) * sizeof(WCHAR);
|
DWORD size = (lstrlenW(szValue) + 1) * sizeof(WCHAR);
|
||||||
rc = RegSetValueExW(sourcekey, INSTALLPROPERTY_PACKAGENAMEW, 0,
|
rc = RegSetValueExW(sourcekey, INSTALLPROPERTY_PACKAGENAMEW, 0,
|
||||||
|
@ -847,7 +847,7 @@ UINT WINAPI MsiSourceListSetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid,
|
||||||
if (rc != ERROR_SUCCESS)
|
if (rc != ERROR_SUCCESS)
|
||||||
rc = ERROR_UNKNOWN_PROPERTY;
|
rc = ERROR_UNKNOWN_PROPERTY;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW(szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW))
|
else if (!strcmpW( szProperty, INSTALLPROPERTY_LASTUSEDSOURCEW ))
|
||||||
{
|
{
|
||||||
if (!(dwOptions & (MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL)))
|
if (!(dwOptions & (MSISOURCETYPE_NETWORK | MSISOURCETYPE_URL)))
|
||||||
rc = ERROR_INVALID_PARAMETER;
|
rc = ERROR_INVALID_PARAMETER;
|
||||||
|
|
|
@ -950,7 +950,7 @@ static BOOL SQL_MarkPrimaryKeys( column_info **cols,
|
||||||
found = FALSE;
|
found = FALSE;
|
||||||
for( c = *cols, idx = 0; c && !found; c = c->next, idx++ )
|
for( c = *cols, idx = 0; c && !found; c = c->next, idx++ )
|
||||||
{
|
{
|
||||||
if( lstrcmpW( k->column, c->column ) )
|
if( strcmpW( k->column, c->column ) )
|
||||||
continue;
|
continue;
|
||||||
c->type |= MSITYPE_KEY;
|
c->type |= MSITYPE_KEY;
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
|
|
|
@ -162,7 +162,7 @@ static int find_insert_index( const string_table *st, UINT string_id )
|
||||||
while (low <= high)
|
while (low <= high)
|
||||||
{
|
{
|
||||||
i = (low + high) / 2;
|
i = (low + high) / 2;
|
||||||
c = lstrcmpW( st->strings[string_id].str, st->strings[st->sorted[i]].str );
|
c = strcmpW( st->strings[string_id].str, st->strings[st->sorted[i]].str );
|
||||||
|
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
high = i - 1;
|
high = i - 1;
|
||||||
|
@ -402,7 +402,7 @@ UINT msi_string2idW( const string_table *st, LPCWSTR str, UINT *id )
|
||||||
while (low <= high)
|
while (low <= high)
|
||||||
{
|
{
|
||||||
i = (low + high) / 2;
|
i = (low + high) / 2;
|
||||||
c = lstrcmpW( str, st->strings[st->sorted[i]].str );
|
c = strcmpW( str, st->strings[st->sorted[i]].str );
|
||||||
|
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
high = i - 1;
|
high = i - 1;
|
||||||
|
|
|
@ -512,7 +512,7 @@ static MSITABLE *find_cached_table( MSIDATABASE *db, LPCWSTR name )
|
||||||
MSITABLE *t;
|
MSITABLE *t;
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY( t, &db->tables, MSITABLE, entry )
|
LIST_FOR_EACH_ENTRY( t, &db->tables, MSITABLE, entry )
|
||||||
if( !lstrcmpW( name, t->name ) )
|
if( !strcmpW( name, t->name ) )
|
||||||
return t;
|
return t;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -731,7 +731,7 @@ static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret )
|
||||||
table->persistent = MSICONDITION_TRUE;
|
table->persistent = MSICONDITION_TRUE;
|
||||||
lstrcpyW( table->name, name );
|
lstrcpyW( table->name, name );
|
||||||
|
|
||||||
if ( !lstrcmpW(name, szTables) || !lstrcmpW(name, szColumns) )
|
if ( !strcmpW( name, szTables ) || !strcmpW( name, szColumns ) )
|
||||||
table->persistent = MSICONDITION_NONE;
|
table->persistent = MSICONDITION_NONE;
|
||||||
|
|
||||||
r = table_get_column_info( db, name, &table->colinfo, &table->col_count);
|
r = table_get_column_info( db, name, &table->colinfo, &table->col_count);
|
||||||
|
@ -864,12 +864,12 @@ static UINT get_defaulttablecolumns( MSIDATABASE *db, LPCWSTR name,
|
||||||
|
|
||||||
TRACE("%s\n", debugstr_w(name));
|
TRACE("%s\n", debugstr_w(name));
|
||||||
|
|
||||||
if (!lstrcmpW( name, szTables ))
|
if (!strcmpW( name, szTables ))
|
||||||
{
|
{
|
||||||
p = _Tables_cols;
|
p = _Tables_cols;
|
||||||
n = 1;
|
n = 1;
|
||||||
}
|
}
|
||||||
else if (!lstrcmpW( name, szColumns ))
|
else if (!strcmpW( name, szColumns ))
|
||||||
{
|
{
|
||||||
p = _Columns_cols;
|
p = _Columns_cols;
|
||||||
n = 4;
|
n = 4;
|
||||||
|
@ -1037,11 +1037,8 @@ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name )
|
||||||
UINT r, table_id, i;
|
UINT r, table_id, i;
|
||||||
MSITABLE *table;
|
MSITABLE *table;
|
||||||
|
|
||||||
static const WCHAR szStreams[] = {'_','S','t','r','e','a','m','s',0};
|
if( !strcmpW( name, szTables ) || !strcmpW( name, szColumns ) ||
|
||||||
static const WCHAR szStorages[] = {'_','S','t','o','r','a','g','e','s',0};
|
!strcmpW( name, szStreams ) || !strcmpW( name, szStorages ) )
|
||||||
|
|
||||||
if( !lstrcmpW( name, szTables ) || !lstrcmpW( name, szColumns ) ||
|
|
||||||
!lstrcmpW( name, szStreams ) || !lstrcmpW( name, szStorages ) )
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
r = msi_string2idW( db->strings, name, &table_id );
|
r = msi_string2idW( db->strings, name, &table_id );
|
||||||
|
@ -1346,10 +1343,13 @@ static UINT get_table_value_from_record( MSITABLEVIEW *tv, MSIRECORD *rec, UINT
|
||||||
else if ( columninfo.type & MSITYPE_STRING )
|
else if ( columninfo.type & MSITYPE_STRING )
|
||||||
{
|
{
|
||||||
LPCWSTR sval = MSI_RecordGetString( rec, iField );
|
LPCWSTR sval = MSI_RecordGetString( rec, iField );
|
||||||
|
if (sval)
|
||||||
r = msi_string2idW(tv->db->strings, sval, pvalue);
|
{
|
||||||
if (r != ERROR_SUCCESS)
|
r = msi_string2idW(tv->db->strings, sval, pvalue);
|
||||||
return ERROR_NOT_FOUND;
|
if (r != ERROR_SUCCESS)
|
||||||
|
return ERROR_NOT_FOUND;
|
||||||
|
}
|
||||||
|
else *pvalue = 0;
|
||||||
}
|
}
|
||||||
else if ( bytes_per_column( tv->db, &columninfo, LONG_STR_BYTES ) == 2 )
|
else if ( bytes_per_column( tv->db, &columninfo, LONG_STR_BYTES ) == 2 )
|
||||||
{
|
{
|
||||||
|
@ -1432,7 +1432,6 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
|
||||||
LPCWSTR sval = MSI_RecordGetString( rec, i + 1 );
|
LPCWSTR sval = MSI_RecordGetString( rec, i + 1 );
|
||||||
val = msi_addstringW( tv->db->strings, sval, -1, 1,
|
val = msi_addstringW( tv->db->strings, sval, -1, 1,
|
||||||
persistent ? StringPersistent : StringNonPersistent );
|
persistent ? StringPersistent : StringNonPersistent );
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2099,7 +2098,7 @@ static UINT TABLE_add_column(struct tagMSIVIEW *view, LPCWSTR table, UINT number
|
||||||
msitable = find_cached_table(tv->db, table);
|
msitable = find_cached_table(tv->db, table);
|
||||||
for (i = 0; i < msitable->col_count; i++)
|
for (i = 0; i < msitable->col_count; i++)
|
||||||
{
|
{
|
||||||
if (!lstrcmpW(msitable->colinfo[i].colname, column))
|
if (!strcmpW( msitable->colinfo[i].colname, column ))
|
||||||
{
|
{
|
||||||
InterlockedIncrement(&msitable->colinfo[i].ref_count);
|
InterlockedIncrement(&msitable->colinfo[i].ref_count);
|
||||||
break;
|
break;
|
||||||
|
@ -2340,14 +2339,11 @@ UINT TABLE_CreateView( MSIDATABASE *db, LPCWSTR name, MSIVIEW **view )
|
||||||
MSITABLEVIEW *tv ;
|
MSITABLEVIEW *tv ;
|
||||||
UINT r, sz;
|
UINT r, sz;
|
||||||
|
|
||||||
static const WCHAR Streams[] = {'_','S','t','r','e','a','m','s',0};
|
|
||||||
static const WCHAR Storages[] = {'_','S','t','o','r','a','g','e','s',0};
|
|
||||||
|
|
||||||
TRACE("%p %s %p\n", db, debugstr_w(name), view );
|
TRACE("%p %s %p\n", db, debugstr_w(name), view );
|
||||||
|
|
||||||
if ( !lstrcmpW( name, Streams ) )
|
if ( !strcmpW( name, szStreams ) )
|
||||||
return STREAMS_CreateView( db, view );
|
return STREAMS_CreateView( db, view );
|
||||||
else if ( !lstrcmpW( name, Storages ) )
|
else if ( !strcmpW( name, szStorages ) )
|
||||||
return STORAGES_CreateView( db, view );
|
return STORAGES_CreateView( db, view );
|
||||||
|
|
||||||
sz = sizeof *tv + lstrlenW(name)*sizeof name[0] ;
|
sz = sizeof *tv + lstrlenW(name)*sizeof name[0] ;
|
||||||
|
@ -2634,15 +2630,19 @@ static UINT* msi_record_to_row( const MSITABLEVIEW *tv, MSIRECORD *rec )
|
||||||
! MSITYPE_IS_BINARY(tv->columns[i].type) )
|
! MSITYPE_IS_BINARY(tv->columns[i].type) )
|
||||||
{
|
{
|
||||||
str = MSI_RecordGetString( rec, i+1 );
|
str = MSI_RecordGetString( rec, i+1 );
|
||||||
r = msi_string2idW( tv->db->strings, str, &data[i] );
|
if (str)
|
||||||
|
|
||||||
/* if there's no matching string in the string table,
|
|
||||||
these keys can't match any record, so fail now. */
|
|
||||||
if( ERROR_SUCCESS != r )
|
|
||||||
{
|
{
|
||||||
msi_free( data );
|
r = msi_string2idW( tv->db->strings, str, &data[i] );
|
||||||
return NULL;
|
|
||||||
|
/* if there's no matching string in the string table,
|
||||||
|
these keys can't match any record, so fail now. */
|
||||||
|
if (r != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
msi_free( data );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else data[i] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2818,7 +2818,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
|
||||||
UINT number = MSI_NULL_INTEGER;
|
UINT number = MSI_NULL_INTEGER;
|
||||||
UINT row = 0;
|
UINT row = 0;
|
||||||
|
|
||||||
if (!lstrcmpW( name, szColumns ))
|
if (!strcmpW( name, szColumns ))
|
||||||
{
|
{
|
||||||
MSI_RecordGetStringW( rec, 1, table, &sz );
|
MSI_RecordGetStringW( rec, 1, table, &sz );
|
||||||
number = MSI_RecordGetInteger( rec, 2 );
|
number = MSI_RecordGetInteger( rec, 2 );
|
||||||
|
@ -2830,7 +2830,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
|
||||||
if ( number == MSI_NULL_INTEGER )
|
if ( number == MSI_NULL_INTEGER )
|
||||||
{
|
{
|
||||||
/* reset the column number on a new table */
|
/* reset the column number on a new table */
|
||||||
if (lstrcmpW( coltable, table ))
|
if (strcmpW( coltable, table ))
|
||||||
{
|
{
|
||||||
colcol = 0;
|
colcol = 0;
|
||||||
lstrcpyW( coltable, table );
|
lstrcpyW( coltable, table );
|
||||||
|
@ -2876,7 +2876,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg,
|
||||||
WARN("failed to insert row %u\n", r);
|
WARN("failed to insert row %u\n", r);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (number != MSI_NULL_INTEGER && !lstrcmpW( name, szColumns ))
|
if (number != MSI_NULL_INTEGER && !strcmpW( name, szColumns ))
|
||||||
msi_update_table_columns( db, table );
|
msi_update_table_columns( db, table );
|
||||||
|
|
||||||
msiobj_release( &rec->hdr );
|
msiobj_release( &rec->hdr );
|
||||||
|
@ -2938,8 +2938,8 @@ UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg )
|
||||||
if ( name[0] != 0x4840 )
|
if ( name[0] != 0x4840 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ( !lstrcmpW( name+1, szStringPool ) ||
|
if ( !strcmpW( name+1, szStringPool ) ||
|
||||||
!lstrcmpW( name+1, szStringData ) )
|
!strcmpW( name+1, szStringData ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
transform = msi_alloc_zero( sizeof(TRANSFORMDATA) );
|
transform = msi_alloc_zero( sizeof(TRANSFORMDATA) );
|
||||||
|
@ -2950,9 +2950,9 @@ UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg )
|
||||||
|
|
||||||
transform->name = strdupW( name + 1 );
|
transform->name = strdupW( name + 1 );
|
||||||
|
|
||||||
if ( !lstrcmpW( transform->name, szTables ) )
|
if ( !strcmpW( transform->name, szTables ) )
|
||||||
tables = transform;
|
tables = transform;
|
||||||
else if (!lstrcmpW( transform->name, szColumns ) )
|
else if (!strcmpW( transform->name, szColumns ) )
|
||||||
columns = transform;
|
columns = transform;
|
||||||
|
|
||||||
TRACE("transform contains stream %s\n", debugstr_w(name));
|
TRACE("transform contains stream %s\n", debugstr_w(name));
|
||||||
|
@ -2990,8 +2990,8 @@ UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg )
|
||||||
{
|
{
|
||||||
transform = LIST_ENTRY( list_head( &transforms ), TRANSFORMDATA, entry );
|
transform = LIST_ENTRY( list_head( &transforms ), TRANSFORMDATA, entry );
|
||||||
|
|
||||||
if ( lstrcmpW( transform->name, szColumns ) &&
|
if ( strcmpW( transform->name, szColumns ) &&
|
||||||
lstrcmpW( transform->name, szTables ) &&
|
strcmpW( transform->name, szTables ) &&
|
||||||
ret == ERROR_SUCCESS )
|
ret == ERROR_SUCCESS )
|
||||||
{
|
{
|
||||||
ret = msi_table_load_transform( db, stg, strings, transform, bytes_per_strref );
|
ret = msi_table_load_transform( db, stg, strings, transform, bytes_per_strref );
|
||||||
|
|
|
@ -182,6 +182,22 @@ static UINT run_query( MSIHANDLE hdb, MSIHANDLE hrec, const char *query )
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT run_queryW( MSIHANDLE hdb, MSIHANDLE hrec, const WCHAR *query )
|
||||||
|
{
|
||||||
|
MSIHANDLE hview = 0;
|
||||||
|
UINT r;
|
||||||
|
|
||||||
|
r = MsiDatabaseOpenViewW(hdb, query, &hview);
|
||||||
|
if( r != ERROR_SUCCESS )
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = MsiViewExecute(hview, hrec);
|
||||||
|
if( r == ERROR_SUCCESS )
|
||||||
|
r = MsiViewClose(hview);
|
||||||
|
MsiCloseHandle(hview);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static UINT create_component_table( MSIHANDLE hdb )
|
static UINT create_component_table( MSIHANDLE hdb )
|
||||||
{
|
{
|
||||||
return run_query( hdb, 0,
|
return run_query( hdb, 0,
|
||||||
|
@ -4929,6 +4945,174 @@ static void test_rows_order(void)
|
||||||
DeleteFile(msifile);
|
DeleteFile(msifile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_collation(void)
|
||||||
|
{
|
||||||
|
static const WCHAR query1[] =
|
||||||
|
{'I','N','S','E','R','T',' ','I','N','T','O',' ','`','b','a','r','`',' ',
|
||||||
|
'(','`','f','o','o','`',',','`','b','a','z','`',')',' ','V','A','L','U','E','S',' ',
|
||||||
|
'(','\'','a',0x30a,'\'',',','\'','C','\'',')',0};
|
||||||
|
static const WCHAR query2[] =
|
||||||
|
{'I','N','S','E','R','T',' ','I','N','T','O',' ','`','b','a','r','`',' ',
|
||||||
|
'(','`','f','o','o','`',',','`','b','a','z','`',')',' ','V','A','L','U','E','S',' ',
|
||||||
|
'(','\'',0xe5,'\'',',','\'','D','\'',')',0};
|
||||||
|
static const WCHAR query3[] =
|
||||||
|
{'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','b','a','z','`',' ',
|
||||||
|
'(',' ','`','a',0x30a,'`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ','N','U','L','L',',',
|
||||||
|
' ','`',0xe5,'`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ','N','U','L','L',' ',
|
||||||
|
'P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','a',0x30a,'`',')',0};
|
||||||
|
static const WCHAR query4[] =
|
||||||
|
{'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','a',0x30a,'`',' ',
|
||||||
|
'(',' ','`','f','o','o','`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ',
|
||||||
|
'N','U','L','L',' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','f','o','o','`',')',0};
|
||||||
|
static const WCHAR query5[] =
|
||||||
|
{'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`',0xe5,'`',' ',
|
||||||
|
'(',' ','`','f','o','o','`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ',
|
||||||
|
'N','U','L','L',' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','f','o','o','`',')',0};
|
||||||
|
static const WCHAR query6[] =
|
||||||
|
{'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','b','a','r','`',' ','W','H','E','R','E',
|
||||||
|
' ','`','f','o','o','`',' ','=','\'',0xe5,'\'',0};
|
||||||
|
static const WCHAR letter_C[] = {'C',0};
|
||||||
|
static const WCHAR letter_D[] = {'D',0};
|
||||||
|
static const WCHAR letter_a_ring[] = {'a',0x30a,0};
|
||||||
|
static const WCHAR letter_a_with_ring[] = {0xe5,0};
|
||||||
|
static const WCHAR letter_a_broken[] = {'a',0xb0,0};
|
||||||
|
const char *query;
|
||||||
|
MSIHANDLE hdb = 0, hview = 0, hrec = 0;
|
||||||
|
UINT r;
|
||||||
|
char buffer[100];
|
||||||
|
WCHAR bufferW[100];
|
||||||
|
DWORD sz;
|
||||||
|
|
||||||
|
r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n");
|
||||||
|
|
||||||
|
query = "CREATE TABLE `bar` ( "
|
||||||
|
"`foo` LONGCHAR NOT NULL, "
|
||||||
|
"`baz` LONGCHAR NOT NULL "
|
||||||
|
"PRIMARY KEY `foo` )";
|
||||||
|
r = run_query(hdb, 0, query);
|
||||||
|
ok(r == ERROR_SUCCESS, "failed to create table\n");
|
||||||
|
|
||||||
|
r = run_query(hdb, 0, query);
|
||||||
|
ok(r == ERROR_BAD_QUERY_SYNTAX, "wrong error %u\n", r);
|
||||||
|
|
||||||
|
r = run_query(hdb, 0, "INSERT INTO `bar` "
|
||||||
|
"( `foo`, `baz` ) VALUES ( '\2', 'A' )");
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r);
|
||||||
|
|
||||||
|
r = run_query(hdb, 0, "INSERT INTO `bar` "
|
||||||
|
"( `foo`, `baz` ) VALUES ( '\1', 'B' )");
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r);
|
||||||
|
|
||||||
|
r = run_queryW(hdb, 0, query1);
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r);
|
||||||
|
|
||||||
|
r = run_queryW(hdb, 0, query2);
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r);
|
||||||
|
|
||||||
|
r = run_queryW(hdb, 0, query3);
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot create table %u\n", r);
|
||||||
|
|
||||||
|
r = run_queryW(hdb, 0, query4);
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot create table %u\n", r);
|
||||||
|
|
||||||
|
r = run_queryW(hdb, 0, query5);
|
||||||
|
ok(r == ERROR_SUCCESS, "cannot create table %u\n", r);
|
||||||
|
|
||||||
|
query = "SELECT * FROM `bar`";
|
||||||
|
r = MsiDatabaseOpenView(hdb, query, &hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
|
||||||
|
r = MsiViewExecute(hview, 0);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
|
||||||
|
sz = sizeof(buffer);
|
||||||
|
r = MsiRecordGetString(hrec, 1, buffer, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmp(buffer, "\2"), "Expected \\2, got '%s'\n", buffer);
|
||||||
|
sz = sizeof(buffer);
|
||||||
|
r = MsiRecordGetString(hrec, 2, buffer, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmp(buffer, "A"), "Expected A, got '%s'\n", buffer);
|
||||||
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
|
||||||
|
sz = sizeof(buffer);
|
||||||
|
r = MsiRecordGetString(hrec, 1, buffer, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmp(buffer, "\1"), "Expected \\1, got '%s'\n", buffer);
|
||||||
|
sz = sizeof(buffer);
|
||||||
|
r = MsiRecordGetString(hrec, 2, buffer, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmp(buffer, "B"), "Expected B, got '%s'\n", buffer);
|
||||||
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!memcmp(bufferW, letter_a_ring, sizeof(letter_a_ring)) ||
|
||||||
|
broken(!memcmp(bufferW, letter_a_broken, sizeof(letter_a_broken))) /* win9x */,
|
||||||
|
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_ring), wine_dbgstr_w(bufferW));
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmpW(bufferW, letter_C), "Expected C, got %s\n", wine_dbgstr_w(bufferW));
|
||||||
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)),
|
||||||
|
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW));
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW));
|
||||||
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
|
r = MsiViewClose(hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
|
||||||
|
r = MsiCloseHandle(hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
|
||||||
|
|
||||||
|
r = MsiDatabaseOpenViewW(hdb, query6, &hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n");
|
||||||
|
r = MsiViewExecute(hview, 0);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n");
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n");
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 1, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)),
|
||||||
|
"Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW));
|
||||||
|
sz = sizeof(bufferW) / sizeof(bufferW[0]);
|
||||||
|
r = MsiRecordGetStringW(hrec, 2, bufferW, &sz);
|
||||||
|
ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r);
|
||||||
|
ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW));
|
||||||
|
MsiCloseHandle(hrec);
|
||||||
|
|
||||||
|
r = MsiViewFetch(hview, &hrec);
|
||||||
|
ok(r == ERROR_NO_MORE_ITEMS, "MsiViewFetch failed\n");
|
||||||
|
|
||||||
|
r = MsiViewClose(hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiViewClose failed\n");
|
||||||
|
r = MsiCloseHandle(hview);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
|
||||||
|
|
||||||
|
r = MsiCloseHandle(hdb);
|
||||||
|
ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n");
|
||||||
|
|
||||||
|
DeleteFile(msifile);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_select_markers(void)
|
static void test_select_markers(void)
|
||||||
{
|
{
|
||||||
MSIHANDLE hdb = 0, rec, view, res;
|
MSIHANDLE hdb = 0, rec, view, res;
|
||||||
|
@ -9017,4 +9201,5 @@ START_TEST(db)
|
||||||
test_columnorder();
|
test_columnorder();
|
||||||
test_suminfo_import();
|
test_suminfo_import();
|
||||||
test_createtable();
|
test_createtable();
|
||||||
|
test_collation();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1166,6 +1166,10 @@ static void test_settargetpath(void)
|
||||||
|
|
||||||
static void test_condition(void)
|
static void test_condition(void)
|
||||||
{
|
{
|
||||||
|
static const WCHAR cond1[] = {'\"','a',0x30a,'\"','<','\"',0xe5,'\"',0};
|
||||||
|
static const WCHAR cond2[] = {'\"','a',0x30a,'\"','>','\"',0xe5,'\"',0};
|
||||||
|
static const WCHAR cond3[] = {'\"','a',0x30a,'\"','<','>','\"',0xe5,'\"',0};
|
||||||
|
static const WCHAR cond4[] = {'\"','a',0x30a,'\"','=','\"',0xe5,'\"',0};
|
||||||
MSICONDITION r;
|
MSICONDITION r;
|
||||||
MSIHANDLE hpkg;
|
MSIHANDLE hpkg;
|
||||||
|
|
||||||
|
@ -1885,6 +1889,22 @@ static void test_condition(void)
|
||||||
r = MsiEvaluateCondition(hpkg, "A <= X");
|
r = MsiEvaluateCondition(hpkg, "A <= X");
|
||||||
ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
|
ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
|
||||||
|
|
||||||
|
r = MsiEvaluateConditionW(hpkg, cond1);
|
||||||
|
ok( r == MSICONDITION_TRUE || broken(r == MSICONDITION_FALSE),
|
||||||
|
"wrong return val (%d)\n", r);
|
||||||
|
|
||||||
|
r = MsiEvaluateConditionW(hpkg, cond2);
|
||||||
|
ok( r == MSICONDITION_FALSE || broken(r == MSICONDITION_TRUE),
|
||||||
|
"wrong return val (%d)\n", r);
|
||||||
|
|
||||||
|
r = MsiEvaluateConditionW(hpkg, cond3);
|
||||||
|
ok( r == MSICONDITION_TRUE || broken(r == MSICONDITION_FALSE),
|
||||||
|
"wrong return val (%d)\n", r);
|
||||||
|
|
||||||
|
r = MsiEvaluateConditionW(hpkg, cond4);
|
||||||
|
ok( r == MSICONDITION_FALSE || broken(r == MSICONDITION_TRUE),
|
||||||
|
"wrong return val (%d)\n", r);
|
||||||
|
|
||||||
MsiCloseHandle( hpkg );
|
MsiCloseHandle( hpkg );
|
||||||
DeleteFile(msifile);
|
DeleteFile(msifile);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
#include "wine/unicode.h"
|
||||||
#include "msi.h"
|
#include "msi.h"
|
||||||
#include "msiquery.h"
|
#include "msiquery.h"
|
||||||
#include "objbase.h"
|
#include "objbase.h"
|
||||||
|
@ -306,7 +307,7 @@ static UINT STRCMP_Evaluate( MSIWHEREVIEW *wv, UINT row, const struct expr *cond
|
||||||
else if( r_str && ! l_str )
|
else if( r_str && ! l_str )
|
||||||
sr = -1;
|
sr = -1;
|
||||||
else
|
else
|
||||||
sr = lstrcmpW( l_str, r_str );
|
sr = strcmpW( l_str, r_str );
|
||||||
|
|
||||||
*val = ( cond->u.expr.op == OP_EQ && ( sr == 0 ) ) ||
|
*val = ( cond->u.expr.op == OP_EQ && ( sr == 0 ) ) ||
|
||||||
( cond->u.expr.op == OP_NE && ( sr != 0 ) );
|
( cond->u.expr.op == OP_NE && ( sr != 0 ) );
|
||||||
|
|
Loading…
Reference in New Issue