You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
665 lines
39 KiB
665 lines
39 KiB
// --------------------------------------------------------------------------------
|
|
// BookTree.h
|
|
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
|
|
// Steven J. Bailey
|
|
// --------------------------------------------------------------------------------
|
|
#ifndef __BOOKTREE_H
|
|
#define __BOOKTREE_H
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Depends On
|
|
// --------------------------------------------------------------------------------
|
|
#include "mimeole.h"
|
|
#include "privunk.h"
|
|
#include "variantx.h"
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Forward Decls
|
|
// --------------------------------------------------------------------------------
|
|
class CBindStream;
|
|
class CMessageBody;
|
|
class CMessageWebPage;
|
|
typedef struct tagTEMPFILEINFO *LPTEMPFILEINFO;
|
|
typedef CMessageBody *LPMESSAGEBODY;
|
|
class CStreamLockBytes;
|
|
class CInternetStream;
|
|
class CMimePropertySet;
|
|
class CMessageTree;
|
|
class CBodyLockBytes;
|
|
class CActiveUrl;
|
|
typedef class CMimePropertyContainer *LPCONTAINER;
|
|
typedef struct tagRESOLVEURLINFO *LPRESOLVEURLINFO;
|
|
typedef class CActiveUrlRequest *LPURLREQUEST;
|
|
|
|
#define AthFileTimeToDateTimeW(pft, wszDateTime, cch, dwFlags) \
|
|
CchFileTimeToDateTimeW(pft, wszDateTime, cch, dwFlags, \
|
|
GetDateFormatWrapW, GetTimeFormatWrapW, GetLocaleInfoWrapW)
|
|
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// For the Product Version
|
|
// --------------------------------------------------------------------------------
|
|
#include <ntverp.h>
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// GUIDs
|
|
// --------------------------------------------------------------------------------
|
|
// {FD853CD8-7F86-11d0-8252-00C04FD85AB4}
|
|
DEFINE_GUID(IID_CMessageTree, 0xfd853cd8, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Defines
|
|
// --------------------------------------------------------------------------------
|
|
#define VER_BODYTREEV2 0x00000001 // Version of the persisted body tree format
|
|
#define CCHMAX_BOUNDARY 71
|
|
#define STR_MIMEOLE_VERSION "Produced By Microsoft MimeOLE V" VER_PRODUCTVERSION_STR
|
|
#define TREE_MIMEVERSION 1
|
|
#define CFORMATS_IDATAOBJECT 5 // Max number of formats in IDataObject impl
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Cache Node Signing
|
|
// --------------------------------------------------------------------------------
|
|
#define DwSignNode(_info, _index) (DWORD)MAKELONG(_info.wSignature, _index)
|
|
#define FVerifySignedNode(_info, _snode) (BOOL)(LOWORD(_snode) == _info.wSignature && HIWORD(_snode) < _info.cNodes)
|
|
#define PNodeFromSignedNode(_snode) (m_rTree.prgpNode[HIWORD(_snode)])
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// HBODY Macros
|
|
// --------------------------------------------------------------------------------
|
|
#define HBODYMAKE(_index) (HBODY)MAKELPARAM(m_wTag, _index)
|
|
#define HBODYINDEX(_hbody) (ULONG)HIWORD(_hbody)
|
|
#define HBODYTAG(_hbody) (WORD)LOWORD(_hbody)
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// TEXTTYPEINFO
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagTEXTTYPEINFO {
|
|
DWORD dwTxtType; // Text Type Flag
|
|
LPCSTR pszSubType; // Text Subtype (plain)
|
|
DWORD dwWeight; // Text Alternative Weight
|
|
} TEXTTYPEINFO, *LPTEXTTYPEINFO;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CACHEINFOV2
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagCACHEINFOV2 {
|
|
WORD wVersion; // Version of the BIDXTABLE
|
|
WORD wSignature; // Used to sign the nodes
|
|
DWORD dwReserved; // Reserved
|
|
DWORD cbMessage; // Size of the message this index was created for
|
|
DWORD iRoot; // Zero-Based index of root node
|
|
DWORD cNodes; // Number of nodes in the tree
|
|
DWORD rgReserved[6]; // Reserve 6 DWORDS for future use
|
|
} CACHEINFOV2, *LPCACHEINFOV2;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CACHENODEV2
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagCACHENODEV2 {
|
|
DWORD dwType; // Flags for this node
|
|
DWORD cChildren; // Number of children
|
|
DWORD iParent; // Index of parent of this node
|
|
DWORD iPrev; // Index of next sibling to this node
|
|
DWORD iNext; // Index of next sibling to this node
|
|
DWORD iChildHead; // Index of first child
|
|
DWORD iChildTail; // Tail Child
|
|
DWORD cbBodyStart; // Byte offset to body start
|
|
DWORD cbBodyEnd; // Byte offset to body end
|
|
DWORD cbHeaderStart; // Byte offset to start of header
|
|
DWORD dwReserved; // Not Used
|
|
DWORD dwBoundary; // Boundary Type for this body
|
|
DWORD cbBoundaryStart; // Byte offset to starting boundary
|
|
DWORD rgReserved[10]; // Reserve 6 DWORDS for future use
|
|
} CACHENODEV2, *LPCACHENODEV2;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BINDNODESTATE
|
|
// --------------------------------------------------------------------------------
|
|
typedef enum tagBINDNODESTATE {
|
|
BINDSTATE_COMPLETE=0, // The bind is complete
|
|
BINDSTATE_PARSING_HEADER, // Parsing a header
|
|
BINDSTATE_FINDING_MIMEFIRST, // Finding mime start boundary
|
|
BINDSTATE_FINDING_MIMENEXT, // Reading body to end mime boundary
|
|
BINDSTATE_FINDING_UUBEGIN, // begin uuencode
|
|
BINDSTATE_FINDING_UUEND, // End uuencode
|
|
BINDSTATE_PARSING_RFC1154, // Parsing an RFC1154 message
|
|
BINDSTATE_LAST // Don't Use
|
|
} BINDNODESTATE;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BOUNDARYTYPE
|
|
// --------------------------------------------------------------------------------
|
|
typedef enum tagBOUNDARYTYPE {
|
|
BOUNDARY_NONE = 0, // No Boundary
|
|
BOUNDARY_ROOT = 1, // This is the root boundary (0)
|
|
BOUNDARY_MIMEEND = 3, // Terminating mime boundary
|
|
BOUNDARY_MIMENEXT = 4, // Mime Boundary non-terminating
|
|
BOUNDARY_UUBEGIN = 5, // UUENCODE begining boundary
|
|
BOUNDARY_UUEND = 6, // UUENCODE ending boundary
|
|
BOUNDARY_LAST = 7 // Don't use
|
|
} BOUNDARYTYPE;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// PFNBINDPARSER
|
|
// --------------------------------------------------------------------------------
|
|
typedef HRESULT (CMessageTree::*PFNBINDPARSER)(THIS_);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Node Flags
|
|
// --------------------------------------------------------------------------------
|
|
#define NODETYPE_INCOMPLETE FLAG01 // The body's boundries do not match
|
|
#define NODETYPE_FAKEMULTIPART FLAG02 // The body is a fake multipart
|
|
#define NODETYPE_RFC1154_ROOT FLAG03 // The body is the root of an RFC1154
|
|
#define NODETYPE_RFC1154_BINHEX FLAG04 // The body is BINHEX from RFC1154
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Node State
|
|
// --------------------------------------------------------------------------------
|
|
#define NODESTATE_MESSAGE FLAG01 // We are parsing a message/rfc822 body
|
|
#define NODESTATE_VERIFYTNEF FLAG02 // Verify tnef signature after HrBindToTree
|
|
#define NODESTATE_BOUNDNOFREE FLAG03 // Don't free BINDPARSEINFO::rBoundary (it is a copy)
|
|
#define NODESTATE_BOUNDTOTREE FLAG04 // IMimeBody::HrBindToTree(pNode) has been called
|
|
#define NODESTATE_ONWEBPAGE FLAG05 // CMessageWebPage has renedered the start body from this multipart/related body
|
|
#define NODESTATE_INSLIDESHOW FLAG06 // CMessageWebPage will render this body in a slide show
|
|
#define WEBPAGE_NODESTATE_BITS (NODESTATE_ONWEBPAGE | NODESTATE_INSLIDESHOW)
|
|
#define NODESTATE_AUTOATTACH FLAG07 // Marked as an attachment in _HandleCanInlineTextOption
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// TREENODEINFO
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagTREENODEINFO *LPTREENODEINFO;
|
|
typedef struct tagTREENODEINFO {
|
|
HBODY hBody; // Index of this body in BODYTABLE::prgpBody
|
|
DWORD dwType; // NODETYPE_xxx Flags
|
|
DWORD dwState; // NODESTATE_xxx Flags
|
|
HRESULT hrBind; // Bind Result
|
|
ULONG cChildren; // Number of chilren if cnttype == CNT_MULTIPART
|
|
DWORD iCacheNode; // Used for saving
|
|
BINDNODESTATE bindstate; // Current parsing state
|
|
PROPSTRINGA rBoundary; // Boundary
|
|
BOUNDARYTYPE boundary; // Boundary Type for this body
|
|
DWORD cbBoundaryStart; // Byte offset to starting boundary
|
|
DWORD cbHeaderStart; // Byte offset to start of header
|
|
DWORD cbBodyStart; // Byte offset to body start
|
|
DWORD cbBodyEnd; // Byte offset to body end
|
|
LPURLREQUEST pResolved; // Head Binding Requests
|
|
LPTREENODEINFO pBindParent; // BindStackPrevious Node
|
|
LPTREENODEINFO pParent; // Parent body
|
|
LPTREENODEINFO pNext; // Next Sibling
|
|
LPTREENODEINFO pPrev; // Previous Sibling
|
|
LPTREENODEINFO pChildHead; // Handle to first child (if multipart)
|
|
LPTREENODEINFO pChildTail; // Handle to first child (if multipart)
|
|
LPCONTAINER pContainer; // The parsed header
|
|
CBodyLockBytes *pLockBytes; // The binded tree data
|
|
LPMESSAGEBODY pBody; // The body object for this tree node
|
|
} TREENODEINFO;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// TREENODETABLE
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagTREENODETABLE {
|
|
ULONG cNodes; // Number of valid elements in prgpBody
|
|
ULONG cEmpty; // Number of empty cells in prgpBody
|
|
ULONG cAlloc; // Number of elements allocated in prgpBody
|
|
LPTREENODEINFO *prgpNode; // Array of pointers to bindinfo structs
|
|
} TREENODETABLE, *LPTREENODETABLE;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Tree State
|
|
// --------------------------------------------------------------------------------
|
|
#define TREESTATE_DIRTY FLAG01 // The tree is dirty
|
|
//#define TREESTATE_BOUND FLAG02 // Load & LoadOffsetTable has bound success
|
|
#define TREESTATE_LOADED FLAG03 // LoadOffsetTable has success
|
|
#define TREESTATE_HANDSONSTORAGE FLAG04 // I have AddRef'ed somebodies storage
|
|
#define TREESTATE_SAVENEWS FLAG05 // We are saving a news message
|
|
#define TREESTATE_REUSESIGNBOUND FLAG06 // Saving multipart/signed reuse boundary
|
|
#define TREESTATE_BINDDONE FLAG07 // The bind operation is complete
|
|
#define TREESTATE_BINDUSEFILE FLAG08 // Hands off storage OnStopBinding
|
|
#define TREESTATE_LOADEDBYMONIKER FLAG09 // IPersistMoniker::Load was called to load this
|
|
#define TREESTATE_RESYNCHRONIZE FLAG10
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// More Save Body Flags
|
|
// --------------------------------------------------------------------------------
|
|
#define SAVEBODY_UPDATENODES FLAG32 // Update the node offsets to point to the new stream
|
|
#define SAVEBODY_SMIMECTE FLAG31 // Change CTE rules for S/MIME bodies
|
|
#define SAVEBODY_REUSECTE FLAG30 // Force CTE to be re-used
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Tree Options
|
|
// if you add anything to this struct, you *must* update g_rDefTreeOptions
|
|
// in imsgtree.cpp
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagTREEOPTIONS {
|
|
BYTE fCleanupTree; // Cleanup Tree On Save ?
|
|
BYTE fHideTnef; // HIDE TNEF attachments?
|
|
BYTE fAllow8bitHeader; // Allow 8bit in header
|
|
BYTE fGenMessageId; // Should I generate the message id ?
|
|
BYTE fWrapBodyText; // Wrap Body Text
|
|
ULONG cchMaxHeaderLine; // Max header line length
|
|
ULONG cchMaxBodyLine; // Max body line length
|
|
MIMESAVETYPE savetype; // Commit type
|
|
LPINETCSETINFO pCharset; // Current Character Set
|
|
CSETAPPLYTYPE csetapply; // Method in which to use m_hCharset
|
|
ENCODINGTYPE ietTextXmit; // Text transfer encoding
|
|
ENCODINGTYPE ietPlainXmit; // Transmit Text Format
|
|
ENCODINGTYPE ietHtmlXmit; // Transmit Text Format
|
|
ULONG ulSecIgnoreMask; // Mask of ignorable errors
|
|
RELOADTYPE ReloadType; // How the the root header be treated on a reload
|
|
BOOL fCanInlineText; // Can the client inline multiple text bodies
|
|
BOOL fShowMacBin; // Can the client handle macbinary??
|
|
BOOL fKeepBoundary; // OID_SAVEBODY_KEEPBOUNDARY
|
|
BOOL fBindUseFile; // If TRUE, I duplicate the stream on load
|
|
BOOL fHandsOffOnSave; // Don't Hold onto pStream after IMimeMessage::Save
|
|
BOOL fExternalBody; // Handle message/external-body
|
|
BOOL fDecodeRfc1154; // Decode using RFC1154 (aka Encoding: header)
|
|
// if you add anything to this struct, you *must* update g_rDefTreeOptions
|
|
// in imsgtree.cpp
|
|
} TREEOPTIONS, *LPTREEOPTIONS;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BOOKTREERESET - Used with _ResetObject
|
|
// --------------------------------------------------------------------------------
|
|
typedef enum tagBOOKTREERESET {
|
|
BOOKTREE_RESET_DECONSTRUCT,
|
|
BOOKTREE_RESET_LOADINITNEW,
|
|
BOOKTREE_RESET_INITNEW
|
|
} BOOKTREERESET;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BOOKTREE1154 - Used for RFC1154 Handling
|
|
// --------------------------------------------------------------------------------
|
|
typedef enum tagBT1154ENCODING { // Body encoding type
|
|
BT1154ENC_MINIMUM=0,
|
|
BT1154ENC_TEXT=0, // text body
|
|
BT1154ENC_UUENCODE=1, // uuencoded body
|
|
BT1154ENC_BINHEX=2, // binhex body
|
|
BT1154ENC_MAXIMUM=2
|
|
} BT1154ENCODING;
|
|
|
|
typedef struct tagBT1154BODY { // Info about one body
|
|
BT1154ENCODING encEncoding; // Body encoding type
|
|
ULONG cLines; // Number of lines in the body
|
|
} BT1154BODY;
|
|
|
|
typedef struct tagBOOKTREE1154 { // Info about the state of RFC1154 handling
|
|
ULONG cBodies; // Count of the number of bodies
|
|
ULONG cCurrentBody; // The index of the current body (zero-based)
|
|
ULONG cCurrentLine; // The current line number in the current body
|
|
HRESULT hrLoadResult; // The result of the load.
|
|
BT1154BODY aBody[1]; // The bodies
|
|
} BOOKTREE1154, *LPBOOKTREE1154;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// CMessageTree Definition
|
|
// --------------------------------------------------------------------------------
|
|
class CMessageTree : public CPrivateUnknown,
|
|
public IMimeMessageW,
|
|
public IDataObject,
|
|
public IPersistFile,
|
|
public IPersistMoniker,
|
|
public IServiceProvider,
|
|
#ifdef SMIME_V3
|
|
public IMimeSecurity2,
|
|
#endif // SMIME_V3
|
|
public IBindStatusCallback
|
|
{
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// Construction
|
|
// ----------------------------------------------------------------------------
|
|
CMessageTree(IUnknown *pUnkOuter=NULL);
|
|
virtual ~CMessageTree(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IUnknown members
|
|
// ---------------------------------------------------------------------------
|
|
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj) {
|
|
return CPrivateUnknown::QueryInterface(riid, ppvObj); };
|
|
virtual STDMETHODIMP_(ULONG) AddRef(void) {
|
|
return CPrivateUnknown::AddRef();};
|
|
virtual STDMETHODIMP_(ULONG) Release(void) {
|
|
return CPrivateUnknown::Release(); };
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IDataObject members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnum);
|
|
STDMETHODIMP GetCanonicalFormatEtc(FORMATETC *pFormatIn, FORMATETC *pFormatOut);
|
|
STDMETHODIMP GetData(FORMATETC *pFormat, STGMEDIUM *pMedium);
|
|
STDMETHODIMP GetDataHere(FORMATETC *pFormat, STGMEDIUM *pMedium);
|
|
STDMETHODIMP QueryGetData(FORMATETC *pFormat);
|
|
STDMETHODIMP SetData(FORMATETC *pFormat, STGMEDIUM *pMedium, BOOL fRelease) {
|
|
return TrapError(E_NOTIMPL); }
|
|
STDMETHODIMP DAdvise(FORMATETC *pFormat, DWORD, IAdviseSink *pAdvise, DWORD *pdwConn) {
|
|
return TrapError(OLE_E_ADVISENOTSUPPORTED); }
|
|
STDMETHODIMP DUnadvise(DWORD dwConn) {
|
|
return TrapError(OLE_E_ADVISENOTSUPPORTED); }
|
|
STDMETHODIMP EnumDAdvise(IEnumSTATDATA **ppEnum) {
|
|
return TrapError(OLE_E_ADVISENOTSUPPORTED); }
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IPersist Members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetClassID(CLSID *pClassID);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IPersistMoniker Members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP Load(BOOL fFullyAvailable, IMoniker *pMoniker, IBindCtx *pBindCtx, DWORD grfMode);
|
|
STDMETHODIMP GetCurMoniker(IMoniker **ppMoniker);
|
|
STDMETHODIMP Save(IMoniker *pMoniker, IBindCtx *pBindCtx, BOOL fRemember) {
|
|
return TrapError(E_NOTIMPL); }
|
|
STDMETHODIMP SaveCompleted(IMoniker *pMoniker, IBindCtx *pBindCtx) {
|
|
return TrapError(E_NOTIMPL); }
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IPersistStreamInit Members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize);
|
|
STDMETHODIMP Load(LPSTREAM pStream);
|
|
STDMETHODIMP Save(LPSTREAM pStream, BOOL fClearDirty);
|
|
STDMETHODIMP InitNew(void);
|
|
STDMETHODIMP IsDirty(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IPersistFile Members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName);
|
|
STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode);
|
|
STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember);
|
|
STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// IServiceProvider methods
|
|
// ----------------------------------------------------------------------------
|
|
STDMETHODIMP QueryService(REFGUID rsid, REFIID riid, void **ppvObj); /* IServiceProvider */
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IBindStatusCallback
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP OnStartBinding(DWORD dwReserved, IBinding *pBinding);
|
|
STDMETHODIMP GetPriority(LONG *plPriority);
|
|
STDMETHODIMP OnLowResource(DWORD reserved);
|
|
STDMETHODIMP OnProgress(ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR pszStatusText);
|
|
STDMETHODIMP OnStopBinding(HRESULT hrResult, LPCWSTR pszError);
|
|
STDMETHODIMP GetBindInfo(DWORD *grfBINDF, BINDINFO *pBindInfo);
|
|
STDMETHODIMP OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pFormat, STGMEDIUM *pMedium);
|
|
STDMETHODIMP OnObjectAvailable(REFIID riid, IUnknown *pUnknown) { return TrapError(E_NOTIMPL); }
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeMessageTree members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP LoadOffsetTable(IStream *pStream);
|
|
STDMETHODIMP SaveOffsetTable(IStream *pStream, DWORD dwFlags);
|
|
STDMETHODIMP GetMessageSize(ULONG *pcbSize, DWORD dwFlags);
|
|
STDMETHODIMP Commit(DWORD dwFlags);
|
|
STDMETHODIMP HandsOffStorage(void);
|
|
STDMETHODIMP IsBodyType(HBODY hBody, IMSGBODYTYPE bodytype);
|
|
STDMETHODIMP SaveBody(HBODY hBody, DWORD dwFlags, IStream *pStream);
|
|
STDMETHODIMP BindToObject(const HBODY hBody, REFIID riid, void **ppvObject);
|
|
STDMETHODIMP InsertBody(BODYLOCATION location, HBODY hPivot, LPHBODY phBody);
|
|
STDMETHODIMP GetBody(BODYLOCATION location, HBODY hPivot, LPHBODY phBody);
|
|
STDMETHODIMP DeleteBody(HBODY hBody, DWORD dwFlags);
|
|
STDMETHODIMP MoveBody(HBODY hBody, BODYLOCATION location);
|
|
STDMETHODIMP CountBodies(HBODY hParent, boolean fRecurse, ULONG *pcBodies);
|
|
STDMETHODIMP FindFirst(LPFINDBODY pFindBody, LPHBODY phBody);
|
|
STDMETHODIMP FindNext(LPFINDBODY pFindBody, LPHBODY phBody);
|
|
STDMETHODIMP GetMessageSource(IStream **ppStream, DWORD dwFlags);
|
|
STDMETHODIMP GetCharset(LPHCHARSET phCharset);
|
|
STDMETHODIMP SetCharset(HCHARSET hCharset, CSETAPPLYTYPE applytype);
|
|
STDMETHODIMP ToMultipart(HBODY hBody, LPCSTR pszSubType, LPHBODY phMultipart);
|
|
STDMETHODIMP GetBodyOffsets(HBODY hBody, LPBODYOFFSETS pOffsets);
|
|
STDMETHODIMP IsContentType(HBODY hBody, LPCSTR pszCntType, LPCSTR pszSubType);
|
|
STDMETHODIMP QueryBodyProp(HBODY hBody, LPCSTR pszName, LPCSTR pszCriteria, boolean fSubString, boolean fCaseSensitive);
|
|
STDMETHODIMP GetBodyProp(HBODY hBody, LPCSTR pszName, DWORD dwFlags, LPPROPVARIANT pValue);
|
|
STDMETHODIMP SetBodyProp(HBODY hBody, LPCSTR pszName, DWORD dwFlags, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP DeleteBodyProp(HBODY hBody, LPCSTR pszName);
|
|
STDMETHODIMP GetFlags(DWORD *pdwFlags);
|
|
STDMETHODIMP SetOption(const TYPEDID oid, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP GetOption(const TYPEDID oid, LPPROPVARIANT pValue);
|
|
STDMETHODIMP ResolveURL(HBODY hRelated, LPCSTR pszBase, LPCSTR pszURL, DWORD dwFlags, LPHBODY phBody);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeMessage members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetRootMoniker(LPMONIKER *ppmk); /* will die soon */
|
|
STDMETHODIMP CreateWebPage(IStream *pStmRoot, LPWEBPAGEOPTIONS pOptions, IMimeMessageCallback *pCallback, IMoniker **ppMoniker);
|
|
STDMETHODIMP GetProp(LPCSTR pszName, DWORD dwFlags, LPPROPVARIANT pValue);
|
|
STDMETHODIMP SetProp(LPCSTR pszName, DWORD dwFlags, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP DeleteProp(LPCSTR pszName);
|
|
STDMETHODIMP QueryProp(LPCSTR pszName, LPCSTR pszCriteria, boolean fSubString, boolean fCaseSensitive);
|
|
STDMETHODIMP GetTextBody(DWORD dwTxtType, ENCODINGTYPE ietEncoding, IStream **ppStream, LPHBODY phBody);
|
|
STDMETHODIMP SetTextBody(DWORD dwTxtType, ENCODINGTYPE ietEncoding, HBODY hAlternative, IStream *pStream, LPHBODY phBody);
|
|
STDMETHODIMP AttachObject(REFIID riid, void *pvObject, LPHBODY phBody);
|
|
STDMETHODIMP AttachFile(LPCSTR pszFilePath, IStream *pstmFile, LPHBODY phBody);
|
|
STDMETHODIMP GetAttachments(ULONG *pcAttach, LPHBODY *pprghAttach);
|
|
STDMETHODIMP AttachURL(LPCSTR pszBase, LPCSTR pszURL, DWORD dwFlags, IStream *pstmURL, LPSTR *ppszCID, LPHBODY phBody);
|
|
STDMETHODIMP SplitMessage(ULONG cbMaxPart, IMimeMessageParts **ppParts);
|
|
STDMETHODIMP GetAddressTable(IMimeAddressTable **ppTable);
|
|
STDMETHODIMP GetSender(LPADDRESSPROPS pAddress);
|
|
STDMETHODIMP GetAddressTypes(DWORD dwAdrTypes, DWORD dwProps, LPADDRESSLIST pList);
|
|
STDMETHODIMP GetAddressFormat(DWORD dwAdrType, ADDRESSFORMAT format, LPSTR *ppszFormat);
|
|
STDMETHODIMP EnumAddressTypes(DWORD dwAdrTypes, DWORD dwProps, IMimeEnumAddressTypes **ppEnum);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeMessageW members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP AttachFileW(LPCWSTR pszFilePath, IStream *pstmFile, LPHBODY phBody);
|
|
STDMETHODIMP GetAddressFormatW(DWORD dwAdrType, ADDRESSFORMAT format, LPWSTR *ppszFormat);
|
|
STDMETHODIMP GetPropW(LPCWSTR pwszName, DWORD dwFlags, LPPROPVARIANT pValue);
|
|
STDMETHODIMP SetPropW(LPCWSTR pwszName, DWORD dwFlags, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP DeletePropW(LPCWSTR pwszName);
|
|
STDMETHODIMP QueryPropW(LPCWSTR pwszName, LPCWSTR pwszCriteria, boolean fSubString, boolean fCaseSensitive);
|
|
STDMETHODIMP AttachURLW(LPCWSTR pwszBase, LPCWSTR pwszURL, DWORD dwFlags, IStream *pstmURL, LPWSTR *ppwszCID, LPHBODY phBody);
|
|
STDMETHODIMP ResolveURLW(HBODY hRelated, LPCWSTR pwszBase, LPCWSTR pwszURL, DWORD dwFlags, LPHBODY phBody);
|
|
|
|
|
|
#ifdef SMIME_V3
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeSecurity2 members
|
|
// ---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP Encode(HWND hwnd, DWORD dwFlags);
|
|
STDMETHODIMP Decode(HWND hwnd, DWORD dwFlags, IMimeSecurityCallback * pfn);
|
|
STDMETHODIMP GetRecipientCount(DWORD dwFlags, DWORD *pdwRecipCount);
|
|
STDMETHODIMP AddRecipient(DWORD dwFlags, DWORD cRecipData, PCMS_RECIPIENT_INFO recipData);
|
|
STDMETHODIMP GetRecipient(DWORD dwFlags, DWORD iRecipient, DWORD cRecipients, PCMS_RECIPIENT_INFO pRecipData);
|
|
STDMETHODIMP DeleteRecipient(DWORD dwFlgas, DWORD iRecipient, DWORD cRecipients);
|
|
STDMETHODIMP GetAttribute(DWORD dwFlags, DWORD iSigner, DWORD iAttributeSet,
|
|
DWORD iInstance, LPCSTR pszObjId,
|
|
CRYPT_ATTRIBUTE ** ppattr);
|
|
STDMETHODIMP SetAttribute(DWORD dwFlags, DWORD iSigner, DWORD iAttributeSet,
|
|
const CRYPT_ATTRIBUTE * pattr);
|
|
STDMETHODIMP DeleteAttribute(DWORD dwFlags, DWORD iSigner, DWORD iAttributeSet,
|
|
DWORD iInstance, LPCSTR pszObjid);
|
|
STDMETHODIMP CreateReceipt(DWORD dwFlags, DWORD cbFromNames, const BYTE * pbFromNames, DWORD cSignerCertificates, PCCERT_CONTEXT * rgSignerCertificates, IMimeMessage ** ppMimeMessageRecipient);
|
|
STDMETHODIMP GetReceiptSendersList(DWORD dwFlags, DWORD * pcSendersList, CERT_NAME_BLOB ** rgSendersList);
|
|
STDMETHODIMP VerifyReceipt(DWORD dwFlags, IMimeMessage * pMimeMesageReceipt);
|
|
STDMETHODIMP CapabilitiesSupported(DWORD * pdwFeatures);
|
|
#endif // SMIME_V3
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CMessageTree members
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT IsState(DWORD dwState);
|
|
DWORD DwGetFlags(void);
|
|
void ClearDirty(void);
|
|
virtual HRESULT PrivateQueryInterface(REFIID riid, LPVOID * ppvObj);
|
|
|
|
void SetState(DWORD dwState) {
|
|
EnterCriticalSection(&m_cs);
|
|
FLAGSET(m_dwState, dwState);
|
|
LeaveCriticalSection(&m_cs);
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Active Url Caching Methods
|
|
// ---------------------------------------------------------------------------
|
|
HRESULT HrActiveUrlRequest(LPURLREQUEST pRequest);
|
|
HRESULT CompareRootUrl(LPCSTR pszUrl);
|
|
HRESULT SetActiveUrl(CActiveUrl *pActiveUrl);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CMessageTree members
|
|
// ---------------------------------------------------------------------------
|
|
#ifdef DEBUG
|
|
void DebugDumpTree(LPSTR pszfunc, BOOL fWrite);
|
|
void DebugDumpTree(LPTREENODEINFO pParent, ULONG ulLevel, BOOL fVerbose);
|
|
void DebugAssertNotLinked(LPTREENODEINFO pBody);
|
|
void DebugWriteXClient();
|
|
#endif
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Save Methods
|
|
// ----------------------------------------------------------------------------
|
|
HRESULT _HrApplySaveSecurity(void);
|
|
HRESULT _HrWriteMessage(IStream *pStream, BOOL fClearDirty, BOOL fHandsOffOnSave,
|
|
BOOL fSMimeCTE);
|
|
HRESULT _HrCleanupMessageTree(LPTREENODEINFO pParent);
|
|
HRESULT _HrSetMessageId(LPTREENODEINFO pNode);
|
|
HRESULT _HrWriteUUFileName(IStream *pStream, LPTREENODEINFO pNode);
|
|
HRESULT _HrWriteHeader(BOOL fClearDirty, IStream *pStream, LPTREENODEINFO pNode);
|
|
HRESULT _HrWriteBoundary(LPSTREAM pStream, LPSTR pszBoundary, BOUNDARYTYPE boundary, LPDWORD pcboffStart, LPDWORD pcboffEnd);
|
|
HRESULT _HrBodyInheritOptions(LPTREENODEINFO pNode);
|
|
HRESULT _HrSaveBody(BOOL fClearDirty, DWORD dwFlags, IStream *pStream, LPTREENODEINFO pNode, ULONG ulLevel);
|
|
HRESULT _HrSaveMultiPart(BOOL fClearDirty, DWORD dwFlags, LPSTREAM pStream, LPTREENODEINFO pNode, ULONG ulLevel);
|
|
HRESULT _HrSaveSinglePart(BOOL fClearDirty, DWORD dwFlags, LPSTREAM pStream, LPTREENODEINFO pNode, ULONG ulLevel);
|
|
HRESULT _HrComputeBoundary(LPTREENODEINFO pNode, ULONG ulLevel, LPSTR pszBoundary, LONG cchMax);
|
|
void _GenerateBoundary(LPSTR pszBoundary, DWORD cchSize, ULONG ulLevel);
|
|
void _HandleCanInlineTextOption(void);
|
|
HRESULT _GetContentTransferEncoding(LPTREENODEINFO pNode, BOOL fText, BOOL fPlain, BOOL fMessage, BOOL fAttachment, DWORD dwFlags, ENCODINGTYPE *pietEncoding);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// BindToOffsetTable Methods
|
|
// ----------------------------------------------------------------------------
|
|
HRESULT _HrBindOffsetTable(IStream *pStream, CStreamLockBytes **ppStmLock);
|
|
HRESULT _HrFastParseBody(CInternetStream *pInternet, LPTREENODEINFO pNode);
|
|
HRESULT _HrValidateOffsets(LPTREENODEINFO pNode);
|
|
HRESULT _HrValidateStartBoundary(CInternetStream *pInternet, LPTREENODEINFO pNode, LPSTR *ppszFileName);
|
|
HRESULT _HrComputeDefaultContent(LPTREENODEINFO pNode, LPCSTR pszFileName);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Allocators / De-Allocator Methods
|
|
// ----------------------------------------------------------------------------
|
|
HRESULT _HrCreateTreeNode(LPTREENODEINFO *ppNode);
|
|
HRESULT _HrAllocateTreeNode(ULONG ulIndex);
|
|
void _PostCreateTreeNode(HRESULT hrResult, LPTREENODEINFO pNode);
|
|
void _FreeNodeTableElements(void);
|
|
void _UnlinkTreeNode(LPTREENODEINFO pNode);
|
|
void _FreeTreeNodeInfo(LPTREENODEINFO pNode, BOOL fFull=TRUE);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// International Methods
|
|
// ----------------------------------------------------------------------------
|
|
HRESULT _HrSetCharsetTree(LPTREENODEINFO pNode, HCHARSET hCharset, CSETAPPLYTYPE applytype);
|
|
HRESULT _HrGetCharsetTree(LPTREENODEINFO pNode, LPHCHARSET phCharset);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Boundary Methods
|
|
// ----------------------------------------------------------------------------
|
|
BOOL _FIsUuencodeBegin(LPPROPSTRINGA pLine, LPSTR *ppszFileName);
|
|
BOUNDARYTYPE _GetMimeBoundaryType(LPPROPSTRINGA pLine, LPPROPSTRINGA pBoundary);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Interface Recursion and Helper Methods
|
|
// ----------------------------------------------------------------------------
|
|
void _DeleteChildren(LPTREENODEINFO pParent);
|
|
void _CountChildrenInt(LPTREENODEINFO pParent, BOOL fRecurse, ULONG *pcChildren);
|
|
void _InitNewWithoutRoot(void);
|
|
void _ApplyOptionToAllBodies(const TYPEDID oid, LPCPROPVARIANT pValue);
|
|
void _FuzzyPartialRecognition(BOOL fIsMime);
|
|
void _ResetObject(BOOKTREERESET ResetType);
|
|
void _RecursiveGetFlags(LPTREENODEINFO pNode, LPDWORD pdwFlags, BOOL fInRelated);
|
|
BOOL _FIsValidHandle(HBODY hBody);
|
|
HRESULT _HrLoadInitNew(void);
|
|
HRESULT _HrDeletePromoteChildren(LPTREENODEINFO pNode);
|
|
HRESULT _HrNodeFromHandle(HBODY hBody, LPTREENODEINFO *ppNode);
|
|
HRESULT _HrRecurseResolveURL(LPTREENODEINFO pRelated, LPRESOLVEURLINFO pInfo, LPHBODY phBody);
|
|
HRESULT _HrEnumeratAttachments(HBODY hBody, ULONG *pcBodies, LPHBODY prghBody);
|
|
HRESULT _HrDataObjectGetHeaderA(LPSTREAM pStream);
|
|
HRESULT _HrDataObjectGetHeaderW(LPSTREAM pStream);
|
|
HRESULT _HrDataObjectWriteHeaderA(LPSTREAM pStream, UINT idsHeader, LPSTR pszData);
|
|
HRESULT _HrDataObjectWriteHeaderW(LPSTREAM pStream, UINT idsHeader, LPWSTR pwszData);
|
|
HRESULT _HrDataObjectGetSource(CLIPFORMAT cfFormat, LPSTREAM pstmData);
|
|
HRESULT _HrGetTextTypeInfo(DWORD dwTxtType, LPTEXTTYPEINFO *ppTextInfo);
|
|
HRESULT _FindDisplayableTextBody(LPCSTR pszSubType, LPTREENODEINFO pNode, LPHBODY phBody);
|
|
LPTREENODEINFO _PNodeFromHBody(HBODY hBody);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Private Members
|
|
// ----------------------------------------------------------------------------
|
|
void _LinkUrlRequest(LPURLREQUEST pRequest, LPURLREQUEST *ppHead);
|
|
void _ReleaseUrlRequestList(LPURLREQUEST *ppHead);
|
|
void _UnlinkUrlRequest(LPURLREQUEST pRequest, LPURLREQUEST *ppHead);
|
|
void _RelinkUrlRequest(LPURLREQUEST pRequest, LPURLREQUEST *ppSource, LPURLREQUEST *ppDest);
|
|
HRESULT _HrBindNodeComplete(LPTREENODEINFO pNode, HRESULT hrResult);
|
|
HRESULT _HrOnFoundMultipartEnd(void);
|
|
HRESULT _HrOnFoundNodeEnd(DWORD cbBoundaryStart, HRESULT hrBind=S_OK);
|
|
HRESULT _HrProcessPendingUrlRequests(void);
|
|
HRESULT _HrResolveUrlRequest(LPURLREQUEST pRequest, BOOL *pfResolved);
|
|
HRESULT _HrMultipartMimeNext(DWORD cboffBoundary);
|
|
HRESULT _HrInitializeStorage(IStream *pStream);
|
|
HRESULT _HrBindTreeNode(LPTREENODEINFO pNode);
|
|
HRESULT _HrSychronizeWebPage(LPTREENODEINFO pNode);
|
|
void _DecodeRfc1154();
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Bind State Handlers
|
|
// ----------------------------------------------------------------------------
|
|
HRESULT _HrBindParsingHeader(void);
|
|
HRESULT _HrBindFindingMimeFirst(void);
|
|
HRESULT _HrBindFindingMimeNext(void);
|
|
HRESULT _HrBindFindingUuencodeBegin(void);
|
|
HRESULT _HrBindFindingUuencodeEnd(void);
|
|
HRESULT _HrBindRfc1154(void);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Static Array of Function Pointers
|
|
// ----------------------------------------------------------------------------
|
|
static const PFNBINDPARSER m_rgBindStates[BINDSTATE_LAST];
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// CMessageWebPage is a good friend
|
|
// ----------------------------------------------------------------------------
|
|
friend CMessageWebPage;
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Private Data
|
|
// ----------------------------------------------------------------------------
|
|
TREEOPTIONS m_rOptions; // Save options
|
|
LPWSTR m_pwszFilePath; // File Used in IPersistFile
|
|
WORD m_wTag; // HBODY Tag
|
|
DWORD m_cbMessage; // Sizeof message
|
|
DWORD m_dwState; // State of the tree TS_xxx
|
|
LPTREENODEINFO m_pRootNode; // Root Body Object
|
|
CStreamLockBytes *m_pStmLock; // Protective Wrapper for m_pStream
|
|
IMoniker *m_pMoniker; // Current moniker
|
|
IBinding *m_pBinding; // Used in async binding operation
|
|
CInternetStream *m_pInternet; // Text Stream that wraps m_pStmLock
|
|
CBindStream *m_pStmBind; // Used for tempfile binding
|
|
IStream *m_pRootStm; // Root document stream
|
|
HRESULT m_hrBind; // Current Bind Result
|
|
LPTREENODEINFO m_pBindNode; // Current Node being parsed
|
|
LPURLREQUEST m_pPending; // Head Un-resolved bind request
|
|
LPURLREQUEST m_pComplete; // Head Un-resolved bind request
|
|
TREENODETABLE m_rTree; // Body Table
|
|
PROPSTRINGA m_rRootUrl; // Moniker Base Url
|
|
CActiveUrl *m_pActiveUrl; // Active Url
|
|
CMessageWebPage *m_pWebPage; // CreateWebPage Results
|
|
WEBPAGEOPTIONS m_rWebPageOpt; // Web Page Options
|
|
IMimeMessageCallback *m_pCallback; // WebPage Callback
|
|
BOOL m_fApplySaveSecurity;// Used to prevent re-entrancy into _HrWriteMessage
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
LPBC m_pBC; // bindcontext for moniker
|
|
BOOKTREE1154 *m_pBT1154; // State of RFC1154 handling
|
|
};
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Types
|
|
// --------------------------------------------------------------------------------
|
|
typedef CMessageTree *LPMESSAGETREE;
|
|
|
|
#endif // __BOOKTREE_H
|