/* * Common prototypes for Action handlers * * Copyright 2005 Aric Stewart 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 */ #ifndef __MSI_ACTION_H__ #define __MSI_ACTION_H__ #include "wine/list.h" #define IDENTIFIER_SIZE 96 typedef struct tagMSIFEATURE { struct list entry; WCHAR Feature[IDENTIFIER_SIZE]; WCHAR Feature_Parent[IDENTIFIER_SIZE]; LPWSTR Title; LPWSTR Description; INT Display; INT Level; WCHAR Directory[IDENTIFIER_SIZE]; INT Attributes; INSTALLSTATE Installed; INSTALLSTATE ActionRequest; INSTALLSTATE Action; struct list Components; INT Cost; } MSIFEATURE; typedef struct tagMSICOMPONENT { struct list entry; DWORD magic; LPWSTR Component; LPWSTR ComponentId; LPWSTR Directory; INT Attributes; LPWSTR Condition; LPWSTR KeyPath; INSTALLSTATE Installed; INSTALLSTATE ActionRequest; INSTALLSTATE Action; BOOL Enabled; INT Cost; INT RefCount; LPWSTR FullKeypath; LPWSTR AdvertiseString; } MSICOMPONENT; typedef struct tagComponentList { struct list entry; MSICOMPONENT *component; } ComponentList; typedef struct tagMSIFOLDER { struct list entry; LPWSTR Directory; LPWSTR TargetDefault; LPWSTR SourceDefault; LPWSTR ResolvedTarget; LPWSTR ResolvedSource; LPWSTR Property; /* initially set property */ struct tagMSIFOLDER *Parent; INT State; /* 0 = uninitialized */ /* 1 = existing */ /* 2 = created remove if empty */ /* 3 = created persist if empty */ INT Cost; INT Space; } MSIFOLDER; typedef struct tagMSIFILE { struct list entry; LPWSTR File; MSICOMPONENT *Component; LPWSTR FileName; LPWSTR ShortName; INT FileSize; LPWSTR Version; LPWSTR Language; INT Attributes; INT Sequence; INT State; /* 0 = uninitialize */ /* 1 = not present */ /* 2 = present but replace */ /* 3 = present do not replace */ /* 4 = Installed */ /* 5 = Skipped */ LPWSTR SourcePath; LPWSTR TargetPath; } MSIFILE; typedef struct tagMSITEMPFILE { struct list entry; LPWSTR File; LPWSTR Path; } MSITEMPFILE; typedef struct tagMSIAPPID { struct list entry; LPWSTR AppID; /* Primary key */ LPWSTR RemoteServerName; LPWSTR LocalServer; LPWSTR ServiceParameters; LPWSTR DllSurrogate; BOOL ActivateAtStorage; BOOL RunAsInteractiveUser; } MSIAPPID; typedef struct tagMSIPROGID MSIPROGID; typedef struct tagMSICLASS { struct list entry; LPWSTR clsid; /* Primary Key */ LPWSTR Context; /* Primary Key */ MSICOMPONENT *Component; MSIPROGID *ProgID; LPWSTR ProgIDText; LPWSTR Description; MSIAPPID *AppID; LPWSTR FileTypeMask; LPWSTR IconPath; LPWSTR DefInprocHandler; LPWSTR DefInprocHandler32; LPWSTR Argument; MSIFEATURE *Feature; INT Attributes; /* not in the table, set during installation */ BOOL Installed; } MSICLASS; typedef struct tagMSIMIME MSIMIME; typedef struct tagMSIEXTENSION { struct list entry; LPWSTR Extension; /* Primary Key */ MSICOMPONENT *Component; MSIPROGID *ProgID; LPWSTR ProgIDText; MSIMIME *Mime; MSIFEATURE *Feature; /* not in the table, set during installation */ BOOL Installed; struct list verbs; } MSIEXTENSION; struct tagMSIPROGID { struct list entry; LPWSTR ProgID; /* Primary Key */ MSIPROGID *Parent; MSICLASS *Class; LPWSTR Description; LPWSTR IconPath; /* not in the table, set during installation */ BOOL InstallMe; MSIPROGID *CurVer; MSIPROGID *VersionInd; }; typedef struct tagMSIVERB { struct list entry; LPWSTR Verb; INT Sequence; LPWSTR Command; LPWSTR Argument; } MSIVERB; struct tagMSIMIME { struct list entry; LPWSTR ContentType; /* Primary Key */ MSIEXTENSION *Extension; LPWSTR clsid; MSICLASS *Class; /* not in the table, set during installation */ BOOL InstallMe; }; enum SCRIPTS { INSTALL_SCRIPT = 0, COMMIT_SCRIPT = 1, ROLLBACK_SCRIPT = 2, TOTAL_SCRIPTS = 3 }; #define SEQUENCE_UI 0x1 #define SEQUENCE_EXEC 0x2 #define SEQUENCE_INSTALL 0x10 typedef struct tagMSISCRIPT { LPWSTR *Actions[TOTAL_SCRIPTS]; UINT ActionCount[TOTAL_SCRIPTS]; BOOL ExecuteSequenceRun; BOOL CurrentlyScripting; UINT InWhatSequence; LPWSTR *UniqueActions; UINT UniqueActionsCount; } MSISCRIPT; extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, BOOL force); extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action); extern void ACTION_FinishCustomActions( MSIPACKAGE* package); extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, BOOL execute); /* actions in other modules */ extern UINT ACTION_AppSearch(MSIPACKAGE *package); extern UINT ACTION_FindRelatedProducts(MSIPACKAGE *package); extern UINT ACTION_InstallFiles(MSIPACKAGE *package); extern UINT ACTION_DuplicateFiles(MSIPACKAGE *package); extern UINT ACTION_RegisterClassInfo(MSIPACKAGE *package); extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package); extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package); extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package); /* Helpers */ extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data ); extern WCHAR *load_dynamic_stringW(MSIRECORD *row, INT index); extern LPWSTR load_dynamic_property(MSIPACKAGE *package, LPCWSTR prop, UINT* rc); extern LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, BOOL set_prop, MSIFOLDER **folder); extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ); extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature ); extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file ); extern MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir ); extern int track_tempfile(MSIPACKAGE *package, LPCWSTR name, LPCWSTR path); extern UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action); extern UINT build_icon_path(MSIPACKAGE *, LPCWSTR, LPWSTR *); extern DWORD build_version_dword(LPCWSTR); extern LPWSTR build_directory_name(DWORD , ...); extern BOOL create_full_pathW(const WCHAR *path); extern BOOL ACTION_VerifyComponentForAction(MSIPACKAGE*, MSICOMPONENT*, INSTALLSTATE); extern BOOL ACTION_VerifyFeatureForAction(MSIFEATURE*, INSTALLSTATE); extern void reduce_to_longfilename(WCHAR*); extern void reduce_to_shortfilename(WCHAR*); extern LPWSTR create_component_advertise_string(MSIPACKAGE*, MSICOMPONENT*, LPCWSTR); extern void ACTION_UpdateComponentStates(MSIPACKAGE *package, LPCWSTR szFeature); extern UINT register_unique_action(MSIPACKAGE *, LPCWSTR); extern BOOL check_unique_action(MSIPACKAGE *, LPCWSTR); extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... ); /* control event stuff */ extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event, MSIRECORD *data); extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package); extern VOID ControlEvent_SubscribeToEvent(MSIPACKAGE *package, LPCWSTR event, LPCWSTR control, LPCWSTR attribute); extern VOID ControlEvent_UnSubscribeToEvent( MSIPACKAGE *package, LPCWSTR event, LPCWSTR control, LPCWSTR attribute ); /* User Interface messages from the actions */ extern void ui_progress(MSIPACKAGE *, int, int, int, int); extern void ui_actiondata(MSIPACKAGE *, LPCWSTR, MSIRECORD *); /* string consts use a number of places and defined in helpers.c*/ extern const WCHAR cszSourceDir[]; extern const WCHAR szProductCode[]; extern const WCHAR cszRootDrive[]; extern const WCHAR cszbs[]; #endif /* __MSI_ACTION_H__ */