ABCTBL.H
/*********************************************************************** 
 * 
 *  ABCTBL.H 
 * 
 *  Definitions for Sample Address Book Contents Table 
 * 
 *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved. 
 * 
 ***********************************************************************/ 
 
 
/* 
 *  BookMark structure 
 */ 
 
#define MAX_BOOKMARKS   10 
 
#define BK_PEGGEDTOEND      ((ULONG)0x00000001) 
 
typedef struct _ABCBK 
{ 
 
    ULONG       ulFlags;            /*  Flags */ 
    FILETIME    filetime;           /*  Time of file when bookmark created */ 
    ULONG       ulPosition;         /*  Position of record in file */ 
    ABCREC      abcrec;             /*  Record associated with this bookmark */ 
 
} ABCBK, *LPABCBK; 
 
 
/* 
 *  _IVTABC is the structure returned to the client when 
 *  the contents table is retrieved from the ab container 
 *  object (ABCONT.C). 
 * 
 *  The first thing in the structure must be a jump table 
 *  with all the IMAPITable methods in it. 
 * 
 */ 
typedef struct _IVTABC 
{ 
    const IVTABC_Vtbl FAR * lpVtbl; 
 
    SAB_IUnkWithLogon; 
     
    /* 
     *  Private data 
     */ 
 
    /*  The list of active columns */ 
    LPSPropTagArray lpPTAColSet; 
 
    /*  HANDLE of file that I'm browsing... */ 
    HANDLE hFile; 
 
    /*  FILETIME time the file was last changed */ 
    FILETIME filetime; 
 
    /*  Size of file */ 
    ULONG ulMaxPos; 
 
    /*  Current position in file */ 
    ULONG ulPosition; 
 
    /*  BookMark array... */ 
    LPABCBK rglpABCBK[MAX_BOOKMARKS]; 
 
    /* 
     *  Restriction stuff 
     */ 
 
    ULONG ulRstrDenom; 
 
    /*  Partial Name to match */ 
    LPSTR lpszPartialName; 
 
    /*  2 bit arrays of what's been checked, and what (of them) matches */ 
    BYTE *rgChecked; 
    BYTE *rgMatched; 
 
    ULONG   ulConnectMic; 
    UINT    cAdvise;                            /* Count of registered notifications */ 
    LPMAPIADVISESINK * parglpAdvise;    /* Registered notifications */ 
    FTG ftg;                                /* Idle function tag */ 
    LPSTR   lpszFileName; 
 
 
} IVTABC, *LPIVTABC; 
 
 
/* 
 *  Record for PR_INSTANCE_KEY.  Need enough information to find the record quickly as 
 *  well as determine if the record is still valid. 
 */ 
typedef struct _abcrecinstance 
{ 
    ULONG ulRecordPosition; 
    FILETIME filetime; 
    char rgchzFileName[1];  /* Get's sized accordingly */ 
 
} ABCRecInstance, FAR * LPABCRecInstance; 
 
 
/* 
 *  Private macros 
 */ 
 
/* Counts the number of bits in a byte */ 
#define CBitsB(b, cbits) {                               \ 
                                                         \ 
        cbits = 0;                                       \ 
                                                         \ 
        cbits = ((b)   & 0x55) + ((b>>1) & 0x55);        \ 
        cbits = (cbits & 0x33) + ((cbits>>2) & 0x33);    \ 
        cbits = (cbits & 0x0f) + (cbits>>4);             \ 
    } 
 
 
 
/* 
 *  Internal abctbl functions 
 */ 
 
HRESULT     HrOpenFile(LPIVTABC lpIVTAbc); 
void        FreeANRBitmaps(LPIVTABC lpIVTAbc); 
HRESULT     HrValidateEntry (LPIVTABC lpIVTAbc, ULONG ulNewPos); 
BOOL        FNameMatch (LPIVTABC lpIVTAbc, LPSTR rgchDisplayName); 
BOOL        FMatched (LPIVTABC lpIVTAbc, ULONG ulNewPos); 
BOOL        FChecked (LPIVTABC lpIVTAbc, ULONG ulNewPos); 
 
 
 
/* 
 *  Default column set 
 */ 
enum {  ivalvtPR_DISPLAY_NAME, 
        ivalvtPR_ENTRYID, 
        ivalvtPR_ADDRTYPE, 
        ivalvtPR_EMAIL_ADDRESS, 
        ivalvtPR_OBJECT_TYPE, 
        ivalvtPR_DISPLAY_TYPE, 
        ivalvtPR_INSTANCE_KEY, 
        cvalvtMax }; 
 
 
 
/* 
 *  Externs defined for use in the three table modules 
 */ 
 
extern const IVTABC_Vtbl vtblIVTABC; 
extern const LPSPropTagArray ptagaivtabcColSet; 
 
/* Parameter Validation*/ 
#define IVTABC_ValidateObject(Method, pThis)                                \ 
{   HRESULT hr;                                                             \ 
    if(IsBadReadPtr(pThis, sizeof(IVTABC)))                                 \ 
    {                                                                       \ 
        hr = ResultFromScode(E_INVALIDARG);                                 \ 
        DebugTraceResult(IVTABC##_##Method, hr);                            \ 
        return hr;                                                          \ 
    }                                                                       \ 
    if(pThis->lpVtbl != &vtblIVTABC)                                        \ 
    {                                                                       \ 
        hr = ResultFromScode(E_INVALIDARG);                                 \ 
        DebugTraceResult(IVTABC##_##Method, hr);                            \ 
        return hr;                                                          \ 
    }                                                                       \ 
}