MSI: refcount all objects, and use pointers internally
Mike McCormack
mike at codeweavers.com
Fri Jul 9 14:18:29 CDT 2004
ChangeLog:
<aric at codeweavers.com>
<mike at codeweavers.com>
* refcount all objects, and use pointers internally
-------------- next part --------------
diff -ur dlls/msi.old/action.c dlls/msi/action.c
--- dlls/msi.old/action.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/action.c 2004-07-09 14:07:57.000000000 -0500
@@ -126,39 +126,39 @@
/*
* Prototypes
*/
-static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran);
-static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage);
+static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran);
+static UINT ACTION_ProcessUISequence(MSIPACKAGE *package);
-UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action);
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action);
-static UINT ACTION_LaunchConditions(MSIHANDLE hPackage);
-static UINT ACTION_CostInitialize(MSIHANDLE hPackage);
-static UINT ACTION_CreateFolders(MSIHANDLE hPackage);
-static UINT ACTION_CostFinalize(MSIHANDLE hPackage);
-static UINT ACTION_FileCost(MSIHANDLE hPackage);
-static UINT ACTION_InstallFiles(MSIHANDLE hPackage);
-static UINT ACTION_DuplicateFiles(MSIHANDLE hPackage);
-static UINT ACTION_WriteRegistryValues(MSIHANDLE hPackage);
-static UINT ACTION_CustomAction(MSIHANDLE hPackage,const WCHAR *action);
-static UINT ACTION_InstallInitialize(MSIHANDLE hPackage);
-static UINT ACTION_InstallValidate(MSIHANDLE hPackage);
-static UINT ACTION_ProcessComponents(MSIHANDLE hPackage);
-static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage);
-static UINT ACTION_RegisterClassInfo(MSIHANDLE hPackage);
-static UINT ACTION_RegisterProgIdInfo(MSIHANDLE hPackage);
-static UINT ACTION_CreateShortcuts(MSIHANDLE hPackage);
-static UINT ACTION_PublishProduct(MSIHANDLE hPackage);
+static UINT ACTION_LaunchConditions(MSIPACKAGE *package);
+static UINT ACTION_CostInitialize(MSIPACKAGE *package);
+static UINT ACTION_CreateFolders(MSIPACKAGE *package);
+static UINT ACTION_CostFinalize(MSIPACKAGE *package);
+static UINT ACTION_FileCost(MSIPACKAGE *package);
+static UINT ACTION_InstallFiles(MSIPACKAGE *package);
+static UINT ACTION_DuplicateFiles(MSIPACKAGE *package);
+static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package);
+static UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action);
+static UINT ACTION_InstallInitialize(MSIPACKAGE *package);
+static UINT ACTION_InstallValidate(MSIPACKAGE *package);
+static UINT ACTION_ProcessComponents(MSIPACKAGE *package);
+static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package);
+static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package);
+static UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
+static UINT ACTION_CreateShortcuts(MSIPACKAGE *package);
+static UINT ACTION_PublishProduct(MSIPACKAGE *package);
-static UINT HANDLE_CustomType1(MSIHANDLE hPackage, const LPWSTR source,
+static UINT HANDLE_CustomType1(MSIPACKAGE *package, const LPWSTR source,
const LPWSTR target, const INT type);
-static UINT HANDLE_CustomType2(MSIHANDLE hPackage, const LPWSTR source,
+static UINT HANDLE_CustomType2(MSIPACKAGE *package, const LPWSTR source,
const LPWSTR target, const INT type);
-static DWORD deformat_string(MSIHANDLE hPackage, WCHAR* ptr,WCHAR** data);
-static UINT resolve_folder(MSIHANDLE hPackage, LPCWSTR name, LPWSTR path,
+static DWORD deformat_string(MSIPACKAGE *package, WCHAR* ptr,WCHAR** data);
+static UINT resolve_folder(MSIPACKAGE *package, LPCWSTR name, LPWSTR path,
BOOL source, BOOL set_prop, MSIFOLDER **folder);
-static UINT track_tempfile(MSIHANDLE hPackage, LPCWSTR name, LPCWSTR path);
+static UINT track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path);
/*
* consts and values used
@@ -245,19 +245,20 @@
return ret;
}
-inline static WCHAR *load_dynamic_stringW(MSIHANDLE row, INT index)
+inline static WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index)
{
+ UINT rc;
DWORD sz;
LPWSTR ret;
sz = 0;
- MsiRecordGetStringW(row,index,NULL,&sz);
+ rc = MSI_RecordGetStringW(row,index,NULL,&sz);
if (sz <= 0)
return NULL;
sz ++;
ret = HeapAlloc(GetProcessHeap(),0,sz * sizeof (WCHAR));
- MsiRecordGetStringW(row,index,ret,&sz);
+ rc = MSI_RecordGetStringW(row,index,ret,&sz);
return ret;
}
@@ -309,14 +310,11 @@
return rc;
}
-static UINT track_tempfile(MSIHANDLE hPackage, LPCWSTR name, LPCWSTR path)
+static UINT track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path)
{
- MSIPACKAGE *package;
int i;
int index;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
if (!package)
return -2;
@@ -358,20 +356,20 @@
}
}
-static void ui_progress(MSIHANDLE hPackage, int a, int b, int c, int d )
+static void ui_progress(MSIPACKAGE *package, int a, int b, int c, int d )
{
- MSIHANDLE row;
+ MSIRECORD * row;
- row = MsiCreateRecord(4);
- MsiRecordSetInteger(row,1,a);
- MsiRecordSetInteger(row,2,b);
- MsiRecordSetInteger(row,3,c);
- MsiRecordSetInteger(row,4,d);
- MsiProcessMessage(hPackage, INSTALLMESSAGE_PROGRESS, row);
- MsiCloseHandle(row);
+ row = MSI_CreateRecord(4);
+ MSI_RecordSetInteger(row,1,a);
+ MSI_RecordSetInteger(row,2,b);
+ MSI_RecordSetInteger(row,3,c);
+ MSI_RecordSetInteger(row,4,d);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_PROGRESS, row);
+ msiobj_release(&row->hdr);
}
-static void ui_actiondata(MSIHANDLE hPackage, LPCWSTR action, MSIHANDLE record)
+static void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record)
{
static const WCHAR Query_t[] =
{'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ','A','c','t','i','o',
@@ -379,34 +377,37 @@
' ','\'','%','s','\'',0};
WCHAR message[1024];
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
static WCHAR *ActionFormat=NULL;
static WCHAR LastAction[0x100] = {0};
WCHAR Query[1024];
- MSIHANDLE db;
LPWSTR ptr;
if (strcmpW(LastAction,action)!=0)
{
sprintfW(Query,Query_t,action);
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewW(db, Query, &view);
- MsiCloseHandle(db);
- MsiViewExecute(view, 0);
- rc = MsiViewFetch(view,&row);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+ if (rc != ERROR_SUCCESS)
+ return;
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ return;
+ }
+ rc = MSI_ViewFetch(view,&row);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
return;
}
- if (MsiRecordIsNull(row,3))
+ if (MSI_RecordIsNull(row,3))
{
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return;
}
@@ -415,9 +416,9 @@
ActionFormat = load_dynamic_stringW(row,3);
strcpyW(LastAction,action);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
message[0]=0;
@@ -453,15 +454,15 @@
}
}
- row = MsiCreateRecord(1);
- MsiRecordSetStringW(row,1,message);
+ row = MSI_CreateRecord(1);
+ MSI_RecordSetStringW(row,1,message);
- MsiProcessMessage(hPackage, INSTALLMESSAGE_ACTIONDATA, row);
- MsiCloseHandle(row);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONDATA, row);
+ msiobj_release(&row->hdr);
}
-static void ui_actionstart(MSIHANDLE hPackage, LPCWSTR action)
+static void ui_actionstart(MSIPACKAGE *package, LPCWSTR action)
{
static const WCHAR template_s[]=
{'A','c','t','i','o','n',' ','%','s',':',' ','%','s','.',' ','%','s','.',0};
@@ -474,46 +475,51 @@
WCHAR message[1024];
WCHAR timet[0x100];
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
WCHAR *ActionText=NULL;
WCHAR Query[1024];
- MSIHANDLE db;
GetTimeFormatW(LOCALE_USER_DEFAULT, 0, NULL, format, timet, 0x100);
sprintfW(Query,Query_t,action);
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewW(db, Query, &view);
- MsiCloseHandle(db);
- MsiViewExecute(view, 0);
- rc = MsiViewFetch(view,&row);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+ if (rc != ERROR_SUCCESS)
+ return;
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return;
+ }
+ rc = MSI_ViewFetch(view,&row);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return;
}
ActionText = load_dynamic_stringW(row,2);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
sprintfW(message,template_s,timet,action,ActionText);
- row = MsiCreateRecord(1);
- MsiRecordSetStringW(row,1,message);
+ row = MSI_CreateRecord(1);
+ MSI_RecordSetStringW(row,1,message);
- MsiProcessMessage(hPackage, INSTALLMESSAGE_ACTIONSTART, row);
- MsiCloseHandle(row);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONSTART, row);
+ msiobj_release(&row->hdr);
HeapFree(GetProcessHeap(),0,ActionText);
}
-static void ui_actioninfo(MSIHANDLE hPackage, LPCWSTR action, BOOL start,
+static void ui_actioninfo(MSIPACKAGE *package, LPCWSTR action, BOOL start,
UINT rc)
{
- MSIHANDLE row;
+ MSIRECORD * row;
static const WCHAR template_s[]=
{'A','c','t','i','o','n',' ','s','t','a','r','t',' ','%','s',':',' ','%','s',
'.',0};
@@ -531,23 +537,24 @@
else
sprintfW(message,template_e,timet,action,rc);
- row = MsiCreateRecord(1);
- MsiRecordSetStringW(row,1,message);
+ row = MSI_CreateRecord(1);
+ MSI_RecordSetStringW(row,1,message);
- MsiProcessMessage(hPackage, INSTALLMESSAGE_INFO, row);
- MsiCloseHandle(row);
+ MSI_ProcessMessage(package, INSTALLMESSAGE_INFO, row);
+ msiobj_release(&row->hdr);
}
/****************************************************
* TOP level entry points
*****************************************************/
-UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath,
+UINT ACTION_DoTopLevelINSTALL(MSIPACKAGE *package, LPCWSTR szPackagePath,
LPCWSTR szCommandLine)
{
DWORD sz;
- CHAR buffer[10];
+ WCHAR buffer[10];
UINT rc;
+ static const WCHAR szUILevel[] = {'U','I','L','e','v','e','l',0};
if (szPackagePath)
{
@@ -565,9 +572,9 @@
}
size = MAX_PATH;
- if (MsiGetPropertyW(hPackage,cszSourceDir,check,&size)
+ if (MSI_GetPropertyW(package,cszSourceDir,check,&size)
!= ERROR_SUCCESS )
- MsiSetPropertyW(hPackage, cszSourceDir, pth);
+ MSI_SetPropertyW(package, cszSourceDir, pth);
}
if (szCommandLine)
@@ -613,70 +620,90 @@
}
TRACE("Found commandline property (%s) = (%s)\n", debugstr_w(prop),
debugstr_w(val));
- MsiSetPropertyW(hPackage,prop,val);
+ MSI_SetPropertyW(package,prop,val);
}
}
sz = 10;
- if (MsiGetPropertyA(hPackage,"UILevel",buffer,&sz) == ERROR_SUCCESS)
+ if (MSI_GetPropertyW(package,szUILevel,buffer,&sz) == ERROR_SUCCESS)
{
- if (atoi(buffer) >= INSTALLUILEVEL_REDUCED)
+ if (atoiW(buffer) >= INSTALLUILEVEL_REDUCED)
{
- rc = ACTION_ProcessUISequence(hPackage);
+ rc = ACTION_ProcessUISequence(package);
if (rc == ERROR_SUCCESS)
- rc = ACTION_ProcessExecSequence(hPackage,TRUE);
+ rc = ACTION_ProcessExecSequence(package,TRUE);
}
else
- rc = ACTION_ProcessExecSequence(hPackage,FALSE);
+ rc = ACTION_ProcessExecSequence(package,FALSE);
}
else
- rc = ACTION_ProcessExecSequence(hPackage,FALSE);
+ rc = ACTION_ProcessExecSequence(package,FALSE);
return rc;
}
-static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran)
+static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran)
{
- MSIHANDLE view;
+ MSIQUERY * view;
UINT rc;
- static const CHAR *ExecSeqQuery =
-"select * from InstallExecuteSequence where Sequence > %i order by Sequence";
- CHAR Query[1024];
- MSIHANDLE db;
- MSIHANDLE row = 0;
-
- db = MsiGetActiveDatabase(hPackage);
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ',
+ 'f','r','o','m',' ',
+ 'I','n','s','t','a','l','l','E','x','e','c','u','t','e',
+ 'S','e','q','u','e','n','c','e',' ',
+ 'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ',
+ '>',' ','%','i',' ','o','r','d','e','r',' ',
+ 'b','y',' ','S','e','q','u','e','n','c','e',0 };
+ WCHAR Query[1024];
+ MSIRECORD * row = 0;
+ static const WCHAR IVQuery[] = {
+ 's','e','l','e','c','t',' ','S','e','q','u','e','n','c','e',' ',
+ 'f','r','o','m',' ','I','n','s','t','a','l','l',
+ 'E','x','e','c','u','t','e','S','e','q','u','e','n','c','e',' ',
+ 'w','h','e','r','e',' ','A','c','t','i','o','n',' ','=',' ',
+ '`','I','n','s','t','a','l','l','V','a','l','i','d','a','t','e','`',
+ 0};
if (UIran)
{
INT seq = 0;
- static const CHAR *IVQuery =
-"select Sequence from InstallExecuteSequence where Action = `InstallValidate`" ;
- MsiDatabaseOpenViewA(db, IVQuery, &view);
- MsiViewExecute(view, 0);
- MsiViewFetch(view,&row);
- seq = MsiRecordGetInteger(row,1);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
- sprintf(Query,ExecSeqQuery,seq);
+ rc = MSI_DatabaseOpenViewW(package->db, IVQuery, &view);
+ if (rc != ERROR_SUCCESS)
+ return rc;
+ rc = MSI_ViewExecute(view, 0);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
+ rc = MSI_ViewFetch(view,&row);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
+ seq = MSI_RecordGetInteger(row,1);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ sprintfW(Query,ExecSeqQuery,seq);
}
else
- sprintf(Query,ExecSeqQuery,0);
-
- rc = MsiDatabaseOpenViewA(db, Query, &view);
- MsiCloseHandle(db);
+ sprintfW(Query,ExecSeqQuery,0);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc == ERROR_SUCCESS)
{
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
goto end;
}
@@ -687,7 +714,7 @@
WCHAR buffer[0x100];
DWORD sz = 0x100;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -695,7 +722,7 @@
}
/* check conditions */
- if (!MsiRecordIsNull(row,2))
+ if (!MSI_RecordIsNull(row,2))
{
LPWSTR cond = NULL;
cond = load_dynamic_stringW(row,2);
@@ -703,11 +730,11 @@
if (cond)
{
/* this is a hack to skip errors in the condition code */
- if (MsiEvaluateConditionW(hPackage, cond) ==
+ if (MSI_EvaluateConditionW(package, cond) ==
MSICONDITION_FALSE)
{
HeapFree(GetProcessHeap(),0,cond);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
else
@@ -716,28 +743,28 @@
}
sz=0x100;
- rc = MsiRecordGetStringW(row,1,buffer,&sz);
+ rc = MSI_RecordGetStringW(row,1,buffer,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Error is %x\n",rc);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- rc = ACTION_PerformAction(hPackage,buffer);
+ rc = ACTION_PerformAction(package,buffer);
if (rc != ERROR_SUCCESS)
{
ERR("Execution halted due to error (%i)\n",rc);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
end:
@@ -745,26 +772,27 @@
}
-static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage)
+static UINT ACTION_ProcessUISequence(MSIPACKAGE *package)
{
- MSIHANDLE view;
+ MSIQUERY * view;
UINT rc;
- static const CHAR *ExecSeqQuery =
-"select * from InstallUISequence where Sequence > 0 order by Sequence";
- MSIHANDLE db;
+ static const WCHAR ExecSeqQuery [] = {
+ 's','e','l','e','c','t',' ','*',' ',
+ 'f','r','o','m',' ','I','n','s','t','a','l','l',
+ 'U','I','S','e','q','u','e','n','c','e',' ',
+ 'w','h','e','r','e',' ','S','e','q','u','e','n','c','e',' ', '>',' ','0',' ',
+ 'o','r','d','e','r',' ','b','y',' ','S','e','q','u','e','n','c','e',0};
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
- MsiCloseHandle(db);
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc == ERROR_SUCCESS)
{
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
goto end;
}
@@ -774,9 +802,9 @@
{
WCHAR buffer[0x100];
DWORD sz = 0x100;
- MSIHANDLE row = 0;
+ MSIRECORD * row = 0;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -784,7 +812,7 @@
}
/* check conditions */
- if (!MsiRecordIsNull(row,2))
+ if (!MSI_RecordIsNull(row,2))
{
LPWSTR cond = NULL;
cond = load_dynamic_stringW(row,2);
@@ -792,11 +820,11 @@
if (cond)
{
/* this is a hack to skip errors in the condition code */
- if (MsiEvaluateConditionW(hPackage, cond) ==
+ if (MSI_EvaluateConditionW(package, cond) ==
MSICONDITION_FALSE)
{
HeapFree(GetProcessHeap(),0,cond);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
else
@@ -805,28 +833,28 @@
}
sz=0x100;
- rc = MsiRecordGetStringW(row,1,buffer,&sz);
+ rc = MSI_RecordGetStringW(row,1,buffer,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Error is %x\n",rc);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- rc = ACTION_PerformAction(hPackage,buffer);
+ rc = ACTION_PerformAction(package,buffer);
if (rc != ERROR_SUCCESS)
{
ERR("Execution halted due to error (%i)\n",rc);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
end:
@@ -845,50 +873,50 @@
* But until I get write access to the database that is hard, so I am going to
* hack it to see if I can get something to run.
*/
-UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action)
+UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action)
{
UINT rc = ERROR_SUCCESS;
TRACE("Performing action (%s)\n",debugstr_w(action));
- ui_actioninfo(hPackage, action, TRUE, 0);
- ui_actionstart(hPackage, action);
- ui_progress(hPackage,2,1,0,0);
+ ui_actioninfo(package, action, TRUE, 0);
+ ui_actionstart(package, action);
+ ui_progress(package,2,1,0,0);
/* pre install, setup and configuration block */
if (strcmpW(action,szLaunchConditions)==0)
- rc = ACTION_LaunchConditions(hPackage);
+ rc = ACTION_LaunchConditions(package);
else if (strcmpW(action,szCostInitialize)==0)
- rc = ACTION_CostInitialize(hPackage);
+ rc = ACTION_CostInitialize(package);
else if (strcmpW(action,szFileCost)==0)
- rc = ACTION_FileCost(hPackage);
+ rc = ACTION_FileCost(package);
else if (strcmpW(action,szCostFinalize)==0)
- rc = ACTION_CostFinalize(hPackage);
+ rc = ACTION_CostFinalize(package);
else if (strcmpW(action,szInstallValidate)==0)
- rc = ACTION_InstallValidate(hPackage);
+ rc = ACTION_InstallValidate(package);
/* install block */
else if (strcmpW(action,szProcessComponents)==0)
- rc = ACTION_ProcessComponents(hPackage);
+ rc = ACTION_ProcessComponents(package);
else if (strcmpW(action,szInstallInitialize)==0)
- rc = ACTION_InstallInitialize(hPackage);
+ rc = ACTION_InstallInitialize(package);
else if (strcmpW(action,szCreateFolders)==0)
- rc = ACTION_CreateFolders(hPackage);
+ rc = ACTION_CreateFolders(package);
else if (strcmpW(action,szInstallFiles)==0)
- rc = ACTION_InstallFiles(hPackage);
+ rc = ACTION_InstallFiles(package);
else if (strcmpW(action,szDuplicateFiles)==0)
- rc = ACTION_DuplicateFiles(hPackage);
+ rc = ACTION_DuplicateFiles(package);
else if (strcmpW(action,szWriteRegistryValues)==0)
- rc = ACTION_WriteRegistryValues(hPackage);
+ rc = ACTION_WriteRegistryValues(package);
else if (strcmpW(action,szRegisterTypeLibraries)==0)
- rc = ACTION_RegisterTypeLibraries(hPackage);
+ rc = ACTION_RegisterTypeLibraries(package);
else if (strcmpW(action,szRegisterClassInfo)==0)
- rc = ACTION_RegisterClassInfo(hPackage);
+ rc = ACTION_RegisterClassInfo(package);
else if (strcmpW(action,szRegisterProgIdInfo)==0)
- rc = ACTION_RegisterProgIdInfo(hPackage);
+ rc = ACTION_RegisterProgIdInfo(package);
else if (strcmpW(action,szCreateShortcuts)==0)
- rc = ACTION_CreateShortcuts(hPackage);
+ rc = ACTION_CreateShortcuts(package);
else if (strcmpW(action,szPublishProduct)==0)
- rc = ACTION_PublishProduct(hPackage);
+ rc = ACTION_PublishProduct(package);
/*
Called during iTunes but unimplemented and seem important
@@ -897,22 +925,22 @@
RegisterProduct
InstallFinalize
*/
- else if ((rc = ACTION_CustomAction(hPackage,action)) != ERROR_SUCCESS)
+ else if ((rc = ACTION_CustomAction(package,action)) != ERROR_SUCCESS)
{
FIXME("UNHANDLED MSI ACTION %s\n",debugstr_w(action));
rc = ERROR_SUCCESS;
}
- ui_actioninfo(hPackage, action, FALSE, rc);
+ ui_actioninfo(package, action, FALSE, rc);
return rc;
}
-static UINT ACTION_CustomAction(MSIHANDLE hPackage,const WCHAR *action)
+static UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action)
{
UINT rc = ERROR_SUCCESS;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
WCHAR ExecSeqQuery[1024] =
{'s','e','l','e','c','t',' ','*',' ','f','r','o','m',' ','C','u','s','t','o'
,'m','A','c','t','i','o','n',' ','w','h','e','r','e',' ','`','A','c','t','i'
@@ -922,35 +950,32 @@
LPWSTR source;
LPWSTR target;
WCHAR *deformated=NULL;
- MSIHANDLE db;
strcatW(ExecSeqQuery,action);
strcatW(ExecSeqQuery,end);
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewW(db, ExecSeqQuery, &view);
- MsiCloseHandle(db);
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- type = MsiRecordGetInteger(row,2);
+ type = MSI_RecordGetInteger(row,2);
source = load_dynamic_stringW(row,3);
target = load_dynamic_stringW(row,4);
@@ -962,15 +987,15 @@
switch (type & CUSTOM_ACTION_TYPE_MASK)
{
case 1: /* DLL file stored in a Binary table stream */
- rc = HANDLE_CustomType1(hPackage,source,target,type);
+ rc = HANDLE_CustomType1(package,source,target,type);
break;
case 2: /* EXE file stored in a Binary table strem */
- rc = HANDLE_CustomType2(hPackage,source,target,type);
+ rc = HANDLE_CustomType2(package,source,target,type);
break;
case 35: /* Directory set with formatted text. */
case 51: /* Property set with formatted text. */
- deformat_string(hPackage,target,&deformated);
- rc = MsiSetPropertyW(hPackage,source,deformated);
+ deformat_string(package,target,&deformated);
+ rc = MSI_SetPropertyW(package,source,deformated);
HeapFree(GetProcessHeap(),0,deformated);
break;
default:
@@ -981,18 +1006,18 @@
HeapFree(GetProcessHeap(),0,source);
HeapFree(GetProcessHeap(),0,target);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static UINT store_binary_to_temp(MSIHANDLE hPackage, const LPWSTR source,
+static UINT store_binary_to_temp(MSIPACKAGE *package, const LPWSTR source,
LPWSTR tmp_file)
{
DWORD sz=MAX_PATH;
- if (MsiGetPropertyW(hPackage, cszTempFolder, tmp_file, &sz)
+ if (MSI_GetPropertyW(package, cszTempFolder, tmp_file, &sz)
!= ERROR_SUCCESS)
GetTempPathW(MAX_PATH,tmp_file);
@@ -1007,17 +1032,16 @@
{
/* write out the file */
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
WCHAR Query[1024] =
{'s','e','l','e','c','t',' ','*',' ','f','r','o','m',' ','B','i'
,'n','a','r','y',' ','w','h','e','r','e',' ','N','a','m','e','=','`',0};
static const WCHAR end[]={'`',0};
HANDLE the_file;
CHAR buffer[1024];
- MSIHANDLE db;
- if (track_tempfile(hPackage, source, tmp_file)!=0)
+ if (track_tempfile(package, source, tmp_file)!=0)
FIXME("File Name in temp tracking collision\n");
the_file = CreateFileW(tmp_file, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
@@ -1029,26 +1053,23 @@
strcatW(Query,source);
strcatW(Query,end);
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewW(db, Query, &view);
- MsiCloseHandle(db);
-
+ rc = MSI_DatabaseOpenViewW( package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -1056,7 +1077,7 @@
{
DWORD write;
sz = 1024;
- rc = MsiRecordReadStream(row,2,buffer,&sz);
+ rc = MSI_RecordReadStream(row,2,buffer,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Failed to get stream\n");
@@ -1069,9 +1090,9 @@
CloseHandle(the_file);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
return ERROR_SUCCESS;
@@ -1081,7 +1102,7 @@
typedef UINT CustomEntry(MSIHANDLE);
typedef struct
{
- MSIHANDLE hPackage;
+ MSIPACKAGE *package;
WCHAR target[MAX_PATH];
WCHAR source[MAX_PATH];
} thread_struct;
@@ -1105,8 +1126,15 @@
fn = (CustomEntry*)GetProcAddress(DLL,proc);
if (fn)
{
+ MSIHANDLE hPackage;
+ MSIPACKAGE *package = stuff->package;
+
TRACE("Calling function\n");
- fn(stuff->hPackage);
+ hPackage = msiobj_findhandle( &package->hdr );
+ if( !hPackage )
+ ERR("Handle for object %p not found\n", package );
+ fn(hPackage);
+ msiobj_release( &package->hdr );
}
else
ERR("Cannot load functon\n");
@@ -1116,11 +1144,12 @@
}
else
ERR("Unable to load library\n");
+ msiobj_release( &stuff->package->hdr );
return 0;
}
-static UINT HANDLE_CustomType1(MSIHANDLE hPackage, const LPWSTR source,
+static UINT HANDLE_CustomType1(MSIPACKAGE *package, const LPWSTR source,
const LPWSTR target, const INT type)
{
WCHAR tmp_file[MAX_PATH];
@@ -1129,7 +1158,7 @@
LPSTR proc;
static thread_struct info;
- store_binary_to_temp(hPackage, source, tmp_file);
+ store_binary_to_temp(package, source, tmp_file);
TRACE("Calling function %s from %s\n",debugstr_w(target),
debugstr_w(tmp_file));
@@ -1142,13 +1171,16 @@
if (type & 0xc0)
{
- DWORD ThreadId;
- info.hPackage = hPackage;
+// DWORD ThreadId;
+
+// msiobj_addref( &package->hdr );
+ info.package = package;
strcpyW(info.target,target);
strcpyW(info.source,tmp_file);
TRACE("Start Asyncronous execution\n");
FIXME("DATABASE NOT THREADSAFE... not starting\n");
// CreateThread(NULL,0,DllThread,(LPVOID)&info,0,&ThreadId);
+ /* FIXME: release the package if the CreateThread fails */
return ERROR_SUCCESS;
}
@@ -1159,8 +1191,14 @@
fn = (CustomEntry*)GetProcAddress(DLL,proc);
if (fn)
{
+ MSIHANDLE hPackage;
+
TRACE("Calling function\n");
+ hPackage = msiobj_findhandle( &package->hdr );
+ if( !hPackage )
+ ERR("Handle for object %p not found\n", package );
fn(hPackage);
+ msiobj_release( &package->hdr );
}
else
ERR("Cannot load functon\n");
@@ -1174,7 +1212,7 @@
return ERROR_SUCCESS;
}
-static UINT HANDLE_CustomType2(MSIHANDLE hPackage, const LPWSTR source,
+static UINT HANDLE_CustomType2(MSIPACKAGE *package, const LPWSTR source,
const LPWSTR target, const INT type)
{
WCHAR tmp_file[MAX_PATH*2];
@@ -1187,10 +1225,10 @@
memset(&si,0,sizeof(STARTUPINFOW));
memset(&info,0,sizeof(PROCESS_INFORMATION));
- store_binary_to_temp(hPackage, source, tmp_file);
+ store_binary_to_temp(package, source, tmp_file);
strcatW(tmp_file,spc);
- deformat_string(hPackage,target,&deformated);
+ deformat_string(package,target,&deformated);
strcatW(tmp_file,deformated);
HeapFree(GetProcessHeap(),0,deformated);
@@ -1269,26 +1307,24 @@
* Also we cannot enable/disable components either, so for now I am just going
* to do all the directories for all the components.
*/
-static UINT ACTION_CreateFolders(MSIHANDLE hPackage)
+static UINT ACTION_CreateFolders(MSIPACKAGE *package)
{
- static const CHAR *ExecSeqQuery = "select Directory_ from CreateFolder";
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','D','i','r','e','c','t','o','r','y','_',' ',
+ 'f','r','o','m',' ','C','r','e','a','t','e','F','o','l','d','e','r',0 };
UINT rc;
- MSIHANDLE view;
- MSIHANDLE db;
+ MSIQUERY *view;
MSIFOLDER *folder;
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
- MsiCloseHandle(db);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view );
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -1297,10 +1333,9 @@
WCHAR dir[0x100];
WCHAR full_path[MAX_PATH];
DWORD sz;
- MSIHANDLE row = 0;
- MSIHANDLE uirow;
+ MSIRECORD *row = NULL, *uirow;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -1308,47 +1343,47 @@
}
sz=0x100;
- rc = MsiRecordGetStringW(row,1,dir,&sz);
+ rc = MSI_RecordGetStringW(row,1,dir,&sz);
if (rc!= ERROR_SUCCESS)
{
ERR("Unable to get folder id \n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
sz = MAX_PATH;
- rc = resolve_folder(hPackage,dir,full_path,FALSE,FALSE,&folder);
+ rc = resolve_folder(package,dir,full_path,FALSE,FALSE,&folder);
if (rc != ERROR_SUCCESS)
{
ERR("Unable to resolve folder id %s\n",debugstr_w(dir));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
TRACE("Folder is %s\n",debugstr_w(full_path));
/* UI stuff */
- uirow = MsiCreateRecord(1);
- MsiRecordSetStringW(uirow,1,full_path);
- ui_actiondata(hPackage,szCreateFolders,uirow);
- MsiCloseHandle(uirow);
+ uirow = MSI_CreateRecord(1);
+ MSI_RecordSetStringW(uirow,1,full_path);
+ ui_actiondata(package,szCreateFolders,uirow);
+ msiobj_release( &uirow->hdr );
if (folder->State == 0)
create_full_pathW(full_path);
folder->State = 3;
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static int load_component(MSIPACKAGE* package, MSIHANDLE row)
+static int load_component(MSIPACKAGE* package, MSIRECORD * row)
{
int index = package->loaded_components;
DWORD sz;
@@ -1367,25 +1402,25 @@
memset(&package->components[index],0,sizeof(MSICOMPONENT));
sz = 96;
- MsiRecordGetStringW(row,1,package->components[index].Component,&sz);
+ MSI_RecordGetStringW(row,1,package->components[index].Component,&sz);
TRACE("Loading Component %s\n",
debugstr_w(package->components[index].Component));
sz = 0x100;
- if (!MsiRecordIsNull(row,2))
- MsiRecordGetStringW(row,2,package->components[index].ComponentId,&sz);
+ if (!MSI_RecordIsNull(row,2))
+ MSI_RecordGetStringW(row,2,package->components[index].ComponentId,&sz);
sz = 96;
- MsiRecordGetStringW(row,3,package->components[index].Directory,&sz);
+ MSI_RecordGetStringW(row,3,package->components[index].Directory,&sz);
- package->components[index].Attributes = MsiRecordGetInteger(row,4);
+ package->components[index].Attributes = MSI_RecordGetInteger(row,4);
sz = 0x100;
- MsiRecordGetStringW(row,5,package->components[index].Condition,&sz);
+ MSI_RecordGetStringW(row,5,package->components[index].Condition,&sz);
sz = 96;
- MsiRecordGetStringW(row,6,package->components[index].KeyPath,&sz);
+ MSI_RecordGetStringW(row,6,package->components[index].KeyPath,&sz);
package->components[index].State = INSTALLSTATE_UNKNOWN;
package->components[index].Enabled = TRUE;
@@ -1394,7 +1429,7 @@
return index;
}
-static void load_feature(MSIPACKAGE* package, MSIHANDLE row)
+static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
{
int index = package->loaded_features;
DWORD sz;
@@ -1406,10 +1441,11 @@
'O','M',' ','C','o','m','p','o','n','e','n','t',' ','W','H','E','R','E',' ','C',
'o','m','p','o','n','e','n','t','=','\'','%','s','\'',0};
WCHAR Query[1024];
- MSIHANDLE view;
- MSIHANDLE view2;
- MSIHANDLE row2;
- MSIHANDLE row3;
+ MSIQUERY * view;
+ MSIQUERY * view2;
+ MSIRECORD * row2;
+ MSIRECORD * row3;
+ UINT rc;
/* fill in the data */
@@ -1423,39 +1459,47 @@
memset(&package->features[index],0,sizeof(MSIFEATURE));
sz = 96;
- MsiRecordGetStringW(row,1,package->features[index].Feature,&sz);
+ MSI_RecordGetStringW(row,1,package->features[index].Feature,&sz);
TRACE("Loading feature %s\n",debugstr_w(package->features[index].Feature));
sz = 96;
- if (!MsiRecordIsNull(row,2))
- MsiRecordGetStringW(row,2,package->features[index].Feature_Parent,&sz);
+ if (!MSI_RecordIsNull(row,2))
+ MSI_RecordGetStringW(row,2,package->features[index].Feature_Parent,&sz);
sz = 0x100;
- if (!MsiRecordIsNull(row,3))
- MsiRecordGetStringW(row,3,package->features[index].Title,&sz);
+ if (!MSI_RecordIsNull(row,3))
+ MSI_RecordGetStringW(row,3,package->features[index].Title,&sz);
sz = 0x100;
- if (!MsiRecordIsNull(row,4))
- MsiRecordGetStringW(row,4,package->features[index].Description,&sz);
+ if (!MSI_RecordIsNull(row,4))
+ MSI_RecordGetStringW(row,4,package->features[index].Description,&sz);
- if (!MsiRecordIsNull(row,5))
- package->features[index].Display = MsiRecordGetInteger(row,5);
+ if (!MSI_RecordIsNull(row,5))
+ package->features[index].Display = MSI_RecordGetInteger(row,5);
- package->features[index].Level= MsiRecordGetInteger(row,6);
+ package->features[index].Level= MSI_RecordGetInteger(row,6);
sz = 96;
- if (!MsiRecordIsNull(row,7))
- MsiRecordGetStringW(row,7,package->features[index].Directory,&sz);
+ if (!MSI_RecordIsNull(row,7))
+ MSI_RecordGetStringW(row,7,package->features[index].Directory,&sz);
- package->features[index].Attributes= MsiRecordGetInteger(row,8);
+ package->features[index].Attributes= MSI_RecordGetInteger(row,8);
package->features[index].State = INSTALLSTATE_UNKNOWN;
/* load feature components */
sprintfW(Query,Query1,package->features[index].Feature);
- MsiDatabaseOpenViewW(package->db,Query,&view);
- MsiViewExecute(view,0);
+ rc = MSI_DatabaseOpenViewW(package->db,Query,&view);
+ if (rc != ERROR_SUCCESS)
+ return;
+ rc = MSI_ViewExecute(view,0);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return;
+ }
while (1)
{
DWORD sz = 0x100;
@@ -1464,12 +1508,12 @@
INT c_indx;
INT cnt = package->features[index].ComponentCount;
- rc = MsiViewFetch(view,&row2);
+ rc = MSI_ViewFetch(view,&row2);
if (rc != ERROR_SUCCESS)
break;
sz = 0x100;
- MsiRecordGetStringW(row2,1,buffer,&sz);
+ MSI_RecordGetStringW(row2,1,buffer,&sz);
/* check to see if the component is already loaded */
c_indx = get_loaded_component(package,buffer);
@@ -1483,27 +1527,39 @@
sprintfW(Query,Query2,buffer);
- MsiDatabaseOpenViewW(package->db,Query,&view2);
- MsiViewExecute(view2,0);
+ rc = MSI_DatabaseOpenViewW(package->db,Query,&view2);
+ if (rc != ERROR_SUCCESS)
+ {
+ msiobj_release( &row2->hdr );
+ continue;
+ }
+ rc = MSI_ViewExecute(view2,0);
+ if (rc != ERROR_SUCCESS)
+ {
+ msiobj_release( &row2->hdr );
+ MSI_ViewClose(view2);
+ msiobj_release( &view2->hdr );
+ continue;
+ }
while (1)
{
DWORD rc;
- rc = MsiViewFetch(view2,&row3);
+ rc = MSI_ViewFetch(view2,&row3);
if (rc != ERROR_SUCCESS)
break;
c_indx = load_component(package,row3);
- MsiCloseHandle(row3);
+ msiobj_release( &row3->hdr );
package->features[index].Components[cnt] = c_indx;
package->features[index].ComponentCount ++;
}
- MsiViewClose(view2);
- MsiCloseHandle(view2);
- MsiCloseHandle(row2);
+ MSI_ViewClose(view2);
+ msiobj_release( &view2->hdr );
+ msiobj_release( &row2->hdr );
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
/*
@@ -1519,41 +1575,51 @@
* resolved base on property only based on their entrys in the
* directory table.
*/
-static UINT ACTION_CostInitialize(MSIHANDLE hPackage)
+static UINT ACTION_CostInitialize(MSIPACKAGE *package)
{
- MSIHANDLE view;
- MSIHANDLE row;
+ MSIQUERY * view;
+ MSIRECORD * row;
DWORD sz;
- MSIPACKAGE *package;
-
- static const CHAR Query_all[] = "SELECT * FROM Feature";
-
- MsiSetPropertyA(hPackage,"CostingComplete","0");
- MsiSetPropertyW(hPackage, cszRootDrive , c_collen);
+ UINT rc;
+ static const WCHAR Query_all[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','F','e','a','t','u','r','e',0};
+ static const WCHAR szCosting[] = {
+ 'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
+ static const WCHAR szZero[] = { '0', 0 };
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
+ MSI_SetPropertyW(package, szCosting, szZero);
+ MSI_SetPropertyW(package, cszRootDrive , c_collen);
sz = 0x100;
- MsiDatabaseOpenViewA(package->db,Query_all,&view);
- MsiViewExecute(view,0);
+ rc = MSI_DatabaseOpenViewW(package->db,Query_all,&view);
+ if (rc != ERROR_SUCCESS)
+ return rc;
+ rc = MSI_ViewExecute(view,0);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
while (1)
{
DWORD rc;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
break;
load_feature(package,row);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return ERROR_SUCCESS;
}
-static int load_file(MSIPACKAGE* package, MSIHANDLE row)
+static int load_file(MSIPACKAGE* package, MSIRECORD * row)
{
int index = package->loaded_files;
int i;
@@ -1572,10 +1638,10 @@
memset(&package->files[index],0,sizeof(MSIFILE));
sz = 72;
- MsiRecordGetStringW(row,1,package->files[index].File,&sz);
+ MSI_RecordGetStringW(row,1,package->files[index].File,&sz);
sz = 0x100;
- MsiRecordGetStringW(row,2,buffer,&sz);
+ MSI_RecordGetStringW(row,2,buffer,&sz);
package->files[index].ComponentIndex = -1;
for (i = 0; i < package->loaded_components; i++)
@@ -1588,24 +1654,24 @@
ERR("Unfound Component %s\n",debugstr_w(buffer));
sz = MAX_PATH;
- MsiRecordGetStringW(row,3,package->files[index].FileName,&sz);
+ MSI_RecordGetStringW(row,3,package->files[index].FileName,&sz);
reduce_to_longfilename(package->files[index].FileName);
- package->files[index].FileSize = MsiRecordGetInteger(row,4);
+ package->files[index].FileSize = MSI_RecordGetInteger(row,4);
sz = 72;
- if (!MsiRecordIsNull(row,5))
- MsiRecordGetStringW(row,5,package->files[index].Version,&sz);
+ if (!MSI_RecordIsNull(row,5))
+ MSI_RecordGetStringW(row,5,package->files[index].Version,&sz);
sz = 20;
- if (!MsiRecordIsNull(row,6))
- MsiRecordGetStringW(row,6,package->files[index].Language,&sz);
+ if (!MSI_RecordIsNull(row,6))
+ MSI_RecordGetStringW(row,6,package->files[index].Language,&sz);
- if (!MsiRecordIsNull(row,7))
- package->files[index].Attributes= MsiRecordGetInteger(row,7);
+ if (!MSI_RecordIsNull(row,7))
+ package->files[index].Attributes= MSI_RecordGetInteger(row,7);
- package->files[index].Sequence= MsiRecordGetInteger(row,8);
+ package->files[index].Sequence= MSI_RecordGetInteger(row,8);
package->files[index].Temporary = FALSE;
package->files[index].State = 0;
@@ -1615,48 +1681,49 @@
return ERROR_SUCCESS;
}
-static UINT ACTION_FileCost(MSIHANDLE hPackage)
+static UINT ACTION_FileCost(MSIPACKAGE *package)
{
- MSIHANDLE view;
- MSIHANDLE row;
- MSIPACKAGE *package;
+ MSIQUERY * view;
+ MSIRECORD * row;
UINT rc;
- static const CHAR Query[] = "SELECT * FROM File Order by Sequence";
+ static const WCHAR Query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','F','i','l','e',' ',
+ 'O','r','d','e','r',' ','b','y',' ','S','e','q','u','e','n','c','e', 0};
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
while (1)
{
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
break;
}
load_file(package,row);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return ERROR_SUCCESS;
}
-static INT load_folder(MSIHANDLE hPackage, const WCHAR* dir)
+static INT load_folder(MSIPACKAGE *package, const WCHAR* dir)
{
WCHAR Query[1024] =
@@ -1665,18 +1732,15 @@
'o','r','y','`',' ','=',' ','`',0};
static const WCHAR end[]={'`',0};
UINT rc;
- MSIHANDLE view;
+ MSIQUERY * view;
WCHAR targetbuffer[0x100];
WCHAR *srcdir = NULL;
WCHAR *targetdir = NULL;
WCHAR parent[0x100];
DWORD sz=0x100;
- MSIHANDLE row = 0;
- MSIPACKAGE *package;
+ MSIRECORD * row = 0;
INT i,index = -1;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
TRACE("Looking for dir %s\n",debugstr_w(dir));
for (i = 0; i < package->loaded_folders; i++)
@@ -1708,29 +1772,29 @@
strcatW(Query,dir);
strcatW(Query,end);
- rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return -1;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return -1;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return -1;
}
sz=0x100;
- MsiRecordGetStringW(row,3,targetbuffer,&sz);
+ MSI_RecordGetStringW(row,3,targetbuffer,&sz);
targetdir=targetbuffer;
/* split src and target dir */
@@ -1772,17 +1836,17 @@
else if (targetdir)
strcpyW(package->folders[index].SourceDefault,targetdir);
- if (MsiRecordIsNull(row,2))
+ if (MSI_RecordIsNull(row,2))
parent[0]=0;
else
{
sz=0x100;
- MsiRecordGetStringW(row,2,parent,&sz);
+ MSI_RecordGetStringW(row,2,parent,&sz);
}
if (parent[0])
{
- i = load_folder(hPackage,parent);
+ i = load_folder(package,parent);
package->folders[index].ParentIndex = i;
TRACE("Parent is index %i... %s %s\n",
package->folders[index].ParentIndex,
@@ -1793,27 +1857,24 @@
package->folders[index].ParentIndex = -2;
sz = MAX_PATH;
- rc = MsiGetPropertyW(hPackage, dir, package->folders[index].Property, &sz);
+ rc = MSI_GetPropertyW(package, dir, package->folders[index].Property, &sz);
if (rc != ERROR_SUCCESS)
package->folders[index].Property[0]=0;
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
TRACE(" %s retuning on index %i\n",debugstr_w(dir),index);
return index;
}
-static UINT resolve_folder(MSIHANDLE hPackage, LPCWSTR name, LPWSTR path,
+static UINT resolve_folder(MSIPACKAGE *package, LPCWSTR name, LPWSTR path,
BOOL source, BOOL set_prop, MSIFOLDER **folder)
{
- MSIPACKAGE *package;
INT i;
UINT rc = ERROR_SUCCESS;
DWORD sz;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
TRACE("Working to resolve %s\n",debugstr_w(name));
if (!path)
@@ -1825,13 +1886,13 @@
if (!source)
{
sz = MAX_PATH;
- rc = MsiGetPropertyW(hPackage,cszTargetDir,path,&sz);
+ rc = MSI_GetPropertyW(package,cszTargetDir,path,&sz);
if (rc != ERROR_SUCCESS)
{
sz = MAX_PATH;
- rc = MsiGetPropertyW(hPackage,cszRootDrive,path,&sz);
+ rc = MSI_GetPropertyW(package,cszRootDrive,path,&sz);
if (set_prop)
- MsiSetPropertyW(hPackage,cszTargetDir,path);
+ MSI_SetPropertyW(package,cszTargetDir,path);
}
if (folder)
*folder = &(package->folders[0]);
@@ -1840,11 +1901,11 @@
else
{
sz = MAX_PATH;
- rc = MsiGetPropertyW(hPackage,cszSourceDir,path,&sz);
+ rc = MSI_GetPropertyW(package,cszSourceDir,path,&sz);
if (rc != ERROR_SUCCESS)
{
sz = MAX_PATH;
- rc = MsiGetPropertyW(hPackage,cszDatabase,path,&sz);
+ rc = MSI_GetPropertyW(package,cszDatabase,path,&sz);
if (rc == ERROR_SUCCESS)
{
LPWSTR ptr = strrchrW(path,'\\');
@@ -1889,7 +1950,7 @@
strcpyW(path,package->folders[i].Property);
TRACE(" internally set to %s\n",debugstr_w(path));
if (set_prop)
- MsiSetPropertyW(hPackage,name,path);
+ MSI_SetPropertyW(package,name,path);
return ERROR_SUCCESS;
}
@@ -1897,7 +1958,7 @@
{
TRACE(" ! Parent is %s\n", debugstr_w(package->folders[
package->folders[i].ParentIndex].Directory));
- resolve_folder(hPackage, package->folders[
+ resolve_folder(package, package->folders[
package->folders[i].ParentIndex].Directory, path,source,
set_prop, NULL);
@@ -1911,7 +1972,7 @@
strcpyW(package->folders[i].ResolvedTarget,path);
TRACE(" resolved into %s\n",debugstr_w(path));
if (set_prop)
- MsiSetPropertyW(hPackage,name,path);
+ MSI_SetPropertyW(package,name,path);
}
else
{
@@ -1932,29 +1993,32 @@
* to focus on the directory building
*
*/
-static UINT ACTION_CostFinalize(MSIHANDLE hPackage)
+static UINT ACTION_CostFinalize(MSIPACKAGE *package)
{
- static const CHAR *ExecSeqQuery = "select * from Directory";
- static const CHAR *ConditionQuery = "select * from Condition";
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+ 'D','i','r','e','c','t','o','r','y',0};
+ static const WCHAR ConditionQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+ 'C','o','n','d','i','t','i','o','n',0};
+ static const WCHAR szCosting[] = {
+ 'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
+ static const WCHAR szOne[] = { '1', 0 };
UINT rc;
- MSIHANDLE view;
- MSIPACKAGE *package;
+ MSIQUERY * view;
INT i;
TRACE("Building Directory properties\n");
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
- rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -1962,11 +2026,10 @@
{
WCHAR name[0x100];
WCHAR path[MAX_PATH];
- MSIHANDLE row = 0;
+ MSIRECORD * row = 0;
DWORD sz;
- rc = MsiViewFetch(view,&row);
-
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -1974,18 +2037,18 @@
}
sz=0x100;
- MsiRecordGetStringW(row,1,name,&sz);
+ MSI_RecordGetStringW(row,1,name,&sz);
/* This helper function now does ALL the work */
TRACE("Dir %s ...\n",debugstr_w(name));
- load_folder(hPackage,name);
- resolve_folder(hPackage,name,path,FALSE,TRUE,NULL);
+ load_folder(package,name);
+ resolve_folder(package,name,path,FALSE,TRUE,NULL);
TRACE("resolves to %s\n",debugstr_w(path));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
TRACE("File calculations %i files\n",package->loaded_files);
@@ -2001,7 +2064,7 @@
if (comp)
{
/* calculate target */
- resolve_folder(hPackage, comp->Directory, file->TargetPath, FALSE,
+ resolve_folder(package, comp->Directory, file->TargetPath, FALSE,
FALSE, NULL);
strcatW(file->TargetPath,file->FileName);
@@ -2052,27 +2115,26 @@
TRACE("Evaluating Condition Table\n");
- rc = MsiDatabaseOpenViewA(package->db, ConditionQuery, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ConditionQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
while (1)
{
WCHAR Feature[0x100];
- MSIHANDLE row = 0;
+ MSIRECORD * row = 0;
DWORD sz;
int feature_index;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
@@ -2081,7 +2143,7 @@
}
sz = 0x100;
- MsiRecordGetStringW(row,1,Feature,&sz);
+ MSI_RecordGetStringW(row,1,Feature,&sz);
feature_index = get_loaded_feature(package,Feature);
if (feature_index < 0)
@@ -2091,9 +2153,9 @@
LPWSTR Condition;
Condition = load_dynamic_stringW(row,3);
- if (MsiEvaluateConditionW(hPackage,Condition) == MSICONDITION_TRUE)
+ if (MSI_EvaluateConditionW(package,Condition) == MSICONDITION_TRUE)
{
- int level = MsiRecordGetInteger(row,2);
+ int level = MSI_RecordGetInteger(row,2);
TRACE("Reseting feature %s to level %i\n",debugstr_w(Feature),
level);
package->features[feature_index].Level = level;
@@ -2101,17 +2163,17 @@
HeapFree(GetProcessHeap(),0,Condition);
}
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
TRACE("Enabling or Disabling Components\n");
for (i = 0; i < package->loaded_components; i++)
{
if (package->components[i].Condition[0])
{
- if (MsiEvaluateConditionW(hPackage,
+ if (MSI_EvaluateConditionW(package,
package->components[i].Condition) == MSICONDITION_FALSE)
{
TRACE("Disabling component %s\n",
@@ -2121,14 +2183,14 @@
}
}
- MsiSetPropertyA(hPackage,"CostingComplete","1");
+ MSI_SetPropertyW(package,szCosting,szOne);
return ERROR_SUCCESS;
}
/*
* This is a helper function for handling embedded cabinet media
*/
-static UINT writeout_cabinet_stream(MSIHANDLE hPackage, WCHAR* stream_name,
+static UINT writeout_cabinet_stream(MSIPACKAGE *package, WCHAR* stream_name,
WCHAR* source)
{
UINT rc;
@@ -2136,23 +2198,19 @@
UINT size;
DWORD write;
HANDLE the_file;
- MSIHANDLE db;
WCHAR tmp[MAX_PATH];
- db = MsiGetActiveDatabase(hPackage);
- rc = read_raw_stream_data(db,stream_name,&data,&size);
- MsiCloseHandle(db);
-
+ rc = read_raw_stream_data(package->db,stream_name,&data,&size);
if (rc != ERROR_SUCCESS)
return rc;
write = MAX_PATH;
- if (MsiGetPropertyW(hPackage, cszTempFolder, tmp, &write))
+ if (MSI_GetPropertyW(package, cszTempFolder, tmp, &write))
GetTempPathW(MAX_PATH,tmp);
GetTempFileNameW(tmp,stream_name,0,source);
- track_tempfile(hPackage,strrchrW(source,'\\'), source);
+ track_tempfile(package,strrchrW(source,'\\'), source);
the_file = CreateFileW(source, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
@@ -2264,21 +2322,23 @@
return TRUE;
}
-static UINT ready_media_for_file(MSIHANDLE hPackage, UINT sequence,
+static UINT ready_media_for_file(MSIPACKAGE *package, UINT sequence,
WCHAR* path)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
WCHAR source[MAX_PATH];
- static const CHAR *ExecSeqQuery =
- "select * from Media where LastSequence >= %i order by LastSequence";
- CHAR Query[1024];
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ',
+ 'f','r','o','m',' ','M','e','d','i','a',' ',
+ 'w','h','e','r','e',' ','L','a','s','t','S','e','q','u','e','n','c','e',' ','>','=',' ','%','i',' ',
+ 'o','r','d','e','r',' ','b','y',' ','L','a','s','t','S','e','q','u','e','n','c','e',0};
+ WCHAR Query[1024];
WCHAR cab[0x100];
DWORD sz=0x100;
INT seq;
static INT last_sequence = 0;
- MSIHANDLE db;
if (sequence <= last_sequence)
{
@@ -2286,49 +2346,46 @@
return ERROR_SUCCESS;
}
- sprintf(Query,ExecSeqQuery,sequence);
-
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewA(db, Query, &view);
- MsiCloseHandle(db);
+ sprintfW(Query,ExecSeqQuery,sequence);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- seq = MsiRecordGetInteger(row,2);
+ seq = MSI_RecordGetInteger(row,2);
last_sequence = seq;
- if (!MsiRecordIsNull(row,4))
+ if (!MSI_RecordIsNull(row,4))
{
sz=0x100;
- MsiRecordGetStringW(row,4,cab,&sz);
+ MSI_RecordGetStringW(row,4,cab,&sz);
TRACE("Source is CAB %s\n",debugstr_w(cab));
/* the stream does not contain the # character */
if (cab[0]=='#')
{
- writeout_cabinet_stream(hPackage,&cab[1],source);
+ writeout_cabinet_stream(package,&cab[1],source);
strcpyW(path,source);
*(strrchrW(path,'\\')+1)=0;
}
else
{
sz = MAX_PATH;
- if (MsiGetPropertyW(hPackage, cszSourceDir, source, &sz))
+ if (MSI_GetPropertyW(package, cszSourceDir, source, &sz))
{
ERR("No Source dir defined \n");
rc = ERROR_FUNCTION_FAILED;
@@ -2339,27 +2396,26 @@
strcatW(source,cab);
/* extract the cab file into a folder in the temp folder */
sz = MAX_PATH;
- if (MsiGetPropertyW(hPackage, cszTempFolder,path, &sz)
+ if (MSI_GetPropertyW(package, cszTempFolder,path, &sz)
!= ERROR_SUCCESS)
GetTempPathW(MAX_PATH,path);
}
}
rc = !extract_cabinet_file(source,path);
}
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-inline static UINT create_component_directory (MSIHANDLE hPackage, MSIPACKAGE*
- package, INT component)
+inline static UINT create_component_directory ( MSIPACKAGE* package, INT component)
{
UINT rc;
MSIFOLDER *folder;
WCHAR install_path[MAX_PATH];
- rc = resolve_folder(hPackage, package->components[component].Directory,
+ rc = resolve_folder(package, package->components[component].Directory,
install_path, FALSE, FALSE, &folder);
if (rc != ERROR_SUCCESS)
@@ -2375,21 +2431,18 @@
return rc;
}
-static UINT ACTION_InstallFiles(MSIHANDLE hPackage)
+static UINT ACTION_InstallFiles(MSIPACKAGE *package)
{
UINT rc = ERROR_SUCCESS;
INT index;
- MSIPACKAGE *package;
- MSIHANDLE uirow;
+ MSIRECORD * uirow;
WCHAR uipath[MAX_PATH];
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
-
if (!package)
return ERROR_INVALID_HANDLE;
/* increment progress bar each time action data is sent */
- ui_progress(hPackage,1,1,1,0);
+ ui_progress(package,1,1,1,0);
for (index = 0; index < package->loaded_files; index++)
{
@@ -2412,7 +2465,7 @@
if ((file->State == 1) || (file->State == 2))
{
TRACE("Installing %s\n",debugstr_w(file->File));
- rc = ready_media_for_file(hPackage,file->Sequence,path_to_source);
+ rc = ready_media_for_file(package,file->Sequence,path_to_source);
/*
* WARNING!
* our file table could change here because a new temp file
@@ -2426,7 +2479,7 @@
break;
}
- create_component_directory(hPackage, package, file->ComponentIndex);
+ create_component_directory( package, file->ComponentIndex);
strcpyW(file->SourcePath, path_to_source);
strcatW(file->SourcePath, file->File);
@@ -2435,17 +2488,17 @@
debugstr_w(file->TargetPath));
/* the UI chunk */
- uirow=MsiCreateRecord(9);
- MsiRecordSetStringW(uirow,1,file->File);
+ uirow=MSI_CreateRecord(9);
+ MSI_RecordSetStringW(uirow,1,file->File);
strcpyW(uipath,file->TargetPath);
*(strrchrW(uipath,'\\')+1)=0;
- MsiRecordSetStringW(uirow,9,uipath);
- MsiRecordSetInteger(uirow,6,file->FileSize);
- ui_actiondata(hPackage,szInstallFiles,uirow);
- MsiCloseHandle(uirow);
+ MSI_RecordSetStringW(uirow,9,uipath);
+ MSI_RecordSetInteger(uirow,6,file->FileSize);
+ ui_actiondata(package,szInstallFiles,uirow);
+ msiobj_release( &uirow->hdr );
rc = !MoveFileW(file->SourcePath,file->TargetPath);
- ui_progress(hPackage,2,0,0,0);
+ ui_progress(package,2,0,0,0);
if (rc)
{
@@ -2460,13 +2513,11 @@
return rc;
}
-inline static UINT get_file_target(MSIHANDLE hPackage, LPCWSTR file_key,
+inline static UINT get_file_target(MSIPACKAGE *package, LPCWSTR file_key,
LPWSTR file_source)
{
- MSIPACKAGE *package;
INT index;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
@@ -2487,28 +2538,27 @@
return ERROR_FUNCTION_FAILED;
}
-static UINT ACTION_DuplicateFiles(MSIHANDLE hPackage)
+static UINT ACTION_DuplicateFiles(MSIPACKAGE *package)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *ExecSeqQuery = "select * from DuplicateFile";
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ','f','r','o','m',' ',
+ 'D','u','p','l','i','c','a','t','e','F','i','l','e',0};
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -2523,7 +2573,7 @@
DWORD sz=0x100;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -2531,11 +2581,11 @@
}
sz=0x100;
- rc = MsiRecordGetStringW(row,2,component,&sz);
+ rc = MSI_RecordGetStringW(row,2,component,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Unable to get component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
@@ -2544,40 +2594,40 @@
!package->components[component_index].FeatureState)
{
TRACE("Skipping copy due to disabled component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
sz=0x100;
- rc = MsiRecordGetStringW(row,3,file_key,&sz);
+ rc = MSI_RecordGetStringW(row,3,file_key,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Unable to get file key\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- rc = get_file_target(hPackage,file_key,file_source);
+ rc = get_file_target(package,file_key,file_source);
if (rc != ERROR_SUCCESS)
{
ERR("Original file unknown %s\n",debugstr_w(file_key));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
- if (MsiRecordIsNull(row,4))
+ if (MSI_RecordIsNull(row,4))
{
strcpyW(dest_name,strrchrW(file_source,'\\')+1);
}
else
{
sz=0x100;
- MsiRecordGetStringW(row,4,dest_name,&sz);
+ MSI_RecordGetStringW(row,4,dest_name,&sz);
reduce_to_longfilename(dest_name);
}
- if (MsiRecordIsNull(row,5))
+ if (MSI_RecordIsNull(row,5))
{
strcpyW(dest_path,file_source);
*strrchrW(dest_path,'\\')=0;
@@ -2586,13 +2636,13 @@
{
WCHAR destkey[0x100];
sz=0x100;
- MsiRecordGetStringW(row,5,destkey,&sz);
+ MSI_RecordGetStringW(row,5,destkey,&sz);
sz = 0x100;
- rc = resolve_folder(hPackage, destkey, dest_path,FALSE,FALSE,NULL);
+ rc = resolve_folder(package, destkey, dest_path,FALSE,FALSE,NULL);
if (rc != ERROR_SUCCESS)
{
ERR("Unable to get destination folder\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
break;
}
}
@@ -2612,10 +2662,10 @@
FIXME("We should track these duplicate files as well\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -2623,7 +2673,7 @@
/* OK this value is "interpretted" and then formatted based on the
first few characters */
-static LPSTR parse_value(MSIHANDLE hPackage, WCHAR *value, DWORD *type,
+static LPSTR parse_value(MSIPACKAGE *package, WCHAR *value, DWORD *type,
DWORD *size)
{
LPSTR data = NULL;
@@ -2636,7 +2686,7 @@
LPWSTR deformated;
int count;
- deformat_string(hPackage, &value[2], &deformated);
+ deformat_string(package, &value[2], &deformated);
/* binary value type */
ptr = deformated;
@@ -2664,7 +2714,7 @@
else
{
LPWSTR deformated;
- deformat_string(hPackage, &value[1], &deformated);
+ deformat_string(package, &value[1], &deformated);
*type=REG_DWORD;
*size = sizeof(DWORD);
@@ -2693,38 +2743,37 @@
else
ptr=value;
- *size = deformat_string(hPackage, ptr,(LPWSTR*)&data);
+ *size = deformat_string(package, ptr,(LPWSTR*)&data);
}
return data;
}
-static UINT ACTION_WriteRegistryValues(MSIHANDLE hPackage)
+static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *ExecSeqQuery = "select * from Registry";
- MSIPACKAGE *package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] = {
+ 's','e','l','e','c','t',' ','*',' ',
+ 'f','r','o','m',' ','R','e','g','i','s','t','r','y',0 };
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
/* increment progress bar each time action data is sent */
- ui_progress(hPackage,1,1,1,0);
+ ui_progress(package,1,1,1,0);
while (1)
{
@@ -2746,13 +2795,13 @@
DWORD type,size;
WCHAR component[0x100];
INT component_index;
- MSIHANDLE uirow;
+ MSIRECORD * uirow;
WCHAR uikey[0x110];
INT root;
DWORD sz=0x100;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -2760,34 +2809,34 @@
}
sz= 0x100;
- MsiRecordGetStringW(row,6,component,&sz);
+ MSI_RecordGetStringW(row,6,component,&sz);
component_index = get_loaded_component(package,component);
if (!package->components[component_index].Enabled ||
!package->components[component_index].FeatureState)
{
TRACE("Skipping write due to disabled component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
/* null values have special meanings during uninstalls and such */
- if(MsiRecordIsNull(row,5))
+ if(MSI_RecordIsNull(row,5))
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
- root = MsiRecordGetInteger(row,2);
+ root = MSI_RecordGetInteger(row,2);
sz = 0x100;
- MsiRecordGetStringW(row,3,key,&sz);
+ MSI_RecordGetStringW(row,3,key,&sz);
sz = 0x100;
- if (MsiRecordIsNull(row,4))
+ if (MSI_RecordIsNull(row,4))
name[0]=0;
else
- MsiRecordGetStringW(row,4,name,&sz);
+ MSI_RecordGetStringW(row,4,name,&sz);
/* get the root key */
switch (root)
@@ -2807,7 +2856,7 @@
}
if (!root_key)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -2815,40 +2864,40 @@
if (RegCreateKeyW( root_key, key, &hkey))
{
ERR("Could not create key %s\n",debugstr_w(key));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
value = load_dynamic_stringW(row,5);
- value_data = parse_value(hPackage, value, &type, &size);
+ value_data = parse_value(package, value, &type, &size);
if (value_data)
{
TRACE("Setting value %s\n",debugstr_w(name));
RegSetValueExW(hkey, name, 0, type, value_data, size);
- uirow = MsiCreateRecord(3);
- MsiRecordSetStringW(uirow,2,name);
- MsiRecordSetStringW(uirow,1,uikey);
+ uirow = MSI_CreateRecord(3);
+ MSI_RecordSetStringW(uirow,2,name);
+ MSI_RecordSetStringW(uirow,1,uikey);
if (type == REG_SZ)
- MsiRecordSetStringW(uirow,3,(LPWSTR)value_data);
+ MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data);
else
- MsiRecordSetStringW(uirow,3,value);
+ MSI_RecordSetStringW(uirow,3,value);
- ui_actiondata(hPackage,szWriteRegistryValues,uirow);
- ui_progress(hPackage,2,0,0,0);
- MsiCloseHandle(uirow);
+ ui_actiondata(package,szWriteRegistryValues,uirow);
+ ui_progress(package,2,0,0,0);
+ msiobj_release( &uirow->hdr );
HeapFree(GetProcessHeap(),0,value_data);
}
HeapFree(GetProcessHeap(),0,value);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
RegCloseKey(hkey);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -2857,7 +2906,7 @@
*
* Thinking about this, maybe this should become yet another Bison file
*/
-static DWORD deformat_string(MSIHANDLE hPackage, WCHAR* ptr,WCHAR** data)
+static DWORD deformat_string(MSIPACKAGE *package, WCHAR* ptr,WCHAR** data)
{
WCHAR* mark=NULL;
DWORD size=0;
@@ -2902,14 +2951,14 @@
mark++;
TRACE("Current %s .. %s\n",debugstr_w(*data),debugstr_w(mark));
sz = 0;
- rc = MsiGetPropertyW(hPackage, key, NULL, &sz);
+ rc = MSI_GetPropertyW(package, key, NULL, &sz);
if ((rc == ERROR_SUCCESS) || (rc == ERROR_MORE_DATA))
{
LPWSTR newdata;
sz++;
value = HeapAlloc(GetProcessHeap(),0,sz * sizeof(WCHAR));
- MsiGetPropertyW(hPackage, key, value, &sz);
+ MSI_GetPropertyW(package, key, value, &sz);
chunk = (strlenW(value)+1) * sizeof(WCHAR);
size+=chunk;
@@ -2934,46 +2983,45 @@
mark = HeapAlloc(GetProcessHeap(),0,size);
strcpyW(mark,*data);
TRACE("String at this point %s\n",debugstr_w(mark));
- size = deformat_string(hPackage,mark,data);
+ size = deformat_string(package,mark,data);
HeapFree(GetProcessHeap(),0,mark);
return size;
}
-static UINT ACTION_InstallInitialize(MSIHANDLE hPackage)
+static UINT ACTION_InstallInitialize(MSIPACKAGE *package)
{
- CHAR level[10000];
+ WCHAR level[10000];
INT install_level;
DWORD sz;
- MSIPACKAGE *package;
INT i,j;
DWORD rc;
LPWSTR override = NULL;
static const WCHAR addlocal[]={'A','D','D','L','O','C','A','L',0};
static const WCHAR all[]={'A','L','L',0};
+ static const WCHAR szlevel[] = {
+ 'I','N','S','T','A','L','L','L','E','V','E','L',0};
+ static const WCHAR szAddLocal[] = {
+ 'A','D','D','L','O','C','A','L',0};
/* I do not know if this is where it should happen.. but */
TRACE("Checking Install Level\n");
sz = 10000;
- if (MsiGetPropertyA(hPackage,"INSTALLLEVEL",level,&sz)==ERROR_SUCCESS)
- install_level = atoi(level);
+ if (MSI_GetPropertyW(package,szlevel,level,&sz)==ERROR_SUCCESS)
+ install_level = atoiW(level);
else
install_level = 1;
sz = 0;
- rc = MsiGetPropertyA(hPackage,"ADDLOCAL",NULL,&sz);
+ rc = MSI_GetPropertyW(package,szAddLocal,NULL,&sz);
if (rc == ERROR_SUCCESS || rc == ERROR_MORE_DATA)
{
sz++;
override = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
- MsiGetPropertyW(hPackage, addlocal,override,&sz);
+ MSI_GetPropertyW(package, addlocal,override,&sz);
}
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
-
/*
* components FeatureState defaults to FALSE. the idea is we want to
* enable the component is ANY feature that uses it is enabled to install
@@ -3008,24 +3056,31 @@
return ERROR_SUCCESS;
}
-static UINT ACTION_InstallValidate(MSIHANDLE hPackage)
+static UINT ACTION_InstallValidate(MSIPACKAGE *package)
{
DWORD progress = 0;
- static const CHAR q1[]="SELECT * FROM Registry";
+ static const WCHAR q1[]={
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','R','e','g','i','s','t','r','y',0};
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- MSIHANDLE db;
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
TRACE(" InstallValidate \n");
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewA(db, q1, &view);
- rc = MsiViewExecute(view, 0);
+ rc = MSI_DatabaseOpenViewW(package->db, q1, &view);
+ if (rc != ERROR_SUCCESS)
+ return rc;
+ rc = MSI_ViewExecute(view, 0);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
while (1)
{
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -3033,42 +3088,38 @@
}
progress +=1;
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
- MsiCloseHandle(db);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
- ui_progress(hPackage,0,progress+package->loaded_files,0,0);
+ ui_progress(package,0,progress+package->loaded_files,0,0);
return ERROR_SUCCESS;
}
-static UINT ACTION_LaunchConditions(MSIHANDLE hPackage)
+static UINT ACTION_LaunchConditions(MSIPACKAGE *package)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *ExecSeqQuery = "SELECT * from LaunchCondition";
- MSIHANDLE db;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'f','r','o','m',' ','L','a','u','n','c','h','C','o','n','d','i','t','i','o','n',0};
static const WCHAR title[]=
{'I','n','s','t','a','l','l',' ','F','a', 'i','l','e','d',0};
TRACE("Checking launch conditions\n");
- db = MsiGetActiveDatabase(hPackage);
- rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view);
- MsiCloseHandle(db);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -3078,7 +3129,7 @@
LPWSTR cond = NULL;
LPWSTR message = NULL;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -3087,7 +3138,7 @@
cond = load_dynamic_stringW(row,1);
- if (MsiEvaluateConditionW(hPackage,cond) != MSICONDITION_TRUE)
+ if (MSI_EvaluateConditionW(package,cond) != MSICONDITION_TRUE)
{
message = load_dynamic_stringW(row,2);
MessageBoxW(NULL,message,title,MB_OK);
@@ -3095,21 +3146,21 @@
rc = ERROR_FUNCTION_FAILED;
}
HeapFree(GetProcessHeap(),0,cond);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static void resolve_keypath(MSIHANDLE hPackage, MSIPACKAGE* package, INT
+static void resolve_keypath( MSIPACKAGE* package, INT
component_index, WCHAR *keypath)
{
MSICOMPONENT* cmp = &package->components[component_index];
if (cmp->KeyPath[0]==0)
{
- resolve_folder(hPackage,cmp->Directory,keypath,FALSE,FALSE,NULL);
+ resolve_folder(package,cmp->Directory,keypath,FALSE,FALSE,NULL);
return;
}
if ((cmp->Attributes & 0x4) || (cmp->Attributes & 0x20))
@@ -3134,9 +3185,8 @@
* resolved in this step, however actually written in the Publish steps.
* But we will leave it here for now because it is unclear
*/
-static UINT ACTION_ProcessComponents(MSIHANDLE hPackage)
+static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
{
- MSIPACKAGE* package;
WCHAR productcode[0x100];
WCHAR squished_pc[0x100];
WCHAR squished_cc[0x100];
@@ -3157,14 +3207,12 @@
static const WCHAR szComponents[] = {
'C','o','m','p','o','n','e','n','t','s',0 };
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
/* writes the Component and Features values to the registry */
sz = 0x100;
- rc = MsiGetPropertyW(hPackage,szProductCode,productcode,&sz);
-
+ rc = MSI_GetPropertyW(package,szProductCode,productcode,&sz);
if (rc != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -3224,26 +3272,26 @@
if (package->components[i].ComponentId[0]!=0)
{
WCHAR keypath[0x1000];
- MSIHANDLE uirow;
+ MSIRECORD * uirow;
squash_guid(package->components[i].ComponentId,squished_cc);
rc = RegCreateKeyW(hkey2,squished_cc,&hkey3);
if (rc != ERROR_SUCCESS)
continue;
- resolve_keypath(hPackage,package,i,keypath);
+ resolve_keypath(package,i,keypath);
RegSetValueExW(hkey3,squished_pc,0,REG_SZ,(LPVOID)keypath,
(strlenW(keypath)+1)*sizeof(WCHAR));
RegCloseKey(hkey3);
/* UI stuff */
- uirow = MsiCreateRecord(3);
- MsiRecordSetStringW(uirow,1,productcode);
- MsiRecordSetStringW(uirow,2,package->components[i].ComponentId);
- MsiRecordSetStringW(uirow,3,keypath);
- ui_actiondata(hPackage,szProcessComponents,uirow);
- MsiCloseHandle(uirow);
+ uirow = MSI_CreateRecord(3);
+ MSI_RecordSetStringW(uirow,1,productcode);
+ MSI_RecordSetStringW(uirow,2,package->components[i].ComponentId);
+ MSI_RecordSetStringW(uirow,3,keypath);
+ ui_actiondata(package,szProcessComponents,uirow);
+ msiobj_release( &uirow->hdr );
}
}
end:
@@ -3252,7 +3300,7 @@
return rc;
}
-static UINT ACTION_RegisterTypeLibraries(MSIHANDLE hPackage)
+static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package)
{
/*
* ok this is a bit confusting.. I am given a _Component key and i believe
@@ -3261,27 +3309,26 @@
* that component"
*/
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *Query = "SELECT * from TypeLib";
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR Query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'f','r','o','m',' ','T','y','p','e','L','i','b',0};
ITypeLib *ptLib;
HRESULT res;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -3291,7 +3338,7 @@
DWORD sz;
INT index;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -3299,12 +3346,12 @@
}
sz = 0x100;
- MsiRecordGetStringW(row,3,component,&sz);
+ MSI_RecordGetStringW(row,3,component,&sz);
index = get_loaded_component(package,component);
if (index < 0)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3312,7 +3359,7 @@
!package->components[index].FeatureState)
{
TRACE("Skipping typelib reg due to disabled component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3320,7 +3367,7 @@
if (index < 0)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3331,9 +3378,9 @@
WCHAR helpid[0x100];
sz = 0x100;
- MsiRecordGetStringW(row,6,helpid,&sz);
+ MSI_RecordGetStringW(row,6,helpid,&sz);
- resolve_folder(hPackage,helpid,help,FALSE,FALSE,NULL);
+ resolve_folder(package,helpid,help,FALSE,FALSE,NULL);
res = RegisterTypeLib(ptLib,package->files[index].TargetPath,help);
if (!SUCCEEDED(res))
@@ -3344,7 +3391,7 @@
/* yes the row has more fields than i need, but #1 is
correct and the only one i need. why make a new row */
- ui_actiondata(hPackage,szRegisterTypeLibraries,row);
+ ui_actiondata(package,szRegisterTypeLibraries,row);
TRACE("Registered %s\n",
debugstr_w(package->files[index].TargetPath));
@@ -3357,44 +3404,41 @@
ERR("Failed to load type library %s\n",
debugstr_w(package->files[index].TargetPath));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static UINT register_appid(MSIHANDLE hPackage, LPCWSTR clsid, LPCWSTR app )
+static UINT register_appid(MSIPACKAGE *package, LPCWSTR clsid, LPCWSTR app )
{
static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
static const WCHAR ExecSeqQuery[] =
{'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ','A','p','p','I'
,'d',' ','w','h','e','r','e',' ','A','p','p','I','d','=','`','%','s','`',0};
WCHAR Query[0x1000];
- MSIPACKAGE* package;
HKEY hkey2,hkey3;
LPWSTR buffer=0;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
-
sprintfW(Query,ExecSeqQuery,clsid);
- rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -3403,23 +3447,29 @@
RegSetValueExW(hkey3,NULL,0,REG_SZ,(LPVOID)app,
(strlenW(app)+1)*sizeof(WCHAR));
- MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
- if (!MsiRecordIsNull(row,2))
+ if (!MSI_RecordIsNull(row,2))
{
LPWSTR deformated=0;
UINT size;
static const WCHAR szRemoteServerName[] =
{'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
buffer = load_dynamic_stringW(row,2);
- size = deformat_string(hPackage,buffer,&deformated);
+ size = deformat_string(package,buffer,&deformated);
RegSetValueExW(hkey3,szRemoteServerName,0,REG_SZ,(LPVOID)deformated,
size);
HeapFree(GetProcessHeap(),0,deformated);
HeapFree(GetProcessHeap(),0,buffer);
}
- if (!MsiRecordIsNull(row,3))
+ if (!MSI_RecordIsNull(row,3))
{
static const WCHAR szLocalService[] =
{'L','o','c','a','l','S','e','r','v','i','c','e',0};
@@ -3430,7 +3480,7 @@
HeapFree(GetProcessHeap(),0,buffer);
}
- if (!MsiRecordIsNull(row,4))
+ if (!MSI_RecordIsNull(row,4))
{
static const WCHAR szService[] =
{'S','e','r','v','i','c','e','P','a','r','a','m','e','t','e','r','s',0};
@@ -3441,7 +3491,7 @@
HeapFree(GetProcessHeap(),0,buffer);
}
- if (!MsiRecordIsNull(row,5))
+ if (!MSI_RecordIsNull(row,5))
{
static const WCHAR szDLL[] =
{'D','l','l','S','u','r','r','o','g','a','t','e',0};
@@ -3452,35 +3502,35 @@
HeapFree(GetProcessHeap(),0,buffer);
}
- if (!MsiRecordIsNull(row,6))
+ if (!MSI_RecordIsNull(row,6))
{
static const WCHAR szActivate[] =
{'A','c','t','i','v','a','t','e','A','s','S','t','o','r','a','g','e',0};
static const WCHAR szY[] = {'Y',0};
- if (MsiRecordGetInteger(row,6))
+ if (MSI_RecordGetInteger(row,6))
RegSetValueExW(hkey3,szActivate,0,REG_SZ,(LPVOID)szY,4);
}
- if (!MsiRecordIsNull(row,7))
+ if (!MSI_RecordIsNull(row,7))
{
static const WCHAR szRunAs[] = {'R','u','n','A','s',0};
static const WCHAR szUser[] =
{'I','n','t','e','r','a','c','t','i','v','e',' ','U','s','e','r',0};
- if (MsiRecordGetInteger(row,7))
+ if (MSI_RecordGetInteger(row,7))
RegSetValueExW(hkey3,szRunAs,0,REG_SZ,(LPVOID)szUser,34);
}
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
RegCloseKey(hkey3);
RegCloseKey(hkey2);
return rc;
}
-static UINT ACTION_RegisterClassInfo(MSIHANDLE hPackage)
+static UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
{
/*
* Again I am assuming the words, "Whose key file respesents" when refering
@@ -3494,16 +3544,16 @@
*/
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *ExecSeqQuery = "SELECT * from Class";
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'f','r','o','m',' ','C','l','a','s','s',0};
static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
static const WCHAR szProgID[] = { 'P','r','o','g','I','D',0 };
static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
HKEY hkey,hkey2,hkey3;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
@@ -3511,16 +3561,15 @@
if (rc != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
- rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
goto end;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
goto end;
}
@@ -3532,7 +3581,7 @@
DWORD sz;
INT index;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -3540,13 +3589,13 @@
}
sz=0x100;
- MsiRecordGetStringW(row,3,buffer,&sz);
+ MSI_RecordGetStringW(row,3,buffer,&sz);
index = get_loaded_component(package,buffer);
if (index < 0)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3554,18 +3603,18 @@
!package->components[index].FeatureState)
{
TRACE("Skipping class reg due to disabled component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
sz=0x100;
- MsiRecordGetStringW(row,1,clsid,&sz);
+ MSI_RecordGetStringW(row,1,clsid,&sz);
RegCreateKeyW(hkey,clsid,&hkey2);
- if (!MsiRecordIsNull(row,5))
+ if (!MSI_RecordIsNull(row,5))
{
sz=0x100;
- MsiRecordGetStringW(row,5,desc,&sz);
+ MSI_RecordGetStringW(row,5,desc,&sz);
RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)desc,
(strlenW(desc)+1)*sizeof(WCHAR));
@@ -3574,7 +3623,7 @@
desc[0]=0;
sz=0x100;
- MsiRecordGetStringW(row,2,buffer,&sz);
+ MSI_RecordGetStringW(row,2,buffer,&sz);
RegCreateKeyW(hkey2,buffer,&hkey3);
@@ -3586,10 +3635,10 @@
RegCloseKey(hkey3);
- if (!MsiRecordIsNull(row,4))
+ if (!MSI_RecordIsNull(row,4))
{
sz=0x100;
- MsiRecordGetStringW(row,4,buffer,&sz);
+ MSI_RecordGetStringW(row,4,buffer,&sz);
RegCreateKeyW(hkey2,szProgID,&hkey3);
@@ -3599,34 +3648,34 @@
RegCloseKey(hkey3);
}
- if (!MsiRecordIsNull(row,6))
+ if (!MSI_RecordIsNull(row,6))
{
sz=0x100;
- MsiRecordGetStringW(row,6,buffer,&sz);
+ MSI_RecordGetStringW(row,6,buffer,&sz);
RegSetValueExW(hkey2,szAppID,0,REG_SZ,(LPVOID)buffer,
(strlenW(buffer)+1)*sizeof(WCHAR));
- register_appid(hPackage,buffer,desc);
+ register_appid(package,buffer,desc);
}
RegCloseKey(hkey2);
FIXME("Process the rest of the fields >7\n");
- ui_actiondata(hPackage,szRegisterClassInfo,row);
+ ui_actiondata(package,szRegisterClassInfo,row);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
end:
RegCloseKey(hkey);
return rc;
}
-static UINT register_progid_base(MSIHANDLE row, LPWSTR clsid)
+static UINT register_progid_base(MSIRECORD * row, LPWSTR clsid)
{
static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
HKEY hkey,hkey2;
@@ -3635,22 +3684,22 @@
sz = 0x100;
- MsiRecordGetStringW(row,1,buffer,&sz);
+ MSI_RecordGetStringW(row,1,buffer,&sz);
RegCreateKeyW(HKEY_CLASSES_ROOT,buffer,&hkey);
- if (!MsiRecordIsNull(row,4))
+ if (!MSI_RecordIsNull(row,4))
{
sz = 0x100;
- MsiRecordGetStringW(row,4,buffer,&sz);
+ MSI_RecordGetStringW(row,4,buffer,&sz);
RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)buffer, (strlenW(buffer)+1) *
sizeof(WCHAR));
}
- if (!MsiRecordIsNull(row,3))
+ if (!MSI_RecordIsNull(row,3))
{
sz = 0x100;
- MsiRecordGetStringW(row,3,buffer,&sz);
+ MSI_RecordGetStringW(row,3,buffer,&sz);
RegCreateKeyW(hkey,szCLSID,&hkey2);
RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)buffer, (strlenW(buffer)+1) *
sizeof(WCHAR));
@@ -3665,66 +3714,63 @@
FIXME("UNHANDLED case, Parent progid but classid is NULL\n");
return ERROR_FUNCTION_FAILED;
}
- if (!MsiRecordIsNull(row,5))
+ if (!MSI_RecordIsNull(row,5))
FIXME ("UNHANDLED icon in Progid\n");
return ERROR_SUCCESS;
}
-static UINT register_progid(MSIHANDLE hPackage, MSIHANDLE row, LPWSTR clsid);
+static UINT register_progid(MSIPACKAGE *package, MSIRECORD * row, LPWSTR clsid);
-static UINT register_parent_progid(MSIHANDLE hPackage, LPCWSTR parent,
+static UINT register_parent_progid(MSIPACKAGE *package, LPCWSTR parent,
LPWSTR clsid)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
static const WCHAR Query_t[] =
{'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','P','r','o','g'
,'I','d',' ','w','h','e','r','e',' ','P','r','o','g','I','d',' ','=',' ','`'
,'%','s','`',0};
WCHAR Query[0x1000];
- MSIPACKAGE* package;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
sprintfW(Query,Query_t,parent);
- rc = MsiDatabaseOpenViewW(package->db, Query, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- register_progid(hPackage,row,clsid);
+ register_progid(package,row,clsid);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static UINT register_progid(MSIHANDLE hPackage, MSIHANDLE row, LPWSTR clsid)
+static UINT register_progid(MSIPACKAGE *package, MSIRECORD * row, LPWSTR clsid)
{
UINT rc = ERROR_SUCCESS;
- if (MsiRecordIsNull(row,2))
+ if (MSI_RecordIsNull(row,2))
rc = register_progid_base(row,clsid);
else
{
@@ -3734,11 +3780,11 @@
static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
sz = 0x100;
- MsiRecordGetStringW(row,2,buffer,&sz);
- rc = register_parent_progid(hPackage,buffer,clsid);
+ MSI_RecordGetStringW(row,2,buffer,&sz);
+ rc = register_parent_progid(package,buffer,clsid);
sz = 0x100;
- MsiRecordGetStringW(row,1,buffer,&sz);
+ MSI_RecordGetStringW(row,1,buffer,&sz);
RegCreateKeyW(HKEY_CLASSES_ROOT,buffer,&hkey);
/* clasid is same as parent */
RegCreateKeyW(hkey,szCLSID,&hkey2);
@@ -3746,15 +3792,15 @@
sizeof(WCHAR));
RegCloseKey(hkey2);
- if (!MsiRecordIsNull(row,4))
+ if (!MSI_RecordIsNull(row,4))
{
sz = 0x100;
- MsiRecordGetStringW(row,4,buffer,&sz);
+ MSI_RecordGetStringW(row,4,buffer,&sz);
RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)buffer,
(strlenW(buffer)+1) * sizeof(WCHAR));
}
- if (!MsiRecordIsNull(row,5))
+ if (!MSI_RecordIsNull(row,5))
FIXME ("UNHANDLED icon in Progid\n");
RegCloseKey(hkey);
@@ -3762,7 +3808,7 @@
return rc;
}
-static UINT ACTION_RegisterProgIdInfo(MSIHANDLE hPackage)
+static UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
{
/*
* Sigh, here i am just brute force registering all progid
@@ -3773,25 +3819,24 @@
* gives me something to continue to work toward
*/
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *Query = "SELECT * FROM ProgId";
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR Query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','P','r','o','g','I','d',0};
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -3799,24 +3844,24 @@
{
WCHAR clsid[0x1000];
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
break;
}
- register_progid(hPackage,row,clsid);
- ui_actiondata(hPackage,szRegisterProgIdInfo,row);
+ register_progid(package,row,clsid);
+ ui_actiondata(package,szRegisterProgIdInfo,row);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
-static UINT build_icon_path(MSIHANDLE hPackage, LPCWSTR icon_name,
+static UINT build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name,
LPWSTR FilePath)
{
WCHAR ProductCode[0x100];
@@ -3831,12 +3876,12 @@
{'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
sz = 0x100;
- MsiGetPropertyW(hPackage,szProductCode,ProductCode,&sz);
+ MSI_GetPropertyW(package,szProductCode,ProductCode,&sz);
if (strlenW(ProductCode)==0)
return ERROR_FUNCTION_FAILED;
sz = MAX_PATH;
- MsiGetPropertyW(hPackage,szFolder,SystemFolder,&sz);
+ MSI_GetPropertyW(package,szFolder,SystemFolder,&sz);
strcatW(SystemFolder,szInstaller);
strcatW(SystemFolder,ProductCode);
create_full_pathW(SystemFolder);
@@ -3847,19 +3892,18 @@
return ERROR_SUCCESS;
}
-static UINT ACTION_CreateShortcuts(MSIHANDLE hPackage)
+static UINT ACTION_CreateShortcuts(MSIPACKAGE *package)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *Query = "SELECT * from Shortcut";
- MSIPACKAGE* package;
-
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR Query[] = {
+ 'S','E','L','E','C','T',' ','*',' ','f','r','o','m',' ',
+ 'S','h','o','r','t','c','u','t',0};
IShellLinkW *sl;
IPersistFile *pf;
HRESULT res;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
@@ -3870,16 +3914,15 @@
return ERROR_FUNCTION_FAILED;
}
- rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -3891,7 +3934,7 @@
DWORD index;
static const WCHAR szlnk[]={'.','l','n','k',0};
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -3899,13 +3942,13 @@
}
sz = 0x100;
- MsiRecordGetStringW(row,4,buffer,&sz);
+ MSI_RecordGetStringW(row,4,buffer,&sz);
index = get_loaded_component(package,buffer);
if (index < 0)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3913,11 +3956,11 @@
!package->components[index].FeatureState)
{
TRACE("Skipping shortcut creation due to disabled component\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
- ui_actiondata(hPackage,szCreateShortcuts,row);
+ ui_actiondata(package,szCreateShortcuts,row);
res = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
&IID_IShellLinkW, (LPVOID *) &sl );
@@ -3925,7 +3968,7 @@
if (FAILED(res))
{
ERR("Is IID_IShellLink\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -3933,27 +3976,27 @@
if( FAILED( res ) )
{
ERR("Is IID_IPersistFile\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
sz = 0x100;
- MsiRecordGetStringW(row,2,buffer,&sz);
- resolve_folder(hPackage, buffer,target_file,FALSE,FALSE,NULL);
+ MSI_RecordGetStringW(row,2,buffer,&sz);
+ resolve_folder(package, buffer,target_file,FALSE,FALSE,NULL);
sz = 0x100;
- MsiRecordGetStringW(row,3,buffer,&sz);
+ MSI_RecordGetStringW(row,3,buffer,&sz);
reduce_to_longfilename(buffer);
strcatW(target_file,buffer);
if (!strchrW(target_file,'.'))
strcatW(target_file,szlnk);
sz = 0x100;
- MsiRecordGetStringW(row,5,buffer,&sz);
+ MSI_RecordGetStringW(row,5,buffer,&sz);
if (strchrW(buffer,'['))
{
LPWSTR deformated;
- deformat_string(hPackage,buffer,&deformated);
+ deformat_string(package,buffer,&deformated);
IShellLinkW_SetPath(sl,deformated);
HeapFree(GetProcessHeap(),0,deformated);
}
@@ -3962,21 +4005,21 @@
FIXME("UNHANDLED shortcut format, advertised shortcut\n");
IPersistFile_Release( pf );
IShellLinkW_Release( sl );
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
- if (!MsiRecordIsNull(row,6))
+ if (!MSI_RecordIsNull(row,6))
{
LPWSTR deformated;
sz = 0x100;
- MsiRecordGetStringW(row,6,buffer,&sz);
- deformat_string(hPackage,buffer,&deformated);
+ MSI_RecordGetStringW(row,6,buffer,&sz);
+ deformat_string(package,buffer,&deformated);
IShellLinkW_SetArguments(sl,deformated);
HeapFree(GetProcessHeap(),0,deformated);
}
- if (!MsiRecordIsNull(row,7))
+ if (!MSI_RecordIsNull(row,7))
{
LPWSTR deformated;
deformated = load_dynamic_stringW(row,7);
@@ -3984,33 +4027,33 @@
HeapFree(GetProcessHeap(),0,deformated);
}
- if (!MsiRecordIsNull(row,8))
- IShellLinkW_SetHotkey(sl,MsiRecordGetInteger(row,8));
+ if (!MSI_RecordIsNull(row,8))
+ IShellLinkW_SetHotkey(sl,MSI_RecordGetInteger(row,8));
- if (!MsiRecordIsNull(row,9))
+ if (!MSI_RecordIsNull(row,9))
{
WCHAR Path[MAX_PATH];
INT index;
sz = 0x100;
- MsiRecordGetStringW(row,9,buffer,&sz);
+ MSI_RecordGetStringW(row,9,buffer,&sz);
- build_icon_path(hPackage,buffer,Path);
- index = MsiRecordGetInteger(row,10);
+ build_icon_path(package,buffer,Path);
+ index = MSI_RecordGetInteger(row,10);
IShellLinkW_SetIconLocation(sl,Path,index);
}
- if (!MsiRecordIsNull(row,11))
- IShellLinkW_SetShowCmd(sl,MsiRecordGetInteger(row,11));
+ if (!MSI_RecordIsNull(row,11))
+ IShellLinkW_SetShowCmd(sl,MSI_RecordGetInteger(row,11));
- if (!MsiRecordIsNull(row,12))
+ if (!MSI_RecordIsNull(row,12))
{
WCHAR Path[MAX_PATH];
sz = 0x100;
- MsiRecordGetStringW(row,12,buffer,&sz);
- resolve_folder(hPackage, buffer, Path, FALSE, FALSE, NULL);
+ MSI_RecordGetStringW(row,12,buffer,&sz);
+ resolve_folder(package, buffer, Path, FALSE, FALSE, NULL);
IShellLinkW_SetWorkingDirectory(sl,Path);
}
@@ -4020,10 +4063,10 @@
IPersistFile_Release( pf );
IShellLinkW_Release( sl );
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
CoUninitialize();
@@ -4038,29 +4081,28 @@
* Icon table is processed and written out
* so that is waht I am going to do here.
*/
-static UINT ACTION_PublishProduct(MSIHANDLE hPackage)
+static UINT ACTION_PublishProduct(MSIPACKAGE *package)
{
UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *Query="SELECT * from Icon";
- MSIPACKAGE* package;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR Query[]={
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'f','r','o','m',' ','I','c','o','n',0};
DWORD sz;
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
- rc = MsiDatabaseOpenViewA(package->db, Query, &view);
-
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -4071,7 +4113,7 @@
WCHAR FileName[MAX_PATH];
CHAR buffer[1024];
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
{
rc = ERROR_SUCCESS;
@@ -4079,15 +4121,15 @@
}
sz = MAX_PATH;
- MsiRecordGetStringW(row,1,FileName,&sz);
+ MSI_RecordGetStringW(row,1,FileName,&sz);
if (sz == 0)
{
ERR("Unable to get FileName\n");
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
- build_icon_path(hPackage,FileName,FilePath);
+ build_icon_path(package,FileName,FilePath);
TRACE("Creating icon file at %s\n",debugstr_w(FilePath));
@@ -4097,7 +4139,7 @@
if (the_file == INVALID_HANDLE_VALUE)
{
ERR("Unable to create file %s\n",debugstr_w(FilePath));
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
continue;
}
@@ -4105,7 +4147,7 @@
{
DWORD write;
sz = 1024;
- rc = MsiRecordReadStream(row,2,buffer,&sz);
+ rc = MSI_RecordReadStream(row,2,buffer,&sz);
if (rc != ERROR_SUCCESS)
{
ERR("Failed to get stream\n");
@@ -4117,10 +4159,10 @@
} while (sz == 1024);
CloseHandle(the_file);
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -4151,8 +4193,18 @@
UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
{
+ MSIPACKAGE *package;
+ UINT ret = ERROR_INVALID_HANDLE;
+
TRACE(" external attempt at action %s \n",debugstr_w(szAction));
- return ACTION_PerformAction(hInstall,szAction);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if( package )
+ {
+ ret = ACTION_PerformAction(package,szAction);
+ msiobj_release( &package->hdr );
+ }
+ return ret;
}
UINT WINAPI MsiGetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder,
@@ -4192,10 +4244,15 @@
{
WCHAR path[MAX_PATH];
UINT rc;
+ MSIPACKAGE *package;
TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
- rc = resolve_folder(hInstall, szFolder, path, FALSE, FALSE, NULL);
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package )
+ return ERROR_INVALID_HANDLE;
+ rc = resolve_folder(package, szFolder, path, FALSE, FALSE, NULL);
+ msiobj_release( &package->hdr );
if (rc == ERROR_SUCCESS && strlenW(path) > *pcchPathBuf)
{
@@ -4249,9 +4306,15 @@
{
WCHAR path[MAX_PATH];
UINT rc;
+ MSIPACKAGE *package;
TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
- rc = resolve_folder(hInstall, szFolder, path, TRUE, FALSE, NULL);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package )
+ return ERROR_INVALID_HANDLE;
+ rc = resolve_folder(package, szFolder, path, TRUE, FALSE, NULL);
+ msiobj_release( &package->hdr );
if (rc == ERROR_SUCCESS && strlenW(path) > *pcchPathBuf)
{
@@ -4300,15 +4363,17 @@
return rc;
}
-UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder,
+UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
LPCWSTR szFolderPath)
{
- MSIPACKAGE *package;
INT i;
WCHAR path[MAX_PATH];
MSIFOLDER *folder;
- TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath));
+ TRACE("(%p %s %s)\n",package, debugstr_w(szFolder),debugstr_w(szFolderPath));
+
+ if (package==NULL)
+ return ERROR_INVALID_HANDLE;
if (szFolderPath[0]==0)
return ERROR_FUNCTION_FAILED;
@@ -4316,12 +4381,7 @@
if (GetFileAttributesW(szFolderPath) == INVALID_FILE_ATTRIBUTES)
return ERROR_FUNCTION_FAILED;
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
-
- if (package==NULL)
- return ERROR_INVALID_HANDLE;
-
- resolve_folder(hInstall,szFolder,path,FALSE,FALSE,&folder);
+ resolve_folder(package,szFolder,path,FALSE,FALSE,&folder);
if (!folder)
return ERROR_INVALID_PARAMETER;
@@ -4332,12 +4392,26 @@
package->folders[i].ResolvedTarget[0]=0;
for (i = 0; i < package->loaded_folders; i++)
- resolve_folder(hInstall, package->folders[i].Directory, path, FALSE,
+ resolve_folder(package, package->folders[i].Directory, path, FALSE,
TRUE, NULL);
return ERROR_SUCCESS;
}
+UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder,
+ LPCWSTR szFolderPath)
+{
+ MSIPACKAGE *package;
+ UINT ret;
+
+ TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath));
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ ret = MSI_SetTargetPathW( package, szFolder, szFolderPath );
+ msiobj_release( &package->hdr );
+ return ret;
+}
+
BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, DWORD iRunMode)
{
FIXME("STUB (%li)\n",iRunMode);
@@ -4402,19 +4476,11 @@
return rc;
}
-UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPWSTR szFeature,
+UINT MSI_GetFeatureStateW(MSIPACKAGE *package, LPWSTR szFeature,
INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
{
- MSIPACKAGE* package;
INT index;
- TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szFeature), piInstalled,
-piAction);
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
-
index = get_loaded_feature(package,szFeature);
if (index < 0)
return ERROR_UNKNOWN_FEATURE;
@@ -4433,6 +4499,23 @@
return ERROR_SUCCESS;
}
+UINT WINAPI MsiGetFeatureStateW(MSIHANDLE hInstall, LPWSTR szFeature,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ MSIPACKAGE* package;
+ UINT ret;
+
+ TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szFeature), piInstalled,
+piAction);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if (!package)
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_GetFeatureStateW(package, szFeature, piInstalled, piAction);
+ msiobj_release( &package->hdr );
+ return ret;
+}
+
UINT WINAPI MsiGetComponentStateA(MSIHANDLE hInstall, LPSTR szComponent,
INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
{
@@ -4448,19 +4531,14 @@
return rc;
}
-UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
+UINT MSI_GetComponentStateW(MSIPACKAGE *package, LPWSTR szComponent,
INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
{
- MSIPACKAGE* package;
INT index;
- TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent), piInstalled,
+ TRACE("%p %s %p %p\n", package, debugstr_w(szComponent), piInstalled,
piAction);
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
-
index = get_loaded_component(package,szComponent);
if (index < 0)
return ERROR_UNKNOWN_COMPONENT;
@@ -4480,21 +4558,32 @@
return ERROR_SUCCESS;
}
-#if 0
-static UINT ACTION_Template(MSIHANDLE hPackage)
+UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
{
- UINT rc;
- MSIHANDLE view;
- MSIHANDLE row = 0;
- static const CHAR *ExecSeqQuery;
MSIPACKAGE* package;
+ UINT ret;
+
+ TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent),
+ piInstalled, piAction);
- package = msihandle2msiinfo(hPackage, MSIHANDLETYPE_PACKAGE);
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
if (!package)
return ERROR_INVALID_HANDLE;
+ ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction);
+ msiobj_release( &package->hdr );
+ return ret;
+}
- rc = MsiDatabaseOpenViewA(package->db, ExecSeqQuery, &view);
+#if 0
+static UINT ACTION_Template(MSIPACKAGE *package)
+{
+ UINT rc;
+ MSIQUERY * view;
+ MSIRECORD * row = 0;
+ static const WCHAR ExecSeqQuery[] = {0};
+ rc = MsiDatabaseOpenViewW(package->db, ExecSeqQuery, &view);
if (rc != ERROR_SUCCESS)
return rc;
@@ -4502,7 +4591,7 @@
if (rc != ERROR_SUCCESS)
{
MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&view->hdr);
return rc;
}
@@ -4515,10 +4604,10 @@
break;
}
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&view->hdr);
return rc;
}
#endif
diff -ur dlls/msi.old/cond.y dlls/msi/cond.y
--- dlls/msi.old/cond.y 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/cond.y 2004-07-09 13:34:00.000000000 -0500
@@ -33,6 +33,7 @@
#include "msi.h"
#include "msiquery.h"
+#include "msipriv.h"
#define YYLEX_PARAM info
#define YYPARSE_PARAM info
@@ -43,7 +44,7 @@
typedef struct tag_yyinput
{
- MSIHANDLE hInstall;
+ MSIPACKAGE *package;
LPCWSTR str;
INT n;
MSICONDITION result;
@@ -408,7 +409,7 @@
COND_input* cond = (COND_input*) info;
INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
- MsiGetComponentStateW(cond->hInstall, $2, &install, &action );
+ MSI_GetComponentStateW(cond->package, $2, &install, &action );
$$ = action;
HeapFree( GetProcessHeap(), 0, $2 );
}
@@ -417,7 +418,7 @@
COND_input* cond = (COND_input*) info;
INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
- MsiGetComponentStateW(cond->hInstall, $2, &install, &action );
+ MSI_GetComponentStateW(cond->package, $2, &install, &action );
$$ = install;
HeapFree( GetProcessHeap(), 0, $2 );
}
@@ -426,7 +427,7 @@
COND_input* cond = (COND_input*) info;
INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
- MsiGetFeatureStateW(cond->hInstall, $2, &install, &action );
+ MSI_GetFeatureStateW(cond->package, $2, &install, &action );
$$ = action;
HeapFree( GetProcessHeap(), 0, $2 );
}
@@ -435,7 +436,7 @@
COND_input* cond = (COND_input*) info;
INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
- MsiGetFeatureStateW(cond->hInstall, $2, &install, &action );
+ MSI_GetFeatureStateW(cond->package, $2, &install, &action );
$$ = install;
HeapFree( GetProcessHeap(), 0, $2 );
}
@@ -451,7 +452,7 @@
/* Lookup the identifier */
sz=0x100;
- if (MsiGetPropertyW(cond->hInstall,$1,$$,&sz) != ERROR_SUCCESS)
+ if (MSI_GetPropertyW(cond->package,$1,$$,&sz) != ERROR_SUCCESS)
{
$$[0]=0;
}
@@ -687,12 +688,12 @@
return 0;
}
-MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
+MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition )
{
COND_input cond;
MSICONDITION r;
- cond.hInstall = hInstall;
+ cond.package = package;
cond.str = szCondition;
cond.n = 0;
cond.result = -1;
@@ -708,6 +709,19 @@
return r;
}
+MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
+{
+ MSIPACKAGE *package;
+ UINT ret;
+
+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package)
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_EvaluateConditionW( package, szCondition );
+ msiobj_release( &package->hdr );
+ return ret;
+}
+
MSICONDITION WINAPI MsiEvaluateConditionA( MSIHANDLE hInstall, LPCSTR szCondition )
{
LPWSTR szwCond = NULL;
diff -ur dlls/msi.old/create.c dlls/msi/create.c
--- dlls/msi.old/create.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/create.c 2004-07-09 13:34:00.000000000 -0500
@@ -56,7 +56,7 @@
return ERROR_FUNCTION_FAILED;
}
-static UINT CREATE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSICREATEVIEW *cv = (MSICREATEVIEW*)view;
create_col_info *col;
@@ -214,6 +214,7 @@
}
HeapFree( GetProcessHeap(), 0, cv->name );
HeapFree( GetProcessHeap(), 0, cv );
+ msiobj_release( &cv->db->hdr );
return ERROR_SUCCESS;
}
@@ -246,6 +247,7 @@
/* fill the structure */
cv->view.ops = &create_ops;
+ msiobj_addref( &db->hdr );
cv->db = db;
cv->name = table; /* FIXME: strdupW it? */
cv->col_info = col_info;
diff -ur dlls/msi.old/distinct.c dlls/msi/distinct.c
--- dlls/msi.old/distinct.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/distinct.c 2004-07-09 13:34:00.000000000 -0500
@@ -107,13 +107,13 @@
return dv->table->ops->fetch_int( dv->table, row, col, val );
}
-static UINT DISTINCT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT DISTINCT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSIDISTINCTVIEW *dv = (MSIDISTINCTVIEW*)view;
UINT r, i, j, r_count, c_count;
DISTINCTSET *rowset = NULL;
- TRACE("%p %ld\n", dv, record);
+ TRACE("%p %p\n", dv, record);
if( !dv->table )
return ERROR_FUNCTION_FAILED;
@@ -242,6 +242,7 @@
if( dv->translation )
HeapFree( GetProcessHeap(), 0, dv->translation );
HeapFree( GetProcessHeap(), 0, dv );
+ msiobj_release( &dv->db->hdr );
return ERROR_SUCCESS;
}
@@ -281,6 +282,7 @@
/* fill the structure */
dv->view.ops = &distinct_ops;
+ msiobj_addref( &db->hdr );
dv->db = db;
dv->table = table;
dv->translation = NULL;
diff -ur dlls/msi.old/handle.c dlls/msi/handle.c
--- dlls/msi.old/handle.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/handle.c 2004-07-09 14:11:11.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Implementation of the Microsoft Installer (msi.dll)
*
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -31,66 +31,109 @@
WINE_DEFAULT_DEBUG_CHANNEL(msi);
-MSIHANDLEINFO *msihandletable[MSIMAXHANDLES];
+static CRITICAL_SECTION MSI_handle_cs;
+static CRITICAL_SECTION_DEBUG MSI_handle_cs_debug =
+{
+ 0, 0, &MSI_handle_cs,
+ { &MSI_handle_cs_debug.ProcessLocksList,
+ &MSI_handle_cs_debug.ProcessLocksList },
+ 0, 0, { 0, (DWORD)(__FILE__ ": MSI_handle_cs") }
+};
+static CRITICAL_SECTION MSI_handle_cs = { &MSI_handle_cs_debug, -1, 0, 0, 0, 0 };
+
+MSIOBJECTHDR *msihandletable[MSIMAXHANDLES];
-MSIHANDLE alloc_msihandle(UINT type, UINT size, msihandledestructor destroy, void **out)
+MSIHANDLE alloc_msihandle( MSIOBJECTHDR *obj )
{
- MSIHANDLEINFO *info;
+ MSIHANDLE ret = 0;
UINT i;
- *out = NULL;
+ EnterCriticalSection( &MSI_handle_cs );
/* find a slot */
for(i=0; i<MSIMAXHANDLES; i++)
if( !msihandletable[i] )
break;
if( (i>=MSIMAXHANDLES) || msihandletable[i] )
- return 0;
-
- size += sizeof (MSIHANDLEINFO);
- info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
- if( !info )
- return 0;
-
- info->magic = MSIHANDLE_MAGIC;
- info->type = type;
- info->refcount = 1;
- info->destructor = destroy;
+ goto out;
- msihandletable[i] = info;
- *out = (void*) &info[1];
+ msiobj_addref( obj );
+ msihandletable[i] = obj;
+ ret = (MSIHANDLE) (i+1);
+out:
+ TRACE("%p -> %ld\n", obj, ret );
- return (MSIHANDLE) (i+1);
+ LeaveCriticalSection( &MSI_handle_cs );
+ return ret;
}
void *msihandle2msiinfo(MSIHANDLE handle, UINT type)
{
+ MSIOBJECTHDR *ret = NULL;
+
+ EnterCriticalSection( &MSI_handle_cs );
handle--;
if( handle<0 )
- return NULL;
+ goto out;
if( handle>=MSIMAXHANDLES )
- return NULL;
+ goto out;
if( !msihandletable[handle] )
- return NULL;
+ goto out;
if( msihandletable[handle]->magic != MSIHANDLE_MAGIC )
- return NULL;
+ goto out;
if( type && (msihandletable[handle]->type != type) )
- return NULL;
+ goto out;
+ ret = msihandletable[handle];
+ msiobj_addref( ret );
+
+out:
+ LeaveCriticalSection( &MSI_handle_cs );
- return &msihandletable[handle][1];
+ return (void*) ret;
}
-void msihandle_addref(MSIHANDLE handle)
+MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr )
{
- MSIHANDLEINFO *info = msihandle2msiinfo(handle, 0);
+ MSIHANDLE ret = 0;
+ UINT i;
- TRACE("%lx\n",handle);
+ TRACE("%p\n", hdr);
+
+ EnterCriticalSection( &MSI_handle_cs );
+ for(i=0; (i<MSIMAXHANDLES) && !ret; i++)
+ if( msihandletable[i] == hdr )
+ ret = i+1;
+ LeaveCriticalSection( &MSI_handle_cs );
+
+ TRACE("%p -> %ld\n", hdr, ret);
+
+ msiobj_addref( hdr );
+ return ret;
+}
+
+void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy )
+{
+ MSIOBJECTHDR *info;
+
+ info = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+ if( info )
+ {
+ info->magic = MSIHANDLE_MAGIC;
+ info->type = type;
+ info->refcount = 1;
+ info->destructor = destroy;
+ }
+
+ return info;
+}
+
+void msiobj_addref( MSIOBJECTHDR *info )
+{
+ TRACE("%p\n", info);
if( !info )
return;
- info--;
-
if( info->magic != MSIHANDLE_MAGIC )
{
ERR("Invalid handle!\n");
@@ -100,36 +143,63 @@
info->refcount++;
}
-UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
+int msiobj_release( MSIOBJECTHDR *info )
{
- MSIHANDLEINFO *info = msihandle2msiinfo(handle, 0);
+ int ret;
- TRACE("%lx\n",handle);
+ TRACE("%p\n",info);
if( !info )
- return ERROR_INVALID_HANDLE;
-
- info--;
+ return -1;
if( info->magic != MSIHANDLE_MAGIC )
{
ERR("Invalid handle!\n");
- return ERROR_INVALID_HANDLE;
+ return -1;
}
- info->refcount--;
- if (info->refcount > 0)
- return ERROR_SUCCESS;
-
+ ret = info->refcount--;
+ if (info->refcount == 0)
+ {
if( info->destructor )
- info->destructor( &info[1] );
-
+ info->destructor( info );
HeapFree( GetProcessHeap(), 0, info );
+ TRACE("object %p destroyed\n", info);
+ }
+
+ return ret;
+}
+
+UINT WINAPI MsiCloseHandle(MSIHANDLE handle)
+{
+ MSIOBJECTHDR *info;
+ UINT ret = ERROR_INVALID_HANDLE;
+
+ TRACE("%lx\n",handle);
+
+ EnterCriticalSection( &MSI_handle_cs );
+
+ info = msihandle2msiinfo(handle, 0);
+ if( !info )
+ goto out;
+
+ if( info->magic != MSIHANDLE_MAGIC )
+ {
+ ERR("Invalid handle!\n");
+ goto out;
+ }
+
+ msiobj_release( info );
msihandletable[handle-1] = NULL;
+ ret = ERROR_SUCCESS;
- TRACE("Destroyed\n");
+ TRACE("handle %lx Destroyed\n", handle);
+out:
+ LeaveCriticalSection( &MSI_handle_cs );
+ if( info )
+ msiobj_release( info );
- return 0;
+ return ret;
}
UINT WINAPI MsiCloseAllHandles(void)
diff -ur dlls/msi.old/insert.c dlls/msi/insert.c
--- dlls/msi.old/insert.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/insert.c 2004-07-09 13:34:00.000000000 -0500
@@ -56,13 +56,13 @@
return ERROR_FUNCTION_FAILED;
}
-static UINT INSERT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT INSERT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSIINSERTVIEW *iv = (MSIINSERTVIEW*)view;
UINT n, type, val, r, row, col_count = 0;
MSIVIEW *sv;
- TRACE("%p %ld\n", iv, record );
+ TRACE("%p %p\n", iv, record );
sv = iv->sv;
if( !sv )
@@ -77,7 +77,7 @@
if( r )
goto err;
- n = MsiRecordGetFieldCount( record );
+ n = MSI_RecordGetFieldCount( record );
if( n != col_count )
{
ERR("Number of fields do not match\n");
@@ -103,7 +103,7 @@
}
else
{
- val = MsiRecordGetInteger( record, n );
+ val = MSI_RecordGetInteger( record, n );
val |= 0x8000;
}
r = sv->ops->set_int( sv, row, n, val );
@@ -180,6 +180,7 @@
sv->ops->delete( sv );
delete_value_list( iv->vals );
HeapFree( GetProcessHeap(), 0, iv );
+ msiobj_release( &iv->db->hdr );
return ERROR_SUCCESS;
}
@@ -226,6 +227,7 @@
/* fill the structure */
iv->view.ops = &insert_ops;
+ msiobj_addref( &db->hdr );
iv->db = db;
iv->vals = values;
iv->bIsTemp = temp;
diff -ur dlls/msi.old/msi.c dlls/msi/msi.c
--- dlls/msi.old/msi.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msi.c 2004-07-09 14:07:57.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Implementation of the Microsoft Installer (msi.dll)
*
- * Copyright 2002,2003 Mike McCormack for CodeWeavers
+ * Copyright 2002,2003,2004 Mike McCormack for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -222,7 +222,7 @@
}
-VOID MSI_CloseDatabase( VOID *arg )
+VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
{
MSIDATABASE *db = (MSIDATABASE *) arg;
@@ -230,58 +230,18 @@
IStorage_Release( db->storage );
}
-UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB)
-{
- HRESULT r = ERROR_FUNCTION_FAILED;
- LPWSTR szwDBPath = NULL, szwPersist = NULL;
- UINT len;
-
- TRACE("%s %s %p\n", debugstr_a(szDBPath), debugstr_a(szPersist), phDB);
-
- if( szDBPath )
- {
- len = MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, NULL, 0 );
- szwDBPath = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- if( !szwDBPath )
- goto end;
- MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, szwDBPath, len );
- }
-
- if( HIWORD(szPersist) )
- {
- len = MultiByteToWideChar( CP_ACP, 0, szPersist, -1, NULL, 0 );
- szwPersist = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
- if( !szwPersist )
- goto end;
- MultiByteToWideChar( CP_ACP, 0, szPersist, -1, szwPersist, len );
- }
- else
- szwPersist = (LPWSTR) szPersist;
-
- r = MsiOpenDatabaseW( szwDBPath, szwPersist, phDB );
-
-end:
- if( szwPersist )
- HeapFree( GetProcessHeap(), 0, szwPersist );
- if( szwDBPath )
- HeapFree( GetProcessHeap(), 0, szwDBPath );
-
- return r;
-}
-
-UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
+UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
{
IStorage *stg = NULL;
HRESULT r;
- MSIHANDLE handle;
- MSIDATABASE *db;
- UINT ret;
+ MSIDATABASE *db = NULL;
+ UINT ret = ERROR_FUNCTION_FAILED;
LPWSTR szMode;
STATSTG stat;
- TRACE("%s %s %p\n",debugstr_w(szDBPath),debugstr_w(szPersist), phDB);
+ TRACE("%s %s\n",debugstr_w(szDBPath),debugstr_w(szPersist) );
- if( !phDB )
+ if( !pdb )
return ERROR_INVALID_PARAMETER;
szMode = (LPWSTR) szPersist;
@@ -328,7 +288,6 @@
if( FAILED( r ) )
{
FIXME("Failed to stat storage\n");
- ret = ERROR_FUNCTION_FAILED;
goto end;
}
@@ -336,17 +295,15 @@
{
ERR("storage GUID is not a MSI database GUID %s\n",
debugstr_guid(&stat.clsid) );
- ret = ERROR_FUNCTION_FAILED;
goto end;
}
- handle = alloc_msihandle( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
- MSI_CloseDatabase, (void**) &db );
- if( !handle )
+ db = alloc_msiobject( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
+ MSI_CloseDatabase );
+ if( !db )
{
FIXME("Failed to allocate a handle\n");
- ret = ERROR_FUNCTION_FAILED;
goto end;
}
@@ -355,24 +312,80 @@
db->storage = stg;
db->mode = szMode;
- /* db->strings = NULL;
- db->first_table = NULL;
- db->last_table = NULL; */
ret = load_string_table( db );
if( ret != ERROR_SUCCESS )
goto end;
- *phDB = handle;
-
+ msiobj_addref( &db->hdr );
IStorage_AddRef( stg );
+ *pdb = db;
+
end:
+ if( db )
+ msiobj_release( &db->hdr );
if( stg )
IStorage_Release( stg );
return ret;
}
+UINT WINAPI MsiOpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIHANDLE *phDB)
+{
+ MSIDATABASE *db;
+ UINT ret;
+
+ TRACE("%s %s %p\n",debugstr_w(szDBPath),debugstr_w(szPersist), phDB);
+
+ ret = MSI_OpenDatabaseW( szDBPath, szPersist, &db );
+ if( ret == ERROR_SUCCESS )
+ {
+ *phDB = alloc_msihandle( &db->hdr );
+ msiobj_release( &db->hdr );
+ }
+
+ return ret;
+}
+
+UINT WINAPI MsiOpenDatabaseA(LPCSTR szDBPath, LPCSTR szPersist, MSIHANDLE *phDB)
+{
+ HRESULT r = ERROR_FUNCTION_FAILED;
+ LPWSTR szwDBPath = NULL, szwPersist = NULL;
+ UINT len;
+
+ TRACE("%s %s %p\n", debugstr_a(szDBPath), debugstr_a(szPersist), phDB);
+
+ if( szDBPath )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, NULL, 0 );
+ szwDBPath = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ if( !szwDBPath )
+ goto end;
+ MultiByteToWideChar( CP_ACP, 0, szDBPath, -1, szwDBPath, len );
+ }
+
+ if( HIWORD(szPersist) )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, szPersist, -1, NULL, 0 );
+ szwPersist = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ if( !szwPersist )
+ goto end;
+ MultiByteToWideChar( CP_ACP, 0, szPersist, -1, szwPersist, len );
+ }
+ else
+ szwPersist = (LPWSTR) szPersist;
+
+ r = MsiOpenDatabaseW( szwDBPath, szwPersist, phDB );
+
+end:
+ if( szwPersist )
+ HeapFree( GetProcessHeap(), 0, szwPersist );
+ if( szwDBPath )
+ HeapFree( GetProcessHeap(), 0, szwDBPath );
+
+ return r;
+}
+
UINT WINAPI MsiOpenProductA(LPCSTR szProduct, MSIHANDLE *phProduct)
{
UINT len, ret;
@@ -525,8 +538,9 @@
UINT WINAPI MsiInstallProductW(LPCWSTR szPackagePath, LPCWSTR szCommandLine)
{
- MSIHANDLE packagehandle;
+ MSIPACKAGE *package = NULL;
UINT rc = ERROR_SUCCESS;
+ MSIHANDLE handle;
FIXME("%s %s\n",debugstr_w(szPackagePath), debugstr_w(szCommandLine));
@@ -534,13 +548,16 @@
if (rc != ERROR_SUCCESS)
return rc;
- rc = MsiOpenPackageW(szPackagePath,&packagehandle);
+ rc = MSI_OpenPackageW(szPackagePath,&package);
if (rc != ERROR_SUCCESS)
return rc;
- ACTION_DoTopLevelINSTALL(packagehandle, szPackagePath, szCommandLine);
+ handle = alloc_msihandle( &package->hdr );
+
+ rc = ACTION_DoTopLevelINSTALL(package, szPackagePath, szCommandLine);
- MsiCloseHandle(packagehandle);
+ MsiCloseHandle(handle);
+ msiobj_release( &package->hdr );
return rc;
}
diff -ur dlls/msi.old/msipriv.h dlls/msi/msipriv.h
--- dlls/msi.old/msipriv.h 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msipriv.h 2004-07-09 13:34:00.000000000 -0500
@@ -43,15 +43,58 @@
struct string_table;
typedef struct string_table string_table;
+struct tagMSIOBJECTHDR;
+typedef struct tagMSIOBJECTHDR MSIOBJECTHDR;
+
+typedef VOID (*msihandledestructor)( MSIOBJECTHDR * );
+
+struct tagMSIOBJECTHDR
+{
+ UINT magic;
+ UINT type;
+ UINT refcount;
+ msihandledestructor destructor;
+ struct tagMSIOBJECTHDR *next;
+ struct tagMSIOBJECTHDR *prev;
+};
+
typedef struct tagMSIDATABASE
{
+ MSIOBJECTHDR hdr;
IStorage *storage;
string_table *strings;
LPWSTR mode;
MSITABLE *first_table, *last_table;
} MSIDATABASE;
-struct tagMSIVIEW;
+typedef struct tagMSIVIEW MSIVIEW;
+
+typedef struct tagMSIQUERY
+{
+ MSIOBJECTHDR hdr;
+ MSIVIEW *view;
+ UINT row;
+ MSIDATABASE *db;
+} MSIQUERY;
+
+/* maybe we can use a Variant instead of doing it ourselves? */
+typedef struct tagMSIFIELD
+{
+ UINT type;
+ union
+ {
+ INT iVal;
+ LPWSTR szwVal;
+ IStream *stream;
+ } u;
+} MSIFIELD;
+
+typedef struct tagMSIRECORD
+{
+ MSIOBJECTHDR hdr;
+ UINT count; /* as passed to MsiCreateRecord */
+ MSIFIELD fields[1]; /* nb. array size is count+1 */
+} MSIRECORD;
typedef struct tagMSIVIEWOPS
{
@@ -90,7 +133,7 @@
/*
* execute - loads the underlying data into memory so it can be read
*/
- UINT (*execute)( struct tagMSIVIEW *, MSIHANDLE );
+ UINT (*execute)( struct tagMSIVIEW *, MSIRECORD * );
/*
* close - clears the data read by execute from memory
@@ -126,31 +169,22 @@
} MSIVIEWOPS;
-typedef struct tagMSIVIEW
-{
- MSIVIEWOPS *ops;
-} MSIVIEW;
-
typedef struct tagMSISUMMARYINFO
{
+ MSIOBJECTHDR hdr;
IPropertyStorage *propstg;
} MSISUMMARYINFO;
-typedef VOID (*msihandledestructor)( VOID * );
-
-typedef struct tagMSIHANDLEINFO
+struct tagMSIVIEW
{
- UINT magic;
- UINT type;
- UINT refcount;
- msihandledestructor destructor;
- struct tagMSIHANDLEINFO *next;
- struct tagMSIHANDLEINFO *prev;
-} MSIHANDLEINFO;
+ MSIOBJECTHDR hdr;
+ MSIVIEWOPS *ops;
+};
typedef struct tagMSIPACKAGE
{
- MSIHANDLE db;
+ MSIOBJECTHDR hdr;
+ MSIDATABASE *db;
struct tagMSIFEATURE *features;
UINT loaded_features;
struct tagMSIFOLDER *folders;
@@ -186,10 +220,14 @@
DEFINE_GUID(CLSID_IMsiServerMessage, 0x000C101D,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
-extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type);
-MSIHANDLE alloc_msihandle(UINT type, UINT extra, msihandledestructor destroy, void **out);
-void msihandle_addref(MSIHANDLE handle);
+/* handle functions */
+extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type);
+extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * );
+extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy );
+extern void msiobj_addref(MSIOBJECTHDR *);
+extern int msiobj_release(MSIOBJECTHDR *);
+extern MSIHANDLE msiobj_findhandle( MSIOBJECTHDR *hdr );
/* add this table to the list of cached tables in the database */
extern void add_table(MSIDATABASE *db, MSITABLE *table);
@@ -222,27 +260,53 @@
extern UINT msi_string_get_codepage( string_table *st );
-UINT VIEW_find_column( MSIVIEW *view, LPWSTR name, UINT *n );
+extern UINT VIEW_find_column( MSIVIEW *view, LPWSTR name, UINT *n );
extern BOOL TABLE_Exists( MSIDATABASE *db, LPWSTR name );
-UINT read_raw_stream_data( MSIHANDLE hdb, LPCWSTR stname,
+extern UINT read_raw_stream_data( MSIDATABASE*, LPCWSTR stname,
USHORT **pdata, UINT *psz );
-UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath,
- LPCWSTR szCommandLine);
-void ACTION_remove_tracked_tempfiles(MSIPACKAGE* hPackage);
+extern UINT ACTION_DoTopLevelINSTALL( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern void ACTION_remove_tracked_tempfiles( MSIPACKAGE* );
/* record internals */
-extern UINT WINAPI MSI_RecordSetIStream( MSIHANDLE handle,
- unsigned int iField, IStream *stm );
-extern const WCHAR *MSI_RecordGetString( MSIHANDLE handle, unsigned int iField );
-
+extern UINT MSI_RecordSetIStream( MSIRECORD *, unsigned int, IStream *);
+extern const WCHAR *MSI_RecordGetString( MSIRECORD *, unsigned int );
+extern MSIRECORD *MSI_CreateRecord( unsigned int );
+extern UINT MSI_RecordSetInteger( MSIRECORD *, unsigned int, int );
+extern UINT MSI_RecordSetStringW( MSIRECORD *, unsigned int, LPCWSTR );
+extern BOOL MSI_RecordIsNull( MSIRECORD *, unsigned int );
+extern UINT MSI_RecordGetStringW( MSIRECORD * , unsigned int, LPWSTR, DWORD *);
+extern int MSI_RecordGetInteger( MSIRECORD *, unsigned int );
+extern UINT MSI_RecordReadStream( MSIRECORD *, unsigned int, char *, DWORD *);
+extern unsigned int MSI_RecordGetFieldCount( MSIRECORD *rec );
/* stream internals */
extern UINT get_raw_stream( MSIHANDLE hdb, LPCWSTR stname, IStream **stm );
extern UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm );
extern void enum_stream_names( IStorage *stg );
+/* database internals */
+extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
+extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
+
+/* view internals */
+extern UINT MSI_ViewExecute( MSIQUERY*, MSIRECORD * );
+extern UINT MSI_ViewFetch( MSIQUERY*, MSIRECORD ** );
+extern UINT MSI_ViewClose( MSIQUERY* );
+
+/* package internals */
+extern UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE ** );
+extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR);
+extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD* );
+extern UINT MSI_GetPropertyW( MSIPACKAGE *, LPCWSTR, LPWSTR, DWORD*);
+extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR );
+extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
+extern UINT MSI_GetComponentStateW(MSIPACKAGE *, LPWSTR, INSTALLSTATE *, INSTALLSTATE *);
+extern UINT MSI_GetFeatureStateW(MSIPACKAGE *, LPWSTR, INSTALLSTATE *, INSTALLSTATE *);
+
+/* registry data encoding/decoding functions */
BOOL unsquash_guid(LPCWSTR in, LPWSTR out);
BOOL squash_guid(LPCWSTR in, LPWSTR out);
BOOL encode_base85_guid(GUID *,LPWSTR);
diff -ur dlls/msi.old/msiquery.c dlls/msi/msiquery.c
--- dlls/msi.old/msiquery.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/msiquery.c 2004-07-09 14:07:57.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Implementation of the Microsoft Installer (msi.dll)
*
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -36,12 +36,15 @@
WINE_DEFAULT_DEBUG_CHANNEL(msi);
+#if 0
typedef struct tagMSIQUERY
{
+ MSIOBJECTHDR hdr;
MSIVIEW *view;
UINT row;
MSIDATABASE *db;
} MSIQUERY;
+#endif
UINT WINAPI MsiDatabaseIsTablePersistentA(
MSIHANDLE hDatabase, LPSTR szTableName)
@@ -57,12 +60,13 @@
return ERROR_CALL_NOT_IMPLEMENTED;
}
-void MSI_CloseView( VOID *arg )
+void MSI_CloseView( MSIOBJECTHDR *arg )
{
- MSIQUERY *query = arg;
+ MSIQUERY *query = (MSIQUERY*) arg;
if( query->view && query->view->ops->delete )
query->view->ops->delete( query->view );
+ msiobj_release( &query->db->hdr );
}
UINT VIEW_find_column( MSIVIEW *table, LPWSTR name, UINT *n )
@@ -118,57 +122,71 @@
return r;
}
-UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
- LPCWSTR szQuery, MSIHANDLE *phView)
+UINT MSI_DatabaseOpenViewW(MSIDATABASE *db,
+ LPCWSTR szQuery, MSIQUERY **pView)
{
- MSIDATABASE *db;
- MSIHANDLE handle;
MSIQUERY *query;
UINT r;
- TRACE("%s %p\n", debugstr_w(szQuery), phView);
+ TRACE("%s %p\n", debugstr_w(szQuery), pView);
if( !szQuery)
return ERROR_INVALID_PARAMETER;
- db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
- if( !db )
- return ERROR_INVALID_HANDLE;
-
/* pre allocate a handle to hold a pointer to the view */
- handle = alloc_msihandle( MSIHANDLETYPE_VIEW, sizeof (MSIQUERY),
- MSI_CloseView, (void**) &query );
- if( !handle )
+ query = alloc_msiobject( MSIHANDLETYPE_VIEW, sizeof (MSIQUERY),
+ MSI_CloseView );
+ if( !query )
return ERROR_FUNCTION_FAILED;
+ msiobj_addref( &db->hdr );
query->row = 0;
query->db = db;
query->view = NULL;
r = MSI_ParseSQL( db, szQuery, &query->view );
- if( r != ERROR_SUCCESS )
+ if( r == ERROR_SUCCESS )
{
- MsiCloseHandle( handle );
- return r;
+ msiobj_addref( &query->hdr );
+ *pView = query;
}
- *phView = handle;
-
+ msiobj_release( &query->hdr );
return ERROR_SUCCESS;
}
-UINT WINAPI MsiViewFetch(MSIHANDLE hView, MSIHANDLE *record)
+UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
+ LPCWSTR szQuery, MSIHANDLE *phView)
+{
+ MSIDATABASE *db;
+ MSIQUERY *query = NULL;
+ UINT ret;
+
+ TRACE("%s %p\n", debugstr_w(szQuery), phView);
+
+ db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
+ if( !db )
+ return ERROR_INVALID_HANDLE;
+
+ ret = MSI_DatabaseOpenViewW( db, szQuery, &query );
+ if( ret == ERROR_SUCCESS )
+ {
+ *phView = alloc_msihandle( &query->hdr );
+ msiobj_release( &query->hdr );
+ }
+ msiobj_release( &db->hdr );
+
+ return ret;
+}
+
+UINT MSI_ViewFetch(MSIQUERY *query, MSIRECORD **prec)
{
- MSIQUERY *query;
MSIVIEW *view;
- MSIHANDLE handle;
+ MSIRECORD *rec;
UINT row_count = 0, col_count = 0, i, ival, ret, type;
- TRACE("%ld %p\n", hView, record);
+ TRACE("%p %p\n", query, prec );
- query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
- if( !query )
- return ERROR_INVALID_HANDLE;
view = query->view;
if( !view )
return ERROR_FUNCTION_FAILED;
@@ -182,8 +200,8 @@
if( query->row >= row_count )
return ERROR_NO_MORE_ITEMS;
- handle = MsiCreateRecord( col_count );
- if( !handle )
+ rec = MSI_CreateRecord( col_count );
+ if( !rec )
return ERROR_FUNCTION_FAILED;
for( i=1; i<=col_count; i++ )
@@ -215,25 +233,25 @@
LPWSTR sval;
sval = MSI_makestring( query->db, ival );
- MsiRecordSetStringW( handle, i, sval );
+ MSI_RecordSetStringW( rec, i, sval );
HeapFree( GetProcessHeap(), 0, sval );
}
else
{
if( (type & MSI_DATASIZEMASK) == 2 )
- MsiRecordSetInteger( handle, i, ival - (1<<15) );
+ MSI_RecordSetInteger( rec, i, ival - (1<<15) );
else
- MsiRecordSetInteger( handle, i, ival - (1<<31) );
+ MSI_RecordSetInteger( rec, i, ival - (1<<31) );
}
}
else
{
- IStream *stm;
+ IStream *stm = NULL;
ret = view->ops->fetch_stream( view, query->row, i, &stm );
if( ( ret == ERROR_SUCCESS ) && stm )
{
- MSI_RecordSetIStream( handle, i, stm );
+ MSI_RecordSetIStream( rec, i, stm );
IStream_Release( stm );
}
else
@@ -242,21 +260,37 @@
}
query->row ++;
- *record = handle;
+ *prec = rec;
return ERROR_SUCCESS;
}
-UINT WINAPI MsiViewClose(MSIHANDLE hView)
+UINT WINAPI MsiViewFetch(MSIHANDLE hView, MSIHANDLE *record)
{
MSIQUERY *query;
- MSIVIEW *view;
+ MSIRECORD *rec = NULL;
+ UINT ret;
- TRACE("%ld\n", hView );
+ TRACE("%ld %p\n", hView, record);
query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
if( !query )
return ERROR_INVALID_HANDLE;
+ ret = MSI_ViewFetch( query, &rec );
+ if( ret == ERROR_SUCCESS )
+ {
+ *record = alloc_msihandle( &rec->hdr );
+ msiobj_release( &rec->hdr );
+ }
+ msiobj_release( &query->hdr );
+ return ret;
+}
+
+UINT MSI_ViewClose(MSIQUERY *query)
+{
+ MSIVIEW *view;
+
+ TRACE("%p\n", query );
view = query->view;
if( !view )
@@ -267,17 +301,28 @@
return view->ops->close( view );
}
-UINT WINAPI MsiViewExecute(MSIHANDLE hView, MSIHANDLE hRec)
+UINT WINAPI MsiViewClose(MSIHANDLE hView)
{
MSIQUERY *query;
- MSIVIEW *view;
+ UINT ret;
- TRACE("%ld %ld\n", hView, hRec);
+ TRACE("%ld\n", hView );
query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
if( !query )
return ERROR_INVALID_HANDLE;
+ ret = MSI_ViewClose( query );
+ msiobj_release( &query->hdr );
+ return ret;
+}
+
+UINT MSI_ViewExecute(MSIQUERY *query, MSIRECORD *rec )
+{
+ MSIVIEW *view;
+
+ TRACE("%p %p\n", query, rec);
+
view = query->view;
if( !view )
return ERROR_FUNCTION_FAILED;
@@ -285,7 +330,39 @@
return ERROR_FUNCTION_FAILED;
query->row = 0;
- return view->ops->execute( view, hRec );
+ return view->ops->execute( view, rec );
+}
+
+UINT WINAPI MsiViewExecute(MSIHANDLE hView, MSIHANDLE hRec)
+{
+ MSIQUERY *query;
+ MSIRECORD *rec = NULL;
+ UINT ret;
+
+ TRACE("%ld %ld\n", hView, hRec);
+
+ query = msihandle2msiinfo( hView, MSIHANDLETYPE_VIEW );
+ if( !query )
+ return ERROR_INVALID_HANDLE;
+
+ if( hRec )
+ {
+ rec = msihandle2msiinfo( hRec, MSIHANDLETYPE_RECORD );
+ if( !rec )
+ {
+ ret = ERROR_INVALID_HANDLE;
+ goto out;
+ }
+ }
+
+ ret = MSI_ViewExecute( query, rec );
+out:
+ if( query )
+ msiobj_release( &query->hdr );
+ if( rec )
+ msiobj_release( &rec->hdr );
+
+ return ret;
}
UINT WINAPI MsiViewGetColumnInfo(MSIHANDLE hView, MSICOLINFO info, MSIHANDLE *hRec)
diff -ur dlls/msi.old/order.c dlls/msi/order.c
--- dlls/msi.old/order.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/order.c 2004-07-09 13:34:00.000000000 -0500
@@ -142,12 +142,12 @@
return ov->table->ops->fetch_int( ov->table, row, col, val );
}
-static UINT ORDER_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT ORDER_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSIORDERVIEW *ov = (MSIORDERVIEW*)view;
UINT r, num_rows = 0, i;
- TRACE("%p %ld\n", ov, record);
+ TRACE("%p %p\n", ov, record);
if( !ov->table )
return ERROR_FUNCTION_FAILED;
@@ -245,6 +245,7 @@
ov->reorder = NULL;
HeapFree( GetProcessHeap(), 0, ov );
+ msiobj_release( &ov->db->hdr );
return ERROR_SUCCESS;
}
@@ -285,6 +286,7 @@
/* fill the structure */
ov->view.ops = &order_ops;
+ msiobj_addref( &db->hdr );
ov->db = db;
ov->table = table;
ov->reorder = NULL;
diff -ur dlls/msi.old/package.c dlls/msi/package.c
--- dlls/msi.old/package.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/package.c 2004-07-09 14:15:00.000000000 -0500
@@ -48,13 +48,9 @@
*/
#define LPCTSTR LPCWSTR
-void MSI_FreePackage( VOID *arg);
-
-void MSI_FreePackage( VOID *arg)
+void MSI_FreePackage( MSIOBJECTHDR *arg)
{
- MSIPACKAGE *package= arg;
-
- MsiCloseHandle(package->db);
+ MSIPACKAGE *package= (MSIPACKAGE*) arg;
ACTION_remove_tracked_tempfiles(package);
@@ -69,6 +65,7 @@
if (package->files && package->loaded_files > 0)
HeapFree(GetProcessHeap(),0,package->files);
+ msiobj_release( &package->db->hdr );
}
UINT WINAPI MsiOpenPackageA(LPCSTR szPackage, MSIHANDLE *phPackage)
@@ -95,45 +92,72 @@
}
-static const void clone_properties(MSIHANDLE db)
+static const UINT clone_properties(MSIDATABASE *db)
{
- MSIHANDLE view;
+ MSIQUERY * view = NULL;
UINT rc;
- static const CHAR CreateSql[] = "CREATE TABLE `_Property` ( `_Property` "
-"CHAR(56) NOT NULL, `Value` CHAR(98) NOT NULL PRIMARY KEY `_Property`)";
- static const CHAR Query[] = "SELECT * from Property";
- static const CHAR Insert[] =
- "INSERT into `_Property` (`_Property`,`Value`) VALUES (?)";
+ static const WCHAR CreateSql[] = {
+ 'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','_','P','r','o',
+ 'p','e','r','t','y','`',' ','(',' ','`','_','P','r','o','p','e','r','t',
+ 'y','`',' ','C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U',
+ 'L','L',',',' ','`','V','a','l','u','e','`',' ','C','H','A','R','(','9',
+ '8',')',' ','N','O','T',' ','N','U','L','L',' ','P','R','I','M','A','R',
+ 'Y',' ','K','E','Y',' ','`','_','P','r','o','p','e','r','t','y','`',')',0};
+ static const WCHAR Query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'f','r','o','m',' ','P','r','o','p','e','r','t','y',0};
+ 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};
/* create the temporary properties table */
- MsiDatabaseOpenViewA(db, CreateSql, &view);
- MsiViewExecute(view,0);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ rc = MSI_DatabaseOpenViewW(db, CreateSql, &view);
+ if (rc != ERROR_SUCCESS)
+ return rc;
+ rc = MSI_ViewExecute(view,0);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ if (rc != ERROR_SUCCESS)
+ return rc;
/* clone the existing properties */
- MsiDatabaseOpenViewA(db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(db, Query, &view);
+ if (rc != ERROR_SUCCESS)
+ return rc;
- MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
+ if (rc != ERROR_SUCCESS)
+ {
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
+ }
while (1)
{
- MSIHANDLE row;
- MSIHANDLE view2;
+ MSIRECORD * row;
+ MSIQUERY * view2;
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc != ERROR_SUCCESS)
break;
- MsiDatabaseOpenViewA(db,Insert,&view2);
- MsiViewExecute(view2,row);
- MsiViewClose(view2);
- MsiCloseHandle(view2);
+ rc = MSI_DatabaseOpenViewW(db,Insert,&view2);
+ if (rc!= ERROR_SUCCESS)
+ continue;
+ rc = MSI_ViewExecute(view2,row);
+ MSI_ViewClose(view2);
+ msiobj_release(&view2->hdr);
- MsiCloseHandle(row);
+ if (rc == ERROR_SUCCESS)
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
+ return rc;
}
/*
@@ -142,12 +166,12 @@
*
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/properties.asp
*/
-static VOID set_installer_properties(MSIHANDLE hPackage)
+static VOID set_installer_properties(MSIPACKAGE *package)
{
WCHAR pth[MAX_PATH];
OSVERSIONINFOA OSVersion;
DWORD verval;
- CHAR verstr[10];
+ WCHAR verstr[10];
static const WCHAR cszbs[]={'\\',0};
static const WCHAR CFF[] =
@@ -172,6 +196,62 @@
{'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
static const WCHAR TF[]=
{'T','e','m','p','F','o','l','d','e','r',0};
+ static const WCHAR szAdminUser[] =
+{'A','d','m','i','n','U','s','e','r',0};
+ static const WCHAR szPriv[] =
+{'P','r','i','v','i','l','e','g','e','d',0};
+ static const WCHAR szOne[] =
+{'1',0};
+ static const WCHAR v9x[] = { 'V','e','r','s','i','o','n','9','X',0 };
+ static const WCHAR vNT[] = { 'V','e','r','s','i','o','n','N','T',0 };
+ static const WCHAR szFormat[] = {'%','l','i',0};
+ static const WCHAR szWinBuild[] =
+{'W','i','n','d','o','w','s','B','u','i','l','d', 0 };
+ static const WCHAR szSPL[] =
+{'S','e','r','v','i','c','e','P','a','c','k','L','e','v','e','l',0 };
+ static const WCHAR szSix[] = {'6',0 };
+
+/* these need to be dynamically descovered sometime */
+
+ static const WCHAR ProgramMenuFolder[] =
+{'P','r','o','g','r','a','m','M','e','n','u','F','o','l','d','e','r',0};
+ static const WCHAR PMFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\','P','r','o','g','r','a','m','s','\\',0};
+ static const WCHAR FavoritesFolder[] =
+{'F','a','v','o','r','i','t','e','s','F','o','l','d','e','r',0};
+ static const WCHAR FFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'F','a','v','o','r','i','t','e','s','\\',0};
+ static const WCHAR FontsFolder[] =
+{'F','o','n','t','s','F','o','l','d','e','r',0};
+ static const WCHAR FoFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\','F','o','n','t','s','\\',0};
+ static const WCHAR SendToFolder[] =
+{'S','e','n','d','T','o','F','o','l','d','e','r',0};
+ static const WCHAR STFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','e','n','d','T','o','\\',0};
+ static const WCHAR StartMenuFolder[] =
+{'S','t','a','r','t','M','e','n','u','F','o','l','d','e','r',0};
+ static const WCHAR SMFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\',0};
+ static const WCHAR StartupFolder[] =
+{'S','t','a','r','t','u','p','F','o','l','d','e','r',0};
+ static const WCHAR SFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\','S','t','a','r','t',' ',
+'M','e','n','u','\\','P','r','o','g','r','a','m','s','\\',
+'S','t','a','r','t','u','p','\\',0};
+ static const WCHAR TemplateFolder[] =
+{'T','e','m','p','l','a','t','e','F','o','l','d','e','r',0};
+ static const WCHAR TFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'S','h','e','l','l','N','e','w','\\',0};
+ static const WCHAR DesktopFolder[] =
+{'D','e','s','k','t','o','p','F','o','l','d','e','r',0};
+ static const WCHAR DFPath[] =
+{'C',':','\\','W','i','n','d','o','w','s','\\',
+'D','e','s','k','t','o','p','\\',0};
/*
* Other things i notice set
@@ -204,143 +284,156 @@
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, CFF, pth);
+ MSI_SetPropertyW(package, CFF, pth);
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, PFF, pth);
+ MSI_SetPropertyW(package, PFF, pth);
SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, CADF, pth);
+ MSI_SetPropertyW(package, CADF, pth);
SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, ATF, pth);
+ MSI_SetPropertyW(package, ATF, pth);
SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, ADF, pth);
+ MSI_SetPropertyW(package, ADF, pth);
SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, SF, pth);
+ MSI_SetPropertyW(package, SF, pth);
SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, LADF, pth);
+ MSI_SetPropertyW(package, LADF, pth);
SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, MPF, pth);
+ MSI_SetPropertyW(package, MPF, pth);
SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, PF, pth);
+ MSI_SetPropertyW(package, PF, pth);
SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
strcatW(pth,cszbs);
- MsiSetPropertyW(hPackage, WF, pth);
+ MSI_SetPropertyW(package, WF, pth);
GetTempPathW(MAX_PATH,pth);
- MsiSetPropertyW(hPackage, TF, pth);
+ MSI_SetPropertyW(package, TF, pth);
- /* in a wine enviroment the user is always admin and privlaged */
- MsiSetPropertyA(hPackage,"AdminUser","1");
- MsiSetPropertyA(hPackage,"Privileged","1");
+ /* in a wine environment the user is always admin and privileged */
+ MSI_SetPropertyW(package,szAdminUser,szOne);
+ MSI_SetPropertyW(package,szPriv,szOne);
/* set the os things */
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
GetVersionExA(&OSVersion);
verval = OSVersion.dwMinorVersion+OSVersion.dwMajorVersion*100;
- sprintf(verstr,"%li",verval);
+ sprintfW(verstr,szFormat,verval);
switch (OSVersion.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
- MsiSetPropertyA(hPackage,"Version9X",verstr);
+ MSI_SetPropertyW(package,v9x,verstr);
break;
case VER_PLATFORM_WIN32_NT:
- MsiSetPropertyA(hPackage,"VersionNT",verstr);
+ MSI_SetPropertyW(package,vNT,verstr);
break;
}
- sprintf(verstr,"%li",OSVersion.dwBuildNumber);
- MsiSetPropertyA(hPackage,"WindowsBuild",verstr);
+ sprintfW(verstr,szFormat,OSVersion.dwBuildNumber);
+ MSI_SetPropertyW(package,szWinBuild,verstr);
/* just fudge this */
- MsiSetPropertyA(hPackage,"ServicePackLevel","6");
+ MSI_SetPropertyW(package,szSPL,szSix);
/* FIXME: these need to be set properly */
- MsiSetPropertyA(hPackage,"ProgramMenuFolder",
- "C:\\Windows\\Start Menu\\Programs\\");
- MsiSetPropertyA(hPackage,"FavoritesFolder",
- "C:\\Windows\\Favorites\\");
- MsiSetPropertyA(hPackage,"FontsFolder",
- "C:\\Windows\\Fonts\\");
- MsiSetPropertyA(hPackage,"SendToFolder",
- "C:\\Windows\\SendTo\\");
- MsiSetPropertyA(hPackage,"StartMenuFolder",
- "C:\\Windows\\Start Menu\\");
- MsiSetPropertyA(hPackage,"StartupFolder",
- "C:\\Windows\\Start Menu\\Programs\\Startup\\");
- MsiSetPropertyA(hPackage,"TemplateFolder",
- "C:\\Windows\\ShellNew\\");
- MsiSetPropertyA(hPackage, "DesktopFolder",
- "C:\\Windows\\Desktop\\");
+ MSI_SetPropertyW(package,ProgramMenuFolder,PMFPath);
+ MSI_SetPropertyW(package,FavoritesFolder,FFPath);
+ MSI_SetPropertyW(package,FontsFolder,FoFPath);
+ MSI_SetPropertyW(package,SendToFolder,STFPath);
+ MSI_SetPropertyW(package,StartMenuFolder,SMFPath);
+ MSI_SetPropertyW(package,StartupFolder,SFPath);
+ MSI_SetPropertyW(package,TemplateFolder,TFPath);
+ MSI_SetPropertyW(package,DesktopFolder,DFPath);
}
-UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage)
+UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
{
UINT rc;
- MSIHANDLE handle;
- MSIHANDLE db;
- MSIPACKAGE *package;
- CHAR uilevel[10];
+ MSIDATABASE *db = NULL;
+ MSIPACKAGE *package = NULL;
+ WCHAR uilevel[10];
+ UINT ret = ERROR_FUNCTION_FAILED;
static const WCHAR OriginalDatabase[] =
{'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
static const WCHAR Database[] =
{'D','A','T','A','B','A','S','E',0};
+ static const WCHAR szpi[] = {'%','i',0};
+ static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 };
- TRACE("%s %p\n",debugstr_w(szPackage), phPackage);
-
- rc = MsiOpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db);
+ TRACE("%s %p\n",debugstr_w(szPackage), pPackage);
+ rc = MSI_OpenDatabaseW(szPackage, MSIDBOPEN_READONLY, &db);
if (rc != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
- handle = alloc_msihandle(MSIHANDLETYPE_PACKAGE, sizeof (MSIPACKAGE),
- MSI_FreePackage, (void**)&package);
+ package = alloc_msiobject( MSIHANDLETYPE_PACKAGE, sizeof (MSIPACKAGE),
+ MSI_FreePackage );
- if (!handle)
+ if (package)
{
- MsiCloseHandle(db);
- return ERROR_FUNCTION_FAILED;
- }
+ msiobj_addref( &db->hdr );
- package->db = db;
- package->features = NULL;
- package->folders = NULL;
- package->components = NULL;
- package->files = NULL;
- package->loaded_features = 0;
- package->loaded_folders = 0;
- package->loaded_components= 0;
- package->loaded_files = 0;
-
- /* ok here is where we do a slew of things to the database to
- * prep for all that is to come as a package */
-
- clone_properties(db);
- set_installer_properties(handle);
- MsiSetPropertyW(handle, OriginalDatabase, szPackage);
- MsiSetPropertyW(handle, Database, szPackage);
- sprintf(uilevel,"%i",gUILevel);
- MsiSetPropertyA(handle, "UILevel", uilevel);
+ package->db = db;
+ package->features = NULL;
+ package->folders = NULL;
+ package->components = NULL;
+ package->files = NULL;
+ package->loaded_features = 0;
+ package->loaded_folders = 0;
+ package->loaded_components= 0;
+ package->loaded_files = 0;
+
+ /* OK, here is where we do a slew of things to the database to
+ * prep for all that is to come as a package */
+
+ clone_properties(db);
+ set_installer_properties(package);
+ MSI_SetPropertyW(package, OriginalDatabase, szPackage);
+ MSI_SetPropertyW(package, Database, szPackage);
+ sprintfW(uilevel,szpi,gUILevel);
+ MSI_SetPropertyW(package, szLevel, uilevel);
+
+ msiobj_addref( &package->hdr );
+ *pPackage = package;
+ ret = ERROR_SUCCESS;
+ }
+
+ if( package )
+ msiobj_release( &package->hdr );
+ if( db )
+ msiobj_release( &db->hdr );
- *phPackage = handle;
+ return ret;
+}
- return ERROR_SUCCESS;
+UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage)
+{
+ MSIPACKAGE *package = NULL;
+ UINT ret;
+
+ ret = MSI_OpenPackageW( szPackage, &package);
+ if( ret == ERROR_SUCCESS )
+ {
+ *phPackage = alloc_msihandle( &package->hdr );
+ msiobj_release( &package->hdr );
+ }
+ return ret;
}
UINT WINAPI MsiOpenPackageExA(LPCSTR szPackage, DWORD dwOptions, MSIHANDLE *phPackage)
@@ -358,28 +451,32 @@
MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
{
MSIPACKAGE *package;
+ MSIHANDLE handle = 0;
TRACE("(%ld)\n",hInstall);
package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+ if( package)
+ {
+ handle = alloc_msihandle( &package->db->hdr );
+ msiobj_release( &package->hdr );
+ }
- if( !package)
- return ERROR_INVALID_HANDLE;
-
- msihandle_addref(package->db);
- return package->db;
+ return handle;
}
-INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
- MSIHANDLE hRecord)
+INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType,
+ MSIRECORD *record)
{
DWORD log_type = 0;
- LPSTR message;
+ LPWSTR message;
DWORD sz;
DWORD total_size = 0;
INT msg_field=1;
INT i;
INT rc;
+ char *msg;
+ int len;
TRACE("%x \n",eMessageType);
rc = 0;
@@ -402,39 +499,50 @@
if ((eMessageType & 0xff000000) == INSTALLMESSAGE_PROGRESS)
log_type |= 0x800;
- message = HeapAlloc(GetProcessHeap(),0,1);
+ message = HeapAlloc(GetProcessHeap(),0,1*sizeof (WCHAR));
message[0]=0;
- msg_field = MsiRecordGetFieldCount(hRecord);
+ msg_field = MSI_RecordGetFieldCount(record);
for (i = 1; i <= msg_field; i++)
{
- LPSTR tmp;
- CHAR number[3];
+ LPWSTR tmp;
+ WCHAR number[3];
+ const static WCHAR format[] = { '%','i',':',' ',0};
+ const static WCHAR space[] = { ' ',0};
sz = 0;
- MsiRecordGetStringA(hRecord,i,NULL,&sz);
+ MSI_RecordGetStringW(record,i,NULL,&sz);
sz+=4;
- total_size+=sz;
- tmp = HeapAlloc(GetProcessHeap(),0,sz);
- message = HeapReAlloc(GetProcessHeap(),0,message,total_size);
+ total_size+=sz*sizeof(WCHAR);
+ tmp = HeapAlloc(GetProcessHeap(),0,sz*sizeof(WCHAR));
+ message = HeapReAlloc(GetProcessHeap(),0,message,total_size*sizeof (WCHAR));
- MsiRecordGetStringA(hRecord,i,tmp,&sz);
+ MSI_RecordGetStringW(record,i,tmp,&sz);
if (msg_field > 1)
{
- sprintf(number,"%i: ",i);
- strcat(message,number);
+ sprintfW(number,format,i);
+ strcatW(message,number);
}
- strcat(message,tmp);
+ strcatW(message,tmp);
if (msg_field > 1)
- strcat(message," ");
+ strcatW(message,space);
HeapFree(GetProcessHeap(),0,tmp);
}
TRACE("(%p %lx %lx %s)\n",gUIHandler, gUIFilter, log_type,
- debugstr_a(message));
+ debugstr_w(message));
+
+ /* convert it to ASCII */
+ len = WideCharToMultiByte( CP_ACP, 0, message, -1,
+ NULL, 0, NULL, NULL );
+ msg = HeapAlloc( GetProcessHeap(), 0, len );
+ WideCharToMultiByte( CP_ACP, 0, message, -1,
+ msg, len, NULL, NULL );
if (gUIHandler && (gUIFilter & log_type))
- rc = gUIHandler(gUIContext,eMessageType,message);
+ {
+ rc = gUIHandler(gUIContext,eMessageType,msg);
+ }
if ((!rc) && (gszLogFile[0]) && !((eMessageType & 0xff000000) ==
INSTALLMESSAGE_PROGRESS))
@@ -446,16 +554,43 @@
if (log_file != INVALID_HANDLE_VALUE)
{
SetFilePointer(log_file,0, NULL, FILE_END);
- WriteFile(log_file,message,strlen(message),&write,NULL);
+ WriteFile(log_file,msg,strlen(msg),&write,NULL);
WriteFile(log_file,"\n",1,&write,NULL);
CloseHandle(log_file);
}
}
+ HeapFree( GetProcessHeap(), 0, msg );
HeapFree(GetProcessHeap(),0,message);
return ERROR_SUCCESS;
}
+INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
+ MSIHANDLE hRecord)
+{
+ UINT ret = ERROR_INVALID_HANDLE;
+ MSIPACKAGE *package = NULL;
+ MSIRECORD *record = NULL;
+
+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE );
+ if( !package )
+ goto out;
+
+ record = msihandle2msiinfo( hRecord, MSIHANDLETYPE_RECORD );
+ if( !record )
+ goto out;
+
+ ret = MSI_ProcessMessage( package, eMessageType, record );
+
+out:
+ if( package )
+ msiobj_release( &package->hdr );
+ if( record )
+ msiobj_release( &record->hdr );
+
+ return ret;
+}
+
/* property code */
UINT WINAPI MsiSetPropertyA( MSIHANDLE hInstall, LPCSTR szName, LPCSTR szValue)
{
@@ -496,10 +631,10 @@
return hr;
}
-UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue)
+UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
{
- MSIPACKAGE *package;
- MSIHANDLE view,row;
+ MSIQUERY *view;
+ MSIRECORD *row;
UINT rc;
DWORD sz = 0;
static const WCHAR Insert[]=
@@ -517,48 +652,54 @@
TRACE("Setting property (%s %s)\n",debugstr_w(szName),
debugstr_w(szValue));
- if (!hInstall)
- return ERROR_INVALID_HANDLE;
-
- package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
- if( !package)
- return ERROR_INVALID_HANDLE;
-
- rc = MsiGetPropertyW(hInstall,szName,0,&sz);
+ rc = MSI_GetPropertyW(package,szName,0,&sz);
if (rc==ERROR_MORE_DATA || rc == ERROR_SUCCESS)
{
sprintfW(Query,Update,szName);
- row = MsiCreateRecord(1);
- MsiRecordSetStringW(row,1,szValue);
+ row = MSI_CreateRecord(1);
+ MSI_RecordSetStringW(row,1,szValue);
}
else
{
strcpyW(Query,Insert);
- row = MsiCreateRecord(2);
- MsiRecordSetStringW(row,1,szName);
- MsiRecordSetStringW(row,2,szValue);
+ row = MSI_CreateRecord(2);
+ MSI_RecordSetStringW(row,1,szName);
+ MSI_RecordSetStringW(row,2,szValue);
}
- rc = MsiDatabaseOpenViewW(package->db,Query,&view);
+ rc = MSI_DatabaseOpenViewW(package->db,Query,&view);
if (rc!= ERROR_SUCCESS)
{
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
return rc;
}
- rc = MsiViewExecute(view,row);
+ rc = MSI_ViewExecute(view,row);
- MsiCloseHandle(row);
- MsiViewClose(view);
- MsiCloseHandle(view);
+ msiobj_release(&row->hdr);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
+UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue)
+{
+ MSIPACKAGE *package;
+ UINT ret;
+
+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package)
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_SetPropertyW( package, szName, szValue);
+ msiobj_release( &package->hdr );
+ return ret;
+}
+
UINT WINAPI MsiGetPropertyA(MSIHANDLE hInstall, LPCSTR szName, LPSTR szValueBuf, DWORD* pchValueBuf)
{
LPWSTR szwName = NULL, szwValueBuf = NULL;
@@ -615,10 +756,11 @@
return hr;
}
-UINT WINAPI MsiGetPropertyW(MSIHANDLE hInstall, LPCWSTR szName,
+UINT MSI_GetPropertyW(MSIPACKAGE *package, LPCWSTR szName,
LPWSTR szValueBuf, DWORD* pchValueBuf)
{
- MSIHANDLE view,row;
+ MSIQUERY *view;
+ MSIRECORD *row;
UINT rc;
WCHAR Query[1024]=
{'s','e','l','e','c','t',' ','V','a','l','u','e',' ','f','r','o','m',' '
@@ -626,23 +768,15 @@
,'_','P','r','o','p','e','r','t','y','=','`',0};
static const WCHAR szEnd[]={'`',0};
- MSIPACKAGE *package;
- if (0 == hInstall) {
- return ERROR_INVALID_HANDLE;
- }
if (NULL == szName) {
return ERROR_INVALID_PARAMETER;
}
- package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
- if( !package)
- return ERROR_INVALID_HANDLE;
-
strcatW(Query,szName);
strcatW(Query,szEnd);
- rc = MsiDatabaseOpenViewW(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc == ERROR_SUCCESS)
{
DWORD sz;
@@ -652,25 +786,25 @@
if (*pchValueBuf > 0)
szValueBuf[0] = 0;
- rc = MsiViewExecute(view, 0);
+ rc = MSI_ViewExecute(view, 0);
if (rc != ERROR_SUCCESS)
{
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
return rc;
}
- rc = MsiViewFetch(view,&row);
+ rc = MSI_ViewFetch(view,&row);
if (rc == ERROR_SUCCESS)
{
sz=0x100;
- rc = MsiRecordGetStringW(row,1,value,&sz);
+ rc = MSI_RecordGetStringW(row,1,value,&sz);
strncpyW(szValueBuf,value,min(sz+1,*pchValueBuf));
*pchValueBuf = sz+1;
- MsiCloseHandle(row);
+ msiobj_release(&row->hdr);
}
- MsiViewClose(view);
- MsiCloseHandle(view);
+ MSI_ViewClose(view);
+ msiobj_release(&view->hdr);
}
if (rc == ERROR_SUCCESS)
@@ -684,3 +818,18 @@
return rc;
}
+
+
+UINT WINAPI MsiGetPropertyW(MSIHANDLE hInstall, LPCWSTR szName,
+ LPWSTR szValueBuf, DWORD* pchValueBuf)
+{
+ MSIPACKAGE *package;
+ UINT ret;
+
+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package)
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_GetPropertyW(package, szName, szValueBuf, pchValueBuf );
+ msiobj_release( &package->hdr );
+ return ret;
+}
diff -ur dlls/msi.old/record.c dlls/msi/record.c
--- dlls/msi.old/record.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/record.c 2004-07-09 14:07:58.000000000 -0500
@@ -1,7 +1,7 @@
/*
* Implementation of the Microsoft Installer (msi.dll)
*
- * Copyright 2002 Mike McCormack for CodeWeavers
+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -41,24 +41,6 @@
#define MSIFIELD_WSTR 3
#define MSIFIELD_STREAM 4
-/* maybe we can use a Variant instead of doing it ourselves? */
-typedef struct tagMSIFIELD
-{
- UINT type;
- union
- {
- INT iVal;
- LPWSTR szwVal;
- IStream *stream;
- } u;
-} MSIFIELD;
-
-typedef struct tagMSIRECORD
-{
- UINT count; /* as passed to MsiCreateRecord */
- MSIFIELD fields[1]; /* nb. array size is count+1 */
-} MSIRECORD;
-
void MSI_FreeField( MSIFIELD *field )
{
switch( field->type )
@@ -77,7 +59,7 @@
}
}
-void MSI_CloseRecord( VOID *arg )
+void MSI_CloseRecord( MSIOBJECTHDR *arg )
{
MSIRECORD *rec = (MSIRECORD *) arg;
UINT i;
@@ -86,28 +68,42 @@
MSI_FreeField( &rec->fields[i] );
}
-MSIHANDLE WINAPI MsiCreateRecord( unsigned int cParams )
+MSIRECORD *MSI_CreateRecord( unsigned int cParams )
{
- MSIHANDLE handle = 0;
- UINT sz;
MSIRECORD *rec;
+ UINT len;
TRACE("%d\n", cParams);
- sz = sizeof (MSIRECORD) + sizeof(MSIFIELD)*(cParams+1) ;
- handle = alloc_msihandle( MSIHANDLETYPE_RECORD, sz,
- MSI_CloseRecord, (void**) &rec );
- if( !handle )
- return 0;
-
+ len = sizeof (MSIRECORD) + sizeof (MSIFIELD)*cParams;
+ rec = alloc_msiobject( MSIHANDLETYPE_RECORD, len, MSI_CloseRecord );
+ if( rec )
rec->count = cParams;
+ return rec;
+}
- return handle;
+MSIHANDLE WINAPI MsiCreateRecord( unsigned int cParams )
+{
+ MSIRECORD *rec;
+ MSIHANDLE ret = 0;
+
+ TRACE("%d\n", cParams);
+
+ rec = MSI_CreateRecord( cParams );
+ if( rec )
+ ret = alloc_msihandle( &rec->hdr );
+ return ret;
+}
+
+unsigned int MSI_RecordGetFieldCount( MSIRECORD *rec )
+{
+ return rec->count;
}
unsigned int WINAPI MsiRecordGetFieldCount( MSIHANDLE handle )
{
MSIRECORD *rec;
+ UINT ret;
TRACE("%ld\n", handle );
@@ -118,7 +114,10 @@
return 0;
}
- return rec->count;
+ ret = MSI_RecordGetFieldCount( rec );
+ msiobj_release( &rec->hdr );
+
+ return ret;
}
static BOOL string2intW( LPCWSTR str, int *out )
@@ -144,16 +143,11 @@
return TRUE;
}
-int WINAPI MsiRecordGetInteger( MSIHANDLE handle, unsigned int iField)
+int MSI_RecordGetInteger( MSIRECORD *rec, unsigned int iField)
{
- MSIRECORD *rec;
int ret = 0;
- TRACE("%ld %d\n", handle, iField );
-
- rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
- if( !rec )
- return MSI_NULL_INTEGER;
+ TRACE("%p %d\n", rec, iField );
if( iField > rec->count )
return MSI_NULL_INTEGER;
@@ -173,6 +167,23 @@
return MSI_NULL_INTEGER;
}
+int WINAPI MsiRecordGetInteger( MSIHANDLE handle, unsigned int iField)
+{
+ MSIRECORD *rec;
+ UINT ret;
+
+ TRACE("%ld %d\n", handle, iField );
+
+ rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+ if( !rec )
+ return MSI_NULL_INTEGER;
+
+ ret = MSI_RecordGetInteger( rec, iField );
+ msiobj_release( &rec->hdr );
+
+ return ret;
+}
+
UINT WINAPI MsiRecordClearData( MSIHANDLE handle )
{
MSIRECORD *rec;
@@ -194,15 +205,9 @@
return ERROR_SUCCESS;
}
-UINT WINAPI MsiRecordSetInteger( MSIHANDLE handle, unsigned int iField, int iVal )
+UINT MSI_RecordSetInteger( MSIRECORD *rec, unsigned int iField, int iVal )
{
- MSIRECORD *rec;
-
- TRACE("%ld %u %d\n", handle,iField, iVal);
-
- rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
- if( !rec )
- return ERROR_INVALID_HANDLE;
+ TRACE("%p %u %d\n", rec, iField, iVal);
if( iField <= rec->count )
{
@@ -214,35 +219,57 @@
return ERROR_SUCCESS;
}
-BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, unsigned int iField )
+UINT WINAPI MsiRecordSetInteger( MSIHANDLE handle, unsigned int iField, int iVal )
{
MSIRECORD *rec;
- BOOL r = TRUE;
+ UINT ret;
- TRACE("%ld %d\n", handle,iField );
+ TRACE("%ld %u %d\n", handle, iField, iVal);
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
return ERROR_INVALID_HANDLE;
+ ret = MSI_RecordSetInteger( rec, iField, iVal );
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+
+BOOL MSI_RecordIsNull( MSIRECORD *rec, unsigned int iField )
+{
+ BOOL r = TRUE;
+
+ TRACE("%p %d\n", rec, iField );
+
r = ( iField > rec->count ) ||
( rec->fields[iField].type == MSIFIELD_NULL );
return r;
}
-UINT WINAPI MsiRecordGetStringA(MSIHANDLE handle, unsigned int iField,
- LPSTR szValue, DWORD *pcchValue)
+BOOL WINAPI MsiRecordIsNull( MSIHANDLE handle, unsigned int iField )
{
MSIRECORD *rec;
- UINT len=0, ret;
- CHAR buffer[16];
+ UINT ret;
- TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
+ TRACE("%ld %d\n", handle, iField );
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
return ERROR_INVALID_HANDLE;
+ ret = MSI_RecordIsNull( rec, iField );
+ msiobj_release( &rec->hdr );
+ return ret;
+
+}
+
+UINT MSI_RecordGetStringA(MSIRECORD *rec, unsigned int iField,
+ LPSTR szValue, DWORD *pcchValue)
+{
+ UINT len=0, ret;
+ CHAR buffer[16];
+
+ TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
if( iField > rec->count )
return ERROR_INVALID_PARAMETER;
@@ -277,14 +304,24 @@
return ret;
}
-const WCHAR *MSI_RecordGetString( MSIHANDLE handle, unsigned int iField )
+UINT WINAPI MsiRecordGetStringA(MSIHANDLE handle, unsigned int iField,
+ LPSTR szValue, DWORD *pcchValue)
{
MSIRECORD *rec;
+ UINT ret;
+
+ TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
- return NULL;
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_RecordGetStringA( rec, iField, szValue, pcchValue);
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+const WCHAR *MSI_RecordGetString( MSIRECORD *rec, unsigned int iField )
+{
if( iField > rec->count )
return NULL;
@@ -294,19 +331,14 @@
return rec->fields[iField].u.szwVal;
}
-UINT WINAPI MsiRecordGetStringW(MSIHANDLE handle, unsigned int iField,
+UINT MSI_RecordGetStringW(MSIRECORD *rec, unsigned int iField,
LPWSTR szValue, DWORD *pcchValue)
{
- MSIRECORD *rec;
UINT len=0, ret;
WCHAR buffer[16];
static const WCHAR szFormat[] = { '%','d',0 };
- TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
-
- rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
- if( !rec )
- return ERROR_INVALID_HANDLE;
+ TRACE("%p %d %p %p\n", rec, iField, szValue, pcchValue);
if( iField > rec->count )
return ERROR_INVALID_PARAMETER;
@@ -338,23 +370,35 @@
return ret;
}
+UINT WINAPI MsiRecordGetStringW(MSIHANDLE handle, unsigned int iField,
+ LPWSTR szValue, DWORD *pcchValue)
+{
+ MSIRECORD *rec;
+ UINT ret;
+
+ TRACE("%ld %d %p %p\n", handle, iField, szValue, pcchValue);
+
+ rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+ if( !rec )
+ return ERROR_INVALID_HANDLE;
+
+ ret = MSI_RecordGetStringW( rec, iField, szValue, pcchValue );
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+
UINT WINAPI MsiRecordDataSize(MSIHANDLE hRecord, unsigned int iField)
{
FIXME("%ld %d\n", hRecord, iField);
return 0;
}
-UINT WINAPI MsiRecordSetStringA( MSIHANDLE handle, unsigned int iField, LPCSTR szValue )
+UINT MSI_RecordSetStringA( MSIRECORD *rec, unsigned int iField, LPCSTR szValue )
{
- MSIRECORD *rec;
LPWSTR str;
UINT len;
- TRACE("%ld %d %s\n", handle, iField, debugstr_a(szValue));
-
- rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
- if( !rec )
- return ERROR_INVALID_HANDLE;
+ TRACE("%p %d %s\n", rec, iField, debugstr_a(szValue));
if( iField > rec->count )
return ERROR_INVALID_FIELD;
@@ -369,21 +413,33 @@
return 0;
}
-UINT WINAPI MsiRecordSetStringW( MSIHANDLE handle, unsigned int iField, LPCWSTR szValue )
+UINT WINAPI MsiRecordSetStringA( MSIHANDLE handle, unsigned int iField, LPCSTR szValue )
{
MSIRECORD *rec;
- LPWSTR str;
+ UINT ret;
- TRACE("%ld %d %s\n", handle, iField, debugstr_w(szValue));
+ TRACE("%ld %d %s\n", handle, iField, debugstr_a(szValue));
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
return ERROR_INVALID_HANDLE;
+ ret = MSI_RecordSetStringA( rec, iField, szValue );
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+
+UINT MSI_RecordSetStringW( MSIRECORD *rec, unsigned int iField, LPCWSTR szValue )
+{
+ LPWSTR str;
+ UINT len;
+
+ TRACE("%p %d %s\n", rec, iField, debugstr_w(szValue));
if( iField > rec->count )
return ERROR_INVALID_FIELD;
- str = HeapAlloc( GetProcessHeap(), 0, (lstrlenW(szValue) + 1)*sizeof (WCHAR));
+ len = lstrlenW(szValue) + 1;
+ str = HeapAlloc( GetProcessHeap(), 0, len*sizeof (WCHAR));
lstrcpyW( str, szValue );
MSI_FreeField( &rec->fields[iField] );
@@ -393,6 +449,22 @@
return 0;
}
+UINT WINAPI MsiRecordSetStringW( MSIHANDLE handle, unsigned int iField, LPCWSTR szValue )
+{
+ MSIRECORD *rec;
+ UINT ret;
+
+ TRACE("%ld %d %s\n", handle, iField, debugstr_w(szValue));
+
+ rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
+ if( !rec )
+ return ERROR_INVALID_HANDLE;
+
+ ret = MSI_RecordSetStringW( rec, iField, szValue );
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+
UINT WINAPI MsiFormatRecordA(MSIHANDLE hInstall, MSIHANDLE hRecord, LPSTR szResult, DWORD *sz)
{
FIXME("%ld %ld %p %p\n", hInstall, hRecord, szResult, sz);
@@ -417,18 +489,13 @@
return ERROR_CALL_NOT_IMPLEMENTED;
}
-UINT WINAPI MsiRecordReadStream(MSIHANDLE handle, unsigned int iField, char *buf, DWORD *sz)
+UINT MSI_RecordReadStream(MSIRECORD *rec, unsigned int iField, char *buf, DWORD *sz)
{
- MSIRECORD *rec;
ULONG count;
HRESULT r;
IStream *stm;
- TRACE("%ld %d %p %p\n", handle, iField, buf, sz);
-
- rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
- if( !rec )
- return ERROR_INVALID_HANDLE;
+ TRACE("%p %d %p %p\n", rec, iField, buf, sz);
if( iField > rec->count )
return ERROR_INVALID_FIELD;
@@ -471,15 +538,24 @@
return ERROR_SUCCESS;
}
-UINT WINAPI MSI_RecordSetIStream( MSIHANDLE handle, unsigned int iField, IStream *stm )
+UINT WINAPI MsiRecordReadStream(MSIHANDLE handle, unsigned int iField, char *buf, DWORD *sz)
{
MSIRECORD *rec;
+ UINT ret;
- TRACE("%ld %d %p\n", handle, iField, stm);
+ TRACE("%ld %d %p %p\n", handle, iField, buf, sz);
rec = msihandle2msiinfo( handle, MSIHANDLETYPE_RECORD );
if( !rec )
return ERROR_INVALID_HANDLE;
+ ret = MSI_RecordReadStream( rec, iField, buf, sz );
+ msiobj_release( &rec->hdr );
+ return ret;
+}
+
+UINT MSI_RecordSetIStream( MSIRECORD *rec, unsigned int iField, IStream *stm )
+{
+ TRACE("%p %d %p\n", rec, iField, stm);
if( iField > rec->count )
return ERROR_INVALID_FIELD;
diff -ur dlls/msi.old/select.c dlls/msi/select.c
--- dlls/msi.old/select.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/select.c 2004-07-09 13:34:01.000000000 -0500
@@ -111,11 +111,11 @@
return sv->table->ops->insert_row( sv->table, num );
}
-static UINT SELECT_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT SELECT_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSISELECTVIEW *sv = (MSISELECTVIEW*)view;
- TRACE("%p %ld\n", sv, record);
+ TRACE("%p %p\n", sv, record);
if( !sv->table )
return ERROR_FUNCTION_FAILED;
diff -ur dlls/msi.old/suminfo.c dlls/msi/suminfo.c
--- dlls/msi.old/suminfo.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/suminfo.c 2004-07-09 14:14:19.000000000 -0500
@@ -38,7 +38,7 @@
static const WCHAR szSumInfo[] = { 5 ,'S','u','m','m','a','r','y',
'I','n','f','o','r','m','a','t','i','o','n',0 };
-static void MSI_CloseSummaryInfo( VOID *arg )
+static void MSI_CloseSummaryInfo( MSIOBJECTHDR *arg )
{
MSISUMMARYINFO *suminfo = (MSISUMMARYINFO *) arg;
IPropertyStorage_Release( suminfo->propstg );
@@ -74,7 +74,7 @@
LPCWSTR szDatabase, UINT uiUpdateCount, MSIHANDLE *phSummaryInfo)
{
HRESULT r;
- MSIHANDLE handle, hdb = hDatabase;
+ MSIHANDLE handle;
MSISUMMARYINFO *suminfo;
MSIDATABASE *db;
UINT ret = ERROR_SUCCESS;
@@ -92,20 +92,24 @@
{
UINT res;
- res = MsiOpenDatabaseW(szDatabase, NULL, &hdb);
+ res = MSI_OpenDatabaseW(szDatabase, NULL, &db);
if( res != ERROR_SUCCESS )
return res;
}
-
- db = msihandle2msiinfo(hdb, MSIHANDLETYPE_DATABASE);
- if( !db )
- return ERROR_INVALID_PARAMETER;
+ else
+ {
+ db = msihandle2msiinfo(hDatabase, MSIHANDLETYPE_DATABASE);
+ if( !db )
+ return ERROR_INVALID_PARAMETER;
+ }
r = IStorage_QueryInterface( db->storage,
&IID_IPropertySetStorage, (LPVOID)&psstg);
if( FAILED( r ) )
{
ERR("IStorage -> IPropertySetStorage failed\n");
+ if (db)
+ msiobj_release(&db->hdr);
return ERROR_FUNCTION_FAILED;
}
ERR("storage = %p propertysetstorage = %p\n", db->storage, psstg);
@@ -119,10 +123,9 @@
goto end;
}
- handle = alloc_msihandle( MSIHANDLETYPE_SUMMARYINFO,
- sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo,
- (void**) &suminfo );
- if( !handle )
+ suminfo = alloc_msiobject( MSIHANDLETYPE_SUMMARYINFO,
+ sizeof (MSISUMMARYINFO), MSI_CloseSummaryInfo );
+ if( !suminfo )
{
ret = ERROR_FUNCTION_FAILED;
goto end;
@@ -130,15 +133,20 @@
IPropertyStorage_AddRef(ps);
suminfo->propstg = ps;
+ handle = alloc_msihandle( &suminfo->hdr );
+ if( handle )
*phSummaryInfo = handle;
+ else
+ ret = ERROR_FUNCTION_FAILED;
+ msiobj_release( &suminfo->hdr );
end:
if( ps )
IPropertyStorage_Release(ps);
if( psstg )
IPropertySetStorage_Release(psstg);
- if( !hDatabase )
- MsiCloseHandle( hdb );
+ if (db)
+ msiobj_release(&db->hdr);
return ret;
}
diff -ur dlls/msi.old/table.c dlls/msi/table.c
--- dlls/msi.old/table.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/table.c 2004-07-09 14:07:58.000000000 -0500
@@ -288,18 +288,7 @@
return ERROR_SUCCESS;
}
-/* FIXME: we should be passing around pointers to db structures internally */
-UINT get_raw_stream( MSIHANDLE hdb, LPCWSTR stname, IStream **stm )
-{
- MSIDATABASE *db = msihandle2msiinfo(hdb, MSIHANDLETYPE_DATABASE );
-
- if ( !db )
- return ERROR_INVALID_HANDLE;
-
- return db_get_raw_stream( db, stname, stm );
-}
-
-UINT read_raw_stream_data( MSIHANDLE hdb, LPCWSTR stname,
+UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
USHORT **pdata, UINT *psz )
{
HRESULT r;
@@ -309,10 +298,9 @@
IStream *stm = NULL;
STATSTG stat;
- r = get_raw_stream( hdb, stname, &stm );
+ r = db_get_raw_stream( db, stname, &stm );
if( r != ERROR_SUCCESS)
- goto end;
- ret = ERROR_FUNCTION_FAILED;
+ return ret;
r = IStream_Stat(stm, &stat, STATFLAG_NONAME );
if( FAILED( r ) )
{
@@ -1114,6 +1102,9 @@
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
UINT ival = 0, refcol = 0, r;
LPWSTR sval;
+ LPWSTR full_name;
+ DWORD len;
+ static const WCHAR szDot[] = { '.', 0 };
if( !view->ops->fetch_int )
return ERROR_INVALID_PARAMETER;
@@ -1138,22 +1129,16 @@
if( !sval )
return ERROR_INVALID_PARAMETER;
- {
- LPWSTR full_name;
- DWORD len;
- static const WCHAR szDot[] = { '.', 0 };
-
- len = strlenW( tv->name ) + 2 + strlenW( sval );
- full_name = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
- strcpyW( full_name, tv->name );
- strcatW( full_name, szDot );
- strcatW( full_name, sval );
-
- r = db_get_raw_stream( tv->db, full_name, stm );
- if( r )
- ERR("fetching stream %s, error = %d\n",debugstr_w(full_name), r);
- HeapFree( GetProcessHeap(), 0, full_name );
- }
+ len = strlenW( tv->name ) + 2 + strlenW( sval );
+ full_name = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
+ strcpyW( full_name, tv->name );
+ strcatW( full_name, szDot );
+ strcatW( full_name, sval );
+
+ r = db_get_raw_stream( tv->db, full_name, stm );
+ if( r )
+ ERR("fetching stream %s, error = %d\n",debugstr_w(full_name), r);
+ HeapFree( GetProcessHeap(), 0, full_name );
HeapFree( GetProcessHeap(), 0, sval );
return r;
@@ -1228,12 +1213,12 @@
return ERROR_SUCCESS;
}
-static UINT TABLE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT TABLE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
UINT r;
- TRACE("%p %ld\n", tv, record);
+ TRACE("%p %p\n", tv, record);
if( tv->table )
return ERROR_FUNCTION_FAILED;
diff -ur dlls/msi.old/update.c dlls/msi/update.c
--- dlls/msi.old/update.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/update.c 2004-07-09 13:34:01.000000000 -0500
@@ -55,13 +55,13 @@
return ERROR_FUNCTION_FAILED;
}
-static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view;
UINT n, type, val, r, row, col_count = 0, row_count = 0;
MSIVIEW *wv;
- TRACE("%p %ld\n", uv, record );
+ TRACE("%p %p\n", uv, record );
if( !record )
return ERROR_FUNCTION_FAILED;
@@ -94,7 +94,7 @@
}
else
{
- val = MsiRecordGetInteger( record, n );
+ val = MSI_RecordGetInteger( record, n );
val |= 0x8000;
}
r = wv->ops->set_int( wv, row, n, val );
@@ -172,6 +172,7 @@
wv->ops->delete( wv );
delete_value_list( uv->vals );
HeapFree( GetProcessHeap(), 0, uv );
+ msiobj_release( &uv->db->hdr );
return ERROR_SUCCESS;
}
@@ -228,6 +229,7 @@
/* fill the structure */
uv->view.ops = &update_ops;
+ msiobj_addref( &db->hdr );
uv->db = db;
uv->vals = list->val_list;
uv->wv = sv;
diff -ur dlls/msi.old/where.c dlls/msi/where.c
--- dlls/msi.old/where.c 2004-07-09 13:32:45.000000000 -0500
+++ dlls/msi/where.c 2004-07-09 13:34:01.000000000 -0500
@@ -131,7 +131,7 @@
}
static const WCHAR *STRING_evaluate( string_table *st,
- MSIVIEW *table, UINT row, struct expr *expr, MSIHANDLE record )
+ MSIVIEW *table, UINT row, struct expr *expr, MSIRECORD *record )
{
UINT val = 0, r;
@@ -157,7 +157,7 @@
}
static UINT STRCMP_Evaluate( string_table *st, MSIVIEW *table, UINT row,
- struct expr *cond, UINT *val, MSIHANDLE record )
+ struct expr *cond, UINT *val, MSIRECORD *record )
{
int sr;
const WCHAR *l_str, *r_str;
@@ -181,7 +181,7 @@
}
static UINT WHERE_evaluate( MSIDATABASE *db, MSIVIEW *table, UINT row,
- struct expr *cond, UINT *val, MSIHANDLE record )
+ struct expr *cond, UINT *val, MSIRECORD *record )
{
UINT r, lval, rval;
@@ -211,7 +211,7 @@
return STRCMP_Evaluate( db->strings, table, row, cond, val, record );
case EXPR_WILDCARD:
- *val = MsiRecordGetInteger( record, 1 );
+ *val = MSI_RecordGetInteger( record, 1 );
return ERROR_SUCCESS;
default:
@@ -223,13 +223,13 @@
}
-static UINT WHERE_execute( struct tagMSIVIEW *view, MSIHANDLE record )
+static UINT WHERE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view;
UINT count = 0, r, val, i;
MSIVIEW *table = wv->table;
- TRACE("%p %ld\n", wv, record);
+ TRACE("%p %p\n", wv, record);
if( !table )
return ERROR_FUNCTION_FAILED;
@@ -337,6 +337,7 @@
delete_expr( wv->cond );
HeapFree( GetProcessHeap(), 0, wv );
+ msiobj_release( &wv->db->hdr );
return ERROR_SUCCESS;
}
@@ -458,6 +459,7 @@
/* fill the structure */
wv->view.ops = &where_ops;
+ msiobj_addref( &db->hdr );
wv->db = db;
wv->table = table;
wv->row_count = 0;
Binary files dlls/msi.old/where.o and dlls/msi/where.o differ
More information about the wine-patches
mailing list