|
|
/**********************************************************
(C) 2001 Microsoft Corp. ***********************************************************/
#include "stdafx.h"
#include "mdisp.h"
#include "mdispid.h"
#include "rcbdyctl.h"
#include "IMSession.h"
#include "SessMgrEvnt.h"
#include "utils.h"
//****************************************************************************
//
// CSessionMgrEvent::CSessionMgrEvent()
// Constructor
//
//****************************************************************************
CSessionMgrEvent::CSessionMgrEvent(CIMSession *pIMSession) : m_dwCookie(0), m_iid(/*DIID_DMsgrSessionManagerEvents*/) { m_pIMSession = pIMSession;
m_dwRefCount = 0; m_pCP = NULL; }
CSessionMgrEvent::~CSessionMgrEvent() { }
//
// This method is used by CIMSession to release the Sink from the
// ConnectionPoint (the CLSID_MsgrSessionManager object)
//
HRESULT CSessionMgrEvent::Unadvise() { HRESULT hr = S_OK; if (m_pCP) { if (m_dwCookie) m_pCP->Unadvise(m_dwCookie); m_pCP->Release();
// Set the pointer to it's parent to NULL so that no calls are made to it
m_pIMSession = NULL; } return hr; }
//****************************************************************************
//
// STDMETHODIMP CSessionMgrEvent::QueryInterface( REFIID riid, void **ppv )
//
//
//****************************************************************************
STDMETHODIMP CSessionMgrEvent::QueryInterface( REFIID riid, void **ppv ) { // Alway initialize out components to NULL
*ppv = NULL; if( (IID_IUnknown == riid) || (m_iid == riid) || (IID_IDispatch == riid) ) { *ppv = this; } if( NULL == *ppv ) { return( E_NOINTERFACE ); } else { ((IUnknown *)(*ppv))->AddRef(); return( S_OK ); } }
//****************************************************************************
//
// STDMETHODIMP CSessionMgrEvent::GetTypeInfoCount(UINT* pcTypeInfo)
//
// should always return NOERROR
//
//****************************************************************************
STDMETHODIMP CSessionMgrEvent::GetTypeInfoCount(UINT* pcTypeInfo) { *pcTypeInfo = 0 ; return NOERROR ; }
//****************************************************************************
//
// STDMETHODIMP CSessionMgrEvent::GetTypeInfo(
//
// should always return E_NOTIMPL
//
//****************************************************************************
STDMETHODIMP CSessionMgrEvent::GetTypeInfo(UINT iTypeInfo, LCID, // This object does not support localization.
ITypeInfo** ppITypeInfo) { *ppITypeInfo = NULL ; if(iTypeInfo != 0) { return DISP_E_BADINDEX ; } else { return E_NOTIMPL; } }
//****************************************************************************
//
// STDMETHODIMP CSessionMgrEvent::GetIDsOfNames(
// const IID& iid,
// OLECHAR** arrayNames,
// UINT countNames,
// LCID, // Localization is not supported.
// DISPID* arrayDispIDs)
//
// should always return E_NOTIMPL
//
//****************************************************************************
STDMETHODIMP CSessionMgrEvent::GetIDsOfNames(const IID& iid, OLECHAR** arrayNames, UINT countNames, LCID, // Localization is not supported.
DISPID* arrayDispIDs) { HRESULT hr; if (iid != IID_NULL) { return DISP_E_UNKNOWNINTERFACE ; } hr = E_NOTIMPL; return hr ; }
//****************************************************************************
//
// STDMETHODIMP CSessionMgrEvent::Invoke(
//
//
//****************************************************************************
STDMETHODIMP CSessionMgrEvent::Invoke(DISPID dispidMember, const IID& iid, LCID, // Localization is not supported.
WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* pArgErr) { HRESULT hr=E_FAIL; HRESULT hrRet=E_FAIL;
_ASSERTE(iid == IID_NULL); switch (dispidMember) { case DISPID_ONINVITATION: case DISPID_ONAPPREGISTERED: case DISPID_ONAPPUNREGISTERED: break; // None of these are handled
case DISPID_ONLOCKCHALLENGE: if (m_pIMSession) m_pIMSession->OnLockChallenge(V_BSTR(&pDispParams->rgvarg[0]), V_I4(&pDispParams->rgvarg[1])); break; case DISPID_ONLOCKRESULT: if (m_pIMSession) m_pIMSession->OnLockResult(V_BOOL(&pDispParams->rgvarg[0]), V_I4(&pDispParams->rgvarg[1])); break; case DISPID_ONLOCKENABLE: //OutMessageBox(_T("Lock is enabled"));
break; case DISPID_ONAPPSHUTDOWN: if (m_pIMSession) m_pIMSession->DoSessionStatus(RA_IM_APPSHUTDOWN); break;
default: OutMessageBox(_T("got unknown Event from COM object: %d\r\n"), dispidMember); break; } return NOERROR; }
HRESULT CSessionMgrEvent::Advise(IConnectionPoint* pCP) { HRESULT hr = S_OK;
if (!pCP) { hr = E_INVALIDARG; goto done; }
if (m_pCP && m_dwCookie) { m_pCP->Unadvise(m_dwCookie); m_dwCookie = 0; m_pCP->Release(); }
m_pCP = pCP; m_pCP->AddRef();
hr = m_pCP->Advise((IUnknown*)this, &m_dwCookie); if (FAILED_HR(_T("CSessionMgrEvent:Advise failed %s"), hr)) goto done;
done: return hr; }
|