//.-------------------------------------------------------------------------
//.
//.  Microsoft Windows
//.  Copyright (C)  1995-2001 Microsoft Corporation
//.
//.  File: transact.idl
//.
//.  Contents: The basic transaction interfaces and types.
//.
//.--------------------------------------------------------------------------

import "unknwn.idl";

//
//--------------------------------------------------------------------------
//

interface ITransaction;

cpp_quote("#ifndef DECLSPEC_UUID")
cpp_quote("#if _MSC_VER >= 1100")
cpp_quote("#define DECLSPEC_UUID(x)    __declspec(uuid(x))")
cpp_quote("#else")
cpp_quote("#define DECLSPEC_UUID(x)")
cpp_quote("#endif")
cpp_quote("#endif")

//==========================================================================
// Transaction related types
//==========================================================================

[local,pointer_default(unique)]
interface BasicTransactionTypes
    {

        typedef struct BOID {
        byte rgb[16];
        } BOID;

    cpp_quote("#define BOID_NULL (*((BOID*)(&IID_NULL)))")

        // change the following two line together
    cpp_quote("#ifndef MAX_TRAN_DESC_DEFINED")          // conflicts with uimsg.h. This is temporary work around
    cpp_quote("#define MAX_TRAN_DESC_DEFINED")  
    typedef enum TX_MISC_CONSTANTS
        {
        MAX_TRAN_DESC                   = 40
        } TX_MISC_CONSTANTS;
    cpp_quote("#endif") 

        // Unit Of Work.

    typedef BOID XACTUOW;

        // Data type for isolation level values.

    typedef LONG ISOLEVEL;

        // Constants that specifiy isolation level of a transaction.

    typedef enum ISOLATIONLEVEL {
        ISOLATIONLEVEL_UNSPECIFIED      = 0xFFFFFFFF,   // 
        ISOLATIONLEVEL_CHAOS            = 0x00000010,   // 
        ISOLATIONLEVEL_READUNCOMMITTED  = 0x00000100,   // 
        ISOLATIONLEVEL_BROWSE           = 0x00000100,   // Synonym for _READUNCOMITTED
        ISOLATIONLEVEL_CURSORSTABILITY  = 0x00001000,   // 
        ISOLATIONLEVEL_READCOMMITTED    = 0x00001000,   // Synonym for _CURSORSTABILITY
        ISOLATIONLEVEL_REPEATABLEREAD   = 0x00010000,   // 
        ISOLATIONLEVEL_SERIALIZABLE     = 0x00100000,   // 
        ISOLATIONLEVEL_ISOLATED         = 0x00100000,   // Synonym for _SERIALIZABLE
        } ISOLATIONLEVEL; 

        // Transaction information structure, used in ITransaction

    typedef struct XACTTRANSINFO {
        XACTUOW     uow;                        // The current unit of work
        ISOLEVEL    isoLevel;                   // The isolation level for the current UOW
        ULONG       isoFlags;                   // Values from ISOFLAG enumeration
        DWORD       grfTCSupported;             // Flags indicating capabilities
        DWORD       grfRMSupported;             //       ... of this transaction wrt
        DWORD       grfTCSupportedRetaining;    //       ... parameters to Commit
        DWORD       grfRMSupportedRetaining;    //       ...
        } XACTTRANSINFO;

    typedef struct XACTSTATS {
        ULONG       cOpen;              // The number of currently extant transactions.
        ULONG       cCommitting;        // The number of transactions which are proceding towards committing.
        ULONG       cCommitted;         // The number of transactions that are have been committed.
        ULONG       cAborting;          // The number of transactions which are in the process of aborting.
        ULONG       cAborted;           // The number of transactions that are have been aborted.
        ULONG       cInDoubt;           // The number of transactions which are presently in doubt.
        ULONG       cHeuristicDecision; // The number of transactions that have completed by heuristic decision.
        FILETIME    timeTransactionsUp; // The amount of time that this transaction service has been up.
        } XACTSTATS;

        // @enum ISOFLAG | Used in <t XACTTRANSINFO> and <i ITransactionDispenser>.

    typedef enum ISOFLAG { 
        ISOFLAG_RETAIN_COMMIT_DC    = 1,    // Use just one of ISOFLAG_RETAIN_COMMIT values
        ISOFLAG_RETAIN_COMMIT       = 2,        // 
        ISOFLAG_RETAIN_COMMIT_NO    = 3,        // 
        ISOFLAG_RETAIN_ABORT_DC     = 4,    // Use just one of ISOFLAG_RETAIN_ABORT values
        ISOFLAG_RETAIN_ABORT        = 8,        // 
        ISOFLAG_RETAIN_ABORT_NO     = 12,       // 
        ISOFLAG_RETAIN_DONTCARE     = ISOFLAG_RETAIN_COMMIT_DC | ISOFLAG_RETAIN_ABORT_DC,       // 
        ISOFLAG_RETAIN_BOTH         = ISOFLAG_RETAIN_COMMIT    | ISOFLAG_RETAIN_ABORT,          // 
        ISOFLAG_RETAIN_NONE         = ISOFLAG_RETAIN_COMMIT_NO | ISOFLAG_RETAIN_ABORT_NO,       // 
        ISOFLAG_OPTIMISTIC          = 16,       // 
        ISOFLAG_READONLY                = 32    // 
        } ISOFLAG;

        // Used in ITransactionDispenser
        // A bit field of 32 bits; be sure to mask before comparing.

    typedef enum XACTTC {       
        XACTTC_SYNC_PHASEONE    = 1,
        XACTTC_SYNC_PHASETWO    = 2,
        XACTTC_SYNC             = 2,    // nb alias for XACTTC_SYNC_PHASETWO
        XACTTC_ASYNC_PHASEONE   = 4,
        XACTTC_ASYNC            = 4     // nb alias for XACTTC_ASYNC_PHASEONE
        } XACTTC;

        // Used in ITransactionDispenser
        // A bit field of 32 bits; be sure to mask before comparing.
    
    typedef enum XACTRM {       
        XACTRM_OPTIMISTICLASTWINS = 1,  //
        XACTRM_NOREADONLYPREPARES = 2,  //
        } XACTRM;

    typedef enum XACTCONST {
        XACTCONST_TIMEOUTINFINITE = 0,  //
        } XACTCONST;

    typedef enum XACTHEURISTIC {
        XACTHEURISTIC_ABORT     = 1,
        XACTHEURISTIC_COMMIT    = 2,
        XACTHEURISTIC_DAMAGE    = 3,
        XACTHEURISTIC_DANGER    = 4,
        } XACTHEURISTIC;

    typedef enum XACTSTAT {
                XACTSTAT_NONE                           = 0x00000000,
        XACTSTAT_OPENNORMAL         = 0x00000001,
        XACTSTAT_OPENREFUSED        = 0x00000002,
        XACTSTAT_PREPARING          = 0x00000004,
        XACTSTAT_PREPARED           = 0x00000008,
        XACTSTAT_PREPARERETAINING   = 0x00000010,
        XACTSTAT_PREPARERETAINED    = 0x00000020,
        XACTSTAT_COMMITTING         = 0x00000040,
        XACTSTAT_COMMITRETAINING    = 0x00000080,
        XACTSTAT_ABORTING           = 0x00000100,
        XACTSTAT_ABORTED            = 0x00000200,
        XACTSTAT_COMMITTED          = 0x00000400,
        XACTSTAT_HEURISTIC_ABORT    = 0x00000800,
        XACTSTAT_HEURISTIC_COMMIT   = 0x00001000,
        XACTSTAT_HEURISTIC_DAMAGE   = 0x00002000,
        XACTSTAT_HEURISTIC_DANGER   = 0x00004000,
        XACTSTAT_FORCED_ABORT       = 0x00008000,
        XACTSTAT_FORCED_COMMIT      = 0x00010000,
        XACTSTAT_INDOUBT            = 0x00020000,
        XACTSTAT_CLOSED             = 0x00040000,
        XACTSTAT_OPEN               = 0x00000003,       
        XACTSTAT_NOTPREPARED        = 0x0007FFC3,
        XACTSTAT_ALL                = 0x0007FFFF,       
        } XACTSTAT;
   
    typedef struct XACTOPT {                        // Transaction configuration options
        ULONG       ulTimeout;                      // timeout in milliseconds
        char            szDescription[MAX_TRAN_DESC];   // description string for admin tools
        } XACTOPT;
    
    
    //
    //==========================================================================
    // Error code definitions for all transaction related functionality.
    //==========================================================================
    //
    typedef enum XACT_E {
        XACT_E_FIRST                = 0x8004D000,
        XACT_E_LAST                 = 0x8004D01E,
        XACT_S_FIRST                = 0x0004D000,
        XACT_S_LAST                 = 0x0004D009,

        XACT_E_ALREADYOTHERSINGLEPHASE = 0x8004D000,
        XACT_E_CANTRETAIN           = 0x8004D001,
        XACT_E_COMMITFAILED         = 0x8004D002,
        XACT_E_COMMITPREVENTED      = 0x8004D003,
        XACT_E_HEURISTICABORT       = 0x8004D004,
        XACT_E_HEURISTICCOMMIT      = 0x8004D005,
        XACT_E_HEURISTICDAMAGE      = 0x8004D006,
        XACT_E_HEURISTICDANGER      = 0x8004D007,
        XACT_E_ISOLATIONLEVEL       = 0x8004D008,
        XACT_E_NOASYNC              = 0x8004D009,
        XACT_E_NOENLIST             = 0x8004D00A,
        XACT_E_NOISORETAIN          = 0x8004D00B,
        XACT_E_NORESOURCE           = 0x8004D00C,
        XACT_E_NOTCURRENT           = 0x8004D00D,
        XACT_E_NOTRANSACTION        = 0x8004D00E,
        XACT_E_NOTSUPPORTED         = 0x8004D00F,
        XACT_E_UNKNOWNRMGRID        = 0x8004D010,
        XACT_E_WRONGSTATE           = 0x8004D011,
        XACT_E_WRONGUOW             = 0x8004D012,
        XACT_E_XTIONEXISTS          = 0x8004D013,
        XACT_E_NOIMPORTOBJECT       = 0x8004D014,
        XACT_E_INVALIDCOOKIE        = 0x8004D015,
        XACT_E_INDOUBT              = 0x8004D016,
        XACT_E_NOTIMEOUT            = 0x8004D017,
        XACT_E_ALREADYINPROGRESS    = 0x8004D018,
        XACT_E_ABORTED              = 0x8004D019,
        XACT_E_LOGFULL              = 0x8004D01A,
        XACT_E_TMNOTAVAILABLE       = 0x8004D01B,
        XACT_E_CONNECTION_DOWN      = 0x8004D01C,
        XACT_E_CONNECTION_DENIED    = 0x8004D01D,
        XACT_E_REENLISTTIMEOUT      = 0x8004D01E,

        XACT_S_ASYNC                = 0x0004D000,
        XACT_S_DEFECT               = 0x0004D001,
        XACT_S_READONLY             = 0x0004D002,
        XACT_S_SOMENORETAIN         = 0x0004D003,
        XACT_S_OKINFORM             = 0x0004D004,
        XACT_S_MADECHANGESCONTENT   = 0x0004D005,
        XACT_S_MADECHANGESINFORM    = 0x0004D006, 
        XACT_S_ALLNORETAIN          = 0x0004D007,
        XACT_S_ABORTING             = 0x0004D008,
        XACT_S_SINGLEPHASE          = 0x0004D009,
        } XACT_E;

    }

    
//
//==========================================================================
// Basic transaction interfaces
//==========================================================================
//

// Transaction interface, single phase

[object,uuid(0fb15084-af41-11ce-bd2b-204c4f4f5020), pointer_default(unique)]
interface ITransaction : IUnknown {

    HRESULT Commit
        (
        [in] BOOL  fRetaining, 
        [in] DWORD grfTC,
        [in] DWORD grfRM
        );
    HRESULT Abort
        (
        [in, unique] BOID* pboidReason,
        [in]         BOOL  fRetaining,
        [in]         BOOL  fAsync
        );
    HRESULT GetTransactionInfo
        (
        [out] XACTTRANSINFO* pinfo
        );
    }

