msi: Breaking up action.c part3
Aric Stewart
aric at codeweavers.com
Thu Jun 16 14:17:03 CDT 2005
Part 3:
Break out all the top level apis out into install.c
-------------- next part --------------
Index: dlls/msi/action.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/action.c,v
retrieving revision 1.147
diff -u -r1.147 action.c
--- dlls/msi/action.c 16 Jun 2005 15:51:44 -0000 1.147
+++ dlls/msi/action.c 16 Jun 2005 19:14:34 -0000
@@ -5013,521 +5013,3 @@
return rc;
}
-
-/* Msi functions that seem appropriate here */
-
-/***********************************************************************
- * MsiDoActionA (MSI.@)
- */
-UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction )
-{
- LPWSTR szwAction;
- UINT rc;
-
- TRACE(" exteral attempt at action %s\n",szAction);
-
- if (!szAction)
- return ERROR_FUNCTION_FAILED;
- if (hInstall == 0)
- return ERROR_FUNCTION_FAILED;
-
- szwAction = strdupAtoW(szAction);
-
- if (!szwAction)
- return ERROR_FUNCTION_FAILED;
-
-
- rc = MsiDoActionW(hInstall, szwAction);
- HeapFree(GetProcessHeap(),0,szwAction);
- return rc;
-}
-
-/***********************************************************************
- * MsiDoActionW (MSI.@)
- */
-UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
-{
- MSIPACKAGE *package;
- UINT ret = ERROR_INVALID_HANDLE;
-
- TRACE(" external attempt at action %s \n",debugstr_w(szAction));
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if( package )
- {
- ret = ACTION_PerformUIAction(package,szAction);
- msiobj_release( &package->hdr );
- }
- return ret;
-}
-
-UINT WINAPI MsiGetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder,
- LPSTR szPathBuf, DWORD* pcchPathBuf)
-{
- LPWSTR szwFolder;
- LPWSTR szwPathBuf;
- UINT rc;
-
- TRACE("getting folder %s %p %li\n",szFolder,szPathBuf, *pcchPathBuf);
-
- if (!szFolder)
- return ERROR_FUNCTION_FAILED;
- if (hInstall == 0)
- return ERROR_FUNCTION_FAILED;
-
- szwFolder = strdupAtoW(szFolder);
-
- if (!szwFolder)
- return ERROR_FUNCTION_FAILED;
-
- szwPathBuf = HeapAlloc( GetProcessHeap(), 0 , *pcchPathBuf * sizeof(WCHAR));
-
- rc = MsiGetTargetPathW(hInstall, szwFolder, szwPathBuf,pcchPathBuf);
-
- WideCharToMultiByte( CP_ACP, 0, szwPathBuf, *pcchPathBuf, szPathBuf,
- *pcchPathBuf, NULL, NULL );
-
- HeapFree(GetProcessHeap(),0,szwFolder);
- HeapFree(GetProcessHeap(),0,szwPathBuf);
-
- return rc;
-}
-
-UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder, LPWSTR
- szPathBuf, DWORD* pcchPathBuf)
-{
- LPWSTR path;
- UINT rc = ERROR_FUNCTION_FAILED;
- MSIPACKAGE *package;
-
- TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
- path = resolve_folder(package, szFolder, FALSE, FALSE, NULL);
- msiobj_release( &package->hdr );
-
- if (path && (strlenW(path) > *pcchPathBuf))
- {
- *pcchPathBuf = strlenW(path)+1;
- rc = ERROR_MORE_DATA;
- }
- else if (path)
- {
- *pcchPathBuf = strlenW(path)+1;
- strcpyW(szPathBuf,path);
- TRACE("Returning Path %s\n",debugstr_w(path));
- rc = ERROR_SUCCESS;
- }
- HeapFree(GetProcessHeap(),0,path);
-
- return rc;
-}
-
-
-UINT WINAPI MsiGetSourcePathA( MSIHANDLE hInstall, LPCSTR szFolder,
- LPSTR szPathBuf, DWORD* pcchPathBuf)
-{
- LPWSTR szwFolder;
- LPWSTR szwPathBuf;
- UINT rc;
-
- TRACE("getting source %s %p %li\n",szFolder,szPathBuf, *pcchPathBuf);
-
- if (!szFolder)
- return ERROR_FUNCTION_FAILED;
- if (hInstall == 0)
- return ERROR_FUNCTION_FAILED;
-
- szwFolder = strdupAtoW(szFolder);
- if (!szwFolder)
- return ERROR_FUNCTION_FAILED;
-
- szwPathBuf = HeapAlloc( GetProcessHeap(), 0 , *pcchPathBuf * sizeof(WCHAR));
-
- rc = MsiGetSourcePathW(hInstall, szwFolder, szwPathBuf,pcchPathBuf);
-
- WideCharToMultiByte( CP_ACP, 0, szwPathBuf, *pcchPathBuf, szPathBuf,
- *pcchPathBuf, NULL, NULL );
-
- HeapFree(GetProcessHeap(),0,szwFolder);
- HeapFree(GetProcessHeap(),0,szwPathBuf);
-
- return rc;
-}
-
-UINT WINAPI MsiGetSourcePathW( MSIHANDLE hInstall, LPCWSTR szFolder, LPWSTR
- szPathBuf, DWORD* pcchPathBuf)
-{
- LPWSTR path;
- UINT rc = ERROR_FUNCTION_FAILED;
- MSIPACKAGE *package;
-
- TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if( !package )
- return ERROR_INVALID_HANDLE;
- path = resolve_folder(package, szFolder, TRUE, FALSE, NULL);
- msiobj_release( &package->hdr );
-
- if (path && strlenW(path) > *pcchPathBuf)
- {
- *pcchPathBuf = strlenW(path)+1;
- rc = ERROR_MORE_DATA;
- }
- else if (path)
- {
- *pcchPathBuf = strlenW(path)+1;
- strcpyW(szPathBuf,path);
- TRACE("Returning Path %s\n",debugstr_w(path));
- rc = ERROR_SUCCESS;
- }
- HeapFree(GetProcessHeap(),0,path);
-
- return rc;
-}
-
-
-/***********************************************************************
- * MsiSetTargetPathA (MSI.@)
- */
-UINT WINAPI MsiSetTargetPathA(MSIHANDLE hInstall, LPCSTR szFolder,
- LPCSTR szFolderPath)
-{
- LPWSTR szwFolder;
- LPWSTR szwFolderPath;
- UINT rc;
-
- if (!szFolder)
- return ERROR_FUNCTION_FAILED;
- if (hInstall == 0)
- return ERROR_FUNCTION_FAILED;
-
- szwFolder = strdupAtoW(szFolder);
- if (!szwFolder)
- return ERROR_FUNCTION_FAILED;
-
- szwFolderPath = strdupAtoW(szFolderPath);
- if (!szwFolderPath)
- {
- HeapFree(GetProcessHeap(),0,szwFolder);
- return ERROR_FUNCTION_FAILED;
- }
-
- rc = MsiSetTargetPathW(hInstall, szwFolder, szwFolderPath);
-
- HeapFree(GetProcessHeap(),0,szwFolder);
- HeapFree(GetProcessHeap(),0,szwFolderPath);
-
- return rc;
-}
-
-UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
- LPCWSTR szFolderPath)
-{
- DWORD i;
- LPWSTR path = NULL;
- LPWSTR path2 = NULL;
- MSIFOLDER *folder;
-
- 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;
-
- if (GetFileAttributesW(szFolderPath) == INVALID_FILE_ATTRIBUTES)
- return ERROR_FUNCTION_FAILED;
-
- path = resolve_folder(package,szFolder,FALSE,FALSE,&folder);
-
- if (!path)
- return ERROR_INVALID_PARAMETER;
-
- HeapFree(GetProcessHeap(),0,folder->Property);
- folder->Property = build_directory_name(2, szFolderPath, NULL);
-
- if (lstrcmpiW(path, folder->Property) == 0)
- {
- /*
- * Resolved Target has not really changed, so just
- * set this folder and do not recalculate everything.
- */
- HeapFree(GetProcessHeap(),0,folder->ResolvedTarget);
- folder->ResolvedTarget = NULL;
- path2 = resolve_folder(package,szFolder,FALSE,TRUE,NULL);
- HeapFree(GetProcessHeap(),0,path2);
- }
- else
- {
- for (i = 0; i < package->loaded_folders; i++)
- {
- HeapFree(GetProcessHeap(),0,package->folders[i].ResolvedTarget);
- package->folders[i].ResolvedTarget=NULL;
- }
-
- for (i = 0; i < package->loaded_folders; i++)
- {
- path2=resolve_folder(package, package->folders[i].Directory, FALSE,
- TRUE, NULL);
- HeapFree(GetProcessHeap(),0,path2);
- }
- }
- HeapFree(GetProcessHeap(),0,path);
-
- return ERROR_SUCCESS;
-}
-
-/***********************************************************************
- * MsiSetTargetPathW (MSI.@)
- */
-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;
-}
-
-/***********************************************************************
- * MsiGetMode (MSI.@)
- *
- * Returns an internal installer state (if it is running in a mode iRunMode)
- *
- * PARAMS
- * hInstall [I] Handle to the installation
- * hRunMode [I] Checking run mode
- * MSIRUNMODE_ADMIN Administrative mode
- * MSIRUNMODE_ADVERTISE Advertisement mode
- * MSIRUNMODE_MAINTENANCE Maintenance mode
- * MSIRUNMODE_ROLLBACKENABLED Rollback is enabled
- * MSIRUNMODE_LOGENABLED Log file is writing
- * MSIRUNMODE_OPERATIONS Operations in progress??
- * MSIRUNMODE_REBOOTATEND We need to reboot after installation completed
- * MSIRUNMODE_REBOOTNOW We need to reboot to continue the installation
- * MSIRUNMODE_CABINET Files from cabinet are installed
- * MSIRUNMODE_SOURCESHORTNAMES Long names in source files is suppressed
- * MSIRUNMODE_TARGETSHORTNAMES Long names in destination files is suppressed
- * MSIRUNMODE_RESERVED11 Reserved
- * MSIRUNMODE_WINDOWS9X Running under Windows95/98
- * MSIRUNMODE_ZAWENABLED Demand installation is supported
- * MSIRUNMODE_RESERVED14 Reserved
- * MSIRUNMODE_RESERVED15 Reserved
- * MSIRUNMODE_SCHEDULED called from install script
- * MSIRUNMODE_ROLLBACK called from rollback script
- * MSIRUNMODE_COMMIT called from commit script
- *
- * RETURNS
- * In the state: TRUE
- * Not in the state: FALSE
- *
- */
-
-BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
-{
- FIXME("STUB (iRunMode=%i)\n",iRunMode);
- return TRUE;
-}
-
-/***********************************************************************
- * MsiSetFeatureStateA (MSI.@)
- *
- * According to the docs, when this is called it immediately recalculates
- * all the component states as well
- */
-UINT WINAPI MsiSetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature,
- INSTALLSTATE iState)
-{
- LPWSTR szwFeature = NULL;
- UINT rc;
-
- szwFeature = strdupAtoW(szFeature);
-
- if (!szwFeature)
- return ERROR_FUNCTION_FAILED;
-
- rc = MsiSetFeatureStateW(hInstall,szwFeature, iState);
-
- HeapFree(GetProcessHeap(),0,szwFeature);
-
- return rc;
-}
-
-
-
-UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE* package, LPCWSTR szFeature,
- INSTALLSTATE iState)
-{
- INT index, i;
- UINT rc = ERROR_SUCCESS;
-
- TRACE(" %s to %i\n",debugstr_w(szFeature), iState);
-
- index = get_loaded_feature(package,szFeature);
- if (index < 0)
- return ERROR_UNKNOWN_FEATURE;
-
- if (iState == INSTALLSTATE_ADVERTISED &&
- package->features[index].Attributes &
- msidbFeatureAttributesDisallowAdvertise)
- return ERROR_FUNCTION_FAILED;
-
- package->features[index].ActionRequest= iState;
- package->features[index].Action= iState;
-
- ACTION_UpdateComponentStates(package,szFeature);
-
- /* update all the features that are children of this feature */
- for (i = 0; i < package->loaded_features; i++)
- {
- if (strcmpW(szFeature, package->features[i].Feature_Parent) == 0)
- MSI_SetFeatureStateW(package, package->features[i].Feature, iState);
- }
-
- return rc;
-}
-
-/***********************************************************************
- * MsiSetFeatureStateW (MSI.@)
- */
-UINT WINAPI MsiSetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature,
- INSTALLSTATE iState)
-{
- MSIPACKAGE* package;
- UINT rc = ERROR_SUCCESS;
-
- TRACE(" %s to %i\n",debugstr_w(szFeature), iState);
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
-
- rc = MSI_SetFeatureStateW(package,szFeature,iState);
-
- msiobj_release( &package->hdr );
- return rc;
-}
-
-UINT WINAPI MsiGetFeatureStateA(MSIHANDLE hInstall, LPSTR szFeature,
- INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
-{
- LPWSTR szwFeature = NULL;
- UINT rc;
-
- szwFeature = strdupAtoW(szFeature);
-
- rc = MsiGetFeatureStateW(hInstall,szwFeature,piInstalled, piAction);
-
- HeapFree( GetProcessHeap(), 0 , szwFeature);
-
- return rc;
-}
-
-UINT MSI_GetFeatureStateW(MSIPACKAGE *package, LPWSTR szFeature,
- INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
-{
- INT index;
-
- index = get_loaded_feature(package,szFeature);
- if (index < 0)
- return ERROR_UNKNOWN_FEATURE;
-
- if (piInstalled)
- *piInstalled = package->features[index].Installed;
-
- if (piAction)
- *piAction = package->features[index].Action;
-
- TRACE("returning %i %i\n",*piInstalled,*piAction);
-
- 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;
-}
-
-/***********************************************************************
- * MsiGetComponentStateA (MSI.@)
- */
-UINT WINAPI MsiGetComponentStateA(MSIHANDLE hInstall, LPSTR szComponent,
- INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
-{
- LPWSTR szwComponent= NULL;
- UINT rc;
-
- szwComponent= strdupAtoW(szComponent);
-
- rc = MsiGetComponentStateW(hInstall,szwComponent,piInstalled, piAction);
-
- HeapFree( GetProcessHeap(), 0 , szwComponent);
-
- return rc;
-}
-
-UINT MSI_GetComponentStateW(MSIPACKAGE *package, LPWSTR szComponent,
- INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
-{
- INT index;
-
- TRACE("%p %s %p %p\n", package, debugstr_w(szComponent), piInstalled,
-piAction);
-
- index = get_loaded_component(package,szComponent);
- if (index < 0)
- return ERROR_UNKNOWN_COMPONENT;
-
- if (piInstalled)
- *piInstalled = package->components[index].Installed;
-
- if (piAction)
- *piAction = package->components[index].Action;
-
- TRACE("states (%i, %i)\n",
-(piInstalled)?*piInstalled:-1,(piAction)?*piAction:-1);
-
- return ERROR_SUCCESS;
-}
-
-/***********************************************************************
- * MsiGetComponentStateW (MSI.@)
- */
-UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
- INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
-{
- MSIPACKAGE* package;
- UINT ret;
-
- TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent),
- piInstalled, piAction);
-
- package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
- if (!package)
- return ERROR_INVALID_HANDLE;
- ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction);
- msiobj_release( &package->hdr );
- return ret;
-}
--- /dev/null 2005-03-17 08:20:53.000000000 -0600
+++ dlls/msi/install.c 2005-06-16 14:12:37.000000000 -0500
@@ -0,0 +1,570 @@
+/*
+ * Implementation of the Microsoft Installer (msi.dll)
+ *
+ * Copyright 2005 Aric Stewart for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* Msi top level apis directly related to installs */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "wine/debug.h"
+#include "msi.h"
+#include "msidefs.h"
+#include "msipriv.h"
+#include "winuser.h"
+#include "wine/unicode.h"
+#include "action.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msi);
+
+/***********************************************************************
+ * MsiDoActionA (MSI.@)
+ */
+UINT WINAPI MsiDoActionA( MSIHANDLE hInstall, LPCSTR szAction )
+{
+ LPWSTR szwAction;
+ UINT rc;
+
+ TRACE(" exteral attempt at action %s\n",szAction);
+
+ if (!szAction)
+ return ERROR_FUNCTION_FAILED;
+ if (hInstall == 0)
+ return ERROR_FUNCTION_FAILED;
+
+ szwAction = strdupAtoW(szAction);
+
+ if (!szwAction)
+ return ERROR_FUNCTION_FAILED;
+
+
+ rc = MsiDoActionW(hInstall, szwAction);
+ HeapFree(GetProcessHeap(),0,szwAction);
+ return rc;
+}
+
+/***********************************************************************
+ * MsiDoActionW (MSI.@)
+ */
+UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction )
+{
+ MSIPACKAGE *package;
+ UINT ret = ERROR_INVALID_HANDLE;
+
+ TRACE(" external attempt at action %s \n",debugstr_w(szAction));
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if( package )
+ {
+ ret = ACTION_PerformUIAction(package,szAction);
+ msiobj_release( &package->hdr );
+ }
+ return ret;
+}
+
+/***********************************************************************
+ * MsiGetTargetPathA (MSI.@)
+ */
+UINT WINAPI MsiGetTargetPathA( MSIHANDLE hInstall, LPCSTR szFolder,
+ LPSTR szPathBuf, DWORD* pcchPathBuf)
+{
+ LPWSTR szwFolder;
+ LPWSTR szwPathBuf;
+ UINT rc;
+
+ TRACE("getting folder %s %p %li\n",szFolder,szPathBuf, *pcchPathBuf);
+
+ if (!szFolder)
+ return ERROR_FUNCTION_FAILED;
+ if (hInstall == 0)
+ return ERROR_FUNCTION_FAILED;
+
+ szwFolder = strdupAtoW(szFolder);
+
+ if (!szwFolder)
+ return ERROR_FUNCTION_FAILED;
+
+ szwPathBuf = HeapAlloc( GetProcessHeap(), 0 , *pcchPathBuf * sizeof(WCHAR));
+
+ rc = MsiGetTargetPathW(hInstall, szwFolder, szwPathBuf,pcchPathBuf);
+
+ WideCharToMultiByte( CP_ACP, 0, szwPathBuf, *pcchPathBuf, szPathBuf,
+ *pcchPathBuf, NULL, NULL );
+
+ HeapFree(GetProcessHeap(),0,szwFolder);
+ HeapFree(GetProcessHeap(),0,szwPathBuf);
+
+ return rc;
+}
+
+/***********************************************************************
+* MsiGetTargetPathW (MSI.@)
+*/
+UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder, LPWSTR
+ szPathBuf, DWORD* pcchPathBuf)
+{
+ LPWSTR path;
+ UINT rc = ERROR_FUNCTION_FAILED;
+ MSIPACKAGE *package;
+
+ TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if (!package)
+ return ERROR_INVALID_HANDLE;
+ path = resolve_folder(package, szFolder, FALSE, FALSE, NULL);
+ msiobj_release( &package->hdr );
+
+ if (path && (strlenW(path) > *pcchPathBuf))
+ {
+ *pcchPathBuf = strlenW(path)+1;
+ rc = ERROR_MORE_DATA;
+ }
+ else if (path)
+ {
+ *pcchPathBuf = strlenW(path)+1;
+ strcpyW(szPathBuf,path);
+ TRACE("Returning Path %s\n",debugstr_w(path));
+ rc = ERROR_SUCCESS;
+ }
+ HeapFree(GetProcessHeap(),0,path);
+
+ return rc;
+}
+
+
+/***********************************************************************
+* MsiGetSourcePathA (MSI.@)
+*/
+UINT WINAPI MsiGetSourcePathA( MSIHANDLE hInstall, LPCSTR szFolder,
+ LPSTR szPathBuf, DWORD* pcchPathBuf)
+{
+ LPWSTR szwFolder;
+ LPWSTR szwPathBuf;
+ UINT rc;
+
+ TRACE("getting source %s %p %li\n",szFolder,szPathBuf, *pcchPathBuf);
+
+ if (!szFolder)
+ return ERROR_FUNCTION_FAILED;
+ if (hInstall == 0)
+ return ERROR_FUNCTION_FAILED;
+
+ szwFolder = strdupAtoW(szFolder);
+ if (!szwFolder)
+ return ERROR_FUNCTION_FAILED;
+
+ szwPathBuf = HeapAlloc( GetProcessHeap(), 0 , *pcchPathBuf * sizeof(WCHAR));
+
+ rc = MsiGetSourcePathW(hInstall, szwFolder, szwPathBuf,pcchPathBuf);
+
+ WideCharToMultiByte( CP_ACP, 0, szwPathBuf, *pcchPathBuf, szPathBuf,
+ *pcchPathBuf, NULL, NULL );
+
+ HeapFree(GetProcessHeap(),0,szwFolder);
+ HeapFree(GetProcessHeap(),0,szwPathBuf);
+
+ return rc;
+}
+
+/***********************************************************************
+* MsiGetSourcePathW (MSI.@)
+*/
+UINT WINAPI MsiGetSourcePathW( MSIHANDLE hInstall, LPCWSTR szFolder, LPWSTR
+ szPathBuf, DWORD* pcchPathBuf)
+{
+ LPWSTR path;
+ UINT rc = ERROR_FUNCTION_FAILED;
+ MSIPACKAGE *package;
+
+ TRACE("(%s %p %li)\n",debugstr_w(szFolder),szPathBuf,*pcchPathBuf);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if( !package )
+ return ERROR_INVALID_HANDLE;
+ path = resolve_folder(package, szFolder, TRUE, FALSE, NULL);
+ msiobj_release( &package->hdr );
+
+ if (path && strlenW(path) > *pcchPathBuf)
+ {
+ *pcchPathBuf = strlenW(path)+1;
+ rc = ERROR_MORE_DATA;
+ }
+ else if (path)
+ {
+ *pcchPathBuf = strlenW(path)+1;
+ strcpyW(szPathBuf,path);
+ TRACE("Returning Path %s\n",debugstr_w(path));
+ rc = ERROR_SUCCESS;
+ }
+ HeapFree(GetProcessHeap(),0,path);
+
+ return rc;
+}
+
+
+/***********************************************************************
+ * MsiSetTargetPathA (MSI.@)
+ */
+UINT WINAPI MsiSetTargetPathA(MSIHANDLE hInstall, LPCSTR szFolder,
+ LPCSTR szFolderPath)
+{
+ LPWSTR szwFolder;
+ LPWSTR szwFolderPath;
+ UINT rc;
+
+ if (!szFolder)
+ return ERROR_FUNCTION_FAILED;
+ if (hInstall == 0)
+ return ERROR_FUNCTION_FAILED;
+
+ szwFolder = strdupAtoW(szFolder);
+ if (!szwFolder)
+ return ERROR_FUNCTION_FAILED;
+
+ szwFolderPath = strdupAtoW(szFolderPath);
+ if (!szwFolderPath)
+ {
+ HeapFree(GetProcessHeap(),0,szwFolder);
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ rc = MsiSetTargetPathW(hInstall, szwFolder, szwFolderPath);
+
+ HeapFree(GetProcessHeap(),0,szwFolder);
+ HeapFree(GetProcessHeap(),0,szwFolderPath);
+
+ return rc;
+}
+
+UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder,
+ LPCWSTR szFolderPath)
+{
+ DWORD i;
+ LPWSTR path = NULL;
+ LPWSTR path2 = NULL;
+ MSIFOLDER *folder;
+
+ 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;
+
+ if (GetFileAttributesW(szFolderPath) == INVALID_FILE_ATTRIBUTES)
+ return ERROR_FUNCTION_FAILED;
+
+ path = resolve_folder(package,szFolder,FALSE,FALSE,&folder);
+
+ if (!path)
+ return ERROR_INVALID_PARAMETER;
+
+ HeapFree(GetProcessHeap(),0,folder->Property);
+ folder->Property = build_directory_name(2, szFolderPath, NULL);
+
+ if (lstrcmpiW(path, folder->Property) == 0)
+ {
+ /*
+ * Resolved Target has not really changed, so just
+ * set this folder and do not recalculate everything.
+ */
+ HeapFree(GetProcessHeap(),0,folder->ResolvedTarget);
+ folder->ResolvedTarget = NULL;
+ path2 = resolve_folder(package,szFolder,FALSE,TRUE,NULL);
+ HeapFree(GetProcessHeap(),0,path2);
+ }
+ else
+ {
+ for (i = 0; i < package->loaded_folders; i++)
+ {
+ HeapFree(GetProcessHeap(),0,package->folders[i].ResolvedTarget);
+ package->folders[i].ResolvedTarget=NULL;
+ }
+
+ for (i = 0; i < package->loaded_folders; i++)
+ {
+ path2=resolve_folder(package, package->folders[i].Directory, FALSE,
+ TRUE, NULL);
+ HeapFree(GetProcessHeap(),0,path2);
+ }
+ }
+ HeapFree(GetProcessHeap(),0,path);
+
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+ * MsiSetTargetPathW (MSI.@)
+ */
+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;
+}
+
+/***********************************************************************
+ * MsiGetMode (MSI.@)
+ *
+ * Returns an internal installer state (if it is running in a mode iRunMode)
+ *
+ * PARAMS
+ * hInstall [I] Handle to the installation
+ * hRunMode [I] Checking run mode
+ * MSIRUNMODE_ADMIN Administrative mode
+ * MSIRUNMODE_ADVERTISE Advertisement mode
+ * MSIRUNMODE_MAINTENANCE Maintenance mode
+ * MSIRUNMODE_ROLLBACKENABLED Rollback is enabled
+ * MSIRUNMODE_LOGENABLED Log file is writing
+ * MSIRUNMODE_OPERATIONS Operations in progress??
+ * MSIRUNMODE_REBOOTATEND We need to reboot after installation completed
+ * MSIRUNMODE_REBOOTNOW We need to reboot to continue the installation
+ * MSIRUNMODE_CABINET Files from cabinet are installed
+ * MSIRUNMODE_SOURCESHORTNAMES Long names in source files is suppressed
+ * MSIRUNMODE_TARGETSHORTNAMES Long names in destination files is suppressed
+ * MSIRUNMODE_RESERVED11 Reserved
+ * MSIRUNMODE_WINDOWS9X Running under Windows95/98
+ * MSIRUNMODE_ZAWENABLED Demand installation is supported
+ * MSIRUNMODE_RESERVED14 Reserved
+ * MSIRUNMODE_RESERVED15 Reserved
+ * MSIRUNMODE_SCHEDULED called from install script
+ * MSIRUNMODE_ROLLBACK called from rollback script
+ * MSIRUNMODE_COMMIT called from commit script
+ *
+ * RETURNS
+ * In the state: TRUE
+ * Not in the state: FALSE
+ *
+ */
+
+BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
+{
+ FIXME("STUB (iRunMode=%i)\n",iRunMode);
+ return TRUE;
+}
+
+/***********************************************************************
+ * MsiSetFeatureStateA (MSI.@)
+ *
+ * According to the docs, when this is called it immediately recalculates
+ * all the component states as well
+ */
+UINT WINAPI MsiSetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature,
+ INSTALLSTATE iState)
+{
+ LPWSTR szwFeature = NULL;
+ UINT rc;
+
+ szwFeature = strdupAtoW(szFeature);
+
+ if (!szwFeature)
+ return ERROR_FUNCTION_FAILED;
+
+ rc = MsiSetFeatureStateW(hInstall,szwFeature, iState);
+
+ HeapFree(GetProcessHeap(),0,szwFeature);
+
+ return rc;
+}
+
+
+
+UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE* package, LPCWSTR szFeature,
+ INSTALLSTATE iState)
+{
+ INT index, i;
+ UINT rc = ERROR_SUCCESS;
+
+ TRACE(" %s to %i\n",debugstr_w(szFeature), iState);
+
+ index = get_loaded_feature(package,szFeature);
+ if (index < 0)
+ return ERROR_UNKNOWN_FEATURE;
+
+ if (iState == INSTALLSTATE_ADVERTISED &&
+ package->features[index].Attributes &
+ msidbFeatureAttributesDisallowAdvertise)
+ return ERROR_FUNCTION_FAILED;
+
+ package->features[index].ActionRequest= iState;
+ package->features[index].Action= iState;
+
+ ACTION_UpdateComponentStates(package,szFeature);
+
+ /* update all the features that are children of this feature */
+ for (i = 0; i < package->loaded_features; i++)
+ {
+ if (strcmpW(szFeature, package->features[i].Feature_Parent) == 0)
+ MSI_SetFeatureStateW(package, package->features[i].Feature, iState);
+ }
+
+ return rc;
+}
+
+/***********************************************************************
+ * MsiSetFeatureStateW (MSI.@)
+ */
+UINT WINAPI MsiSetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature,
+ INSTALLSTATE iState)
+{
+ MSIPACKAGE* package;
+ UINT rc = ERROR_SUCCESS;
+
+ TRACE(" %s to %i\n",debugstr_w(szFeature), iState);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if (!package)
+ return ERROR_INVALID_HANDLE;
+
+ rc = MSI_SetFeatureStateW(package,szFeature,iState);
+
+ msiobj_release( &package->hdr );
+ return rc;
+}
+
+/***********************************************************************
+* MsiGetFeatureStateA (MSI.@)
+*/
+UINT WINAPI MsiGetFeatureStateA(MSIHANDLE hInstall, LPSTR szFeature,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ LPWSTR szwFeature = NULL;
+ UINT rc;
+
+ szwFeature = strdupAtoW(szFeature);
+
+ rc = MsiGetFeatureStateW(hInstall,szwFeature,piInstalled, piAction);
+
+ HeapFree( GetProcessHeap(), 0 , szwFeature);
+
+ return rc;
+}
+
+UINT MSI_GetFeatureStateW(MSIPACKAGE *package, LPWSTR szFeature,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ INT index;
+
+ index = get_loaded_feature(package,szFeature);
+ if (index < 0)
+ return ERROR_UNKNOWN_FEATURE;
+
+ if (piInstalled)
+ *piInstalled = package->features[index].Installed;
+
+ if (piAction)
+ *piAction = package->features[index].Action;
+
+ TRACE("returning %i %i\n",*piInstalled,*piAction);
+
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+* MsiGetFeatureStateW (MSI.@)
+*/
+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;
+}
+
+/***********************************************************************
+ * MsiGetComponentStateA (MSI.@)
+ */
+UINT WINAPI MsiGetComponentStateA(MSIHANDLE hInstall, LPSTR szComponent,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ LPWSTR szwComponent= NULL;
+ UINT rc;
+
+ szwComponent= strdupAtoW(szComponent);
+
+ rc = MsiGetComponentStateW(hInstall,szwComponent,piInstalled, piAction);
+
+ HeapFree( GetProcessHeap(), 0 , szwComponent);
+
+ return rc;
+}
+
+UINT MSI_GetComponentStateW(MSIPACKAGE *package, LPWSTR szComponent,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ INT index;
+
+ TRACE("%p %s %p %p\n", package, debugstr_w(szComponent), piInstalled,
+piAction);
+
+ index = get_loaded_component(package,szComponent);
+ if (index < 0)
+ return ERROR_UNKNOWN_COMPONENT;
+
+ if (piInstalled)
+ *piInstalled = package->components[index].Installed;
+
+ if (piAction)
+ *piAction = package->components[index].Action;
+
+ TRACE("states (%i, %i)\n",
+(piInstalled)?*piInstalled:-1,(piAction)?*piAction:-1);
+
+ return ERROR_SUCCESS;
+}
+
+/***********************************************************************
+ * MsiGetComponentStateW (MSI.@)
+ */
+UINT WINAPI MsiGetComponentStateW(MSIHANDLE hInstall, LPWSTR szComponent,
+ INSTALLSTATE *piInstalled, INSTALLSTATE *piAction)
+{
+ MSIPACKAGE* package;
+ UINT ret;
+
+ TRACE("%ld %s %p %p\n", hInstall, debugstr_w(szComponent),
+ piInstalled, piAction);
+
+ package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE);
+ if (!package)
+ return ERROR_INVALID_HANDLE;
+ ret = MSI_GetComponentStateW( package, szComponent, piInstalled, piAction);
+ msiobj_release( &package->hdr );
+ return ret;
+}
More information about the wine-patches
mailing list