/**********************************************************************/ /** 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 RecordListBase; typedef CArray 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