// --lookup.c-------------------------------------------------------------------
//
// A simple test driver for HrGWResolveAddress() & HrGWResolveProxy()
//
// Copyright (C) Microsoft Corp. 1986-1996. All Rights Reserved.
// -----------------------------------------------------------------------------
#include "edk.h"
LPMAPISESSION lpSession = NULL;
LPADRBOOK lpAdrBook = NULL; // Pointer to address book
LPABCONT lpGalABCont = NULL;
ULONG cbGalEid = 0; // count of bytes in GAL entry ID
LPENTRYID lpGalEid = NULL; // pointer to GAL entry ID
static BOOL fIsInit = FALSE;
static BOOL fInitializedMAPI = FALSE; // MAPI Initialized
#define ARG_HELP1"?"
#define ARG_HELP2"HELP"
static char * rgpszArgArray[] = {
ARG_HELP1,
ARG_HELP2,
};
#define ARGARRAYSIZE (sizeof(rgpszArgArray)/sizeof(rgpszArgArray[0]))
//$--InitLookup-----------------------------------------------------------------
// Initialize for address lookup
// -----------------------------------------------------------------------------
HRESULT HrInitLookup( // RETURNS: return code
IN LPSTR lpszProfileName) // MAPI profile name
{
HRESULT hr = NOERROR;
HRESULT hrT = NOERROR;
SCODE sc = 0;
ULONG ulObjType = 0;
DEBUGPUBLIC( "HrInitLookup()\n" );
DEBUGACTION("Initializing MAPI\n");
hrT = MAPIInitialize(NULL);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
fInitializedMAPI = TRUE;
hrT = MAPILogonEx(
(ULONG) 0,
lpszProfileName,
NULL,
MAPI_NEW_SESSION | MAPI_LOGON_UI | MAPI_EXTENDED | MAPI_NO_MAIL,
&lpSession);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
ASSERTERROR(lpSession != NULL, "NULL lpSession variable");
hrT = MAPICALL(lpSession)->OpenAddressBook(
lpSession,
0,
NULL,
AB_NO_DIALOG,
&lpAdrBook);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
ASSERTERROR(lpAdrBook != NULL, "NULL lpAdrBook variable");
hr = HrFindExchangeGlobalAddressList(
lpAdrBook,
&cbGalEid,
&lpGalEid);
if(FAILED(hr))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
// Open the global recipient container
hrT = MAPICALL(lpAdrBook)->OpenEntry(
lpAdrBook,
cbGalEid,
lpGalEid,
NULL,
MAPI_DEFERRED_ERRORS,
&ulObjType,
(LPUNKNOWN FAR *)&lpGalABCont);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
if(ulObjType != MAPI_ABCONT)
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
cleanup:
if(SUCCEEDED(hr))
{
fIsInit = TRUE;
}
else
{
if(fInitializedMAPI == TRUE)
{
MAPIFREEBUFFER(lpGalEid);
ULRELEASE(lpGalABCont);
ULRELEASE(lpAdrBook);
ULRELEASE(lpSession);
MAPIUninitialize();
fInitializedMAPI = FALSE;
}
}
RETURN(hr);
}
//$--HrUninitLookup------------------------------------------------------------
// Free all global variables
// ----------------------------------------------------------------------------
HRESULT HrUninitLookup( void ) // RETURNS: return code
{
HRESULT hr = NOERROR;
if(fIsInit == FALSE )
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
MAPIFREEBUFFER(lpGalEid);
ULRELEASE(lpGalABCont);
ULRELEASE(lpAdrBook);
ULRELEASE(lpSession);
fIsInit = FALSE;
cleanup:
if(fInitializedMAPI == TRUE)
{
MAPIUninitialize();
fInitializedMAPI = FALSE;
}
RETURN(hr);
}
//$--HrPrintAddress----------------------------------------------------------
// Prints the ADDRTYPE, DISPLAY_NAME & EMAIL_ADDRESS of a Recipient
// identified by a given Recipient ENTRYID
// --------------------------------------------------------------------------
HRESULT HrPrintAddress( // RETURNS: return code
IN BOOL fMapiRecip, // MAPI recipient
IN ULONG cbEntryID, // count of bytes in entry ID
IN LPENTRYID lpEntryID) // pointer to entry ID
{
HRESULT hr = NOERROR;
HRESULT hrT = NOERROR;
ULONG ulObjType = 0;
ULONG cValues = 0;
LPSPropValue lpProps = {0};
LPMAPIPROP lpRecip = NULL;
SizedSPropTagArray(5, sPropTags) =
{
5,
{
PR_ENTRYID,
PR_ADDRTYPE,
PR_DISPLAY_NAME,
PR_EMAIL_ADDRESS,
PR_SEND_RICH_INFO
}
};
DEBUGPUBLIC( "HrPrintAddress()\n" );
// Open the Recipient object
hrT = MAPICALL(lpSession)->OpenEntry(
lpSession,
cbEntryID,
lpEntryID,
NULL,
MAPI_DEFERRED_ERRORS,
&ulObjType,
(LPUNKNOWN FAR *)&lpRecip);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
// Get the required properties of the user
hrT = MAPICALL(lpRecip)->GetProps(
lpRecip,
(SPropTagArray *)&sPropTags,
fMapiUnicode,
&cValues,
&lpProps);
if(FAILED(hrT))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}
printf( " MAPI Recipient = %s\n", (fMapiRecip ? "TRUE" : "FALSE"));
printf( " Address Type = \"%s\"\n", lpProps[1].Value.LPSZ);
printf( " Display Name = \"%s\"\n", lpProps[2].Value.LPSZ);
printf( " Email Address = \"%s\"\n\n", lpProps[3].Value.LPSZ);
ASSERTERROR(
lpProps[4].Value.b == fMapiRecip,
"PR_SEND_RICH_INFO not equal to entry ID flag");
cleanup:
MAPIFREEBUFFER(lpProps);
ULRELEASE(lpRecip);
RETURN(hr);
}
//$--main----------------------------------------------------------------------
// Test driver main entry point.
//
// This program loops, until terminated by the user, prompting alternately
// for input values to HrGWResolveAddress() and HrGWResolveProxy()
// and prints the resolved results to a default output stream.
// ----------------------------------------------------------------------------
#define MAX_INPUT_SZ 1024
int main(int argc, char *argv[])
{
HRESULT hr = NOERROR;
SCODE sc = 0;
CHAR szInput[MAX_INPUT_SZ] = "";
LPSTR lpszProfileName = NULL;
ULONG cbEntryID = 0;
LPENTRYID lpEntryID = NULL;
LPSTR lpszProxyAddr = NULL;
int i = 0;
LPSTR lpszArgument = NULL;
LPSTR lpszValue = NULL;
BOOL fFinishedCommandLine = FALSE;
BOOL fMapiRecip = FALSE;
printf( "\n" );
// If they didn't give command line args then print a usage message.
if (argc < 2)
{
printf("USAGE: LOOKUP Profile\n\n");
printf(" [Flags] Enter LOOKUP /? for details\n");
goto cleanup;
}
// If they used /? or /HELP (the only defined flags with labels) then
// print a help message.
for (i = 1; i < argc; i++)
{
hr = _HrExpandCommandLineArgument(
argv[i], rgpszArgArray, ARGARRAYSIZE, NULL, &lpszArgument, &lpszValue);
if (SUCCEEDED(hr) && lpszArgument &&
(!_stricmp(lpszArgument,ARG_HELP1) ||
!_stricmp(lpszArgument,ARG_HELP2)))
{
printf("Profile Lookup sample.\n\n");
printf("USAGE: LOOKUP Profile\n\n");
printf(" Profile Name of profile to look up\n");
printf(" /HELP or /? Display help screen\n");
goto cleanup;
}
}
// Get MAPI profile name from command line
if (argc > 2)
{
fprintf(stderr, "ERROR: too many command line arguments\n");
hr = HR_LOG(E_FAIL);
goto cleanup;
}
hr = _HrExpandCommandLineArgument(
argv[1], rgpszArgArray, ARGARRAYSIZE, NULL, &lpszArgument, &lpszProfileName);
if (FAILED(hr) || lpszArgument)
{
fprintf(stderr, "ERROR: unknown command line argument %s\n", argv[1]);
hr = HR_LOG(E_FAIL);
goto cleanup;
}
fFinishedCommandLine = TRUE;
// Do initialization
hr = HrInitLookup(lpszProfileName);
if(FAILED(hr))
{
goto cleanup;
}
//
// Loop until terminated by user.
//
for(;;)
{
int iTmp = 0;
printf( "\n\n"
"Enter address to be resolved in <type>:<value> format\n"
"or EXIT to terminate.\n"
"NOTE: The address that you type must match exactly,\n"
" including case.\n"
": ");
//
// Get next line of number. EOF = terminate.
//
if (_fgetts( szInput, MAX_INPUT_SZ, stdin ) == NULL)
break;
//
// trim the trailing '\n'
//
iTmp = strlen(szInput);
if (iTmp > 0 && szInput[iTmp-1] == '\n')
szInput[iTmp-1] = 0;
//
// Check for exit.
//
if (_stricmp( szInput, TEXT("EXIT")) == 0)
break ;
fMapiRecip = FALSE;
//
// Resolve the address.
//
hr = HrGWResolveAddress(
lpGalABCont,
szInput,
&fMapiRecip,
&cbEntryID,
&lpEntryID);
if(SUCCEEDED(hr))
{
printf("\n") ;
hr = HrPrintAddress(fMapiRecip, cbEntryID, lpEntryID);
if(FAILED(hr))
{
printf("ERROR: could not print address [%08lX]\n", hr);
continue;
}
printf(" Enter address type to be resolved\n"
" :");
if(gets(szInput) != NULL)
{
printf("\n") ;
fMapiRecip = FALSE;
//
// Check for exit.
//
if (_stricmp( szInput, TEXT("EXIT")) == 0)
break;
hr = HrGWResolveProxy(
lpAdrBook,
cbEntryID,
lpEntryID,
szInput,
&fMapiRecip,
&lpszProxyAddr);
printf("\n");
if(FAILED(hr))
{
fprintf(stderr, "ERROR: could not resolve proxy [%08lX]\n", hr);
}
else
{
printf( " MAPI Recipient = %s\n", (fMapiRecip ? "TRUE" : "FALSE"));
printf( " Resolved Proxy = %-30s\n", lpszProxyAddr);
MAPIFREEBUFFER(lpszProxyAddr);
}
}
}
else
{
fprintf(stderr, "ERROR: could not resolve address [%08lX]\n", hr);
}
MAPIFREEBUFFER(lpEntryID);
}
cleanup:
MAPIFREEBUFFER(lpEntryID);
// Terminate the MAPI session properly
if(fIsInit == TRUE)
{
hr = HR_LOG(HrUninitLookup());
}
// Display results of operation.
if (fFinishedCommandLine)
{
if (SUCCEEDED(hr))
{
fprintf(stderr, "Done.\n");
}
else
{
fprintf(stderr, "Lookup not successful.\n");
}
}
// return exit code
return _nEcFromHr(hr);
}