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.
511 lines
14 KiB
511 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
|
|
|
|
#ifdef DBG
|
|
|
|
#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;
|
|
}
|
|
|
|
#endif
|