MSI: use the newly implemented UPDATE code to set properties
Mike McCormack
mike at codeweavers.com
Thu Jul 1 10:44:42 CDT 2004
ChangeLog:
<aric at codeweavers.com>
* use the newly implemented UPDATE code to set properties
-------------- next part --------------
diff -u dlls/msi.old/action.c dlls/msi/action.c
--- dlls/msi.old/action.c 2004-07-01 10:37:19.000000000 -0500
+++ dlls/msi/action.c 2004-07-01 10:37:47.000000000 -0500
@@ -1245,6 +1245,8 @@
MsiViewClose(view);
MsiCloseHandle(view);
+ MsiSetPropertyA(hPackage,"CostingComplete","1");
+
return ERROR_SUCCESS;
}
diff -u dlls/msi.old/msi.c dlls/msi/msi.c
--- dlls/msi.old/msi.c 2004-07-01 10:37:19.000000000 -0500
+++ dlls/msi/msi.c 2004-07-01 10:41:12.000000000 -0500
@@ -65,6 +65,9 @@
/* the UI level */
INSTALLUILEVEL gUILevel;
HWND gUIhwnd;
+INSTALLUI_HANDLERA gUIHandler;
+DWORD gUIFilter;
+LPVOID gUIContext;
/*
* .MSI file format
@@ -701,8 +704,14 @@
INSTALLUI_HANDLERA WINAPI MsiSetExternalUIA(INSTALLUI_HANDLERA puiHandler,
DWORD dwMessageFilter, LPVOID pvContext)
{
- FIXME("STUB\n");
- return NULL;
+ INSTALLUI_HANDLERA prev = gUIHandler;
+
+ TRACE("(%p %lx %p)\n",puiHandler,dwMessageFilter,pvContext);
+ gUIHandler = puiHandler;
+ gUIFilter = dwMessageFilter;
+ gUIContext = pvContext;
+
+ return prev;
}
UINT WINAPI MsiLoadStringA(HINSTANCE hInstance, UINT uID, LPSTR lpBuffer, int nBufferMax, DWORD e)
@@ -1084,8 +1093,14 @@
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
DisableThreadLibraryCalls(hinstDLL);
+ /*
+ * UI Initialization
+ */
gUILevel = INSTALLUILEVEL_BASIC;
gUIhwnd = 0;
+ gUIHandler = NULL;
+ gUIFilter = 0;
+ gUIContext = NULL;
/* FIXME: Initialisation */
} else if (fdwReason == DLL_PROCESS_DETACH) {
/* FIXME: Cleanup */
diff -u dlls/msi.old/msipriv.h dlls/msi/msipriv.h
--- dlls/msi.old/msipriv.h 2004-07-01 10:37:19.000000000 -0500
+++ dlls/msi/msipriv.h 2004-07-01 10:41:29.000000000 -0500
@@ -225,5 +225,8 @@
/* UI globals */
extern INSTALLUILEVEL gUILevel;
extern HWND gUIhwnd;
+extern INSTALLUI_HANDLERA gUIHandler;
+extern DWORD gUIFilter;
+extern LPVOID gUIContext;
#endif /* __WINE_MSI_PRIVATE__ */
diff -u dlls/msi.old/package.c dlls/msi/package.c
--- dlls/msi.old/package.c 2004-07-01 10:37:19.000000000 -0500
+++ dlls/msi/package.c 2004-07-01 10:40:54.000000000 -0500
@@ -338,7 +338,43 @@
INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
MSIHANDLE hRecord)
{
- FIXME("STUB: \n");
+ DWORD log_type = 0;
+ LPSTR message;
+ DWORD sz;
+ INT msg_field=1;
+ FIXME("STUB: %x \n",eMessageType);
+
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ERROR)
+ log_type |= INSTALLLOGMODE_ERROR;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_WARNING)
+ log_type |= INSTALLLOGMODE_WARNING;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_USER)
+ log_type |= INSTALLLOGMODE_USER;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_INFO)
+ log_type |= INSTALLLOGMODE_INFO;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_COMMONDATA)
+ log_type |= INSTALLLOGMODE_COMMONDATA;
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONSTART)
+ {
+ log_type |= INSTALLLOGMODE_ACTIONSTART;
+ msg_field = 2;
+ }
+ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONDATA)
+ log_type |= INSTALLLOGMODE_ACTIONDATA;
+
+ sz = 0;
+ MsiRecordGetStringA(hRecord,msg_field,NULL,&sz);
+ sz++;
+ message = HeapAlloc(GetProcessHeap(),0,sz);
+ MsiRecordGetStringA(hRecord,msg_field,message,&sz);
+
+ TRACE("(%p %lx %lx)\n",gUIHandler, gUIFilter, log_type);
+ if (gUIHandler && (gUIFilter & log_type))
+ gUIHandler(gUIContext,eMessageType,message);
+ else
+ TRACE("%s\n",debugstr_a(message));
+
+ HeapFree(GetProcessHeap(),0,message);
return ERROR_SUCCESS;
}
@@ -388,8 +424,17 @@
MSIHANDLE view,row;
UINT rc;
DWORD sz = 0;
- static const CHAR Insert[]=
- "INSERT into `_Property` (`_Property`,`Value`) VALUES (?)";
+ static const WCHAR Insert[]=
+ {'I','N','S','E','R','T',' ','i','n','t','o',' ','`','_','P','r','o','p'
+,'e','r','t','y','`',' ','(','`','_','P','r','o','p','e','r','t','y','`'
+,',','`','V','a','l','u','e','`',')',' ','V','A','L','U','E','S'
+,' ','(','?',')',0};
+ static const WCHAR Update[]=
+ {'U','P','D','A','T','E',' ','_','P','r','o','p','e'
+,'r','t','y',' ','s','e','t',' ','`','V','a','l','u','e','`',' ','='
+,' ','?',' ','w','h','e','r','e',' ','`','_','P','r','o','p'
+,'e','r','t','y','`',' ','=',' ','\'','%','s','\'',0};
+ WCHAR Query[1024];
TRACE("Setting property (%s %s)\n",debugstr_w(szName),
debugstr_w(szValue));
@@ -397,24 +442,35 @@
if (!hInstall)
return ERROR_INVALID_HANDLE;
+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package)
+ return ERROR_INVALID_HANDLE;
+
rc = MsiGetPropertyW(hInstall,szName,0,&sz);
if (rc==ERROR_MORE_DATA || rc == ERROR_SUCCESS)
{
- FIXME("Cannot set exising properties! FIXME MIKE!\n");
- return ERROR_SUCCESS;
+ sprintfW(Query,Update,szName);
+
+ row = MsiCreateRecord(1);
+ MsiRecordSetStringW(row,1,szValue);
+
+ }
+ else
+ {
+ strcpyW(Query,Insert);
+
+ row = MsiCreateRecord(2);
+ MsiRecordSetStringW(row,1,szName);
+ MsiRecordSetStringW(row,2,szValue);
}
- package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
- if( !package)
- return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db,Insert,&view);
+ rc = MsiDatabaseOpenViewW(package->db,Query,&view);
if (rc!= ERROR_SUCCESS)
+ {
+ MsiCloseHandle(row);
return rc;
-
- row = MsiCreateRecord(2);
- MsiRecordSetStringW(row,1,szName);
- MsiRecordSetStringW(row,2,szValue);
+ }
rc = MsiViewExecute(view,row);
More information about the wine-patches
mailing list