/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: tapiobj.h Abstract: Declaration of the CTAPI class Author: mquinton 06-12-97 Notes: Revision History: --*/ #ifndef __TAPIOBJ_H_ #define __TAPIOBJ_H_ #include "resource.h" // main symbols #include "address.h" #include "connect.h" #include "callcent.h" #include "utils.h" #include "shellapi.h" #include "atlctl.h" #include "TAPIObjectSafety.h" #define TAPIFLAG_INITIALIZED 0x00000001 #define TAPIFLAG_CALLHUBNOTIFY 0x00000002 #define TAPIFLAG_ALLCALLHUBTRACKING 0x00000004 #define TAPIFLAG_ALLCALLNOTIFY 0x00000008 #define TAPIFLAG_REINIT 0x00000010 #define TAPIFLAG_CALLCENTER_INITIALIZED 0x00000020 #define ALL_EVENT_FILTER_MASK (TE_TAPIOBJECT | \ TE_ADDRESS | \ TE_CALLNOTIFICATION | \ TE_CALLSTATE | \ TE_CALLMEDIA | \ TE_CALLHUB | \ TE_CALLINFOCHANGE | \ TE_PRIVATE | \ TE_REQUEST | \ TE_AGENT | \ TE_AGENTSESSION | \ TE_QOSEVENT | \ TE_AGENTHANDLER | \ TE_ACDGROUP | \ TE_QUEUE | \ TE_DIGITEVENT | \ TE_GENERATEEVENT | \ TE_ASRTERMINAL | \ TE_TTSTERMINAL | \ TE_FILETERMINAL | \ TE_TONETERMINAL | \ TE_PHONEEVENT | \ TE_TONEEVENT | \ TE_GATHERDIGITS | \ TE_ADDRESSDEVSPECIFIC | \ TE_PHONEDEVSPECIFIC ) class CCallHub; HRESULT WINAPI MyCallCenterQI(void* pvClassObject, REFIID riid, LPVOID* ppv, DWORD_PTR dw); ///////////////////////////////////////////////////////////////// // Intermediate classes used for DISPID encoding template class /*ATL_NO_VTABLE*/ ITapi2Vtbl : public ITTAPI2 { }; template class /*ATL_NO_VTABLE*/ ICallCenterVtbl : public ITTAPICallCenter { }; ///////////////////////////////////////////////////////////////////////////// // CTAPI class CTAPI : public CTAPIComObjectRoot, public CComCoClass, //public CComDualImpl, //public CComDualImpl, //public CComDualImpl, public IDispatchImpl, public IDispatchImpl, &IID_ITTAPI2, &LIBID_TAPI3Lib>, public IDispatchImpl, &IID_ITTAPICallCenter, &LIBID_TAPI3Lib>, public CTAPIObjectSafety, public IProvideClassInfo2Impl<&CLSID_TAPI, &DIID_ITTAPIDispatchEventNotification,&LIBID_TAPI3Lib> { public: CTAPI() : m_hLineApp(NULL), m_hPhoneApp(NULL), m_pLineInitData(NULL), m_pPhoneInitData(NULL), m_dwLineInitDataHandle(0), m_dwPhoneInitDataHandle(0), m_dwLineDevs(0), m_dwPhoneDevs(0), m_dwFlags(0), m_pCP(NULL), m_pAddressCapCache(NULL), m_pLineCapCache(NULL), m_pPhoneCapCache(NULL), m_dwEventFilterMask(0) { LOG((TL_TRACE, "CTAPI[%p] - enter", this)); LOG((TL_TRACE, "CTAPI - finish")); } ~CTAPI() { LOG((TL_TRACE, "~CTAPI[%p] - enter", this)); LOG((TL_TRACE, "~CTAPI - finish")); } void FinalRelease(); DECLARE_REGISTRY_RESOURCEID(IDR_TAPI) DECLARE_QI() DECLARE_MARSHALQI(CTAPI) DECLARE_TRACELOG_CLASS(CTAPI) BEGIN_COM_MAP(CTAPI) COM_INTERFACE_ENTRY2(IDispatch, ITTAPI2) COM_INTERFACE_ENTRY(ITTAPI) COM_INTERFACE_ENTRY(ITTAPI2) COM_INTERFACE_ENTRY(IConnectionPointContainer) COM_INTERFACE_ENTRY_FUNC(IID_ITTAPICallCenter, 0, MyCallCenterQI) COM_INTERFACE_ENTRY(ITTAPICallCenter) COM_INTERFACE_ENTRY_FUNC(IID_IMarshal, 0, IMarshalQI) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY(IObjectWithSite) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) END_COM_MAP() static BOOL IsValidTapiObject(CTAPI *pTapiObject); static void FinalTapiCleanup(); void AddCallHub( CCallHub * pCallHub ); void RemoveCallHub( CCallHub * pCallHub ); BOOL DoCallHubNotifications() { BOOL bReturn; Lock(); bReturn = (m_dwFlags & TAPIFLAG_CALLHUBNOTIFY); Unlock(); return bReturn; } HRESULT Event( TAPI_EVENT te, IDispatch * pEvent ); HRESULT EventFire( TAPI_EVENT te, IDispatch * pEvent ); HRESULT UpdateAgentHandlerArray(void); void DoLineCreate( DWORD dwDeviceID ); void DoLineRemove( DWORD dwDeviceID ); void DoPhoneCreate( DWORD dwDeviceID ); void DoPhoneRemove( DWORD dwDeviceID ); void HandleReinit(); HLINEAPP GetHLineApp(){ return (HLINEAPP)m_dwLineInitDataHandle; } static FindTapiObject( CTAPI * pTapi ); HRESULT GetBuffer( DWORD, UINT_PTR, LPVOID * ); HRESULT SetBuffer( DWORD, UINT_PTR, LPVOID ); HRESULT InvalidateBuffer( DWORD, UINT_PTR ); BOOL FindRegistration( PVOID ); HRESULT GetPhoneArray( PhoneArray *pPhoneArray ); private: DWORD m_dwPhoneDevs; DWORD m_dwLineDevs; HLINEAPP m_hLineApp; HPHONEAPP m_hPhoneApp; PT3INIT_DATA m_pLineInitData; PT3INIT_DATA m_pPhoneInitData; // // the 32-bit handles (corresponding m_pLineInitData and m_pPhoneInitData) // that are marshaled to tapisrv in place of the actual ptr values // (which can be 64 bit). // // we want to keep them around in order to be able // to remove the handle table entries on tapi shutdown // DWORD m_dwLineInitDataHandle; DWORD m_dwPhoneInitDataHandle; AddressArray m_AddressArray; PhoneArray m_PhoneArray; DWORD m_dwFlags; CTAPIConnectionPoint * m_pCP; PtrList m_RegisterItemPtrList; CallHubArrayNR m_CallHubArray; AgentHandlerArray m_AgentHandlerArray; CStructCache * m_pAddressCapCache; CStructCache * m_pLineCapCache; CStructCache * m_pPhoneCapCache; DWORD m_dwEventFilterMask; HRESULT NewInitialize(void); HRESULT NewShutdown(void); HRESULT CreateAllAddressesOnAllLines(void); HRESULT CreateAddressesOnSingleLine( DWORD dwDeviceID, BOOL bFireEvent ); HRESULT CreateAllPhones(void); HRESULT CreatePhone( DWORD dwDeviceID, BOOL bFireEvent ); void ReleaseGIT(); // // allocate and cleanup functions for address, phone, and line caps caches // HRESULT AllocateInitializeAllCaches(); void FreeAllCaches(); // ITAPI public: static TAPIObjectArrayNR m_sTAPIObjectArray; // ITTapi Methods STDMETHOD(Initialize)( void ); STDMETHOD(Shutdown)( void ); STDMETHOD(get_Addresses)(VARIANT * pVariant); STDMETHOD(EnumerateAddresses)( IEnumAddress ** ppEnumAddresses ); STDMETHOD(RegisterCallHubNotifications)( VARIANT_BOOL bNotify ); STDMETHOD(RegisterCallNotifications)( ITAddress * pAddress, VARIANT_BOOL fMonitor, VARIANT_BOOL fOwner, long lMediaTypes, long ulAdvise, long * pulRegister ); STDMETHOD(get_CallHubs)(VARIANT * pVariant); STDMETHOD(EnumerateCallHubs)(IEnumCallHub ** ppCallHub); STDMETHOD(UnregisterNotifications)(long ulRegister); STDMETHOD(SetCallHubTracking)( VARIANT pAddresses, VARIANT_BOOL bSet ); STDMETHOD(EnumeratePrivateTAPIObjects)(IEnumUnknown**); STDMETHOD(get_PrivateTAPIObjects)(VARIANT * pVariant); STDMETHOD(RegisterRequestRecipient)( long lRegistrationInstance, long lRequestMode, #ifdef NEWREQUEST long lAddressTypes, #endif VARIANT_BOOL fEnable ); STDMETHOD(SetAssistedTelephonyPriority)( BSTR pAppFilename, VARIANT_BOOL fPriority ); STDMETHOD(SetApplicationPriority)( BSTR pAppFilename, long lMediaType, VARIANT_BOOL fPriority ); STDMETHOD(put_EventFilter)( long lFilterMask ); STDMETHOD(get_EventFilter)( long * plFilterMask ); // ITTAPI2 methods STDMETHOD(get_Phones)(VARIANT * pPhones); STDMETHOD(EnumeratePhones)(IEnumPhone ** ppEnumPhone); STDMETHOD(CreateEmptyCollectionObject)( ITCollection2 ** ppCollection ); // IConnectionPointContainer Methods STDMETHOD(EnumConnectionPoints)(IEnumConnectionPoints **ppEnum) ; STDMETHOD(FindConnectionPoint)(REFIID riid, IConnectionPoint **ppCP) ; // ITTAPICallCenter Methods STDMETHOD(EnumerateAgentHandlers) (IEnumAgentHandler ** ppEnumAgentHandler); STDMETHOD(get_AgentHandlers) (VARIANT * pVariant); // IDispatch Methods STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid ); STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr ); private: // // Event Filtering helper methods // HRESULT SetEventFilterToAddresses( DWORD dwEventFilterMask); }; class CTapiObjectEvent : public CTAPIComObjectRoot, public CComDualImpl, public CObjectSafeImpl { public: DECLARE_MARSHALQI(CTapiObjectEvent) DECLARE_TRACELOG_CLASS(CTapiObjectEvent) BEGIN_COM_MAP(CTapiObjectEvent) COM_INTERFACE_ENTRY2(IDispatch, ITTAPIObjectEvent2) COM_INTERFACE_ENTRY(ITTAPIObjectEvent) COM_INTERFACE_ENTRY(ITTAPIObjectEvent2) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY_FUNC(IID_IMarshal, 0, IMarshalQI) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM) END_COM_MAP() static HRESULT FireEvent( CTAPI * pTapi, TAPIOBJECT_EVENT Event, ITAddress * pAddress, long lCallbackInstance, ITPhone * pPhone ); void FinalRelease(); protected: ITTAPI * m_pTapi; TAPIOBJECT_EVENT m_Event; ITAddress * m_pAddress; long m_lCallbackInstance; ITPhone * m_pPhone; #if DBG PWSTR m_pDebug; #endif public: // // itaddressstateevent // STDMETHOD(get_TAPIObject)( ITTAPI ** ppTapi ); STDMETHOD(get_Event)( TAPIOBJECT_EVENT * pEvent ); STDMETHOD(get_Address)( ITAddress ** ppAddress ); STDMETHOD(get_CallbackInstance)( long * plCallbackInstance ); // // itaddressstateevent2 // STDMETHOD(get_Phone)( ITPhone ** ppPhone ); }; #endif //__TAPIOBJ_H_