2 * Implementation of the Microsoft Installer (msi.dll)
4 * Copyright 2005 Mike McCormack for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
30 #include "msiserver.h"
32 #include "wine/debug.h"
33 #include "wine/unicode.h"
35 WINE_DEFAULT_DEBUG_CHANNEL(msi
);
37 static void MSI_ClosePreview( MSIOBJECTHDR
*arg
)
39 MSIPREVIEW
*preview
= (MSIPREVIEW
*) arg
;
41 msiobj_release( &preview
->package
->hdr
);
44 MSIPREVIEW
*MSI_EnableUIPreview( MSIDATABASE
*db
)
46 MSIPREVIEW
*preview
= NULL
;
49 package
= MSI_CreatePackage( db
, NULL
);
52 preview
= alloc_msiobject( MSIHANDLETYPE_PREVIEW
, sizeof (MSIPREVIEW
),
56 preview
->package
= package
;
58 msiobj_addref( &package
->hdr
);
60 msiobj_release( &package
->hdr
);
65 UINT WINAPI
MsiEnableUIPreview( MSIHANDLE hdb
, MSIHANDLE
* phPreview
)
69 UINT r
= ERROR_FUNCTION_FAILED
;
71 TRACE("%ld %p\n", hdb
, phPreview
);
73 db
= msihandle2msiinfo( hdb
, MSIHANDLETYPE_DATABASE
);
76 IWineMsiRemoteDatabase
*remote_database
;
78 remote_database
= (IWineMsiRemoteDatabase
*)msi_get_remote( hdb
);
79 if ( !remote_database
)
80 return ERROR_INVALID_HANDLE
;
84 IWineMsiRemoteDatabase_Release( remote_database
);
85 WARN("MsiEnableUIPreview not allowed during a custom action!\n");
87 return ERROR_FUNCTION_FAILED
;
90 preview
= MSI_EnableUIPreview( db
);
93 *phPreview
= alloc_msihandle( &preview
->hdr
);
94 msiobj_release( &preview
->hdr
);
97 r
= ERROR_NOT_ENOUGH_MEMORY
;
99 msiobj_release( &db
->hdr
);
104 static UINT
preview_event_handler( MSIPACKAGE
*package
, LPCWSTR event
,
105 LPCWSTR argument
, msi_dialog
*dialog
)
107 MESSAGE("Preview dialog event '%s' (arg='%s')\n",
108 debugstr_w( event
), debugstr_w( argument
));
109 return ERROR_SUCCESS
;
112 UINT
MSI_PreviewDialogW( MSIPREVIEW
*preview
, LPCWSTR szDialogName
)
114 msi_dialog
*dialog
= NULL
;
115 UINT r
= ERROR_SUCCESS
;
117 if( preview
->dialog
)
118 msi_dialog_destroy( preview
->dialog
);
120 /* an empty name means we should just destroy the current preview dialog */
123 dialog
= msi_dialog_create( preview
->package
, szDialogName
, NULL
,
124 preview_event_handler
);
126 msi_dialog_do_preview( dialog
);
128 r
= ERROR_FUNCTION_FAILED
;
130 preview
->dialog
= dialog
;
135 UINT WINAPI
MsiPreviewDialogW( MSIHANDLE hPreview
, LPCWSTR szDialogName
)
140 TRACE("%ld %s\n", hPreview
, debugstr_w(szDialogName
));
142 preview
= msihandle2msiinfo( hPreview
, MSIHANDLETYPE_PREVIEW
);
144 return ERROR_INVALID_HANDLE
;
146 r
= MSI_PreviewDialogW( preview
, szDialogName
);
148 msiobj_release( &preview
->hdr
);
153 UINT WINAPI
MsiPreviewDialogA( MSIHANDLE hPreview
, LPCSTR szDialogName
)
158 TRACE("%ld %s\n", hPreview
, debugstr_a(szDialogName
));
162 strW
= strdupAtoW( szDialogName
);
164 return ERROR_OUTOFMEMORY
;
166 r
= MsiPreviewDialogW( hPreview
, strW
);
171 UINT WINAPI
MsiPreviewBillboardW( MSIHANDLE hPreview
, LPCWSTR szControlName
,
174 FIXME("%ld %s %s\n", hPreview
, debugstr_w(szControlName
),
175 debugstr_w(szBillboard
));
176 return ERROR_CALL_NOT_IMPLEMENTED
;
179 UINT WINAPI
MsiPreviewBillboardA( MSIHANDLE hPreview
, LPCSTR szControlName
,
182 FIXME("%ld %s %s\n", hPreview
, debugstr_a(szControlName
),
183 debugstr_a(szBillboard
));
184 return ERROR_CALL_NOT_IMPLEMENTED
;