//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2001. // // File: L E G A C Y M E N U S . C P P // // Contents: Legacy menu implementation for debug purposes // This is used to double check the new command handler // implementation against the new one. // // Most of the code from the previous cmdhandler.cpp has been // moved to this file. // // Notes: // // Author: deonb 8 Feb 2001 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #ifdef DBG // Make sure this is not called in release mode. #include "foldinc.h" // Standard shell\folder includes #include "foldres.h" // Folder resource IDs #include "nsres.h" #include "cmdtable.h" #include "ncperms.h" // For checking User's rights on actions/menu items #include "cfutils.h" #include "oncommand.h" #include "hnetcfg.h" #include "legacymenus.h" #include "nsclsid.h" #define TRACESTRLEN 65535 //---[ Prototypes ]----------------------------------------------------------- VOID DoMenuItemExceptionLoop( const PCONFOLDPIDLVEC& apidlSelected); VOID DoMenuItemCheckLoop(VOID); bool FEnableConnectDisconnectMenuItem( const PCONFOLDPIDL& pcfp, int iCommandId); HRESULT HrEnableOrDisableMenuItems( HWND hwnd, const PCONFOLDPIDLVEC& apidlSelected, HMENU hmenu, UINT idCmdFirst); BOOL IsBridgeInstalled( VOID); struct ContextMenuEntry { WIZARD wizWizard; NETCON_MEDIATYPE ncm; BOOL fInbound; BOOL fIsDefault; // 1 if currently the default. 0 otherwise. NETCON_STATUS ncs; INT iMenu; INT iVerbMenu; // This flag is set if the context menu is for a shortcut object. INT iDefaultCmd; }; static const ContextMenuEntry c_CMEArray[] = { //wizWizard // | ncm // | | fInbound? // | | | fIsDefault? // | | | | Status (ncs) // | | | | | iMenu // | | | | | | iVerbMenu // | | | | | | | iDefaultCmd // | | | | | | | | // v v v v v v v v // wizard { WIZARD_MNC, NCM_NONE, 0, 0, (NETCON_STATUS)0, MENU_WIZARD, MENU_WIZARD_V, CMIDM_NEW_CONNECTION }, // incoming w/ no clients { WIZARD_NOT_WIZARD, NCM_NONE, 1, 0, NCS_DISCONNECTED, MENU_INCOM_DISCON, MENU_INCOM_DISCON_V, CMIDM_PROPERTIES }, // Note: Temporary hack for CM connections // DEONB: ISSUE: Removing hack for CM connections. This doesn't appear to be used anymore. // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_DISCONNECTED, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_CONNECTED, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 1, NCS_CONNECTED, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 1, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 1, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // { WIZARD_NOT_WIZARD, NCM_NONE, 0, 1, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // lan { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_DISCONNECTED, MENU_LAN_DISCON ,MENU_LAN_DISCON_V,CMIDM_ENABLE }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_CONNECTED, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_DISCONNECTING, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, // DEONB: ISSUE: What on earth is an incoming LAN card??? // { WIZARD_NOT_WIZARD, NCM_LAN, 1, 0, NCS_CONNECTED, MENU_LAN_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, // { WIZARD_NOT_WIZARD, NCM_LAN, 1, 0, NCS_DISCONNECTING, MENU_LAN_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_MEDIA_DISCONNECTED, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_INVALID_ADDRESS, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_HARDWARE_DISABLED, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, // dialup { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_DISCONNECTED, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_CONNECTING, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_CONNECTED, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_DISCONNECTING, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_DISCONNECTED, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_CONNECTING, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_CONNECTED, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_DISCONNECTING, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // dialup inbound { WIZARD_NOT_WIZARD, NCM_PHONE, 1, 0, NCS_CONNECTED, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_PHONE, 1, 0, NCS_DISCONNECTING, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, // isdn { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_DISCONNECTED, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_CONNECTING, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_CONNECTED, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_DISCONNECTING, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 1, 0, NCS_CONNECTED, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 1, 0, NCS_DISCONNECTING, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_DISCONNECTED, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_CONNECTING, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_CONNECTED, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_DISCONNECTING, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // tunnel { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_DISCONNECTED, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_CONNECTING, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_CONNECTED, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_DISCONNECTING, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 1, 0, NCS_CONNECTED, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 1, 0, NCS_DISCONNECTING, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_DISCONNECTED, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_CONNECTING, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_CONNECTED, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_DISCONNECTING, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // direct connect { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_DISCONNECTED, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_CONNECTING, MENU_DIAL_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_CONNECTED, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_DISCONNECTING, MENU_DIAL_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 1, 0, NCS_CONNECTED, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 1, 0, NCS_DISCONNECTING, MENU_INCOM_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL, MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_DISCONNECTED, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_CONNECTING, MENU_DIAL_DISCON_UNSET,MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_CONNECTED, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_DISCONNECTING, MENU_DIAL_CON_UNSET,MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_HARDWARE_NOT_PRESENT, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_HARDWARE_MALFUNCTION, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_HARDWARE_DISABLED, MENU_DIAL_UNAVAIL_UNSET,MENU_DIAL_UNAVAIL_V, CMIDM_PROPERTIES}, // bridge - largely the same as lan { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_DISCONNECTED, MENU_LAN_DISCON, MENU_LAN_DISCON_V, CMIDM_ENABLE }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_CONNECTING, MENU_LAN_DISCON, MENU_LAN_DISCON_V, CMIDM_ENABLE }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_CONNECTED, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_DISCONNECTING, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, // DEONB: ISSUE: What on earth is an incoming bridge??? // { WIZARD_NOT_WIZARD, NCM_BRIDGE, 1, 0, NCS_CONNECTED, MENU_LAN_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, // { WIZARD_NOT_WIZARD, NCM_BRIDGE, 1, 0, NCS_DISCONNECTING, MENU_LAN_CON, MENU_INCOM_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_MEDIA_DISCONNECTED, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_INVALID_ADDRESS, MENU_LAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_HARDWARE_NOT_PRESENT, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_HARDWARE_MALFUNCTION, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_HARDWARE_DISABLED, MENU_LAN_UNAVAIL, MENU_LAN_UNAVAIL_V, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS, 0, 0, NCS_DISCONNECTED, MENU_SARAS_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS, 0, 0, NCS_CONNECTING, MENU_SARAS_DISCON, MENU_DIAL_DISCON_V, CMIDM_CONNECT }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS, 0, 0, NCS_CONNECTED, MENU_SARAS_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS, 0, 0, NCS_DISCONNECTING, MENU_SARAS_CON, MENU_DIAL_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS, 0, 0, NCS_HARDWARE_DISABLED, MENU_SARAS_DISCON, MENU_SARAS_DISCON, CMIDM_PROPERTIES }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_LAN, 0, 0, NCS_DISCONNECTED, MENU_SALAN_DISCON, MENU_LAN_DISCON_V, CMIDM_ENABLE }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_LAN, 0, 0, NCS_CONNECTED, MENU_SALAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_LAN, 0, 0, NCS_DISCONNECTING, MENU_SALAN_CON, MENU_LAN_CON_V, CMIDM_STATUS }, { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_LAN, 0, 0, NCS_HARDWARE_DISABLED, MENU_SALAN_DISCON, MENU_SALAN_DISCON, CMIDM_PROPERTIES }, }; const DWORD g_dwContextMenuEntryCount = celems(c_CMEArray); COMMANDTABLEENTRY g_cteFolderCommands[] = { // command id // | valid when 0 items selected // | | valid when only wizard selected // | | | valid when multiple items selected // | | | | command is currently enabled // | | | | | new state (temp) // | | | | | | // | | | | | | // | | | | | | // | | | | | | // v v v v v v // { CMIDM_NEW_CONNECTION, true, true, true, true, true }, { CMIDM_CONNECT, false, false, false, true, true }, { CMIDM_ENABLE, false, false, false, true, true }, { CMIDM_DISCONNECT, false, false, false, true, true }, { CMIDM_DISABLE, false, false, false, true, true }, { CMIDM_STATUS, false, false, false, true, true }, { CMIDM_CREATE_BRIDGE, true, false, true, true, true }, { CMIDM_ADD_TO_BRIDGE, false, false, true, true, true }, { CMIDM_REMOVE_FROM_BRIDGE, false, false, true, true, true }, { CMIDM_CREATE_SHORTCUT, false, true, false, true, true }, { SFVIDM_FILE_LINK, false, true, false, true, true }, { CMIDM_DELETE, false, false, true, true, true }, { SFVIDM_FILE_DELETE, false, false, true, true, true }, { CMIDM_RENAME, false, false, false, true, true }, { CMIDM_PROPERTIES, false, false, false, true, true }, { SFVIDM_FILE_PROPERTIES, false, false, false, true, true }, { CMIDM_CREATE_COPY, false, false, false, true, true }, { SFVIDM_FILE_RENAME, false, false, false, true, true }, { CMIDM_SET_DEFAULT, false, false, false, true, true }, { CMIDM_UNSET_DEFAULT, false, false, false, true, true }, { CMIDM_FIX, false, false, false, true, true }, { CMIDM_CONMENU_ADVANCED_CONFIG, true, true, false, true, true }, { CMIDM_CONMENU_CREATE_BRIDGE, true, false, true, true, true }, { CMIDM_CONMENU_DIALUP_PREFS, true, true, true, true, true }, { CMIDM_CONMENU_NETWORK_ID, true, true, true, true, true }, { CMIDM_CONMENU_OPTIONALCOMPONENTS, true, true, true, true, true }, { CMIDM_CONMENU_OPERATOR_ASSIST, true, true, true, true, true }, { CMIDM_ARRANGE_BY_NAME, true, true, true, true, true }, { CMIDM_ARRANGE_BY_TYPE, true, true, true, true, true }, { CMIDM_ARRANGE_BY_STATUS, true, true, true, true, true }, { CMIDM_ARRANGE_BY_OWNER, true, true, true, true, true }, { CMIDM_ARRANGE_BY_PHONEORHOSTADDRESS, true, true, true, true, true, }, { CMIDM_ARRANGE_BY_DEVICE_NAME, true, true, true, true, true } }; const DWORD g_nFolderCommandCount = celems(g_cteFolderCommands); //+--------------------------------------------------------------------------- // // Member: HrBuildMenuOldWay // // Purpose: Adds menu items to the specified menu. The menu items should // be inserted in the menu at the position specified by // indexMenu, and their menu item identifiers must be between // the idCmdFirst and idCmdLast parameter values. // // Arguments: // hmenu [in out] Handle to the menu. The handler should specify this // handle when adding menu items // cfpl [in] List of selected PIDLS // hwndOwner [in] Window owner of the menu // cmt [in] Menu type (CMT_OBJECT or CMT_BACKGROUND) // indexMenu [in] Zero-based position at which to insert the first // menu item. // idCmdFirst [in] Min value the handler can specify for a menu item // idCmdLast [in] Max value the handler can specify for a menu item // fVerbsOnly [in] Verb only required // // Returns: // // Author: deonb 8 Feb 2001 // // Notes: // HRESULT HrBuildMenuOldWay(IN OUT HMENU hmenu, IN PCONFOLDPIDLVEC& cfpl, IN HWND hwndOwner, IN CMENU_TYPE cmt, IN UINT indexMenu, IN DWORD idCmdFirst, IN UINT idCmdLast, IN BOOL fVerbsOnly) { TraceFileFunc(ttidMenus); HRESULT hr = S_OK; INT iMenuResourceId = 0; INT iPopupResourceId = 0; QCMINFO qcm = {hmenu, indexMenu, idCmdFirst, idCmdLast}; INT iDefaultCmd = 0; BOOL fValidMenu = FALSE; const PCONFOLDPIDL& pcfp = cfpl[0]; DWORD dwLoop = 0; for (dwLoop = 0; (dwLoop < g_dwContextMenuEntryCount) && !fValidMenu; dwLoop++) { if (c_CMEArray[dwLoop].wizWizard == pcfp->wizWizard) { if (pcfp->wizWizard != WIZARD_NOT_WIZARD) { fValidMenu = TRUE; } else { // If the mediatype is the same // if (pcfp->ncm == c_CMEArray[dwLoop].ncm) { // If the presence of the NCCF_INCOMING_ONLY characteristic (demoted to 0 | 1), // matches the inbound flag // if ((!!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY)) == c_CMEArray[dwLoop].fInbound) { // If not the wizard, then we need to check the state of the connection // as well. // if (pcfp->ncs == c_CMEArray[dwLoop].ncs) { if ((!!(pcfp->dwCharacteristics & NCCF_DEFAULT)) == c_CMEArray[dwLoop].fIsDefault) { fValidMenu = TRUE; } } } } } } if (fValidMenu) { iPopupResourceId = 0; if (fVerbsOnly) { iMenuResourceId = c_CMEArray[dwLoop].iVerbMenu; } else { iMenuResourceId = c_CMEArray[dwLoop].iMenu; } iDefaultCmd = c_CMEArray[dwLoop].iDefaultCmd; } } if (fValidMenu) { MergeMenu(_Module.GetResourceInstance(), iMenuResourceId, iPopupResourceId, (LPQCMINFO)&qcm); // Enable/Disable the menu items as appropriate. Ignore the return from this // as we're getting it for debugging purposes only. // hr = HrEnableOrDisableMenuItems( hwndOwner, cfpl, hmenu, idCmdFirst); if (CMT_OBJECT == cmt) { // $$REVIEW: Find out why I'm only doing this for CMT_OBJECT instead of for background. // Pre-icomtextm|mb combine, mb had this commented out. // SetMenuDefaultItem(hmenu, idCmdFirst + iDefaultCmd, FALSE); } hr = ResultFromShort(qcm.idCmdFirst - idCmdFirst); } else { hr = E_FAIL; } return hr; } static const ContextMenuEntry c_BadBadLegacyImplementationsToIgnore[] = { //wizWizard // | ncm // | | fInbound? // | | | fIsDefault? // | | | | Status (ncs) // | | | | | // v v v v v { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_LAN, 1, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_LAN, 0, 0, NCS_DISCONNECTED, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS,0,0, NCS_CONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_RAS,0,0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_SHAREDACCESSHOST_LAN,0,0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_BRIDGE, 0, 0, NCS_CONNECTING, 0,0,0}, // Disabled "Enable" menu item is also default. // Connection manager { WIZARD_NOT_WIZARD, NCM_NONE, 0, 0, NCS_DISCONNECTED, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_ISDN, 1, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_ISDN, 0, 1, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_DIRECT, 1, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_DIRECT, 0, 1, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_TUNNEL, 1, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_TUNNEL, 0, 1, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_PHONE, 1, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_CONNECTING, 0,0,0}, // Disabled "Connect" menu item is also default. { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 0, NCS_DISCONNECTING, 0,0,0}, // Disabled "Status" menu item is also default. { WIZARD_NOT_WIZARD, NCM_PHONE, 0, 1, NCS_DISCONNECTING, 0,0,0} // Disabled "Status" menu item is also default. }; const DWORD g_dwBadBadLegacyImplementationsToIgnoreCount = celems(c_BadBadLegacyImplementationsToIgnore); //+--------------------------------------------------------------------------- // // Member: IsBadBadLegacyImplementation // // Purpose: Checks against the list of known bad legacy implementations // This is just for the Status field, which we can ignore // // Arguments: // [in] cme Context Menu Entry // // Returns: // none // // Author: deonb 8 Feb 2001 // // Notes: // BOOL IsBadBadLegacyImplementation(const ContextMenuEntry& cme) { for (int x = 0; x < g_dwBadBadLegacyImplementationsToIgnoreCount; x++) { const ContextMenuEntry& bbliti = c_BadBadLegacyImplementationsToIgnore[x]; if ( (cme.wizWizard == bbliti.wizWizard) && (cme.fInbound == bbliti.fInbound) && (cme.fIsDefault == bbliti.fIsDefault) && (cme.ncs == bbliti.ncs) && (cme.ncm == bbliti.ncm) ) { return TRUE; } } return FALSE; } //+--------------------------------------------------------------------------- // // Member: GetMenuAsString // // Purpose: Gets the commands on a menu as a string. // // Arguments: // [in] hMenu Menu // [out] szMenu Menu as a string // // Returns: // none // // Author: deonb 8 Feb 2001 // // Notes: // void GetHMenuAsString(HMENU hMenu, LPSTR lpszMenu) { int cMenuItems = GetMenuItemCount(hMenu); Assert(lpszMenu); if (!cMenuItems) { strcpy(lpszMenu, ""); return; } LPWSTR szTmp = new WCHAR[TRACESTRLEN]; LPSTR szTmp2 = lpszMenu; DWORD dwLen = 0; for (int x = 0; x < cMenuItems; x++) { UINT nMenuID = GetMenuItemID(hMenu, x); GetMenuStringW(hMenu, nMenuID, szTmp, TRACESTRLEN, MF_BYCOMMAND ); UINT uiState = GetMenuState(hMenu, nMenuID, MF_BYCOMMAND ); WCHAR szExtra[MAX_PATH] = {L'\0'}; if (MF_CHECKED & uiState) { wcscat(szExtra, L"MF_CHECKED "); } if (MF_DISABLED & uiState) { wcscat(szExtra, L"MF_DISABLED "); } if (MF_GRAYED & uiState) { wcscat(szExtra, L"MF_GRAYED "); } if (MF_HILITE & uiState) { wcscat(szExtra, L"MF_HILITE "); } if (MF_MENUBARBREAK & uiState) { wcscat(szExtra, L"MF_MENUBARBREAK "); } if (MF_MENUBREAK & uiState) { wcscat(szExtra, L"MF_MENUBREAK "); } if (MF_OWNERDRAW & uiState) { wcscat(szExtra, L"MF_OWNERDRAW "); } if (MF_POPUP & uiState) { wcscat(szExtra, L"MF_POPUP "); } if (MF_SEPARATOR & uiState) { wcscat(szExtra, L"MF_SEPARATOR "); } if (MF_DEFAULT & uiState) { wcscat(szExtra, L"MF_DEFAULT "); } dwLen = sprintf(szTmp2, "\r\n %d. %S=%x (State:%08x = %S)", x+1, szTmp, nMenuID, uiState, szExtra); szTmp2 += dwLen; } AssertSz( (dwLen*2) < TRACESTRLEN, "Buffer overrun"); delete[] szTmp; } //+--------------------------------------------------------------------------- // // Member: TraceMenu // // Purpose: Trace the commands on a menu to the trace window. // // Arguments: // [in] hmenu Menu to be traced // // Returns: // none // // Author: deonb 8 Feb 2001 // // Notes: // void TraceMenu(TRACETAGID ttId, HMENU hMenu) { LPSTR szMenu = new CHAR[TRACESTRLEN]; GetHMenuAsString(hMenu, szMenu); TraceTag(ttId, "%s", szMenu); delete [] szMenu; } #define TRACEMENUS(ttid, hMenu1, hMenu2) \ TraceTag(ttid, "Menu not identical to previous implementation: OLD:"); \ TraceMenu(ttid, hMenu1); \ TraceTag(ttid, "=== vs. NEW: === "); \ TraceMenu(ttid, hMenu2); //+--------------------------------------------------------------------------- // // Member: HrAssertTwoMenusEqual // // Purpose: Asserts that 2 menus are equal by comparing. // 1. Number of items // 2. CmdID of each item // 3. State flags of each item // 4. String of each item // // Arguments: // none // // Returns: // S_OK is succeeded // E_FAIL if not // // Author: deonb 8 Feb 2001 // // Notes: Asserts on failure // HRESULT HrAssertTwoMenusEqual(HMENU hMenu1, HMENU hMenu2, UINT idCmdFirst, BOOL bIgnoreFlags, BOOL fPopupAsserts) { TraceFileFunc(ttidMenus); TRACETAGID ttid = fPopupAsserts ? ttidError : ttidMenus; LPSTR szErr = new CHAR[TRACESTRLEN]; int cMenuItems = GetMenuItemCount(hMenu1); if (cMenuItems != GetMenuItemCount(hMenu2)) { TRACEMENUS(ttid, hMenu1, hMenu2); sprintf(szErr, "Two menus don't have the same number of items"); TraceTag(ttidError, szErr); if (fPopupAsserts) { AssertSz(FALSE, szErr); } delete[] szErr; return E_FAIL; } for (int x = 0; x < cMenuItems; x++) { UINT nMenuID1 = GetMenuItemID(hMenu1, x); UINT nMenuID2 = GetMenuItemID(hMenu2, x); if (nMenuID1 != nMenuID2) { if (!(((nMenuID1-idCmdFirst == CMIDM_CREATE_BRIDGE) || (nMenuID2-idCmdFirst == CMIDM_CREATE_BRIDGE)) && ((nMenuID1-idCmdFirst == CMIDM_ADD_TO_BRIDGE) || (nMenuID2-idCmdFirst == CMIDM_ADD_TO_BRIDGE)) )) // These are equivalent between old & new. { TRACEMENUS(ttid, hMenu1, hMenu2); sprintf(szErr, "Two menus don't have the same nMenuID for item %d", x+1); TraceTag(ttidError, szErr); if (fPopupAsserts) { AssertSz(FALSE, szErr); } delete[] szErr; return E_FAIL; } } WCHAR szMenu1[8192]; WCHAR szMenu2[8192]; GetMenuString(hMenu1, nMenuID1, szMenu1, 8192, MF_BYCOMMAND ); GetMenuString(hMenu2, nMenuID2, szMenu2, 8192, MF_BYCOMMAND ); if (wcscmp(szMenu1, szMenu2)) { TRACEMENUS(ttid, hMenu1, hMenu2); sprintf(szErr, "Two menus don't have the same strings for item %d (%S vs %S)", x+1, szMenu1, szMenu2); TraceTag(ttidError, szErr); if (fPopupAsserts) { AssertSz(FALSE, szErr); } delete[] szErr; return E_FAIL; } UINT uiState1; UINT uiState2; uiState1 = GetMenuState( hMenu1, nMenuID1, MF_BYCOMMAND ); uiState2 = GetMenuState( hMenu2, nMenuID2, MF_BYCOMMAND ); if (bIgnoreFlags) // Ignore Default Flags { uiState1 &= ~MF_DEFAULT; uiState2 &= ~MF_DEFAULT; } if (uiState1 != uiState2) { TRACEMENUS(ttid, hMenu1, hMenu2); sprintf(szErr, "Two menus don't have the same state for item %d (%S) ... %08x vs %08x", x+1, szMenu1, uiState1, uiState2); TraceTag(ttidError, szErr); if (fPopupAsserts) { AssertSz(FALSE, szErr); } delete[] szErr; return E_FAIL; } } delete[] szErr; return S_OK; } //+--------------------------------------------------------------------------- // // Member: HrAssertIntegrityAgainstOldMatrix // // Purpose: Asserts the integrity of the Command Matrix by comparing it // with the old implementation // // Arguments: // none // // Returns: // S_OK is succeeded // E_FAIL if not // // Author: deonb 8 Feb 2001 // // Notes: Asserts on failure // HRESULT HrAssertIntegrityAgainstOldMatrix() { TraceFileFunc(ttidMenus); HRESULT hr = S_OK; CHAR szErr[8192]; for (DWORD x = 0; x < g_cteCommandMatrixCount; x++) { const COMMANDENTRY& cte = g_cteCommandMatrix[x]; if (CMIDM_SEPARATOR == cte.iCommandId) { continue; } if (NCWHEN_TOPLEVEL == cte.dwValidWhen) { continue; // new commands we didn't have previously } if (CMIDM_HOMENET_WIZARD == cte.iCommandId) { continue; // new commands we didn't have previously } if ( (CMIDM_WZCDLG_SHOW == cte.iCommandId) ) { continue; } // Check that the ValidWhen flags match the ones from g_cteFolderCommands BOOL bMatch = FALSE; for (DWORD y = 0; y < g_nFolderCommandCount; y++) { COMMANDTABLEENTRY ctecmp = g_cteFolderCommands[y]; if (cte.iCommandId == ctecmp.iCommandId) { bMatch = TRUE; if (ctecmp.fValidOnMultiple != (!!(cte.dwValidWhen & NCWHEN_MULTISELECT))) { if (cte.iCommandId != CMIDM_FIX) // We know fix is broken in legacy implementation. { sprintf(szErr, "New (row %d) and old (row %d) multiselect fields are inconsistent", x+1, y+1); AssertSz(FALSE, szErr); hr = E_FAIL; } } // We can check for Visible only since Active is always a subset of visible (enforced by HrAssertCommandMatrixIntegrity) if (ctecmp.fValidOnWizardOnly != (!!(cte.dwMediaTypeVisible & NBM_MNC_WIZARD))) { sprintf(szErr, "New (row %d) and old (row %d) wizard select fields are inconsistent", x+1, y+1); AssertSz(FALSE, szErr); hr = E_FAIL; } if (ctecmp.fValidOnZero != (!!(cte.dwValidWhen & NCWHEN_TOPLEVEL))) { sprintf(szErr, "New (row %d) and old (row %d) Zero select fields are inconsistent", x+1, y+1); AssertSz(FALSE, szErr); hr = E_FAIL; } } } if (!bMatch) { sprintf(szErr, "Could not find corresponding entry for (row %d) in old table", x+1); AssertSz(FALSE, szErr); hr = E_FAIL; } } return hr; } //+--------------------------------------------------------------------------- // // Member: HrAssertMenuAgainstOldImplementation // // Purpose: Asserts the integrity of a menu by comparing the old and // new implementations // // Arguments: // none // // Returns: // S_OK is succeeded // E_FAIL if not // // Author: deonb 8 Feb 2001 // // Notes: Asserts on failure // HRESULT HrAssertMenuAgainstOldImplementation(HWND hwndOwner, WIZARD wizWizard, NETCON_STATUS ncs, NETCON_MEDIATYPE ncm, DWORD nccf, LPDWORD pdwFailCount, LPDWORD pdwSucceedCount, DWORD dwPermOutside, DWORD dwPerm) { CConFoldEntry cfe; PCONFOLDPIDL pcfp; BYTE blob[MAX_PATH]; HRESULT hr = cfe.HrInitData( wizWizard, ncm, NCSM_NONE, ncs, &CLSID_ConnectionFolder, // Bogus - but doesn't matter - as long as it's not NULL. &CLSID_ConnectionFolder, // Bogus - but doesn't matter - as long as it's not NULL. nccf, blob, MAX_PATH, L"Test PIDL", NULL, NULL); if (SUCCEEDED(hr)) { hr = cfe.ConvertToPidl(pcfp); } if (SUCCEEDED(hr)) { PCONFOLDPIDLVEC pcfpVec; pcfpVec.push_back(pcfp); UINT idCmdFirst = 1234; UINT idCmdLast = idCmdFirst+1000; BOOL fVerbsOnly = FALSE; HMENU hMenu1 = CreateMenu(); HMENU hMenu2 = CreateMenu(); if ( (hMenu1) && (hMenu2) ) { hr = HrBuildMenuOldWay(hMenu1, pcfpVec, hwndOwner, CMT_OBJECT, 0, idCmdFirst, idCmdLast, fVerbsOnly); if (SUCCEEDED(hr)) { hr = HrBuildMenu(hMenu2, fVerbsOnly, pcfpVec, idCmdFirst); if (SUCCEEDED(hr)) { BOOL bIgnoreFlags = TRUE; hr = HrAssertTwoMenusEqual(hMenu1, hMenu2, idCmdFirst, bIgnoreFlags, FALSE); if (FAILED(hr)) { TraceTag(ttidMenus, " + PIDL of failed menu compare:"); TraceTag(ttidMenus, " + wizWizard = %d\r\n", cfe.GetWizard()); TraceTag(ttidMenus, " + ncm = %d [%s]\r\n", cfe.GetNetConMediaType(), DbgNcm(cfe.GetNetConMediaType())); TraceTag(ttidMenus, " + ncs = %d [%s]\r\n", cfe.GetNetConStatus(), DbgNcs(cfe.GetNetConStatus())); TraceTag(ttidMenus, " + Characteristics = %08x [%s]\r\n", cfe.GetCharacteristics(), DbgNccf(cfe.GetCharacteristics())); TraceTag(ttidMenus, " + Permissions = %d (%d & %d)\r\n", g_dwDbgPermissionsFail, dwPermOutside-1, dwPerm-1); *pdwFailCount++; } else { *pdwSucceedCount++; } } } DestroyMenu(hMenu1); DestroyMenu(hMenu2); hr = S_OK; } } TraceHr(ttidError, FAL, hr, FALSE, "HrAssertMenuAgainstOldImplementation"); return hr; } extern ULONG g_dwDbgWin2kPoliciesSet; //+--------------------------------------------------------------------------- // // Member: HrAssertAllLegacyMenusAgainstNew // // Purpose: Loads each of the menus from the old Command Matrix, and // Compare with the newer menus // // Arguments: // [in] hwndOwner Owner window // // Returns: // S_OK is succeeded // E_FAIL if not // // Author: deonb 8 Feb 2001 // // Notes: Asserts on failure // HRESULT HrAssertAllLegacyMenusAgainstNew(HWND hwndOwner) { TraceFileFunc(ttidMenus); HRESULT hr = S_OK; DWORD dwFailCount = 0; DWORD dwSucceedCount = 0; DWORD dwIgnoredCount = 0; CHAR szErr[8192]; const dwHighestPermissionToCheck = NCPERM_Repair+1; // 0; TraceTag(ttidMenus, "Asserting all Menus against their Legacy implementation. This may take a while..."); DWORD dwCurrentCount = 0; DWORD dwTotalCount = 12 * (g_dwContextMenuEntryCount * (1 + ((dwHighestPermissionToCheck+1)*dwHighestPermissionToCheck/2))); // Sum of a series // + ((1 + g_dwContextMenuEntryCount)*(g_dwContextMenuEntryCount))/2; // Multi-select items (sum of series) DWORD dwFrequency = dwTotalCount / 200; dwFrequency = dwFrequency ? dwFrequency : 1; // 0xFFFFFFFF to NCPERM_Repair inclusive. g_dwDbgWin2kPoliciesSet = 1; for (int i = 0; i <= 1; i++, g_dwDbgWin2kPoliciesSet--) { for (DWORD dwPermOutside = 0; dwPermOutside <= dwHighestPermissionToCheck; dwPermOutside++) { for (DWORD dwPerm = dwPermOutside; dwPerm <= dwHighestPermissionToCheck; dwPerm++) { if (dwPerm == dwPermOutside) { if (0 == dwPerm) // 0,0 is interesting - otherwise x,x is dup of x,0 (A | B == A | 0 if A==B) { g_dwDbgPermissionsFail = 0xFFFFFFFF; } else { continue; } } else { if (dwPermOutside) { g_dwDbgPermissionsFail = (1 << (dwPermOutside-1)); } else { g_dwDbgPermissionsFail = 0; } if (dwPerm) { g_dwDbgPermissionsFail |= (1 << (dwPerm-1)); } } for (DWORD x = 0; x < g_dwContextMenuEntryCount; x++) { for (int dwInc = 1; dwInc<= 6; dwInc++) // we compare 6 menus at a time { if ( (dwCurrentCount % dwFrequency) == 0) { TraceTag(ttidMenus, "%d%% done with menu assertions (%d of %d menus compared. Currently using permissions: %08x)", static_cast( (100 * dwCurrentCount) / dwTotalCount), dwCurrentCount, dwTotalCount, g_dwDbgPermissionsFail); } dwCurrentCount++; } const ContextMenuEntry& cme = c_CMEArray[x]; DWORD dwCharacteristics = 0; if (cme.fInbound) { dwCharacteristics |= NCCF_INCOMING_ONLY; } if (cme.fIsDefault) { dwCharacteristics |= NCCF_DEFAULT; } Sleep(0); // Yield to kernel HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); dwCharacteristics |= NCCF_ALLOW_RENAME; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); if (IsMediaLocalType(cme.ncm)) { dwCharacteristics |= NCCF_BRIDGED; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); dwCharacteristics |= NCCF_FIREWALLED; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); } else { dwCharacteristics |= NCCF_ALL_USERS; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); dwCharacteristics |= NCCF_ALLOW_REMOVAL; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); } Sleep(0); // Yield to kernel dwCharacteristics |= NCCF_SHARED; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); dwCharacteristics |= NCCF_FIREWALLED; HrAssertMenuAgainstOldImplementation(hwndOwner, cme.wizWizard, cme.ncs, cme.ncm, dwCharacteristics, &dwFailCount, &dwSucceedCount, dwPermOutside, dwPerm); } } } } g_dwDbgWin2kPoliciesSet = 0xFFFFFFFF; // retore to original value g_dwDbgPermissionsFail = 0xFFFFFFFF; // retore to original value // Now, compare multiple items selected menus: // ***** THIS TEST IS NOT USEFUL. THE LEGACY IMPLEMENTATION SUCKS. COMMENTING OUT FOR NOW ***** // for (DWORD x = 0; x < g_dwContextMenuEntryCount; x++) // { // for (DWORD y = x; y < g_dwContextMenuEntryCount; y++) // { // if ( (dwCurrentCount % dwFrequency) == 0) // { // TraceTag(ttidError, "%d%% done with menu assertions (%d of %d menus compared). Currently multi-comparing %d and %d", static_cast( (100 * dwCurrentCount) / dwTotalCount), dwCurrentCount, dwTotalCount, x, y); // } // dwCurrentCount++; // // const ContextMenuEntry& cme1 = c_CMEArray[x]; // const ContextMenuEntry& cme2 = c_CMEArray[y]; // // DWORD dwCharacteristics1 = 0; // DWORD dwCharacteristics2 = 0; // if (cme1.fInbound) // { // dwCharacteristics1 |= NCCF_INCOMING_ONLY; // } // if (cme2.fInbound) // { // dwCharacteristics2 |= NCCF_INCOMING_ONLY; // } // // if (cme1.fIsDefault) // { // dwCharacteristics1 |= NCCF_DEFAULT; // } // if (cme2.fIsDefault) // { // dwCharacteristics2 |= NCCF_DEFAULT; // } // // CConFoldEntry cfe1, cfe2; // PCONFOLDPIDL pcfp1, pcfp2; // // BYTE blob[MAX_PATH]; // // hr = cfe1.HrInitData( // cme1.wizWizard, cme1.ncm, cme1.ncs, NCS_AUTHENTICATION_SUCCEEDED, &CLSID_ConnectionFolder, &CLSID_ConnectionFolder, // dwCharacteristics1, blob, MAX_PATH, L"Test PIDL", NULL, NULL); // // hr = cfe2.HrInitData( // cme2.wizWizard, cme2.ncm, cme2.ncs, NCS_AUTHENTICATION_SUCCEEDED, &CLSID_ConnectionFolder, &CLSID_ConnectionFolder, // dwCharacteristics2, blob, MAX_PATH, L"Test PIDL", NULL, NULL); // // if (SUCCEEDED(hr)) // { // hr = cfe1.ConvertToPidl(pcfp1); // if (SUCCEEDED(hr)) // { // hr = cfe2.ConvertToPidl(pcfp2); // } // } // // if (SUCCEEDED(hr)) // { // PCONFOLDPIDLVEC pcfpVec; // pcfpVec.push_back(pcfp1); // pcfpVec.push_back(pcfp2); // // UINT idCmdFirst = 1234; // UINT idCmdLast = idCmdFirst+1000; // BOOL fVerbsOnly = FALSE; // // HMENU hMenu1 = CreateMenu(); // HMENU hMenu2 = CreateMenu(); // if ( (hMenu1) && (hMenu2) ) // { // hr = HrBuildMenuOldWay(hMenu1, pcfpVec, hwndOwner, CMT_OBJECT, 0, idCmdFirst, idCmdLast, fVerbsOnly); // // if (SUCCEEDED(hr)) // { // hr = HrBuildMenu(hMenu2, fVerbsOnly, pcfpVec, idCmdFirst); // // if (SUCCEEDED(hr)) // { // BOOL bIgnoreFlags = TRUE; // // Ignore Default flag for multi-compare. The entire legacy implementation is wrong). // // hr = HrAssertTwoMenusEqual(hMenu1, hMenu2, idCmdFirst, bIgnoreFlags, FALSE); // if (FAILED(hr)) // { // TraceTag(ttidError, " + PIDL of failed multi-menu compare:"); // TraceTag(ttidError, " + PIDL 1:"); // TraceTag(ttidError, " + wizWizard = %d\r\n", cfe1.GetWizard()); // TraceTag(ttidError, " + ncm = %d [%s]\r\n", cfe1.GetNetConMediaType(), DBG_NCMAMES[cfe1.GetNetConMediaType()]); // TraceTag(ttidError, " + ncs = %d [%s]\r\n", cfe1.GetNetConStatus(), DBG_NCSNAMES[cfe1.GetNetConStatus()]); // TraceTag(ttidError, " + Characteristics = %08x\r\n", cfe1.GetCharacteristics()); // TraceTag(ttidError, " + Permissions = %d\r\n", g_dwDbgPermissionsFail); // TraceTag(ttidError, " + PIDL 2:"); // TraceTag(ttidError, " + wizWizard = %d\r\n", cfe2.GetWizard()); // TraceTag(ttidError, " + ncm = %d [%s]\r\n", cfe2.GetNetConMediaType(), DBG_NCMAMES[cfe2.GetNetConMediaType()]); // TraceTag(ttidError, " + ncs = %d [%s]\r\n", cfe2.GetNetConStatus(), DBG_NCSNAMES[cfe2.GetNetConStatus()]); // TraceTag(ttidError, " + Characteristics = %08x\r\n", cfe2.GetCharacteristics()); // TraceTag(ttidError, " + Permissions = %d\r\n", g_dwDbgPermissionsFail); // dwFailCount++; // } // else // { // dwSucceedCount++; // } // } // } // // DestroyMenu(hMenu1); // DestroyMenu(hMenu2); // hr = S_OK; // } // } // // TraceHr(ttidError, FAL, hr, FALSE, "HrAssertAllLegacyMenusAgainstNew"); // } // } TraceTag(ttidMenus, "Number of FAILED menu compares: %d", dwFailCount); TraceTag(ttidMenus, "Number of SUCCEEDED menu compares: %d", dwSucceedCount); TraceTag(ttidMenus, "Number of ITEMS in menu array : %d", (g_dwContextMenuEntryCount + 1) * dwHighestPermissionToCheck); sprintf(szErr, "%d of %d menus did not initialize consistend with the old way. (%d initialized correctly. %d was partially ignored due to known bad old implementation)", dwFailCount, dwTotalCount, dwSucceedCount, dwIgnoredCount); AssertSz(FALSE, szErr); return S_OK; } COMMANDCHECKENTRY g_cceFolderCommands[] = { // command id // currently checked // | new check state // | | // v v { CMIDM_CONMENU_OPERATOR_ASSIST, false, false } }; const DWORD g_nFolderCommandCheckCount = celems(g_cceFolderCommands); //+--------------------------------------------------------------------------- // // Function: HrEnableOrDisableMenuItems // // Purpose: Enable, disable, and or check/uncheck menu items depending // on the current selection count, as well as exceptions for // the type and state of the connections themselves // // Arguments: // hwnd [in] Our window handle // apidlSelected [in] Currently selected objects // cPidl [in] Number selected // hmenu [in] Our command menu handle // idCmdFirst [in] First valid command // // Returns: // // Author: jeffspr 2 Feb 1998 // // Notes: // HRESULT HrEnableOrDisableMenuItems( HWND hwnd, const PCONFOLDPIDLVEC& apidlSelected, HMENU hmenu, UINT idCmdFirst) { HRESULT hr = S_OK; DWORD dwLoop = 0; RefreshAllPermission(); // Loop through, and set the new state, based on the selection // count compared to the flags for 0-select and multi-select // for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { // If nothing is selected, then check the current state, and // if different, adjust // if (apidlSelected.size() == 0) { g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnZero; } else { // If singly-selected, then by default, we're always on. // if (apidlSelected.size() == 1) { CONFOLDENTRY ccfe; // Special case this where one item is selected, but it's the // wizard. Use the fValidOnWizardOnly element here. // hr = apidlSelected[0].ConvertToConFoldEntry(ccfe); if (SUCCEEDED(hr)) { if (ccfe.GetWizard()) { g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnWizardOnly; } else { g_cteFolderCommands[dwLoop].fNewState = true; } } } else { // Multi-selected // g_cteFolderCommands[dwLoop].fNewState = g_cteFolderCommands[dwLoop].fValidOnMultiple; } } } // Check for various menu item exceptions. Removed from this // function for readability's sake. // DoMenuItemExceptionLoop(apidlSelected); // Do the check/uncheck loop. // DoMenuItemCheckLoop(); // Update bridge menu item // Check to see if it's a LAN connection. If so, disable // Loop through the array again, and do the actual EnableMenuItem // calls based on the new state compared to the current state. // Update the current state as well // for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { #ifdef SHELL_CACHING_MENU_STATE // The shell is now enabling these for every call. If they switch // to a cached mechanism, change the #define above if (g_cteFolderCommands[dwLoop].fNewState != g_cteFolderCommands[dwLoop].fCurrentlyValid) #endif { DWORD dwCommandId = 0; switch(g_cteFolderCommands[dwLoop].iCommandId) { case SFVIDM_FILE_DELETE: case SFVIDM_FILE_RENAME: case SFVIDM_FILE_LINK: case SFVIDM_FILE_PROPERTIES: dwCommandId = g_cteFolderCommands[dwLoop].iCommandId; break; default: dwCommandId = g_cteFolderCommands[dwLoop].iCommandId + idCmdFirst - CMIDM_FIRST; break; } // Enable or disable the menu item, as appopriate // EnableMenuItem( hmenu, dwCommandId, g_cteFolderCommands[dwLoop].fNewState ? MF_ENABLED | MF_BYCOMMAND : // enable MF_GRAYED | MF_BYCOMMAND); // disable // Set the state to reflect the enabling/graying // g_cteFolderCommands[dwLoop].fCurrentlyValid = g_cteFolderCommands[dwLoop].fNewState; } } // Loop through the checkmark-able command list, and mark the menu // items appropriately // for (dwLoop = 0; dwLoop < g_nFolderCommandCheckCount; dwLoop++) { #ifdef SHELL_CACHING_MENU_STATE if (g_cceFolderCommands[dwLoop].fCurrentlyChecked != g_cceFolderCommands[dwLoop].fNewCheckState) #endif { DWORD dwCommandId = 0; // If we re-add defview menu items that need to be checked/unchecked, // the code below will take care of it for us. Note that we // don't add the idCmdFirst + CMIDM_FIRST as we do with our own // commands // switch(g_cceFolderCommands[dwLoop].iCommandId) // { // case SFVIDM_ARRANGE_AUTO: // dwCommandId = g_cceFolderCommands[dwLoop].iCommandId; // break; // default: // dwCommandId = g_cceFolderCommands[dwLoop].iCommandId + // idCmdFirst - CMIDM_FIRST; // break; dwCommandId = g_cceFolderCommands[dwLoop].iCommandId + idCmdFirst - CMIDM_FIRST; // Check or uncheck the item, as appropriate // CheckMenuItem( hmenu, dwCommandId, g_cceFolderCommands[dwLoop].fNewCheckState ? MF_CHECKED | MF_BYCOMMAND : // checked MF_UNCHECKED | MF_BYCOMMAND); // unchecked // Set the state to reflect the checking/unchecking // g_cceFolderCommands[dwLoop].fCurrentlyChecked = g_cceFolderCommands[dwLoop].fNewCheckState; } } //special handling for the "Create Bridge" menu item //check whether "Create Bridge" exist in the menu BOOL fBgMenuExist = (-1 != GetMenuState(hmenu, CMIDM_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, MF_BYCOMMAND)); BOOL fBgCoMenuExist = (-1 != GetMenuState(hmenu, CMIDM_CONMENU_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, MF_BYCOMMAND)); if (fBgMenuExist || fBgCoMenuExist) { BOOL fRemoveBrdgMenu = FALSE; #ifdef _WIN64 // Homenet technologies are not available at all on IA64 fRemoveBrdgMenu = TRUE; #else // If the machine is Advanced server or data center, delete the bridge menu item OSVERSIONINFOEXW verInfo = {0}; ULONGLONG ConditionMask = 0; verInfo.dwOSVersionInfoSize = sizeof(verInfo); verInfo.wSuiteMask = VER_SUITE_ENTERPRISE; verInfo.wProductType = VER_NT_SERVER; VER_SET_CONDITION(ConditionMask, VER_PRODUCT_TYPE, VER_GREATER_EQUAL); VER_SET_CONDITION(ConditionMask, VER_SUITENAME, VER_AND); fRemoveBrdgMenu = !!(VerifyVersionInfo(&verInfo, VER_PRODUCT_TYPE | VER_SUITENAME, ConditionMask)); #endif if (fRemoveBrdgMenu) { if (fBgMenuExist) { DeleteMenu(hmenu, CMIDM_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, MF_BYCOMMAND); } if (fBgCoMenuExist) { DeleteMenu(hmenu, CMIDM_CONMENU_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, MF_BYCOMMAND); } } else if (IsBridgeInstalled()) // REVIEW can we cache this somehow { //if the bridge is already installed, modify the menu item string MENUITEMINFO MenuItemInfo = {sizeof(MenuItemInfo)}; MenuItemInfo.fMask = MIIM_STRING; MenuItemInfo.fType = MFT_STRING; MenuItemInfo.dwTypeData = const_cast(SzLoadIds(IDS_CMIDM_ADD_TO_BRIDGE)); if (fBgMenuExist) SetMenuItemInfo(hmenu, CMIDM_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, FALSE, &MenuItemInfo); if (fBgCoMenuExist) { MenuItemInfo.fMask = MIIM_STATE; MenuItemInfo.fState = MFS_DISABLED; SetMenuItemInfo(hmenu, CMIDM_CONMENU_CREATE_BRIDGE + idCmdFirst - CMIDM_FIRST, FALSE, &MenuItemInfo); } } } TraceHr(ttidError, FAL, hr, FALSE, "HrEnableOrDisableMenuItems"); return hr; } //+--------------------------------------------------------------------------- // // Function: FEnableConnectDisconnectMenuItem // // Purpose: Enable or disable the connect/disconnect menu item // depending on permissions and the current state of the // connection (already connected, disconnected, in the state // of connecting, etc.) // // Arguments: // pcfp [in] Our pidl // iCommandId [in] CMIDM_CONNECT, CMIDM_ENABLE, CMIDM_DISABLE, or CMIDM_DISCONNECT // // Returns: // // Author: jeffspr 8 Apr 1999 // // Notes: // bool FEnableConnectDisconnectMenuItem(const PCONFOLDPIDL& pcfp, int iCommandId) { bool fEnableAction = false; BOOL fPermissionsValid = false; Assert(!pcfp.empty()); Assert(iCommandId == CMIDM_CONNECT || iCommandId == CMIDM_DISCONNECT || iCommandId == CMIDM_ENABLE || iCommandId == CMIDM_DISABLE); // Make the permissions check based on media type // switch(pcfp->ncm ) { case NCM_BRIDGE: fPermissionsValid = FHasPermissionFromCache(NCPERM_AllowNetBridge_NLA); break; case NCM_SHAREDACCESSHOST_LAN: case NCM_SHAREDACCESSHOST_RAS: fPermissionsValid = FHasPermissionFromCache(NCPERM_ShowSharedAccessUi); break; case NCM_LAN: fPermissionsValid = FHasPermissionFromCache(NCPERM_LanConnect); break; case NCM_DIRECT: case NCM_ISDN: case NCM_PHONE: case NCM_TUNNEL: fPermissionsValid = FHasPermissionFromCache(NCPERM_RasConnect); break; case NCM_NONE: // No media-type, no connect fPermissionsValid = FALSE; break; default: AssertSz(FALSE, "Need to add a switch for this connection type in the menuing code"); break; } if (fPermissionsValid) { switch(pcfp->ncs) { case NCS_CONNECTING: if (iCommandId == CMIDM_CONNECT || iCommandId == CMIDM_ENABLE) { if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY)) { fEnableAction = false; } } break; case NCS_DISCONNECTED: // Don't check for activating because the // default command "Connect" will be disabled. // The code currently handles attempts to connect // to a connected/ing connection. // if (iCommandId == CMIDM_CONNECT || iCommandId == CMIDM_ENABLE) { if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY)) { fEnableAction = true; } } break; case NCS_DISCONNECTING: if (iCommandId == CMIDM_DISCONNECT || iCommandId == CMIDM_DISABLE) { fEnableAction = false; } break; case NCS_CONNECTED: case NCS_MEDIA_DISCONNECTED: case NCS_INVALID_ADDRESS: if (iCommandId == CMIDM_DISCONNECT || iCommandId == CMIDM_DISABLE) { fEnableAction = true; } break; case NCS_HARDWARE_NOT_PRESENT: case NCS_HARDWARE_DISABLED: case NCS_HARDWARE_MALFUNCTION: // Certainly don't support connect/disconnect actions here. break; default: AssertSz(FALSE, "Who invented a new connection state, and when can I horsewhip them?"); break; } } return (fEnableAction); } //+--------------------------------------------------------------------------- // // Function: DoMenuItemExceptionLoop // // Purpose: Check for various menu item exceptions. // // Arguments: // apidlSelected [in] Selected items // cPidl [in] Count of selected items // // Returns: // // Author: jeffspr 26 Feb 1998 // // Notes: // VOID DoMenuItemExceptionLoop(const PCONFOLDPIDLVEC& apidlSelected) { DWORD dwLoop = 0; PCONFOLDPIDLVEC::const_iterator iterObjectLoop; bool fEnableDelete = false; bool fEnableStatus = false; bool fEnableRename = false; bool fEnableShortcut = false; bool fEnableConnect = false; bool fEnableDisconnect = false; bool fEnableCreateCopy = false; bool fEnableProperties = false; bool fEnableCreateBridge = true; bool fEnableFix = true; // Loop through each of the selected objects // for (iterObjectLoop = apidlSelected.begin(); iterObjectLoop != apidlSelected.end(); iterObjectLoop++) { // Validate the pidls // const PCONFOLDPIDL& pcfp = *iterObjectLoop; if ( pcfp.empty() ) { AssertSz(FALSE, "Bogus pidl array in DoMenuItemExceptionLoop (status)"); } else { BOOL fActivating = FALSE; CONFOLDENTRY cfEmpty; (VOID) HrCheckForActivation(pcfp, cfEmpty, &fActivating); // Loop through the commands // for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { // Only allow items to be changed to ENABLED states when they're // previously DISABLED // if (g_cteFolderCommands[dwLoop].fNewState) { int iCommandId = g_cteFolderCommands[dwLoop].iCommandId; switch(iCommandId) { // For status, verify that at least ONE of the entries is connected. // If not, then we don't allow status. // case CMIDM_STATUS: if ( ( fIsConnectedStatus(pcfp->ncs) || (pcfp->ncs == NCS_INVALID_ADDRESS) ) && FHasPermissionFromCache(NCPERM_Statistics)) { // Raid #379459: If logged on as non-admin, disable status if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY) || FIsUserAdmin()) { fEnableStatus = true; } } break; case CMIDM_CREATE_SHORTCUT: case SFVIDM_FILE_LINK: if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY)) { fEnableShortcut = true; } break; // For delete, verify that at least ONE of the entries has removeable // flag set. If not, then disable the command // case CMIDM_DELETE: case SFVIDM_FILE_DELETE: if (pcfp->dwCharacteristics & NCCF_ALLOW_REMOVAL) { // Note: Need to convert this back to using // the DeleteAllUserConnection when that functionality // is added to the System.ADM file. // if (FHasPermissionFromCache(NCPERM_DeleteConnection)) { if (!(pcfp->dwCharacteristics & NCCF_ALL_USERS) || ((pcfp->dwCharacteristics & NCCF_ALL_USERS) && FHasPermissionFromCache(NCPERM_DeleteAllUserConnection))) { fEnableDelete = true; } } } break; // For rename, verify that at least ONE of the entries has the rename // flag set. If not, then disable the command // case CMIDM_RENAME: case SFVIDM_FILE_RENAME: if (pcfp->dwCharacteristics & NCCF_ALLOW_RENAME) { if (HasPermissionToRenameConnection(pcfp)) { fEnableRename = true; } } break; // For duplicate, verify that at least ONE of the entries // has the duplicate flag set and that the user can create // new connections. If not, then disable the command. // case CMIDM_CREATE_COPY: if ((pcfp->dwCharacteristics & NCCF_ALLOW_DUPLICATION) && FHasPermissionFromCache(NCPERM_NewConnectionWizard)) { // In all cases except when the connection is an // all user connection and the user does NOT have // permissions to view all user properties, we'll // allow it to be enabled. // if ((!(pcfp->dwCharacteristics & NCCF_ALL_USERS)) || (FHasPermissionFromCache(NCPERM_RasAllUserProperties))) { fEnableCreateCopy = true; } } break; case CMIDM_CONNECT: case CMIDM_ENABLE: // Raid #379459: If logged on as non-admin, disable connect if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY) || FIsUserAdmin()) { fEnableConnect = FEnableConnectDisconnectMenuItem(pcfp, CMIDM_CONNECT); } break; case CMIDM_DISCONNECT: case CMIDM_DISABLE: // Raid #379459: If logged on as non-admin, disable disconnect if (!(pcfp->dwCharacteristics & NCCF_INCOMING_ONLY) || FIsUserAdmin()) { fEnableDisconnect = FEnableConnectDisconnectMenuItem(pcfp, CMIDM_DISCONNECT); } break; case CMIDM_FIX: fEnableFix = ((NCS_INVALID_ADDRESS == pcfp->ncs || fIsConnectedStatus(pcfp->ncs) ) && FHasPermission(NCPERM_Repair)); break; case CMIDM_PROPERTIES: case SFVIDM_FILE_PROPERTIES: // Raid #379459: If logged on as non-admin, disable properties // We only enable if this is not a LAN connection, or the user has the correct // permissions. That way we don't accidentally give user that doesn't have permission // the ability to do something they shouldn't, either in the case of a call failing or an // unforeseen error occuring. if (IsMediaRASType(pcfp->ncm)) { fEnableProperties = (TRUE == ((pcfp->dwCharacteristics & NCCF_ALL_USERS) ? (FHasPermission(NCPERM_RasAllUserProperties)) : (FHasPermission(NCPERM_RasMyProperties)))); } else // This is a lan connection. { fEnableProperties = true; } case CMIDM_CREATE_BRIDGE: case CMIDM_CONMENU_CREATE_BRIDGE: if((NCCF_BRIDGED | NCCF_FIREWALLED | NCCF_SHARED) & pcfp->dwCharacteristics || NCM_LAN != pcfp->ncm || !FHasPermission(NCPERM_AllowNetBridge_NLA)) { fEnableCreateBridge = false; } break; default: break; } } } } // Loop through the commands, and disable the commands, if appropriate // for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { switch(g_cteFolderCommands[dwLoop].iCommandId) { case CMIDM_RENAME: case SFVIDM_FILE_RENAME: g_cteFolderCommands[dwLoop].fNewState = fEnableRename; break; case CMIDM_DELETE: case SFVIDM_FILE_DELETE: g_cteFolderCommands[dwLoop].fNewState = fEnableDelete; break; case CMIDM_STATUS: g_cteFolderCommands[dwLoop].fNewState = fEnableStatus; break; case CMIDM_CREATE_SHORTCUT: case SFVIDM_FILE_LINK: g_cteFolderCommands[dwLoop].fNewState = fEnableShortcut; break; case CMIDM_CONNECT: case CMIDM_ENABLE: g_cteFolderCommands[dwLoop].fNewState = fEnableConnect; break; case CMIDM_DISCONNECT: case CMIDM_DISABLE: g_cteFolderCommands[dwLoop].fNewState = fEnableDisconnect; break; case CMIDM_FIX: g_cteFolderCommands[dwLoop].fNewState = fEnableFix; break; case CMIDM_CREATE_COPY: g_cteFolderCommands[dwLoop].fNewState = fEnableCreateCopy; break; case CMIDM_PROPERTIES: case SFVIDM_FILE_PROPERTIES: g_cteFolderCommands[dwLoop].fNewState = fEnableProperties; break; case CMIDM_CREATE_BRIDGE: case CMIDM_CONMENU_CREATE_BRIDGE: g_cteFolderCommands[dwLoop].fNewState = fEnableCreateBridge; break; default: break; } } } // Process commands whose state is not controlled by selection // for (dwLoop = 0; dwLoop < g_nFolderCommandCount; dwLoop++) { // Only allow items to be changed to ENABLED states when they're // previously DISABLED // switch(g_cteFolderCommands[dwLoop].iCommandId) { case CMIDM_NEW_CONNECTION: if (!FHasPermissionFromCache(NCPERM_NewConnectionWizard)) { g_cteFolderCommands[dwLoop].fNewState = false; } break; case CMIDM_CONMENU_ADVANCED_CONFIG: if (!FHasPermissionFromCache(NCPERM_AdvancedSettings)) { g_cteFolderCommands[dwLoop].fNewState = false; } break; case CMIDM_CONMENU_OPTIONALCOMPONENTS: if (!FHasPermissionFromCache(NCPERM_AddRemoveComponents)) { g_cteFolderCommands[dwLoop].fNewState = false; } break; case CMIDM_CONMENU_DIALUP_PREFS: if (!FHasPermissionFromCache(NCPERM_DialupPrefs)) { g_cteFolderCommands[dwLoop].fNewState = false; } default: break; } } } //+--------------------------------------------------------------------------- // // Function: DoMenuItemCheckLoop // // Purpose: Walk through the list of checkmark-able commands and get // their values. // // Arguments: // None // // Returns: // // Author: jeffspr 26 Feb 1998 // // Notes: // VOID DoMenuItemCheckLoop(VOID) { DWORD dwLoop = 0; for (; dwLoop < g_nFolderCommandCheckCount; dwLoop++) { switch(g_cceFolderCommands[dwLoop].iCommandId) { // We used to check SFVIDM_AUTO_ARRANGE, but we no longer force it on. // case CMIDM_CONMENU_OPERATOR_ASSIST: g_cceFolderCommands[dwLoop].fNewCheckState = g_fOperatorAssistEnabled; break; default: break; } } } #endif