Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

251 lines
6.0 KiB

/****************************** Module Header ******************************\
* Module Name: who.c
*
* Copyright (c) 1998, Microsoft Corporation
*
* Command line exchange lookup of phone and office numbers.
*
* History:
* 26-Mar-1998 vadimg created
\***************************************************************************/
#include <stdio.h>
#include <locale.h>
#include <mapix.h>
#include <mapi.h>
#include <mapiwin.h>
#include <mapiutil.h>
#include <mapidefs.h>
#include <initguid.h>
#include <mapiguid.h>
#define DISPLAY_NAME 0
#define ACCOUNT 1
#define BUSINESS_TELEPHONE_NUMBER 2
#define OFFICE_LOCATION 3
DWORD gdwCodePage;
void FreeRowSet(LPSRowSet psrs)
{
ULONG i;
for (i = 0; i < psrs->cRows; i++) {
LPSPropValue pspv = psrs->aRow[i].lpProps;
if (pspv != NULL) {
MAPIFreeBuffer((LPVOID)pspv);
}
}
MAPIFreeBuffer((LPVOID)psrs);
}
void PrintName(ULONG cProps, LPSPropValue rgspv)
{
if (rgspv[DISPLAY_NAME].Value.err != MAPI_E_NOT_FOUND) {
WCHAR buffW[30];
int len;
len = MultiByteToWideChar(CP_ACP,
0,
rgspv[DISPLAY_NAME].Value.lpszA,
-1,
buffW,
30);
WideCharToMultiByte(gdwCodePage,
0,
buffW,
len,
rgspv[DISPLAY_NAME].Value.lpszA,
30, NULL, NULL);
printf("%-25.23s", rgspv[DISPLAY_NAME].Value.lpszA);
}
if (rgspv[ACCOUNT].Value.err != MAPI_E_NOT_FOUND) {
printf("%-17.15s", rgspv[ACCOUNT].Value.lpszA);
}
if (rgspv[BUSINESS_TELEPHONE_NUMBER].Value.err != MAPI_E_NOT_FOUND) {
printf("%-22.21s", rgspv[BUSINESS_TELEPHONE_NUMBER].Value.lpszA);
}
if (rgspv[OFFICE_LOCATION].Value.err != MAPI_E_NOT_FOUND) {
printf("%-15.15s", rgspv[OFFICE_LOCATION].Value.lpszA);
}
printf("\n");
}
BOOL PrintNames(LPSTR psz, LPSRowSet psrs)
{
ULONG i;
if (psrs->cRows == 0)
return FALSE;
for (i = 0; i < psrs->cRows; i++) {
PrintName(psrs->aRow[i].cValues, psrs->aRow[i].lpProps);
}
return TRUE;
}
BOOL FindNames(LPMAPITABLE pmtb, char *psz)
{
SRestriction sres;
SPropValue spv;
SizedSPropTagArray(4, rgspt) = {4, {PR_DISPLAY_NAME, PR_ACCOUNT,
PR_BUSINESS_TELEPHONE_NUMBER, PR_OFFICE_LOCATION}};
if (FAILED(pmtb->SetColumns((LPSPropTagArray)&rgspt, 0)))
return FALSE;
spv.ulPropTag = PR_ANR;
spv.Value.lpszA = psz;
sres.rt = RES_PROPERTY;
sres.res.resProperty.relop = RELOP_EQ;
sres.res.resProperty.ulPropTag = spv.ulPropTag;
sres.res.resProperty.lpProp = &spv;
if (FAILED(pmtb->Restrict(&sres, 0)))
return FALSE;
return TRUE;
}
BOOL GetGlobalAdressListTable(LPADRBOOK padb, LPMAPITABLE *ppmtb)
{
ULONG ulType;
IABContainer *pabc = NULL;
LPMAPITABLE pmtb = NULL;
LPSRowSet psrs = NULL;
SRestriction sres;
SPropValue spv;
SizedSPropTagArray(1, rgspt) = {1, {PR_ENTRYID}};
BOOL fRet = FALSE;
if (FAILED(padb->OpenEntry(0, NULL, NULL, MAPI_BEST_ACCESS |
MAPI_DEFERRED_ERRORS, &ulType, (LPUNKNOWN*)&pabc)))
goto Cleanup;
if (FAILED(pabc->GetHierarchyTable(MAPI_DEFERRED_ERRORS, &pmtb)))
goto Cleanup;
pabc->Release();
pabc = NULL;
spv.ulPropTag = PR_DISPLAY_NAME;
spv.Value.lpszA = "Global Address List";
sres.rt = RES_PROPERTY;
sres.res.resProperty.relop = RELOP_EQ;
sres.res.resProperty.ulPropTag = spv.ulPropTag;
sres.res.resProperty.lpProp = &spv;
if (FAILED(pmtb->FindRow(&sres, BOOKMARK_BEGINNING, 0)))
goto Cleanup;
if (FAILED(pmtb->SetColumns((LPSPropTagArray)&rgspt, 0)))
goto Cleanup;
if (FAILED(pmtb->QueryRows(1, 0, &psrs)))
goto Cleanup;
if (FAILED(padb->OpenEntry(psrs->aRow[0].lpProps[0].Value.bin.cb,
(LPENTRYID)psrs->aRow[0].lpProps[0].Value.bin.lpb,
NULL, MAPI_BEST_ACCESS | MAPI_DEFERRED_ERRORS,
&ulType, (LPUNKNOWN*)&pabc)))
goto Cleanup;
if (FAILED(pabc->GetContentsTable(MAPI_DEFERRED_ERRORS, ppmtb)))
goto Cleanup;
fRet = TRUE;
Cleanup:
if (pmtb != NULL) {
pmtb->Release();
}
if (pabc != NULL) {
pabc->Release();
}
if (psrs != NULL) {
FreeRowSet(psrs);
}
return fRet;
}
void PrintUsage(void)
{
printf("Sample Usage:\n");
printf(" who jane\n");
printf(" who janed\n");
printf(" who \"jane d\"\n");
}
int __cdecl main(int argc, char **argv)
{
IMAPISession *pmss = NULL;
LPADRBOOK padb = NULL;
LPMAPITABLE pmtb;
LPSRowSet psrs = NULL;
ULONG cRows;
BOOL fContinue;
LPSTR psz = argv[1];
char lBuf[6];
if (argc == 1 || (argc == 2 && argv[1][0] == '-')) {
PrintUsage();
return 0;
}
gdwCodePage = GetConsoleOutputCP();
#if 0
SetThreadLocale(MAKELCID(MAKELANGID(LANG_NEUTRAL, SUBLANG_SYS_DEFAULT),
SORT_DEFAULT));
sprintf(lBuf, ".%.6d", gdwCodePage);
setlocale(LC_ALL, lBuf);
#endif
if (FAILED(MAPIInitialize(NULL)))
return 0;
if (FAILED(MAPILogonEx(0, NULL, NULL, MAPI_ALLOW_OTHERS |
MAPI_USE_DEFAULT, &pmss)))
goto Cleanup;
if (FAILED(pmss->OpenAddressBook(NULL, NULL, AB_NO_DIALOG, &padb)))
goto Cleanup;
if (!GetGlobalAdressListTable(padb, &pmtb))
goto Cleanup;
if (!FindNames(pmtb, psz))
goto Cleanup;
if (FAILED(pmtb->GetRowCount(0, &cRows)))
goto Cleanup;
do {
if (FAILED(pmtb->QueryRows(cRows, 0, &psrs)))
goto Cleanup;
if (psrs == NULL)
break;
fContinue = PrintNames(psz, psrs);
FreeRowSet(psrs);
} while (fContinue);
Cleanup:
if (padb != NULL) {
padb->Release();
}
if (pmss != NULL) {
pmss->Release();
}
MAPIUninitialize();
return 0;
}