diff options
Diffstat (limited to 'private/ole32/com/remote/callcont.hxx')
-rw-r--r-- | private/ole32/com/remote/callcont.hxx | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/private/ole32/com/remote/callcont.hxx b/private/ole32/com/remote/callcont.hxx new file mode 100644 index 000000000..58579fc15 --- /dev/null +++ b/private/ole32/com/remote/callcont.hxx @@ -0,0 +1,231 @@ +//+------------------------------------------------------------------------- +// +// Microsoft Windows +// Copyright (C) Microsoft Corporation, 1992 - 1993. +// +// File: CallCont.hxx (32 bit target) +// +// Contents: Contains the CallControl interface for OLE 2.0 32 bit. +// +// Functions: The CallControl interface is used by a channel to make +// outgoing calls and receive call. It interacts with the +// application provided MessageFilter interface. +// It essentially contains the functionality what makes the +// "OLE 2.0 Logicial Thread Model". +// For more information see the aOLTM.doc +// +// History: 21-Dec-93 Johann Posch (johannp) Created +// +//-------------------------------------------------------------------------- +#ifndef __CALLCONT_H__ +#define __CALLCONT_H__ + +#include <limits.h> + +typedef LPVOID PRPCMSG; +typedef HANDLE EVENT; +typedef IID LID; // logical thread id +typedef REFIID REFLID; // ref to logical thread id + + +typedef struct tagDISPATCHDATA +{ + SCODE scode; // might be no necessary + LPVOID pData; // pointer to channel data +} DISPATCHDATA, *PDISPATCHDATA; + + +// SERVERCALLEX is an extension of SERVERCALL and represents the set of +// valid responses from IMessageFilter::HandleIncoming Call. + +typedef enum tagSERVERCALLEX +{ + SERVERCALLEX_ISHANDLED = 0, // server can handle the call now + SERVERCALLEX_REJECTED = 1, // server can not handle the call + SERVERCALLEX_RETRYLATER = 2, // server suggests trying again later + SERVERCALLEX_ERROR = 3, // error? + SERVERCALLEX_CANCELED = 5 // client suggests canceling +} SERVERCALLEX; + + +// CALLCATEGORY is used internally and represents the categories of calls +// that can be made. + +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 +} CALLCATEGORY; + + +// the INTERFACEINFO structure contains information that is passed to the +// applications message filter via HandleIncomingCall when an incomming +// ORPC call arrives. INTERFACEINFO32 contains an extra parameter on the +// end (the callcat). + +typedef struct tagINTERFACEINFO32 +{ + IUnknown FAR *pUnk; // the pointer to the object + IID iid; // interface id + WORD wMethod; // interface method + CALLCATEGORY callcat; // the category of call +} INTERFACEINFO32, *PINTERFACEINFO32; + + +// callcontrol data representing one call +typedef struct tagCALLDATA +{ + IID iid; // iid on which call is made; only + // used to check for certain iids + // when processing ASYNC calls. + LID lid; // logical threadid this call was made on + UINT id; // callinfo id for the table lookup + DWORD TIDCallee; // threadid of callee + BOOL fDirectedYield;// TRUE if callcontrol should do yield + CALLCATEGORY CallCat; // category of call + EVENT Event; // the event we wait on + PRPCMSG pRpcMsg; // rpc msg (used by dde) +#if DBG == 1 + ULONG iMethod; // method index for rpx spy +#endif + +} CALLDATA, * PCALLDATA; + + +// +// predefined calldata ids +// +#define CALLDATAID_INVALID UINT_MAX +#define CALLDATAID_UNUSED UINT_MAX +#define METHOD_INTERNAL (WORD) UINT_MAX + + +// CALLORIGIN is an enumeration of the valid sources of an Rpc call. +// The origin of CallRunModalLoop is needed for the priority of message. +// If called by RPC, rpc messages are peeked first. + +typedef enum tagCALLORIGIN +{ + CALLORIGIN_LRPC = 1, // lrpc - windows based rpc (16bit) + CALLORIGIN_DDE = 2, // dde + CALLORIGIN_RPC16 = 3, // rpc - NT 16 bit app + CALLORIGIN_RPC32_APARTMENT = 4, // rpc - NT 32 bit appartment model + CALLORIGIN_RPC32_MULTITHREAD = 5, // rpc - NT 32 bit multi threaded + CALLORIGIN_LAST = 6 // first unused +} CALLORIGIN; + + + + +#undef INTERFACE +#define INTERFACE IMessageFilter32 + +// MessageFilter interface provided by the app + +DECLARE_INTERFACE_(IMessageFilter32, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IMessageFilter methods *** + STDMETHOD_(DWORD, HandleInComingCall) (THIS_ DWORD dwCallType, + DWORD TIDCaller, DWORD dwTickCount, + PINTERFACEINFO32 pIfInfo ) PURE; + STDMETHOD_(DWORD, RetryRejectedCall) (THIS_ + DWORD TIDCallee, DWORD dwTickCount, + DWORD dwRejectType ) PURE; + STDMETHOD_(DWORD, MessagePending) (THIS_ + DWORD TIDCallee, DWORD dwTickCount, + DWORD dwPendingType ) PURE; +}; +typedef IMessageFilter32 FAR* LPMESSAGEFILTER32, *PMESSAGEFILTER32; + + + +#undef INTERFACE +#define INTERFACE IChannelControl + +// each app using the CallControl interface has to provide the +// a ChannelControl interface + +DECLARE_INTERFACE_(IChannelControl, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** IChannelCall methods *** + // DispatchCall is called in case the client wants to retry the call + STDMETHOD (DispatchCall) (THIS_ PDISPATCHDATA pDispatchData) PURE; + // TransmitCall is called in case the client wants to retry the call + STDMETHOD (TransmitCall) (THIS_ PCALLDATA pCallData) PURE; + // OnEvent is called if the event is signaled we wait on + STDMETHOD (OnEvent) (THIS_ PCALLDATA pCallData) PURE; +}; +typedef IChannelControl FAR* LPCHANNELCONTROL, *PCHANNELCONTROL; +#undef INTERFACE + + + +// structure to hold channel specific information, such as the +// range of messages the channel is interested in, channel controller, +// etc. + +typedef struct tagOriginData +{ + PCHANNELCONTROL pChCont; // channel controller + CALLORIGIN CallOrigin; // call origin type + HWND hwnd; // window handle + UINT wFirstMsg; // first MSG # in contiguous range + UINT wLastMsg; // last MSG # in contiguous range +} ORIGINDATA, * PORIGINDATA; + + + +#define INTERFACE ICallControl +DECLARE_INTERFACE_(ICallControl, IUnknown) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + // *** ICallControl methods *** + + STDMETHOD (CallRunModalLoop) (THIS_ PCALLDATA pCalldata) PURE; + STDMETHOD (SetCallState) (THIS_ PCALLDATA pCalldata, + SERVERCALLEX ServerCall, + SCODE scode) PURE; + STDMETHOD (HandleDispatchCall) (THIS_ DWORD TIDCaller, REFLID lid, + PINTERFACEINFO32 pIfInfo, + PDISPATCHDATA pDispatchData) PURE; + STDMETHOD (ModalLoopBlockFunction) (THIS_ ) PURE; + +}; +typedef ICallControl FAR* LPCALLCONTROL, *PCALLCONTROL; + + +STDAPI CoGetCallControl(PORIGINDATA pOrigindata, PCALLCONTROL FAR* ppCallControl); + +// app can register a MessageFilter interface +STDAPI CoRegisterMessageFilterEx(PMESSAGEFILTER32 pMsgFilter, PMESSAGEFILTER32 *ppMsgFilter); + +#if DBG == 1 +#define METHOD_SYSROT_CALLGETOSINFO MAXDWORD-1 +#define METHOD_SYSROT_ENUMRUNNING MAXDWORD-2 +#define METHOD_ROT_GETIFFROMPROP MAXDWORD-3 +#define METHOD_CHANNEL_GETCHANNELID MAXDWORD-4 +#define METHOD_CHANNEL_RELEASECHANNEL MAXDWORD-5 +#define METHOD_CHANNEL_DOCHANNELOPERATION MAXDWORD-6 +#endif + +#endif // __CALLCONT__HXX__ + + |