//+------------------------------------------------------------------- // // File: Context.idl // // Contents: Context interfaces // // History: 04-Dec-97 Gopalk Created // //-------------------------------------------------------------------- cpp_quote("//+-----------------------------------------------------------------") cpp_quote("//") cpp_quote("// Microsoft Windows") cpp_quote("// Copyright (C) Microsoft Corporation, 1992 - 1997.") cpp_quote("//") cpp_quote("//------------------------------------------------------------------") #ifndef DO_NO_IMPORTS import "wtypes.idl"; import "objidl.idl"; import "unknwn.idl"; #endif /**************************************************************************** * Context Types * ****************************************************************************/ // Event types enum tagCONTEXTEVENT { CONTEXTEVENT_NONE = 0x00000000, // Call Events CONTEXTEVENT_CALL = 0x00000001, CONTEXTEVENT_ENTER = 0x00000002, CONTEXTEVENT_LEAVE = 0x00000004, CONTEXTEVENT_RETURN = 0x00000008, // Buffer Events CONTEXTEVENT_CALLFILLBUFFER = 0x00000010, CONTEXTEVENT_ENTERWITHBUFFER = 0x00000020, CONTEXTEVENT_LEAVEFILLBUFFER = 0x00000040, CONTEXTEVENT_RETURNWITHBUFFER = 0x00000080, // Begin Events CONTEXTEVENT_BEGINCALL = 0x00000100, CONTEXTEVENT_BEGINENTER = 0x00000200, CONTEXTEVENT_BEGINLEAVE = 0x00000400, CONTEXTEVENT_BEGINRETURN = 0x00000800, // Finish Events CONTEXTEVENT_FINISHCALL = 0x00001000, CONTEXTEVENT_FINISHENTER = 0x00002000, CONTEXTEVENT_FINISHLEAVE = 0x00004000, CONTEXTEVENT_FINISHRETURN = 0x00008000, // Buffer Events CONTEXTEVENT_BEGINCALLFILLBUFFER = 0x00010000, CONTEXTEVENT_BEGINENTERWITHBUFFER = 0x00020000, CONTEXTEVENT_FINISHLEAVEFILLBUFFER = 0x00040000, CONTEXTEVENT_FINISHRETURNWITHBUFFER = 0x00080000, // Exception Events CONTEXTEVENT_LEAVEEXCEPTION = 0x00100000, CONTEXTEVENT_LEAVEEXCEPTIONFILLBUFFER = 0x00200000, CONTEXTEVENT_RETURNEXCEPTION = 0x00400000, CONTEXTEVENT_RETURNEXCEPTIONWITHBUFFER = 0x00800000, // Other Events CONTEXTEVENT_ADDREFPOLICY = 0x10000000, CONTEXTEVENT_RELEASEPOLICY = 0x20000000 }; typedef DWORD ContextEvent; enum tagCPFLAGS { CPFLAG_NONE = 0x0, // Flags to determine whether the property gets copied when the context does CPFLAG_PROPAGATE = 0x1, CPFLAG_EXPOSE = 0x2, CPFLAG_ENVOY = 0x4, // Flags to determine whether the property receives stub/proxy // create/destroy events. CPFLAG_MONITORSTUB = 0x8, CPFLAG_MONITORPROXY = 0x10, // Flags to determine whether a property is used in context comparison CPFLAG_DONTCOMPARE = 0x20 }; typedef DWORD CPFLAGS; #define MSHLFLAGS_NO_IEC 0x8 // don't use IExternalConnextion #define MSHLFLAGS_NO_IMARSHAL 0x10 // don't use IMarshal /**************************************************************************** * Context Interfaces * ****************************************************************************/ // IEnunContextProperties interface typedef struct tagContextProperty { GUID policyId; CPFLAGS flags; [unique] IUnknown *pUnk; } ContextProperty; [ object, uuid(000001c1-0000-0000-C000-000000000046), pointer_default(unique) ] interface IEnumContextProps : IUnknown { typedef [unique] IEnumContextProps *LPENUMCONTEXTPROPS; HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] ContextProperty *pContextProperties, [out] ULONG *pceltFetched); HRESULT Skip([in] ULONG celt); HRESULT Reset(); HRESULT Clone([out] IEnumContextProps **ppEnumContextProps); HRESULT Count([out] ULONG *pcelt); } // IContext interface [ local, object, uuid(000001c0-0000-0000-C000-000000000046), pointer_default(unique) ] interface IContext : IUnknown { //typedef [unique] IContext *LPCONTEXT; HRESULT SetProperty([in] REFGUID rpolicyId, [in] CPFLAGS flags, [in] IUnknown *pUnk); HRESULT RemoveProperty([in] REFGUID rPolicyId); HRESULT GetProperty([in] REFGUID rGuid, [out] CPFLAGS *pFlags, [out] IUnknown **ppUnk); HRESULT EnumContextProps([out] IEnumContextProps **ppEnumContextProps); } // Interface for context-controlled marshalling [ local, object, uuid(000001D8-0000-0000-C000-000000000046) ] interface IContextMarshaler : IUnknown { typedef [unique] IContextMarshaler *LPCTXMARSHALER; HRESULT GetMarshalSizeMax([in] REFIID riid, [in, unique] void *pv, [in] DWORD dwDestContext, [in, unique] void *pvDestContext, [in] DWORD mshlflags, [out] DWORD *pSize); HRESULT MarshalInterface([in, unique] IStream *pStm, [in] REFIID riid, [in, unique] void *pv, [in] DWORD dwDestContext, [in, unique] void *pvDestContext, [in] DWORD mshlflags); } // IObjContext interface [ local, object, uuid(000001c6-0000-0000-C000-000000000046), pointer_default(unique) ] interface IObjContext : IContext { typedef [ref] HRESULT __stdcall (*PFNCTXCALLBACK)(void* pParam); HRESULT Freeze(); HRESULT DoCallback([in] PFNCTXCALLBACK pfnCallback, [in] void* pParam, [in] REFIID riid, [in] unsigned int iMethod); // These methods are here to minimize the code path for marshalling // otherwise I would put them in a separate interface // The Set methods can only be called before the context is frozen // Methods to set and get a special marshaller that is invoked for // GetMarshalSizeMax and MarshalInterface if MSHLFLAGS_USE_CTX_MSH is set HRESULT SetContextMarshaler([in] IContextMarshaler *pICM); HRESULT GetContextMarshaler([out] IContextMarshaler **pICM); // Ugly back-door methods to let us examine or modify the context flags // externally. HRESULT SetContextFlags([in] DWORD dwFlags); // flags |= dwFlags HRESULT ClearContextFlags([in] DWORD dwFlags); // flags &= ~dwFlags HRESULT GetContextFlags([out] DWORD *pdwFlags); } // IGetContextId [ local, object, uuid(000001dd-0000-0000-C000-000000000046), pointer_default(unique) ] interface IGetContextId : IUnknown { HRESULT GetContextId([out] GUID *pguidCtxtId); }; // IAggregator [ local, object, uuid(000001d8-0000-0000-C000-000000000046), pointer_default(unique) ] interface IAggregator : IUnknown { typedef [unique] IAggregator *IAGGREGATOR; HRESULT Aggregate([in] IUnknown* pInnerUnk); } // ICall interface [ local, object, uuid(000001d6-0000-0000-C000-000000000046), pointer_default(unique) ] interface ICall : IUnknown { typedef [unique] ICall *LPCALL; HRESULT GetCallInfo([out] const void **ppIdentity, [out] IID *piid, [out] DWORD *pdwMethod, [out] HRESULT *phr); HRESULT Nullify([in] HRESULT hr); HRESULT GetServerHR([out] HRESULT *phr); }; // IRpcCall interface [ local, object, uuid(000001c5-0000-0000-C000-000000000046), pointer_default(unique) ] interface IRpcCall : IUnknown { typedef [unique] IRpcCall *LPRPCCALL; HRESULT GetRpcOleMessage([out] RPCOLEMESSAGE **ppMessage); }; typedef enum _CALLSOURCE { CALLSOURCE_CROSSAPT = 0, CALLSOURCE_CROSSCTX = 1 } CALLSOURCE; // ICallInfo interface [ local, object, uuid(000001dc-0000-0000-C000-000000000046), pointer_default(unique) ] interface ICallInfo : IUnknown { HRESULT GetCallSource([out] CALLSOURCE* pCallSource); }; // IPolicy interface [ local, object, uuid(000001c2-0000-0000-C000-000000000046), pointer_default(unique) ] interface IPolicy : IUnknown { HRESULT Call([in] ICall *pCall); HRESULT Enter([in] ICall *pCall); HRESULT Leave([in] ICall *pCall); HRESULT Return([in] ICall *pCall); HRESULT CallGetSize([in] ICall *pCall, [out] ULONG *pcb); HRESULT CallFillBuffer([in] ICall *pCall, [in] void *pvBuf, [out] ULONG *pcb); HRESULT EnterWithBuffer([in] ICall *pCall, [in] void *pvBuf, [in] ULONG cb); HRESULT LeaveGetSize([in] ICall *pCall, [out] ULONG *pcb); HRESULT LeaveFillBuffer([in] ICall *pCall, [in] void *pvBuf, [out] ULONG *pcb); HRESULT ReturnWithBuffer([in] ICall *pCall, [in] void *pvBuf, [in] ULONG cb); ULONG AddRefPolicy(); ULONG ReleasePolicy(); }; // IPolicyAsync interface [ local, object, uuid(000001cd-0000-0000-C000-000000000046), pointer_default(unique) ] interface IPolicyAsync : IUnknown { HRESULT BeginCallGetSize([in] ICall *pCall, [out] ULONG *pcb); HRESULT BeginCall([in] ICall *pCall); HRESULT BeginCallFillBuffer([in] ICall *pCall, [in] void *pvBuf, [out] ULONG *pcb); HRESULT BeginEnter([in] ICall *pCall); HRESULT BeginEnterWithBuffer([in] ICall *pCall, [in] void *pvBuf, [in] ULONG cb); HRESULT BeginLeave([in] ICall *pCall); HRESULT BeginReturn([in] ICall *pCall); HRESULT FinishCall([in] ICall *pCall); HRESULT FinishEnter([in] ICall *pCall); HRESULT FinishLeaveGetSize([in] ICall *pCall, [out] ULONG *pcb); HRESULT FinishLeave([in] ICall *pCall); HRESULT FinishLeaveFillBuffer([in] ICall *pCall, [in] void *pvBuf, [out] ULONG *pcb); HRESULT FinishReturn([in] ICall *pCall); HRESULT FinishReturnWithBuffer([in] ICall *pCall, [in] void *pvBuf, [in] ULONG cb); }; // IPolicySet interface [ local, object, uuid(000001c3-0000-0000-C000-000000000046), pointer_default(unique) ] interface IPolicySet : IUnknown { HRESULT AddPolicy([in] ContextEvent ctxEvent, [in] REFGUID rguid, [in] IPolicy *pPolicy); } // IComObjIdentity interface [ local, object, uuid(000001d7-0000-0000-C000-000000000046), pointer_default(unique) ] interface IComObjIdentity : IUnknown { BOOL IsServer(); BOOL IsDeactivated(); HRESULT GetIdentity([out] IUnknown** ppUnk); } // IPolicyMaker interface [ local, object, uuid(000001c4-0000-0000-C000-000000000046), pointer_default(unique) ] interface IPolicyMaker : IUnknown { HRESULT AddClientPoliciesToSet([in] IPolicySet *pPS, [in] IContext *pClientContext, [in] IContext *pServerContext); HRESULT AddEnvoyPoliciesToSet([in] IPolicySet *pPS, [in] IContext *pClientContext, [in] IContext *pServerContext); HRESULT AddServerPoliciesToSet([in] IPolicySet *pPS, [in] IContext *pClientContext, [in] IContext *pServerContext); HRESULT Freeze([in] IObjContext *pObjContext); HRESULT CreateStub([in] IComObjIdentity *pID); HRESULT DestroyStub([in] IComObjIdentity *pID); HRESULT CreateProxy([in] IComObjIdentity *pID); HRESULT DestroyProxy([in] IComObjIdentity *pID); } // IExceptionNotification interface [ local, object, uuid(000001db-0000-0000-C000-000000000046), pointer_default(unique) ] interface IExceptionNotification : IUnknown { void ServerException([in] void *pExcepPtrs); } // IAbandonmentNotification interface [ local, object, uuid(000001de-0000-0000-C000-000000000046), pointer_default(unique) ] interface IAbandonmentNotification : IUnknown { void Abandoned (IObjContext* pObjContext); } // IMarshalEnvoy [ local, object, uuid(000001c8-0000-0000-C000-000000000046), pointer_default(unique) ] interface IMarshalEnvoy : IUnknown { HRESULT GetEnvoyUnmarshalClass([in] DWORD dwDestContext, [out] CLSID* pClsid); HRESULT GetEnvoySizeMax([in] DWORD dwDestContext, [out] DWORD* pcb); HRESULT MarshalEnvoy([in] IStream* pStream, [in] DWORD dwDestContext); HRESULT UnmarshalEnvoy([in] IStream* pStream, [in] REFIID riid, [out, iid_is(riid)] void** ppunk); }; // IWrapperInfo [ local, object, uuid(5052f924-7ab8-11d3-b93f-00c04f990176), pointer_default(unique) ] interface IWrapperInfo : IUnknown { void SetMapping(void *pv); void *GetMapping(); IObjContext *GetServerObjectContext(); IUnknown *GetServerObject(); }; // ICOMDispatchInfo [ local, object, uuid(000001d9-0000-0000-C000-000000000046), pointer_default(unique) ] interface IComDispatchInfo : IUnknown { HRESULT EnableComInits([out] void **ppvCookie); HRESULT DisableComInits([in] void *pvCookie); }; typedef DWORD HActivator; cpp_quote("STDAPI CoCreateObjectInContext(IUnknown *pUnk, IObjContext *pObjectCtx, REFIID riid, void **ppv);") cpp_quote("STDAPI CoGetApartmentID(APTTYPE dAptType, HActivator* pAptID);") cpp_quote("STDAPI CoDeactivateObject(IUnknown *pUnk, IUnknown **ppCookie);") cpp_quote("STDAPI CoReactivateObject(IUnknown *pUnk, IUnknown *pCookie);") cpp_quote("#define MSHLFLAGS_NO_IEC 0x8 // don't use IExternalConnextion") cpp_quote("#define MSHLFLAGS_NO_IMARSHAL 0x10 // don't use IMarshal") cpp_quote("#define CONTEXTFLAGS_FROZEN 0x01 // Frozen context") cpp_quote("#define CONTEXTFLAGS_ALLOWUNAUTH 0x02 // Allow unauthenticated calls") cpp_quote("#define CONTEXTFLAGS_ENVOYCONTEXT 0x04 // Envoy context") cpp_quote("#define CONTEXTFLAGS_DEFAULTCONTEXT 0x08 // Default context") cpp_quote("#define CONTEXTFLAGS_STATICCONTEXT 0x10 // Static context") cpp_quote("#define CONTEXTFLAGS_INPROPTABLE 0x20 // Is in property table") cpp_quote("#define CONTEXTFLAGS_INDESTRUCTOR 0x40 // Is in destructor") cpp_quote("#define CONTEXTFLAGS_URTPROPPRESENT 0x80 // URT property added")