| /* |
| * Implementation of the Microsoft Installer (msi.dll) |
| * |
| * Copyright 2005 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 |
| * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #define COBJMACROS |
| |
| #include <stdarg.h> |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "winnls.h" |
| #include "msi.h" |
| #include "msipriv.h" |
| #include "msiserver.h" |
| |
| #include "wine/debug.h" |
| #include "wine/unicode.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(msi); |
| |
| static void MSI_ClosePreview( MSIOBJECTHDR *arg ) |
| { |
| MSIPREVIEW *preview = (MSIPREVIEW *) arg; |
| |
| msiobj_release( &preview->package->hdr ); |
| } |
| |
| MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db ) |
| { |
| MSIPREVIEW *preview = NULL; |
| MSIPACKAGE *package; |
| |
| package = MSI_CreatePackage( db, NULL ); |
| if( package ) |
| { |
| preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof (MSIPREVIEW), |
| MSI_ClosePreview ); |
| if( preview ) |
| { |
| preview->package = package; |
| preview->dialog = 0; |
| msiobj_addref( &package->hdr ); |
| } |
| msiobj_release( &package->hdr ); |
| } |
| return preview; |
| } |
| |
| UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE* phPreview ) |
| { |
| MSIDATABASE *db; |
| MSIPREVIEW *preview; |
| UINT r = ERROR_FUNCTION_FAILED; |
| |
| TRACE("%d %p\n", hdb, phPreview); |
| |
| db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); |
| if( !db ) |
| { |
| IWineMsiRemoteDatabase *remote_database; |
| |
| remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); |
| if ( !remote_database ) |
| return ERROR_INVALID_HANDLE; |
| |
| *phPreview = 0; |
| |
| IWineMsiRemoteDatabase_Release( remote_database ); |
| WARN("MsiEnableUIPreview not allowed during a custom action!\n"); |
| |
| return ERROR_FUNCTION_FAILED; |
| } |
| |
| preview = MSI_EnableUIPreview( db ); |
| if( preview ) |
| { |
| *phPreview = alloc_msihandle( &preview->hdr ); |
| msiobj_release( &preview->hdr ); |
| r = ERROR_SUCCESS; |
| if (! *phPreview) |
| r = ERROR_NOT_ENOUGH_MEMORY; |
| } |
| msiobj_release( &db->hdr ); |
| |
| return r; |
| } |
| |
| static UINT preview_event_handler( MSIPACKAGE *package, LPCWSTR event, |
| LPCWSTR argument, msi_dialog *dialog ) |
| { |
| MESSAGE("Preview dialog event '%s' (arg='%s')\n", |
| debugstr_w( event ), debugstr_w( argument )); |
| return ERROR_SUCCESS; |
| } |
| |
| UINT MSI_PreviewDialogW( MSIPREVIEW *preview, LPCWSTR szDialogName ) |
| { |
| msi_dialog *dialog = NULL; |
| UINT r = ERROR_SUCCESS; |
| |
| if( preview->dialog ) |
| msi_dialog_destroy( preview->dialog ); |
| |
| /* an empty name means we should just destroy the current preview dialog */ |
| if( szDialogName ) |
| { |
| dialog = msi_dialog_create( preview->package, szDialogName, NULL, |
| preview_event_handler ); |
| if( dialog ) |
| msi_dialog_do_preview( dialog ); |
| else |
| r = ERROR_FUNCTION_FAILED; |
| } |
| preview->dialog = dialog; |
| |
| return r; |
| } |
| |
| UINT WINAPI MsiPreviewDialogW( MSIHANDLE hPreview, LPCWSTR szDialogName ) |
| { |
| MSIPREVIEW *preview; |
| UINT r; |
| |
| TRACE("%d %s\n", hPreview, debugstr_w(szDialogName)); |
| |
| preview = msihandle2msiinfo( hPreview, MSIHANDLETYPE_PREVIEW ); |
| if( !preview ) |
| return ERROR_INVALID_HANDLE; |
| |
| r = MSI_PreviewDialogW( preview, szDialogName ); |
| |
| msiobj_release( &preview->hdr ); |
| |
| return r; |
| } |
| |
| UINT WINAPI MsiPreviewDialogA( MSIHANDLE hPreview, LPCSTR szDialogName ) |
| { |
| UINT r; |
| LPWSTR strW = NULL; |
| |
| TRACE("%d %s\n", hPreview, debugstr_a(szDialogName)); |
| |
| if( szDialogName ) |
| { |
| strW = strdupAtoW( szDialogName ); |
| if( !strW ) |
| return ERROR_OUTOFMEMORY; |
| } |
| r = MsiPreviewDialogW( hPreview, strW ); |
| msi_free( strW ); |
| return r; |
| } |
| |
| UINT WINAPI MsiPreviewBillboardW( MSIHANDLE hPreview, LPCWSTR szControlName, |
| LPCWSTR szBillboard) |
| { |
| FIXME("%d %s %s\n", hPreview, debugstr_w(szControlName), |
| debugstr_w(szBillboard)); |
| return ERROR_CALL_NOT_IMPLEMENTED; |
| } |
| |
| UINT WINAPI MsiPreviewBillboardA( MSIHANDLE hPreview, LPCSTR szControlName, |
| LPCSTR szBillboard) |
| { |
| FIXME("%d %s %s\n", hPreview, debugstr_a(szControlName), |
| debugstr_a(szBillboard)); |
| return ERROR_CALL_NOT_IMPLEMENTED; |
| } |