/*++ Copyright (C) Microsoft Corporation, 1997 - 1999 Module Name: ciolecmd.cxx Abstract: This file contains the implementation of the IOleCommandTarget interface for receiving events from IE5. Author: Gopal Parupudi Notes: These events are not used on NT5. They are used on Win9x and NT4 platforms. Revision History: GopalP 1/26/1998 Start. --*/ #include #include // This is a source file! // // IOleCommandTarget group for WININET events. // // Should have the IE5 folks put it in a header file. This is moot as this // file is no longer used on any platform. // CLSID CLSID_EVENTGROUP_WININET = { /* ab8ed004-b86a-11d1-b1f8-00c04fa357fa */ 0xab8ed004, 0xb86a, 0x11d1, {0xb1, 0xf8, 0x00, 0xc0, 0x4f, 0xa3, 0x57, 0xfa} }; // // Globals // LONG g_cCommandObj; // Count of active components LONG g_cCommandLock; // Count of Server locks // // Constructors and Destructors // CImpIOleCommandTarget::CImpIOleCommandTarget( void ) : m_cRef(1L) // Add a reference. { InterlockedIncrement(&g_cCommandObj); } CImpIOleCommandTarget::~CImpIOleCommandTarget( void ) { InterlockedDecrement(&g_cCommandObj); } // // Standard QueryInterface // STDMETHODIMP CImpIOleCommandTarget::QueryInterface( REFIID riid, LPVOID *ppv ) { HRESULT hr; DebugTraceGuid("CImpIOleCommandTarget:QueryInterface()", riid); hr = S_OK; *ppv = NULL; // IUnknown if (IsEqualIID(riid, IID_IUnknown)) { *ppv = (IOleCommandTarget *) this; } else // IOleCommandTarget if (IsEqualIID(riid, IID_IOleCommandTarget)) { *ppv = (IOleCommandTarget *) this; } else { hr = E_NOINTERFACE; } if (NULL != *ppv) { ((LPUNKNOWN)*ppv)->AddRef(); } return hr; } // // Standard AddRef and Release // STDMETHODIMP_(ULONG) CImpIOleCommandTarget::AddRef( void ) { return InterlockedIncrement(&m_cRef); } STDMETHODIMP_(ULONG) CImpIOleCommandTarget::Release( void ) { LONG cRefT; SensPrint(SENS_INFO, (SENS_STRING("\t| CImpIOleCommandTarget::Release(m_cRef = %d) called.\n"), m_cRef)); cRefT = InterlockedDecrement((PLONG) &m_cRef); if (0 == m_cRef) { delete this; } return cRefT; } // // IOleCommandTarget Implementation. // STDMETHODIMP CImpIOleCommandTarget::QueryStatus( const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText ) { SensPrint(SENS_INFO, (SENS_STRING("---------------------------------------------------------\n"))); SensPrint(SENS_INFO, (SENS_STRING("CImpIOleCommandTarget::QueryStatus() called\n\n"))); SensPrint(SENS_INFO, (SENS_STRING(" pguidCmdGroup - 0x%x\n"), pguidCmdGroup)); SensPrint(SENS_INFO, (SENS_STRING(" cCmds - 0x%x\n"), cCmds)); SensPrint(SENS_INFO, (SENS_STRING("---------------------------------------------------------\n"))); if (IsEqualGUID(*pguidCmdGroup, CLSID_EVENTGROUP_WININET)) { // Subscribe to WININET events return S_OK; } return(OLECMDERR_E_UNKNOWNGROUP); } STDMETHODIMP CImpIOleCommandTarget::Exec( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut ) { HRESULT hr; hr = S_OK; SensPrint(SENS_INFO, (SENS_STRING("---------------------------------------------------------\n"))); SensPrint(SENS_INFO, (SENS_STRING("CImpIOleCommandTarget::Exec() called\n\n"))); SensPrint(SENS_INFO, (SENS_STRING(" pguidCmdGroup - 0x%x\n"), pguidCmdGroup)); SensPrint(SENS_INFO, (SENS_STRING(" cCmds - 0x%x\n"), nCmdID)); SensPrint(SENS_INFO, (SENS_STRING(" cCmdexecopt - 0x%x\n"), nCmdexecopt)); SensPrint(SENS_INFO, (SENS_STRING("---------------------------------------------------------\n"))); if ( (NULL == pguidCmdGroup) || (FALSE == IsEqualGUID(*pguidCmdGroup, CLSID_EVENTGROUP_WININET))) { return(E_NOTIMPL); } // // Handle WININET events... // switch (nCmdID) { case INETEVT_RAS_CONNECT: ASSERT(VT_BSTR == pvaIn->vt); hr = WininetRasConnect(pvaIn->bstrVal); break; case INETEVT_RAS_DISCONNECT: ASSERT(VT_BSTR == pvaIn->vt); hr = WininetRasDisconnect(pvaIn->bstrVal); break; case INETEVT_ONLINE: hr = WininetOnline(); break; case INETEVT_OFFLINE: hr = WininetOffline(); break; case INETEVT_LOGON: ASSERT(VT_BSTR == pvaIn->vt); hr = WininetLogon(pvaIn->bstrVal); break; case INETEVT_LOGOFF: //ASSERT(VT_BSTR == pvaIn->vt); //hr = WininetLogoff(pvaIn->bstrVal); hr = WininetLogoff(SENS_BSTR("")); break; } // switch return S_OK; } HRESULT WininetRasConnect( BSTR bstrPhonebookEntry ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; ULONG ulIgnore; SENSEVENT_RAS Data; hr = S_OK; SensPrintA(SENS_INFO, ("WininetRasConnect() - RAS Connect Event!\n")); Data.eType = SENS_EVENT_RAS_CONNECT; Data.hConnection = NULL; SensFireEvent(&Data); // Do necessary work here EvaluateConnectivity(TYPE_WAN); return hr; } HRESULT WininetRasDisconnect( BSTR bstrPhonebookEntry ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; ULONG ulIgnore; SENSEVENT_RAS Data; hr = S_OK; SensPrintA(SENS_INFO, ("WininetRasDisconnect() - RAS Disconnect Event!\n")); Data.eType = SENS_EVENT_RAS_DISCONNECT; Data.hConnection = NULL; SensFireEvent(&Data); // Do necessary work here EvaluateConnectivity(TYPE_WAN); return hr; } HRESULT WininetOnline( void ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; hr = S_OK; return hr; } HRESULT WininetOffline( void ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; hr = S_OK; return hr; } HRESULT WininetLogon( BSTR bstrUserName ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; SENS_NOTIFY_WINLOGON Data; hr = S_OK; // // Setup the data. // memset(&Data.Info, 0x0, sizeof(SENS_NOTIFY_WINLOGON)); Data.eType = SENS_EVENT_LOGON; Data.Info.Size = sizeof(WINLOGON_INFO); Data.Info.Flags = 0x0; Data.Info.UserName = bstrUserName; Data.Info.Domain = NULL; Data.Info.WindowStation = NULL; Data.Info.hToken = NULL;; // First order of business - start OneStop if necessary. if (IsAutoSyncEnabled(NULL, AUTOSYNC_ON_STARTSHELL)) { hr = SensNotifyOneStop(NULL, SYNC_MANAGER_LOGON, FALSE); LogMessage((SENSLOGN "SensNotifyOneStop() returned 0x%x\n", hr)); } // Fire the event. SensFireEvent(&Data); return hr; } HRESULT WininetLogoff( BSTR bstrUserName ) /*++ Routine Description: Arguments: Return Value: --*/ { HRESULT hr; SENS_NOTIFY_WINLOGON Data; hr = S_OK; // // Setup the data. // memset(&Data.Info, 0x0, sizeof(SENS_NOTIFY_WINLOGON)); Data.eType = SENS_EVENT_LOGOFF; Data.Info.Size = sizeof(WINLOGON_INFO); Data.Info.Flags = 0x0; Data.Info.UserName = bstrUserName; Data.Info.Domain = NULL; Data.Info.WindowStation = NULL; Data.Info.hToken = NULL;; // First order of business - start OneStop if necessary. if (IsAutoSyncEnabled(NULL, AUTOSYNC_ON_LOGOFF)) { hr = SensNotifyOneStop(NULL, SYNC_MANAGER_LOGOFF, FALSE); LogMessage((SENSLOGN "SensNotifyOneStop() returned 0x%x\n", hr)); } // Fire the event. SensFireEvent(&Data); return hr; }