Fix more fixed length buffers.
[wine] / dlls / msi / action.h
1 /*
2  * Common prototypes for Action handlers
3  *
4  * Copyright 2005 Aric Stewart 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 #ifndef __MSI_ACTION_H__
22 #define __MSI_ACTION_H__
23
24 #include "wine/list.h"
25
26 #define IDENTIFIER_SIZE 96
27
28 typedef struct tagMSIFEATURE
29 {
30     struct list entry;
31     WCHAR Feature[IDENTIFIER_SIZE];
32     WCHAR Feature_Parent[IDENTIFIER_SIZE];
33     LPWSTR Title;
34     LPWSTR Description;
35     INT Display;
36     INT Level;
37     WCHAR Directory[IDENTIFIER_SIZE];
38     INT Attributes;
39     
40     INSTALLSTATE Installed;
41     INSTALLSTATE ActionRequest;
42     INSTALLSTATE Action;
43
44     struct list Components;
45     
46     INT Cost;
47 } MSIFEATURE;
48
49 typedef struct tagMSICOMPONENT
50 {
51     struct list entry;
52     DWORD magic;
53     LPWSTR Component;
54     LPWSTR ComponentId;
55     LPWSTR Directory;
56     INT Attributes;
57     LPWSTR Condition;
58     LPWSTR KeyPath;
59
60     INSTALLSTATE Installed;
61     INSTALLSTATE ActionRequest;
62     INSTALLSTATE Action;
63
64     BOOL Enabled;
65     INT  Cost;
66     INT  RefCount;
67
68     LPWSTR FullKeypath;
69     LPWSTR AdvertiseString;
70 } MSICOMPONENT;
71
72 typedef struct tagComponentList
73 {
74     struct list entry;
75     MSICOMPONENT *component;
76 } ComponentList;
77
78 typedef struct tagMSIFOLDER
79 {
80     struct list entry;
81     LPWSTR Directory;
82     LPWSTR TargetDefault;
83     LPWSTR SourceDefault;
84
85     LPWSTR ResolvedTarget;
86     LPWSTR ResolvedSource;
87     LPWSTR Property;   /* initially set property */
88     struct tagMSIFOLDER *Parent;
89     INT   State;
90         /* 0 = uninitialized */
91         /* 1 = existing */
92         /* 2 = created remove if empty */
93         /* 3 = created persist if empty */
94     INT   Cost;
95     INT   Space;
96 } MSIFOLDER;
97
98 typedef struct tagMSIFILE
99 {
100     struct list entry;
101     LPWSTR File;
102     MSICOMPONENT *Component;
103     LPWSTR FileName;
104     LPWSTR ShortName;
105     INT FileSize;
106     LPWSTR Version;
107     LPWSTR Language;
108     INT Attributes;
109     INT Sequence;   
110
111     INT State;
112        /* 0 = uninitialize */
113        /* 1 = not present */
114        /* 2 = present but replace */
115        /* 3 = present do not replace */
116        /* 4 = Installed */
117        /* 5 = Skipped */
118     LPWSTR  SourcePath;
119     LPWSTR  TargetPath;
120 } MSIFILE;
121
122 typedef struct tagMSITEMPFILE
123 {
124     struct list entry;
125     LPWSTR File;
126     LPWSTR Path;
127 } MSITEMPFILE;
128
129 typedef struct tagMSIAPPID
130 {
131     struct list entry;
132     WCHAR AppID[IDENTIFIER_SIZE]; /* Primary key */
133     LPWSTR RemoteServerName;
134     LPWSTR LocalServer;
135     LPWSTR ServiceParameters;
136     LPWSTR DllSurrogate;
137     BOOL ActivateAtStorage;
138     BOOL RunAsInteractiveUser;
139 } MSIAPPID;
140
141 typedef struct tagMSIPROGID MSIPROGID;
142
143 typedef struct tagMSICLASS
144 {
145     struct list entry;
146     WCHAR CLSID[IDENTIFIER_SIZE];     /* Primary Key */
147     WCHAR Context[IDENTIFIER_SIZE];   /* Primary Key */
148     MSICOMPONENT *Component;
149     MSIPROGID *ProgID;
150     LPWSTR ProgIDText;
151     LPWSTR Description;
152     MSIAPPID *AppID;
153     LPWSTR FileTypeMask;
154     LPWSTR IconPath;
155     LPWSTR DefInprocHandler;
156     LPWSTR DefInprocHandler32;
157     LPWSTR Argument;
158     MSIFEATURE *Feature;
159     INT Attributes;
160     /* not in the table, set during installation */
161     BOOL Installed;
162 } MSICLASS;
163
164 typedef struct tagMSIMIME MSIMIME;
165
166 typedef struct tagMSIEXTENSION
167 {
168     struct list entry;
169     LPWSTR Extension;  /* Primary Key */
170     MSICOMPONENT *Component;
171     MSIPROGID *ProgID;
172     LPWSTR ProgIDText;
173     MSIMIME *Mime;
174     MSIFEATURE *Feature;
175     /* not in the table, set during installation */
176     BOOL Installed;
177     struct list verbs;
178 } MSIEXTENSION;
179
180 struct tagMSIPROGID
181 {
182     struct list entry;
183     LPWSTR ProgID;  /* Primary Key */
184     MSIPROGID *Parent;
185     MSICLASS *Class;
186     LPWSTR Description;
187     LPWSTR IconPath;
188     /* not in the table, set during installation */
189     BOOL InstallMe;
190     MSIPROGID *CurVer;
191     MSIPROGID *VersionInd;
192 };
193
194 typedef struct tagMSIVERB
195 {
196     struct list entry;
197     LPWSTR Verb;
198     INT Sequence;
199     LPWSTR Command;
200     LPWSTR Argument;
201 } MSIVERB;
202
203 struct tagMSIMIME
204 {
205     struct list entry;
206     LPWSTR ContentType;  /* Primary Key */
207     MSIEXTENSION *Extension;
208     WCHAR CLSID[IDENTIFIER_SIZE];
209     MSICLASS *Class;
210     /* not in the table, set during installation */
211     BOOL InstallMe;
212 };
213
214 enum SCRIPTS {
215         INSTALL_SCRIPT = 0,
216         COMMIT_SCRIPT = 1,
217         ROLLBACK_SCRIPT = 2,
218         TOTAL_SCRIPTS = 3
219 };
220
221 #define SEQUENCE_UI       0x1
222 #define SEQUENCE_EXEC     0x2
223 #define SEQUENCE_INSTALL  0x10
224
225 typedef struct tagMSISCRIPT
226 {
227     LPWSTR  *Actions[TOTAL_SCRIPTS];
228     UINT    ActionCount[TOTAL_SCRIPTS];
229     BOOL    ExecuteSequenceRun;
230     BOOL    CurrentlyScripting;
231     UINT    InWhatSequence;
232     LPWSTR  *UniqueActions;
233     UINT    UniqueActionsCount;
234 } MSISCRIPT;
235
236
237 extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force);
238 extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action);
239 extern void ACTION_FinishCustomActions( MSIPACKAGE* package);
240 extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, BOOL execute);
241
242 /* actions in other modules */
243 extern UINT ACTION_AppSearch(MSIPACKAGE *package);
244 extern UINT ACTION_FindRelatedProducts(MSIPACKAGE *package);
245 extern UINT ACTION_InstallFiles(MSIPACKAGE *package);
246 extern UINT ACTION_DuplicateFiles(MSIPACKAGE *package);
247 extern UINT ACTION_RegisterClassInfo(MSIPACKAGE *package);
248 extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
249 extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package);
250 extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package);
251
252
253 /* Helpers */
254 extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data );
255 extern WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index);
256 extern LPWSTR load_dynamic_property(MSIPACKAGE *package, LPCWSTR prop, UINT* rc);
257 extern LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, 
258                       BOOL set_prop, MSIFOLDER **folder);
259 extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component );
260 extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature );
261 extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file );
262 extern MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir );
263 extern int track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path);
264 extern UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action);
265 extern UINT build_icon_path(MSIPACKAGE *, LPCWSTR, LPWSTR *);
266 extern DWORD build_version_dword(LPCWSTR);
267 extern LPWSTR build_directory_name(DWORD , ...);
268 extern BOOL create_full_pathW(const WCHAR *path);
269 extern BOOL ACTION_VerifyComponentForAction(MSIPACKAGE*, MSICOMPONENT*, INSTALLSTATE);
270 extern BOOL ACTION_VerifyFeatureForAction(MSIFEATURE*, INSTALLSTATE);
271 extern void reduce_to_longfilename(WCHAR*);
272 extern void reduce_to_shortfilename(WCHAR*);
273 extern LPWSTR create_component_advertise_string(MSIPACKAGE*, MSICOMPONENT*, LPCWSTR);
274 extern void ACTION_UpdateComponentStates(MSIPACKAGE *package, LPCWSTR szFeature);
275 extern UINT register_unique_action(MSIPACKAGE *, LPCWSTR);
276 extern BOOL check_unique_action(MSIPACKAGE *, LPCWSTR);
277 extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... );
278
279
280 /* control event stuff */
281 extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event,
282                                       MSIRECORD *data);
283 extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package);
284 extern VOID ControlEvent_SubscribeToEvent(MSIPACKAGE *package, LPCWSTR event,
285                                    LPCWSTR control, LPCWSTR attribute);
286 extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event,
287                                       LPCWSTR control, LPCWSTR attribute );
288
289 /* User Interface messages from the actions */
290 extern void ui_progress(MSIPACKAGE *, int, int, int, int);
291 extern void ui_actiondata(MSIPACKAGE *, LPCWSTR, MSIRECORD *);
292
293
294 /* string consts use a number of places  and defined in helpers.c*/
295 extern const WCHAR cszSourceDir[];
296 extern const WCHAR szProductCode[];
297 extern const WCHAR cszRootDrive[];
298 extern const WCHAR cszbs[];
299
300 #endif /* __MSI_ACTION_H__ */