windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/gal.h
2020-09-26 16:20:57 +08:00

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__