Add more dialog controls, do something when they're clicked on.
[wine] / dlls / msi / preview.c
1 /*
2  * Implementation of the Microsoft Installer (msi.dll)
3  *
4  * Copyright 2005 Mike McCormack for CodeWeavers
5  *
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.
10  *
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.
15  *
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <stdarg.h>
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winnls.h"
26 #include "msi.h"
27 #include "msipriv.h"
28
29 #include "wine/debug.h"
30 #include "wine/unicode.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(msi);
33
34 static void MSI_ClosePreview( MSIOBJECTHDR *arg )
35 {
36     MSIPREVIEW *preview = (MSIPREVIEW *) arg;
37
38     msiobj_release( &preview->package->hdr );
39 }
40
41 MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db )
42 {
43     MSIPREVIEW *preview = NULL;
44     MSIPACKAGE *package;
45
46     package = MSI_CreatePackage( db );
47     if( package )
48     {
49         preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof (MSIPREVIEW),
50                                MSI_ClosePreview );
51         if( preview )
52         {
53             preview->package = package;
54             preview->dialog = 0;
55             msiobj_addref( &package->hdr );
56         }
57         msiobj_release( &package->hdr );
58     }
59     return preview;
60 }
61
62 UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE* phPreview )
63 {
64     MSIDATABASE *db;
65     MSIPREVIEW *preview;
66     UINT r = ERROR_FUNCTION_FAILED;
67
68     TRACE("%ld %p\n", hdb, phPreview);
69
70     db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE );
71     if( !db )
72         return ERROR_INVALID_HANDLE;
73     preview = MSI_EnableUIPreview( db );
74     if( preview )
75     {
76         *phPreview = alloc_msihandle( &preview->hdr );
77         msiobj_release( &preview->hdr );
78         r = ERROR_SUCCESS;
79     }
80
81     return r;
82 }
83
84 static VOID preview_event_handler( MSIPACKAGE *package, LPCWSTR event,
85                                    LPCWSTR argument, msi_dialog *dialog )
86 {
87     MESSAGE("Preview dialog event '%s' (arg='%s')\n",
88             debugstr_w( event ), debugstr_w( argument ));
89 }
90
91 UINT MSI_PreviewDialogW( MSIPREVIEW *preview, LPCWSTR szDialogName )
92 {
93     msi_dialog *dialog = NULL;
94     UINT r = ERROR_SUCCESS;
95
96     if( preview->dialog )
97         msi_dialog_destroy( preview->dialog );
98
99     /* an empty name means we should just destroy the current preview dialog */
100     if( szDialogName )
101     {
102         dialog = msi_dialog_create( preview->package, szDialogName,
103                                     preview_event_handler );
104         if( dialog )
105             msi_dialog_do_preview( dialog );
106         else
107             r = ERROR_FUNCTION_FAILED;
108     }
109     preview->dialog = dialog;
110
111     return r;
112 }
113
114 UINT WINAPI MsiPreviewDialogW( MSIHANDLE hPreview, LPCWSTR szDialogName )
115 {
116     MSIPREVIEW *preview;
117     UINT r;
118
119     TRACE("%ld %s\n", hPreview, debugstr_w(szDialogName));
120
121     preview = msihandle2msiinfo( hPreview, MSIHANDLETYPE_PREVIEW );
122     if( !preview )
123         return ERROR_INVALID_HANDLE;
124
125     r = MSI_PreviewDialogW( preview, szDialogName );
126
127     msiobj_release( &preview->hdr );
128
129     return r;
130 }
131
132 UINT WINAPI MsiPreviewDialogA( MSIHANDLE hPreview, LPCSTR szDialogName )
133 {
134     UINT r, len;
135     LPWSTR strW = NULL;
136
137     TRACE("%ld %s\n", hPreview, debugstr_a(szDialogName));
138
139     if( szDialogName )
140     {
141         len = MultiByteToWideChar( CP_ACP, 0, szDialogName, -1, NULL, 0 );
142         strW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
143         MultiByteToWideChar( CP_ACP, 0, szDialogName, -1, strW, len );
144     }
145     r = MsiPreviewDialogW( hPreview, strW );
146     HeapFree( GetProcessHeap(), 0, strW );
147     return r;
148 }
149
150 UINT WINAPI MsiPreviewBillboardW( MSIHANDLE hPreview, LPCWSTR szControlName,
151                                   LPCWSTR szBillboard)
152 {
153     FIXME("%ld %s %s\n", hPreview, debugstr_w(szControlName),
154           debugstr_w(szBillboard));
155     return ERROR_CALL_NOT_IMPLEMENTED;
156 }
157
158 UINT WINAPI MsiPreviewBillboardA( MSIHANDLE hPreview, LPCSTR szControlName,
159                                   LPCSTR szBillboard)
160 {
161     FIXME("%ld %s %s\n", hPreview, debugstr_a(szControlName),
162           debugstr_a(szBillboard));
163     return ERROR_CALL_NOT_IMPLEMENTED;
164 }