IADDRESS.C

// --iaddress.c----------------------------------------------------------------- 
//
// Module containing MAPI utility functions for addressing.
//
// Copyright (C) Microsoft Corp. 1986-1996. All Rights Reserved.
// -----------------------------------------------------------------------------

#include "edk.h"

#include "iaddress.chk"

//$--HrMAPICreateAddressList-----------------------------------------------------
// Create an address list.
// -----------------------------------------------------------------------------
HRESULT HrMAPICreateAddressList( // RETURNS: return code
IN ULONG cProps, // count of values in address list
// entry
IN LPSPropValue lpPropValues, // pointer to address list entry
OUT LPADRLIST *lppAdrList) // pointer to address list pointer
{
HRESULT hr = NOERROR;
SCODE sc = 0;
LPSPropValue lpNewPropValues = NULL;
ULONG cBytes = 0;

DEBUGPUBLIC("HrMAPICreateAddressList()\n");

hr = CHK_HrMAPICreateAddressList(
cProps,
lpPropValues,
lppAdrList);

if(FAILED(hr))
RETURN(hr);

*lppAdrList = NULL;

sc = ScDupPropset(
cProps,
lpPropValues,
MAPIAllocateBuffer,
&lpNewPropValues);

if(FAILED(sc))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}

cBytes = CbNewADRLIST(1);

sc = MAPIAllocateBuffer(cBytes, lppAdrList);

if(FAILED(sc))
{
hr = HR_LOG(E_OUTOFMEMORY);
goto cleanup;
}

// Initialize ADRLIST structure
ZeroMemory(*lppAdrList, cBytes);

(*lppAdrList)->cEntries = 1;
(*lppAdrList)->aEntries[0].cValues = cProps;
(*lppAdrList)->aEntries[0].rgPropVals = lpNewPropValues;

cleanup:

if(FAILED(hr))
{
if(lppAdrList != NULL)
{
MAPIFREEBUFFER(*lppAdrList);
*lppAdrList = NULL;
}
MAPIFREEBUFFER(lpNewPropValues);
}

RETURN(hr);
}

//$--HrMAPIAppendAddressList-----------------------------------------------------
// Append to an address list.
// -----------------------------------------------------------------------------
HRESULT HrMAPIAppendAddressList( // RETURNS: return code
IN ULONG cProps, // count of values in address list
// entry
IN LPSPropValue lpPropValues, // pointer to address list entry
IN OUT LPADRLIST *lppAdrList) // pointer to address list pointer
{
HRESULT hr = NOERROR;
SCODE sc = 0;
LPADRLIST lpAdrList = NULL;
LPADRENTRY lpAdrEntry = NULL;
LPSPropValue lpNewPropValues = NULL;
ULONG i = 0;
ULONG cBytes = 0;
ULONG cEntries = 0;

DEBUGPUBLIC("HrMAPIAppendAddressList()\n");

hr = CHK_HrMAPIAppendAddressList(
cProps,
lpPropValues,
lppAdrList);

if(FAILED(hr))
RETURN(hr);

sc = ScDupPropset(
cProps,
lpPropValues,
MAPIAllocateBuffer,
&lpNewPropValues);

if(FAILED(sc))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}

cEntries = ((*lppAdrList)->cEntries + 1);

cBytes = CbNewADRLIST(cEntries);

sc = MAPIAllocateBuffer(cBytes, (void **)&lpAdrList);

if(FAILED(sc))
{
hr = HR_LOG(E_OUTOFMEMORY);
goto cleanup;
}

// Initialize ADRLIST
ZeroMemory(lpAdrList, cBytes);

lpAdrEntry = lpAdrList->aEntries;

// Copy old ADRENTRY values to array
for(i = 0; i < (*lppAdrList)->cEntries; i++)
{
lpAdrEntry[i].cValues =
(*lppAdrList)->aEntries[i].cValues;
lpAdrEntry[i].rgPropVals =
(*lppAdrList)->aEntries[i].rgPropVals;
}

// Copy new ADRENTRY values to array
lpAdrEntry[i].cValues = cProps;
lpAdrEntry[i].rgPropVals = lpNewPropValues;

lpAdrList->cEntries = (*lppAdrList)->cEntries + 1;

MAPIFREEBUFFER(*lppAdrList);

*lppAdrList = lpAdrList;

cleanup:

if(FAILED(hr))
{
MAPIFREEBUFFER(lpNewPropValues);
}

RETURN(hr);
}

//$--HrMAPICreateSizedAddressList------------------------------------------------
// Create a sized address list.
// -----------------------------------------------------------------------------
HRESULT HrMAPICreateSizedAddressList( // RETURNS: return code
IN ULONG cEntries, // count of entries in address list
OUT LPADRLIST *lppAdrList) // pointer to address list pointer
{
HRESULT hr = NOERROR;
SCODE sc = 0;
ULONG cBytes = 0;

DEBUGPUBLIC("HrMAPICreateAddressList()\n");

hr = CHK_HrMAPICreateSizedAddressList(
cEntries,
lppAdrList);

if(FAILED(hr))
RETURN(hr);

*lppAdrList = NULL;

cBytes = CbNewADRLIST(cEntries);

sc = MAPIAllocateBuffer(cBytes, lppAdrList);

if(FAILED(sc))
{
hr = HR_LOG(E_OUTOFMEMORY);
goto cleanup;
}

// Initialize ADRLIST structure
ZeroMemory(*lppAdrList, cBytes);

(*lppAdrList)->cEntries = cEntries;

cleanup:

RETURN(hr);
}

//$--HrMAPISetAddressList--------------------------------------------------------
// Set an address list.
// -----------------------------------------------------------------------------
HRESULT HrMAPISetAddressList( // RETURNS: return code
IN ULONG iEntry, // index of address list entry
IN ULONG cProps, // count of values in address list
// entry
IN LPSPropValue lpPropValues, // pointer to address list entry
IN OUT LPADRLIST lpAdrList) // pointer to address list pointer
{
HRESULT hr = NOERROR;
SCODE sc = 0;
LPSPropValue lpNewPropValues = NULL;
ULONG cBytes = 0;

DEBUGPUBLIC("HrMAPISetAddressList()\n");

hr = CHK_HrMAPISetAddressList(
iEntry,
cProps,
lpPropValues,
lpAdrList);

if(FAILED(hr))
RETURN(hr);

if(iEntry >= lpAdrList->cEntries)
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}

sc = ScDupPropset(
cProps,
lpPropValues,
MAPIAllocateBuffer,
&lpNewPropValues);

if(FAILED(sc))
{
hr = HR_LOG(E_FAIL);
goto cleanup;
}

if(lpAdrList->aEntries[iEntry].rgPropVals != NULL)
{
MAPIFREEBUFFER(lpAdrList->aEntries[iEntry].rgPropVals);
}

lpAdrList->aEntries[iEntry].cValues = cProps;
lpAdrList->aEntries[iEntry].rgPropVals = lpNewPropValues;

cleanup:

RETURN(hr);
}