diff --git a/dlls/msi/Makefile.in b/dlls/msi/Makefile.in index 61547648958..bc6d439de95 100644 --- a/dlls/msi/Makefile.in +++ b/dlls/msi/Makefile.in @@ -16,6 +16,7 @@ C_SRCS = \ msiquery.c \ order.c \ package.c \ + preview.c \ record.c \ regsvr.c \ select.c \ diff --git a/dlls/msi/msi.spec b/dlls/msi/msi.spec index 1c9ce585a50..6c310f1374a 100644 --- a/dlls/msi/msi.spec +++ b/dlls/msi/msi.spec @@ -32,7 +32,7 @@ 32 stdcall MsiDatabaseOpenViewW(long wstr ptr) 33 stdcall MsiDoActionA(long str) 34 stdcall MsiDoActionW(long wstr) -35 stub MsiEnableUIPreview +35 stdcall MsiEnableUIPreview(long ptr) 36 stdcall MsiEnumClientsA(str long ptr) 37 stdcall MsiEnumClientsW(wstr long ptr) 38 stdcall MsiEnumComponentQualifiersA(str long str ptr str ptr) @@ -94,10 +94,10 @@ 94 stdcall MsiOpenPackageW(wstr ptr) 95 stdcall MsiOpenProductA(str ptr) 96 stdcall MsiOpenProductW(wstr ptr) -97 stub MsiPreviewBillboardA -98 stub MsiPreviewBillboardW -99 stub MsiPreviewDialogA -100 stub MsiPreviewDialogW +97 stdcall MsiPreviewBillboardA(long str str) +98 stdcall MsiPreviewBillboardW(long wstr wstr) +99 stdcall MsiPreviewDialogA(long str) +100 stdcall MsiPreviewDialogW(long wstr) 101 stub MsiProcessAdvertiseScriptA 102 stub MsiProcessAdvertiseScriptW 103 stdcall MsiProcessMessage(long long long) diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index bb781b2efe9..4cca9b435a8 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -206,12 +206,19 @@ typedef struct tagMSIPACKAGE LPWSTR PackagePath; } MSIPACKAGE; +typedef struct tagMSIPREVIEW +{ + MSIOBJECTHDR hdr; + MSIDATABASE *db; +} MSIPREVIEW; + #define MSIHANDLETYPE_ANY 0 #define MSIHANDLETYPE_DATABASE 1 #define MSIHANDLETYPE_SUMMARYINFO 2 #define MSIHANDLETYPE_VIEW 3 #define MSIHANDLETYPE_RECORD 4 #define MSIHANDLETYPE_PACKAGE 5 +#define MSIHANDLETYPE_PREVIEW 6 #define MSI_MAJORVERSION 2 #define MSI_MINORVERSION 0 diff --git a/dlls/msi/preview.c b/dlls/msi/preview.c new file mode 100644 index 00000000000..42dbca7407c --- /dev/null +++ b/dlls/msi/preview.c @@ -0,0 +1,116 @@ +/* + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winnls.h" +#include "shlwapi.h" +#include "wine/debug.h" +#include "msi.h" +#include "msipriv.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msi); + +static void MSI_ClosePreview( MSIOBJECTHDR *arg ) +{ + MSIPREVIEW *preview = (MSIPREVIEW *) arg; + + msiobj_release( &preview->db->hdr ); +} + +MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db ) +{ + MSIPREVIEW *preview; + + preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof (MSIPREVIEW), + MSI_ClosePreview ); + if( preview ) + { + preview->db = db; + msiobj_addref( &db->hdr ); + } + return preview; +} + +UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE* phPreview ) +{ + MSIDATABASE *db; + MSIPREVIEW *preview; + UINT r = ERROR_FUNCTION_FAILED; + + TRACE("%ld %p\n", hdb, phPreview); + + db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); + if( !db ) + return ERROR_INVALID_HANDLE; + preview = MSI_EnableUIPreview( db ); + if( preview ) + { + *phPreview = alloc_msihandle( &preview->hdr ); + msiobj_release( &preview->hdr ); + r = ERROR_SUCCESS; + } + msiobj_release( &db->hdr ); + + return r; +} + +UINT WINAPI MsiPreviewDialogW( MSIHANDLE hPreview, LPCWSTR szDialogName ) +{ + FIXME("%ld %s\n", hPreview, debugstr_w(szDialogName)); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +UINT WINAPI MsiPreviewDialogA( MSIHANDLE hPreview, LPCSTR szDialogName ) +{ + UINT r, len; + LPWSTR strW = NULL; + + TRACE("%ld %s\n", hPreview, debugstr_a(szDialogName)); + + if( szDialogName ) + { + len = MultiByteToWideChar( CP_ACP, 0, szDialogName, -1, NULL, 0 ); + strW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) ); + MultiByteToWideChar( CP_ACP, 0, szDialogName, -1, strW, len ); + } + r = MsiPreviewDialogW( hPreview, strW ); + HeapFree( GetProcessHeap(), 0, strW ); + return r; +} + +UINT WINAPI MsiPreviewBillboardW( MSIHANDLE hPreview, LPCWSTR szControlName, + LPCWSTR szBillboard) +{ + FIXME("%ld %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("%ld %s %s\n", hPreview, debugstr_a(szControlName), + debugstr_a(szBillboard)); + return ERROR_CALL_NOT_IMPLEMENTED; +}