// File: GAL.h #ifndef __GAL_h__ #define __GAL_h__ #include "richaddr.h" #include // lst.h contains the template list class that we are using #include "lst.h" #include "calv.h" // Various debugging macros to facilitate testing // if the TESTING_CGAL macro is defined as non-zero there // is significant overhaed in exhaustively testing the CGAL stuff... #ifdef _DEBUG #define TESTING_CGAL 1 #else #define TESTING_CGAL 0 #endif // _DEBUG #if TESTING_CGAL #define VERIFYCACHE _VerifyCache( ); #define TESTCGAL _Test(); #else #define VERIFYCACHE #define TESTCGAL #endif // TESTING_CGAL #define CONSTANT( x ) enum{ x } #define MAKE_GAL_ERROR( e ) MAKE_HRESULT( SEVERITY_ERROR, FACILITY_ITF, e ) #define GAL_E_GAL_NOT_FOUND MAKE_GAL_ERROR( 0x0001 ) #define GAL_E_GETROWCOUNT_FAILED MAKE_GAL_ERROR( 0x0002 ) #define GAL_E_SETCOLUMNS_FAILED MAKE_GAL_ERROR( 0x0003 ) #define GAL_E_FINDROW_FAILED MAKE_GAL_ERROR( 0x0004 ) #define GAL_E_SEEKROW_FAILED MAKE_GAL_ERROR( 0x0005 ) #define GAL_E_SEEKROWAPPROX_FAILED MAKE_GAL_ERROR( 0x0006 ) #define GAL_E_CREATEBOOKMARK_FAILED MAKE_GAL_ERROR( 0x0007 ) #define GAL_E_QUERYROWS_FAILED MAKE_GAL_ERROR( 0x0008 ) #define GAL_E_FREEBOOKMARK_FAILED MAKE_GAL_ERROR( 0x0009 ) #define GAL_E_NOINSTANCEKEY MAKE_GAL_ERROR( 0x000a ) #define GAL_E_NOENTRYID MAKE_GAL_ERROR( 0x000b ) // CGAL is the Exchange Global Address List View.... class CGAL : public CALV { public: // Data Types // A CGalEntry holds information about an individual entry in the GAL class CGalEntry { private: LPTSTR m_szName; // PR_DISPLAY_NAME LPTSTR m_szEMail; // PR_ACCOUNT SBinary m_EntryID; // PR_ENTRYID SBinary m_InstanceKey; // PR_INSTANCE_KEY ULONG m_ulDisplayType; // PR_DISPLAY_TYPE LPTSTR m_szBusinessTelephoneNum; // PR_BUSINESS_TELEPHONE_NUMBER; public: // Constructiors / destructiors / initializers / assignment CGalEntry( void ); CGalEntry( const CGalEntry& r ); CGalEntry( LPCTSTR szName, LPCTSTR szEMail, SBinary& rInstanceKey, SBinary& rEntryID, ULONG ulDisplayType, LPCTSTR szBusinessTelephoneNum ); CGalEntry( LPCTSTR szName, LPCTSTR szEMail ); ~CGalEntry( void ); CGalEntry& operator=( const CGalEntry& r ); // Get functions LPCTSTR GetName( void ) const { return m_szName; } LPCTSTR GetEMail( void ) const { return m_szEMail; } LPCTSTR GetBusinessTelephone( void ) const { return m_szBusinessTelephoneNum; } const SBinary& GetInstanceKey( void ) const { return m_InstanceKey; } const SBinary& GetEntryID( void ) const { return m_EntryID; } ULONG GetDisplayType( void ) const { return m_ulDisplayType; } // Comparison Operators bool operator==( const CGalEntry& r ) const; bool operator!=( const CGalEntry& r ) const { return !( *this == r ); } bool operator>=( LPCTSTR sz ) const; bool operator<=( LPCTSTR sz ) const; bool operator<( LPCTSTR sz ) const; }; private: // Static Data enum ePropertyIndices { NAME_PROP_INDEX = 0, ACCOUNT_PROP_INDEX, INSTANCEKEY_PROP_INDEX, ENTRYID_PROP_INDEX, DISPLAY_TYPE_INDEX, BUSINESS_PHONE_NUM_PROP_INDEX, NUM_PROPS }; enum eAsyncLogonState { AsyncLogonState_Idle, AsyncLogonState_LoggingOn, AsyncLogonState_LoggedOn, AsyncLogonState_Error }; CONSTANT( NUM_LISTVIEW_PAGES_IN_CACHE = 15 ); CONSTANT( INVALID_CACHE_INDEX = -1 ); CONSTANT( DefaultMaxCacheSize = 1000 ); CONSTANT( DefaultBlockSize = 50 ); static LPCTSTR msc_szNoDisplayName; static LPCTSTR msc_szNoEMailName; static LPCTSTR msc_szNoBusinessTelephoneNum; static const char* msc_szNMExchangeAtrValue; static const char* msc_szNMPolRegKey; static const char* msc_szDefaultILSServerRegKey; static const char* msc_szDefaultILSServerValue; static const char* msc_szSMTPADDRESSNAME; private: // Data HRESULT m_hrGALError; CGalEntry msc_ErrorEntry_NoGAL; HWND m_hWndListView; // Cache Stuff int m_nBlockSize; lst< CGalEntry* > m_EntryCache; int m_IndexOfFirstItemInCache; int m_IndexOfLastItemInCache; bool m_bBeginningBookmarkIsValid; bool m_bEndBookmarkIsValid; BOOKMARK m_BookmarkOfFirstItemInCache; BOOKMARK m_BookmarkOfItemAfterLastItemInCache; int m_MaxCacheSize; int m_MaxJumpSize; public: // Async globals (public so they can be accessed by static functions) static HINSTANCE m_hInstMapi32DLL; static HANDLE m_hEventEndAsyncThread; static HANDLE m_hAsyncLogOntoGalThread; static eAsyncLogonState m_AsyncLogonState; // Mapi Interfaces static IAddrBook *m_pAddrBook; static IMAPITable *m_pContentsTable; static IMAPIContainer *m_pGAL; static ULONG m_nRows; static BOOL FLoadMapiFns(void); static VOID UnloadMapiFns(void); public: CGAL(); ~CGAL(); // CALV methods virtual VOID ShowItems( HWND hwnd ); virtual VOID ClearItems(void); virtual BOOL GetSzAddress(LPTSTR psz, int cchMax, int iItem); virtual ULONG OnListFindItem( LPCTSTR szPartialMatchingString ); virtual void OnListGetColumn1Data( int iItemIndex, int cchTextMax, LPTSTR szBuf ); virtual void OnListGetColumn2Data( int iItemIndex, int cchTextMax, LPTSTR szBuf ); virtual void OnListGetColumn3Data( int iItemIndex, int cchTextMax, TCHAR* szBuf ); virtual VOID CmdProperties( void ); virtual void OnListCacheHint( int indexFrom, int indexTo ); virtual int OnListGetImageForItem( int iIndex ); virtual bool IsItemBold( int index ); virtual RAI * GetAddrInfo(void); private: // Helper Fns DWORD _GetExchangeAttribute( void ); // Helper fns to get GAL Entries CGalEntry* _GetEntry( int index ); CGalEntry* _GetItemFromCache( int index ); CGalEntry* _GetEntriesAtBeginningOfList( int index ); CGalEntry* _GetEntriesAtEndOfList( int index ); CGalEntry* _LongJumpTo( int index ); bool _CreateEndBookmark( int index, lst< CGalEntry* >::iterator& IEntry ); bool _CreateBeginningBookmark( void ); int _FindItemInCache( LPCTSTR szPartialMatchString ); void _ResetCache( void ); HRESULT _MakeGalEntry( SRow& rRow, CGalEntry** ppEntry ); HRESULT _KillExcessItemsFromFrontOfCache( void ); HRESULT _KillExcessItemsFromBackOfCache( void ); bool _GetSzAddressFromExchangeServer(int iItem, LPTSTR psz, int cchMax); void _CopyPropertyString( LPTSTR psz, SPropValue& rProp, int cchMax ); HRESULT _SetCursorTo( LPCTSTR szPartialMatch ); HRESULT _SetCursorTo( const SBinary& rInstanceKey ); HRESULT _SetCursorTo( const CGalEntry& rEntry ); bool _IsLoggedOn( void ) const { return AsyncLogonState_LoggedOn == m_AsyncLogonState; } HRESULT _GetPhoneNumbers( const SBinary& rEntryID, int* pcPhoneNumbers, LPTSTR** ppszPhoneNums ); HRESULT _GetEmailNames( int* pnEmailNames, LPTSTR** ppszEmailNames, int iItem ); // Async logon/logoff HRESULT _AsyncLogOntoGAL(void); static HRESULT _sAsyncLogOntoGal(void); static HRESULT _sAsyncLogoffGal(void); static DWORD CALLBACK _sAsyncLogOntoGalThreadfn(LPVOID); static HRESULT _sInitListViewAndGalColumns(HWND hwnd); #if TESTING_CGAL void _VerifyCache( void ); void _Test( void ); #endif // #if TESTING_CGAL }; // These should be removed... #define msc_ErrorEntry_FindRowFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_SeekRowFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_SeekRowApproxFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_CreateBookmarkFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_QueryRowsFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_FreeBookmarkFailed msc_ErrorEntry_NoGAL #define msc_ErrorEntry_NoInstanceKeyFound msc_ErrorEntry_NoGAL #endif // __GAL_h__