Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

226 lines
6.4 KiB

/**********************************************************
(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;
}