/*
 * Copyright (C) 2007 Mike McCormack
 * Copyright (C) 2007 Misha Koshelev
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "msiserver_dispids.h"
import "unknwn.idl";
import "wtypes.idl";
import "objidl.idl";
import "oaidl.idl";

cpp_quote("#if 0")
typedef unsigned long MSIHANDLE;
typedef int INSTALLMESSAGE;
typedef int MSICONDITION;
typedef int MSIRUNMODE;
typedef int INSTALLSTATE;
cpp_quote("#endif")

[
    uuid(7BDE2046-D03B-4ffc-B84C-A098F38CFF0B),
    oleautomation,
    object
]
interface IWineMsiRemoteDatabase : IUnknown
{
    HRESULT IsTablePersistent( [in] LPCWSTR table, [out] MSICONDITION *persistent );
    HRESULT GetPrimaryKeys( [in] LPCWSTR table, [out] MSIHANDLE *keys );
    HRESULT GetSummaryInformation( [in] UINT updatecount, [out] MSIHANDLE *suminfo );
    HRESULT OpenView( [in] LPCWSTR query, [out] MSIHANDLE *view );
    HRESULT SetMsiHandle( [in] MSIHANDLE handle );
}

[
    uuid(902B3592-9D08-4dfd-A593-D07C52546421),
    oleautomation,
    object
]
interface IWineMsiRemotePackage : IUnknown
{
    HRESULT SetMsiHandle( [in] MSIHANDLE handle );
    HRESULT GetActiveDatabase( [out] MSIHANDLE *handle );
    HRESULT GetProperty( [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
    HRESULT SetProperty( [in] BSTR property, [in] BSTR value );
    HRESULT ProcessMessage( [in] INSTALLMESSAGE message, [in] MSIHANDLE record );
    HRESULT DoAction( [in] BSTR action );
    HRESULT Sequence( [in] BSTR table, [in] int sequence );
    HRESULT GetTargetPath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
    HRESULT SetTargetPath( [in] BSTR folder, [in] BSTR value );
    HRESULT GetSourcePath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size );
    HRESULT GetMode( [in] MSIRUNMODE mode, [out] BOOL *ret );
    HRESULT SetMode( [in] MSIRUNMODE mode, [in] BOOL state );
    HRESULT GetFeatureState( [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
    HRESULT SetFeatureState( [in] BSTR feature, [in] INSTALLSTATE state );
    HRESULT GetComponentState( [in] BSTR component, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action );
    HRESULT SetComponentState( [in] BSTR component, [in] INSTALLSTATE state );
    HRESULT GetLanguage( [out] LANGID *language );
    HRESULT SetInstallLevel( [in] int level );
    HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value );
    HRESULT EvaluateCondition( [in] BSTR condition );
    HRESULT GetFeatureCost( [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost );
    HRESULT EnumComponentCosts( [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state,
                                [out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp );
}

[
    uuid(56D58B64-8780-4c22-A8BC-8B0B29E4A9F8),
    oleautomation,
    object
]
interface IWineMsiRemoteCustomAction : IUnknown
{
    HRESULT GetActionInfo( [in] LPCGUID guid, [out] INT *type, [out] MSIHANDLE *handle, [out] BSTR *dllname,
                           [out] BSTR *function, [out] IWineMsiRemotePackage **package );
}

[
    uuid(000c101c-0000-0000-c000-000000000046),
    oleautomation,
    object
]
interface IMsiServer : IUnknown
{
    /* FIXME: methods */
}

[
    uuid(000c101d-0000-0000-c000-000000000046),
    oleautomation,
    object
]
interface IMsiMessage : IUnknown
{
    /* FIXME: methods */
}

[
    uuid(000c1025-0000-0000-c000-000000000046),
    oleautomation,
    object
]
interface IMsiCustomAction : IUnknown
{
    /* FIXME: methods */
}

[
    uuid(000c1033-0000-0000-c000-000000000046),
    oleautomation,
    object
]
interface IMsiRemoteAPI : IUnknown
{
    /* FIXME: methods */
}

