/* Copyright (c) 1998-1999 Microsoft Corporation Module Name: lease.h Abstract: Definition of the CMdhcpLeaseInfo class Author: */ #ifndef _MDHCP_COM_WRAPPER_LEASE_H_ #define _MDHCP_COM_WRAPPER_LEASE_H_ ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Includes ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Non-class-member helper functions ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // helper functions for date conversions HRESULT DateToLeaseTime(DATE date, LONG * pLeaseTime); HRESULT LeaseTimeToDate(time_t leaseTime, DATE * pDate); ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // Custom critical section / locking stuff ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// class CCritSection { private: CRITICAL_SECTION m_CritSec; BOOL bInitialized; public: CCritSection() : bInitialized( FALSE ) { } ~CCritSection() { if( bInitialized ) { DeleteCriticalSection(&m_CritSec); } } HRESULT Initialize() { if( bInitialized ) { // Already initialized _ASSERT( FALSE ); return S_OK; } // // We have to initialize the critical section // try { InitializeCriticalSection(&m_CritSec); } catch(...) { // Wrong return E_OUTOFMEMORY; } bInitialized = TRUE; return S_OK; } void Lock() { EnterCriticalSection(&m_CritSec); } BOOL TryLock() { return TryEnterCriticalSection(&m_CritSec); } void Unlock() { LeaveCriticalSection(&m_CritSec); } }; ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // CMDhcpLeaseInfo ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// class CMDhcpLeaseInfo : public CComDualImpl, public CComObjectRootEx, public CObjectSafeImpl { ///////////////////////////////////////////////////////////////////////// // Private data members ///////////////////////////////////////////////////////////////////////// private: // For synchronization -- defined above. CCritSection m_CriticalSection; // This is actually a variable length structure, so we must allocate it // dynamically. MCAST_LEASE_INFO * m_pLease; BOOL m_fGotTtl; // TRUE if TTL is meaningful long m_lTtl; // the TTL for this lease (from scope info!) // We also contain request ID info. The clientUID field is dynamically // allocated and must be released on destruction. MCAST_CLIENT_UID m_RequestID; // Pointer to the free threaded marshaler. IUnknown * m_pFTM; // locally allocated lease -- by default this is false BOOL m_fLocal; ///////////////////////////////////////////////////////////////////////// // Private implementation ///////////////////////////////////////////////////////////////////////// private: HRESULT MakeBstrArray(BSTR ** ppbszArray); HRESULT put_RequestID(BSTR pRequestID); ///////////////////////////////////////////////////////////////////////// // Public methods not belonging to any interface ///////////////////////////////////////////////////////////////////////// public: CMDhcpLeaseInfo (void); HRESULT FinalConstruct (void); void FinalRelease (void); ~CMDhcpLeaseInfo(void); // init with values obtained from CreateLeaseInfo HRESULT Initialize( DATE LeaseStartTime, DATE LeaseStopTime, DWORD dwNumAddresses, LPWSTR * ppAddresses, LPWSTR pRequestID, LPWSTR pServerAddress ); // wrap a struct returned from the C API HRESULT Wrap( MCAST_LEASE_INFO * pLease, MCAST_CLIENT_UID * pRequestID, BOOL fGotTtl, long lTtl ); HRESULT GetStruct( MCAST_LEASE_INFO ** ppLease ); HRESULT GetRequestIDBuffer( long lBufferSize, BYTE * pBuffer ); HRESULT GetLocal( BOOL * pfLocal ); HRESULT SetLocal( BOOL fLocal ); ///////////////////////////////////////////////////////////////////////// // General COM stuff ///////////////////////////////////////////////////////////////////////// public: BEGIN_COM_MAP(CMDhcpLeaseInfo) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IMcastLeaseInfo) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pFTM) END_COM_MAP() DECLARE_GET_CONTROLLING_UNKNOWN() ////////////////////////////////////////////////////////////////////////// // IMcastLeaseInfo interface ////////////////////////////////////////////////////////////////////////// public: STDMETHOD (get_RequestID) (BSTR * ppRequestID); STDMETHOD (get_LeaseStartTime) (DATE * pTime); STDMETHOD (put_LeaseStartTime) (DATE time); STDMETHOD (get_LeaseStopTime) (DATE * pTime); STDMETHOD (put_LeaseStopTime) (DATE time); STDMETHOD (get_AddressCount) (long * pCount); STDMETHOD (get_ServerAddress) (BSTR * ppAddress); STDMETHOD (get_TTL) (long * pTTL); STDMETHOD (get_Addresses) (VARIANT * pVariant); STDMETHOD (EnumerateAddresses) (IEnumBstr ** ppEnumAddresses); }; #endif // _MDHCP_COM_WRAPPER_LEASE_H_ // eof