//+--------------------------------------------------------------------------- // // 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 #if DBG // Debug menu commands #include "oncommand_dbg.h" // #endif #include "shutil.h" #include "traymsgs.h" #include //---[ 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