[
    helpstring("Msi install server"),
    progid("IMsiServer"),
    uuid(000c101c-0000-0000-c000-000000000046)
]
coclass MsiServer { interface IMsiServer; }

[
    helpstring("Microsoft Windows Installer Message RPC"),
    progid("WindowsInstaller.Message"),
    uuid(000c101d-0000-0000-c000-000000000046)
]
coclass MsiServerMessage { interface IMsiMessage; }

[
    threading(both),
    uuid(000c103e-0000-0000-c000-000000000046)
]
coclass PSFactoryBuffer { interface IPSFactoryBuffer; }

[
    uuid(000c1082-0000-0000-c000-000000000046)
]
coclass MsiTransform { }

[
    uuid(000c1084-0000-0000-c000-000000000046)
]
coclass MsiDatabase { }

[
    uuid(000c1086-0000-0000-c000-000000000046)
]
coclass MsiPatch { }

[
    threading(apartment),
    uuid(000c1094-0000-0000-c000-000000000046)
]
/* FIXME: unidentified class */
coclass MsiServerX3 { interface IMsiServer; }

[
    uuid(ba26e6fa-4f27-4f56-953a-3f90272018aa)
]
coclass WineMsiRemoteCustomAction { interface WineMsiRemoteCustomAction; }

[
    uuid(902b3592-9d08-4dfd-a593-d07c52546421)
]
coclass WineMsiRemotePackage { interface WineMsiRemotePackage; }


