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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  *  M S P I N I T . C
  3.  *
  4.  *  Initialize the MAPI Sample Message Store Provider.
  5.  *
  6.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  7.  */
  8. #include "msp.h"
  9. CHAR szFolderTemplate[]         = "*.fld";
  10. CHAR szMessageTemplate[]        = "*.msg";
  11. CHAR szPropertyFileName[]       = "folder.prp";
  12. CHAR szHierarchyFileName[]      = "hierarch.tbl";
  13. CHAR szContentsFileName[]       = "contents.tbl";
  14. CHAR szOutgoingFileName[]       = "outgoing.tbl";
  15. #define MSP_CheckParameters(pobj, intf, method, arglist)        
  16.         OBJ_CheckParameters(pobj, intf, method, sizeof(MSP), &vtblMSP, arglist)
  17. MSP_Vtbl vtblMSP =
  18. {
  19.     (MSP_QueryInterface_METHOD *)   OBJ_QueryInterface,
  20.     (MSP_AddRef_METHOD *)           OBJ_AddRef,
  21.     MSP_Release,
  22.     MSP_Shutdown,
  23.     MSP_Logon,
  24.     MSP_SpoolerLogon,
  25.     MSP_CompareStoreIDs
  26. };
  27. /*
  28.  *  Exported functions
  29.  */
  30. /*
  31.  *  MSProviderInit
  32.  *
  33.  *  Purpose:
  34.  *      Message Store Provider initialization and version handshake
  35.  *      with MAPI.  Called once for each MAPI Session that uses this
  36.  *      store provider DLL on this process.  Passes back an init
  37.  *      object (LPMSPROVIDER) used for further access to this provider.
  38.  *
  39.  *  Arguments:
  40.  *      ulFlags         Reserved for future use.  Ignored.
  41.  *      ulMAPIVersion   Version of Message Store SPI used by MAPI.
  42.  *      lpulMDBVersion  [out] Version of SPI supported by the provider.
  43.  *      ppmsp   [out] MS Provider object for further access.
  44.  *
  45.  *  Returns:
  46.  *      HRESULT
  47.  *
  48.  *  Side effects:
  49.  *      None.
  50.  *
  51.  *  Errors:
  52.  *      MAPI_E_VERSION              Require a higher version of MAPI
  53.  *      MAPI_E_NOT_ENOUGH_MEMORY    Insufficient memory
  54.  *      Any errors from ScInitMSInstance()
  55.  */
  56. STDINITMETHODIMP
  57. MSProviderInit(HINSTANCE hInstance, LPMALLOC pmalloc,
  58.     LPALLOCATEBUFFER pfnAllocBuf, LPALLOCATEMORE pfnAllocMore,
  59.     LPFREEBUFFER pfnFreeBuf, ULONG ulFlags, ULONG ulMAPIVersion,
  60.     ULONG * pulMDBVersion, LPMSPROVIDER * ppmsp)
  61. {
  62.     SCODE sc = S_OK;
  63.     PMSP pmsp = NULL;
  64.     AssertSz(pmalloc, "Bad pmalloc");
  65.     AssertSz(pfnAllocBuf, "Bad pfnAllocBuf");
  66.     AssertSz(pfnAllocMore, "Bad pfnAllocMore");
  67.     AssertSz(pfnFreeBuf, "Bad pfnFreeBuf");
  68.     NFAssertSz(!ulFlags, "Unknown flags, bug in MAPI DLL");
  69.     AssertSz(pulMDBVersion, "Bad pulMDBVersion");
  70.     AssertSz(ppmsp, "Bad ppmsp");
  71.     /* This provider requires MAPI to be at least the version
  72.      * of the SPI defined at the time this provider was compiled.
  73.      */
  74.     if (ulMAPIVersion < CURRENT_SPI_VERSION)
  75.     {
  76.         sc = MAPI_E_VERSION;
  77.         goto exit;
  78.     }
  79.     /* Initialize the per-instance global data */
  80.     sc = ScInitMSInstance(pmalloc);
  81.     if (sc != S_OK)
  82.         goto exit;
  83.     /* Allocate and initialize the MSPROVIDER object. */
  84.     sc = ScAllocZ(sizeof(MSP), (PPV) &pmsp);
  85.     if (sc != S_OK)
  86.     {
  87.         DeinitMSInstance();
  88.         goto exit;
  89.     }
  90.     OBJ_Initialize(pmsp, &vtblMSP, OT_MSPROVIDER, 0, &pmsp->cs);
  91.     pmsp->hInst = hInstance;
  92.     pmsp->lmr.lpAllocBuf = pfnAllocBuf;
  93.     pmsp->lmr.lpAllocMore = pfnAllocMore;
  94.     pmsp->lmr.lpFreeBuf = pfnFreeBuf;
  95.     InitializeCriticalSection(&pmsp->cs);
  96.     /* Pass back [out] parameters. */
  97.     *pulMDBVersion = CURRENT_SPI_VERSION;
  98.     *ppmsp = (LPMSPROVIDER) pmsp;
  99. exit:
  100.     DebugTraceSc(MSProviderInit, sc);
  101.     return ResultFromScode(ScCheckSc(sc, IMSProvider_Init));
  102. }
  103. /*
  104.  -  MSP_Release
  105.  -
  106.  */
  107. STDMETHODIMP_(ULONG) MSP_Release(PMSP pmsp)
  108. {
  109.     LONG cRef;
  110.     MSP_EnterCriticalSection(pmsp);
  111.     cRef = --pmsp->cRef;
  112.     AssertSz2(cRef >= 0, "MSP_Release(pmsp=%08lX): Bogus cRef (%08lX)",
  113.         pmsp, cRef);
  114.     AssertSz(cRef > 0 || pmsp->pobjHead == NULL, "There are still valid logons");
  115.     MSP_LeaveCriticalSection(pmsp);
  116.     if (cRef == 0)
  117.     {
  118.         DeleteCriticalSection(&pmsp->cs);
  119.         FreeNull(pmsp);
  120.         DeinitMSInstance();
  121.     }
  122.     return (cRef);
  123. }
  124. /*
  125.  *  MSP_Shutdown
  126.  *
  127.  *  Purpose:
  128.  *      Allow MAPI to specify flags related to the Release().
  129.  *
  130.  *  Arguments:
  131.  *      pulFlags        Reserved for future use.  Ignored.
  132.  *
  133.  *  Returns:
  134.  *      HRESULT
  135.  *
  136.  *  Side effects:
  137.  *      None.
  138.  *
  139.  *  Errors:
  140.  *      None.
  141.  */
  142. STDMETHODIMP
  143. MSP_Shutdown(PMSP pmsp, ULONG * pulFlags)
  144. {
  145.     MSP_CheckParameters(
  146.             pmsp, 
  147.             IMSProvider, 
  148.             Shutdown,
  149.             (pmsp,
  150.             pulFlags));
  151.     MSP_EnterCriticalSection(pmsp);
  152.     /* MAPI says it will never call Release with valid logons, */
  153.     /* let's make sure.                                        */
  154.     AssertSz(pmsp->pobjHead == NULL, "There are still valid logons");
  155. #ifdef DEBUG
  156.     pmsp->fInvalid = TRUE;
  157. #endif
  158.     MSP_LeaveCriticalSection(pmsp);
  159.     return 0;
  160. }
  161. /*
  162.  *  MSP_CompareStoreIDs
  163.  *
  164.  *  Purpose:
  165.  *      Compare the EntryIDs of two message stores.
  166.  *
  167.  *  Arguments:
  168.  *      pmsp                MSPROVIDER object returned by MSProviderInit.
  169.  *      lcbEntryID1         Size of first EntryID.
  170.  *      lpEntryID1          First EntryID to compare.
  171.  *      lcbEntryID2         Size of second EntryID.
  172.  *      lpEntryID2          Second EntryID to compare.
  173.  *      ulFlags             Flags.  Reserved for future use.
  174.  *      pulResult           Address in which to place the result of
  175.  *                          the comparison (TRUE or FALSE).
  176.  *
  177.  *  Returns:
  178.  *      HRESULT
  179.  *
  180.  *  Side effects:
  181.  *      None.
  182.  *
  183.  *  Errors:
  184.  *      None.
  185.  */
  186. STDMETHODIMP
  187. MSP_CompareStoreIDs(PMSP pmsp, ULONG lcbEntryID1, LPENTRYID lpEntryID1,
  188.     ULONG lcbEntryID2, LPENTRYID lpEntryID2, ULONG ulFlags,
  189.     ULONG *pulResult)
  190. {
  191.     PEID peid1 = (PEID) lpEntryID1;
  192.     PEID peid2 = (PEID) lpEntryID2;
  193.     MSP_CheckParameters(
  194.             pmsp, 
  195.             IMSProvider,
  196.             CompareStoreIDs,
  197.             (pmsp,
  198.             lcbEntryID1, 
  199.             lpEntryID1,
  200.             lcbEntryID2, 
  201.             lpEntryID2, 
  202.             ulFlags,
  203.             pulResult));
  204.     AssertSz(!pmsp->fInvalid,
  205.         "This MSProvider has already been shutdown");
  206.     /* The Sample Store's method of deriving and comparing   */
  207.     /* store EntryIDs has the quirky behavior that if any    */
  208.     /* OTHER store's EntryIDs are binary-comparable, this    */
  209.     /* function will return a successful match, without ever */
  210.     /* knowing that the EntryIDs were not Sample Store       */
  211.     /* EntryIDs.  A subsequent logon would, of course, fail. */
  212.     /* Case-insensitive string compare on part, binary on rest. */
  213.     if (    lcbEntryID1 >= offsetof(EID, szPath) + sizeof(TCHAR)
  214.         &&  lcbEntryID1 == lcbEntryID2
  215.         &&  memcmp(peid1, peid2, offsetof(EID, szPath)) == 0
  216.         &&  peid1->bVersion == SMPMS_VERSION
  217.         &&  lstrcmpi(peid1->szPath, peid2->szPath) == 0)
  218.     {
  219.         *pulResult = TRUE;
  220.     }
  221.     else
  222.     {
  223.         *pulResult = FALSE;
  224.     }
  225.     return hrSuccess;
  226. }