|
|
/**********************************************************************/ /** 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
|