Windows2003-3790/inetcore/outlookexpress/inetcomm/mimeole/variantx.h
2020-09-30 16:53:55 +02:00

187 lines
9.4 KiB
C

// --------------------------------------------------------------------------------
// VariantX.h
// Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
// --------------------------------------------------------------------------------
#ifndef __VARIANTX_H
#define __VARIANTX_H
// --------------------------------------------------------------------------------
// Forward Decls
// --------------------------------------------------------------------------------
typedef class CMimePropertyContainer *LPCONTAINER;
typedef struct tagMIMEVARIANT *LPMIMEVARIANT;
typedef struct tagPROPSYMBOL *LPPROPSYMBOL;
typedef struct tagHEADOPTIONS *LPHEADOPTIONS;
// --------------------------------------------------------------------------------
// MIMEVARTYPE
// --------------------------------------------------------------------------------
typedef enum tagMIMEVARTYPE {
MVT_EMPTY, // The Variant is Empty
MVT_STRINGA, // Ansi/multibyte string
MVT_STRINGW, // Unicode String
MVT_VARIANT, // PropVariant
MVT_STREAM, // Internal type used to when saving properties
MVT_LAST // Illegal, don't use
} MIMEVARTYPE;
// ---------------------------------------------------------------------------------------
// ISSUPPORTEDVT
// ---------------------------------------------------------------------------------------
#define ISSUPPORTEDVT(_vt) \
(VT_LPSTR == _vt || VT_LPWSTR == _vt || VT_FILETIME == _vt || VT_UI4 == _vt || VT_I4 == _vt || VT_STREAM == _vt)
// ---------------------------------------------------------------------------------------
// ISVALIDVARTYPE
// ---------------------------------------------------------------------------------------
#define ISVALIDVARTYPE(_vartype) \
(_vartype > MVT_EMPTY && _vartype < MVT_LAST)
// ---------------------------------------------------------------------------------------
// ISVALIDSTRINGA - Validates a PROPSTRINGA
// ---------------------------------------------------------------------------------------
#define ISVALIDSTRINGA(_pStringA) \
(NULL != (_pStringA) && NULL != (_pStringA)->pszVal && '\0' == (_pStringA)->pszVal[(_pStringA)->cchVal])
// ---------------------------------------------------------------------------------------
// ISVALIDSTRINGW - Validates a PROPSTRINGW
// ---------------------------------------------------------------------------------------
#define ISVALIDSTRINGW(_pStringW) \
(NULL != (_pStringW) && NULL != (_pStringW)->pszVal && L'\0' == (_pStringW)->pszVal[(_pStringW)->cchVal])
// ---------------------------------------------------------------------------------------
// ISSTRINGA - Determines if a MIMEVARIANT is a valid MVT_STRINGA
// ---------------------------------------------------------------------------------------
#define ISSTRINGA(_pVariant) \
(NULL != (_pVariant) && MVT_STRINGA == (_pVariant)->type && ISVALIDSTRINGA(&((_pVariant)->rStringA)))
// ---------------------------------------------------------------------------------------
// ISSTRINGW - Determines if a MIMEVARIANT is a valid MVT_STRINGW
// ---------------------------------------------------------------------------------------
#define ISSTRINGW(_pVariant) \
(NULL != (_pVariant) && MVT_STRINGW == (_pVariant)->type && ISVALIDSTRINGW(&((_pVariant)->rStringW)))
// ---------------------------------------------------------------------------------------
// PSZSTRINGA - Derefs rStringA.pszVal or uses _pszDefault if not a valid string
// ---------------------------------------------------------------------------------------
#define PSZSTRINGA(_pVariant) \
(ISSTRINGA((_pVariant)) ? (_pVariant)->rStringA.pszVal : NULL)
// ---------------------------------------------------------------------------------------
// PSZDEFSTRINGA - Derefs rStringA.pszVal or uses _pszDefault if not a valid string
// ---------------------------------------------------------------------------------------
#define PSZDEFSTRINGA(_pVariant, _pszDefault) \
(ISSTRINGA((_pVariant)) ? (_pVariant)->rStringA.pszVal : _pszDefault)
// --------------------------------------------------------------------------------
// PROPSTRINGA
// --------------------------------------------------------------------------------
typedef struct tagPROPSTRINGA {
LPSTR pszVal; // Pointer to multibyte string
ULONG cchVal; // Number of characters in psz
} PROPSTRINGA, *LPPROPSTRINGA;
typedef const PROPSTRINGA *LPCPROPSTRINGA;
// --------------------------------------------------------------------------------
// PROPSTRINGW
// --------------------------------------------------------------------------------
typedef struct tagPROPSTRINGW {
LPWSTR pszVal; // Pointer to multibyte string
ULONG cchVal; // Number of characters in psz
} PROPSTRINGW, *LPPROPSTRINGW;
typedef const PROPSTRINGW *LPCPROPSTRINGW;
// --------------------------------------------------------------------------------
// MIMEVARIANT
// --------------------------------------------------------------------------------
typedef struct tagMIMEVARIANT {
MIMEVARTYPE type; // Property Data Type
BYTE fCopy; // The data was copied, don't free it
union {
PROPSTRINGA rStringA; // MVT_STRINGA
PROPSTRINGW rStringW; // MVT_STRINGW
PROPVARIANT rVariant; // MVT_VARIANT
LPSTREAM pStream; // MVT_STREAM
};
} MIMEVARIANT, *LPMIMEVARIANT;
typedef const MIMEVARIANT *LPCMIMEVARIANT;
// --------------------------------------------------------------------------------
// Convert Variant Flags (WARNING: DO NOT OVERFLAG PROPDATAFLAGS WITH THESE)
// --------------------------------------------------------------------------------
#define CVF_NOALLOC FLAG32 // Tells the converter to copy data if it can
// --------------------------------------------------------------------------------
// VARIANTCONVERT
// --------------------------------------------------------------------------------
typedef struct tagVARIANTCONVERT {
LPHEADOPTIONS pOptions; // Header Options
LPPROPSYMBOL pSymbol; // Property Symbol
LPINETCSETINFO pCharset; // Charset to use in conversion
ENCODINGTYPE ietSource; // Encoding of source item
DWORD dwFlags; // Property Data Flags
DWORD dwState; // PRSTATE_xxx Flags
} VARIANTCONVERT, *LPVARIANTCONVERT;
// --------------------------------------------------------------------------------
// HrMimeVariantCopy
// --------------------------------------------------------------------------------
HRESULT HrMimeVariantCopy(
/* in */ DWORD dwFlags, // CVF_xxx Flags
/* in */ LPMIMEVARIANT pSource,
/* out */ LPMIMEVARIANT pDest);
// --------------------------------------------------------------------------------
// HrConvertVariant
// --------------------------------------------------------------------------------
HRESULT HrConvertVariant(
/* in */ LPHEADOPTIONS pOptions,
/* in */ LPPROPSYMBOL pSymbol,
/* in */ LPINETCSETINFO pCharset,
/* in */ ENCODINGTYPE ietSource,
/* in */ DWORD dwFlags,
/* in */ DWORD dwState,
/* in */ LPMIMEVARIANT pSource,
/* in,out */ LPMIMEVARIANT pDest,
/* out,opt */ BOOL *pfRfc1522=NULL);
// --------------------------------------------------------------------------------
// MimeVariantFree
// --------------------------------------------------------------------------------
void MimeVariantFree(
/* in */ LPMIMEVARIANT pVariant);
// --------------------------------------------------------------------------------
// MimeVariantCleanupFileName
// --------------------------------------------------------------------------------
void MimeVariantCleanupFileName(
/* in */ CODEPAGEID codepage,
/* in,out */ LPMIMEVARIANT pVariant);
// --------------------------------------------------------------------------------
// MimeVariantStripComments
// --------------------------------------------------------------------------------
HRESULT MimeVariantStripComments(
/* in */ LPMIMEVARIANT pSource,
/* in,out */ LPMIMEVARIANT pDest,
/* in,out */ LPBYTE pbScratch,
/* in */ ULONG cbScratch);
// ---------------------------------------------------------------------------------------
// MimeVT_To_PropVT
// ---------------------------------------------------------------------------------------
inline VARTYPE MimeVT_To_PropVT(LPMIMEVARIANT pVariant) {
Assert(pVariant);
if (MVT_STRINGA == pVariant->type)
return(VT_LPSTR);
else if (MVT_STRINGW == pVariant->type)
return(VT_LPWSTR);
else if (MVT_VARIANT == pVariant->type)
return(pVariant->rVariant.vt);
else
return(VT_EMPTY);
}
#endif // __VARIANTX_H