home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / mapi / manager.sh / smhatp.c < prev    next >
C/C++ Source or Header  |  1996-04-11  |  4KB  |  150 lines

  1. /*
  2.  *  S M H A T P . C
  3.  *
  4.  *  Automatic Additions To Personal Address Books
  5.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  6.  */
  7.  
  8. #include "_pch.h"
  9. #include <mspab.h>
  10.  
  11. static const MAPIUID muidPAB = PAB_PROVIDER_ID;
  12. static const SizedSPropTagArray (2, sptEid) = { 1, { PR_ENTRYID, PR_RECIPIENT_TYPE }};
  13.  
  14. HRESULT
  15. HrAddEntriesToPab (LPSMH lpsmh, LPMESSAGE lpmsg)
  16. {
  17.     HRESULT hr;
  18.     ENTRYLIST el = {0};
  19.     LPABCONT lpPab = NULL;
  20.     LPADRBOOK lpab = NULL;
  21.     LPENTRYID lpeid;
  22.     LPMAPITABLE lptbl = NULL;
  23.     LPSPropValue lpval = NULL;
  24.     LPSRowSet lprws = NULL;
  25.     UINT ie;
  26.     ULONG cbeid;
  27.     ULONG ce = 0;
  28.     ULONG cRows = 0;
  29.     ULONG ulT;
  30.  
  31.     /*  If this message is a report, we do not
  32.      *  want to add the recipient to the pab
  33.      */
  34.     hr = HrGetOneProp ((LPMAPIPROP)lpmsg, PR_MESSAGE_CLASS, &lpval);
  35.     if (!HR_FAILED (hr) && FLpszContainsLpsz (lpval->Value.LPSZ, "Report"))
  36.         goto ret;
  37.         
  38.     /*  Check to see if the installed PAB is the
  39.      *  one supplied by MAPI
  40.      */
  41.     hr = lpsmh->lpsess->lpVtbl->OpenAddressBook (lpsmh->lpsess,
  42.                                             0,
  43.                                             NULL,
  44.                                             0,
  45.                                             &lpab);
  46.     if (HR_FAILED(hr))
  47.         goto ret;
  48.  
  49.     hr = lpab->lpVtbl->GetPAB (lpab, &cbeid, &lpeid);
  50.     if (HR_FAILED (hr) || (0 == cbeid))
  51.         goto ret;
  52.     
  53.     /*  If this is not the MAPI pab, then we better
  54.      *  not play with it
  55.      */
  56.     if (memcmp (lpeid->ab, &muidPAB, sizeof(MAPIUID)))
  57.         goto ret;
  58.  
  59.     hr = lpab->lpVtbl->OpenEntry (lpab,
  60.                             cbeid,
  61.                             lpeid,
  62.                             NULL,
  63.                             0,
  64.                             &ulT,
  65.                             (LPUNKNOWN *) &lpPab);
  66.     (*lpsmh->lpfnFree) (lpeid);
  67.     UlRelease (lpab);
  68.     lpeid = NULL;
  69.     lpab = NULL;
  70.     if (HR_FAILED (hr))
  71.         goto ret;
  72.  
  73.     /*  Get the recipient table from the message */
  74.  
  75.     hr = lpmsg->lpVtbl->GetRecipientTable (lpmsg, 0, &lptbl);
  76.     if (HR_FAILED (hr))
  77.         goto ret;
  78.  
  79.     /*  Only get the entryIDs */
  80.  
  81.     hr = HrQueryAllRows (lptbl,
  82.                     (LPSPropTagArray) &sptEid,
  83.                     NULL,
  84.                     NULL,
  85.                     0,    /* all rows */
  86.                     &lprws);
  87.     UlRelease (lptbl);
  88.     lptbl = NULL;
  89.     if (HR_FAILED (hr))
  90.         goto ret;
  91.  
  92.     /*  Loop through all the recipients and remove those that
  93.      *  do not belong to the MAPI PAB
  94.      */
  95.     cRows = lprws->cRows;
  96.     if (FAILED ((*lpsmh->lpfnAlloc) (cRows*sizeof(SBinary), &el.lpbin)))
  97.         goto ret;
  98.     
  99.     for (ce = 0, ie = 0; ie < cRows; ie++)
  100.     {
  101.         LPSPropValue pval = lprws->aRow[ie].lpProps;
  102.         Assert (pval);
  103.         Assert (pval->ulPropTag == PR_ENTRYID);
  104.         cbeid = pval->Value.bin.cb;
  105.         lpeid = (LPENTRYID)pval->Value.bin.lpb;
  106.         Assert (cbeid);
  107.         Assert (lpeid);
  108.  
  109.         /*  If this is not a P1 and not from the MAPI PAB... */
  110.  
  111.         if (!(pval[1].Value.l & MAPI_P1) &&
  112.             memcmp (lpeid->ab, &muidPAB, sizeof(MAPIUID)))
  113.         {
  114.             /*  ... set it into the entry list */
  115.  
  116.             el.lpbin[ce].cb = cbeid;
  117.             el.lpbin[ce].lpb = (LPBYTE)lpeid;
  118.             ce++;
  119.         }
  120.     }
  121.  
  122.     /*  Now, copy everything over into the PAB */
  123.  
  124.     el.cValues = ce;
  125.     lpeid = NULL;
  126.     cbeid = 0;
  127.     
  128.     (void) lpPab->lpVtbl->CopyEntries (lpPab,
  129.                                 &el,
  130.                                 0,
  131.                                 NULL,
  132.                                 CREATE_CHECK_DUP_STRICT);
  133.  
  134. ret:
  135.  
  136.     if (lprws)
  137.     {
  138.         for (ie = 0; ie < cRows; ie++)
  139.             (*lpsmh->lpfnFree) (lprws->aRow[ie].lpProps);
  140.         (*lpsmh->lpfnFree) (lprws);
  141.     }
  142.     (*lpsmh->lpfnFree) (el.lpbin);
  143.     (*lpsmh->lpfnFree) (lpval);
  144.     UlRelease (lpPab);
  145.     UlRelease (lpab);
  146.     
  147.     DebugTraceResult (HrAddEntryiesToPab(), hr);
  148.     return hr;
  149. }
  150.