Commit 26a6d598 authored by Mike McCormack's avatar Mike McCormack Committed by Alexandre Julliard

Convert MsiEnumComponentQualifiers to use msi_strcpy_to_awstring.

parent 3566fe60
......@@ -541,7 +541,7 @@ UINT WINAPI MsiDecomposeDescriptorW( LPCWSTR szDescriptor, LPWSTR szProduct,
szFeature[len] = 0;
}
TRACE("feature %s\n", debugstr_w( szFeature ));
TRACE("feature %s\n", debugstr_w( &szDescriptor[20] ));
r = decode_base85_guid( p+1, &component );
if( !r )
......@@ -769,157 +769,134 @@ UINT WINAPI MsiEnumClientsW(LPCWSTR szComponent, DWORD index, LPWSTR szProduct)
return r;
}
UINT WINAPI MSI_EnumComponentQualifiers( LPCWSTR szComponent, DWORD iIndex,
awstring *lpQualBuf, DWORD* pcchQual,
awstring *lpAppBuf, DWORD* pcchAppBuf )
{
DWORD name_sz, val_sz, type, ofs;
LPWSTR name = NULL, val = NULL;
UINT r, r2;
HKEY key;
TRACE("%s %08lx %p %p %p %p\n", debugstr_w(szComponent), iIndex,
lpQualBuf, pcchQual, lpAppBuf, pcchAppBuf);
if (!szComponent)
return ERROR_INVALID_PARAMETER;
r = MSIREG_OpenUserComponentsKey( szComponent, &key, FALSE );
if (r != ERROR_SUCCESS)
return ERROR_UNKNOWN_COMPONENT;
/* figure out how big the name is we want to return */
name_sz = 0;
if (pcchQual)
{
r = ERROR_OUTOFMEMORY;
name_sz = *pcchQual * 4;
name = msi_alloc( name_sz * sizeof(WCHAR) );
if (!name)
goto end;
}
/* figure out how big the value is */
type = 0;
val_sz = 0;
r = RegEnumValueW( key, iIndex, NULL, NULL,
NULL, &type, NULL, &val_sz );
if (r != ERROR_SUCCESS)
goto end;
if (type != REG_MULTI_SZ)
{
ERR("component data has wrong type (%ld)\n", type);
goto end;
}
/* the value size is in bytes */
val_sz += sizeof(WCHAR);
val = msi_alloc( val_sz );
if (!val)
goto end;
r = RegEnumValueW( key, iIndex, name, &name_sz,
NULL, &type, (LPBYTE)val, &val_sz );
if (r != ERROR_SUCCESS)
goto end;
ofs = 0;
r = MsiDecomposeDescriptorW( val, NULL, NULL, NULL, &ofs );
if (r != ERROR_SUCCESS)
goto end;
TRACE("Providing %s and %s\n", debugstr_w(name), debugstr_w(val+ofs));
r = msi_strcpy_to_awstring( name, lpQualBuf, pcchQual );
r2 = msi_strcpy_to_awstring( val+ofs, lpAppBuf, pcchAppBuf );
if (r2 != ERROR_SUCCESS)
r = r2;
end:
msi_free(val);
msi_free(name);
RegCloseKey(key);
return r;
}
/*************************************************************************
* MsiEnumComponentQualifiersA [MSI.@]
*
*/
UINT WINAPI MsiEnumComponentQualifiersA( LPCSTR szComponent, DWORD iIndex,
LPSTR lpQualifierBuf, DWORD* pcchQualifierBuf,
LPSTR lpApplicationDataBuf, DWORD* pcchApplicationDataBuf)
LPSTR lpApplicationDataBuf, DWORD* pcchApplicationDataBuf )
{
LPWSTR szwComponent;
LPWSTR lpwQualifierBuf;
DWORD pcchwQualifierBuf;
LPWSTR lpwApplicationDataBuf;
DWORD pcchwApplicationDataBuf;
DWORD rc;
DWORD length;
awstring qual, appdata;
LPWSTR comp;
UINT r;
TRACE("%s %08lx %p %p %p %p\n", debugstr_a(szComponent), iIndex,
lpQualifierBuf, pcchQualifierBuf, lpApplicationDataBuf,
pcchApplicationDataBuf);
szwComponent = strdupAtoW(szComponent);
if (lpQualifierBuf)
lpwQualifierBuf = msi_alloc( (*pcchQualifierBuf) * sizeof(WCHAR));
else
lpwQualifierBuf = NULL;
if (pcchQualifierBuf)
pcchwQualifierBuf = *pcchQualifierBuf;
else
pcchwQualifierBuf = 0;
if (lpApplicationDataBuf)
lpwApplicationDataBuf = msi_alloc( (*pcchApplicationDataBuf) * sizeof(WCHAR));
else
lpwApplicationDataBuf = NULL;
if (pcchApplicationDataBuf)
pcchwApplicationDataBuf = *pcchApplicationDataBuf;
else
pcchwApplicationDataBuf = 0;
rc = MsiEnumComponentQualifiersW( szwComponent, iIndex, lpwQualifierBuf,
&pcchwQualifierBuf, lpwApplicationDataBuf,
&pcchwApplicationDataBuf);
/*
* A bit of wizardry to report back the length without the null.
* just in case the buffer is too small and is filled.
*/
if (lpQualifierBuf)
{
length = WideCharToMultiByte(CP_ACP, 0, lpwQualifierBuf, -1,
lpQualifierBuf, *pcchQualifierBuf, NULL, NULL);
comp = strdupAtoW( szComponent );
if (szComponent && !comp)
return ERROR_OUTOFMEMORY;
if (*pcchQualifierBuf == length && lpQualifierBuf[length-1])
*pcchQualifierBuf = length;
else
*pcchQualifierBuf = length - 1;
}
if (lpApplicationDataBuf)
{
length = WideCharToMultiByte(CP_ACP, 0,
lpwApplicationDataBuf, -1, lpApplicationDataBuf,
*pcchApplicationDataBuf, NULL, NULL);
if (*pcchApplicationDataBuf == length && lpApplicationDataBuf[length-1])
*pcchApplicationDataBuf = length;
else
*pcchApplicationDataBuf = length - 1;
}
qual.unicode = FALSE;
qual.str.a = lpQualifierBuf;
msi_free(lpwApplicationDataBuf);
msi_free(lpwQualifierBuf);
msi_free(szwComponent);
appdata.unicode = FALSE;
appdata.str.a = lpApplicationDataBuf;
return rc;
r = MSI_EnumComponentQualifiers( comp, iIndex,
&qual, pcchQualifierBuf, &appdata, pcchApplicationDataBuf );
msi_free( comp );
return r;
}
/*************************************************************************
* MsiEnumComponentQualifiersW [MSI.@]
*
*/
UINT WINAPI MsiEnumComponentQualifiersW( LPCWSTR szComponent, DWORD iIndex,
LPWSTR lpQualifierBuf, DWORD* pcchQualifierBuf,
LPWSTR lpApplicationDataBuf, DWORD* pcchApplicationDataBuf )
{
UINT rc;
HKEY key;
DWORD actual_pcchQualifierBuf = 0;
DWORD actual_pcchApplicationDataBuf = 0;
LPWSTR full_buffer = NULL;
DWORD full_buffer_size = 0;
LPWSTR ptr;
awstring qual, appdata;
TRACE("%s %08lx %p %p %p %p\n", debugstr_w(szComponent), iIndex,
lpQualifierBuf, pcchQualifierBuf, lpApplicationDataBuf,
pcchApplicationDataBuf);
if (pcchQualifierBuf)
actual_pcchQualifierBuf = *pcchQualifierBuf * sizeof(WCHAR);
if (pcchApplicationDataBuf)
actual_pcchApplicationDataBuf = *pcchApplicationDataBuf * sizeof(WCHAR);
rc = MSIREG_OpenUserComponentsKey(szComponent, &key, FALSE);
if (rc != ERROR_SUCCESS)
return ERROR_UNKNOWN_COMPONENT;
full_buffer_size = (52 * sizeof(WCHAR)) + actual_pcchApplicationDataBuf;
full_buffer = msi_alloc(full_buffer_size);
rc = RegEnumValueW(key, iIndex, lpQualifierBuf, pcchQualifierBuf, NULL,
NULL, (LPBYTE)full_buffer, &full_buffer_size);
qual.unicode = TRUE;
qual.str.w = lpQualifierBuf;
if (rc == ERROR_MORE_DATA)
{
msi_free(full_buffer);
full_buffer_size+=sizeof(WCHAR);
full_buffer = msi_alloc(full_buffer_size);
rc = RegEnumValueW(key, iIndex, lpQualifierBuf, pcchQualifierBuf, NULL,
NULL, (LPBYTE)full_buffer, &full_buffer_size);
}
RegCloseKey(key);
appdata.unicode = TRUE;
appdata.str.w = lpApplicationDataBuf;
if (rc == ERROR_SUCCESS)
{
if (lpApplicationDataBuf && pcchApplicationDataBuf)
{
ptr = full_buffer;
/* Skip the first guid */
ptr += 21;
/* Skip the name and the component guid if it exists */
if (strchrW(ptr,'<'))
ptr = strchrW(ptr,'<');
else
ptr = strchrW(ptr,'>') + 21;
lstrcpynW(lpApplicationDataBuf,ptr,*pcchApplicationDataBuf);
*pcchApplicationDataBuf = strlenW(ptr);
}
if (lpQualifierBuf && pcchQualifierBuf)
*pcchQualifierBuf /= sizeof(WCHAR);
TRACE("Providing %s and %s\n", debugstr_w(lpQualifierBuf),
debugstr_w(lpApplicationDataBuf));
}
msi_free(full_buffer);
return rc;
return MSI_EnumComponentQualifiers( szComponent, iIndex,
&qual, pcchQualifierBuf, &appdata, pcchApplicationDataBuf );
}
/*************************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment