IFIND.C
// --ifind.c------------------------------------------------------------------ 
//  
//  Module containing FIND functions for various folders. 
//  
// Copyright (C) Microsoft Corp. 1986-1996.  All Rights Reserved. 
// ----------------------------------------------------------------------------- 
 
#include "edk.h" 
 
#include "ifind.chk" 
 
//$--HrMAPIFindInbox---------------------------------------------------------- 
//  Find IPM inbox folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrMAPIFindInbox(              // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // Entry ID of IPM inbox 
{ 
    HRESULT hr  = NOERROR; 
    HRESULT hrT = NOERROR; 
    SCODE   sc  = 0; 
 
    DEBUGPUBLIC("HrMAPIFindInbox()"); 
 
    hr = CHK_HrMAPIFindInbox( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the entry ID of the Inbox from the message store 
    hrT = MAPICALL(lpMdb)->GetReceiveFolder( 
        lpMdb, 
        TEXT("IPM"), 
        fMapiUnicode, 
        lpcbeid, 
        lppeid, 
        NULL); 
 
    if(FAILED(hrT)) 
    { 
        if(hrT == MAPI_E_NOT_FOUND) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
    } 
 
    ASSERTERROR(*lpcbeid != 0, "ZERO length entry ID"); 
 
    ASSERTERROR(*lppeid != NULL, "NULL entry ID"); 
 
    RETURN(hr); 
} 
 
//$--HrMAPIFindOutbox--------------------------------------------------------- 
//  Find IPM outbox folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrMAPIFindOutbox(             // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // Entry ID of IPM outbox 
{ 
    HRESULT       hr          = NOERROR; 
    HRESULT       hrT         = NOERROR; 
    SCODE         sc          = 0; 
    ULONG         cValues     = 0; 
    LPSPropValue  lpPropValue = NULL; 
    ULONG         cbeid       = 0; 
    SPropTagArray rgPropTag   = { 1, { PR_IPM_OUTBOX_ENTRYID } }; 
     
    DEBUGPUBLIC("HrMAPIFindOutbox()"); 
 
    hr = CHK_HrMAPIFindOutbox( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the outbox entry ID property.  
    hrT = MAPICALL(lpMdb)->GetProps( 
        lpMdb, 
        &rgPropTag, 
        fMapiUnicode, 
        &cValues, 
        &lpPropValue); 
 
    if(hrT == MAPI_W_ERRORS_RETURNED) 
    { 
        if((lpPropValue != NULL) && (lpPropValue->Value.ul == MAPI_E_NOT_FOUND)) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
        goto cleanup; 
    } 
 
    if(FAILED(hrT)) 
    { 
        lpPropValue = NULL; 
 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    ASSERTERROR(cValues != 0, "ZERO cValues variable"); 
 
    ASSERTERROR(lpPropValue != NULL, "NULL lpPropValue variable"); 
 
    // Check to make sure we got the right property. 
    if (lpPropValue->ulPropTag != PR_IPM_OUTBOX_ENTRYID) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    cbeid = lpPropValue->Value.bin.cb; 
 
    sc = MAPIAllocateBuffer(cbeid, (void **)lppeid); 
 
    if(FAILED(sc)) 
    { 
        hr = HR_LOG(E_OUTOFMEMORY); 
        goto cleanup; 
    } 
 
    // Copy outbox Entry ID 
    CopyMemory( 
        *lppeid, 
        lpPropValue->Value.bin.lpb, 
        cbeid); 
 
    *lpcbeid = cbeid; 
 
cleanup: 
 
    MAPIFREEBUFFER(lpPropValue); 
 
    RETURN(hr); 
} 
 
//$--HrMAPIFindIPMSubtree-------------------------------------------------------- 
//  Find IPM subtree folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrMAPIFindIPMSubtree(            // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // entry ID of IPM subtree 
{ 
    HRESULT       hr          = NOERROR; 
    HRESULT       hrT         = NOERROR; 
    SCODE         sc          = 0; 
    ULONG         cValues     = 0; 
    LPSPropValue  lpPropValue = NULL; 
    ULONG         cbeid       = 0; 
    SPropTagArray rgPropTag   = { 1, { PR_IPM_SUBTREE_ENTRYID } }; 
     
    DEBUGPUBLIC("HrMAPIFindIPMSubtree()"); 
 
    hr = CHK_HrMAPIFindIPMSubtree( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the subtree entry ID property.  
    hrT = MAPICALL(lpMdb)->GetProps( 
        lpMdb, 
        &rgPropTag, 
        fMapiUnicode, 
        &cValues, 
        &lpPropValue); 
 
    if(hrT == MAPI_W_ERRORS_RETURNED) 
    { 
        if((lpPropValue != NULL) && (lpPropValue->Value.ul == MAPI_E_NOT_FOUND)) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
        goto cleanup; 
    } 
 
    if(FAILED(hrT)) 
    { 
        lpPropValue = NULL; 
 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    ASSERTERROR(cValues != 0, "ZERO cValues variable"); 
 
    ASSERTERROR(lpPropValue != NULL, "NULL lpPropValue variable"); 
 
    // Check to make sure we got the right property. 
    if (lpPropValue->ulPropTag != PR_IPM_SUBTREE_ENTRYID) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    cbeid = lpPropValue->Value.bin.cb; 
 
    sc = MAPIAllocateBuffer(cbeid, (void **)lppeid); 
 
    if(FAILED(sc)) 
    { 
        hr = HR_LOG(E_OUTOFMEMORY); 
        goto cleanup; 
    } 
 
    // Copy subtree entry ID 
    CopyMemory( 
        *lppeid, 
        lpPropValue->Value.bin.lpb, 
        cbeid); 
 
    *lpcbeid = cbeid; 
 
cleanup: 
 
    MAPIFREEBUFFER(lpPropValue); 
 
    RETURN(hr); 
} 
 
//$--HrGWFindMtsOutFolder------------------------------------------------------------ 
//  Find MTS-OUT folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrGWFindMtsOutFolder(                // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // entry ID of MTS-OUT 
{ 
    HRESULT       hr          = NOERROR; 
    HRESULT       hrT         = NOERROR; 
    SCODE         sc          = 0; 
    ULONG         cValues     = 0; 
    LPSPropValue  lpPropValue = NULL; 
    ULONG         cbeid       = 0; 
    SPropTagArray rgPropTag   = { 1, { PR_GW_MTSOUT_ENTRYID } }; 
     
    DEBUGPUBLIC("HrGWFindMtsOutFolder()"); 
 
    hr = CHK_HrGWFindMtsOutFolder( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the entry ID property.  
    hrT = MAPICALL(lpMdb)->GetProps( 
        lpMdb, 
        &rgPropTag, 
        fMapiUnicode, 
        &cValues, 
        &lpPropValue); 
 
    if(hrT == MAPI_W_ERRORS_RETURNED) 
    { 
        if((lpPropValue != NULL) && (lpPropValue->Value.ul == MAPI_E_NOT_FOUND)) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
        goto cleanup; 
    } 
 
    if(FAILED(hrT)) 
    { 
        lpPropValue = NULL; 
 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    ASSERTERROR(cValues != 0, "ZERO cValues variable"); 
 
    ASSERTERROR(lpPropValue != NULL, "NULL lpPropValue variable"); 
 
    // Check to make sure we got the right property. 
    if (lpPropValue->ulPropTag != PR_GW_MTSOUT_ENTRYID) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    cbeid = lpPropValue->Value.bin.cb; 
 
    sc = MAPIAllocateBuffer(cbeid, (void **)lppeid); 
 
    if(FAILED(sc)) 
    { 
        hr = HR_LOG(E_OUTOFMEMORY); 
        goto cleanup; 
    } 
 
    // Copy entry ID 
    CopyMemory( 
        *lppeid, 
        lpPropValue->Value.bin.lpb, 
        cbeid); 
 
    *lpcbeid = cbeid; 
 
cleanup: 
 
    MAPIFREEBUFFER(lpPropValue); 
 
    RETURN(hr); 
} 
 
//$--HrGWFindMtsInFolder------------------------------------------------------------- 
//  Find MTS-IN folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrGWFindMtsInFolder(                 // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // entry ID of MTS-IN 
{ 
    HRESULT       hr          = NOERROR; 
    HRESULT       hrT         = NOERROR; 
    SCODE         sc          = 0; 
    ULONG         cValues     = 0; 
    LPSPropValue  lpPropValue = NULL; 
    ULONG         cbeid       = 0; 
    SPropTagArray rgPropTag   = { 1, { PR_GW_MTSIN_ENTRYID } }; 
     
    DEBUGPUBLIC("HrGWFindMtsInFolder()"); 
 
    hr = CHK_HrGWFindMtsInFolder( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the entry ID property.  
    hrT = MAPICALL(lpMdb)->GetProps( 
        lpMdb, 
        &rgPropTag, 
        fMapiUnicode, 
        &cValues, 
        &lpPropValue); 
 
    if(hrT == MAPI_W_ERRORS_RETURNED) 
    { 
        if((lpPropValue != NULL) && (lpPropValue->Value.ul == MAPI_E_NOT_FOUND)) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
        goto cleanup; 
    } 
 
    if(FAILED(hrT)) 
    { 
        lpPropValue = NULL; 
 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    ASSERTERROR(cValues != 0, "ZERO cValues variable"); 
 
    ASSERTERROR(lpPropValue != NULL, "NULL lpPropValue variable"); 
 
    // Check to make sure we got the right property. 
    if (lpPropValue->ulPropTag != PR_GW_MTSIN_ENTRYID) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    cbeid = lpPropValue->Value.bin.cb; 
 
    sc = MAPIAllocateBuffer(cbeid, (void **)lppeid); 
 
    if(FAILED(sc)) 
    { 
        hr = HR_LOG(E_OUTOFMEMORY); 
        goto cleanup; 
    } 
 
    // Copy entry ID 
    CopyMemory( 
        *lppeid, 
        lpPropValue->Value.bin.lpb, 
        cbeid); 
 
    *lpcbeid = cbeid; 
 
cleanup: 
 
    MAPIFREEBUFFER(lpPropValue); 
 
    RETURN(hr); 
} 
 
//$--HrFindExchangePublicStore------------------------------------------------------- 
//  Find public store root folder. 
// ----------------------------------------------------------------------------- 
HRESULT HrFindExchangePublicStore(           // RETURNS: return code 
    IN LPMDB lpMdb,                     // pointer to message store 
    OUT ULONG *lpcbeid,                 // count of bytes in entry ID 
    OUT LPENTRYID *lppeid)              // entry ID of public store 
{ 
    HRESULT       hr          = NOERROR; 
    HRESULT       hrT         = NOERROR; 
    SCODE         sc          = 0; 
    ULONG         cValues     = 0; 
    LPSPropValue  lpPropValue = NULL; 
    ULONG         cbeid       = 0; 
    SPropTagArray rgPropTag   = { 1, { PR_NON_IPM_SUBTREE_ENTRYID } }; 
     
    DEBUGPUBLIC("HrFindExchangePublicStore()"); 
 
    hr = CHK_HrFindExchangePublicStore( 
        lpMdb, 
        lpcbeid, 
        lppeid); 
 
    if(FAILED(hr)) 
        RETURN(hr); 
 
    *lpcbeid = 0; 
    *lppeid  = NULL; 
 
    // Get the entry ID property.  
    hrT = MAPICALL(lpMdb)->GetProps( 
        lpMdb, 
        &rgPropTag, 
        fMapiUnicode, 
        &cValues, 
        &lpPropValue); 
 
    if(hrT == MAPI_W_ERRORS_RETURNED) 
    { 
        if((lpPropValue != NULL) && (lpPropValue->Value.ul == MAPI_E_NOT_FOUND)) 
        { 
            hr = HR_LOG(MAPI_E_NOT_FOUND); 
        } 
        else 
        { 
            hr = HR_LOG(E_FAIL); 
        } 
        goto cleanup; 
    } 
 
    if(FAILED(hrT)) 
    { 
        lpPropValue = NULL; 
 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    ASSERTERROR(cValues != 0, "ZERO cValues variable"); 
 
    ASSERTERROR(lpPropValue != NULL, "NULL lpPropValue variable"); 
 
    // Check to make sure we got the right property. 
    if (lpPropValue->ulPropTag != PR_NON_IPM_SUBTREE_ENTRYID) 
    { 
        hr = HR_LOG(E_FAIL); 
        goto cleanup; 
    } 
 
    cbeid = lpPropValue->Value.bin.cb; 
 
    sc = MAPIAllocateBuffer(cbeid, (void **)lppeid); 
 
    if(FAILED(sc)) 
    { 
        hr = HR_LOG(E_OUTOFMEMORY); 
        goto cleanup; 
    } 
 
    // Copy entry ID 
    CopyMemory( 
        *lppeid, 
        lpPropValue->Value.bin.lpb, 
        cbeid); 
 
    *lpcbeid = cbeid; 
 
cleanup: 
 
    MAPIFREEBUFFER(lpPropValue); 
 
    RETURN(hr); 
}