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 / smhole.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-11  |  6.1 KB  |  229 lines

  1. /*
  2.  *  S M H O L E . C
  3.  *
  4.  *  Sample mail handling hook OLE storage support for RICHEDIT
  5.  *  Copyright 1992-95 Microsoft Corporation.  All Rights Reserved.
  6.  */
  7.  
  8. #include "_pch.h"
  9. DEFINE_OLEGUID(IID_IRichEditOleCallback, 0x00020D03, 0, 0);
  10. const REOC_Vtbl vtblREOC =
  11. {
  12.     REOC_QueryInterface,
  13.     REOC_AddRef,
  14.     REOC_Release,
  15.     REOC_GetNewStorage,
  16.     REOC_GetInPlaceContext,
  17.     REOC_ShowContainerUI,
  18.     REOC_QueryInsertObject,
  19.     REOC_DeleteObject,
  20.     REOC_QueryAcceptData,
  21.     REOC_ContextSensitiveHelp,
  22.     REOC_GetClipboardData,
  23.     REOC_GetDragDropEffect,
  24.     REOC_GetContextMenu
  25. };
  26.  
  27.  
  28. /*
  29.  *  SMH Object Methods
  30.  *
  31.  *  SMH_QueryInterface      (See OLE IUnknown object methods)
  32.  *  SMH_AddRef              (See OLE IUnknown object methods)
  33.  *  SMH_Release             (See OLE IUnknown object methods)
  34.  *  SMH_InboundMsgHook      Filters inbound messages
  35.  *  SMH_OutboundMsgHook     Filters sent mail messages
  36.  *
  37.  */
  38. STDMETHODIMP
  39. REOC_QueryInterface (LPREOC lpreoc, REFIID lpiid, LPVOID FAR * lppv)
  40. {
  41.     if (!memcmp (lpiid, &IID_IRichEditOleCallback, sizeof(IID)) ||
  42.         !memcmp (lpiid, &IID_IUnknown, sizeof(IID)))
  43.     {
  44.         *lppv = (LPVOID)lpreoc;
  45.         lpreoc->lcInit++;
  46.         return hrSuccess;
  47.     }
  48.  
  49.     DebugTraceSc (SMH_QueryInterface(), MAPI_E_INTERFACE_NOT_SUPPORTED);
  50.     return ResultFromScode (MAPI_E_INTERFACE_NOT_SUPPORTED);
  51. }
  52.  
  53. STDMETHODIMP_(ULONG)
  54. REOC_AddRef (LPREOC lpreoc)
  55. {
  56.     return ++lpreoc->lcInit;
  57. }
  58.  
  59. STDMETHODIMP_(ULONG)
  60. REOC_Release (LPREOC lpreoc)
  61. {
  62.     if (--lpreoc->lcInit)
  63.         return lpreoc->lcInit;
  64.  
  65.     UlRelease (lpreoc->lpstg);
  66.     (*lpreoc->lpfnFree) (lpreoc);
  67.     return 0;
  68. }
  69.  
  70. STDMETHODIMP
  71. REOC_GetNewStorage (LPREOC lpreoc, LPSTORAGE FAR * lppstg)
  72. {
  73.     HRESULT hr = hrSuccess;
  74.     LPSTORAGE lpstg = lpreoc->lpstg;
  75.  
  76. #ifdef  _WIN32
  77.     WCHAR rgch[MAX_PATH];
  78.     wsprintfW (rgch, L"SMHOBJ%08ld", lpreoc->cSub++);
  79. #else
  80.     CHAR rgch[MAX_PATH];
  81.     wsprintf (rgch, "SMHOBJ%08ld", lpreoc->cSub++);
  82. #endif  // WIN16
  83.  
  84.     if (lpstg)
  85.     {
  86.         lpstg->lpVtbl->CreateStorage (lpstg,
  87.                             rgch,
  88.                             STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
  89.                             0,
  90.                             0,
  91.                             lppstg);
  92.         if (HR_FAILED (hr))
  93.             *lppstg = NULL;
  94.     }
  95.     DebugTraceResult (REOC_GetNewStorage(), hr);
  96.     return hr;
  97. }
  98.  
  99. STDMETHODIMP
  100. REOC_GetInPlaceContext (LPREOC lpreoc,
  101.    LPOLEINPLACEFRAME FAR * lppipframe,
  102.    LPOLEINPLACEUIWINDOW FAR * lppipuiDoc,
  103.    LPOLEINPLACEFRAMEINFO lpipfinfo)
  104. {
  105.     return ResultFromScode (E_NOTIMPL);
  106. }
  107.  
  108. STDMETHODIMP
  109. REOC_ShowContainerUI (LPREOC lpreoc, BOOL fShow)
  110. {
  111.     return ResultFromScode (E_NOTIMPL);
  112. }
  113.  
  114. STDMETHODIMP
  115. REOC_QueryInsertObject (LPREOC lpreoc, LPCLSID pclsid, LPSTORAGE pstg, LONG cp)
  116. {
  117.     return hrSuccess;
  118. }
  119.  
  120. STDMETHODIMP
  121. REOC_DeleteObject (LPREOC lpreoc, LPOLEOBJECT lpoleobj)
  122. {
  123.     return hrSuccess;
  124. }
  125.  
  126. STDMETHODIMP
  127. REOC_QueryAcceptData (LPREOC lpreoc,
  128.     LPDATAOBJECT lpdataobj,
  129.     CLIPFORMAT FAR * lpcfFormat,
  130.     DWORD reco,
  131.     BOOL fReally,
  132.     HGLOBAL hMetaPict)
  133. {
  134.     return hrSuccess;
  135. }
  136.  
  137. STDMETHODIMP
  138. REOC_ContextSensitiveHelp (LPREOC lpreoc, BOOL fEnterMode)
  139. {
  140.     return hrSuccess;
  141. }
  142.  
  143. STDMETHODIMP
  144. REOC_GetClipboardData (LPREOC lpreoc,
  145.     CHARRANGE FAR * lpchrg,
  146.     DWORD reco,
  147.     LPDATAOBJECT FAR * lppdataobj)
  148. {
  149.     return ResultFromScode (E_NOTIMPL);
  150. }
  151.  
  152. STDMETHODIMP
  153. REOC_GetDragDropEffect (LPREOC lpreoc,
  154.     BOOL fDrag,
  155.     DWORD grfKeyState,
  156.     LPDWORD lpdwEffect)
  157. {
  158.     return ResultFromScode (E_NOTIMPL);
  159. }
  160.  
  161. STDMETHODIMP
  162. REOC_GetContextMenu (LPREOC lpreoc,
  163.     WORD seltype,
  164.     LPOLEOBJECT lpoleobj,
  165.     CHARRANGE FAR * lpchrg,
  166.     HMENU FAR * lphmenu)
  167. {
  168.     if (lpreoc->lpfb && (*lphmenu = CreatePopupMenu()))
  169.     {
  170.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Bullet, "Bullet Paragraph");
  171.         AppendMenu (*lphmenu, MF_SEPARATOR, 0, NULL);
  172.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Indent, "Increase Indent");
  173.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Collapse, "Decrease Indent");
  174.         AppendMenu (*lphmenu, MF_SEPARATOR, 0, NULL);
  175.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Left, "Align Left");
  176.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Center, "Align Center");
  177.         AppendMenu (*lphmenu, MF_ENABLED | MF_STRING, ID_Right, "Align Right");
  178.         if (lpreoc->lpfb->pf.wNumbering == PFN_BULLET)
  179.             CheckMenuItem (*lphmenu, ID_Bullet, MF_BYCOMMAND | MF_CHECKED);
  180.         if (lpreoc->lpfb->pf.dxStartIndent > 1440)
  181.             EnableMenuItem (*lphmenu, ID_Indent, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  182.         if (!lpreoc->lpfb->pf.dxStartIndent)
  183.             EnableMenuItem (*lphmenu, ID_Collapse, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
  184.         return hrSuccess;
  185.     }
  186.     return ResultFromScode (E_NOTIMPL);
  187. }
  188.  
  189. STDMETHODIMP_(SCODE)
  190. ScNewRicheditCallback (LPFORMATBAR lpfb,
  191.     LPALLOCATEBUFFER lpfnAlloc,
  192.     LPALLOCATEMORE lpfnAllocMore,
  193.     LPFREEBUFFER lpfnFree,
  194.     LPREOC FAR * lppreoc)
  195. {
  196.     SCODE sc;
  197.     LPREOC lpreoc = NULL;
  198.  
  199.     if (!FAILED (sc = (*lpfnAlloc) (sizeof(REOC), &lpreoc)))
  200.     {
  201.         memset (lpreoc, 0, sizeof (REOC));
  202.         lpreoc->lpVtbl = (REOC_Vtbl FAR *)&vtblREOC;
  203.         lpreoc->lcInit = 1;
  204.         lpreoc->cSub = 0;
  205.         lpreoc->lpfnAlloc = lpfnAlloc;
  206.         lpreoc->lpfnAllocMore = lpfnAllocMore;
  207.         lpreoc->lpfnFree = lpfnFree;
  208.         lpreoc->lpfb = lpfb;
  209.  
  210.         sc = GetScode (StgCreateDocfile (NULL,
  211.                                 STGM_READWRITE           |
  212.                                     STGM_TRANSACTED      |
  213.                                     STGM_DELETEONRELEASE |
  214.                                     STGM_SHARE_EXCLUSIVE,
  215.                                 0,
  216.                                 &lpreoc->lpstg));
  217.         if (FAILED (sc))
  218.         {
  219.             (*lpfnFree) (lpreoc);
  220.             lpreoc = NULL;
  221.         }
  222.     }
  223.  
  224.     *lppreoc = lpreoc;
  225.  
  226.     DebugTraceSc (ScNewRicheditCallback(), sc);
  227.     return sc;
  228. }
  229.