diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index c419ee7692d..6aa8957d5fe 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -258,7 +258,7 @@ 262 stub MsiSourceListForceResolutionExW 263 stub MsiSourceListEnumSourcesA 264 stub MsiSourceListEnumSourcesW -265 stub MsiSourceListGetInfoA +265 stdcall MsiSourceListGetInfoA(str str long long str ptr ptr) 266 stub MsiSourceListGetInfoW 267 stub MsiSourceListSetInfoA 268 stub MsiSourceListSetInfoW diff --git a/dlls/msi/source.c b/dlls/msi/source.c index 3b3e47f6dea..49b7e4e642b 100644 --- a/dlls/msi/source.c +++ b/dlls/msi/source.c @@ -149,6 +149,58 @@ static UINT find_given_source(HKEY key, LPCWSTR szSource, media_info *ss) return rc; } +/****************************************************************** + * MsiSourceListGetInfoA (MSI.@) + */ +UINT WINAPI MsiSourceListGetInfoA( LPCSTR szProduct, LPCSTR szUserSid, + MSIINSTALLCONTEXT dwContext, DWORD dwOptions, + LPCSTR szProperty, LPSTR szValue, + LPDWORD pcchValue) +{ + UINT ret; + LPWSTR product = NULL; + LPWSTR usersid = NULL; + LPWSTR property = NULL; + LPWSTR value = NULL; + DWORD len = 0; + + if (szValue && !pcchValue) + return ERROR_INVALID_PARAMETER; + + if (szProduct) product = strdupAtoW(szProduct); + if (szUserSid) usersid = strdupAtoW(szUserSid); + if (szProperty) property = strdupAtoW(szProperty); + + ret = MsiSourceListGetInfoW(product, usersid, dwContext, dwOptions, + property, NULL, &len); + if (ret != ERROR_SUCCESS) + goto done; + + value = msi_alloc(++len * sizeof(WCHAR)); + if (!value) + return ERROR_OUTOFMEMORY; + + ret = MsiSourceListGetInfoW(product, usersid, dwContext, dwOptions, + property, value, &len); + if (ret != ERROR_SUCCESS) + goto done; + + len = WideCharToMultiByte(CP_ACP, 0, value, -1, NULL, 0, NULL, NULL); + if (*pcchValue >= len) + WideCharToMultiByte(CP_ACP, 0, value, -1, szValue, len, NULL, NULL); + else if (szValue) + ret = ERROR_MORE_DATA; + + *pcchValue = len - 1; + +done: + msi_free(product); + msi_free(usersid); + msi_free(property); + msi_free(value); + return ret; +} + /****************************************************************** * MsiSourceListGetInfoW (MSI.@) */ @@ -173,7 +225,7 @@ UINT WINAPI MsiSourceListGetInfoW( LPCWSTR szProduct, LPCWSTR szUserSid, FIXME("Unhandled options MSICODE_PATCH\n"); return ERROR_FUNCTION_FAILED; } - + if (szUserSid) FIXME("Unhandled UserSid %s\n",debugstr_w(szUserSid));