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

Windows编程

开发平台:

Visual C++

  1. /***********************************************************************
  2.  *
  3.  *  TID.C
  4.  *
  5.  *  Sample Address Book Template ID  object
  6.  *  This file contains the code for implementing a template ID object
  7.  *  that is associated with entries from this provider.  In particular
  8.  *  the MailUser object generated in ABUSER.C needs this TID object when
  9.  *  it's been copied into another provider (i.e. the PAB).
  10.  *
  11.  *  Copyright 1992-1995 Microsoft Corporation.  All Rights Reserved.
  12.  *
  13.  ***********************************************************************/
  14. #include "abp.h"
  15. /*
  16.  *  Declaration of IMailUser object implementation
  17.  */
  18. #undef  INTERFACE
  19. #define INTERFACE   struct _TID
  20. #undef  MAPIMETHOD_
  21. #define MAPIMETHOD_(type, method)   MAPIMETHOD_DECLARE(type, method, TID_)
  22.         MAPI_IUNKNOWN_METHODS(IMPL)
  23.         MAPI_IMAPIPROP_METHODS(IMPL)
  24. #undef  MAPIMETHOD_
  25. #define MAPIMETHOD_(type, method)   MAPIMETHOD_TYPEDEF(type, method, TID_)
  26.         MAPI_IUNKNOWN_METHODS(IMPL)
  27.         MAPI_IMAPIPROP_METHODS(IMPL)
  28. #undef  MAPIMETHOD_
  29. #define MAPIMETHOD_(type, method)   STDMETHOD_(type, method)
  30. DECLARE_MAPI_INTERFACE(TID_)
  31. {
  32.     MAPI_IUNKNOWN_METHODS(IMPL)
  33.     MAPI_IMAPIPROP_METHODS(IMPL)
  34. };
  35. /*
  36.  *  The definition of the TID object
  37.  */
  38. typedef struct _TID {
  39.     const TID_Vtbl * lpVtbl;
  40.     SAB_Wrapped;
  41.     
  42.     /*
  43.      *  Private data
  44.      */
  45.     LPMAILUSER  lpABUser;
  46. } TID, *LPTID;
  47. /*
  48.  *  TID jump table is defined here...
  49.  */
  50. static const TID_Vtbl vtblTID =
  51. {
  52.     (TID_QueryInterface_METHOD *)   ABU_QueryInterface,
  53.     (TID_AddRef_METHOD *)           WRAP_AddRef,
  54.     TID_Release,
  55.     (TID_GetLastError_METHOD *)     WRAP_GetLastError,
  56.     (TID_SaveChanges_METHOD *)      WRAP_SaveChanges,
  57.     (TID_GetProps_METHOD *)         WRAP_GetProps,
  58.     (TID_GetPropList_METHOD *)      WRAP_GetPropList,
  59.     TID_OpenProperty,
  60.     (TID_SetProps_METHOD *)         WRAP_SetProps,
  61.     (TID_DeleteProps_METHOD *)      WRAP_DeleteProps,
  62.     (TID_CopyTo_METHOD *)           WRAP_CopyTo,
  63.     (TID_CopyProps_METHOD *)        WRAP_CopyProps,
  64.     (TID_GetNamesFromIDs_METHOD *)  WRAP_GetNamesFromIDs,
  65.     (TID_GetIDsFromNames_METHOD *)  WRAP_GetIDsFromNames,
  66. };
  67. /*************************************************************************
  68.  *
  69.  -  NewTID
  70.  -
  71.  *  Creates the TID object associated with a mail user.
  72.  *
  73.  *
  74.  */
  75. HRESULT
  76. HrNewTID(LPMAPIPROP *       lppMAPIPropNew,
  77.         ULONG               cbTemplateId,
  78.         LPENTRYID           lpTemplateId,
  79.         ULONG               ulTemplateFlags,
  80.         LPMAPIPROP          lpPropData,
  81.         LPABLOGON           lpABPLogon,
  82.         LPCIID              lpInterface,
  83.         HINSTANCE           hLibrary,
  84.         LPALLOCATEBUFFER    lpAllocBuff,
  85.         LPALLOCATEMORE      lpAllocMore,
  86.         LPFREEBUFFER        lpFreeBuff,
  87.         LPMALLOC            lpMalloc )
  88. {
  89.     LPTID lpTID = NULL;
  90.     SCODE sc;
  91.     HRESULT hr = hrSuccess;
  92.     LPMAILUSER lpABUser = NULL;
  93.     ULONG ulObjType;
  94.     /*
  95.      *  Create the user object corresponding to the template id
  96.      */
  97.     hr = HrNewSampUser( &lpABUser,
  98.                         &ulObjType,
  99.                         cbTemplateId,
  100.                         lpTemplateId,
  101.                         lpABPLogon,
  102.                         lpInterface,
  103.                         hLibrary,
  104.                         lpAllocBuff,
  105.                         lpAllocMore,
  106.                         lpFreeBuff,
  107.                         lpMalloc);
  108.     if (HR_FAILED(hr))
  109.     {
  110.         goto err;
  111.     }
  112.     Assert(ulObjType == MAPI_MAILUSER);
  113.     /*
  114.      *  Allocate space for the TID structure
  115.      */
  116.     sc = lpAllocBuff(sizeof(TID), (LPVOID *) &lpTID);
  117.     if (FAILED(sc))
  118.     {
  119.         hr = ResultFromScode(sc);
  120.         goto err;
  121.     }
  122.     /*
  123.      *  Initialize the TID structure
  124.      */
  125.     lpTID->lpVtbl = &vtblTID;
  126.     lpTID->lcInit = 1;
  127.     lpTID->hResult = hrSuccess;
  128.     lpTID->idsLastError = 0;
  129.     lpTID->hLibrary = hLibrary;
  130.     lpTID->lpAllocBuff = lpAllocBuff;
  131.     lpTID->lpAllocMore = lpAllocMore;
  132.     lpTID->lpFreeBuff = lpFreeBuff;
  133.     lpTID->lpMalloc = lpMalloc;
  134.     lpTID->lpABLogon = lpABPLogon;
  135.     lpTID->lpPropData = lpPropData;
  136.     lpTID->lpABUser = (LPMAILUSER) lpABUser;
  137.     if (ulTemplateFlags & FILL_ENTRY)
  138.     {
  139.         ULONG ulCount;
  140.         LPSPropValue lpspv = NULL;
  141.         /*
  142.          *  Copy all the properties from my object to the propdata
  143.          */
  144.         hr = lpABUser->lpVtbl->GetProps(lpABUser,
  145.             NULL,
  146.             0,      /* ansi */
  147.             &ulCount,
  148.             &lpspv);
  149.         if (HR_FAILED(hr))
  150.             goto err;
  151.         hr = lpPropData->lpVtbl->SetProps(lpPropData,
  152.             ulCount,
  153.             lpspv,
  154.             NULL);
  155.         lpFreeBuff(lpspv);
  156.         if (HR_FAILED(hr))
  157.             goto err;
  158.     }
  159.     /*
  160.      *  AddRef lpPropData so we can use it after we return
  161.      */
  162.     (void)lpPropData->lpVtbl->AddRef(lpPropData);
  163.     InitializeCriticalSection(&lpTID->cs);
  164.     /*  We must AddRef the lpABPLogon object since we will be using it
  165.      */
  166.     lpABPLogon->lpVtbl->AddRef(lpABPLogon);
  167.     *lppMAPIPropNew = (LPVOID) lpTID;
  168. out:
  169.     DebugTraceResult(HrNewTID, hr);
  170.     return hr;
  171. err:
  172.     if (lpABUser)
  173.         lpABUser->lpVtbl->Release(lpABUser);
  174.     
  175.     lpFreeBuff(lpTID);
  176.     goto out;
  177. }
  178. /*
  179.  -  TID_Release
  180.  -
  181.  *  Releases the TID object.  The main difference between this
  182.  *  Release and WRAP_Release() is that it also has to release the
  183.  *  lpABUser object.
  184.  *
  185.  *  Note the Release on the lpPropData.  This required because of
  186.  *  WRAP's implementation of IUnknown (which this object reuses).
  187.  */
  188. STDMETHODIMP_(ULONG) TID_Release(LPTID lpTID)
  189. {
  190.     LONG lcInit;
  191.     /*
  192.      * Check to see if it's large enough to hold this object
  193.      */
  194.     if (IsBadReadPtr(lpTID, sizeof(TID)))
  195.     {
  196.         /*
  197.          *  I'm not looking at an object that I expect to be.
  198.          */
  199.         return 1;
  200.     }
  201.     /*
  202.      *  Check to see that it's TIDs vtbl
  203.      */
  204.     if (lpTID->lpVtbl != &vtblTID)
  205.     {
  206.         /*
  207.          *  It's big enough but it's got the wrong vtbl.
  208.          */
  209.         return 1;
  210.     }
  211.     /*
  212.      *  Release the mapi property object
  213.      */
  214.     lpTID->lpPropData->lpVtbl->Release(
  215.         lpTID->lpPropData);
  216.     EnterCriticalSection(&lpTID->cs);
  217.     lcInit = --lpTID->lcInit;
  218.     LeaveCriticalSection(&lpTID->cs);
  219.     if (lcInit == 0)
  220.     {
  221.         /*
  222.          *  Release the ABUser object
  223.          */
  224.         lpTID->lpABUser->lpVtbl->Release(
  225.             lpTID->lpABUser);
  226.         /*  
  227.          *  Release our reference to the ABLogon object.
  228.          */
  229.         if (lpTID->lpABLogon)
  230.         {
  231.             lpTID->lpABLogon->lpVtbl->Release(lpTID->lpABLogon);
  232.             lpTID->lpABLogon = NULL;
  233.         }
  234.         /*
  235.          *  Clean up the critical section
  236.          */
  237.         DeleteCriticalSection(&lpTID->cs);
  238.         /*
  239.          * Need to free the object
  240.          */
  241.         lpTID->lpFreeBuff(lpTID);
  242.         return 0;
  243.     }
  244.     return lcInit;
  245. }
  246. /*
  247.  -  TID_OpenProperty
  248.  -
  249.  *  Satisfies the object that are needed to support the "Options" details pane
  250.  *  associated with the MailUser object from ABUSER.C.
  251.  *
  252.  *  Note:  We are masking error strings that might be possible to get from the
  253.  *  lpABUser object.  Since (for the most part) the only errors that can be returned
  254.  *  from this object are resource failure types, it wouldn't be of much use to the
  255.  *  user.
  256.  */
  257. STDMETHODIMP
  258. TID_OpenProperty(LPTID lpTID,
  259.     ULONG ulPropTag,
  260.     LPCIID lpiid,
  261.     ULONG ulInterfaceOptions,
  262.     ULONG ulFlags,
  263.     LPUNKNOWN * lppUnk)
  264. {
  265.     HRESULT hResult;
  266.     /*
  267.      *  Check to see if it's large enough to hold this object
  268.      */
  269.     if (IsBadReadPtr(lpTID, sizeof(TID)))
  270.     {
  271.         /*
  272.          *  No vtbl found
  273.          */
  274.         return ResultFromScode(E_INVALIDARG);
  275.     }
  276.     /*
  277.      *  Check to see that it's TIDs vtbl
  278.      */
  279.     if (lpTID->lpVtbl != &vtblTID)
  280.     {
  281.         /*
  282.          *  It's big enough but it's got the wrong vtbl.
  283.          */
  284.         return ResultFromScode(E_INVALIDARG);
  285.     }
  286.     if ( ulInterfaceOptions & ~MAPI_UNICODE )
  287.     {
  288.         DebugTraceArg( TID_OpenProperty, "unknown flags" );
  289.         return ResultFromScode( MAPI_E_UNKNOWN_FLAGS );
  290.     }
  291.     
  292.     if ( ulInterfaceOptions & MAPI_UNICODE )
  293.     {
  294.         DebugTraceArg( TID_OpenProperty, "bad character width" );
  295.         return ResultFromScode( MAPI_E_BAD_CHARWIDTH );
  296.     }
  297.     /*
  298.      *  Don't want to check any other parameters here.
  299.      *  Calls down to wrapped objects will do this for
  300.      *  me.
  301.      */
  302.     switch (ulPropTag)
  303.     {
  304.         case PR_LISTBOX_TABLE:
  305.         case PR_DDLISTBOX_TABLE:
  306.         case PR_COMBOBOX_TABLE:
  307.         {
  308.             hResult = lpTID->lpABUser->lpVtbl->OpenProperty(
  309.                 lpTID->lpABUser,
  310.                 ulPropTag,
  311.                 lpiid,
  312.                 ulInterfaceOptions,
  313.                 ulFlags,
  314.                 lppUnk);
  315.             break;
  316.         }
  317.         default:
  318.         {
  319.             hResult = lpTID->lpPropData->lpVtbl->OpenProperty(
  320.                 lpTID->lpPropData,
  321.                 ulPropTag,
  322.                 lpiid,
  323.                 ulInterfaceOptions,
  324.                 ulFlags,
  325.                 lppUnk);
  326.             break;
  327.         }
  328.     }
  329.     DebugTraceResult(TID_OpenProperty, hResult);
  330.     return hResult;
  331. }