//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1998 // // File: domain.h // //-------------------------------------------------------------------------- #ifndef _DOMAIN_H #define _DOMAIN_H #include "dnsutil.h" #include "record.h" #include "domainUI.h" /////////////////////////////////////////////////////////////////////////////// // FORWARD DECLARATIONS class CDNSServerNode; class CDNSRecordNodeBase; class CDNSZoneNode; class CDNSRootHintsNode; class CDNS_NS_RecordNodeList; class CDNSRecordNodeEditInfoList; BOOL _match(LPCWSTR lpszNSName, CDNS_A_RecordNode* pARecordNode); ///////////////////////////////////////////////////////////////////////// // CDNSDomainQueryObj class CDNSDomainQueryObj : public CDNSQueryObj { public: CDNSDomainQueryObj(LPCTSTR lpszServerName, LPCTSTR lpszZoneName, DWORD dwServerVersion, LPCTSTR lpszNodeName, LPCTSTR lpszFullNodeName, WORD wRecordType, DWORD dwSelectFlags, BOOL bIsZone, BOOL bReverse, BOOL bCache, BOOL bAdvancedView) : CDNSQueryObj(bAdvancedView, dwServerVersion) { m_szServerName = lpszServerName; m_szZoneName = lpszZoneName; m_szNodeName = lpszNodeName; m_szFullNodeName = lpszFullNodeName; m_wRecordType = wRecordType; m_dwSelectFlags = dwSelectFlags; m_bReverse = bReverse; m_bIsZone = bIsZone; m_bCache = bCache; // internal state variables m_bFirstPass = TRUE; } virtual BOOL Enumerate(); // implementation for DNS domain/zone type BOOL CanAddRecord(WORD wRecordType, LPCWSTR lpszRecordName); BOOL CanAddDomain(LPCWSTR lpszDomainName) { return MatchName(lpszDomainName);} protected: DNS_STATUS EnumerateFiltered(WORD wRecordType); protected: // query parameters (in the sequence expected by CDNSDomainNode::EnumerateNodes) CString m_szNodeName; CString m_szZoneName; CString m_szFullNodeName; WORD m_wRecordType; DWORD m_dwSelectFlags; BOOL m_bIsZone; BOOL m_bReverse; BOOL m_bCache; // query flag to do multiple pass filtered query BOOL m_bFirstPass; }; ///////////////////////////////////////////////////////////////////////// // CDNSDomainNode class CDNSDomainNode : public CDNSMTContainerNode { public: CDNSDomainNode(BOOL bDelegation = FALSE); virtual ~CDNSDomainNode(); // node info DECLARE_NODE_GUID() void SetZone(CDNSZoneNode* pZoneNode){m_pZoneNode = pZoneNode;} virtual CDNSZoneNode* GetZoneNode() { ASSERT(m_pZoneNode != NULL); return m_pZoneNode;} protected: // helpers for setting names void SetFullDNSName(BOOL bIsZone, BOOL bReverse, LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName); void SetDisplayDNSName(BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView, LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName); void ChangePTRRecordsViewOption(BOOL bAdvanced, CComponentDataObject* pComponentDataObject); void OnMultiselectDelete(CComponentDataObject* pComponentData, CNodeList* pNodeList); public: void SetNames(BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView, LPCTSTR lpszNodeName, LPCTSTR lpszParentFullName); virtual HRESULT OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual void OnDelete(CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual BOOL OnRefresh(CComponentDataObject* pComponentData, CNodeList* pNodeList); virtual LPCWSTR GetString(int nCol) { return (nCol == 0) ? GetDisplayName() : g_lpszNullString; } virtual int GetImageIndex(BOOL bOpenImage); virtual LPWSTR GetDescriptionBarText(); virtual BOOL HasPropertyPages(DATA_OBJECT_TYPES type, BOOL* pbHideVerb, CNodeList* pNodeList); virtual HRESULT CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, CNodeList* pNodeList); virtual HRESULT CreatePropertyPagesHelper(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, long nStartPageCode); virtual int Compare(CTreeNode* pNodeA, CTreeNode* pNodeB, int nCol, long lUserParam); virtual void Show(BOOL bShow, CComponentDataObject* pComponentData); virtual RECORD_SEARCH DoesContain(PCWSTR pszFullName, CComponentDataObject* pComponentData, CDNSDomainNode** ppDomainNode, CString& szNonExistentDomain, BOOL bExpandNodes = FALSE); protected: virtual LPCONTEXTMENUITEM2 OnGetContextMenuItemTable() { return CDNSDomainMenuHolder::GetContextMenuItem(); } virtual BOOL OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem2, long *pInsertionAllowed); virtual BOOL OnSetDeleteVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual BOOL OnSetRefreshVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList); virtual HRESULT OnSetToolbarVerbState(IToolbar* pToolbar, CNodeList* pNodeList); // query creation virtual CQueryObj* OnCreateQuery(); // main message handlers for thread messages virtual void OnThreadExitingNotification(CComponentDataObject* pComponentDataObject); virtual void OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject); // command handlers private: void OnNewRecordHelper(CComponentDataObject* pComponentData, WORD wType); protected: HRESULT OnNewRecord(CComponentDataObject* pComponentData, CNodeList* pNodeList); void OnNewDomain(CComponentDataObject* pComponentData); void OnNewDelegation(CComponentDataObject* pComponentData); void OnNewHost(CComponentDataObject* pComponentData); void OnNewAlias(CComponentDataObject* pComponentData); void OnNewMailExchanger(CComponentDataObject* pComponentData); void OnNewPointer(CComponentDataObject* pComponentData); // DNS specific data protected: CString m_szFullName; // FQN for the current zone/domain CDNSZoneNode* m_pZoneNode; // pointer to the zone the domain BOOL m_bHasDataForPropPages; // TRUE if we have enough data to display PPages private: CDNS_NS_RecordNodeList* m_pNSRecordNodeList; // list of cached pointers to NS records // (used for zones and delegated domains) BOOL m_bDelegation; // TRUE of the node is a delegated domain protected: CDNS_NS_RecordNodeList* GetNSRecordNodeList() { ASSERT(m_pNSRecordNodeList != NULL); return m_pNSRecordNodeList; } public: LPCWSTR GetFullName() { return m_szFullName; } BOOL IsZone() { return (CDNSDomainNode*)m_pZoneNode == this; } DWORD GetDefaultTTL(); // subdomain creation CDNSDomainNode* FindSubdomainNode(LPCTSTR lpszSubdomainNode); CDNSDomainNode* CreateSubdomainNode(BOOL bDelegation = FALSE); // create C++ object and hook it up void SetSubdomainName(CDNSDomainNode* pSubdomainNode, LPCTSTR lpszSubdomainName, BOOL bAdvancedView); // set the name of the C++ object DNS_STATUS CreateSubdomain( CDNSDomainNode* pSubdomainNode, CComponentDataObject* pComponentData); // assume the 2 above API's got used DNS_STATUS CreateSubdomain(LPCTSTR lpszDomainName, CComponentDataObject* pComponentData); // one step API using the ones above DNS_STATUS Create(); // from a new C++ node, create on the server // child enumeration static DNS_STATUS EnumerateNodes(LPCTSTR lpszServerName, LPCTSTR lpszZoneName, LPCTSTR lpszNodeName, LPCTSTR lpszFullNodeName, WORD wRecordType, DWORD dwSelectFlag, BOOL bIsZone, BOOL bReverse, BOOL bAdvancedView, CDNSDomainQueryObj* pQuery); public: BOOL IsDelegation() { return m_bDelegation;} // NS records management BOOL HasNSRecords(); void GetNSRecordNodesInfo(CDNSRecordNodeEditInfoList* pNSInfoList); BOOL UpdateNSRecordNodesInfo(CDNSRecordNodeEditInfoList* pNewInfoList, CComponentDataObject* pComponentData); static void FindARecordsFromNSInfo(LPCWSTR lpszServerName, DWORD dwServerVersion, DWORD cServerAddrCount, PIP_ADDRESS pipServerAddrs, LPCWSTR lpszZoneName, LPCWSTR lpszNSName, CDNSRecordNodeEditInfoList* pNSInfoList, BOOL bAdvancedView); virtual void FindARecordsFromNSInfo(LPCTSTR lpszNSName, CDNSRecordNodeEditInfoList* pNSInfoList); protected: virtual void UpdateARecordsOfNSInfo(CDNSRecordNodeEditInfo* pNSInfo, CComponentDataObject* pComponentData); static void UpdateARecordsOfNSInfoHelper(CDNSDomainNode* pDomainNode, CDNSRecordNodeEditInfo* pNSInfo, CComponentDataObject* pComponentData, BOOL bAskConfirmation); protected: // called by OnHaveData() to set cached RR ptrs and generally preprocess RR's virtual void OnHaveRecord(CDNSRecordNodeBase* pRecordNode, CComponentDataObject* pComponentDataObject); private: DNS_STATUS Delete(); DECLARE_TOOLBAR_MAP() }; ///////////////////////////////////////////////////////////////////////// // CDNSDummyDomainNode // // * not multithreaded and hidden in the UI class CDNSDummyDomainNode : public CDNSDomainNode { public: CDNSDummyDomainNode() { m_dwNodeFlags |= TN_FLAG_HIDDEN; } protected: virtual CQueryObj* OnCreateQuery() { // should never be called, only for MT objects ASSERT(FALSE); return NULL; } }; ///////////////////////////////////////////////////////////////////////// // CDNSRootHintsNode // // * exists only if the server is not authoritated for the root // * not multithreaded and hidden in the UI class CDNSRootHintsNode : public CDNSDummyDomainNode { public: CDNSRootHintsNode() { m_szFullName = _T("."); m_szDisplayName = _T("."); } // this "domain" object is not associated to any zone virtual CDNSZoneNode* GetZoneNode() { ASSERT(m_pZoneNode == NULL); return NULL;} DNS_STATUS QueryForRootHints(LPCTSTR lpszServerName, DWORD dwServerVersion); DNS_STATUS InitializeFromDnsQueryData(PDNS_RECORD pRootHintsRecordList); protected: virtual void FindARecordsFromNSInfo(LPCTSTR lpszNSName, CDNSRecordNodeEditInfoList* pNSInfoList); virtual void UpdateARecordsOfNSInfo(CDNSRecordNodeEditInfo* pNSInfo, CComponentDataObject* pComponentData); private: DNS_STATUS Clear(); }; #endif // _DOMAIN_H