SMHATP.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:4k
源码类别:

Windows编程

开发平台:

Visual C++

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