From ed7c4bc84c0f72bcd0b07e02a07f40badb3ffc1f Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Sun, 4 Jul 2004 00:26:54 +0000 Subject: [PATCH] Implement SetTargetPath, start the basics for tracking UI level. --- dlls/msi/action.c | 200 +++++++++++++++++++++++++++++++++++++++++++-- dlls/msi/msi.c | 19 ++++- dlls/msi/msi.spec | 4 +- dlls/msi/msipriv.h | 5 ++ dlls/msi/package.c | 12 +-- 5 files changed, 222 insertions(+), 18 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index e5d76ff0c16..0bd6f4ea92a 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -52,6 +52,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); /* * Prototypes */ +static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran); +static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage); + UINT ACTION_PerformAction(MSIHANDLE hPackage, const WCHAR *action); static UINT ACTION_CostInitialize(MSIHANDLE hPackage); static UINT ACTION_CreateFolders(MSIHANDLE hPackage); @@ -104,13 +107,9 @@ inline static char *strdupWtoA( const WCHAR *str ) UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath, LPCWSTR szCommandLine) { - MSIHANDLE view; + DWORD sz; + CHAR buffer[10]; UINT rc; - static const CHAR *ExecSeqQuery = -"select * from InstallExecuteSequence where Sequence > 0 order by Sequence"; - MSIHANDLE db; - - FIXME("****We do not do any of the UI level stuff yet***\n"); if (szPackagePath) { @@ -128,7 +127,8 @@ UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath, } size = MAX_PATH; - if (MsiGetPropertyW(hPackage,cszSourceDir,check,&size) != ERROR_SUCCESS ) + if (MsiGetPropertyW(hPackage,cszSourceDir,check,&size) + != ERROR_SUCCESS ) MsiSetPropertyW(hPackage, cszSourceDir, pth); } @@ -174,9 +174,57 @@ UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath, MsiSetPropertyW(hPackage,prop,val); } } + + sz = 10; + if (MsiGetPropertyA(hPackage,"UILevel",buffer,&sz) == ERROR_SUCCESS) + { + if (atoi(buffer) >= INSTALLUILEVEL_REDUCED) + { + rc = ACTION_ProcessUISequence(hPackage); + if (rc == ERROR_SUCCESS) + rc = ACTION_ProcessExecSequence(hPackage,TRUE); + } + else + rc = ACTION_ProcessExecSequence(hPackage,FALSE); + } + else + rc = ACTION_ProcessExecSequence(hPackage,FALSE); + + return rc; +} + + +static UINT ACTION_ProcessExecSequence(MSIHANDLE hPackage, BOOL UIran) +{ + MSIHANDLE 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); - rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view); + + 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,0); + } + else + sprintf(Query,ExecSeqQuery,0); + + rc = MsiDatabaseOpenViewA(db, Query, &view); MsiCloseHandle(db); if (rc == ERROR_SUCCESS) @@ -196,7 +244,6 @@ UINT ACTION_DoTopLevelINSTALL(MSIHANDLE hPackage, LPCWSTR szPackagePath, { WCHAR buffer[0x100]; DWORD sz = 0x100; - MSIHANDLE row = 0; rc = MsiViewFetch(view,&row); if (rc != ERROR_SUCCESS) @@ -256,6 +303,93 @@ end: } +static UINT ACTION_ProcessUISequence(MSIHANDLE hPackage) +{ + MSIHANDLE view; + UINT rc; + static const CHAR *ExecSeqQuery = +"select * from InstallUISequence where Sequence > 0 order by Sequence"; + MSIHANDLE db; + + db = MsiGetActiveDatabase(hPackage); + rc = MsiDatabaseOpenViewA(db, ExecSeqQuery, &view); + MsiCloseHandle(db); + + if (rc == ERROR_SUCCESS) + { + rc = MsiViewExecute(view, 0); + + if (rc != ERROR_SUCCESS) + { + MsiViewClose(view); + MsiCloseHandle(view); + goto end; + } + + TRACE("Running the actions \n"); + + while (1) + { + WCHAR buffer[0x100]; + DWORD sz = 0x100; + MSIHANDLE row = 0; + + rc = MsiViewFetch(view,&row); + if (rc != ERROR_SUCCESS) + { + rc = ERROR_SUCCESS; + break; + } + + /* check conditions */ + if (!MsiRecordIsNull(row,2)) + { + sz=0x100; + rc = MsiRecordGetStringW(row,2,buffer,&sz); + if (rc != ERROR_SUCCESS) + { + MsiCloseHandle(row); + break; + } + + if (MsiEvaluateConditionW(hPackage, buffer) == + MSICONDITION_FALSE) + { + MsiCloseHandle(row); + continue; + } + + } + + sz=0x100; + rc = MsiRecordGetStringW(row,1,buffer,&sz); + if (rc != ERROR_SUCCESS) + { + ERR("Error is %x\n",rc); + MsiCloseHandle(row); + break; + } + + rc = ACTION_PerformAction(hPackage,buffer); + + if (rc != ERROR_SUCCESS) + { + ERR("Execution halted due to error (%i)\n",rc); + MsiCloseHandle(row); + break; + } + + MsiCloseHandle(row); + } + + MsiViewClose(view); + MsiCloseHandle(view); + } + +end: + return rc; +} + /******************************************************** * ACTION helper functions and functions that perform the actions *******************************************************/ @@ -2042,6 +2176,54 @@ UINT WINAPI MsiGetSourcePathW( MSIHANDLE hInstall, LPCWSTR szFolder, LPWSTR return rc; } + +UINT WINAPI MsiSetTargetPathA(MSIHANDLE hInstall, LPCSTR szFolder, + LPCSTR szFolderPath) +{ + LPWSTR szwFolder; + LPWSTR szwFolderPath; + UINT rc,len; + + if (!szFolder) + return ERROR_FUNCTION_FAILED; + if (hInstall == 0) + return ERROR_FUNCTION_FAILED; + + len = MultiByteToWideChar( CP_ACP, 0, szFolder, -1, NULL, 0); + szwFolder= HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR)); + + if (!szwFolder) + return ERROR_FUNCTION_FAILED; + + MultiByteToWideChar( CP_ACP, 0, szFolder, -1, szwFolder, len); + + len = MultiByteToWideChar( CP_ACP, 0, szFolderPath, -1, NULL, 0); + szwFolderPath= HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR)); + + if (!szwFolderPath) + { + HeapFree(GetProcessHeap(),0,szwFolder); + return ERROR_FUNCTION_FAILED; + } + + MultiByteToWideChar( CP_ACP, 0, szFolderPath, -1, szwFolderPath, len); + + rc = MsiSetTargetPathW(hInstall, szwFolder, szwFolderPath); + + HeapFree(GetProcessHeap(),0,szwFolder); + HeapFree(GetProcessHeap(),0,szwFolderPath); + + return rc; +} + +UINT WINAPI MsiSetTargetPathW(MSIHANDLE hInstall, LPCWSTR szFolder, + LPCWSTR szFolderPath) +{ + TRACE("(%s %s)\n",debugstr_w(szFolder),debugstr_w(szFolderPath)); + + return MsiSetPropertyW(hInstall,szFolder,szFolderPath); +} + BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, DWORD iRunMode) { FIXME("STUB (%li)\n",iRunMode); diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index ccc028b0f87..ac46c216194 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -62,6 +62,10 @@ static const WCHAR szFeatures[] = { static const WCHAR szComponents[] = { 'C','o','m','p','o','n','e','n','t','s',0 }; +/* the UI level */ +INSTALLUILEVEL gUILevel; +HWND gUIhwnd; + /* * .MSI file format * @@ -681,8 +685,17 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct) INSTALLUILEVEL WINAPI MsiSetInternalUI(INSTALLUILEVEL dwUILevel, HWND *phWnd) { - FIXME("%08x %p\n", dwUILevel, phWnd); - return dwUILevel; + INSTALLUILEVEL old = gUILevel; + HWND oldwnd = gUIhwnd; + TRACE("%08x %p\n", dwUILevel, phWnd); + + gUILevel = dwUILevel; + if (phWnd) + { + gUIhwnd = *phWnd; + *phWnd = oldwnd; + } + return old; } INSTALLUI_HANDLERA WINAPI MsiSetExternalUIA(INSTALLUI_HANDLERA puiHandler, @@ -1071,6 +1084,8 @@ UINT WINAPI MsiVerifyPackageW( LPCWSTR szPackage ) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { if (fdwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hinstDLL); + gUILevel = INSTALLUILEVEL_BASIC; + gUIhwnd = 0; /* FIXME: Initialisation */ } else if (fdwReason == DLL_PROCESS_DETACH) { /* FIXME: Cleanup */ diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index ae529a65dda..0368ea187f6 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -143,8 +143,8 @@ 143 stub MsiSetMode 144 stdcall MsiSetPropertyA(long str str) 145 stdcall MsiSetPropertyW(long wstr wstr) -146 stub MsiSetTargetPathA -147 stub MsiSetTargetPathW +146 stdcall MsiSetTargetPathA(long str str) +147 stdcall MsiSetTargetPathW(long wstr wstr) 148 stdcall MsiSummaryInfoGetPropertyA(long long ptr ptr ptr ptr ptr) 149 stdcall MsiSummaryInfoGetPropertyCount(long ptr) 150 stdcall MsiSummaryInfoGetPropertyW(long long ptr ptr ptr ptr ptr) diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index bbed51a6c2d..7451a52112e 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -221,4 +221,9 @@ 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 ); + +/* UI globals */ +extern INSTALLUILEVEL gUILevel; +extern HWND gUIhwnd; + #endif /* __WINE_MSI_PRIVATE__ */ diff --git a/dlls/msi/package.c b/dlls/msi/package.c index ce74d6c9c75..c6ee8790a03 100644 --- a/dlls/msi/package.c +++ b/dlls/msi/package.c @@ -21,6 +21,7 @@ #define NONAMELESSUNION #include +#include #include "windef.h" #include "winbase.h" #include "winreg.h" @@ -214,9 +215,6 @@ RedirectedDllSupport Time Date Privilaged -DATABASE -OriginalDatabase -UILevel */ SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth); @@ -270,6 +268,7 @@ UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage) MSIHANDLE handle; MSIHANDLE db; MSIPACKAGE *package; + CHAR uilevel[10]; static const WCHAR OriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0}; @@ -301,6 +300,8 @@ UINT WINAPI MsiOpenPackageW(LPCWSTR szPackage, MSIHANDLE *phPackage) set_installer_properties(handle); MsiSetPropertyW(handle, OriginalDatabase, szPackage); MsiSetPropertyW(handle, Database, szPackage); + sprintf(uilevel,"%i",gUILevel); + MsiSetPropertyA(handle, "UILevel", uilevel); *phPackage = handle; @@ -396,10 +397,11 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue if (!hInstall) return ERROR_INVALID_HANDLE; - if (MsiGetPropertyW(hInstall,szName,0,&sz)==ERROR_MORE_DATA) + rc = MsiGetPropertyW(hInstall,szName,0,&sz); + if (rc==ERROR_MORE_DATA || rc == ERROR_SUCCESS) { FIXME("Cannot set exising properties! FIXME MIKE!\n"); - return ERROR_FUNCTION_FAILED; + return ERROR_SUCCESS; } package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);