|
|
/*++
Copyright (c) 1997-2000 Microsoft Corporation
Module Name:
rndndnc.h
Abstract:
Definitions for CNDNCDirectory class that handles Non-Domain NC (Whistler ILS) access.
--*/
#ifndef __RNDNDNC_H
#define __RNDNDNC_H
#pragma once
#include "thread.h"
#include "rndobjsf.h"
//
// Constants.
//
// NDNCs only allow up to one "true year" for the TTL, thanks to the RFC.
//
const DWORD NDNC_MAX_TTL = 31557600; const WCHAR NDNC_RTCONFERENCE[] = L"msTAPI-RtConference"; const WCHAR NDNC_RTPERSON[] = L"msTAPI-RtPerson"; const WCHAR NDNC_CONF_DN_FORMAT[] = L"msTAPI-uid=%s,%s"; const WCHAR IPADDRESS_NDNC[] = L"msTAPI-IpAddress"; const WCHAR TAPIUID_NDNC[] = L"msTAPI-uid"; const WCHAR UIDEQUALS_NDNC[] = L"msTAPI-uid=";
const WCHAR SERVICE_DNS_NAME_ATTRIBUTE[] = L"serviceDNSName"; const WCHAR NDNC_SERVICE_PUBLICATION_LOCATION[] = L"CN=DefaultTAPIDirectory,CN=MicrosoftTAPI,CN=System,";
/////////////////////////////////////////////////////////////////////////////
// CNDNCDirectory
/////////////////////////////////////////////////////////////////////////////
template <class T> class ITNDNCDirectoryVtbl : public ITDirectory { };
template <class T> class ITNDNCILSConfigVtbl : public ITILSConfig { };
class CNDNCDirectory : public CComDualImpl<ITNDNCDirectoryVtbl<CNDNCDirectory>, &IID_ITDirectory, &LIBID_RENDLib>, public CComDualImpl<ITNDNCILSConfigVtbl<CNDNCDirectory>, &IID_ITILSConfig, &LIBID_RENDLib>, public ITDynamicDirectory, public CComObjectRootEx<CComObjectThreadModel>, public CObjectSafeImpl {
private: HRESULT AddConferenceComplete( IN BOOL fModify, IN LDAP * ldap, IN TCHAR ** ppDN, IN LDAPMod ** mods );
public:
BEGIN_COM_MAP(CNDNCDirectory) COM_INTERFACE_ENTRY2(IDispatch, ITDirectory) COM_INTERFACE_ENTRY(ITILSConfig) COM_INTERFACE_ENTRY(ITDirectory) COM_INTERFACE_ENTRY(ITDynamicDirectory) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM) END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CNDNCDirectory) DECLARE_GET_CONTROLLING_UNKNOWN()
public:
// ITILSConfig
STDMETHOD (get_Port) ( OUT long *Port );
STDMETHOD (put_Port) ( IN long Port );
// ITDirectory
STDMETHOD (get_DirectoryType) ( OUT DIRECTORY_TYPE * pDirectoryType );
STDMETHOD (get_DisplayName) ( OUT BSTR *ppName );
STDMETHOD (get_IsDynamic) ( OUT VARIANT_BOOL *pfDynamic );
STDMETHOD (get_DefaultObjectTTL) ( OUT long *pTTL // in seconds
);
STDMETHOD (put_DefaultObjectTTL) ( IN long TTL // in sechods
);
STDMETHOD (EnableAutoRefresh) ( IN VARIANT_BOOL fEnable );
STDMETHOD (Connect)( IN VARIANT_BOOL fSecure );
STDMETHOD (Bind) ( IN BSTR pDomainName, IN BSTR pUserName, IN BSTR pPassword, IN long lFlags );
STDMETHOD (AddDirectoryObject) ( IN ITDirectoryObject *pDirectoryObject );
STDMETHOD (ModifyDirectoryObject) ( IN ITDirectoryObject *pDirectoryObject );
STDMETHOD (RefreshDirectoryObject) ( IN ITDirectoryObject *pDirectoryObject );
STDMETHOD (DeleteDirectoryObject) ( IN ITDirectoryObject *pDirectoryObject );
STDMETHOD (get_DirectoryObjects) ( IN DIRECTORY_OBJECT_TYPE DirectoryObjectType, IN BSTR pName, OUT VARIANT * pVariant );
STDMETHOD (EnumerateDirectoryObjects) ( IN DIRECTORY_OBJECT_TYPE DirectoryObjectType, IN BSTR pName, OUT IEnumDirectoryObject ** ppEnumObject );
//
// IDispatch methods
//
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid );
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo, UINT* puArgErr );
// ITDynamicDirectory
STDMETHOD(Update)(DWORD dwSecondsPassed);
public: CNDNCDirectory() : m_Type(DT_ILS), m_pServerName(NULL), m_pServiceDnsName(NULL), m_ldap(NULL), m_pContainer(NULL), m_IsSsl(FALSE), m_TTL(ILS_UPDATE_INTERVAL), m_fAutoRefresh(FALSE), m_dwInterfaceAddress(0), m_pFTM(NULL) {}
virtual HRESULT FinalConstruct(void);
~CNDNCDirectory() { if ( m_pFTM ) { m_pFTM->Release(); }
if (m_ldap) { ldap_unbind(m_ldap); }
delete m_pServerName; delete m_pServiceDnsName; delete m_pContainer;
//
// We new'ed the DN strings in the refresh table. The destructor for
// the table will be called after this destructor and will delete
// the array itself.
//
for ( DWORD i = 0; i < m_RefreshTable.size(); i++ ) { delete m_RefreshTable[i].pDN; } }
HRESULT Init( IN const TCHAR * const strServerName, IN const WORD wPort );
static const WCHAR * RTConferenceAttributeName(int attribute) { return s_RTConferenceAttributes[MeetingAttrIndex(attribute)]; }
static const WCHAR * RTPersonAttributeName(int attribute) { return s_RTPersonAttributes[UserAttrIndex(attribute)]; }
private: HRESULT CrackDnsName( IN WCHAR * pDnsName, OUT WCHAR ** ppDcName );
HRESULT OpenLdapConnection( IN WCHAR * pServerName, IN WORD wPort, OUT LDAP ** phLdap ); HRESULT GetNDNCLocationFromServer( IN WCHAR * pDcServerDnsName ); HRESULT TryServer( IN WORD Port, IN WCHAR * pServiceDnsName );
HRESULT MakeConferenceDN( IN TCHAR * pName, OUT TCHAR ** ppDN );
HRESULT MakeUserCN( IN TCHAR * pName, IN TCHAR * pAddress, OUT TCHAR ** ppCN, OUT DWORD * pdwIP );
HRESULT MakeUserDN( IN TCHAR * pCN, IN DWORD dwIP, OUT TCHAR ** ppDNRTPerson );
HRESULT PublishRTPerson( IN TCHAR * pCN, IN TCHAR * pDN, IN TCHAR * pIPAddress, IN DWORD dwTTL, IN BOOL fModify, IN char * pSD, IN DWORD dwSDSize );
HRESULT AddConference( IN ITDirectoryObject *pDirectoryObject, IN BOOL fModify );
HRESULT TestAclSafety( IN char * pSD, IN DWORD dwSDSize );
HRESULT AddUser( IN ITDirectoryObject *pDirectoryObject, IN BOOL fModify );
HRESULT DeleteConference( IN ITDirectoryObject *pDirectoryObject );
HRESULT DeleteUser( IN ITDirectoryObject *pDirectoryObject );
HRESULT RefreshUser( IN ITDirectoryObject *pDirectoryObject );
HRESULT CreateConference( IN LDAPMessage * pEntry, OUT ITDirectoryObject ** ppObject );
HRESULT CreateUser( IN LDAPMessage * pEntry, IN ITDirectoryObject ** ppObject );
HRESULT SearchObjects( IN DIRECTORY_OBJECT_TYPE DirectoryObjectType, IN BSTR pName, OUT ITDirectoryObject *** pppDirectoryObject, OUT DWORD * dwSize );
HRESULT AddObjectToRefresh( IN WCHAR *pDN, IN long TTL );
HRESULT RemoveObjectToRefresh( IN WCHAR *pDN );
HRESULT DiscoverInterface(void);
HRESULT NDNCSetTTL( IN LDAP * pLdap, IN const WCHAR * pDN, IN DWORD dwTTL );
private: static const WCHAR * const s_RTConferenceAttributes[]; static const WCHAR * const s_RTPersonAttributes[];
CCritSection m_lock;
DIRECTORY_TYPE m_Type; TCHAR * m_pServerName; WCHAR * m_pServiceDnsName; WORD m_wPort;
LDAP * m_ldap; TCHAR * m_pContainer; BOOL m_IsSsl;
long m_TTL; BOOL m_fAutoRefresh; RefreshTable m_RefreshTable;
// the local IP we should use when publishing on this server
// Stored in network byte order.
DWORD m_dwInterfaceAddress;
IUnknown * m_pFTM; // pointer to the free threaded marshaler
};
#endif // __RNDNDNC_H
|