CREATEPR.C
/* 
 *  CREATEPR.C 
 * 
 *      Very simple console app creating a profile with hardcoded values. 
 * 
 *   Copyright (c) 1995, Microsoft Corporation. All Rights Reserved. 
 * 
 */ 
 
#include <mapiutil.h> 
#include <mapiwin.h> 
#include <mapidbg.h> 
#include <stdio.h> 
#include <smpms.h> 
#include <smpxp.h> 
#include <smpab.h> 
 
#ifdef DEBUG 
#define TraceFnResult(f, hr)    \ 
{ (hr) ?   \ 
printf(#f " returns 0x%08lX %s\n", GetScode(hr), SzDecodeScode(GetScode(hr))) : 0;\ 
} 
#else 
#define TraceFnResult(f, hr) 
#endif  /*/DEBUG*/ 
 
 
HRESULT HrCreateProfile(void); 
 
 
int main (void) 
{ 
    HRESULT hr = 0; 
 
    hr = HrCreateProfile(); 
 
    return (int) hr; 
} 
 
 
 
 
HRESULT HrCreateProfile(void) 
{ 
    LPPROFADMIN         ppa = NULL; 
    LPSERVICEADMIN      psa = NULL; 
    LPMAPISESSION       pses = NULL; 
    LPMAPITABLE         ptblSvc = NULL; 
    HRESULT             hr; 
     
    LPSRowSet           prows = NULL; 
    LPSRow              prow = NULL; 
 
    enum {iSvcName, iSvcUID, cptaSvc}; 
    SizedSPropTagArray (cptaSvc, ptaSvc) = { cptaSvc,  
                                            {   PR_SERVICE_NAME, 
                                                PR_SERVICE_UID } }; 
    LPSTR               szProfile = "User XXX"; 
    #define cProviders  3 
    #define nMAXProps   6 
    SPropValue          rgval[nMAXProps]; 
 
 
    hr = MAPIInitialize(NULL); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(MAPIInitialize, hr); 
        return hr; 
    } 
 
    hr = MAPIAdminProfiles(0, &ppa); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(MAPIAdminProfiles, hr); 
        goto ret; 
    } 
 
    (void) ppa->lpVtbl->DeleteProfile(ppa, szProfile, 0); 
 
    printf("Creating profile \"%s\"\n", szProfile); 
    hr = ppa->lpVtbl->CreateProfile(ppa, szProfile, NULL, 0, 0); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(CreateProfile, hr); 
        goto ret; 
    } 
 
    hr = MAPILogonEx(0, szProfile, NULL, MAPI_NO_MAIL | MAPI_NEW_SESSION, 
                               &pses); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(MAPILogonEx, hr); 
        goto ret; 
    } 
 
    hr = pses->lpVtbl->AdminServices(pses, 0, &psa); 
    if (HR_FAILED(hr)) 
        goto ret; 
     
    printf("Creating Sample Message Store\n"); 
    hr = psa->lpVtbl->CreateMsgService(psa, "SMPMS", "MAPI Sample Msg Store", 0, 0); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(CreateMsgService, hr); 
        goto ret; 
    } 
 
    printf("Creating Sample Transport\n"); 
    hr = psa->lpVtbl->CreateMsgService(psa, "SMPXP",  
                                        "Sample Peer To Peer Transport", 0, 0); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(CreateMsgService, hr); 
        goto ret; 
    } 
 
    printf("Creating Sample Address Book\n"); 
    hr = psa->lpVtbl->CreateMsgService(psa, "SMPAB",  
                                        "Sample Addres Book", 0, 0); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(CreateMsgService, hr); 
        goto ret; 
    } 
 
 
    hr = psa->lpVtbl->GetMsgServiceTable(psa, 0, &ptblSvc); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(GetMsgServiceTable, hr); 
        goto ret; 
    } 
 
    hr = HrQueryAllRows(ptblSvc, (LPSPropTagArray)&ptaSvc, NULL, NULL, 0, &prows); 
    if (HR_FAILED(hr)) 
    { 
        TraceFnResult(HrQueryAllRows, hr); 
        goto ret; 
    } 
 
    Assert(prows->cRows == cProviders); 
     
    for(prow = prows->aRow; prow < prows->aRow + cProviders; ++prow) 
    { 
        Assert(prow->cValues == cptaSvc); 
        Assert(prow->lpProps[iSvcName].ulPropTag == PR_SERVICE_NAME); 
        Assert(prow->lpProps[iSvcUID].ulPropTag == PR_SERVICE_UID); 
        Assert(prow->lpProps[iSvcUID].Value.bin.cb == sizeof(MAPIUID)); 
 
        if(!lstrcmp(prow->lpProps[iSvcName].Value.lpszA, "SMPMS")) 
        { 
            printf("Configuring Sample Message Store..."); 
         
            rgval[0].ulPropTag      = PR_SMS_PATH; 
            rgval[0].Value.lpszA    = "d:\\sms"; 
             
            rgval[1].ulPropTag      = PR_SMS_PASSWORD; 
            rgval[1].Value.lpszA    = "PASSWORD"; 
             
            rgval[2].ulPropTag      = PR_SMS_REMEMBER_PW; 
            rgval[2].Value.b        = TRUE; 
             
            rgval[3].ulPropTag      = PR_SMS_CREATE; 
            rgval[3].Value.b        = TRUE; 
             
            hr = psa->lpVtbl->ConfigureMsgService(psa,  
                                (LPMAPIUID) prow->lpProps[iSvcUID].Value.bin.lpb, 
                                            0, 0, 4, rgval); 
            if (HR_FAILED(hr)) 
            { 
                printf("failed\n"); 
                TraceFnResult(ConfigureMsgService, hr); 
                //goto ret; 
            } 
            else 
            { 
                printf("OK\n"); 
            } 
        } 
        else if(!lstrcmp(prow->lpProps[iSvcName].Value.lpszA, "SMPXP")) 
        { 
            printf("Configuring Sample Transport..."); 
         
            rgval[0].ulPropTag  = PR_SAMPLE_DISPLAY_NAME; 
            rgval[0].Value.LPSZ = "USER XXX"; 
             
            rgval[1].ulPropTag  = PR_SAMPLE_EMAIL_ADDR_TYPE; 
            rgval[1].Value.LPSZ = "MSPEER"; 
             
            rgval[2].ulPropTag  = PR_SAMPLE_EMAIL_ADDRESS; 
            rgval[2].Value.LPSZ = "\\\\aleksank\\d\\test\\inbound"; 
             
            rgval[3].ulPropTag  = PR_SAMPLE_INBOUND_DIR; 
            rgval[3].Value.LPSZ = "d:\\test\\inbound"; 
 
            rgval[4].ulPropTag  = PR_SAMPLE_OUTBOUND_DIR; 
            rgval[4].Value.LPSZ = "d:\\test\\outbound"; 
 
            rgval[5].ulPropTag  = PR_SAMPLE_FLAGS; 
            rgval[5].Value.l    = 9; 
 
            hr = psa->lpVtbl->ConfigureMsgService(psa,  
                                (LPMAPIUID) prow->lpProps[iSvcUID].Value.bin.lpb, 
                                            0, 0, 6, rgval); 
            if (HR_FAILED(hr)) 
            { 
                printf("failed\n"); 
                TraceFnResult(ConfigureMsgService, hr); 
                //goto ret; 
            } 
            else 
            { 
                printf("OK\n"); 
            } 
        } 
        else if(!lstrcmp(prow->lpProps[iSvcName].Value.lpszA, "SMPAB")) 
        { 
            printf("Configuring Sample Address Book..."); 
         
            rgval[0].ulPropTag  = PR_SAB_FILE; 
            rgval[0].Value.LPSZ = "d:\\sampab.sab"; 
             
            hr = psa->lpVtbl->ConfigureMsgService(psa,  
                                (LPMAPIUID) prow->lpProps[iSvcUID].Value.bin.lpb, 
                                            0, 0, 1, rgval); 
            if (HR_FAILED(hr)) 
            { 
                printf("failed\n"); 
                TraceFnResult(ConfigureMsgService, hr); 
                //goto ret; 
            } 
            else 
            { 
                printf("OK\n"); 
            } 
        } 
        else 
        { 
            Assert(FALSE); 
        } 
    } 
             
ret: 
     
    UlRelease(ptblSvc); 
    UlRelease(psa); 
    UlRelease(pses); 
    UlRelease(ppa); 
    FreeProws(prows); 
    MAPIUninitialize(); 
    return hr; 
}