232 lines
8.4 KiB
C
232 lines
8.4 KiB
C
|
// File: GAL.h
|
||
|
|
||
|
#ifndef __GAL_h__
|
||
|
#define __GAL_h__
|
||
|
|
||
|
#include "richaddr.h"
|
||
|
|
||
|
#include <mapix.h>
|
||
|
|
||
|
// 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__
|
||
|
|