IADDR.C
// --iaddr.c-------------------------------------------------------------------- 
// 
//  Find an address given a proxy address. 
//  
// Copyright (C) Microsoft Corp. 1986-1996.  All Rights Reserved. 
// ----------------------------------------------------------------------------- 
 
#include "edk.h" 
#include "gwsample.h" 
 
//$--HrMapGatewayProxyToAddr---------------------------------------------------- 
// Map all gateway specific email addresses to proxy addresses 
// in a given address list. 
// ----------------------------------------------------------------------------- 
HRESULT HrMapGatewayProxyToAddr(        // RETURNS: return code 
    IN  LPADRBOOK    lpAdrBook,         // pointer to address book 
    IN  LPTSTR       lpszAddrType,      // pointer to the address type 
    IN OUT LPADRLIST lpAdrList)         // pointer to address list 
{ 
    HRESULT         hr                   = NOERROR; 
    SCODE           sc                   = 0; 
    ULONG           i                    = 0; 
    ULONG           j                    = 0; 
    ULONG           cbAddress            = 0; 
    ULONG           cProxy               = 0; 
    LPSPropValue    lpProps              = NULL; 
    LPTSTR          lpszProxyAddress     = NULL; 
 
    LPTSTR          lpszEmailDisplayName = NULL; 
    LPTSTR          lpszEmailAddressType = NULL; 
    LPTSTR          lpszEmailAddress     = NULL; 
    LPTSTR          lpszEmailSearchKey   = NULL; 
    ULONG           cbEmailEid           = 0; 
    LPENTRYID       lpEmailEid           = NULL; 
 
    DEBUGPUBLIC("HrMapGatewayProxyToAddr()\n"); 
 
    for(i = 0; i < lpAdrList->cEntries; i++) 
    { 
        lpProps = lpAdrList->aEntries[i].rgPropVals; 
 
        if((lpProps[IDISPNAME].ulPropTag == PR_DISPLAY_NAME) && 
           ((lstrcmpi(lpszSysAdminName, lpProps[IDISPNAME].Value.LPSZ) == 0) || 
            (lstrcmpi(TEXT("."), lpProps[IDISPNAME].Value.LPSZ) == 0) || 
            (lstrcmpi(lpszSysAdminAddr, lpProps[IDISPNAME].Value.LPSZ) == 0))) 
 
        { 
            lpszEmailDisplayName = NULL; 
            lpszEmailAddressType = NULL; 
            lpszEmailAddress     = NULL; 
            lpszEmailSearchKey   = NULL; 
            cbEmailEid           = 0; 
            lpEmailEid           = NULL; 
 
            hr = HrCreateProxyAddress( 
                lpAdrBook, 
                lpProps, 
                TRUE, 
                SYSTEM_ADMINISTRATOR, 
                SYSTEM, 
                SYSTEM_ADMINISTRATOR, 
                &lpszEmailDisplayName, 
                &lpszEmailAddressType, 
                &lpszEmailAddress, 
                &lpszEmailSearchKey, 
                &cbEmailEid, 
                &lpEmailEid); 
 
            if(FAILED(hr)) 
            { 
                goto cleanup; 
            } 
 
            lpProps[IDISPNAME].ulPropTag      = PR_DISPLAY_NAME; 
            lpProps[IDISPNAME].Value.LPSZ     = lpszEmailDisplayName; 
 
            lpProps[IADDRTYPE].ulPropTag      = PR_ADDRTYPE; 
            lpProps[IADDRTYPE].Value.LPSZ     = lpszEmailAddressType; 
 
            lpProps[IEMAILADDR].ulPropTag     = PR_EMAIL_ADDRESS; 
            lpProps[IEMAILADDR].Value.LPSZ    = lpszEmailAddress; 
 
            lpProps[ISEARCHKEY].ulPropTag = PR_SEARCH_KEY; 
 
            if(lpszEmailSearchKey == NULL) 
            { 
                lpProps[ISEARCHKEY].Value.bin.cb  = 0; 
                lpProps[ISEARCHKEY].Value.bin.lpb = NULL; 
            } 
            else 
            { 
                lpProps[ISEARCHKEY].Value.bin.cb  = cbStrLen(lpszEmailSearchKey); 
                lpProps[ISEARCHKEY].Value.bin.lpb = lpszEmailSearchKey; 
            } 
 
            lpProps[IENTRYID].ulPropTag       = PR_ENTRYID; 
            lpProps[IENTRYID].Value.bin.cb    = cbEmailEid; 
            lpProps[IENTRYID].Value.bin.lpb   = (LPBYTE)lpEmailEid; 
        } 
    } 
 
cleanup: 
 
    RETURN(hr); 
} 
 
