//+---------------------------------------------------------------------------
//
//  Copyright (C) 1992, Microsoft Corporation.
//
//  File:       iface.idl
//
//  Contents:   Public definitions used for xmiting interfaces via RPC
//
//  History:    28-Jan-93   Ricksa      Created.
//
//  Notes:      These definitions are used for transmitting interfaces
//              via RPC.
//
//----------------------------------------------------------------------------
[ uuid(5C0EB534-BF9F-101A-8818-02608C4D2359),
  version(0.1),
  pointer_default(unique)
]

interface XmitDefs
{
    import "wtypes.idl";
#ifndef DO_NO_IMPORTS
    import "obase.idl";
#endif

    // These are only valid on a request (in a ORPCTHIS header).
    const int ORPCF_INPUT_SYNC       = ORPCF_RESERVED1;
    const int ORPCF_ASYNC            = ORPCF_RESERVED2;
    const int ORPCF_DYNAMIC_CLOAKING = ORPCF_RESERVED3;

    // These are only valid on a reply (in a ORPCTHAT header).
    const int ORPCF_REJECTED         = ORPCF_RESERVED1;
    const int ORPCF_RETRY_LATER      = ORPCF_RESERVED2;

    typedef struct
    {
       DWORD         dwFlags;
       DWORD         dwClientThread;
    } LOCALTHIS;

    typedef enum tagLOCALFLAG
    {
        LOCALF_NONE             = 0x0,

        // Parameters in buffer not marshalled NDR
        LOCALF_NONNDR           = 0x800
    } LOCALFLAG;

    // CALLCATEGORY is used internally and represents the categories of calls
    // that can be made.

    // DCOMWORK - Get rid of the unused internal types.
    typedef enum tagCALLCATEGORY
    {
        CALLCAT_NOCALL              = 0,    // no call in progress
        CALLCAT_SYNCHRONOUS         = 1,    // normal sychornous call
        CALLCAT_ASYNC               = 2,    // asynchronous call
        CALLCAT_INPUTSYNC           = 3,    // input-synchronous call
        CALLCAT_INTERNALSYNC        = 4,    // internal ssync call
        CALLCAT_INTERNALINPUTSYNC   = 5,    // internal inputssync call
        CALLCAT_SCMCALL             = 6     // important scm call
    } CALLCATEGORY;


    //  wire representation of an entire interface. used for wrapping a
    //  marshalled interface in a stream representation CXmitRpcStream.
    typedef struct tagInterfaceData
    {
        ULONG           ulCntData;                  //  size of data
        [length_is(ulCntData)] BYTE abData[1024];   //  data  
    } InterfaceData;

    typedef [unique] InterfaceData * PInterfaceData;

#pragma midl_echo("#define IFD_SIZE(pIFD) (sizeof(InterfaceData) + pIFD->ulCntData - 1024)")
}
