//**************************************************************************** // // BLObEvnt.cpp // Messenger integration to OE // Created 04/20/98 by YST // // Copyright (c) Microsoft Corporation 1997-1998 // #include "pch.hxx" #include "bactrl.h" #include "MDispid.h" #include "BLObEvnt.h" #include "demand.h" #include "bllist.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define ASSERT _ASSERTE #define STR_MAX 256 //**************************************************************************** // // CLASS CMsgrObjectEvents // //**************************************************************************** //**************************************************************************** // // Construction/Destruction // //**************************************************************************** CMsgrObjectEvents::CMsgrObjectEvents() { // m_pBlAbCtrl = NULL; // lLocalState = MSTATEOE_OFFLINE; } CMsgrObjectEvents::~CMsgrObjectEvents() { } //**************************************************************************** // // Methods from IUnknown // //**************************************************************************** //**************************************************************************** // // STDMETHODIMP_(ULONG) CMsgrObjectEvents::AddRef() // // Purpose : increment the object's reference count, // Entry : None // Exit : current count // //**************************************************************************** STDMETHODIMP_ (ULONG) CMsgrObjectEvents::AddRef() { return RefCount::AddRef(); } //**************************************************************************** // // STDMETHODIMP_(ULONG) CMsgrObjectEvents::Release() // // Purpose : decrement the object's reference count // Entry : None // Exit : returns new count // //**************************************************************************** STDMETHODIMP_ (ULONG) CMsgrObjectEvents::Release() { return RefCount::Release(); } //**************************************************************************** // // STDMETHODIMP CMsgrObjectEvents::QueryInterface(REFIID iid, LPVOID *ppv) // // returns a pointer to the requested interface on the same object // Purpose: To retrieve a pointer to requested interface // Entry : iid -- GUID of requested interface // Exit : ppv -- pointer to requested interface (if one exists) // return value : HRESULT // //**************************************************************************** STDMETHODIMP CMsgrObjectEvents::QueryInterface (REFIID riid, LPVOID *ppv) { *ppv = NULL; HRESULT hr = E_NOINTERFACE; if (riid == IID_IUnknown) *ppv = (LPVOID) this; else if (riid == DIID_DMsgrOEEvents) *ppv = (LPVOID) this; else if (riid == IID_IDispatch) *ppv = (LPVOID) this; if (*ppv) { ((LPUNKNOWN)*ppv)->AddRef(); hr = S_OK; } return hr; } //**************************************************************************** // // IDispatch implementation // //**************************************************************************** //**************************************************************************** // // STDMETHODIMP CMsgrObjectEvents::GetTypeInfoCount(UINT* pcTypeInfo) // // Set pcTypeInfo to 0 because we do not support type library // //**************************************************************************** STDMETHODIMP CMsgrObjectEvents::GetTypeInfoCount(UINT* pcTypeInfo) { // g_AddToLog(LOG_LEVEL_COM, _T("GetTypeInfoCount call succeeded")); *pcTypeInfo = 0 ; return NOERROR ; } //**************************************************************************** // // STDMETHODIMP CMsgrObjectEvents::GetTypeInfo( // // Returns E_NOTIMPL because we do not support type library // //**************************************************************************** STDMETHODIMP CMsgrObjectEvents::GetTypeInfo( UINT iTypeInfo, LCID, // This object does not support localization. ITypeInfo** ppITypeInfo) { *ppITypeInfo = NULL ; if(iTypeInfo != 0) { // g_AddToLog(LOG_LEVEL_COM, _T("GetTypeInfo call failed -- bad iTypeInfo index")); return DISP_E_BADINDEX ; } else { //g_AddToLog(LOG_LEVEL_COM, _T("GetTypeInfo call succeeded")); return E_NOTIMPL; } } //**************************************************************************** // // STDMETHODIMP CMsgrObjectEvents::GetIDsOfNames( // const IID& iid, // OLECHAR** arrayNames, // UINT countNames, // LCID, // Localization is not supported. // DISPID* arrayDispIDs) // // Returns E_NOTIMPL because we do not support type library // //**************************************************************************** STDMETHODIMP CMsgrObjectEvents::GetIDsOfNames( const IID& iid, OLECHAR** arrayNames, UINT countNames, LCID, // Localization is not supported. DISPID* arrayDispIDs) { HRESULT hr; if (iid != IID_NULL) { // g_AddToLog(LOG_LEVEL_COM, _T("GetIDsOfNames call failed -- bad IID")); return DISP_E_UNKNOWNINTERFACE ; } // g_AddToLog(LOG_LEVEL_COM, _T("GetIDsOfNames call succeeded")); hr = E_NOTIMPL; return hr ; } // Set BLAB control for CMsgrObjectEvents STDMETHODIMP CMsgrObjectEvents::SetListOfBuddies(CMsgrList *pList) { m_pMsgrList = pList; return S_OK; } // Set BLAB control for CMsgrObjectEvents STDMETHODIMP CMsgrObjectEvents::DelListOfBuddies() { m_pMsgrList = NULL; return S_OK; } //**************************************************************************** // // STDMETHODIMP CMsgrObjectEvents::Invoke( // DISPID dispidMember, // const IID& iid, // LCID, // Localization is not supported. // WORD wFlags, // DISPPARAMS* pDispParams, // VARIANT* pvarResult, // EXCEPINFO* pExcepInfo, // UINT* pArgErr) // // Returns E_NOTIMPL because we do not support type library // //**************************************************************************** STDMETHODIMP CMsgrObjectEvents::Invoke( DISPID dispidMember, const IID& iid, LCID, // Localization is not supported. WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* pArgErr) { // g_AddToLog(LOG_LEVEL_FUNCTIONS, _T("CMsgrObjectEvents::Invoke entered")); // g_AddToLog(LOG_LEVEL_NOTIFICATIONS, _T("Dispid passed : %s"), g_GetStringFromDISPID(dispidMember)); HRESULT hr; HRESULT hrRet; if (iid != IID_NULL) { // g_AddToLog(LOG_LEVEL_COM, _T("Invoke call failed -- bad IID")); return DISP_E_UNKNOWNINTERFACE ; } ::SetErrorInfo(0, NULL) ; CComPtr spUser; CComPtr spBuddies; switch (dispidMember) { case DISPID_ONLOGONRESULT: //we should only have one parameter, the result, and that it is a long ASSERT(pDispParams->cArgs == 1); ASSERT(pDispParams->rgvarg->vt == VT_I4); // g_AddToLog(LOG_LEVEL_NOTIFICATIONS, _T("Result passed : %s"), g_GetStringFromLogonResult(pDispParams->rgvarg->lVal)); if(m_pMsgrList) hrRet = m_pMsgrList->EventLogonResult(pDispParams->rgvarg->lVal); break; case DISPID_ONUSERFRIENDLYNAMECHANGERESULT : _ASSERTE(pDispParams->cArgs == 3); _ASSERTE(pDispParams->rgvarg[2].vt == VT_I4); _ASSERTE(pDispParams->rgvarg[1].vt == VT_DISPATCH); //if(lLocalState >= MSTATEOE_LOCAL_FINDING_SERVER) // break; hr = pDispParams->rgvarg[1].pdispVal->QueryInterface(IID_IMsgrUserOE, (LPVOID *)&spUser); if (SUCCEEDED(hr)) { if(m_pMsgrList) hrRet = m_pMsgrList->EventUserNameChanged(spUser); } break; case DISPID_ONLOGOFF: if(m_pMsgrList) hrRet = m_pMsgrList->EventLogoff(); break; case DISPID_ONAPPSHUTDOWN: if(m_pMsgrList) hrRet = m_pMsgrList->EventAppShutdown(); break; case DISPID_ONLISTADDRESULT: // we should have two parameter, HRESULT, and the pMsgrUser // // WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING // The parameters are inversed. This means that the las parameter in the // prototype of the function is the first one in the array received, and so on _ASSERTE(pDispParams->cArgs == 2); _ASSERTE(pDispParams->rgvarg[1].vt == VT_I4); _ASSERTE(pDispParams->rgvarg[0].vt == VT_DISPATCH); hrRet = V_I4(&pDispParams->rgvarg[1]); hr = pDispParams->rgvarg[0].pdispVal->QueryInterface(IID_IMsgrUserOE, (LPVOID *)&spUser); if (SUCCEEDED(hr)) { if( SUCCEEDED(hrRet) ) { // g_AddToLog(LOG_LEVEL_COM, _T("User was added sucessfully.")); if(m_pMsgrList) hrRet = m_pMsgrList->EventUserAdded(spUser); } } else { // g_AddToLog(LOG_LEVEL_COM, _T("QueryInterface for IID_IMsgrUserOE failed")); } break; case DISPID_ONLISTREMOVERESULT: // we should have two parameter, HRESULT, and the pMsgrUser // _ASSERTE(pDispParams->cArgs == 2); _ASSERTE(pDispParams->rgvarg[1].vt == VT_I4); _ASSERTE(pDispParams->rgvarg[0].vt == VT_DISPATCH); hrRet = V_I4(&pDispParams->rgvarg[1]); hr = pDispParams->rgvarg[0].pdispVal->QueryInterface(IID_IMsgrUserOE, (LPVOID *)&spUser); if (SUCCEEDED(hr)) { if( SUCCEEDED(hrRet) ) { // g_AddToLog(LOG_LEVEL_COM, _T("User was removed sucessfully.")); if(m_pMsgrList) hrRet = m_pMsgrList->EventUserRemoved(spUser); } else { // g_AddToLog(LOG_LEVEL_COM, _T("User was not removed due to error %s."), g_GetErrorString(hrRet)); } } else { // g_AddToLog(LOG_LEVEL_COM, _T("QueryInterface for IID_IMsgrUserOE failed")); } break; case DISPID_ONUSERSTATECHANGED: //we should only have two parameters, the previousState and the pMsgrUser ASSERT(pDispParams->cArgs == 2); ASSERT(pDispParams->rgvarg[1].vt == VT_DISPATCH); ASSERT(pDispParams->rgvarg[0].vt == VT_I4); // if(lLocalState >= MSTATEOE_LOCAL_FINDING_SERVER) // break; hr = pDispParams->rgvarg[1].pdispVal->QueryInterface(IID_IMsgrUserOE, (LPVOID *)&spUser); if (SUCCEEDED(hr)) { if(m_pMsgrList) hrRet = m_pMsgrList->EventUserStateChanged(spUser); } break; case DISPID_ONLOCALSTATECHANGERESULT: //we should only have two parameters, hr and the LocalState #if 0 _ASSERTE(pDispParams->cArgs >== 2); _ASSERTE(pDispParams->rgvarg[1].vt == VT_I4); _ASSERTE(pDispParams->rgvarg[0].vt == VT_I4); #endif // 0 // lLocalState = pDispParams->rgvarg[0].lVal; // hrRet = pBlCLientDlg->EventLocalStateChanged(pDispParams->rgvarg[0].lVal); break; } return NOERROR; }