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.
382 lines
20 KiB
382 lines
20 KiB
// --------------------------------------------------------------------------------
|
|
// BookBody.h
|
|
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
|
|
// Steven J. Bailey
|
|
// --------------------------------------------------------------------------------
|
|
#ifndef __BOOKBODY_H
|
|
#define __BOOKBODY_H
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// IID_CMessageBody - {CDBC9B51-A489-11d0-85C4-00C04FD85AB4}
|
|
// --------------------------------------------------------------------------------
|
|
DEFINE_GUID(IID_CMessageBody, 0xcdbc9b51, 0xa489, 0x11d0, 0x85, 0xc4, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Includes
|
|
// --------------------------------------------------------------------------------
|
|
#include "containx.h"
|
|
#include "privunk.h"
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Forward Refs
|
|
// --------------------------------------------------------------------------------
|
|
class CMessageBody;
|
|
class CBodyLockBytes;
|
|
typedef struct _CERT_CONTEXT CERT_CONTEXT;
|
|
typedef const CERT_CONTEXT *PCCERT_CONTEXT;
|
|
typedef void *HCERTSTORE;
|
|
typedef ULONG_PTR HCRYPTPROV;
|
|
typedef struct tagTREENODEINFO *LPTREENODEINFO;
|
|
|
|
#ifdef _WIN64
|
|
// --------------------------------------------------------------------------------
|
|
// CERTARRAY
|
|
// --------------------------------------------------------------------------------
|
|
struct tagCERTARRAY
|
|
{
|
|
DWORD cCerts;
|
|
PCCERT_CONTEXT *rgpCerts;
|
|
};
|
|
typedef struct tagCERTARRAY CERTARRAY;
|
|
#endif // _WIN64
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// STOREARRAY
|
|
// --------------------------------------------------------------------------------
|
|
struct tagSTOREARRAY
|
|
{
|
|
DWORD cStores;
|
|
HCERTSTORE *rgStores;
|
|
};
|
|
typedef struct tagSTOREARRAY STOREARRAY;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BODYOPTIONS
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagBODYOPTIONS {
|
|
ENCODINGTYPE ietTransmit; // User specified transmission encoding...
|
|
ULONG cbMaxLine; // Max Line length
|
|
BOOL fWrapText; // Wrap the text in this body
|
|
BOOL fRemoveNBSP; // Remove NBSP on GetData
|
|
BOOL fDBCSEscape8; // Treat Escape (0x1b) characters in a dbcs encoding as 8bit
|
|
BOOL fHideTNEF; // Hide TNEF Attachments
|
|
// Security Options
|
|
ULONG ulSecurityType; // OID_SECURITY_TYPE
|
|
BLOB * rgblobHash; // OID_SECURITY_ALG_HASH and OID_SECURITY_ALG_HASH_RG
|
|
BLOB blobBulk; // OID_SECURITY_ALG_BULK
|
|
PCCERT_CONTEXT * rgpcCertSigning; // OID_SECURITY_CERT_SIGNING and OID_SECURITY_CERT_SIGNING_RG
|
|
PCCERT_CONTEXT pcCertDecryption; // OID_SECURITY_CERT_DECRYPTION
|
|
#ifdef _WIN65
|
|
CERTARRAY caEncrypt; // OID_SECURITY_RG_CERT_ENCRYPT
|
|
#endif // _WIN65
|
|
HCERTSTORE hCertStore; // OID_SECURITY_HCERTSTORE
|
|
STOREARRAY saSearchStore; // OID_SECURITY_SEARCHSTORES
|
|
DWORD cIASN;
|
|
ULONG *rgIASN; // OID_SECURITY_RG_IASN
|
|
#ifdef SMIME_V3
|
|
PCRYPT_ATTRIBUTES * rgrgpattrs[3]; // OID_SECURITY_AUTHATTR_RG
|
|
#else // !SMIME_V3
|
|
BLOB * rgblobSymCaps; // OID_SECURITY_SYMCAPS and OID_SECURITY_SYMCAPS_RG
|
|
BLOB * rgblobAuthAttr; // OID_SECURITY_AUTHATTR and OID_SECURITY_AUTHATTR_RG
|
|
BLOB * rgblobUnauthAttr; // OID_SECURITY_UNAUTHATTR and OID_SECURITY_UNAUTHATTR_RG
|
|
FILETIME * rgftSigning; // OID_SECURITY_SIGNTIME and OID_SECURITY_SIGNTIME_RG
|
|
#endif // SMIME_V3
|
|
ULONG * rgulUserDef; // OID_SECURITY_USER_VALIDITY and OID_SECURITY_USER_VALIDITY_RG
|
|
ULONG * rgulROValid; // OID_SECURITY_RO_MSG_VALIDITY and OID_SECURITY_RO_MSG_VALIDITY_RG
|
|
HCRYPTPROV hCryptProv; // OID_SECURITY_HCRYPTPROV
|
|
ULONG ulEncodeFlags; // OID_SECURITY_ENCODE_FLAGS
|
|
BOOL fCertWithMsg; // OID_SECURITY_CERT_INCLUDED
|
|
HWND hwndOwner; // OID_SECURITY_HWND_OWNER
|
|
ENCODINGTYPE ietRequested; // OID_SECURITY_REQUESTED_CTE
|
|
#ifdef SMIME_V3
|
|
BLOB * rgblobReceipt; // OID_SECURITY_RECEIPT_RG
|
|
BLOB * rgblobMsgHash; // OID_SECURITY_MESSAGE_HASH_RG
|
|
LPWSTR pwszKeyPrompt; // OID_SECURITY_KEY_PROMPT
|
|
#endif // SMIME_V3
|
|
BOOL fShowMacBin; // OID_SHOW_MACBINARY
|
|
BOOL fExternalBody; // OID_SUPPORT_EXTERNAL_BODY
|
|
ULONG cSigners; // OID_SECURITY_SIGNATURE_COUNT // How many signers?
|
|
BOOL fNoSecurityOnSave; // OID_NOSECURITY_ON_SAVE
|
|
#ifdef SMIME_V3
|
|
DWORD cRecipients; // Actual Recipients
|
|
DWORD cRecipsAllocated; // Allocated Recipients
|
|
PCMS_RECIPIENT_INFO rgRecipients; // Recipient Information
|
|
HCERTSTORE hstoreEncrypt; // OID_SECURITY_ENCRYPT_CERT_BAG
|
|
#endif // SMIME_V3
|
|
} BODYOPTIONS, *LPBODYOPTIONS;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BODYSTORAGE
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct tagBODYSTORAGE {
|
|
IID riid; // Type of data source
|
|
IUnknown *pUnkRelease; // Release this to free this object
|
|
union {
|
|
ILockBytes *pLockBytes; // IID_ILockBytes
|
|
IMimeWebDocument *pWebDocument; // IID_IMimeWebDocument
|
|
};
|
|
} BODYSTORAGE, *LPBODYSTORAGE;
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// FCANSETDATAIID - IIDs that can be passed into IMimeBody::SetData
|
|
// --------------------------------------------------------------------------------
|
|
#define FBODYSETDATAIID(_iid) \
|
|
(IID_IStream == riid || \
|
|
IID_ILockBytes == riid || \
|
|
IID_IMimeBody == riid || \
|
|
IID_IMimeMessage == riid || \
|
|
IID_IMimeWebDocument == riid)
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// BODYSTATE
|
|
// --------------------------------------------------------------------------------
|
|
#define BODYSTATE_DIRTY FLAG01 // The body is dirty
|
|
#define BODYSTATE_CSETTAGGED FLAG02 // The body is tagged with a character set
|
|
#define BODYSTATE_SECURE FLAG03 // The body is secure
|
|
#define BODYSTATE_EXTERNAL FLAG04 // The body was content-Type: message/external-body
|
|
#define BODYSTATE_SKIPCSET FLAG05 // The body character set has been set explicitly
|
|
|
|
#ifdef SMIME_V3
|
|
// --------------------------------------------------------------------------------
|
|
// ReceiptNames
|
|
// --------------------------------------------------------------------------------
|
|
typedef struct {
|
|
DWORD cNames;
|
|
CERT_NAME_BLOB * rgNames;
|
|
} ReceiptNames;
|
|
#endif // SMIME_V3
|
|
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Definition of IMimeBody
|
|
// --------------------------------------------------------------------------------
|
|
class CMessageBody : public CPrivateUnknown, public IMimeBodyW
|
|
#ifdef SMIME_V3
|
|
, public IMimeSecurity2
|
|
#endif // SMIME_V3
|
|
{
|
|
public:
|
|
// ----------------------------------------------------------------------------
|
|
// Construction
|
|
// ----------------------------------------------------------------------------
|
|
CMessageBody(LPTREENODEINFO pNode, IUnknown *pUnkOuter=NULL);
|
|
~CMessageBody(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(); };
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IPersistStreamInit members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetClassID(CLSID *pClassID);
|
|
STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize);
|
|
STDMETHODIMP InitNew(void);
|
|
STDMETHODIMP IsDirty(void);
|
|
STDMETHODIMP Load(LPSTREAM pStream);
|
|
STDMETHODIMP Save(LPSTREAM pStream, BOOL fClearDirty);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimePropertySet members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetProp(LPCSTR pszName, DWORD dwFlags, LPPROPVARIANT pValue);
|
|
STDMETHODIMP SetProp(LPCSTR pszName, DWORD dwFlags, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP AppendProp(LPCSTR pszName, DWORD dwFlags, LPPROPVARIANT pValue);
|
|
STDMETHODIMP DeleteProp(LPCSTR pszName);
|
|
STDMETHODIMP CopyProps(ULONG cNames, LPCSTR *prgszName, IMimePropertySet *pPropertySet);
|
|
STDMETHODIMP MoveProps(ULONG cNames, LPCSTR *prgszName, IMimePropertySet *pPropertySet);
|
|
STDMETHODIMP DeleteExcept(ULONG cNames, LPCSTR *prgszName);
|
|
STDMETHODIMP QueryProp(LPCSTR pszName, LPCSTR pszCriteria, boolean fSubString, boolean fCaseSensitive);
|
|
STDMETHODIMP GetCharset(LPHCHARSET phCharset);
|
|
STDMETHODIMP SetCharset(HCHARSET hCharset, CSETAPPLYTYPE applytype);
|
|
STDMETHODIMP GetParameters(LPCSTR pszName, ULONG *pcParams, LPMIMEPARAMINFO *pprgParam);
|
|
STDMETHODIMP IsContentType(LPCSTR pszCntType, LPCSTR pszSubType);
|
|
STDMETHODIMP Clone(IMimePropertySet **ppPropertySet);
|
|
STDMETHODIMP SetOption(const TYPEDID oid, LPCPROPVARIANT pValue);
|
|
STDMETHODIMP GetOption(const TYPEDID oid, LPPROPVARIANT pValue);
|
|
STDMETHODIMP BindToObject(REFIID riid, void **ppvObject);
|
|
STDMETHODIMP GetPropInfo(LPCSTR pszName, LPMIMEPROPINFO pInfo);
|
|
STDMETHODIMP SetPropInfo(LPCSTR pszName, LPCMIMEPROPINFO pInfo);
|
|
STDMETHODIMP EnumProps(DWORD dwFlags, IMimeEnumProperties **ppEnum);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeBody members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP GetEstimatedSize(ENCODINGTYPE ietEncoding, ULONG *pcbSize);
|
|
STDMETHODIMP GetDataHere(ENCODINGTYPE ietEncoding, IStream *pStream);
|
|
STDMETHODIMP GetData(ENCODINGTYPE ietEncoding, IStream **ppStream);
|
|
STDMETHODIMP SetData(ENCODINGTYPE ietEncoding, LPCSTR pszPriType, LPCSTR pszSubType, REFIID riid, LPVOID pvObject);
|
|
STDMETHODIMP CopyTo(IMimeBody *pBody);
|
|
STDMETHODIMP GetCurrentEncoding(ENCODINGTYPE *pietEncoding);
|
|
STDMETHODIMP SetCurrentEncoding(ENCODINGTYPE ietEncoding);
|
|
STDMETHODIMP GetHandle(LPHBODY phBody);
|
|
STDMETHODIMP GetTransmitInfo(LPTRANSMITINFO pTransmit);
|
|
STDMETHODIMP GetOffsets(LPBODYOFFSETS pOffsets);
|
|
STDMETHODIMP SetDisplayName(LPCSTR pszDisplay);
|
|
STDMETHODIMP GetDisplayName(LPSTR *ppszDisplay);
|
|
STDMETHODIMP IsType(IMSGBODYTYPE type);
|
|
STDMETHODIMP SaveToFile(ENCODINGTYPE ietEncoding, LPCSTR pszFilePath);
|
|
STDMETHODIMP EmptyData(void);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeBodyW members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP SetDisplayNameW(LPCWSTR pwszDisplay);
|
|
STDMETHODIMP GetDisplayNameW(LPWSTR *ppwszDisplay);
|
|
STDMETHODIMP SetDataW(ENCODINGTYPE ietEncoding, LPCWSTR pwszPriType, LPCWSTR pwszSubType, REFIID riid, LPVOID pvObject);
|
|
STDMETHODIMP SaveToFileW(ENCODINGTYPE ietEncoding, LPCWSTR pwszFilePath);
|
|
|
|
#ifdef SMIME_V3
|
|
// ---------------------------------------------------------------------------
|
|
// IMimeSecurity2 members
|
|
// ---------------------------------------------------------------------------
|
|
STDMETHODIMP Encode(HWND hwnd, DWORD dwFlags);
|
|
STDMETHODIMP Decode(HWND hwnd, DWORD dwFlags, IMimeSecurityCallback * pCallback);
|
|
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 dwFlags, DWORD iRecipent, 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 ** ppMimeMessageReceipt);
|
|
STDMETHODIMP GetReceiptSendersList(DWORD dwFlags, DWORD * pcSendersList,
|
|
CERT_NAME_BLOB ** rgSendersList);
|
|
STDMETHODIMP VerifyReceipt(DWORD dwFlags, IMimeMessage * pMimeMessageReceipt);
|
|
STDMETHODIMP CapabilitiesSupported(DWORD * pdwFeatures);
|
|
#endif // SMIME_V3
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CMessageBody members
|
|
// ---------------------------------------------------------------------------
|
|
BOOL FExtractRfc822Subject(LPWSTR *ppwszVal);
|
|
void ClearDirty(void);
|
|
void SetState(DWORD dwState);
|
|
void ClearState(DWORD dwState);
|
|
HRESULT Load(CInternetStream *pInternet);
|
|
HRESULT HrGetLockBytes(ILockBytes **ppLockBytes);
|
|
HRESULT HrBindToTree(CStreamLockBytes *pStmLock, LPTREENODEINFO pNode);
|
|
DWORD DwGetFlags(BOOL fHideTnef);
|
|
void SwitchContainers(CMessageBody *pBody);
|
|
void CopyOptionsTo(CMessageBody *pBody, BOOL fNewOnwer=FALSE);
|
|
HRESULT InternalSetOption(const TYPEDID oid, LPCPROPVARIANT pValue, BOOL fInternal, BOOL fNoDirty);
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Inlines
|
|
// ---------------------------------------------------------------------------
|
|
LPINETCSETINFO PGetTaggedCset(void) {
|
|
EnterCriticalSection(&m_cs);
|
|
LPINETCSETINFO p = m_pCsetTagged;
|
|
LeaveCriticalSection(&m_cs);
|
|
return p;
|
|
}
|
|
HRESULT GetPreviousEncoding(ENCODINGTYPE * pietEncoding) {
|
|
if (ISFLAGSET(m_dwState, BODYSTATE_DIRTY)) {
|
|
*pietEncoding = m_ietPrevious = IET_UNKNOWN;
|
|
}
|
|
else {
|
|
*pietEncoding = m_ietPrevious;
|
|
}
|
|
return S_OK;
|
|
}
|
|
HRESULT SetPreviousEncoding(ENCODINGTYPE ietEncoding) {
|
|
m_ietPrevious = ietEncoding;
|
|
return S_OK;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// CMessageBody Accessor Functions
|
|
// ---------------------------------------------------------------------------
|
|
virtual HRESULT PrivateQueryInterface(REFIID riid, LPVOID * ppvObj);
|
|
void RevokeTreeNode(void);
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Private Methods
|
|
// ----------------------------------------------------------------------------
|
|
DWORD _GetSecureTypeFlags();
|
|
HRESULT _HrCopyDataStream(IStream *pstmSource, IStream *pstmDest);
|
|
void _FreeOptions();
|
|
void _BindToExternalBody(void);
|
|
#ifdef SMIME_V3
|
|
static HRESULT _HrGetAttrs(DWORD cAttrs, PCRYPT_ATTRIBUTES * rgpattrs, LPCSTR pszOid, PROPVARIANT FAR * pvOut);
|
|
static PCRYPT_ATTRIBUTE _FindAttribute(PCRYPT_ATTRIBUTES pattrs, LPCSTR pszObjId, DWORD iInstance);
|
|
static HRESULT _HrSetAttribute(DWORD dwFlags, PCRYPT_ATTRIBUTES * ppattrs, LPCSTR pszObjectId, DWORD cb, const BYTE * pb);
|
|
#endif // SMIME_V3
|
|
#ifdef _WIN64
|
|
static HRESULT _CAULToCERTARRAY(const CAUL caul, CERTARRAY *pca);
|
|
static HRESULT _CERTARRAYToCAUL(const CERTARRAY ca, CAUL *pcaul);
|
|
static HRESULT _CAUHToCERTARRAY(const CAUH cauh, CERTARRAY *pca);
|
|
static HRESULT _CERTARRAYToCAUH(const CERTARRAY ca, CAUH *pcauh);
|
|
#endif // _WIN64
|
|
static HRESULT _CAULToCertStore(const CAUL caul, HCERTSTORE * phcertstore);
|
|
static HRESULT _CertStoreToCAUL(const HCERTSTORE hcertstore, CAUL *pcaul);
|
|
static HRESULT _CAULToSTOREARRAY(const CAUL caul, STOREARRAY *psa);
|
|
static HRESULT _STOREARRAYToCAUL(const STOREARRAY sa, CAUL *pcaul);
|
|
static HRESULT _CAUHToCertStore(const CAUH cauh, HCERTSTORE * phcertstore);
|
|
static HRESULT _CertStoreToCAUH(const HCERTSTORE hcertstore, CAUH *pcauh);
|
|
static HRESULT _CAUHToSTOREARRAY(const CAUH cauh, STOREARRAY *psa);
|
|
static HRESULT _STOREARRAYToCAUH(const STOREARRAY sa, CAUH *pcauh);
|
|
|
|
HRESULT _HrEnsureBodyOptionLayers(LPCPROPVARIANT ppv);
|
|
HRESULT _HrEnsureBodyOptionLayers(ULONG ulLayers);
|
|
void _FreeLayerArrays(void);
|
|
HRESULT _CompareCopyBlobArray(const PROPVARIANT FAR * pvSource, BLOB FAR * FAR * prgblDestination, BOOL fNoDirty);
|
|
#ifdef SMIME_V3
|
|
HRESULT _HrSizeOfRecipInfos(DWORD cItems, const CMS_RECIPIENT_INFO *);
|
|
HRESULT _HrCopyRecipInfos(DWORD cItems, const CMS_RECIPIENT_INFO * precipSrc,
|
|
PCMS_RECIPIENT_INFO precipDst);
|
|
HRESULT _HrMapPublicKeyAlg(CERT_PUBLIC_KEY_INFO *, DWORD *,
|
|
CRYPT_ALGORITHM_IDENTIFIER **);
|
|
HRESULT _SetNames(ReceiptNames * pnames, DWORD cNames,
|
|
CERT_NAME_BLOB * rgNames);
|
|
HRESULT _MergeNames(ReceiptNames * pnames, DWORD cNames,
|
|
CERT_NAME_BLOB * rgNames);
|
|
STDMETHODIMP _GetReceiptRequest(DWORD dwFlags,
|
|
PSMIME_RECEIPT_REQUEST *ppreq,
|
|
ReceiptNames *pReceiptsTo,
|
|
DWORD *pcbReceipt,
|
|
LPBYTE *ppbReceipt,
|
|
DWORD *pcbMsgHash,
|
|
LPBYTE *ppbMsgHash);
|
|
#endif // SMIME_V3
|
|
|
|
|
|
private:
|
|
// ----------------------------------------------------------------------------
|
|
// Private Data
|
|
// ----------------------------------------------------------------------------
|
|
LONG m_cRef; // Reference Counting
|
|
DWORD m_dwState; // State of this body
|
|
DWORD m_cbExternal; // Size of external body if m_dwState, BODYSTATE_EXTERNAL
|
|
LPWSTR m_pszDisplay; // Display Name
|
|
BODYOPTIONS m_rOptions; // Body Options
|
|
BODYSTORAGE m_rStorage; // Body Data Source/Storage
|
|
ENCODINGTYPE m_ietEncoding; // Internal Body Format
|
|
LPINETCSETINFO m_pCharset; // Character set to be sent with
|
|
LPINETCSETINFO m_pCsetTagged; // Original Character Set
|
|
LPCONTAINER m_pContainer; // Property Container
|
|
LPTREENODEINFO m_pNode; // Tree NodeInfo
|
|
CRITICAL_SECTION m_cs; // Thread Safety
|
|
ENCODINGTYPE m_ietPrevious; // Previous CTE
|
|
};
|
|
|
|
// --------------------------------------------------------------------------------
|
|
// Types
|
|
// --------------------------------------------------------------------------------
|
|
typedef CMessageBody *LPMESSAGEBODY;
|
|
|
|
#endif // __BOOKBODY_H
|