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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  S M H M D B . C
  3.  *
  4.  *  Sample mail handling hook
  5.  *  Store Tables
  6.  *
  7.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  8.  */
  9. #include "_pch.h"
  10. /*
  11.  *  sptStoTbl
  12.  *
  13.  *  The store table column set and enum
  14.  */
  15. enum { ipNull, ipEid, ipDispNm, ipRsrcFlags, cpStoTblMax };
  16. static const SizedSPropTagArray (cpStoTblMax, sptStoTbl) =
  17. {
  18.     cpStoTblMax,
  19.     {
  20.         PR_NULL,
  21.         PR_ENTRYID,
  22.         PR_DISPLAY_NAME_A,
  23.         PR_RESOURCE_FLAGS
  24.     }
  25. };
  26. /*
  27.  *  HrInitStoresTable()
  28.  *
  29.  *  Purpose:
  30.  *
  31.  *      Inits the stores table stucture and adds a reference to the SMH
  32.  *      parent object.  This is done by getting the message stores table
  33.  *      from the MAPI session and querying all rows (up to cStoMax) and
  34.  *      mapping the return to an LPSTOTABLE structure.
  35.  *
  36.  *  Arguments:
  37.  *
  38.  *      lpsmh           the SMH parent object
  39.  *      lpsess          the MAPI session that this SMH instance belongs to
  40.  *
  41.  *  Returns:
  42.  *
  43.  *      (HRESULT)
  44.  */
  45. HRESULT
  46. HrInitStoresTable (LPSMH lpsmh, LPMAPISESSION lpsess)
  47. {
  48.     HRESULT hr;
  49.     LPMAPITABLE lptbl;
  50.     LPSRowSet lprws = NULL;
  51.     LPSTOTABLE lpstotbl;
  52.     UINT i;
  53.     Assert (lpsmh->lpstotbl == NULL);
  54.     hr = lpsess->lpVtbl->GetMsgStoresTable (lpsess, 0, &lptbl);
  55.     if (!HR_FAILED (hr))
  56.     {
  57.         hr = lptbl->lpVtbl->SetColumns (lptbl, (LPSPropTagArray)&sptStoTbl, 0);
  58.         if (!HR_FAILED (hr))
  59.         {
  60.             hr = lptbl->lpVtbl->QueryRows (lptbl, cStoMax, 0, &lprws);
  61.             if (!HR_FAILED (hr))
  62.             {
  63.                 /*  Zero fill the initial property in all rows.
  64.                  *  This has the nice side effect of NULL'ing the
  65.                  *  lpmdb member of the structure
  66.                  */
  67.                 lpstotbl = (LPSTOTABLE)lprws;
  68.                 for (i = 0; i < lpstotbl->cSto; i++)
  69.                     memset (&lpstotbl->aSto[i].lpstoe->valPad,
  70.                         0, sizeof(SPropValue));
  71.                 lpsmh->lpstotbl = lpstotbl;
  72.             }
  73.         }
  74.         UlRelease (lptbl);
  75.     }
  76.     DebugTraceResult (HrInitStoresTable(), hr);
  77.     return hr;
  78. }
  79. /*
  80.  *  ReleaseStoresTable()
  81.  *
  82.  *  Purpose:
  83.  *
  84.  *      Releases all resources owned by the store table and disconnects
  85.  *      the SMH parent from the table.
  86.  *
  87.  *  Arguments:
  88.  *
  89.  *      lpsmh       the SMH parent object
  90.  */
  91. VOID
  92. ReleaseStoresTable (LPSMH lpsmh)
  93. {
  94.     LPSTOTABLE lpstotbl = lpsmh->lpstotbl;
  95.     UINT i;
  96.     if (lpstotbl)
  97.     {
  98.         for (i = 0; i < lpstotbl->cSto; i++)
  99.         {
  100.             UlRelease (lpstotbl->aSto[i].lpstoe->lpmdb);
  101.             (*lpsmh->lpfnFree) (lpstotbl->aSto[i].lpProps);
  102.         }
  103.         (*lpsmh->lpfnFree) (lpstotbl);
  104.         lpsmh->lpstotbl = NULL;
  105.     }
  106.     return;
  107. }
  108. /*
  109.  *  HrOpenStoEntry()
  110.  *
  111.  *  Purpose:
  112.  *
  113.  *      Opens the store associated with a stoenty in the stores table.
  114.  *
  115.  *      IMPORTANT: the caller does not end up owning the store reference
  116.  *      and should NOT call Release() on the store unless they also call
  117.  *      AddRef().  The referece is owned by the stores table and is
  118.  *      released upon the tables destruction.
  119.  *
  120.  *  Arguments:
  121.  *
  122.  *      lpsess          the MAPI session object
  123.  *      lpsto           the STO structure for the MDB to open
  124.  *      lppmdb  [OUT]   contains the LPMDB iff the call succeeds
  125.  *
  126.  *  Returns:
  127.  *
  128.  *      (HRESULT)
  129.  */
  130. HRESULT
  131. HrOpenStoEntry (LPMAPISESSION lpsess, LPSTO lpsto, LPMDB FAR * lppmdb)
  132. {
  133.     HRESULT hr = hrSuccess;
  134.     LPMDB lpmdb = NULL;
  135.     if (!lpsto->lpstoe->lpmdb)
  136.     {
  137.         hr = lpsess->lpVtbl->OpenMsgStore (lpsess,
  138.                                 0,
  139.                                 lpsto->lpProps[ipEid].Value.bin.cb,
  140.                                 (LPENTRYID)lpsto->lpProps[ipEid].Value.bin.lpb,
  141.                                 NULL,
  142.                                 MDB_WRITE | MDB_NO_DIALOG | MDB_NO_MAIL,
  143.                                 &lpmdb);
  144.         if (!HR_FAILED (hr))
  145.             lpsto->lpstoe->lpmdb = lpmdb;
  146.         
  147.         *lppmdb = lpmdb;
  148.     }
  149.     else
  150.     {
  151.         *lppmdb = lpsto->lpstoe->lpmdb;
  152.     }
  153.     DebugTraceResult (HrOpenStoEntry(), hr);
  154.     return hr;
  155. }
  156. /*
  157.  *  HrOpenMdbFromEid()
  158.  *
  159.  *  Purpose:
  160.  *
  161.  *      Opens a message store by entryid.  The entryid is looked up in
  162.  *      the stores table to find the proper STOENTRY.  If no entry is
  163.  *      found, then the store is not opened.  If one is found, then the
  164.  *      MDB is retrieved from the STOENTRY.  If it has not yet been opened,
  165.  *      the MDB is opened at this time and stored (no pun intended).
  166.  *
  167.  *      IMPORTANT: the caller does not end up owning the store reference
  168.  *      and should NOT call Release() on the store unless they also call
  169.  *      AddRef().  The referece is owned by the stores table and is
  170.  *      released upon the tables destruction.
  171.  *
  172.  *  Arguments:
  173.  *
  174.  *      lpsmh           the SMH parent object
  175.  *      cbeid           size of the stores entryid
  176.  *      lpeid           the entryid to be opened
  177.  *      lppmdb  [OUT]   contains the LPMDB iff the call succeeds
  178.  *
  179.  *  Returns:
  180.  *
  181.  *      (HRESULT)
  182.  */
  183. HRESULT
  184. HrOpenMdbFromEid (LPSMH lpsmh, ULONG cbeid, LPENTRYID lpeid, LPMDB FAR * lppmdb)
  185. {
  186.     HRESULT hr = ResultFromScode (MAPI_E_NOT_FOUND);
  187.     LPSTOTABLE lpstotbl = lpsmh->lpstotbl;
  188.     UINT i;
  189.     if (lpstotbl)
  190.     {
  191.         for (i = 0; i < lpstotbl->cSto; i++)
  192.         {
  193.             if ((cbeid == lpstotbl->aSto[i].lpProps[ipEid].Value.bin.cb) &&
  194.                 !memcmp (lpeid, lpstotbl->aSto[i].lpProps[ipEid].Value.bin.lpb, (UINT)cbeid))
  195.             {
  196.                 if (lpstotbl->aSto[i].lpstoe->lpmdb)
  197.                 {
  198.                     *lppmdb = lpstotbl->aSto[i].lpstoe->lpmdb;
  199.                     hr = hrSuccess;
  200.                 }
  201.                 else
  202.                     hr = HrOpenStoEntry (lpsmh->lpsess, &lpstotbl->aSto[i], lppmdb);
  203.                 break;
  204.             }
  205.         }
  206.     }
  207.     if (HR_FAILED (hr))
  208.         *lppmdb = NULL;
  209.     DebugTraceResult (HrOpenMdbFromEid(), hr);
  210.     return hr;
  211. }
  212. /*
  213.  *  HrOpenMdbFromName()
  214.  *
  215.  *  Purpose:
  216.  *
  217.  *      Opens a message store by PR_DISPLAY_NAME value.  The name is
  218.  *      looked up in the stores table to find the proper STOENTRY.  If no
  219.  *      entry is found, then the store is not opened.  If one is found,
  220.  *      then the MDB is retrieved from the STOENTRY.  If it has not yet
  221.  *      been opened, the MDB is opened at this time and stored (no pun
  222.  *      intended).
  223.  *
  224.  *      IMPORTANT: the caller does not end up owning the store reference
  225.  *      and should NOT call Release() on the store unless they also call
  226.  *      AddRef().  The referece is owned by the stores table and is
  227.  *      released upon the tables destruction.
  228.  *
  229.  *  Arguments:
  230.  *
  231.  *      lpsmh           the SMH parent object
  232.  *      lpszName        the name of the store to open
  233.  *      lppmdb  [OUT]   contains the LPMDB iff the call succeeds
  234.  *
  235.  *  Returns:
  236.  *
  237.  *      (HRESULT)
  238.  */
  239. HRESULT
  240. HrOpenMdbFromName (LPSMH lpsmh, LPTSTR lpszName, LPMDB FAR * lppmdb)
  241. {
  242.     HRESULT hr = ResultFromScode (MAPI_E_NOT_FOUND);
  243.     LPSTOTABLE lpstotbl = lpsmh->lpstotbl;
  244.     UINT i;
  245.     if (lpstotbl)
  246.     {
  247.         for (i = 0; i < lpstotbl->cSto; i++)
  248.         {
  249.             if (!lstrcmpi (lpszName, lpstotbl->aSto[i].lpProps[ipDispNm].Value.LPSZ))
  250.             {
  251.                 if (lpstotbl->aSto[i].lpstoe->lpmdb)
  252.                 {
  253.                     *lppmdb = lpstotbl->aSto[i].lpstoe->lpmdb;
  254.                     hr = hrSuccess;
  255.                 }
  256.                 else
  257.                     hr = HrOpenStoEntry (lpsmh->lpsess, &lpstotbl->aSto[i], lppmdb);
  258.                 break;
  259.             }
  260.         }
  261.     }
  262.     if (HR_FAILED (hr))
  263.         *lppmdb = NULL;
  264.     DebugTraceResult (HrOpenMdbFromEid(), hr);
  265.     return hr;
  266. }