[ uuid(000C1092-0000-0000-C000-000000000046), version(1.0) ]
library WindowsInstaller
{
    dispinterface Installer;
    dispinterface Record;
    dispinterface Session;
    dispinterface Database;
    dispinterface SummaryInfo;
    dispinterface View;
    dispinterface UIPreview;
    dispinterface FeatureInfo;
    dispinterface RecordList;
    dispinterface StringList;
    dispinterface Product;
    dispinterface Patch;

    typedef enum {
        msiInstallStateNotUsed = -7,
        msiInstallStateBadConfig = -6,
        msiInstallStateIncomplete = -5,
        msiInstallStateSourceAbsent = -4,
        msiInstallStateInvalidArg = -2,
        msiInstallStateUnknown = -1,
        msiInstallStateBroken = 0,
        msiInstallStateAdvertised = 1,
        msiInstallStateRemoved = 1,
        msiInstallStateAbsent = 2,
        msiInstallStateLocal = 3,
        msiInstallStateSource = 4,
        msiInstallStateDefault = 5
    } MsiInstallState;

    typedef enum {
        msiOpenDatabaseModeReadOnly = 0,
        msiOpenDatabaseModeTransact = 1,
        msiOpenDatabaseModeDirect = 2,
        msiOpenDatabaseModeCreate = 3,
        msiOpenDatabaseModeCreateDirect = 4,
        msiOpenDatabaseModePatchFile = 32
    } MsiOpenDatabaseMode;

    typedef enum {
        msiUILevelNoChange = 0,
        msiUILevelDefault = 1,
        msiUILevelNone = 2,
        msiUILevelBasic = 3,
        msiUILevelReduced = 4,
        msiUILevelFull = 5,
        msiUILevelHideCancel = 32,
        msiUILevelProgressOnly = 64,
        msiUILevelEndDialog = 128,
        msiUILevelSourceResOnly = 256
    } MsiUILevel;

    [ uuid(000C1090-0000-0000-C000-000000000046) ]
    dispinterface Installer
    {
    properties:
        [id(DISPID_INSTALLER_UILEVEL)]
            MsiUILevel UILevel;
    methods:
        [id(DISPID_INSTALLER_CREATERECORD)]
            Record *CreateRecord([in] long Count);
        [id(DISPID_INSTALLER_OPENPACKAGE)]
            Session* OpenPackage(
                [in] VARIANT PackagePath,
                [in, optional, defaultvalue(0)] long Options);
        [id(DISPID_INSTALLER_OPENPRODUCT)]
            Session* OpenProduct(
                [in] BSTR ProductCode);
        [id(DISPID_INSTALLER_SUMMARYINFORMATION)]
            SummaryInfo* SummaryInformation(
                [in] BSTR PackagePath,
                [in, optional, defaultvalue(0)] long UpdateCount);
        [id(DISPID_INSTALLER_OPENDATABASE)]
            Database *OpenDatabase(
                    [in] BSTR DatabasePath,
                    [in] VARIANT OpenMode);
        [id(DISPID_INSTALLER_ENABLELOG)]
            void EnableLog(
                    [in] BSTR LogMode,
                    [in] BSTR LogFile);
        [id(DISPID_INSTALLER_INSTALLPRODUCT)]
            void InstallProduct(
                [in] BSTR PackagePath,
                [in, optional, defaultvalue("0")] BSTR PropertyValues);
        [id(DISPID_INSTALLER_VERSION)]
            BSTR Version();
        [id(DISPID_INSTALLER_LASTERRORRECORD)]
            Record* LastErrorRecord();
        [id(DISPID_INSTALLER_REGISTRYVALUE), propget]
            BSTR RegistryValue(
                [in] VARIANT Root,
                [in] BSTR Key,
                [in, optional] VARIANT Value);
        [id(DISPID_INSTALLER_ENVIRONMENT), propget]
            BSTR Environment([in] BSTR Variable);
        [id(DISPID_INSTALLER_ENVIRONMENT), propput]
            void Environment(
                [in] BSTR Variable,
                [in] BSTR rhs);
        [id(DISPID_INSTALLER_FILEATTRIBUTES)]
            long FileAttributes([in] BSTR FilePath);
        [id(DISPID_INSTALLER_FILESIZE)]
            long FileSize([in] BSTR FilePath);
        [id(DISPID_INSTALLER_FILEVERSION)]
            BSTR FileVersion(
                [in] BSTR FilePath,
                [in, optional] VARIANT Language);
        [id(DISPID_INSTALLER_PRODUCTSTATE), propget]
            MsiInstallState ProductState(
                [in] BSTR Product);
        [id(DISPID_INSTALLER_PRODUCTINFO), propget]
            BSTR ProductInfo(
                [in] BSTR Product,
                [in] BSTR Attribute);
        [id(DISPID_INSTALLER_PRODUCTS), propget]
            StringList *Products();
        [id(DISPID_INSTALLER_RELATEDPRODUCTS), propget]
            StringList *RelatedProducts(
                [in] BSTR UpgradeCode);
    }

    [ uuid(000C1093-0000-0000-C000-000000000046) ]
    dispinterface Record
    {
    properties:
    methods:
        [id(DISPID_RECORD_STRINGDATA), propget]
            BSTR StringData([in] long Field);
        [id(DISPID_RECORD_STRINGDATA), propput]
            void StringData(
                [in] long Field,
                [in] BSTR rhs);
        [id(DISPID_RECORD_INTEGERDATA), propget]
            long IntegerData([in] long Field);
        [id(DISPID_RECORD_INTEGERDATA), propput]
            void IntegerData(
                [in] long Field,
                [in] long rhs);
        [id(DISPID_RECORD_FIELDCOUNT), propget]
            long FieldCount();
    }

    [ uuid(000C1095-0000-0000-C000-000000000046) ]
    dispinterface StringList
    {
        properties:
        methods:
        [id(DISPID_LIST__NEWENUM)]
            IUnknown _NewEnum();
        [id(DISPID_LIST_ITEM), propget]
            BSTR Item(long Index);
        [id(DISPID_LIST_COUNT), propget]
            long Count();
    }

    [ uuid(000C1096-0000-0000-C000-000000000046) ]
    dispinterface RecordList
    {
        properties:
        methods:
    }

    [ uuid(000C109A-0000-0000-C000-000000000046) ]
    dispinterface UIPreview
    {
        properties:
        methods:
    }

    [ uuid(000C109B-0000-0000-C000-000000000046) ]
    dispinterface SummaryInfo
    {
        properties:
        methods:
        [id(DISPID_SUMMARYINFO_PROPERTY), propget]
            VARIANT Property([in] long Pid);
        [id(DISPID_SUMMARYINFO_PROPERTY), propput]
            void Property(
                [in] long Pid,
                [in] VARIANT rhs);
        [id(DISPID_SUMMARYINFO_PROPERTYCOUNT), propget]
            long PropertyCount();
    }

    typedef enum {
        msiViewModifySeek = -1,
        msiViewModifyRefresh = 0,
        msiViewModifyInsert = 1,
        msiViewModifyUpdate = 2,
        msiViewModifyAssign = 3,
        msiViewModifyReplace = 4,
        msiViewModifyMerge = 5,
        msiViewModifyDelete = 6,
        msiViewModifyInsertTemporary = 7,
        msiViewModifyValidate = 8,
        msiViewModifyValidateNew = 9,
        msiViewModifyValidateField = 10,
        msiViewModifyValidateDelete = 11,
    } _MsiViewModify;                                /* Added underscore to avoid conflict with function name */

    [ uuid(000C109C-0000-0000-C000-000000000046) ]
    dispinterface View
    {
        properties:
        methods:
        [id(DISPID_VIEW_EXECUTE)]
            void Execute([in, optional, defaultvalue(0)] Record *Params);
        [id(DISPID_VIEW_FETCH)]
            Record* Fetch();
        [id(DISPID_VIEW_MODIFY)]
            void Modify(
                [in] _MsiViewModify Mode,
                Record *Record);
        [id(DISPID_VIEW_CLOSE)]
            void Close();
    }

    [ uuid(000C109D-0000-0000-C000-000000000046) ]
    dispinterface Database
    {
        properties:
        methods:
        [id(DISPID_DATABASE_OPENVIEW)]
            View* OpenView([in] BSTR Sql);
        [id(DISPID_DATABASE_SUMMARYINFORMATION), propget]
            SummaryInfo *SummaryInformation([in, optional, defaultvalue(0)] long UpdateCount);
    }

    typedef enum {
        msiDoActionStatusNoAction = 0,
        msiDoActionStatusSuccess = 1,
        msiDoActionStatusUserExit = 2,
        msiDoActionStatusFailure = 3,
        msiDoActionStatusSuspend = 4,
        msiDoActionStatusFinished = 5,
        msiDoActionStatusWrongState = 6,
        msiDoActionStatusBadActionData = 7
    } MsiDoActionStatus;

    typedef enum {
        msiRunModeAdmin = 0,
        msiRunModeAdvertise = 1,
        msiRunModeMaintenance = 2,
        msiRunModeRollbackEnabled = 3,
        msiRunModeLogEnabled = 4,
        msiRunModeOperations = 5,
        msiRunModeRebootAtEnd = 6,
        msiRunModeRebootNow = 7,
        msiRunModeCabinet = 8,
        msiRunModeSourceShortNames = 9,
        msiRunModeTargetShortNames = 10,
        msiRunModeWindows9x = 12,
        msiRunModeZawEnabled = 13,
        msiRunModeScheduled = 16,
        msiRunModeRollback = 17,
        msiRunModeCommit = 18
    } MsiRunMode;

    typedef enum {
        msiEvaluateConditionFalse = 0,
        msiEvaluateConditionTrue = 1,
        msiEvaluateConditionNone = 2,
        msiEvaluateConditionError = 3
    } _MsiEvaluateCondition;           /* Added underscore to avoid conflict with function name */

    typedef enum {
        msiMessageStatusError = -1,
        msiMessageStatusNone = 0,
        msiMessageStatusOk = 1,
        msiMessageStatusCancel = 2,
        msiMessageStatusAbort = 3,
        msiMessageStatusRetry = 4,
        msiMessageStatusIgnore = 5,
        msiMessageStatusYes = 6,
        msiMessageStatusNo = 7
    } MsiMessageStatus;

    typedef enum {
        msiMessageTypeFatalExit = 0,
        msiMessageTypeError          = 0x01000000,
        msiMessageTypeWarning        = 0x02000000,
        msiMessageTypeUser           = 0x03000000,
        msiMessageTypeInfo           = 0x04000000,
        msiMessageTypeFilesInUse     = 0x05000000,
        msiMessageTypeResolveSource  = 0x06000000,
        msiMessageTypeOutOfDiskSpace = 0x07000000,
        msiMessageTypeActionStart    = 0x08000000,
        msiMessageTypeActionData     = 0x09000000,
        msiMessageTypeProgress       = 0x0a000000,
        msiMessageTypeCommonData     = 0x0b000000,
        msiMessageTypeOk = 0,
        msiMessageTypeOkCancel = 1,
        msiMessageTypeAbortRetryIgnore = 2,
        msiMessageTypeYesNoCancel = 3,
        msiMessageTypeYesNo = 4,
        msiMessageTypeRetryCancel = 5,
        msiMessageTypeDefault1 = 0,
        msiMessageTypeDefault2 = 256,
        msiMessageTypeDefault3 = 512
    } MsiMessageType;

    [ uuid(000C109E-0000-0000-C000-000000000046) ]
    dispinterface Session
    {
    properties:
    methods:
        [id(DISPID_SESSION_INSTALLER), propget]
            Installer *Installer();
        [id(DISPID_SESSION_PROPERTY), propget]
            BSTR Property([in] BSTR Name);
        [id(DISPID_SESSION_PROPERTY), propput]
            void Property(
                [in] BSTR Name,
                [in] BSTR rhs);
        [id(DISPID_SESSION_LANGUAGE), propget]
            long Language();
        [id(DISPID_SESSION_MODE), propget]
            VARIANT_BOOL Mode([in] MsiRunMode Flag);
        [id(DISPID_SESSION_MODE), propput]
            void Mode(
                [in] MsiRunMode Flag,
                [in] VARIANT_BOOL rhs);
        [id(DISPID_SESSION_DATABASE), propget]
            Database* Database();
        [id(DISPID_SESSION_DOACTION)]
            MsiDoActionStatus DoAction([in] BSTR Action);
        [id(DISPID_SESSION_EVALUATECONDITION)]
            _MsiEvaluateCondition EvaluateCondition([in] BSTR Expression);
        [id(DISPID_SESSION_MESSAGE)]
            MsiMessageStatus Message(
                [in] MsiMessageType Kind,
                [in] Record *Record);
        [id(DISPID_SESSION_FEATURECURRENTSTATE), propget]
            MsiInstallState FeatureCurrentState([in] BSTR Feature);
        [id(DISPID_SESSION_FEATUREREQUESTSTATE), propget]
            MsiInstallState FeatureRequestState([in] BSTR Feature);
        [id(DISPID_SESSION_FEATUREREQUESTSTATE), propput]
            void FeatureRequestState(
                [in] BSTR Feature,
                [in] MsiInstallState rhs);
        [id(DISPID_SESSION_SETINSTALLLEVEL)]
            void SetInstallLevel([in] long Level);
    }

    [ uuid(000C109F-0000-0000-C000-000000000046) ]
    dispinterface FeatureInfo
    {
        properties:
        methods:
    }

    [ uuid(000C10A0-0000-0000-C000-000000000046) ]
    dispinterface Product
    {
        properties:
        methods:
    }

    [ uuid(000C10A1-0000-0000-C000-000000000046) ]
    dispinterface Patch
    {
        properties:
        methods:
    }

    [
       helpstring("Microsoft Windows Installer"),
       threading(apartment),
       progid("WindowsInstaller.Installer"),
       uuid(000c1090-0000-0000-c000-000000000046)
    ]
    coclass MsiInstaller { interface Installer; }
}