391 lines
11 KiB
C
391 lines
11 KiB
C
|
/**********************************************************************/
|
||
|
/** Microsoft Windows/NT **/
|
||
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
machine.h
|
||
|
Machine node information.
|
||
|
|
||
|
FILE HISTORY:
|
||
|
Wei Jiang : 5/7/98 --- SECURE_ROUTERINFO
|
||
|
new funciton SecureRouterInfo is added to MachineHandler
|
||
|
|
||
|
*/
|
||
|
|
||
|
#ifndef _MACHINE_H
|
||
|
#define _MACHINE_H
|
||
|
|
||
|
#ifndef _BASEHAND_H
|
||
|
#include "basehand.h"
|
||
|
#endif
|
||
|
|
||
|
#ifndef _BASERTR_H
|
||
|
#include "basertr.h"
|
||
|
#endif
|
||
|
|
||
|
#ifndef _QUERYOBJ_H
|
||
|
#include "queryobj.h"
|
||
|
#endif
|
||
|
|
||
|
#ifndef _INFO_H
|
||
|
#include "info.h"
|
||
|
#endif
|
||
|
|
||
|
#define MACHINE_SYNCHRONIZE_ICON 100
|
||
|
|
||
|
//
|
||
|
// Possible states for the machine information (not necessarily for
|
||
|
// the data in the IRouterInfo).
|
||
|
//
|
||
|
typedef enum _MACHINE_STATES
|
||
|
{
|
||
|
// These are the unloaded states
|
||
|
machine_not_connected, // haven't tried to connect
|
||
|
machine_connecting, // trying to connect
|
||
|
machine_unable_to_connect, // connect failed! unknown reason
|
||
|
machine_access_denied, // connect failed! access denied
|
||
|
machine_bad_net_path, // bad machine name (cannot find the name)
|
||
|
|
||
|
// All states added after this should be considered loaded.
|
||
|
machine_connected, // connected!
|
||
|
|
||
|
// end of valid machine states
|
||
|
// this is a sentinel value, do not use this as a possible
|
||
|
// machine state
|
||
|
machine_enum_end
|
||
|
} MACHINE_STATES;
|
||
|
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Possible service states.
|
||
|
|
||
|
The is orthogonal to our access level (you can read, but not change).
|
||
|
---------------------------------------------------------------------------*/
|
||
|
typedef enum _SERVICE_STATES
|
||
|
{
|
||
|
service_unknown,
|
||
|
service_access_denied,
|
||
|
service_bad_net_path,
|
||
|
service_not_a_server,
|
||
|
service_started,
|
||
|
service_stopped,
|
||
|
service_rasadmin,
|
||
|
|
||
|
// end of valid machine states
|
||
|
// this is a sentinel value, do not use this as a possible
|
||
|
// machine state
|
||
|
service_enum_end
|
||
|
} SERVICE_STATES;
|
||
|
|
||
|
|
||
|
//
|
||
|
// These are the possible states for the IRouterInfo
|
||
|
//
|
||
|
typedef enum _DATA_STATES
|
||
|
{
|
||
|
data_not_loaded, // IRouterInfo not loaded
|
||
|
data_unable_to_load, // Unable to connect to the server
|
||
|
data_loading, // Still loading
|
||
|
data_loaded // IRouterInfo::Load() succeeded
|
||
|
} DATA_STATES;
|
||
|
|
||
|
// forward declartions
|
||
|
class RouterAdminConfigStream;
|
||
|
struct SMachineNodeMenu;
|
||
|
class DomainStatusHandler;
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Struct: MachineNodeData
|
||
|
This is machine node specific data. A pointer to this structure is stored
|
||
|
as the machine node user data.
|
||
|
|
||
|
This is an AddRef'd data structure!
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
enum ServerRouterType
|
||
|
{
|
||
|
ServerType_Unknown = 0, // don't know what kind of machine this is.
|
||
|
ServerType_Uninstalled, // NT4 - nothing installed
|
||
|
ServerType_Workstation, // This is a workstation (no admin allowed)
|
||
|
ServerType_Ras, // NT4 (non-Steelhead) (RAS only)
|
||
|
ServerType_Rras, // NT4 Steelhead and NT5 and up.
|
||
|
|
||
|
// This differs from the regular Uninstalled case, this means
|
||
|
// that the bits are there, just that the config needs to get run.
|
||
|
ServerType_RrasUninstalled, // NT5 and up, not installed
|
||
|
};
|
||
|
|
||
|
|
||
|
// forward delaration
|
||
|
struct MachineNodeData;
|
||
|
|
||
|
// Structure used to pass data to callbacks - used as a way of
|
||
|
// avoiding recomputation
|
||
|
struct MachineConfig
|
||
|
{
|
||
|
public:
|
||
|
MachineConfig()
|
||
|
: m_fReachable(FALSE),
|
||
|
m_fNt4(FALSE),
|
||
|
m_fConfigured(FALSE),
|
||
|
m_dwServiceStatus(0),
|
||
|
m_fLocalMachine(FALSE)
|
||
|
{};
|
||
|
|
||
|
MachineConfig& operator= (const MachineConfig& m)
|
||
|
{
|
||
|
|
||
|
m_fReachable = m.m_fReachable;
|
||
|
m_fNt4 = m.m_fNt4;
|
||
|
m_fConfigured = m.m_fConfigured;
|
||
|
m_dwServiceStatus = m.m_dwServiceStatus;
|
||
|
m_fLocalMachine = m.m_fLocalMachine;
|
||
|
|
||
|
return *this;
|
||
|
};
|
||
|
|
||
|
BOOL m_fReachable; // can we connect?
|
||
|
BOOL m_fNt4; // NT4 or not?
|
||
|
BOOL m_fConfigured; // has install been run?
|
||
|
DWORD m_dwServiceStatus; // GetRouterServiceStatus()
|
||
|
BOOL m_fLocalMachine;
|
||
|
|
||
|
// Loads some basic machine config information
|
||
|
HRESULT GetMachineConfig(MachineNodeData *pData);
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
struct MachineNodeData
|
||
|
{
|
||
|
MachineNodeData();
|
||
|
~MachineNodeData();
|
||
|
|
||
|
// AddRef/Release info
|
||
|
ULONG AddRef();
|
||
|
ULONG Release();
|
||
|
LONG m_cRef;
|
||
|
|
||
|
|
||
|
HRESULT Init(LPCTSTR pszMachineName);
|
||
|
|
||
|
HRESULT Merge(const MachineNodeData& data);
|
||
|
|
||
|
// Load/unload/reload/etc....
|
||
|
// Note: Calling Load() twice in a row will not reload
|
||
|
// the data. A refresh requires that an Unload() be called first.
|
||
|
HRESULT Load();
|
||
|
HRESULT Unload();
|
||
|
HRESULT SetDefault();
|
||
|
|
||
|
#ifdef DEBUG
|
||
|
char m_szDebug[32];
|
||
|
#endif
|
||
|
|
||
|
// Static data (this data does not get reloaded)
|
||
|
BOOL m_fLocalMachine;
|
||
|
BOOL m_fAddedAsLocal;
|
||
|
CString m_stMachineName; // name of the machine (duh)
|
||
|
DWORD m_dwServerHandle;
|
||
|
LONG_PTR m_ulRefreshConnId;
|
||
|
MMC_COOKIE m_cookie;
|
||
|
|
||
|
// This data does get reloaded
|
||
|
BOOL m_fExtension;
|
||
|
|
||
|
// Depending on the state of the service, this will return
|
||
|
// the appropriate image index for the service.
|
||
|
LPARAM GetServiceImageIndex();
|
||
|
|
||
|
SERVICE_STATES m_serviceState;
|
||
|
MACHINE_STATES m_machineState;
|
||
|
DATA_STATES m_dataState;
|
||
|
|
||
|
// The m_stState must be kept up-to-date with the machine state
|
||
|
// variable
|
||
|
CString m_stState; // "started", "stopped", ...
|
||
|
|
||
|
|
||
|
CString m_stServerType; // Actually the router version
|
||
|
CString m_stBuildNo; // OS Build no.
|
||
|
DWORD m_dwPortsInUse;
|
||
|
DWORD m_dwPortsTotal;
|
||
|
DWORD m_dwUpTime;
|
||
|
BOOL m_fStatsRetrieved;
|
||
|
BOOL m_fIsServer; // Is this a server or a workstation?
|
||
|
|
||
|
|
||
|
// This is the hProcess of RASADMIN (this is so we only have one running)
|
||
|
HANDLE m_hRasAdmin;
|
||
|
|
||
|
ServerRouterType m_routerType;
|
||
|
RouterVersionInfo m_routerVersion;
|
||
|
|
||
|
MachineConfig m_MachineConfig;
|
||
|
|
||
|
HRESULT FetchServerState(CString& stState);
|
||
|
protected:
|
||
|
HRESULT LoadServerVersion();
|
||
|
};
|
||
|
|
||
|
#define GET_MACHINENODEDATA(pNode) \
|
||
|
((MachineNodeData *) pNode->GetData(TFS_DATA_USER))
|
||
|
#define SET_MACHINENODEDATA(pNode, pData) \
|
||
|
pNode->SetData(TFS_DATA_USER, (LONG_PTR) pData)
|
||
|
|
||
|
DeclareSmartPointer(SPMachineNodeData, MachineNodeData, if(m_p) m_p->Release());
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
Class: MachineHandler
|
||
|
|
||
|
This is the handler for all "server" nodes.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
class MachineHandler :
|
||
|
public BaseRouterHandler
|
||
|
{
|
||
|
public:
|
||
|
void ExpandNode(ITFSNode * pNode,BOOL fExpand);
|
||
|
|
||
|
MachineHandler(ITFSComponentData *pCompData);
|
||
|
~MachineHandler()
|
||
|
{
|
||
|
m_spRouterInfo.Release();
|
||
|
m_spDataObject.Release(); // cached data object
|
||
|
DEBUG_DECREMENT_INSTANCE_COUNTER(MachineHandler);
|
||
|
}
|
||
|
|
||
|
HRESULT Init(LPCTSTR pszMachineName,
|
||
|
RouterAdminConfigStream *pConfigStream,
|
||
|
ITFSNodeHandler* pSumNodeHandler = NULL,
|
||
|
ITFSNode* pSumNode = NULL );
|
||
|
|
||
|
// Override QI to handle embedded interface
|
||
|
STDMETHOD(QueryInterface)(REFIID iid, LPVOID *ppv);
|
||
|
|
||
|
// Embedded interface to deal with refresh callbacks
|
||
|
DeclareEmbeddedInterface(IRtrAdviseSink, IUnknown)
|
||
|
|
||
|
//
|
||
|
// base handler functionality we override
|
||
|
//
|
||
|
OVERRIDE_NodeHandler_GetString();
|
||
|
|
||
|
OVERRIDE_NodeHandler_CreatePropertyPages();
|
||
|
OVERRIDE_NodeHandler_HasPropertyPages();
|
||
|
OVERRIDE_NodeHandler_OnAddMenuItems();
|
||
|
OVERRIDE_NodeHandler_OnCommand();
|
||
|
|
||
|
// result handler overrides -- result pane message
|
||
|
OVERRIDE_BaseResultHandlerNotify_OnResultSelect();
|
||
|
|
||
|
OVERRIDE_ResultHandler_AddMenuItems();
|
||
|
OVERRIDE_ResultHandler_Command();
|
||
|
OVERRIDE_ResultHandler_OnGetResultViewType();
|
||
|
OVERRIDE_ResultHandler_UserResultNotify();
|
||
|
|
||
|
//
|
||
|
// override to provide the specific RouterInfo Dataobject
|
||
|
//
|
||
|
OVERRIDE_NodeHandler_OnCreateDataObject();
|
||
|
|
||
|
//
|
||
|
// override to clean up our per-node data structures
|
||
|
//
|
||
|
OVERRIDE_NodeHandler_DestroyHandler();
|
||
|
|
||
|
OVERRIDE_NodeHandler_UserNotify();
|
||
|
|
||
|
//
|
||
|
// Notification overrides (not part of an interface)
|
||
|
//
|
||
|
OVERRIDE_BaseHandlerNotify_OnExpand();
|
||
|
OVERRIDE_BaseHandlerNotify_OnExpandSync();
|
||
|
OVERRIDE_BaseHandlerNotify_OnDelete();
|
||
|
|
||
|
OVERRIDE_BaseResultHandlerNotify_OnResultRefresh();
|
||
|
|
||
|
HRESULT ConstructNode(ITFSNode *pNode, LPCTSTR szMachine, MachineNodeData *pData);
|
||
|
|
||
|
//
|
||
|
OVERRIDE_BaseResultHandlerNotify_OnResultShow();
|
||
|
//
|
||
|
|
||
|
|
||
|
// Structure used to pass data to callbacks - used as a way of
|
||
|
// avoiding recomputation
|
||
|
struct SMenuData
|
||
|
{
|
||
|
SPITFSNode m_spNode;
|
||
|
SPIRouterInfo m_spRouterInfo;
|
||
|
|
||
|
MachineConfig * m_pMachineConfig;
|
||
|
};
|
||
|
|
||
|
HRESULT OnNewRtrRASConfigWiz(ITFSNode *pNode, BOOL fTest);
|
||
|
|
||
|
static ULONG MachineRtrConfWizFlags(const SRouterNodeMenu *pMenuData,
|
||
|
INT_PTR pData /* SMenuData * */);
|
||
|
static ULONG GetAutoRefreshFlags(const SRouterNodeMenu *pMenuData,
|
||
|
INT_PTR pData /* SMenuData * */);
|
||
|
static ULONG GetPauseFlags(const SRouterNodeMenu *pMenuData,
|
||
|
INT_PTR pData /* SMenuData * */);
|
||
|
|
||
|
HRESULT SetExternalRefreshObject(IRouterRefresh *pRefresh);
|
||
|
|
||
|
// This is static so that the other nodes can use it.
|
||
|
static ULONG GetServiceFlags(const SRouterNodeMenu *pMenuData,
|
||
|
INT_PTR pData /* SMenuData * */);
|
||
|
static ULONG QueryService(const SRouterNodeMenu *pMenuData,
|
||
|
INT_PTR pData /* SMenuData * */);
|
||
|
|
||
|
HRESULT ChgService(ITFSNode *pNode, const CString& szServer, ULONG menuId);
|
||
|
HRESULT SynchronizeIcon(ITFSNode *pNode);
|
||
|
|
||
|
|
||
|
HRESULT SetExtensionStatus(ITFSNode * pNode, BOOL bExtension);
|
||
|
|
||
|
// result message view helper
|
||
|
void UpdateResultMessage(ITFSNode * pNode);
|
||
|
|
||
|
protected:
|
||
|
// to postpone the loading of RouterInfo from Init, till it's used
|
||
|
// function SecureRouterInfo is introduced to make sure RouterInfo is Loaded
|
||
|
HRESULT SecureRouterInfo(ITFSNode *pNode, BOOL fShowUI);
|
||
|
|
||
|
|
||
|
// Add remove node update support
|
||
|
HRESULT AddRemoveRoutingInterfacesNode(ITFSNode *, DWORD, DWORD);
|
||
|
HRESULT AddRemovePortsNode(ITFSNode *, DWORD, DWORD);
|
||
|
HRESULT AddRemoveDialinNode(ITFSNode *, DWORD, DWORD);
|
||
|
|
||
|
// RasAdmin.Exe support for Windows NT 4 RAS administration
|
||
|
HRESULT StartRasAdminExe(MachineNodeData *pData);
|
||
|
|
||
|
ITFSNodeHandler* m_pSumNodeHandler;
|
||
|
ITFSNode* m_pSumNode;
|
||
|
|
||
|
BOOL m_bExpanded;
|
||
|
BOOL m_fCreateNewDataObj;
|
||
|
BOOL m_fNoConnectingUI;
|
||
|
BOOL m_bRouterInfoAddedToAutoRefresh;
|
||
|
BOOL m_bMergeRequired;
|
||
|
|
||
|
// This is set to FALSE after the connect in the OnExpand()
|
||
|
// fails. This is a hack to fix the two connect attempts,
|
||
|
// one in the OnExpand() and one in the OnResultShow().
|
||
|
BOOL m_fTryToConnect;
|
||
|
|
||
|
CString m_stNodeTitle;
|
||
|
|
||
|
SPIDataObject m_spDataObject; // cached data object
|
||
|
RouterAdminConfigStream * m_pConfigStream;
|
||
|
DWORD m_EventId;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
#endif _MACHINE_H
|