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.
 
 
 
 
 
 

1901 lines
79 KiB

//+---------------------------------------------------------------------------
//
// 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, "<empty>");
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<DWORD>( (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<DWORD>( (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<LPWSTR>(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