|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: I C O M T A R G . C P P
//
// Contents: ICommandTarget implementation for IConnectionTray
//
// Notes:
//
// Author: jeffspr 12 Nov 1997
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "foldinc.h" // Standard shell\tray includes
#include "ctrayui.h" // extern for the global tray object
HRESULT CConnectionTray::QueryStatus( IN const GUID * pguidCmdGroup, IN ULONG cCmds, IN OUT OLECMD prgCmds[], IN OUT OLECMDTEXT * pCmdText) { TraceFileFunc(ttidShellFolderIface);
HRESULT hr = E_NOTIMPL;
TraceHr(ttidError, FAL, hr, (hr == E_NOTIMPL), "CConnectionTray::QueryStatus"); return hr; }
HRESULT CConnectionTray::Exec( IN const GUID * pguidCmdGroup, IN DWORD nCmdID, IN DWORD nCmdexecopt, IN VARIANTARG * pvaIn, IN OUT VARIANTARG * pvaOut) { TraceFileFunc(ttidShellFolderIface);
HRESULT hr = S_OK;
// Set the DisableTray flag in netcfg.ini to prevent the network connections
// tray code from executing.
//
if (!FIsDebugFlagSet (dfidDisableTray)) { if (IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject)) { // Handle Shell Service Object notifications here.
switch (nCmdID) { case SSOCMDID_OPEN: TraceTag(ttidShellFolder, "The Net Connections Tray is being initialized"); hr = HrHandleTrayOpen(); break;
case SSOCMDID_CLOSE: TraceTag(ttidShellFolder, "The Net Connections Tray is being destroyed"); hr = HrHandleTrayClose(); break;
default: hr = S_OK; break; } } }
TraceHr(ttidError, FAL, hr, FALSE, "CConnectionTray::Exec"); return hr; }
DWORD WINAPI TrayInitThreadProc(IN LPVOID lpParam) { HRESULT hr = S_OK; BOOL fCoInited = FALSE;
hr = CoInitializeEx (NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); if (SUCCEEDED(hr)) { // We don't care if this is S_FALSE or not, since we'll soon
// overwrite the hr. If it's already initialized, great...
fCoInited = TRUE;
// Create the TrayUI object and save it in a global.
//
Assert(!g_pCTrayUI);
if (!g_pCTrayUI) { g_pCTrayUI = new CTrayUI(); if (!g_pCTrayUI) { hr = E_OUTOFMEMORY; } }
// Initialize the tray UI object
//
if (g_pCTrayUI) { hr = g_pCTrayUI->HrInitTrayUI(); } }
MSG msg; while (GetMessage (&msg, 0, 0, 0)) { DispatchMessage (&msg); }
if (fCoInited) { CoUninitialize(); }
return hr; }
//+---------------------------------------------------------------------------
//
// Member: CConnectionTray::HrHandleTrayOpen
//
// Purpose: Handler for the Net Connections Tray object ::Exec call
// SSOCMDID_OPEN command
//
// Arguments:
// (none)
//
// Returns:
//
// Author: jeffspr 7 Jan 1998
//
// Notes:
//
HRESULT CConnectionTray::HrHandleTrayOpen() { HRESULT hr = S_OK;
// Turn off separate thread for Whistler. The proper way to do this is to register at runtime
// a ShellServiceObject when UI is needed and de-register when not needed, using
#if 0
TraceTag(ttidShellFolder, "Starting tray thread proc"); QueueUserWorkItem(TrayInitThreadProc, NULL, WT_EXECUTELONGFUNCTION); #else
if (SUCCEEDED(hr)) { // We don't care if this is S_FALSE or not, since we'll soon
// overwrite the hr. If it's already initialized, great...
// Create the TrayUI object and save it in a global.
//
Assert(!g_pCTrayUI);
if (!g_pCTrayUI) { g_pCTrayUI = new CTrayUI(); if (!g_pCTrayUI) { hr = E_OUTOFMEMORY; } }
// Initialize the tray UI object
//
if (g_pCTrayUI) { hr = g_pCTrayUI->HrInitTrayUI(); }
// Add the Notify Sink
if (SUCCEEDED(hr)) { g_ccl.EnsureConPointNotifyAdded(); } } #endif
TraceHr(ttidError, FAL, hr, FALSE, "CConnectionTray::HrHandleTrayOpen()"); return hr; }
//+---------------------------------------------------------------------------
//
// Member: CConnectionTray::HrHandleTrayClose
//
// Purpose: Handler for the Net Connections Tray object ::Exec call
// SSOCMDID_CLOSE command
//
// Arguments:
// (none)
//
// Returns:
//
// Author: jeffspr 7 Jan 1998
//
// Notes:
//
HRESULT CConnectionTray::HrHandleTrayClose() { HRESULT hr = S_OK;
g_ccl.EnsureConPointNotifyRemoved();
if (g_pCTrayUI) { // Destroy the tray UI object
//
hr = g_pCTrayUI->HrDestroyTrayUI();
// Check the outcome, and trace it if it failed, but ignore a failure,
// and continue to destroy the object
//
TraceHr(ttidError, FAL, hr, FALSE, "Failed in call to g_pCTrayUI->HrDestroyTrayUI");
// Delete the tray object
//
delete g_pCTrayUI; g_pCTrayUI = NULL;
TraceTag(ttidShellFolder, "Deleted the connections tray object"); }
TraceHr(ttidError, FAL, hr, FALSE, "CConnectionTray::HrHandleTrayClose()"); return hr; }
|