windows-nt/Source/XPSP1/NT/net/mmc/wins/actreg.h
2020-09-26 16:20:57 +08:00

327 lines
8.8 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
actreg.h
WINS active registrations node information.
FILE HISTORY:
*/
#include "loadrecs.h"
#ifndef _ACTREG_H
#define _ACTREG_H
#ifndef _WINSHAND_H
#include "winshand.h"
#endif
#ifndef _WINSDB_H
#include "winsdb.h"
#endif
#ifndef _MULTIP_H
#include "multip.h"
#endif
#ifndef _BUSYDLG_H
#include "..\common\busydlg.h"
#endif
#ifndef _VERIFY_H
#include "verify.h"
#endif
#ifndef _CONFIG_H
#include "config.h"
#endif
typedef struct WinsStrRecord_t
{
int nIndex;
CString strName;
CString strExpiration;
CString strActive;
CString strStatic;
CString strIPAdd;
CString strOwner;
CString strType;
CString strVersion;
} WinsStrRecord;
typedef enum _ACTREG_COL
{
ACTREG_COL_NAME,
ACTREG_COL_TYPE,
ACTREG_COL_IPADDRESS,
ACTREG_COL_STATE,
ACTREG_COL_STATIC,
ACTREG_COL_OWNER,
ACTREG_COL_VERSION,
ACTREG_COL_EXPIRATION,
ACTREG_COL_MAX
};
class CDlgWorkerThread;
typedef CList<WinsStrRecord*,WinsStrRecord*> RecordListBase;
typedef CArray<WINSERVERS, WINSERVERS> WinsServersArray;
class RecordList : public RecordListBase
{
public:
~RecordList()
{
RemoveAllEntries();
}
WinsStrRecord * FindItem(int nIndex)
{
WinsStrRecord * pRec = NULL;
POSITION pos = GetHeadPosition();
while (pos)
{
WinsStrRecord * pCurRec = GetNext(pos);
if (pCurRec->nIndex == nIndex)
{
pRec = pCurRec;
break;
}
}
return pRec;
}
void RemoveAllEntries()
{
// cleanup the list
while (!IsEmpty())
delete RemoveHead();
}
POSITION AddTail(WinsStrRecord * pwsr)
{
// Sets a maximum size. If we hit this we remove the oldest element.
// this works because we always add to the tail of the list.
if ( GetCount() > 500 )
{
delete RemoveHead();
}
return RecordListBase::AddTail(pwsr);
}
};
class CSortWorker : public CDlgWorkerThread
{
public:
CSortWorker(IWinsDatabase * pCurrentDatabase, int nColumn, DWORD dwSortOptions);
~CSortWorker();
void OnDoAction();
private:
IWinsDatabase * m_pCurrentDatabase;
int m_nColumn;
DWORD m_dwSortOptions;
};
/*---------------------------------------------------------------------------
Class: CActiveRegistrationsHandler
---------------------------------------------------------------------------*/
class CActiveRegistrationsHandler : public CMTWinsHandler
{
// Interface
public:
CActiveRegistrationsHandler(ITFSComponentData *pCompData);
~CActiveRegistrationsHandler();
// base handler functionality we override
OVERRIDE_NodeHandler_HasPropertyPages();
OVERRIDE_NodeHandler_CreatePropertyPages();
OVERRIDE_NodeHandler_DestroyHandler();
OVERRIDE_NodeHandler_OnAddMenuItems();
OVERRIDE_NodeHandler_OnCommand();
OVERRIDE_NodeHandler_GetString();
OVERRIDE_BaseHandlerNotify_OnCreateNodeId2();
OVERRIDE_BaseHandlerNotify_OnExpand();
OVERRIDE_BaseResultHandlerNotify_OnResultSelect();
OVERRIDE_BaseResultHandlerNotify_OnResultDelete();
OVERRIDE_BaseResultHandlerNotify_OnResultRefresh();
OVERRIDE_ResultHandler_AddMenuItems();
OVERRIDE_ResultHandler_Command();
OVERRIDE_ResultHandler_OnGetResultViewType();
OVERRIDE_ResultHandler_GetVirtualString();
OVERRIDE_ResultHandler_GetVirtualImage();
OVERRIDE_ResultHandler_CreatePropertyPages();
OVERRIDE_ResultHandler_HasPropertyPages();
// base result handler overridees
STDMETHODIMP CacheHint(int nStartIndex, int nEndIndex);
STDMETHODIMP SortItems(int nColumn,
DWORD dwSortOptions,
LPARAM lUserParam);
HRESULT SetVirtualLbSize(ITFSComponent * pComponent, LONG_PTR data);
// needed for background threading with a QueryObject
virtual void OnHaveData(ITFSNode * pParentNode, LPARAM Data, LPARAM Type);
ITFSQueryObject* OnCreateQuery(ITFSNode * pNode);
// multi select support
virtual const GUID * GetVirtualGuid(int nIndex)
{
return &GUID_WinsActiveRegistrationLeafNodeType;
}
public:
// CWinsHandler overrides
virtual HRESULT InitializeNode(ITFSNode * pNode);
// base result handler overrides
OVERRIDE_BaseHandlerNotify_OnPropertyChange();
OVERRIDE_BaseResultHandlerNotify_OnResultPropertyChange();
virtual int GetImageIndex(BOOL bOpenImage);
void GetServerName(ITFSNode * pNode, CString &strServerName);
HRESULT OnImportLMHOSTS(ITFSNode* pNode);
HRESULT OnExportEntries();
BOOL IsLocalConnection(ITFSNode *pNode);
HRESULT ImportStaticMappingsFile(ITFSNode *pNode, CString strTmpFile,BOOL fDelete);
DWORD RemoteTmp(CString & strDir, CString & strPrefix, CString & strRemoteFile);
HRESULT EditMapping(ITFSNode *pNode, ITFSComponent *pComponent, int nIndex);
HRESULT OnCheckRegNames(ITFSNode* pNode);
HRESULT OnDeleteOwner(ITFSNode* pNode);
void CheckNameConsistency(ITFSNode* pNode, BOOL fVerifyWithPartners);
HRESULT RefreshResults(ITFSNode *pNode);
// helpers
public:
HRESULT OnCreateMapping(ITFSNode *pNode);
HRESULT OnDatabaseLoadStart(ITFSNode *pNode);
HRESULT OnDatabaseLoadStop(ITFSNode *pNode);
HRESULT AddMapping(ITFSNode* pNode);
void GetStateString(DWORD dwState, CString& strType);
void FilterCleanup(ITFSNode *pNode);
void GetVersionInfo(LONG lLowWord, LONG lHighWord, CString& strVers);
void CleanNetBIOSName(LPCSTR lpszSrc,
CString & strDest,
BOOL fExpandChars,
BOOL fTruncate,
BOOL fLanmanCompatible,
BOOL fOemName,
BOOL fWackwack,
int nLength);
PWINSINTF_RECORD_ACTION_T QueryForName(ITFSNode *pNode, PWINSINTF_RECORD_ACTION_T pRecAction, BOOL fStatic = TRUE);
void GetStaticTypeString(DWORD dwState, CString& strStaticType);
DWORD TombstoneRecords(ITFSComponent *pComponent, WinsRecord* pws);
DWORD TombstoneAllRecords(DWORD dwServerIpAddress, ITFSNode * pNode);
HRESULT UpdateRecord(ITFSComponent *pComponenet, WinsRecord *pws, int nDelIndex);
BOOL GetRecordOwner(ITFSNode * pNode, WinsRecord * pWinsRecord);
void GetOwnerInfo(CServerInfoArray & serverInfoArray);
HRESULT BuildOwnerArray(handle_t hBinding);
void SetServer(ITFSNode * pServer) { m_spServerNode.Set(pServer); }
BOOL IsLanManCompatible();
public:
CLoadRecords m_dlgLoadRecords;
SPIWinsDatabase m_spWinsDatabase;
SPITFSNode m_spServerNode;
IWinsDatabase * m_pCurrentDatabase;
CString m_strFindName;
BOOL m_fMatchCase;
BOOL m_fFindNameOrIP; // TRUE for Name
// for the static mapping dialog
CString m_strStaticMappingName;
CString m_strStaticMappingScope;
CStringArray m_strArrayStaticMappingIPAddress;
CString m_strStaticMappingType;
int m_nStaticMappingType;
CDWordArray m_lArrayIPAddress;
CMultipleIpNamePair m_Multiples;
ULONG m_nSelectedIndex;
// for the combobox of Find record
CStringArray m_strFindNamesArray;
NameTypeMapping m_NameTypeMap;
CServerInfoArray * m_pServerInfoArray;
BOOL m_fLoadedOnce;
BOOL m_fFindLoaded;
BOOL m_fDbLoaded;
BOOL m_fForceReload;
// Implementation
private:
void GetServerIP(ITFSNode * pNode, DWORD &dwIP,CString &strIP);
WinsStrRecord * BuildWinsStrRecord(int nIndex);
void DatabaseLoadingCleanup();
HRESULT UpdateListboxCount(ITFSNode * pNode, BOOL bClear = FALSE);
HRESULT UpdateCurrentView(ITFSNode * pNode);
HRESULT UpdateVerbs(ITFSNode * pNode);
BOOL CompareRecName(LPSTR szNewName);
DWORD AddMappingToServer(ITFSNode* pNode,
int nType,
int nCount,
CMultipleIpNamePair& mipnp,
BOOL fEdit = FALSE); // Editing existing mapping?
void AppendScopeName(char* lpName, char* lpAppend);
HRESULT AddToLocalStorage(PWINSINTF_RECORD_ACTION_T pRecAction,ITFSNode* pNode);
HRESULT DeleteRegistration(ITFSComponent * pComponent, int nIndex);
DWORD DeleteMappingFromServer(ITFSComponent * pComponent,WinsRecord *pws,int nIndex);
HRESULT EditMappingToServer(ITFSNode* pNode,
int nType,
int nCount,
CMultipleIpNamePair& mipnp,
BOOL fEdit,
WinsRecord *pRecord); // Editing existing mapping?
void ToString(DWORD dwParam, CString& strParam);
void SetLoadedOnce(ITFSNode * pNode);
private:
CString m_strActiveReg;
CString m_strDesp;
RecordList m_RecList;
WINSDB_STATE m_winsdbState;
WSAData m_WsaData;
SOCKET m_sd;
u_long m_NonBlocking;
struct sockaddr_in myad;
u_short m_uTranID;
char m_pScope[20];
WinsRecord m_CurrentRecord;
CConfiguration m_Config;
};
#endif _ACTREG_H