//$--HrMapRecipProxyToAddr------------------------------------------------------ 
// Map recipient proxy addresses to addresses. 
// ----------------------------------------------------------------------------- 
HRESULT HrMapRecipProxyToAddr(          // RETURNS: return code 
    IN LPADRBOOK lpAdrBook,             // pointer to address book 
    IN BOOL fDefaultRespValue,          // default responsibility value 
    IN BOOL fIgnoreRespValue,           // ignore  responsibility value 
    IN LPABCONT lpGalABCont,            // pointer to GAL container 
    IN LPTSTR lpszAddrType,             // pointer to address type 
    IN LPADRLIST lpOriginalAdrList,     // pointer to unmodified address list 
    IN LPADRLIST lpMappedAdrList,       // pointer to unmodified address list 
    IN OUT LPADRLIST lpEnvelopeAdrList, // pointer to envelope address list 
    IN OUT LPADRLIST lpEnvelopeNDRAdrList,// pointer to envelope NDR address list 
    IN OUT LPMESSAGE lpMessage,         // pointer to message 
    OUT LPADRLIST *lppAdrList,          // pointer to address list 
    OUT LPADRLIST *lppNDRAdrList)       // pointer to NDR address list 
{ 
    HRESULT         hrT                  = NOERROR; 
    HRESULT         hr                   = NOERROR; 
    SCODE           sc                   = 0; 
    LPMAPITABLE     lpTable              = NULL; 
 
    ULONG           cbeid                = 0; 
    LPENTRYID       lpeid                = NULL; 
 
    ULONG           cRows                = 0; 
    LPSRowSet       lpRows               = 0; 
 
    LPSPropTagArray lpPropTagArray       = NULL; 
 
    ULONG           nName                = 0; 
    ULONG           nAddrType            = 0; 
    ULONG           nAddress             = 0; 
    ULONG           nEntryId             = 0; 
    ULONG           nSearchKey           = 0; 
    ULONG           nRecipStat           = 0; 
 
    ULONG           i                    = 0; 
    ULONG           iAck                 = 0; 
    ULONG           iNak                 = 0; 
 
    ULONG           cValues              = 0; 
    LPSPropValue    lpProps              = NULL; 
 
    LPSPropValue    lpEnvelopeProps      = NULL; 
    LPSPropValue    lpMessageProps       = NULL; 
 
    ULONG           cbSearchKey          = 0; 
    LPTSTR          lpszSearchKey        = NULL; 
 
    BOOL            fRespTrue            = FALSE; 
 
    FILETIME        ftReportTime         = {0}; 
 
    LPSPropValue    lpPropT              = NULL; 
 
    ULONG           cNewProps            = 0; 
    LPSPropValue    lpNewProps           = NULL; 
 
    ULONG           cMapValues           = 0; 
    LPSPropValue    lpMapProps           = NULL; 
 
    BOOL            fEnv                 = FALSE; 
 
    DEBUGPUBLIC("HrMapRecipProxyToAddr()\n"); 
 
    *lppAdrList    = NULL; 
    *lppNDRAdrList = NULL; 
 
    // 
    // Get the current time. 
    // 
 
    GetSystemTimeAsFileTime( &ftReportTime); 
 
    nName      = IDISPNAME; 
    nAddrType  = IADDRTYPE; 
    nAddress   = IEMAILADDR; 
    nEntryId   = IENTRYID; 
    nSearchKey = ISEARCHKEY; 
    nRecipStat = IRECIPSTAT; 
 
    cRows  = lpOriginalAdrList->cEntries; 
    lpRows = (LPSRowSet)lpOriginalAdrList; 
 
    if(lpRows == NULL) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    if(lpEnvelopeAdrList != NULL) 
    { 
        // 
        // Clear recipient numbers if this is not an envelope address list. 
        // 
 
        hr = HrDeleteAddressListProperty( 
            PR_RECIPIENT_NUMBER, 
            (LPADRLIST)lpRows); 
 
        if(FAILED(hr)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
    } 
 
    hr = HrMAPICreateSizedAddressList( 
        cRows, 
        lppAdrList); 
 
    if(FAILED(hr)) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    hr = HrMAPICreateSizedAddressList( 
        cRows, 
        lppNDRAdrList); 
 
    if(FAILED(hr)) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    for(i = 0; i < cRows; i++) 
    { 
        // 
        // Preserve original recipient number for original recipient entry 
        // 
 
        cValues = lpRows->aRow[i].cValues; 
        lpProps = lpRows->aRow[i].lpProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        hr = HrSetUlongPropertyValue( 
            FALSE, 
            PR_RECIPIENT_NUMBER, 
            (i+1), 
            cValues, 
            lpProps, 
            &cNewProps, 
            &lpNewProps); 
 
        if(FAILED(hr)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
 
        MAPIFREEBUFFER(lpProps); 
 
        lpRows->aRow[i].cValues = cNewProps; 
        lpRows->aRow[i].lpProps = lpNewProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        cValues = 0; 
        lpProps = NULL; 
 
        // 
        // Preserve original recipient number for mapped recipient entry 
        // 
 
        cValues = lpMappedAdrList->aEntries[i].cValues; 
        lpProps = lpMappedAdrList->aEntries[i].rgPropVals; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        hr = HrSetUlongPropertyValue( 
            FALSE, 
            PR_RECIPIENT_NUMBER, 
            (i+1), 
            cValues, 
            lpProps, 
            &cNewProps, 
            &lpNewProps); 
 
        if(FAILED(hr)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
 
        MAPIFREEBUFFER(lpProps); 
 
        lpMappedAdrList->aEntries[i].cValues = cNewProps; 
        lpMappedAdrList->aEntries[i].rgPropVals = lpNewProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        cValues = 0; 
        lpProps = NULL; 
 
        // 
        // Preserve original row number for original recipient entry 
        // 
 
        cValues = lpRows->aRow[i].cValues; 
        lpProps = lpRows->aRow[i].lpProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        hr = HrSetUlongPropertyValue( 
            TRUE, 
            PR_ROWID, 
            i, 
            cValues, 
            lpProps, 
            &cNewProps, 
            &lpNewProps); 
 
        if(FAILED(hr)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
 
        MAPIFREEBUFFER(lpProps); 
 
        lpRows->aRow[i].cValues = cNewProps; 
        lpRows->aRow[i].lpProps = lpNewProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        cValues = 0; 
        lpProps = NULL; 
 
        // 
        // Preserve original row number for mapped recipient entry 
        // 
 
        cValues = lpMappedAdrList->aEntries[i].cValues; 
        lpProps = lpMappedAdrList->aEntries[i].rgPropVals; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        hr = HrSetUlongPropertyValue( 
            TRUE, 
            PR_ROWID, 
            i, 
            cValues, 
            lpProps, 
            &cNewProps, 
            &lpNewProps); 
 
        if(FAILED(hr)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
 
        MAPIFREEBUFFER(lpProps); 
 
        lpMappedAdrList->aEntries[i].cValues = cNewProps; 
        lpMappedAdrList->aEntries[i].rgPropVals = lpNewProps; 
 
        cNewProps  = 0; 
        lpNewProps = NULL; 
 
        cValues = 0; 
        lpProps = NULL; 
 
        // 
        // Mapped recipient entry (read-only) 
        // 
 
        cMapValues = lpMappedAdrList->aEntries[i].cValues; 
        lpMapProps = lpMappedAdrList->aEntries[i].rgPropVals; 
 
        // 
        // Find the email address associated with a proxy address, 
        // 
 
        // 
        // Get the recipient responsibility 
        // 
 
        lpPropT = LpValFindProp(PR_RESPONSIBILITY, cMapValues, lpMapProps); 
 
        if(lpPropT == NULL) 
        { 
            fRespTrue = fDefaultRespValue; 
        } 
        else 
        { 
            fRespTrue = lpPropT->Value.b; 
        } 
 
        if(fIgnoreRespValue == TRUE) 
        { 
            fRespTrue = FALSE; 
        } 
 
        // 
        // NOTE: If the recipient address type is the same as the email 
        // address type then the address was mapped. 
        // 
 
        if((lpMapProps[IADDRTYPE].ulPropTag != PR_ADDRTYPE) || 
           (lpMapProps[IADDRTYPE].Value.LPSZ == NULL)) 
        { 
            hr = HR_LOG(E_FAIL); 
            goto cleanup; 
        } 
        else 
        { 
            if( (lstrcmpi(lpMapProps[IADDRTYPE].Value.LPSZ, 
                         TEXT(EXCHANGE_ADDRTYPE)) != 0) && 
                (fRespTrue == TRUE) ) 
            { 
                MODULE_WARNING("email address was not found"); 
 
                if(lpMapProps[IRECIPSTAT].Value.ul != NOERROR) 
                { 
                    // 
                    // Non-deliver recipient 
                    // 
 
                    hr = HrNonDeliverRecipient( 
                        MAPI_REASON_TRANSFER_IMPOSSIBLE, 
                        (ULONG)MAPI_DIAG_OR_NAME_AMBIGUOUS, 
                        &ftReportTime, 
                        (ULONG)-1, 
                        iNak, 
                        cMapValues, 
                        lpMapProps, 
                        *lppNDRAdrList); 
 
                    if(FAILED(hr)) 
                    { 
                        goto cleanup; 
                    } 
 
                    iNak++; 
                } 
                else 
                { 
                    goto skip; 
                } 
            } 
            else 
            { 
skip: 
                hr = HrMAPISetAddressList( 
                    iAck, 
                    cMapValues, 
                    lpMapProps, 
                    *lppAdrList); 
 
                if(FAILED(hr)) 
                { 
                    hr = HR_LOG(E_FAIL); 
                    goto cleanup; 
                } 
 
                iAck++; 
            } 
        } 
    } 
 
    (*lppAdrList)->cEntries    = iAck; 
    (*lppNDRAdrList)->cEntries = iNak; 
 
cleanup: 
 
    if(FAILED(hr)) 
    { 
        if(*lppAdrList != NULL) 
        { 
            FREEPADRLIST(*lppAdrList); 
        } 
 
        if(*lppNDRAdrList != NULL) 
        { 
            FREEPADRLIST(*lppNDRAdrList); 
        } 
 
    } 
 
    MAPIFREEBUFFER(lpNewProps); 
             
    RETURN(hr); 
}