/*
 * 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; }
}
