39 #include "wine/unicode.h" 47 if (!lang2 || lang2[0]==0)
50 langdword =
atoiW(lang2);
53 return (lang1 != langdword);
55 return (lang1 == langdword);
95 TRACE(
"Found Related Product... %s now %s\n",
106 DWORD index = 0, attributes = 0, sz =
sizeof(product)/
sizeof(product[0]);
127 LPCWSTR ver, language, action_property;
139 TRACE(
"product key not found\n");
156 TRACE(
"version below minimum\n");
175 TRACE(
"version above maximum\n");
186 TRACE(
"language doesn't match\n");
189 TRACE(
"found related product\n");
207 'S',
'E',
'L',
'E',
'C',
'T',
' ',
'*',
' ',
'F',
'R',
'O',
'M',
' ',
208 '`',
'U',
'p',
'g',
'r',
'a',
'd',
'e',
'`',0};
214 TRACE(
"Skipping FindRelatedProducts action: product already installed\n");
219 TRACE(
"Skipping FindRelatedProducts action: already done in UI sequence\n");
static const WCHAR szSemiColon[]
static void append_productcode(MSIPACKAGE *package, LPCWSTR action_property, LPCWSTR productid)
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
WINE_UNICODE_INLINE unsigned int strlenW(const WCHAR *str)
GLdouble GLdouble GLdouble r
int msi_get_property_int(MSIDATABASE *package, LPCWSTR prop, int def) DECLSPEC_HIDDEN
BOOL msi_action_is_unique(const MSIPACKAGE *package, const WCHAR *action)
DWORD msi_version_str_to_dword(LPCWSTR p) DECLSPEC_HIDDEN
LONG WINAPI RegCloseKey(HKEY hKey)
static const WCHAR szFindRelatedProducts[]
INT MSI_ProcessMessage(MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD *) DECLSPEC_HIDDEN
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
void msi_reset_folders(MSIPACKAGE *package, BOOL source) DECLSPEC_HIDDEN
const WCHAR * MSI_RecordGetString(const MSIRECORD *, UINT) DECLSPEC_HIDDEN
UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY *key, BOOL create) DECLSPEC_HIDDEN
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
void check(CONTEXT *pContext)
int msiobj_release(MSIOBJECTHDR *info)
static const WCHAR szSourceDir[]
MSIRECORD * MSI_CreateRecord(UINT) DECLSPEC_HIDDEN
static const WCHAR INSTALLPROPERTY_LANGUAGEW[]
int MSI_RecordGetInteger(MSIRECORD *, UINT) DECLSPEC_HIDDEN
WINE_UNICODE_INLINE WCHAR * strcpyW(WCHAR *dst, const WCHAR *src)
UINT ACTION_FindRelatedProducts(MSIPACKAGE *package)
#define SQUASHED_GUID_SIZE
WINE_UNICODE_INLINE WCHAR * strcatW(WCHAR *dst, const WCHAR *src)
UINT msi_set_property(MSIDATABASE *, const WCHAR *, const WCHAR *, int) DECLSPEC_HIDDEN
WINE_DEFAULT_DEBUG_CHANNEL(msi)
UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY *key, BOOL create) DECLSPEC_HIDDEN
static BOOL msi_free(void *mem)
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
static IOleDocumentView * view
static const WCHAR INSTALLPROPERTY_VERSIONW[]
BOOL unsquash_guid(LPCWSTR in, LPWSTR out) DECLSPEC_HIDDEN
static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
UINT MSI_IterateRecords(MSIQUERY *, LPDWORD, record_func, LPVOID) DECLSPEC_HIDDEN
static BOOL check_language(DWORD lang1, LPCWSTR lang2, DWORD attributes)
static const WCHAR szInstalled[]
WINE_UNICODE_INLINE int atoiW(const WCHAR *str)
UINT msi_register_unique_action(MSIPACKAGE *package, const WCHAR *action)
LPWSTR msi_dup_property(MSIDATABASE *db, LPCWSTR prop) DECLSPEC_HIDDEN
UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY **) DECLSPEC_HIDDEN