Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

508 lines
14 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: O N C O M M A N D _ D B G . C P P
//
// Contents: Debug command handlers
//
// Notes:
//
// Author: jeffspr 23 Jul 1998
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "foldinc.h" // Standard shell\folder includes
#include "advcfg.h"
#include "conprops.h"
#include "foldres.h"
#include "ncnetcon.h"
#include "oncommand.h"
#include "notify.h"
#include "ctrayui.h"
#include <nctraceui.h>
#if DBG // Debug menu commands
#include "oncommand_dbg.h" //
#endif
#include "shutil.h"
#include "traymsgs.h"
#include <nsres.h>
//---[ Externs ]--------------------------------------------------------------
extern HWND g_hwndTray;
//---[ Globals ]--------------------------------------------------------------
// We allow X number (hardcoded) advises. This is all debug code, so no real
// need to build an expensive STL list
//
const DWORD c_dwMaxNotifyAdvises = 16;
DWORD g_dwCookieCount = 0;
DWORD g_dwAdviseCookies[c_dwMaxNotifyAdvises];
// Used as the caption for all debugging message boxes
//
const WCHAR c_szDebugCaption[] = L"Net Config Debugging";
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugTray
//
// Purpose: Toggle the presence of the tray object
//
// Arguments:
// apidl [in] Ignored
// cidl [in] Ignored
// hwndOwner [in] Ignored
// psf [in] Ignored
//
// Returns:
//
// Author: jeffspr 23 Jul 1998
//
// Notes:
//
HRESULT HrOnCommandDebugTray(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
IOleCommandTarget * pOleCmdTarget = NULL;
// Create an instance of the tray
hr = CoCreateInstance(CLSID_ConnectionTray,
NULL,
CLSCTX_INPROC_SERVER | CLSCTX_NO_CODE_DOWNLOAD,
IID_IOleCommandTarget,
(LPVOID *)&pOleCmdTarget);
TraceHr(ttidError, FAL, hr, FALSE,
"CoCreateInstance(CLSID_ConnectionTray) for IOleCommandTarget");
if (SUCCEEDED(hr))
{
// If the tray object exists, try to remove it.
//
if (g_pCTrayUI)
{
TraceTag(ttidShellFolder, "Removing tray object");
pOleCmdTarget->Exec(&CGID_ShellServiceObject, SSOCMDID_CLOSE, 0, NULL, NULL);
hr = HrRemoveTrayExtension();
}
else
{
// Try to create the tray object
//
TraceTag(ttidShellFolder, "Creating tray object");
pOleCmdTarget->Exec(&CGID_ShellServiceObject, SSOCMDID_OPEN, 0, NULL, NULL);
hr = HrAddTrayExtension();
}
ReleaseObj(pOleCmdTarget);
}
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugTray");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugTracing
//
// Purpose: Command handler for CMIDM_DEBUG_TRACING. It will eventually
// bring up the tracing change dialog.
//
// Arguments:
// apidl [] Ignored
// cidl [] Ignored
// hwndOwner [] Ignored
// psf [] Ignored
//
// Returns:
//
// Author: jeffspr 24 Aug 1998
//
// Notes:
//
HRESULT HrOnCommandDebugTracing(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
hr = HrOpenTracingUI(hwndOwner);
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugTracing");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugNotifyAdd
//
// Purpose: Command handler for CMIDM_DEBUG_NOTIFYADD. Adds an additional
// advise for connection notifications
//
// Arguments:
// apidl [in] Ignored
// cidl [in] Ignored
// hwndOwner [in] Ignored
// psf [in] Ignored
//
// Returns:
//
// Author: jeffspr 24 Aug 1998
//
// Notes:
//
HRESULT HrOnCommandDebugNotifyAdd(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
IConnectionPoint * pConPoint = NULL;
INetConnectionNotifySink * pSink = NULL;
DWORD dwCookie = 0;
if (g_dwCookieCount >= c_dwMaxNotifyAdvises)
{
MessageBox(hwndOwner,
L"You're over the max advise count. If you REALLY need to test more advises than "
L"we've hardcoded, then set c_dwMaxNotifyAdvises to something larger in oncommand_dbg.cpp",
c_szDebugCaption,
MB_OK | MB_ICONERROR);
}
else
{
hr = HrGetNotifyConPoint(&pConPoint);
if (SUCCEEDED(hr))
{
// Create the notify sink
//
hr = CConnectionNotifySink::CreateInstance(
IID_INetConnectionNotifySink,
(LPVOID*)&pSink);
if (SUCCEEDED(hr))
{
Assert(pSink);
hr = pConPoint->Advise(pSink, &dwCookie);
if (SUCCEEDED(hr))
{
WCHAR szMB[256];
g_dwAdviseCookies[g_dwCookieCount++] = dwCookie;
wsprintfW(szMB, L"Advise succeeded. You now have %d active advises", g_dwCookieCount);
MessageBox(hwndOwner,
szMB,
c_szDebugCaption,
MB_OK | MB_ICONEXCLAMATION);
}
ReleaseObj(pSink);
}
ReleaseObj(pConPoint);
}
else
{
AssertSz(FALSE, "Couldn't get connection point or sink in HrOnCommandDebugNotifyAdd");
}
}
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugNotifyAdd");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugNotifyRemove
//
// Purpose: Command handler for CMIDM_DEBUG_NOTIFYREMOVE
//
// Arguments:
// apidl [] Ignored
// cidl [] Ignored
// hwndOwner [] Ignored
// psf [] Ignored
//
// Returns:
//
// Author: jeffspr 24 Aug 1998
//
// Notes:
//
HRESULT HrOnCommandDebugNotifyRemove(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
IConnectionPoint * pConPoint = NULL;
DWORD dwCookie = 0;
if (g_dwCookieCount == 0)
{
MessageBox(hwndOwner,
L"Hey, you don't have any active advises",
c_szDebugCaption,
MB_OK | MB_ICONERROR);
}
else
{
hr = HrGetNotifyConPoint(&pConPoint);
if (SUCCEEDED(hr))
{
hr = pConPoint->Unadvise(g_dwAdviseCookies[g_dwCookieCount-1]);
if (SUCCEEDED(hr))
{
WCHAR szMB[256];
g_dwAdviseCookies[--g_dwCookieCount] = 0;
wsprintfW(szMB, L"Unadvise succeeded. You have %d remaining advises", g_dwCookieCount);
MessageBox(hwndOwner,
szMB,
c_szDebugCaption,
MB_OK | MB_ICONEXCLAMATION);
}
ReleaseObj(pConPoint);
}
else
{
AssertSz(FALSE, "Couldn't get connection point or sink in HrOnCommandDebugNotifyRemove");
}
}
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugNotifyRemove");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugNotifyTest
//
// Purpose: Command handler for CMIDM_DEBUG_NOTIFYTEST. Runs the
// NotifyTestStart on the ConManDebug interface.
//
// Arguments:
// apidl [] Ignored
// cidl [] Ignored
// hwndOwner [] Ignored
// psf [] Ignored
//
// Returns:
//
// Author: jeffspr 24 Aug 1998
//
// Notes:
//
HRESULT HrOnCommandDebugNotifyTest(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
INetConnectionManagerDebug * pConManDebug = NULL;
hr = HrCreateInstance(
CLSID_ConnectionManager,
CLSCTX_LOCAL_SERVER | CLSCTX_NO_CODE_DOWNLOAD,
&pConManDebug);
TraceHr(ttidError, FAL, hr, FALSE,
"HrCreateInstance(CLSID_ConnectionManager) for INetConnectionManagerDebug");
if (SUCCEEDED(hr))
{
(VOID) pConManDebug->NotifyTestStart();
}
ReleaseObj(pConManDebug);
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugNotifyAdd");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugRefresh
//
// Purpose: Test the flushing of the connection cache (does the folder
// still work properly)? This will simulate the current response
// to an external refresh request
//
// Arguments:
// apidl [in] Ignored
// cidl [in] Ignored
// hwndOwner [in] Ignored
// psf [in] Ignored
//
// Returns:
//
// Author: jeffspr 17 Nov 1998
//
// Notes:
//
HRESULT HrOnCommandDebugRefresh(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
TraceFileFunc(ttidShellFolder);
// Force a refresh without having the window to work with.
//
ForceRefresh(NULL);
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugFlushCache");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugRefreshNoFlush
//
// Purpose: Test the building of an external CConnectionList. When this
// is working, it will be used to update the global list.
//
// Arguments:
// apidl [in] Ignored
// cidl [in] Ignored
// hwndOwner [in] Ignored
// psf [in] Ignored
//
// Returns:
//
// Author: jeffspr 17 Nov 1998
//
// Notes:
//
HRESULT HrOnCommandDebugRefreshNoFlush(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
// Refresh the folder. Pass in NULL to let the shell code do it's own
// folder pidl lookup
//
PCONFOLDPIDLFOLDER pidlEmpty;
HRESULT hr = HrForceRefreshNoFlush(pidlEmpty);
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugRefreshNoFlush");
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: HrOnCommandDebugRefreshSelected
//
// Purpose: Refresh the selected connection objects (in place)
//
// Arguments:
// apidl [in] Selected object pidls
// cidl [in] Count of selected objects
// hwndOwner [in] Parent hwnd
// psf [in] Ignored
//
// Returns:
//
// Author: jeffspr 29 Apr 1999
//
// Notes:
//
HRESULT HrOnCommandDebugRefreshSelected(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
PCONFOLDPIDLFOLDER pidlFolder;
if (!apidl.empty())
{
hr = HrGetConnectionsFolderPidl(pidlFolder);
if (SUCCEEDED(hr))
{
PCONFOLDPIDLVEC::const_iterator ulLoop;
for (ulLoop = apidl.begin(); ulLoop != apidl.end(); ulLoop++)
{
const PCONFOLDPIDL& pcfp = *ulLoop;
// If it's not a wizard pidl, then update the
// icon data.
//
if (WIZARD_NOT_WIZARD == pcfp->wizWizard)
{
// Refresh this item -- this will make the desktop shortcuts
// update to the correct state.
//
RefreshFolderItem(pidlFolder, *ulLoop, *ulLoop);
}
}
}
}
TraceHr(ttidError, FAL, hr, FALSE, "HrOnCommandDebugRefreshSelected");
return hr;
}
HRESULT HrOnCommandDebugRemoveTrayIcons(
const PCONFOLDPIDLVEC& apidl,
HWND hwndOwner,
LPSHELLFOLDER psf)
{
HRESULT hr = S_OK;
NOTIFYICONDATA nid;
TraceTag(ttidShellFolder, "In OnMyWMRemoveTrayIcon message handler");
if (g_hwndTray)
{
UINT uiTrayIconId = 0;
// We're going to remove icons until we can't remove icons any more
// If HrShell_NotifyIcon screws up though and is returning S_OK
// on invalid icon ids, make sure that we are able to bail this loop.
// Hence the 10000
//
while (hr == S_OK && uiTrayIconId < 10000)
{
TraceTag(ttidShellFolder, "Attempting to remove icon: %d", uiTrayIconId);
ZeroMemory (&nid, sizeof(nid));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = g_hwndTray;
nid.uID = uiTrayIconId++;
hr = HrShell_NotifyIcon(NIM_DELETE, &nid);
}
g_pCTrayUI->ResetIconCount();
}
TraceHr(ttidShellFolder, FAL, hr, FALSE, "HrOnCommandDebugRemoveTrayIcons");
return hr;
}