// --------------------------------------------------------------------------------
// MIMEOLE.IDL
// Copyright (c)1993-1998 Microsoft Corporation, All Rights Reserved
// --------------------------------------------------------------------------------

import "ocidl.idl";
import "objidl.idl";
import "wincrypt.idl";

#ifndef UNIX
import "propidl.idl";
#else
import "urlmon.idl";
#endif /* unix */

#include "mimedisp.h"

cpp_quote("#ifdef UNICODE")
cpp_quote("// Saving predefined unicode macros")
cpp_quote("#pragma push_macro(\"GetProp\")")
cpp_quote("#pragma push_macro(\"SetProp\")")
cpp_quote("#undef GetProp")
cpp_quote("#undef SetProp")
cpp_quote("#endif // UNICODE")

interface IMimePropertySet;
interface IMimeMessage;
interface IMimeMessageW;
interface IMimeBody;
interface IMimeBodyW;
interface IMimeMessageTree;
interface IMimeEnumHeaderRows;
interface IMimeAddressTable;
interface IMimeAddressTableW;
interface IMimeMessageParts;
interface IMimeEnumMessageParts;
interface IMimeEnumAddressTypes;
interface IMimeInternational;
interface IMimeEnumProperties;
interface IMimeMessageCallback;
interface IMimeSecurityCallback;

cpp_quote("#if (_WIN32_OE >= 0x0500)")
interface IPersistMime;
cpp_quote("#endif //_WIN32_OE")

cpp_quote("#if (_WIN32_OE >= 0x0700)")
interface IMimeSecurity2;
interface INewsgroupHelp;
interface IHashTableW;
cpp_quote("#endif //_WIN32_OE")

cpp_quote("//--------------------------------------------------------------------------------")
cpp_quote("// MIMEOLE.H")
cpp_quote("//--------------------------------------------------------------------------------")
cpp_quote("// (C) Copyright 1995-1998 Microsoft Corporation.  All Rights Reserved.")
cpp_quote("//")
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
cpp_quote("// PARTICULAR PURPOSE.")
cpp_quote("//--------------------------------------------------------------------------------")
cpp_quote("")
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// GUIDS")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// {E4B28371-83B0-11d0-8259-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(LIBID_MIMEOLE, 0xe4b28371, 0x83b0, 0x11d0, 0x82, 0x59, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {05300401-BCBC-11d0-85E3-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeHtmlProtocol, 0x5300401, 0xbcbc, 0x11d0, 0x85, 0xe3, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {C5588354-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeEnumAddressTypes, 0xc5588354, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {EE519F11-851A-11d0-825C-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeWebDocument, 0xee519f11, 0x851a, 0x11d0, 0x82, 0x5c, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CEF-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IUnicodeStream, 0xfd853cef, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {C558834A-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeAddressTable, 0xc558834a, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {11C8D742-0FB4-11d3-A01E-00A0C90C9BB6}")
cpp_quote("DEFINE_GUID(IID_IMimeAddressTableW, 0x11c8d742, 0xfb4, 0x11d3, 0xa0, 0x1e, 0x0, 0xa0, 0xc9, 0xc, 0x9b, 0xb6);")
cpp_quote("")
cpp_quote("// {C558834B-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeAddressInfo, 0xc558834b, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {C558834D-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeEnumHeaderRows, 0xc558834d, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {C558834E-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeInlineSupport, 0xc558834e, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {C5588350-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeEnumMessageParts, 0xc5588350, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CD9-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeInternational, 0xfd853cd9, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C5588349-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeInternational, 0xc5588349, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CDB-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeBody, 0xfd853cdb, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C558834C-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeBody, 0xc558834c, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {2F38042A-D02F-11d2-A004-00A0C90C9BB6}")
cpp_quote("DEFINE_GUID(CLSID_IMimeBodyW, 0x2f38042a, 0xd02f, 0x11d2, 0xa0, 0x4, 0x0, 0xa0, 0xc9, 0xc, 0x9b, 0xb6);")
cpp_quote("// {2F38042B-D02F-11d2-A004-00A0C90C9BB6}")
cpp_quote("DEFINE_GUID(IID_IMimeBodyW, 0x2f38042b, 0xd02f, 0x11d2, 0xa0, 0x4, 0x0, 0xa0, 0xc9, 0xc, 0x9b, 0xb6);")
cpp_quote("")
cpp_quote("// {FD853CDC-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeMessageParts, 0xfd853cdc, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C558834F-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeMessageParts, 0xc558834f, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CDD-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeAllocator, 0xfd853cdd, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C5588351-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeAllocator, 0xc5588351, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CDE-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeSecurity, 0xfd853cde, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C5588353-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeSecurity, 0xc5588353, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CDF-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IVirtualStream, 0xfd853cdf, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {C5588359-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IVirtualStream, 0xc5588359, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CE0-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeHeaderTable, 0xfd853ce0, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {FD853CD1-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeHeaderTable, 0xfd853cd1, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CE1-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimePropertySet, 0xfd853ce1, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {FD853CD3-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimePropertySet, 0xfd853cd3, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CE2-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeMessageTree, 0xfd853ce2, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {FD853CD4-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeMessageTree, 0xfd853cd4, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CE3-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimeMessage, 0xfd853ce3, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {FD853CD5-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeMessage, 0xfd853cd5, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {F90ADFEE-D01F-11d2-A004-00A0C90C9BB6}")
cpp_quote("DEFINE_GUID(CLSID_IMimeMessageW, 0xf90adfee, 0xd01f, 0x11d2, 0xa0, 0x4, 0x0, 0xa0, 0xc9, 0xc, 0x9b, 0xb6);")
cpp_quote("// {F90ADFEF-D01F-11d2-A004-00A0C90C9BB6}")
cpp_quote("DEFINE_GUID(IID_IMimeMessageW, 0xf90adfef, 0xd01f, 0x11d2, 0xa0, 0x4, 0x0, 0xa0, 0xc9, 0xc, 0x9b, 0xb6);")
cpp_quote("")
cpp_quote("// {FD853CED-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(CLSID_IMimePropertySchema, 0xfd853ced, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("// {FD853CEC-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimePropertySchema, 0xfd853cec, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {FD853CEE-7F86-11d0-8252-00C04FD85AB4}")
cpp_quote("DEFINE_GUID(IID_IMimeEnumProperties, 0xfd853cee, 0x7f86, 0x11d0, 0x82, 0x52, 0x0, 0xc0, 0x4f, 0xd8, 0x5a, 0xb4);")
cpp_quote("")
cpp_quote("// {DE4AD8DA-555F-11d1-8DD0-00C04FB951F9}")
cpp_quote("DEFINE_GUID(IID_IPersistMime, 0xde4ad8da, 0x555f, 0x11d1, 0x8d, 0xd0, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xf9);")
cpp_quote("")
cpp_quote("// {761AA641-7BDA-11d1-8AA9-00C04FB951F3}")
cpp_quote("DEFINE_GUID(IID_IMimeMessageCallback, 0x761aa641, 0x7bda, 0x11d1, 0x8a, 0xa9, 0x0, 0xc0, 0x4f, 0xb9, 0x51, 0xf3);")
cpp_quote("")
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("")
cpp_quote("// {1C82EAD9-508E-11d1-8DCF-00C04FB951F9}")
cpp_quote("DEFINE_GUID(CLSID_MimeEdit, 0x1c82ead9, 0x508e, 0x11d1, 0x8d, 0xcf, 0x0, 0xc0, 0x4f, 0xb9, 0x51, 0xf9);")
cpp_quote("")
cpp_quote("// {1C82EADA-508E-11d1-8DCF-00C04FB951F9}")
cpp_quote("DEFINE_GUID(CMDSETID_MimeEdit, 0x1c82eada, 0x508e, 0x11d1, 0x8d, 0xcf, 0x0, 0xc0, 0x4f, 0xb9, 0x51, 0xf9);")
cpp_quote("")
cpp_quote("// {1C82EADB-508E-11d1-8DCF-00C04FB951F9}")
cpp_quote("DEFINE_GUID(CMDSETID_MimeEditHost, 0x1c82eadb, 0x508e, 0x11d1, 0x8d, 0xcf, 0x0, 0xc0, 0x4f, 0xb9, 0x51, 0xf9);")
cpp_quote("")
cpp_quote("// {64577981-86D7-11d1-BDFC-00C04FA31009}")
cpp_quote("DEFINE_GUID(IID_IHashTable, 0x64577981, 0x86d7, 0x11d1, 0xbd, 0xfc, 0x0, 0xc0, 0x4f, 0xa3, 0x10, 0x9);")
cpp_quote("")
cpp_quote("// {64577982-86D7-11d1-BDFC-00C04FA31009}")
cpp_quote("DEFINE_GUID(CLSID_IHashTable, 0x64577982, 0x86d7, 0x11d1, 0xbd, 0xfc, 0x0, 0xc0, 0x4f, 0xa3, 0x10, 0x9);")
cpp_quote("")
cpp_quote("// {B0D17FC2-7BC4-11d1-BDFA-00C04FA31009}")
cpp_quote("DEFINE_GUID(CLSID_IFontCache, 0xb0d17fc2, 0x7bc4, 0x11d1, 0xbd, 0xfa, 0x0, 0xc0, 0x4f, 0xa3, 0x10, 0x9);")
cpp_quote("")
cpp_quote("// {B0D17FC4-7BC4-11d1-BDFA-00C04FA31009}")
cpp_quote("DEFINE_GUID(IID_IFontCache, 0xb0d17fc4, 0x7bc4, 0x11d1, 0xbd, 0xfa, 0x0, 0xc0, 0x4f, 0xa3, 0x10, 0x9);")
cpp_quote("")
cpp_quote("// {B0D17FC5-7BC4-11d1-BDFA-00C04FA31009}")
cpp_quote("DEFINE_GUID(IID_IFontCacheNotify, 0xb0d17fc5, 0x7bc4, 0x11d1, 0xbd, 0xfa, 0x0, 0xc0, 0x4f, 0xa3, 0x10, 0x9);")
cpp_quote("")
cpp_quote("// {35461E30-C488-11d1-960E-00C04FBD7C09}")
cpp_quote("DEFINE_GUID(CLSID_IMimeObjResolver, 0x35461e30, 0xc488, 0x11d1, 0x96, 0xe, 0x0, 0xc0, 0x4f, 0xbd, 0x7c, 0x9);")
cpp_quote("")
cpp_quote("// {FECEAFFD-C441-11d1-960E-00C04FBD7C09}")
cpp_quote("DEFINE_GUID(IID_IMimeObjResolver, 0xfeceaffd, 0xc441, 0x11d1, 0x96, 0xe, 0x0, 0xc0, 0x4f, 0xbd, 0x7c, 0x9);")
cpp_quote("")
cpp_quote("// {70183210-7b36-11d2-8c12-00c04fa31009}")
cpp_quote("DEFINE_GUID(IID_IMimeEditTag, 0x70183210, 0x7b36, 0x11d2, 0x8c, 0x12, 0x00, 0xc0, 0x4f, 0xa3, 0x10, 0x09);")
cpp_quote("")
cpp_quote("// {ba715ae0-a740-11d2-8b22-0080c76b34c6}")
cpp_quote("DEFINE_GUID(IID_IMimeSecurityCallback, 0xba715ae0, 0xa740, 0x11d2, 0x8b, 0x22, 0x00, 0x80, 0xc7, 0x6b, 0x34, 0xc6);")
cpp_quote("")
cpp_quote("// {7A0CC021-2939-4379-AA82-12AECC3538F6}")
cpp_quote("DEFINE_GUID(CLSID_INewsgroupHelp, 0x7a0cc021, 0x2939, 0x4379, 0xaa, 0x82, 0x12, 0xae, 0xcc, 0x35, 0x38, 0xf6);")
cpp_quote("// {0887C54F-4F42-4937-81DA-BC9C97494627}")
cpp_quote("DEFINE_GUID(IID_INewsgroupHelp, 0x887c54f, 0x4f42, 0x4937, 0x81, 0xda, 0xbc, 0x9c, 0x97, 0x49, 0x46, 0x27);")
cpp_quote("")
cpp_quote("// 71d6b38c-7a15-42c6-af84-b2a5dc242ceb")
cpp_quote("DEFINE_GUID(IID_IHashTableW, 0x71d6b38c, 0x7a15, 0x42c6, 0xaf, 0x84, 0xb2, 0xa5, 0xdc, 0x24, 0x2c, 0xeb);")
cpp_quote("// 71d6b38d-7a15-42c6-af84-b2a5dc242ceb")
cpp_quote("DEFINE_GUID(CLSID_IHashTableW, 0x71d6b38d, 0x7a15, 0x42c6, 0xaf, 0x84, 0xb2, 0xa5, 0xdc, 0x24, 0x2c, 0xeb);")
cpp_quote("")
cpp_quote("// {d09ee528-7b38-11d2-8c12-00c04fa31009}")
cpp_quote("DEFINE_GUID(IID_IMimeEditTagCollection, 0xd09ee528, 0x7b38, 0x11d2, 0x8c, 0x12, 0x00, 0xc0, 0x4f, 0xa3, 0x10, 0x09);")
cpp_quote("// {b9815375-5d7f-4ce2-9245-c9d4da436930}")
cpp_quote("DEFINE_GUID(CLSID_PreviewEmail, 0xb9815375, 0x5d7f, 0x4ce2, 0x92, 0x45, 0xc9, 0xd4, 0xda, 0x43, 0x69, 0x30);")
cpp_quote("// {f8b8412b-dea3-4130-b36c-5e8be73106ac}")
cpp_quote("DEFINE_GUID(CLSID_PreviewHtml, 0xf8b8412b, 0xdea3, 0x4130, 0xb3, 0x6c, 0x5e, 0x8b, 0xe7, 0x31, 0x06, 0xac);")
cpp_quote("// {92dbad9f-5025-49b0-9078-2d78f935e341}")
cpp_quote("DEFINE_GUID(CLSID_PreviewMime, 0x92dbad9f, 0x5025, 0x49b0, 0x90, 0x78, 0x2d, 0x78, 0xf9, 0x35, 0xe3, 0x41);")
cpp_quote("// {BFD468D2-D0A0-4bdc-878C-E69C2F5B435D}")
cpp_quote("DEFINE_GUID(CLSID_PreviewUrl, 0xbfd468d2, 0xd0a0, 0x4bdc, 0x87, 0x8c, 0xe6, 0x9c, 0x2f, 0x5b, 0x43, 0x5d);")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Errors")
cpp_quote("// --------------------------------------------------------------------------------")
//;begin_internal
//
//  NOTE:  All inetcomm error codes must reside between CC00 and CFFF (a 1k block).
//  This has been approved by Johann Posch (johannp)
//  We further subdevide this range as follows:
//      CC00-CCFF   IMNXPORT results
//      CD00-CDFF   IMNACCT results
//      CE00-CEFF   MIMEOLE results
//      CF00-CFFF   undefined, do not use
//  (t-erikne 03/24/97)
//
//  NOTE:  All MimeEdit error codes must reside between 0x1700 - 0x17FF
//
//
//;end_internal

cpp_quote("#ifndef FACILITY_INTERNET")
cpp_quote("#define FACILITY_INTERNET 12")
cpp_quote("#endif // FACILITY_INTERNET")
cpp_quote("#ifndef HR_E")
cpp_quote("#define HR_E(n) MAKE_SCODE(SEVERITY_ERROR, FACILITY_INTERNET, n)")
cpp_quote("#endif // HR_E")
cpp_quote("#ifndef HR_S")
cpp_quote("#define HR_S(n) MAKE_SCODE(SEVERITY_SUCCESS, FACILITY_INTERNET, n)")
cpp_quote("#endif // HR_S")
cpp_quote("#ifndef HR_CODE")
cpp_quote("#define HR_CODE(hr) (INT)(hr & 0xffff)")
cpp_quote("#endif // HR_CODE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIMEOLE Failure Return Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MIME_E_REG_CREATE_KEY                HR_E(0xCE01)")
cpp_quote("#define MIME_E_REG_QUERY_INFO                HR_E(0xCE02)")
cpp_quote("#define MIME_E_INVALID_ENCTYPE               HR_E(0xCE03)")
cpp_quote("#define MIME_E_BOUNDARY_MISMATCH             HR_E(0xCE04)")
cpp_quote("#define MIME_E_NOT_FOUND                     HR_E(0xCE05)")
cpp_quote("#define MIME_E_NO_DATA                       HR_E(0xCE05)")
cpp_quote("#define MIME_E_BUFFER_TOO_SMALL              HR_E(0xCE06)")
cpp_quote("#define MIME_E_INVALID_ITEM_FLAGS            HR_E(0xCE07)")
cpp_quote("#define MIME_E_ONE_LINE_ITEM                 HR_E(0xCE08)")
cpp_quote("#define MIME_E_INVALID_HANDLE                HR_E(0xCE09)")
cpp_quote("#define MIME_E_CHARSET_TRANSLATE             HR_E(0xCE0A)")
cpp_quote("#define MIME_E_NOT_INITIALIZED               HR_E(0xCE0B)")
cpp_quote("#define MIME_E_NO_MORE_ROWS                  HR_E(0xCE0C)")
cpp_quote("#define MIME_E_ALREADY_BOUND                 HR_E(0xCE0D)")
cpp_quote("#define MIME_E_CANT_RESET_ROOT               HR_E(0xCE0E)")
cpp_quote("#define MIME_E_INSERT_NOT_ALLOWED            HR_E(0xCE0F)")
cpp_quote("#define MIME_E_BAD_BODY_LOCATION             HR_E(0xCE10)")
cpp_quote("#define MIME_E_NOT_MULTIPART                 HR_E(0xCE11)")
cpp_quote("#define MIME_E_NO_MULTIPART_BOUNDARY         HR_E(0xCE12)")
cpp_quote("#define MIME_E_CONVERT_NOT_NEEDED            HR_E(0xCE13)")
cpp_quote("#define MIME_E_CANT_MOVE_BODY                HR_E(0xCE14)")
cpp_quote("#define MIME_E_UNKNOWN_BODYTREE_VERSION      HR_E(0xCE15)")
cpp_quote("#define MIME_E_NOTHING_TO_SAVE               HR_E(0xCE16)")
cpp_quote("#define MIME_E_NEED_SAVE_MESSAGE             HR_E(0xCE17)")
cpp_quote("#define MIME_E_NOTHING_TO_REVERT             HR_E(0xCE18)")
cpp_quote("#define MIME_E_MSG_SIZE_DIFF                 HR_E(0xCE19)")
cpp_quote("#define MIME_E_CANT_RESET_PARENT             HR_E(0xCE1A)")
cpp_quote("#define MIME_E_CORRUPT_CACHE_TREE            HR_E(0xCE1B)")
cpp_quote("#define MIME_E_BODYTREE_OUT_OF_SYNC          HR_E(0xCE1C)")
cpp_quote("#define MIME_E_INVALID_ENCODINGTYPE          HR_E(0xCE1D)")
cpp_quote("#define MIME_E_MULTIPART_NO_DATA             HR_E(0xCE1E)")
cpp_quote("#define MIME_E_INVALID_OPTION_VALUE          HR_E(0xCE1F)")
cpp_quote("#define MIME_E_INVALID_OPTION_ID             HR_E(0xCE20)")
cpp_quote("#define MIME_E_INVALID_HEADER_NAME           HR_E(0xCE21)")
cpp_quote("#define MIME_E_NOT_BOUND                     HR_E(0xCE22)")
cpp_quote("#define MIME_E_MAX_SIZE_TOO_SMALL            HR_E(0xCE23)")
cpp_quote("#define MIME_E_MULTIPART_HAS_CHILDREN        HR_E(0xCE25)")
cpp_quote("#define MIME_E_INVALID_PROP_FLAGS            HR_E(0xCE26)")
cpp_quote("#define MIME_E_INVALID_ADDRESS_TYPE          HR_E(0xCE27)")
cpp_quote("#define MIME_E_INVALID_OBJECT_IID            HR_E(0xCE28)")
cpp_quote("#define MIME_E_MLANG_DLL_NOT_FOUND           HR_E(0xCE29)")
cpp_quote("#define MIME_E_ROOT_NOT_EMPTY                HR_E(0xCE2A)")
cpp_quote("#define MIME_E_MLANG_BAD_DLL                 HR_E(0xCE2B)")
cpp_quote("#define MIME_E_REG_OPEN_KEY                  HR_E(0xCE2C)")
cpp_quote("#define MIME_E_INVALID_INET_DATE             HR_E(0xCE2D)")
cpp_quote("#define MIME_E_INVALID_BODYTYPE              HR_E(0xCE2E)")
cpp_quote("#define MIME_E_INVALID_DELETE_TYPE           HR_E(0xCE2F)")
cpp_quote("#define MIME_E_OPTION_HAS_NO_VALUE           HR_E(0xCE30)")
cpp_quote("#define MIME_E_INVALID_CHARSET_TYPE          HR_E(0xCE31)")
cpp_quote("#define MIME_E_VARTYPE_NO_CONVERT            HR_E(0xCE32)")
cpp_quote("#define MIME_E_INVALID_VARTYPE               HR_E(0xCE33)")
cpp_quote("#define MIME_E_NO_MORE_ADDRESS_TYPES         HR_E(0xCE34)")
cpp_quote("#define MIME_E_INVALID_ENCODING_TYPE         HR_E(0xCE35)")
cpp_quote("#define MIME_S_ILLEGAL_LINES_FOUND           HR_S(0xCE36)")
cpp_quote("#define MIME_S_MIME_VERSION                  HR_S(0xCE37)")
cpp_quote("#define MIME_E_INVALID_TEXT_TYPE             HR_E(0xCE38)")
cpp_quote("#define MIME_E_READ_ONLY                     HR_E(0xCE39)")
cpp_quote("#define MIME_S_INVALID_MESSAGE               HR_S(0xCE3A)")
cpp_quote("#define MIME_S_CHARSET_CONFLICT              HR_S(0xCE3B)")
cpp_quote("#define MIME_E_UNSUPPORTED_VARTYPE           HR_E(0xCE3C)")
cpp_quote("#define MIME_S_NO_CHARSET_CONVERT            HR_S(0xCE3D)")
cpp_quote("#define MIME_E_URL_NOTFOUND                  HR_E(0xCE3E)")
cpp_quote("#define MIME_E_BAD_TEXT_DATA                 HR_E(0xCE3F)")
cpp_quote("#define MIME_E_NO_SIGNER                     HR_S(0xCE40)")
cpp_quote("")
cpp_quote("// ---------------------------------------------------------------------------")
cpp_quote("// MIMEOLE Security Error Return Values")
cpp_quote("// ---------------------------------------------------------------------------")
//;begin_internal
//  MIMEOLE Security HRESULTS are further subdivided
//  NOTE: you should never progammatically rely on this ordering
//  it simply gives you a visual cue in the DOUTs
//      CEA0-CEAF   Initialization/Global
//      CEB0-CCCF   General
//      CED0-CEDF   Certificate
//      CEE0-CEEF   Signing
//      CEF0-CEFF   Encryption
//;end_internal
cpp_quote("#define MIME_E_SECURITY_NOTINIT              HR_E(0xCEA0)")
cpp_quote("#define MIME_E_SECURITY_LOADCRYPT32          HR_E(0xCEA1)")
cpp_quote("#define MIME_E_SECURITY_BADPROCADDR          HR_E(0xCEA2)")
cpp_quote("#define MIME_E_SECURITY_NODEFAULT            HR_E(0xCEB0)")
cpp_quote("#define MIME_E_SECURITY_NOOP                 HR_E(0xCEB1)")
cpp_quote("#define MIME_S_SECURITY_NOOP                 HR_S(0xCEB1)")
cpp_quote("#define MIME_S_SECURITY_NONE                 HR_S(0xCEB2)")
cpp_quote("#define MIME_S_SECURITY_ERROROCCURED         HR_S(0xCEB3)")
cpp_quote("#define MIME_E_SECURITY_USERCHOICE           HR_E(0xCEB4)")
cpp_quote("#define MIME_E_SECURITY_UNKMSGTYPE           HR_E(0xCEB5)")
cpp_quote("#define MIME_E_SECURITY_BADMESSAGE           HR_E(0xCEB6)")
cpp_quote("#define MIME_E_SECURITY_BADCONTENT           HR_E(0xCEB7)")
cpp_quote("#define MIME_E_SECURITY_BADSECURETYPE        HR_E(0xCEB8)")
cpp_quote("#define MIME_E_SECURITY_CLASSNOTSUPPORTED    HR_E(0xCEB9)")
cpp_quote("#define MIME_S_SECURITY_RECURSEONLY          HR_S(0xCEBA)")
cpp_quote("#define MIME_E_SECURITY_BADSTORE             HR_E(0xCED0)")
cpp_quote("#define MIME_S_SECURITY_NOCERT               HR_S(0xCED1)")
cpp_quote("#define MIME_E_SECURITY_NOCERT               HR_E(0xCED1)")
cpp_quote("#define MIME_E_SECURITY_CERTERROR            HR_E(0xCED2)")
cpp_quote("#define MIME_S_SECURITY_CERTERROR            HR_S(0xCED2)")
cpp_quote("#define MIME_S_SECURITY_NODEFCERT            HR_S(0xCED3)")
cpp_quote("#define MIME_E_SECURITY_BADSIGNATURE         HR_E(0xCEE0)")
cpp_quote("#define MIME_E_SECURITY_MULTSIGNERS          HR_E(0xCEE1)")
cpp_quote("#define MIME_E_SECURITY_NOSIGNINGCERT        HR_E(0xCEE2)")
cpp_quote("#define MIME_E_SECURITY_CANTDECRYPT          HR_E(0xCEF0)")
cpp_quote("#define MIME_E_SECURITY_ENCRYPTNOSENDERCERT  HR_E(0xCEF1)")
cpp_quote("#define MIME_S_SECURITY_NOSENDERCERT         HR_S(0xCEF2)")
cpp_quote("#define MIME_E_SECURITY_LABELACCESSDENIED    HR_E(0xCEF3)")
cpp_quote("#define MIME_E_SECURITY_LABELACCESSCANCELLED HR_E(0xCEF4)")
cpp_quote("#define MIME_E_SECURITY_LABELCORRUPT         HR_E(0xCEF5)")
cpp_quote("#define MIME_E_SECURITY_UIREQUIRED           HR_E(0xCEF6)")
cpp_quote("#define MIME_E_SECURITY_RECEIPT_NOMATCHINGRECEIPTBODY  HR_E(0xCEF7)")
cpp_quote("#define MIME_E_SECURITY_RECEIPT_MSGHASHMISMATCH        HR_E(0xCEF8)")
cpp_quote("#define MIME_E_SECURITY_RECEIPT_CANTDECODE             HR_E(0xCEF9)")
cpp_quote("#define MIME_E_SECURITY_RECEIPT_CANTFINDSENTITEM       HR_E(0xCEFA)")
cpp_quote("#define MIME_E_SECURITY_RECEIPT_CANTFINDORGMSG         HR_E(0xCEFB)")
cpp_quote("#define MIME_E_SECURITY_LABELUIREQUIRED                HR_E(0xCEFC)")
cpp_quote("#define MIME_S_RECEIPT_FROMMYSELF                      HR_S(0xCEFC)")
cpp_quote("#define MIME_E_SECURITY_NOTIMPLEMENTED                 HR_E(0xCEFD)")
cpp_quote("")
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIMEEDIT Failure Return Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MIMEEDIT_E_UNEXPECTED                        HR_E(0x1700)")
cpp_quote("#define MIMEEDIT_E_DODEFAULT                         HR_E(0x1701)")
cpp_quote("#define MIMEEDIT_E_LOADLIBRARYFAILURE                HR_E(0x1702)")
cpp_quote("#define MIMEEDIT_E_USERCANCEL                        HR_E(0x1703)")
cpp_quote("#define MIMEEDIT_E_CHARSETNOTFOUND                   HR_E(0x1704)")
cpp_quote("#define MIMEEDIT_E_ILLEGALBODYFORMAT                 HR_E(0x1705)")
cpp_quote("#define MIMEEDIT_E_CANNOTSAVEUNTILPARSECOMPLETE      HR_E(0x1706)")
cpp_quote("#define MIMEEDIT_E_CANNOTSAVEWHILESOURCEEDITING      HR_E(0x1707)")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIMEEDIT Success Return Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MIMEEDIT_S_OPENFILE                          HR_S(0x1750)")
cpp_quote("#define MIMEEDIT_S_SAVEFILE                          HR_S(0x1751)")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIMEEDIT Warning Return Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MIMEEDIT_W_DOWNLOADNOTCOMPLETE               HR_S(0x1760)")
cpp_quote("#define MIMEEDIT_W_BADURLSNOTATTACHED                HR_S(0x1761)")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// String Definition Macros")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#ifdef __cplusplus")
cpp_quote("#define EXTERN_C extern \"C\"")
cpp_quote("#else")
cpp_quote("#define EXTERN_C extern")
cpp_quote("#endif // __cplusplus")
cpp_quote("")
cpp_quote("#ifndef STRCONSTA")
cpp_quote("#ifdef DEFINE_STRCONST")
cpp_quote("#define STRCONSTA(x,y)    EXTERN_C const char x[] = y")
cpp_quote("#define STRCONSTW(x,y)    EXTERN_C const WCHAR x[] = L##y")
cpp_quote("#else")
cpp_quote("#define STRCONSTA(x,y)    EXTERN_C const char x[]")
cpp_quote("#define STRCONSTW(x,y)    EXTERN_C const WCHAR x[]")
cpp_quote("#endif // DEFINE_STRCONST")
cpp_quote("#endif // STRCONSTA")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// rfc822 Headers")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_HDR_FROM,              \"From\");")
cpp_quote("STRCONSTA(STR_HDR_TO,                \"To\");")
cpp_quote("STRCONSTA(STR_HDR_CC,                \"Cc\");")
cpp_quote("STRCONSTA(STR_HDR_BCC,               \"Bcc\");")
cpp_quote("STRCONSTA(STR_HDR_SENDER,            \"Sender\");")
cpp_quote("STRCONSTA(STR_HDR_REPLYTO,           \"Reply-To\");")
cpp_quote("STRCONSTA(STR_HDR_RETURNPATH,        \"Return-Path\");")
cpp_quote("STRCONSTA(STR_HDR_RR,                \"Rr\");")
cpp_quote("STRCONSTA(STR_HDR_RETRCPTTO,         \"Return-Receipt-To\");")
cpp_quote("STRCONSTA(STR_HDR_APPARTO,           \"Apparently-To\");")
cpp_quote("STRCONSTA(STR_HDR_DATE,              \"Date\");")
cpp_quote("STRCONSTA(STR_HDR_RECEIVED,          \"Received\");")
cpp_quote("STRCONSTA(STR_HDR_MESSAGEID,         \"Message-ID\");")
cpp_quote("STRCONSTA(STR_HDR_XMAILER,           \"X-Mailer\");")
cpp_quote("STRCONSTA(STR_HDR_ENCODING,          \"Encoding\");")
cpp_quote("STRCONSTA(STR_HDR_ENCRYPTED,         \"Encrypted\");")
cpp_quote("STRCONSTA(STR_HDR_COMMENT,           \"Comment\");")
cpp_quote("STRCONSTA(STR_HDR_SUBJECT,           \"Subject\");")
cpp_quote("STRCONSTA(STR_HDR_MIMEVER,           \"MIME-Version\");")
cpp_quote("STRCONSTA(STR_HDR_CNTTYPE,           \"Content-Type\");")
cpp_quote("STRCONSTA(STR_HDR_CNTXFER,           \"Content-Transfer-Encoding\");")
cpp_quote("STRCONSTA(STR_HDR_CNTID,             \"Content-ID\");")
cpp_quote("STRCONSTA(STR_HDR_CNTDESC,           \"Content-Description\");")
cpp_quote("STRCONSTA(STR_HDR_CNTDISP,           \"Content-Disposition\");")
cpp_quote("STRCONSTA(STR_HDR_CNTBASE,           \"Content-Base\");")
cpp_quote("STRCONSTA(STR_HDR_CNTLOC,            \"Content-Location\");")
cpp_quote("STRCONSTA(STR_HDR_NEWSGROUPS,        \"Newsgroups\");")
cpp_quote("STRCONSTA(STR_HDR_PATH,              \"Path\");")
cpp_quote("STRCONSTA(STR_HDR_FOLLOWUPTO,        \"Followup-To\");")
cpp_quote("STRCONSTA(STR_HDR_EXPIRES,           \"Expires\");")
cpp_quote("STRCONSTA(STR_HDR_REFS,              \"References\");")
cpp_quote("#if _WIN32_WINNT >= 0x0600")
cpp_quote("STRCONSTA(STR_HDR_INREPLYTO,         \"In-Reply-To\");")
cpp_quote("STRCONSTA(STR_HDR_CONTROL,           \"Control\");")
cpp_quote("#endif // _WIN32_WINNT >= 0x0600")
cpp_quote("STRCONSTA(STR_HDR_DISTRIB,           \"Distribution\");")
cpp_quote("STRCONSTA(STR_HDR_KEYWORDS,          \"Keywords\");")
cpp_quote("STRCONSTA(STR_HDR_SUMMARY,           \"Summary\");")
cpp_quote("STRCONSTA(STR_HDR_APPROVED,          \"Approved\");")
cpp_quote("STRCONSTA(STR_HDR_LINES,             \"Lines\");")
cpp_quote("STRCONSTA(STR_HDR_XREF,              \"Xref\");")
cpp_quote("STRCONSTA(STR_HDR_ORG,               \"Organization\");")
cpp_quote("STRCONSTA(STR_HDR_XNEWSRDR,          \"X-Newsreader\");")
cpp_quote("STRCONSTA(STR_HDR_XPRI,              \"X-Priority\");")
cpp_quote("STRCONSTA(STR_HDR_XMSPRI,            \"X-MSMail-Priority\");")
cpp_quote("STRCONSTA(STR_HDR_OFFSETS,           \"X-Offsets\");")
cpp_quote("STRCONSTA(STR_HDR_XUNSENT,           \"X-Unsent\");")
cpp_quote("STRCONSTA(STR_HDR_ARTICLEID,         \"X-ArticleId\");")
cpp_quote("STRCONSTA(STR_HDR_NEWSGROUP,         \"X-Newsgroup\");")
cpp_quote("STRCONSTA(STR_HDR_XVOICEMAIL,        \"X-VoiceMail\");")
cpp_quote("STRCONSTA(STR_HDR_XMSOESREC,         \"X-MSOESRec\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// rfc2646 Headers")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_HDR_XRFC2646,          \"X-RFC2646\");")
cpp_quote("STRCONSTA(STR_HDR_XRFC2646_FLOWED,   \"Format=Flowed\");")
cpp_quote("STRCONSTA(STR_HDR_XRFC2646_RESPONSE, \"Response\");")
cpp_quote("STRCONSTA(STR_HDR_XRFC2646_NEW,      \"Original\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Communities Headers")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_HDR_POSTID,            \"X-MS-CommunityGroup-PostID\");")
cpp_quote("STRCONSTA(STR_HDR_MESSAGECATEGORY,   \"X-MS-CommunityGroup-MessageCategory\");")
cpp_quote("STRCONSTA(STR_HDR_THREADID,          \"X-MS-CommunityGroup-ThreadID\");")
cpp_quote("STRCONSTA(STR_HDR_PARENTID,          \"X-MS-CommunityGroup-ParentID\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Parameters Available through IMimePropertySet/IMimeBody")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_PAR_CHARSET,           \"par:content-type:charset\");")
cpp_quote("STRCONSTA(STR_PAR_NUMBER,            \"par:content-type:number\");")
cpp_quote("STRCONSTA(STR_PAR_TOTAL,             \"par:content-type:total\");")
cpp_quote("STRCONSTA(STR_PAR_ID,                \"par:content-type:id\");")
cpp_quote("STRCONSTA(STR_PAR_BOUNDARY,          \"par:content-type:boundary\");")
cpp_quote("STRCONSTA(STR_PAR_NAME,              \"par:content-type:name\");")
cpp_quote("STRCONSTA(STR_PAR_PROTOCOL,          \"par:content-type:protocol\");")
cpp_quote("STRCONSTA(STR_PAR_MICALG,            \"par:content-type:micalg\");")
cpp_quote("STRCONSTA(STR_PAR_FILENAME,          \"par:content-disposition:filename\");")
cpp_quote("STRCONSTA(STR_PAR_TYPE,              \"par:content-type:type\");")
cpp_quote("STRCONSTA(STR_PAR_START,             \"par:content-type:start\");")
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("STRCONSTA(STR_PAR_ACCESSTYPE,        \"par:content-type:access-type\");")
cpp_quote("STRCONSTA(STR_PAR_XURL,              \"par:content-type:X-URL\");")
cpp_quote("STRCONSTA(STR_PAR_SIZE,              \"par:content-type:size\");")
cpp_quote("STRCONSTA(STR_PAR_SMIMETYPE,         \"par:content-type:smime-type\");")
cpp_quote("STRCONSTA(STR_PAR_REPORTTYPE,        \"par:Content-Type:report-type\");")
cpp_quote("STRCONSTA(STR_PAR_FORMAT,            \"par:Content-Type:format\");")
cpp_quote("STRCONSTA(STR_PAR_REPLYTYPE,         \"par:Content-Type:reply-type\");")
cpp_quote("#endif // _WIN32_OE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Attributes Available through IMimePropertySet/IMimeBody")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_ATT_FILENAME,          \"att:filename\");")
cpp_quote("STRCONSTA(STR_ATT_GENFNAME,          \"att:generated-filename\");")
cpp_quote("STRCONSTA(STR_ATT_PRITYPE,           \"att:pri-content-type\");")
cpp_quote("STRCONSTA(STR_ATT_SUBTYPE,           \"att:sub-content-type\");")
cpp_quote("STRCONSTA(STR_ATT_NORMSUBJ,          \"att:normalized-subject\");")
cpp_quote("STRCONSTA(STR_ATT_ILLEGAL,           \"att:illegal-lines\");")
cpp_quote("STRCONSTA(STR_ATT_RENDERED,          \"att:rendered\"); // VT_UI4 - TRUE or FALSE")
cpp_quote("STRCONSTA(STR_ATT_AUTOINLINED,       \"att:auto-inlined\"); // VT_UI4 - TRUE or FALSE")
cpp_quote("STRCONSTA(STR_ATT_SENTTIME,          \"att:sent-time\");")
cpp_quote("STRCONSTA(STR_ATT_RECVTIME,          \"att:received-time\");")
cpp_quote("STRCONSTA(STR_ATT_PRIORITY,          \"att:priority\");")
cpp_quote("STRCONSTA(STR_ATT_SERVER,            \"att:athena-server\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_FORMAT,            \"att:format\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_ACCOUNTNAME,       \"att:athena-account-name\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_UIDL,              \"att:athena-pop3-uidl\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_STOREMSGID,        \"att:athena-store-msgid\"); // VT_UI4")
cpp_quote("STRCONSTA(STR_ATT_USERNAME,          \"att:athena-user-name\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_FORWARDTO,         \"att:athena-forward-to\"); // VT_LPSTR")
cpp_quote("STRCONSTA(STR_ATT_STOREFOLDERID,     \"att:athena-store-fdrid\"); // VT_UI4")
cpp_quote("STRCONSTA(STR_ATT_GHOSTED,           \"att:athena-ghosted\"); // VT_I4")
cpp_quote("STRCONSTA(STR_ATT_UNCACHEDSIZE,      \"att:athena-uncachedsize\"); // VT_UI4")
cpp_quote("STRCONSTA(STR_ATT_COMBINED,          \"att:athena-combined\"); // VT_UI4")
cpp_quote("STRCONSTA(STR_ATT_ACCOUNTID,         \"att:athena-account-id\"); // VT_LPSTR")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Content Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_MIME_TEXT_PLAIN,       \"text/plain\");")
cpp_quote("STRCONSTA(STR_MIME_TEXT_HTML,        \"text/html\");")
cpp_quote("STRCONSTA(STR_MIME_APPL_STREAM,      \"application/octet-stream\");")
cpp_quote("STRCONSTA(STR_MIME_MPART_MIXED,      \"multipart/mixed\");")
cpp_quote("STRCONSTA(STR_MIME_MPART_ALT,        \"multipart/alternative\");")
cpp_quote("STRCONSTA(STR_MIME_MPART_RELATED,    \"multipart/related\");")
cpp_quote("STRCONSTA(STR_MIME_MSG_PART,         \"message/partial\");")
cpp_quote("STRCONSTA(STR_MIME_MSG_RFC822,       \"message/rfc822\");")
cpp_quote("STRCONSTA(STR_MIME_APPLY_MSTNEF,     \"application/ms-tnef\");")
cpp_quote("STRCONSTA(STR_MIME_APPL_PKCS7SIG,    \"application/x-pkcs7-signature\");")
cpp_quote("STRCONSTA(STR_MIME_APPL_PKCS7SIG_1,  \"application/pkcs7-signature\");")
cpp_quote("STRCONSTA(STR_MIME_TEXT_ENRCICHED,   \"text/enriched\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Primary Content Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_CNT_TEXT,                \"text\");")
cpp_quote("STRCONSTA(STR_CNT_MULTIPART,            \"multipart\");")
cpp_quote("STRCONSTA(STR_CNT_MESSAGE,            \"message\");")
cpp_quote("STRCONSTA(STR_CNT_IMAGE,                \"image\");")
cpp_quote("STRCONSTA(STR_CNT_AUDIO,                \"audio\");")
cpp_quote("STRCONSTA(STR_CNT_VIDEO,                \"video\");")
cpp_quote("STRCONSTA(STR_CNT_APPLICATION,        \"application\");")
cpp_quote("STRCONSTW(STR_CNT_APPLICATIONW,      \"application\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Secondary Content Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_SUB_PLAIN,             \"plain\");")
cpp_quote("STRCONSTA(STR_SUB_HTML,              \"html\");")
cpp_quote("STRCONSTA(STR_SUB_ENRICHED,          \"enriched\");")
cpp_quote("STRCONSTA(STR_SUB_RTF,               \"ms-rtf\");")
cpp_quote("STRCONSTA(STR_SUB_MIXED,             \"mixed\");")
cpp_quote("STRCONSTA(STR_SUB_PARALLEL,          \"parallel\");")
cpp_quote("STRCONSTA(STR_SUB_DIGEST,            \"digest\");")
cpp_quote("STRCONSTA(STR_SUB_RELATED,           \"related\");")
cpp_quote("STRCONSTA(STR_SUB_ALTERNATIVE,       \"alternative\");")
cpp_quote("STRCONSTA(STR_SUB_RFC822,            \"rfc822\");")
cpp_quote("STRCONSTA(STR_SUB_PARTIAL,           \"partial\");")
cpp_quote("STRCONSTA(STR_SUB_EXTERNAL,          \"external-body\");")
cpp_quote("STRCONSTA(STR_SUB_OCTETSTREAM,       \"octet-stream\");")
cpp_quote("STRCONSTW(STR_SUB_OCTETSTREAMW,      \"octet-stream\");")
cpp_quote("STRCONSTA(STR_SUB_POSTSCRIPT,        \"postscript\");")
cpp_quote("STRCONSTA(STR_SUB_GIF,               \"gif\");")
cpp_quote("STRCONSTA(STR_SUB_JPEG,              \"jpeg\");")
cpp_quote("STRCONSTA(STR_SUB_BASIC,             \"basic\");")
cpp_quote("STRCONSTA(STR_SUB_MPEG,              \"mpeg\");")
cpp_quote("STRCONSTA(STR_SUB_MSTNEF,            \"ms-tnef\");")
cpp_quote("STRCONSTA(STR_SUB_MSWORD,            \"msword\");")
cpp_quote("STRCONSTA(STR_SUB_WAV,               \"wav\");")
cpp_quote("STRCONSTA(STR_SUB_PKCS7MIME,         \"pkcs7-mime\"); // non-standard")
cpp_quote("STRCONSTA(STR_SUB_PKCS7SIG,          \"pkcs7-signature\"); // non-standard")
cpp_quote("STRCONSTA(STR_SUB_XPKCS7MIME,        \"x-pkcs7-mime\");")
cpp_quote("STRCONSTA(STR_SUB_XPKCS7SIG,         \"x-pkcs7-signature\");")
cpp_quote("STRCONSTA(STR_SUB_SIGNED,            \"signed\");")
cpp_quote("STRCONSTA(STR_SUB_BINHEX,            \"mac-binhex40\");")
cpp_quote("STRCONSTA(STR_SUB_VCARD,             \"x-vcard\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Content-Transfer-Encoding Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_ENC_7BIT,              \"7bit\");")
cpp_quote("STRCONSTA(STR_ENC_QP,                \"quoted-printable\");")
cpp_quote("STRCONSTA(STR_ENC_BASE64,            \"base64\");")
cpp_quote("STRCONSTA(STR_ENC_8BIT,              \"8bit\");")
cpp_quote("STRCONSTA(STR_ENC_BINARY,            \"binary\");")
cpp_quote("STRCONSTA(STR_ENC_UUENCODE,          \"uuencode\");")
cpp_quote("STRCONSTA(STR_ENC_XUUENCODE,         \"x-uuencode\");")
cpp_quote("STRCONSTA(STR_ENC_XUUE,              \"x-uue\");")
cpp_quote("STRCONSTA(STR_ENC_BINHEX40,          \"mac-binhex40\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Content-Type Format and ReplyType Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_FORMAT_FLOWED,         \"flowed\");")
cpp_quote("STRCONSTA(STR_REPLYTYPE_ORIGINAL,    \"original\");")
cpp_quote("STRCONSTA(STR_REPLYTYPE_RESPONSE,    \"response\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Content-Disposition Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_DIS_INLINE,            \"inline\");")
cpp_quote("STRCONSTA(STR_DIS_ATTACHMENT,        \"attachment\");")
cpp_quote("STRCONSTW(STR_DIS_ATTACHMENTW,       \"attachment\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MIME Protocol Types")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_PRO_SHA1,              \"sha1\");")
cpp_quote("STRCONSTA(STR_PRO_MD5,               \"rsa-md5\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Known Priority Strings")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_PRI_MS_HIGH,           \"High\");")
cpp_quote("STRCONSTA(STR_PRI_MS_NORMAL,         \"Normal\");")
cpp_quote("STRCONSTA(STR_PRI_MS_LOW,            \"Low\");")
cpp_quote("STRCONSTA(STR_PRI_HIGH,              \"1\");")
cpp_quote("STRCONSTA(STR_PRI_NORMAL,            \"3\");")
cpp_quote("STRCONSTA(STR_PRI_LOW,               \"5\");")
cpp_quote("STRCONSTA(STR_HDR_ORIG_RECIPIENT,    \"Original-Recipient\");")
cpp_quote("STRCONSTA(STR_HDR_DISP_NOTIFICATION_TO, \"Disposition-Notification-To\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// IMimeMessage IDataObject clipboard formats (also include CF_TEXT)")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_CF_HTML,               \"HTML Format\");")
cpp_quote("STRCONSTA(STR_CF_INETMSG,            \"Internet Message (rfc822/rfc1522)\");")
cpp_quote("STRCONSTA(STR_CF_RFC822,             \"message/rfc822\");")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// SMime-Type strings")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("STRCONSTA(STR_SMT_SIGNEDDATA,        \"signed-data\"); ")
cpp_quote("STRCONSTA(STR_SMT_ENVELOPEDDATA,     \"enveloped-data\"); ")
cpp_quote("STRCONSTA(STR_SMT_SIGNEDRECEIPT,     \"signed-receipt\"); ")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// PIDSTRING - Use in GetProp, SetProp, QueryProp, DeleteProp")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define PID_BASE                     2")
cpp_quote("#define PIDTOSTR(_dwPropId)          ((LPCSTR)((DWORD_PTR)(_dwPropId)))")
cpp_quote("#define STRTOPID(_pszName)           ((DWORD)((DWORD_PTR)((LPCSTR)(_pszName))))")
cpp_quote("#define ISPIDSTR(_pszName)           ((HIWORD((DWORD_PTR)(_pszName)) == 0))")
cpp_quote("#define ISKNOWNPID(_dwPropId)        (_dwPropId >= PID_BASE && _dwPropId < PID_LAST)")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Mime Property Ids")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("typedef enum tagMIMEPROPID {")
cpp_quote("    PID_HDR_NEWSGROUP       = 2,")
cpp_quote("    PID_HDR_NEWSGROUPS      = 3,")
cpp_quote("    PID_HDR_REFS            = 4,")
cpp_quote("    PID_HDR_SUBJECT         = 5,")
cpp_quote("    PID_HDR_FROM            = 6,")
cpp_quote("    PID_HDR_MESSAGEID       = 7,")
cpp_quote("    PID_HDR_RETURNPATH      = 8,")
cpp_quote("    PID_HDR_RR              = 9,")
cpp_quote("    PID_HDR_RETRCPTTO       = 10,")
cpp_quote("    PID_HDR_APPARTO         = 11,")
cpp_quote("    PID_HDR_DATE            = 12,")
cpp_quote("    PID_HDR_RECEIVED        = 13,")
cpp_quote("    PID_HDR_REPLYTO         = 14,")
cpp_quote("    PID_HDR_XMAILER         = 15,")
cpp_quote("    PID_HDR_BCC             = 16,")
cpp_quote("    PID_HDR_MIMEVER         = 17,")
cpp_quote("    PID_HDR_CNTTYPE         = 18,")
cpp_quote("    PID_HDR_CNTXFER         = 19,")
cpp_quote("    PID_HDR_CNTID           = 20,")
cpp_quote("    PID_HDR_CNTDESC         = 21,")
cpp_quote("    PID_HDR_CNTDISP         = 22,")
cpp_quote("    PID_HDR_CNTBASE         = 23,")
cpp_quote("    PID_HDR_CNTLOC          = 24,")
cpp_quote("    PID_HDR_TO              = 25,")
cpp_quote("    PID_HDR_PATH            = 26,")
cpp_quote("    PID_HDR_FOLLOWUPTO      = 27,")
cpp_quote("    PID_HDR_EXPIRES         = 28,")
cpp_quote("    PID_HDR_CC              = 29,")
cpp_quote("    PID_HDR_CONTROL         = 30,")
cpp_quote("    PID_HDR_DISTRIB         = 31,")
cpp_quote("    PID_HDR_KEYWORDS        = 32,")
cpp_quote("    PID_HDR_SUMMARY         = 33,")
cpp_quote("    PID_HDR_APPROVED        = 34,")
cpp_quote("    PID_HDR_LINES           = 35,")
cpp_quote("    PID_HDR_XREF            = 36,")
cpp_quote("    PID_HDR_ORG             = 37,")
cpp_quote("    PID_HDR_XNEWSRDR        = 38,")
cpp_quote("    PID_HDR_XPRI            = 39,")
cpp_quote("    PID_HDR_XMSPRI          = 40,")
cpp_quote("    PID_PAR_FILENAME        = 41,")
cpp_quote("    PID_PAR_BOUNDARY        = 42,")
cpp_quote("    PID_PAR_CHARSET         = 43,")
cpp_quote("    PID_PAR_NAME            = 44,")
cpp_quote("    PID_ATT_FILENAME        = 45,")
cpp_quote("    PID_ATT_GENFNAME        = 46,")
cpp_quote("    PID_ATT_PRITYPE         = 47,")
cpp_quote("    PID_ATT_SUBTYPE         = 48,")
cpp_quote("    PID_ATT_NORMSUBJ        = 49,")
cpp_quote("    PID_ATT_ILLEGAL         = 50,")
cpp_quote("    PID_ATT_RENDERED        = 51,")
cpp_quote("    PID_ATT_SENTTIME        = 52,")
cpp_quote("    PID_ATT_RECVTIME        = 53,")
cpp_quote("    PID_ATT_PRIORITY        = 54,")
cpp_quote("    PID_HDR_COMMENT         = 55,")
cpp_quote("    PID_HDR_ENCODING        = 56,")
cpp_quote("    PID_HDR_ENCRYPTED       = 57,")
cpp_quote("    PID_HDR_OFFSETS         = 58,")
cpp_quote("    PID_HDR_XUNSENT         = 59,")
cpp_quote("    PID_HDR_ARTICLEID       = 60,")
cpp_quote("    PID_HDR_SENDER          = 61,")
cpp_quote("    PID_ATT_SERVER          = 62,")
cpp_quote("    PID_ATT_ACCOUNTID       = 63,")
cpp_quote("    PID_ATT_UIDL            = 64,")
cpp_quote("    PID_ATT_STOREMSGID      = 65,")
cpp_quote("    PID_ATT_USERNAME        = 66,")
cpp_quote("    PID_ATT_FORWARDTO       = 67,")
cpp_quote("    PID_ATT_STOREFOLDERID   = 68,")
cpp_quote("    PID_ATT_GHOSTED         = 69,")
cpp_quote("    PID_ATT_UNCACHEDSIZE    = 70,")
cpp_quote("    PID_ATT_COMBINED        = 71,")
cpp_quote("    PID_ATT_AUTOINLINED     = 72,")
cpp_quote("    PID_HDR_DISP_NOTIFICATION_TO     = 73,")
cpp_quote("    PID_PAR_REPLYTYPE       = 74,")
cpp_quote("    PID_PAR_FORMAT          = 75,")
cpp_quote("    PID_ATT_FORMAT          = 76,")
cpp_quote("#if _WIN32_WINNT >= 0x0600")
cpp_quote("    PID_HDR_INREPLYTO       = 77,")
cpp_quote("    PID_ATT_ACCOUNTNAME     = 78,")
cpp_quote("    PID_LAST                = 79")
cpp_quote("#else")
cpp_quote("    PID_LAST                = 77")
cpp_quote("#endif  // _WIN32_WINNT >= 0x0600")
cpp_quote("} MIMEPROPID;")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Variant Typed Identifiers")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define TYPEDID_MASK                     ((ULONG)0x0000FFFF)")
cpp_quote("#define TYPEDID_TYPE(_typedid)            (VARTYPE)(((ULONG)(_typedid)) & TYPEDID_MASK)")
cpp_quote("#define TYPEDID_ID(_typedid)                (((ULONG)(_typedid))>>16)")
cpp_quote("#define TYPEDID(_vartype,_id)            ((((TYPEDID)(_id))<<16)|((ULONG)(_vartype)))")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Options Ids")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define OID_ALLOW_8BIT_HEADER            TYPEDID(VT_BOOL,    0x0001) // TRUE or FALSE")
cpp_quote("#define OID_CBMAX_HEADER_LINE            TYPEDID(VT_UI4,     0x0002) // Bytes")
cpp_quote("#define OID_SAVE_FORMAT                  TYPEDID(VT_UI4,     0x0003) // SAVE_RFC822 or SAVE_RFC1521 (mime)")
cpp_quote("#define OID_WRAP_BODY_TEXT               TYPEDID(VT_BOOL,    0x0004) // TRUE or FALSE")
cpp_quote("#define OID_CBMAX_BODY_LINE              TYPEDID(VT_UI4,     0x0005) // Bytes")
cpp_quote("#define OID_TRANSMIT_BODY_ENCODING       TYPEDID(VT_UI4,     0x0006) // ENCODINGTYPE")
cpp_quote("#define OID_TRANSMIT_TEXT_ENCODING       TYPEDID(VT_UI4,     0x0007) // ENCODINGTYPE, IMimeMessageTree")
cpp_quote("#define OID_GENERATE_MESSAGE_ID          TYPEDID(VT_BOOL,    0x0008) // TRUE or FALSE")
cpp_quote("#define OID_HIDE_TNEF_ATTACHMENTS        TYPEDID(VT_BOOL,    0X000E) // TRUE or FALSE")
cpp_quote("#define OID_CLEANUP_TREE_ON_SAVE         TYPEDID(VT_BOOL,    0X000F) // TRUE or FALSE")
cpp_quote("#define OID_BODY_REMOVE_NBSP             TYPEDID(VT_BOOL,    0x0014) // TRUE or FALSE")
cpp_quote("#define OID_DEFAULT_BODY_CHARSET         TYPEDID(VT_UI4,     0x0015) // HCHARSET")
cpp_quote("#define OID_DEFAULT_HEADER_CHARSET       TYPEDID(VT_UI4,     0x0016) // HCHARSET")
cpp_quote("#define OID_DBCS_ESCAPE_IS_8BIT          TYPEDID(VT_BOOL,    0x0017) // TRUE or FALSE")
cpp_quote("#define OID_SECURITY_TYPE                TYPEDID(VT_UI4,     0x0018)")
cpp_quote("#define OID_SECURITY_ALG_HASH            TYPEDID(VT_BLOB,    0x0019)")
cpp_quote("#define OID_SECURITY_ALG_BULK            TYPEDID(VT_BLOB,    0x0020)")
cpp_quote("#ifndef _WIN64")
cpp_quote("#define OID_SECURITY_CERT_SIGNING        TYPEDID(VT_UI4,     0x0021)")
cpp_quote("#define OID_SECURITY_CERT_DECRYPTION     TYPEDID(VT_UI4,     0x0022)")
cpp_quote("#define OID_SECURITY_RG_CERT_ENCRYPT     TYPEDID(VT_VECTOR | VT_UI4, 0x0023)")
cpp_quote("#define OID_SECURITY_HCERTSTORE          TYPEDID(VT_UI4,     0x0024)")
cpp_quote("#define OID_SECURITY_RG_CERT_BAG         TYPEDID(VT_VECTOR | VT_UI4, 0x0025)")
cpp_quote("#define OID_SECURITY_HCRYPTPROV          TYPEDID(VT_UI4,     0x0026)")
cpp_quote("#define OID_SECURITY_SEARCHSTORES        TYPEDID(VT_VECTOR | VT_UI4, 0x0027)")
cpp_quote("#define OID_SECURITY_RG_IASN             TYPEDID(VT_VECTOR | VT_UI4, 0x0028)")
cpp_quote("#else // _WIN64")
cpp_quote("#define OID_SECURITY_CERT_SIGNING_64     TYPEDID(VT_UI8,     0x0021)")
cpp_quote("#define OID_SECURITY_CERT_DECRYPTION_64  TYPEDID(VT_UI8,     0x0022)")
cpp_quote("#define OID_SECURITY_RG_CERT_ENCRYPT_64  TYPEDID(VT_VECTOR | VT_UI8, 0x0023)")
cpp_quote("#define OID_SECURITY_HCERTSTORE_64       TYPEDID(VT_UI8,     0x0024)")
cpp_quote("#define OID_SECURITY_RG_CERT_BAG_64      TYPEDID(VT_VECTOR | VT_UI8, 0x0025)")
cpp_quote("#define OID_SECURITY_HCRYPTPROV_64       TYPEDID(VT_UI8,     0x0026)")
cpp_quote("#define OID_SECURITY_SEARCHSTORES_64     TYPEDID(VT_VECTOR | VT_UI4, 0x0027)")
cpp_quote("#define OID_SECURITY_RG_IASN_64          TYPEDID(VT_VECTOR | VT_UI4, 0x0028)")
cpp_quote("#endif // _WIN64")
cpp_quote("#define OID_SECURITY_SYMCAPS             TYPEDID(VT_BLOB,    0x0029)")
cpp_quote("#define OID_SECURITY_AUTHATTR            TYPEDID(VT_BLOB,    0x002A)")
cpp_quote("#define OID_SECURITY_UNAUTHATTR          TYPEDID(VT_BLOB,    0x002B)")
cpp_quote("#define OID_SECURITY_SIGNTIME            TYPEDID(VT_FILETIME,0x002C)")
cpp_quote("#define OID_SECURITY_USER_VALIDITY       TYPEDID(VT_UI4,     0x002D)")
cpp_quote("#define OID_SECURITY_RO_MSG_VALIDITY     TYPEDID(VT_UI4,     0x002E) // read-only")
cpp_quote("#define OID_SECURITY_CRL                 TYPEDID(VT_BLOB,    0x002F)")
cpp_quote("#define OID_SECURITY_ENCODE_FLAGS        TYPEDID(VT_UI4,     0x0030)")
cpp_quote("#define OID_SECURITY_CERT_INCLUDED       TYPEDID(VT_BOOL,    0x0031) // read-only")
cpp_quote("#ifndef _WIN64")
cpp_quote("#define OID_SECURITY_HWND_OWNER          TYPEDID(VT_UI4,     0x0032)")
cpp_quote("#endif // _WIN64")
cpp_quote("#define OID_SECURITY_REQUESTED_CTE       TYPEDID(VT_I4,      0x0033)")
cpp_quote("#define OID_NO_DEFAULT_CNTTYPE           TYPEDID(VT_BOOL,    0x0034)")
cpp_quote("#define OID_XMIT_PLAIN_TEXT_ENCODING     TYPEDID(VT_UI4,     0x0035) // ENCODINGTYPE, IMimeMessageTree")
cpp_quote("#define OID_XMIT_HTML_TEXT_ENCODING      TYPEDID(VT_UI4,     0x0036) // ENCODINGTYPE, IMimeMessageTree")
cpp_quote("#define OID_HEADER_RELOAD_TYPE           TYPEDID(VT_UI4,     0x0037) // RELOADTYPE IMimeMessageTree or IMimeBody or IMimePropertySet")
cpp_quote("#define OID_CAN_INLINE_TEXT_BODIES       TYPEDID(VT_BOOL,    0x0038) // TRUE or FALSE")
cpp_quote("#define OID_SHOW_MACBINARY               TYPEDID(VT_BOOL,    0x0039) // TRUE or FALSE")
cpp_quote("#define OID_SAVEBODY_KEEPBOUNDARY        TYPEDID(VT_BOOL,    0x0040) // TRUE or FALSE")
// Version 5 Options
cpp_quote("#if (_WIN32_OE >= 0x0500)")
// Old OIDs with new multiple value extensions
cpp_quote("#define OID_SECURITY_ALG_HASH_RG         TYPEDID(VT_VECTOR | VT_VARIANT, 	0x0019)")
cpp_quote("#ifndef _WIN64")
cpp_quote("#define OID_SECURITY_CERT_SIGNING_RG     TYPEDID(VT_VECTOR | VT_UI4,     	0x0021)")
cpp_quote("#else")
cpp_quote("#define OID_SECURITY_CERT_SIGNING_RG_64  TYPEDID(VT_VECTOR | VT_UI8,         0x0021)")
cpp_quote("#endif //_WIN64")
cpp_quote("#define OID_SECURITY_SYMCAPS_RG          TYPEDID(VT_VECTOR | VT_VARIANT, 	0x0029)")
cpp_quote("#define OID_SECURITY_AUTHATTR_RG         TYPEDID(VT_VECTOR | VT_VARIANT, 	0x002A)")
cpp_quote("#define OID_SECURITY_UNAUTHATTR_RG       TYPEDID(VT_VECTOR | VT_VARIANT, 	0x002B)")
cpp_quote("#define OID_SECURITY_SIGNTIME_RG         TYPEDID(VT_VECTOR | VT_FILETIME,	0x002C)")
cpp_quote("#define OID_SECURITY_USER_VALIDITY_RG    TYPEDID(VT_VECTOR | VT_UI4,     	0x002D)")
cpp_quote("#define OID_SECURITY_RO_MSG_VALIDITY_RG  TYPEDID(VT_VECTOR | VT_UI4,     	0x002E) // read-only")
// New OIDs
cpp_quote("#define OID_SUPPORT_EXTERNAL_BODY        TYPEDID(VT_BOOL,    0x0041) // TRUE or FALSE")
cpp_quote("#define OID_LOAD_USE_BIND_FILE           TYPEDID(VT_BOOL,    0x0042) // TRUE or FALSE")
cpp_quote("#define OID_SECURITY_SIGNATURE_COUNT     TYPEDID(VT_UI4,    	0x0043) // Size of SECURITY LAYER arrays")
cpp_quote("#define OID_HANDSOFF_ONSAVE              TYPEDID(VT_BOOL,    0x0044) // TRUE or FALSE")
cpp_quote("#define OID_SECURITY_RECEIPT_RG          TYPEDID(VT_VECTOR | VT_VARIANT,    0x0045) // Receipt body")
cpp_quote("#define OID_NOSECURITY_ONSAVE            TYPEDID(VT_BOOL,    0x0046) // TRUE or FALSE")
cpp_quote("#define OID_DECODE_RFC1154               TYPEDID(VT_BOOL,    0x0047) // TRUE or FALSE")
cpp_quote("#define OID_SECURITY_MESSAGE_HASH_RG     TYPEDID(VT_VECTOR | VT_VARIANT,    0x004A) // Message Hash")
cpp_quote("#define OID_SECURITY_KEY_PROMPT          TYPEDID(VT_LPWSTR,  0x004B) // Key Prompt")
cpp_quote("#ifndef _WIN64")
cpp_quote("#define OID_SECURITY_ENCRYPT_CERT_BAG    TYPEDID(VT_UI4, 0x004C) // HCERTSTORE")
cpp_quote("#else //_WIN64")
cpp_quote("#define OID_SECURITY_ENCRYPT_CERT_BAG_64 TYPEDID(VT_UI8, 0x004C) // HCERTSTORE")
cpp_quote("#endif // WIN64")
cpp_quote("#endif // _WIN32_OE")
// Version 5.01 Options
// cpp_quote("#if (_WIN32_OE >= 0x0501)")
cpp_quote("#ifdef _WIN64")
cpp_quote("#define OID_SECURITY_HWND_OWNER_64         TYPEDID(VT_UI8,   0x0057)")
cpp_quote("#endif // WIN64")
// 2Key implementation
cpp_quote("#ifndef _WIN64")
cpp_quote("#define OID_SECURITY_2KEY_CERT_BAG        TYPEDID(VT_VECTOR | VT_UI4, 0x0059)")
cpp_quote("#else //_WIN64")
cpp_quote("#define OID_SECURITY_2KEY_CERT_BAG_64    TYPEDID(VT_VECTOR | VT_UI8, 0x0059)")
cpp_quote("#endif // WIN64")

cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Default Option Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define DEF_ALLOW_8BIT_HEADER            FALSE")
cpp_quote("#define DEF_CBMAX_HEADER_LINE            1000")
cpp_quote("#define DEF_SAVE_FORMAT                  SAVE_RFC1521")
cpp_quote("#define DEF_WRAP_BODY_TEXT               TRUE")
cpp_quote("#define DEF_CBMAX_BODY_LINE              74")
cpp_quote("#define DEF_GENERATE_MESSAGE_ID          FALSE")
cpp_quote("#define DEF_HASH_ALG_ID                  0x8004  //SHA //N needed?")
cpp_quote("#define DEF_ENCRYPTION_ALG_ID            0x6602  //RC2 //N needed?")
cpp_quote("#define DEF_INCLUDE_SENDER_CERT          FALSE")
cpp_quote("#define DEF_HIDE_TNEF_ATTACHMENTS        TRUE")
cpp_quote("#define DEF_CLEANUP_TREE_ON_SAVE         TRUE")
cpp_quote("#define DEF_BODY_REMOVE_NBSP             TRUE")
cpp_quote("#define DEF_SECURITY_IGNOREMASK          0")
cpp_quote("#define DEF_DBCS_ESCAPE_IS_8BIT          FALSE")
cpp_quote("#define DEF_TRANSMIT_BODY_ENCODING       IET_UNKNOWN")
cpp_quote("#define DEF_TRANSMIT_TEXT_ENCODING       IET_UNKNOWN")
cpp_quote("#define DEF_XMIT_PLAIN_TEXT_ENCODING     IET_UNKNOWN")
cpp_quote("#define DEF_XMIT_HTML_TEXT_ENCODING      IET_UNKNOWN")
cpp_quote("#define DEF_NO_DEFAULT_CNTTYPE           FALSE")
cpp_quote("#define DEF_HEADER_RELOAD_TYPE_TREE      RELOAD_HEADER_RESET")
cpp_quote("#define DEF_HEADER_RELOAD_TYPE_PROPSET   RELOAD_HEADER_NONE")
cpp_quote("#define DEF_CAN_INLINE_TEXT_BODIES       FALSE")
cpp_quote("#define DEF_SHOW_MACBINARY               FALSE")
cpp_quote("#define DEF_SAVEBODY_KEEPBOUNDARY        FALSE")
// Version 5 Options
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("#define DEF_SUPPORT_EXTERNAL_BODY        FALSE")
cpp_quote("#define DEF_LOAD_USE_BIND_FILE           FALSE")
cpp_quote("#define DEF_HANDSOFF_ONSAVE              FALSE")
cpp_quote("#define DEF_DECODE_RFC1154               FALSE")
cpp_quote("#endif // _WIN32_OE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Min-Max Option Values")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MAX_CBMAX_HEADER_LINE            0xffffffff")
cpp_quote("#define MIN_CBMAX_HEADER_LINE            76")
cpp_quote("#define MAX_CBMAX_BODY_LINE              0xffffffff")
cpp_quote("#define MIN_CBMAX_BODY_LINE              30")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// LIBID_MIMEOLE")
cpp_quote("// --------------------------------------------------------------------------------")
[
    uuid(E4B28371-83B0-11d0-8259-00C04FD85AB4),
    helpstring("Microsoft MIMEOLE Type Library 1.0"),
    version(1.0)
]

library MIMEOLE
{
    importlib("stdole2.tlb");

#ifndef DECLARE_HANDLE
    #define DECLARE_HANDLE(name) \
        struct name##__ { DWORD unused; }; \
        typedef struct name##__ _far* name
#endif // DECLARE_HANDLE

    DECLARE_HANDLE(HCHARSET);
    typedef HCHARSET *LPHCHARSET;
    DECLARE_HANDLE(HBODY);
    typedef HBODY *LPHBODY;
    DECLARE_HANDLE(HHEADERROW);
    typedef HHEADERROW *LPHHEADERROW;

    typedef DWORD TYPEDID;

    typedef const PROPVARIANT *LPCPROPVARIANT;
    typedef const BLOB *LPCBLOB;

    typedef enum tagRELOADTYPE {
        RELOAD_HEADER_NONE,
        RELOAD_HEADER_RESET,
        RELOAD_HEADER_APPEND,
        RELOAD_HEADER_REPLACE
    } RELOADTYPE;

    typedef enum tagMIMESAVETYPE {
        SAVE_RFC822,        // Non-mime - UUENCODE
        SAVE_RFC1521        // MIME
    } MIMESAVETYPE;

    typedef enum tagCSETAPPLYTYPE {
        CSET_APPLY_UNTAGGED,        // Apply the hCharset to all un-tagged properties or use as default on send
        CSET_APPLY_ALL,             // Apply the hCharset to all properties, including tagged properties
        CSET_APPLY_TAG_ALL          // Apply the hCharset to all properties, including tagged properties, and mark things as tagged (IBT_CSETTAGGED)
    } CSETAPPLYTYPE;

    // -----------------------------------------------------------------------------------
    // ENCODINGTYPE     | Internet Charset  | Internet Encoding | Transmittable
    // -----------------------------------------------------------------------------------
    // IET_BINARY       | No                | No                | No
    // IET_BASE64       | Yes               | Yes               | Yes
    // IET_UUENCODE     | Yes               | Yes               | Yes
    // IET_QP           | Yes               | Yes               | Yes
    // IET_7BIT         | Yes               | No (Dot Stuffed)  | Yes
    // IET_8BIT         | Yes               | No (Dot Stuffed)  | Yes
    // -----------------------------------------------------------------------------------
    typedef enum tagENCODINGTYPE {
        // -1 is reserved for an IMimeSecurity default
        IET_BINARY,     // decoded (mime, uu, or stripped lead-dots)/windows charset
        IET_BASE64,     // Base64 encoded/internet charset
        IET_UUENCODE,   // Uu encoded/internet charset
        IET_QP,         // Quoted-Printable encoded/internet charset
        IET_7BIT,       // non-encoded (lead-dots stuffed)/internet charset 7bit data
        IET_8BIT,       // non-encoded (lead-dots stuffed)/internet charset 8bit data
        IET_INETCSET,   // Decoded, but in an Internet Character Set
        IET_UNICODE,    // Decoded in unicode
        IET_RFC1522,    // Header Encoding
        IET_ENCODED,    // Used mostly for header properties (combines IET_INETCSET and IET_RFC1522)
        IET_CURRENT,    // Use the current encoding of the body
        IET_UNKNOWN,    // The encoding is unknown, can be treated as binary...
        IET_BINHEX40,   // Apple Macintosh Binhex
        IET_LAST        // Don't use
    } ENCODINGTYPE;

    // IET_DECODED means the same as IET_BINARY
    const SHORT IET_DECODED = IET_BINARY;

    // ---------------------------------------------------------------------------------------
    // String Constants
    // ---------------------------------------------------------------------------------------
    const SHORT CCHMAX_HEADER_LINE = 1000;

    // ---------------------------------------------------------------------------------------
    // IID_IMimeInternational
    // ---------------------------------------------------------------------------------------
    [
        uuid(C5588349-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeInternational"),
    ]
    interface IMimeInternational : IUnknown
    {
        typedef [unique] IMimeInternational *LPMIMEINTERNATIONAL;

        typedef DWORD CODEPAGEID;

        const CODEPAGEID CP_USASCII      = 1252;
        const CODEPAGEID CP_UNICODE      = 1200;
        const CODEPAGEID CP_JAUTODETECT  = 50932;   // Japan auto detect
        const CODEPAGEID CP_KAUTODETECT  = 50949;   // Korean auto detect
        const CODEPAGEID CP_ISO2022JPESC = 50221;   // codepage for ISO-2022-JP-ESC
        const CODEPAGEID CP_ISO2022JPSIO = 50222;   // codepage for ISO-2022-JP-SIO

        const SHORT CCHMAX_CSET_NAME = 128;
        const SHORT CCHMAX_LANG_NAME = 128;
        const SHORT CCHMAX_FACE_NAME = 128;

        typedef struct tagINETCSETINFO {
            CHAR            szName[CCHMAX_CSET_NAME];       // Character Set name
            HCHARSET        hCharset;                       // Handle to this character set
            CODEPAGEID      cpiWindows;                     // Windows CodePage
            CODEPAGEID      cpiInternet;                    // Internet Code Page
            DWORD           dwReserved1;                    // Reserved, don't use
        } INETCSETINFO, *LPINETCSETINFO;

        typedef enum tagINETLANGMASK {
            ILM_FAMILY       = 0x00000001,                   // CODEPAGEINFO::dwFamily is valid
            ILM_NAME         = 0x00000002,                   // CODEPAGEINFO::szName is valid
            ILM_BODYCSET     = 0x00000004,                   // CODEPAGEINFO::szBodyCset is valid
            ILM_HEADERCSET   = 0x00000008,                   // CODEPAGEINFO::szHeadCset is valid
            ILM_WEBCSET      = 0x00000010,                   // CODEPAGEINFO::szWebCset is valid
            ILM_FIXEDFONT    = 0x00000020,                   // CODEPAGEINFO::szFixedFont is valid
            ILM_VARIABLEFONT = 0x00000040                    // CODEPAGEINFO::szVariableFont is valid
        } INETLANGMASK;

        typedef struct tagCODEPAGEINFO {
            DWORD           dwMask;                          // Describes which fields are valid (INETLANGMASK)
            CODEPAGEID      cpiCodePage;                     // Handle to this charset (code page number / mlangid)
            BOOL            fIsValidCodePage;                // Value of IsValidCodePage(idCodePage)
            ULONG           ulMaxCharSize;                   // Maximum width of a character in this codepage
            BOOL            fInternetCP;                     // Is this an Internet Code Page
            CODEPAGEID      cpiFamily;                       // Windows Code page if fInternetCP == TRUE
            CHAR            szName[CCHMAX_LANG_NAME];        // Language Name
            CHAR            szBodyCset[CCHMAX_CSET_NAME];    // Charset to be used for the body
            CHAR            szHeaderCset[CCHMAX_CSET_NAME];  // Charset to be used for the Header
            CHAR            szWebCset[CCHMAX_CSET_NAME];     // Charset to be used for the body
            CHAR            szFixedFont[CCHMAX_FACE_NAME];   // Fixed Width Font Face Name
            CHAR            szVariableFont[CCHMAX_FACE_NAME];// Variable Width Font Face Name
            ENCODINGTYPE    ietNewsDefault;                  // Default news mime encoding (FMT_BASE64 or FMT_QP)
            ENCODINGTYPE    ietMailDefault;                  // Default mail mime encoding (FMT_BASE64 or FMT_QP)
            DWORD           dwReserved1;                     // Reserved, don't use
        } CODEPAGEINFO, *LPCODEPAGEINFO;

        typedef struct tagRFC1522INFO {
            BOOL            fRfc1522Allowed;                 // Can rfc 1522 be used to encode/decode the header
            BOOL            fRfc1522Used;                    // Was rfc 1522 used to encode/decode the header
            BOOL            fAllow8bit;                      // Is 8bit allowed in the encoded header...
            HCHARSET        hRfc1522Cset;                    // The charset used in the rfc1522 encoded (DecodeHeader only)
        } RFC1522INFO, *LPRFC1522INFO;

        typedef enum tagCHARSETTYPE {
            CHARSET_BODY,                                    // Corresponds to CODEPAGEINFO::szBodyCset
            CHARSET_HEADER,                                  // Corresponds to CODEPAGEINFO::szHeaderCset
            CHARSET_WEB                                      // Corresponds to CODEPAGEINFO::szWebCset
        } CHARSETTYPE;

        HRESULT SetDefaultCharset(
                [in]        HCHARSET                hCharset);

        HRESULT GetDefaultCharset(
                [out]       LPHCHARSET              phCharset);

        HRESULT GetCodePageCharset(
                [in]        CODEPAGEID              cpiCodePage,
                [in]        CHARSETTYPE             ctCsetType,
                [out]       LPHCHARSET              phCharset);

        HRESULT FindCharset(
                [in]        LPCSTR                  pszCharset,
                [out]       LPHCHARSET              phCharset);

        HRESULT GetCharsetInfo(
                [in]        HCHARSET                hCharset,
                [in,out]    LPINETCSETINFO          pCsetInfo);

        HRESULT GetCodePageInfo(
                [in]        CODEPAGEID              cpiCodePage,
                [in,out]    LPCODEPAGEINFO          pCodePageInfo);

        HRESULT CanConvertCodePages(
                [in]        CODEPAGEID              cpiSource,
                [in]        CODEPAGEID              cpiDest);

        HRESULT DecodeHeader(
                [in]        HCHARSET                hCharset,
                [in]        LPCSTR                  pszData,
                [in,out]    LPPROPVARIANT           pDecoded,
                [in,out]    LPRFC1522INFO           pRfc1522Info);

        HRESULT EncodeHeader(
                [in]        HCHARSET                hCharset,
                [in]        LPPROPVARIANT           pData,
                [out]       LPSTR                   *ppszEncoded,
                [in,out]    LPRFC1522INFO           pRfc1522Info);

        HRESULT ConvertBuffer(
                [in]        CODEPAGEID              cpiSource,
                [in]        CODEPAGEID              cpiDest,
                [in]        LPBLOB                  pIn,
                [in,out]    LPBLOB                  pOut,
                [out]       ULONG                   *pcbRead);

        HRESULT ConvertString(
                [in]        CODEPAGEID              cpiSource,
                [in]        CODEPAGEID              cpiDest,
                [in]        LPPROPVARIANT           pIn,
                [in,out]    LPPROPVARIANT           pOut);

        HRESULT MLANG_ConvertInetReset(void);

        HRESULT MLANG_ConvertInetString(
                [in]        CODEPAGEID              cpiSource,
                [in]        CODEPAGEID              cpiDest,
                [in]        LPCSTR                  pSource,
                [in]        int                     *pnSizeOfSource,
                [in,out,unique] LPSTR               pDestination,
                [in]        int                     *pnDstSize);

        HRESULT Rfc1522Decode(
                [in]        LPCSTR                  pszValue,
                [in,ref]    LPSTR                   pszCharset,
                [in]        ULONG                   cchmax,
                [out]       LPSTR                   *ppszDecoded);

        HRESULT Rfc1522Encode(
                [in]        LPCSTR                  pszValue,
                [in]        HCHARSET                hCharset,
                [out]       LPSTR                   *ppszEncoded);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeSecurity
    // ---------------------------------------------------------------------------------------
    [
        uuid(C5588353-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeSecurity"),
    ]
    interface IMimeSecurity : IUnknown
    {
        typedef [unique] IMimeSecurity *LPMIMESECURITY;
        typedef [unique] const IMimeSecurity *LPCMIMESECURITY;

        typedef         BLOB THUMBBLOB;
        typedef         void *HCAPICERTSTORE;

        cpp_quote("#ifndef __WINCRYPT_H__")
        typedef const void *PCX509CERT;
        typedef void *HCERTSTORE;
        cpp_quote("#else")
        cpp_quote("typedef PCCERT_CONTEXT PCX509CERT;")
        cpp_quote("#endif // __WINCRYPT_H_")

        cpp_quote("#ifndef IMS_ALGIDDEF")
        cpp_quote("#define IMS_ALGIDDEF")
        typedef unsigned int ALG_ID;
        cpp_quote("#endif // IMS_ALGIDDEF")

        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("// ITT_* - thumbprint types")
        cpp_quote("// -------------------------------------------------------------------")
        typedef DWORD ITHUMBPRINTTYPE;
        cpp_quote("#define ITT_SIGNING      0x00000001")
        cpp_quote("#define ITT_ENCRYPTION   0x00000002")

        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("// SEF_* - Secure Encoding Flags")
        cpp_quote("// must not overlap the EBF flags")
        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("#define SEF_ENCRYPTWITHNOSENDERCERT      0x00000001")
        cpp_quote("#define SEF_SENDERSCERTPROVIDED          0x00000002")
        cpp_quote("#define SEF_NOUI                         0x00000004")
        cpp_quote("#define SEF_MASK                         0x0000ffff")

        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("// EBF_* - Enchanted Broccoli Forest, also Encode Body Flags")
        cpp_quote("// must not overlap the SEF flags")
        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("#define EBF_RECURSE                      0x00010000")
        cpp_quote("#define EBF_COMMITIFDIRTY                0x00020000")
        cpp_quote("#define EBF_MASK                         0xffff0000")

        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("// MSV_* - MIME Security Validity")
        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("#define MSV_OK                           0x00000000")
        cpp_quote("#define MSV_BADSIGNATURE                 0X00000001")
        cpp_quote("#define MSV_UNVERIFIABLE                 0X00000002")
        cpp_quote("#define MSV_UNKHASH                      0X00000004")
        cpp_quote("#define MSV_MALFORMEDSIG                 0X00000080")
        cpp_quote("#define MSV_SIGNATURE_MASK               0X000000ff")
        cpp_quote("#define MSV_EXPIRED_SIGNINGCERT          0X00000100")
        cpp_quote("#define MSV_SIGNING_MASK                 0X00000f00")
        cpp_quote("#define MSV_CANTDECRYPT                  0X00001000")
        cpp_quote("#define MSV_ENC_FOR_EXPIREDCERT          0X00002000")
        cpp_quote("#define MSV_ENCRYPT_MASK                 0x000ff000")
        cpp_quote("#define MSV_INVALID                      0X01000000")
        cpp_quote("#define MSV_MSG_MASK                     0x0f000000")

        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("// MST_* - MIME Security Type")
        cpp_quote("// -------------------------------------------------------------------")
        cpp_quote("#define MST_NONE                         0x00000000")
        cpp_quote("#define MST_THIS_SIGN                    0x00000001")
        cpp_quote("#define MST_THIS_ENCRYPT                 0x00000002")
        cpp_quote("#define MST_THIS_BLOBSIGN                0x00000005 // MST_BLOB_FLAG|MST_THIS_SIGN")
        cpp_quote("#define MST_CHILD_SIGN                   0x00000100")
        cpp_quote("#define MST_CHILD_ENCRYPT                0x00000200")
        cpp_quote("#define MST_SUBMSG_SIGN                  0x00001000")
        cpp_quote("#define MST_SUBMSG_ENCRYPT               0x00002000")
        cpp_quote("#define MST_THIS_MASK                    0x000000ff")
        cpp_quote("#define MST_CHILD_MASK                   0x00000f00")
        cpp_quote("#define MST_SUBMSG_MASK                  0x0000f000")
        cpp_quote("#define MST_DESCENDENT_MASK              0x0000ff00 //(MST_CHILD|MST_SUBMSG)")
        cpp_quote("#define MST_SIGN_MASK                    0x00001101")
        cpp_quote("#define MST_ENCRYPT_MASK                 0x00002202")
        cpp_quote("#define MST_BLOB_FLAG                    0x00000004")
        cpp_quote("#define MST_TYPE_MASK                    0x0000ffff")

        cpp_quote("#define MST_RECEIPT_REQUEST              0x00010000")
        cpp_quote("#define MST_SUPPRESS_UI                  0x00020000")

        cpp_quote("#define MST_CLASS_SMIME_V1               0x00000000")
        cpp_quote("#define MST_CLASS_PGP                    0x01000000")
        cpp_quote("#define MST_CLASS_MASK                   0xff000000")

        // -------------------------------------------------------------------
        // CERTSTATE
        // -------------------------------------------------------------------
        typedef enum tagCERTSTATE {
            CERTIFICATE_OK,                 // Only non-error state
            CERTIFICATE_NOT_PRESENT,
            CERTIFICATE_EXPIRED,            // Specific
            CERTIFICATE_CHAIN_TOO_LONG,     //   |
            CERTIFICATE_MISSING_ISSUER,     //   v
            CERTIFICATE_CRL_LISTED,         // General
            CERTIFICATE_NOT_TRUSTED,        // (Be as specific as possible)
            CERTIFICATE_INVALID,
            CERTIFICATE_ERROR,              // Last resort
            CERTIFICATE_NOPRINT,            // no thumbprint provided
            CERTIFICATE_UNKNOWN             // Default
        } CERTSTATE;

        // -------------------------------------------------------------------
        // CERTNAMETYPE:
        //  Equivalent of CAPI flags to CertNameToStr
        // -------------------------------------------------------------------
        typedef enum tagCERTNAMETYPE {
            SIMPLE,
            OID,
            X500
        } CERTNAMETYPE;

        // -------------------------------------------------------------------
        // CERTDATAID:
        //  used to identify request to GetCertData
        // -------------------------------------------------------------------
        typedef enum tagCERTDATAID {
            CDID_EMAIL,             // VT_LPSTR
            CDID_ALT_EMAIL,         // VT_LPSTR
            CDID_MAX
        } CERTDATAID;

        // -------------------------------------------------------------------
        // X509CERTRESULT:
        //
        //  cEntries- count of the two arrays
        //  rgcs    - array of results mapped to ops done on/with rgpCert
        //  rgpCert - array of certificates
        //
        // -------------------------------------------------------------------
        typedef struct tagX509CERTRESULT {
            DWORD           cEntries;
            CERTSTATE       *rgcs;
            PCX509CERT      *rgpCert;
        } X509CERTRESULT, *PX509CERTRESULT;
        typedef const X509CERTRESULT *PCX509CERTRESULT;


        HRESULT InitNew(void);

        HRESULT CheckInit(void);

        HRESULT EncodeMessage(
                [in]        IMimeMessageTree *const pTree,
                [in]        DWORD dwFlags);

        HRESULT EncodeBody(
                [in]        IMimeMessageTree *const pTree,
                [in]        HBODY hEncodeRoot,
                [in]        DWORD dwFlags);

        HRESULT DecodeMessage(
                [in]        IMimeMessageTree *const pTree,
                [in]        DWORD dwFlags);

        HRESULT DecodeBody(
                [in]        IMimeMessageTree *const pTree,
                [in]        HBODY hDecodeRoot,
                [in]        DWORD dwFlags);

        HRESULT EnumCertificates(
                [in]        HCAPICERTSTORE          hc,
                [in]        DWORD                   dwUsage,
                [in,unique] PCX509CERT              pPrev,
                [in,out,unique] PCX509CERT         *ppCert);

        HRESULT GetCertificateName(
                [in]        const PCX509CERT        pX509Cert,
                [in]        const CERTNAMETYPE      cn,
                [out]       LPSTR                  *ppszName);

        HRESULT GetMessageType(
                [in]        const HWND              hwndParent,
                [in]        IMimeBody *const        pBody,
                [out]       DWORD *const            pdwSecType);

        HRESULT GetCertData(
                [in]        const PCX509CERT        pX509Cert,
                [in]        const CERTDATAID        dataid,
                [out, ref]  LPPROPVARIANT           pValue);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeHeaderTable
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CD1-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeHeaderTable"),
    ]
    interface IMimeHeaderTable : IPersistStream
    {
        typedef struct tagFINDHEADER {
            LPCSTR          pszHeader;         // Header Name to find
            DWORD           dwReserved;        // Reserved, do use this
        } FINDHEADER, *LPFINDHEADER;

        typedef struct tagHEADERROWINFO {
            DWORD           dwRowNumber;       // Position of the row within the header (1 - x)
            ULONG           cboffStart;        // Index into pStream where Header Starts (From: xxxx)
            ULONG           cboffColon;        // Index into pStream of the Header Colon
            ULONG           cboffEnd;          // Index into pStream where the Header Ends
        } HEADERROWINFO, *LPHEADERROWINFO;

        typedef enum tagHEADERTABLEFLAGS {
            HTF_NAMEINDATA      = 0x00000001,  // The header name is inlcuded in the data
            HTF_ENUMHANDLESONLY = 0x00000002   // Enumerate Only Handles
        } HEADERTABLEFLAGS;

        HRESULT FindFirstRow(
                [in]        LPFINDHEADER            pFindHeader,
                [out]       LPHHEADERROW            phRow);

        HRESULT FindNextRow(
                [in]        LPFINDHEADER            pFindHeader,
                [out]       LPHHEADERROW            phRow);

        HRESULT CountRows(
                [in]        LPCSTR                  pszHeader,
                [out]       ULONG                   *pcRows);

        HRESULT AppendRow(
                [in]        LPCSTR                  pszHeader,
                [in]        DWORD                   dwFlags,
                [in]        LPCSTR                  pszData,
                [in]        ULONG                   cchData,
                [out]       LPHHEADERROW            phRow);

        HRESULT DeleteRow(
                [in]        HHEADERROW              hRow);

        HRESULT GetRowData(
                [in]        HHEADERROW              hRow,
                [in]        DWORD                   dwFlags,
                [out]       LPSTR                   *ppszData,
                [out]       ULONG                   *pcchData);

        HRESULT SetRowData(
                [in]        HHEADERROW              hRow,
                [in]        DWORD                   dwFlags,
                [in]        LPCSTR                  pszData,
                [in]        ULONG                   cchData);

        HRESULT GetRowInfo(
                [in]        HHEADERROW              hRow,
                [in,out]    LPHEADERROWINFO         pInfo);

        HRESULT SetRowNumber(
                [in]        HHEADERROW              hRow,
                [in]        DWORD                   dwRowNumber);

        HRESULT EnumRows(
                [in]        LPCSTR                  pszHeader,
                [in]        DWORD                   dwFlags,
                [out]       IMimeEnumHeaderRows     **ppEnum);

        HRESULT Clone(
                [out]       IMimeHeaderTable        **ppTable);

        HRESULT BindToObject(
                [in]        REFIID                  riid,
                [out, iid_is(riid)] void            **ppvObject);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimePropertySchema
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CEC-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimePropertySchema"),
    ]
    interface IMimePropertySchema : IUnknown
    {
        typedef [unique] IMimePropertySchema *LPMIMEPROPERTYSCHEMA;

        typedef enum tagMIMEPROPFLAGS {
            MPF_INETCSET        = 0x00000001,   // Property can be encoded in an internet character set
            MPF_RFC1522         = 0x00000002,   // Property can be encoded using rfc1522
            MPF_ADDRESS         = 0x00000004,   // Property is in the form of an rfc822 addr-path field
            MPF_HASPARAMS       = 0x00000008,   // Property contains parseable parameters (i.e. Content-Type)
            MPF_MIME            = 0x00000010,   // Property is a MIME specific header
            MPF_READONLY        = 0x00000020    // Property is read-only and can not be set or appended
        } MIMEPROPFLAGS;

        HRESULT RegisterProperty(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        DWORD                   dwRowNumber,
                [in]        VARTYPE                 vtDefault,
                [out]       LPDWORD                 pdwPropId);

        HRESULT ModifyProperty(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        DWORD                   dwRowNumber,
                [in]        VARTYPE                 vtDefault);

        HRESULT GetPropertyId(
                [in]        LPCSTR                  pszName,
                [out]       LPDWORD                 pdwPropId);

        HRESULT GetPropertyName(
                [in]        DWORD                   dwPropId,
                [out]       LPSTR                   *ppszName);

        HRESULT RegisterAddressType(
                [in]        LPCSTR                  pszName,
                [out]       LPDWORD                 pdwAdrType);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimePropertySet
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CD3-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimePropertySet"),
    ]
    interface IMimePropertySet : IPersistStreamInit
    {
        typedef [unique] IMimePropertySet *LPMIMEPROPERTYSET;

        cpp_quote("#define PDF_ENCODED              0x00000001")
        cpp_quote("#define PDF_NAMEINDATA           0x00000002")
        cpp_quote("#define PDF_HEADERFORMAT         (0x00000004 | PDF_ENCODED)")
        cpp_quote("#define PDF_NOCOMMENTS           0x00000008")
        cpp_quote("#define PDF_SAVENOENCODE         0x00000010")
        cpp_quote("#define PDF_VECTOR               0x00000020")

        typedef struct tagMIMEPARAMINFO {
            LPSTR           pszName;            // Parameter Name (i.e. charset)
            LPSTR           pszData;            // Paramater data
        } MIMEPARAMINFO, *LPMIMEPARAMINFO;

        typedef enum tagPROPINFOMASK {
            PIM_CHARSET         = 0x00000001,   // The MIMEPROPINFO::hCharset member is valid
            PIM_ENCODINGTYPE    = 0x00000002,   // The MIMEPROPINFO::ietEncoding member is valid
            PIM_ROWNUMBER       = 0x00000004,   // The MIMEPROPINFO::dwRowNumber member is valid
            PIM_FLAGS           = 0x00000008,   // The MIMEPROPINFO::dwFlags member is valid
            PIM_PROPID          = 0x00000010,   // The MIMEPROPINFO::dwPropId member is valid
            PIM_VALUES          = 0x00000020,   // The MIMEPROPINFO::cValues member is valid
            PIM_VTDEFAULT       = 0x00000040,   // The MIMEPROPINFO::vtDefault member is valid
            PIM_VTCURRENT       = 0x00000080    // The MIMEPROPINFO::vtCurrent member is valid
        } PROPINFOMASK;

        typedef struct tagMIMEPROPINFO {
            DWORD           dwMask;             // What members in this structure are valid
            HCHARSET        hCharset;           // Property Charset
            ENCODINGTYPE    ietEncoding;        // Encoded in an internet character set
            DWORD           dwRowNumber;        // Current header property row number
            DWORD           dwFlags;            // (GetPropInfo only) Property Flags (MIMEPROPFLAGS)
            DWORD           dwPropId;           // (GetPropInfo only) Property Id
            DWORD           cValues;            // (GetPropInfo only) Number of appended values (i.e. multi-line headers)
            VARTYPE         vtDefault;          // The Default Data Type for this property
            VARTYPE         vtCurrent;          // The Current Data Type for this property
        } MIMEPROPINFO, *LPMIMEPROPINFO;
        typedef const MIMEPROPINFO *LPCMIMEPROPINFO;

        HRESULT GetPropInfo(
                [in]        LPCSTR                  pszName,
                [in,out]    LPMIMEPROPINFO          pInfo);

        HRESULT SetPropInfo(
                [in]        LPCSTR                  pszName,
                [in]        LPCMIMEPROPINFO         pInfo);

        HRESULT GetProp(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in,out]    LPPROPVARIANT           pValue);

        HRESULT SetProp(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT AppendProp(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        LPPROPVARIANT           pValue);

        HRESULT DeleteProp(
                [in]        LPCSTR                  pszName);

        HRESULT CopyProps(
                [in]        ULONG                   cNames,
                [in,unique] LPCSTR                  *prgszName,
                [in]        IMimePropertySet        *pPropertySet);

        HRESULT MoveProps(
                [in]        ULONG                   cNames,
                [in]        LPCSTR                  *prgszName,
                [in]        IMimePropertySet        *pPropertySet);

        HRESULT DeleteExcept(
                [in]        ULONG                   cNames,
                [in]        LPCSTR                  *prgszName);

        HRESULT QueryProp(
                [in]        LPCSTR                  pszName,
                [in]        LPCSTR                  pszCriteria,
                [in]        boolean                 fSubString,
                [in]        boolean                 fCaseSensitive);

        HRESULT GetCharset(
                [out]       LPHCHARSET              phCharset);

        HRESULT SetCharset(
                [in]        HCHARSET                hCharset,
                [in]        CSETAPPLYTYPE           applytype);

        HRESULT GetParameters(
                [in]        LPCSTR                  pszName,
                [out]       ULONG                   *pcParams,
                [out]       LPMIMEPARAMINFO         *pprgParam);

        HRESULT IsContentType(
                [in]        LPCSTR                  pszPriType,
                [in,unique] LPCSTR                  pszSubType);

        HRESULT BindToObject(
                [in]        REFIID                  riid,
                [out, iid_is(riid)] void            **ppvObject);

        HRESULT Clone(
                [out]       IMimePropertySet        **ppPropertySet);

        HRESULT SetOption(
                [in]        const TYPEDID           oid,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT GetOption(
                [in]        const TYPEDID           oid,
                [in,out]    LPPROPVARIANT           pValue);

        cpp_quote("#define EPF_NONAME 0x00000001")
        HRESULT EnumProps(
                [in]        DWORD                   dwFlags,
                [out]       IMimeEnumProperties     **ppEnum);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeAddressTable
    // ---------------------------------------------------------------------------------------
    [
        uuid(C558834A-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IID_IMimeAddressTable "),
    ]
    interface IMimeAddressTable : IUnknown
    {
        typedef [unique] IMimeAddressTable *LPMIMEADDRESSTABLE;

        typedef DWORD IADDRESSTYPE;

        DECLARE_HANDLE(HADDRESS);
        typedef HADDRESS *LPHADDRESS;

        cpp_quote("#define IAT_UNKNOWN              0x00000000")
        cpp_quote("#define IAT_FROM                 0x00000001")
        cpp_quote("#define IAT_SENDER               0x00000002")
        cpp_quote("#define IAT_TO                   0x00000004")
        cpp_quote("#define IAT_CC                   0x00000008")
        cpp_quote("#define IAT_BCC                  0x00000010")
        cpp_quote("#define IAT_REPLYTO              0x00000020")
        cpp_quote("#define IAT_RETURNPATH           0x00000040")
        cpp_quote("#define IAT_RETRCPTTO            0x00000080")
        cpp_quote("#define IAT_RR                   0x00000100")
        cpp_quote("#define IAT_APPARTO              0x00000200")
        cpp_quote("#define IAT_DISP_NOTIFICATION_TO 0x00000400")
        cpp_quote("#define IAT_ALL                  0xFFFFFFFF")
        cpp_quote("#define IAT_KNOWN                (IAT_FROM | IAT_TO | IAT_CC | IAT_BCC | IAT_REPLYTO | IAT_SENDER)")
        cpp_quote("#define IAT_RECIPS               (IAT_TO | IAT_CC | IAT_BCC)")

        typedef enum tagADDRESSFORMAT {
            AFT_DISPLAY_FRIENDLY,                   // Display with friendly names only
            AFT_DISPLAY_EMAIL,                      // Display with friendly email addresses only
            AFT_DISPLAY_BOTH,                       // Display with friendly name and eamil addresses
            AFT_RFC822_DECODED,                     // RFC822 Format (decoded)
            AFT_RFC822_ENCODED,                     // RFC822 Format (encoded)
            AFT_RFC822_TRANSMIT                     // RFC822 Format (encoded) with CRLFs for folding
        } ADDRESSFORMAT;

        cpp_quote("#define IAP_CHARSET              0x00000001")
        cpp_quote("#define IAP_HANDLE               0x00000002")
        cpp_quote("#define IAP_ADRTYPE              0x00000004")
        cpp_quote("#define IAP_FRIENDLY             0x00000008")
        cpp_quote("#define IAP_EMAIL                0x00000020")
        cpp_quote("#define IAP_CERTSTATE            0x00000100")
        cpp_quote("#define IAP_SIGNING_PRINT        0x00000200")
        cpp_quote("#define IAP_ENCRYPTION_PRINT     0x00000400")
        cpp_quote("#define IAP_ENCODING             0x00000800")
        cpp_quote("#define IAP_COOKIE               0x00001000")
        cpp_quote("#define IAP_FRIENDLYW            0x00002000")
        cpp_quote("#define IAP_ALL                  0xffffffff")

        typedef struct tagADDRESSPROPS {
            DWORD           dwProps;                // Mask of IAP_xxx flags for valid items in this structure
            HADDRESS        hAddress;               // IAP_HANDLE: Handle of this address
            ENCODINGTYPE    ietFriendly;            // IAP_ENCODING: Current encoding of pszFriendly
            HCHARSET        hCharset;               // IAP_CHARSET: Charset used to encode pszFriendly
            DWORD           dwAdrType;              // IAP_ADRTYPE: Single IAT_xxx Flag, address type
            LPSTR           pszFriendly;            // IAP_FRIENDLYA: Friendly Name (ANSI)
            LPWSTR          pszFriendlyW;           // IAP_FRIENDLYW: Friendly Name (UNICODE)
            LPSTR           pszEmail;               // IAP_EMAIL: Email Address (ANSI)
            CERTSTATE       certstate;              // IAP_CERTSTATE: Certificate State
            THUMBBLOB       tbSigning;              // IAP_SIGNING_PRINT: Thumbprint to be used for signing
            THUMBBLOB       tbEncryption;           // IAP_ENCRYPTION_PRINT: Thumbprint to be used for signing
            DWORD           dwCookie;               // IAP_COOKIE: User-defined cookie
            DWORD           dwReserved1;            // Reserved, dont use
            DWORD           dwReserved2;            // Reserved, dont use
        } ADDRESSPROPS, *LPADDRESSPROPS;

        typedef struct tagADDRESSLIST {
            ULONG           cAdrs;                  // Number of items in prgAddress
            LPADDRESSPROPS  prgAdr;                 // Pointer to an array of IMimeAddressInfo objects
        } ADDRESSLIST, *LPADDRESSLIST;

        HRESULT Append(
                [in]        DWORD                   dwAdrType,
                [in]        ENCODINGTYPE            ietFriendly,
                [in]        LPCSTR                  pszFriendly,
                [in,unique] LPCSTR                  pszEmail,
                [in,out,unique] LPHADDRESS          phAddress);

        HRESULT Insert(
                [in]        LPADDRESSPROPS          pAddress,
                [in,out,unique] LPHADDRESS          phAddress);

        HRESULT SetProps(
                [in]        HADDRESS                hAddress,
                [in]        LPADDRESSPROPS          pAddress);

        HRESULT GetProps(
                [in]        HADDRESS                hAddress,
                [in]        LPADDRESSPROPS          pAddress);

        HRESULT GetSender(
                [in,out]    LPADDRESSPROPS          pAddress);

        HRESULT CountTypes(
                [in]        DWORD                   dwAdrTypes,
                [out]       ULONG                   *pcAdrs);

        HRESULT GetTypes(
                [in]        DWORD                   dwAdrTypes,
                [in]        DWORD                   dwProps,
                [in,out]    LPADDRESSLIST           pList);

        HRESULT EnumTypes(
                [in]        DWORD                   dwAdrTypes,
                [in]        DWORD                   dwProps,
                [out]       IMimeEnumAddressTypes   **ppEnum);

        HRESULT Delete(
                [in]        HADDRESS                hAddress);

        HRESULT DeleteTypes(
                [in]        DWORD                   dwAdrTypes);

        HRESULT GetFormat(
                [in]        DWORD                   dwAdrType,
                [in]        ADDRESSFORMAT           format,
                [out]       LPSTR                   *ppszFormat);

        HRESULT AppendRfc822(
                [in]        DWORD                   dwAdrType,
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCSTR                  pszRfc822Adr);

        HRESULT ParseRfc822(
                [in]        DWORD                   dwAdrType,
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCSTR                  pszRfc822Adr,
                [in,out]    LPADDRESSLIST           pList);

        HRESULT Clone(
                [out]       IMimeAddressTable       **ppTable);

        HRESULT BindToObject(
                [in]        REFIID                  riid,
                [out, iid_is(riid)] void            **ppvObject);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeAddressTableW
    // ---------------------------------------------------------------------------------------
    [
        uuid(11C8D742-0FB4-11d3-A01E-00A0C90C9BB6),
        helpstring("IID_IMimeAddressTableW"),
    ]
    interface IMimeAddressTableW : IMimeAddressTable
    {
        typedef [unique] IMimeAddressTableW *LPMIMEADDRESSTABLEW;

        HRESULT AppendW(
                [in]        DWORD                   dwAdrType,
                [in]        ENCODINGTYPE            ietFriendly,
                [in]        LPCWSTR                 pwszFriendly,
                [in,unique] LPCWSTR                 pwszEmail,
                [in,out,unique] LPHADDRESS          phAddress);

        HRESULT GetFormatW(
                [in]        DWORD                   dwAdrType,
                [in]        ADDRESSFORMAT           format,
                [out]       LPWSTR                  *ppwszFormat);

        HRESULT AppendRfc822W(
                [in]        DWORD                   dwAdrType,
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCWSTR                 pwszRfc822Adr);

        HRESULT ParseRfc822W(
                [in]        DWORD                   dwAdrType,
                [in]        LPCWSTR                 pwszRfc822Adr,
                [in,out]    LPADDRESSLIST           pList);

    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeWebDocument
    // ---------------------------------------------------------------------------------------
    [
        uuid(EE519F11-851A-11d0-825C-00C04FD85AB4),
        helpstring("IMimeWebDocument"),
    ]
    interface IMimeWebDocument : IUnknown
    {
        HRESULT GetURL(
                [out]       LPSTR                   *ppszURL);

        HRESULT BindToStorage(
                [in]        REFIID                  riid,
                [out, iid_is(riid)] LPVOID          *ppvObject);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeBody
    // ---------------------------------------------------------------------------------------
    [
        uuid(C558834C-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeBody"),
    ]
    interface IMimeBody : IMimePropertySet
    {
        typedef [unique] IMimeBody *LPMIMEBODY;

        typedef enum tagIMSGBODYTYPE {
            IBT_SECURE,                         // Body has cryptographic enhancement(s)
            IBT_ATTACHMENT,                     // Body is considered an attachment by mimeole
            IBT_EMPTY,                          // Is the body empty
            IBT_CSETTAGGED,                     // Is the body tagged with a character set?
            IBT_AUTOATTACH                      // If OID_CAN_INLINE_TEXT_BODIES is TRUE and the body was marked as an attachment by mimeole
        } IMSGBODYTYPE;

        typedef struct tagBODYOFFSETS {
            DWORD           cbBoundaryStart;    // Offset of starting boundary for the body
            DWORD           cbHeaderStart;      // Header start offset
            DWORD           cbBodyStart;        // Body start offset (same as end of header)
            DWORD           cbBodyEnd;          // Body end offset
        } BODYOFFSETS, *LPBODYOFFSETS;

        typedef struct tagTRANSMITINFO {
            ENCODINGTYPE    ietCurrent;         // Current encoding type of the data
            ENCODINGTYPE    ietXmitMime;        // Recommended Transmit Encoding
            ENCODINGTYPE    ietXmit822;         // Recommended Transmit Encoding
            ULONG           cbLongestLine;      // Longest line seen, determines if wrapping is needed
            ULONG           cExtended;          // Count of Extended Characters
            ULONG           ulPercentExt;       // Percentage of extended characters in the body
            ULONG           cbSize;             // Number of bytes in the decoded data (exact)
            ULONG           cLines;             // Number of lines in the decoded data
        } TRANSMITINFO, *LPTRANSMITINFO;

        HRESULT IsType(
                [in]        IMSGBODYTYPE            bodytype);

        HRESULT SetDisplayName(
                [in]        LPCSTR                  pszDisplay);

        HRESULT GetDisplayName(
                [out]       LPSTR                   *ppszDisplay);

        HRESULT GetOffsets(
                [out]       LPBODYOFFSETS           pOffsets);

        HRESULT GetCurrentEncoding(
                [out]       ENCODINGTYPE            *pietEncoding);

        HRESULT SetCurrentEncoding(
                [in]        ENCODINGTYPE            ietEncoding);

        HRESULT GetEstimatedSize(
                [in]        ENCODINGTYPE            ietEncoding,
                [out]       ULONG                   *pcbSize);

        HRESULT GetDataHere(
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        IStream                 *pStream);

        HRESULT GetData(
                [in]        ENCODINGTYPE            ietEncoding,
                [out]       IStream                 **ppStream);

        HRESULT SetData(
                [in]        ENCODINGTYPE            ietEncoding,
                [in,unique] LPCSTR                  pszPriType,
                [in,unique] LPCSTR                  pszSubType,
                [in]        REFIID                  riid,
                [in, iid_is(riid)]  LPVOID          pvObject);

        HRESULT EmptyData(void);

        HRESULT CopyTo(
                [in]        IMimeBody               *pBody);

        HRESULT GetTransmitInfo(
                [in,out]    LPTRANSMITINFO          pTransmitInfo);

        HRESULT SaveToFile(
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCSTR                  pszFilePath);

        HRESULT GetHandle(
                [out]       LPHBODY                 phBody);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeBodyW
    // ---------------------------------------------------------------------------------------
    [
        uuid(2F38042B-D02F-11d2-A004-00A0C90C9BB6),
        helpstring("IMimeBodyW"),
    ]
    interface IMimeBodyW : IMimeBody
    {
        HRESULT SetDisplayNameW(
                [in]        LPCWSTR                 pwszDisplay);

        HRESULT GetDisplayNameW(
                [out]       LPWSTR                  *ppwszDisplay);

        HRESULT SetDataW(
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCWSTR                 pwszPriType,
                [in]        LPCWSTR                 pwszSubType,
                [in]        REFIID                  riid,
                [in, iid_is(riid)]  LPVOID          pvObject);

        HRESULT SaveToFileW(
                [in]        ENCODINGTYPE            ietEncoding,
                [in]        LPCWSTR                 pwszFilePath);

    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeMessageTree - Supports Aggregation
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CD4-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeMessageTree"),
    ]
    interface IMimeMessageTree : IPersistStreamInit
    {
        typedef [unique] IMimeMessageTree *LPMIMEMESSAGETREE;

        const HBODY HBODY_ROOT = (HBODY)-1;

        typedef enum tagBODYLOCATION {
            IBL_ROOT,                // Get the root body of the message
            IBL_PARENT,              // Parent of pInRelation
            IBL_FIRST,               // First Child
            IBL_LAST,                // Last Child
            IBL_NEXT,                // Next Sibling
            IBL_PREVIOUS             // Previous Sibling
        } BODYLOCATION;

        typedef struct tagFINDBODY {
            LPSTR           pszPriType;
            LPSTR           pszSubType;
            DWORD           dwReserved;
        } FINDBODY, *LPFINDBODY;

        cpp_quote("#define COMMIT_ONLYIFDIRTY       0x00000001")
        cpp_quote("#define COMMIT_REUSESTORAGE      0x00000002")
        cpp_quote("#define COMMIT_SMIMETRANSFERENCODE 0x00000004")

        HRESULT GetMessageSource(
                [out]       IStream                 **ppStream,
                [in]        DWORD                   dwFlags);   // COMMIT_xxx Flags

        HRESULT GetMessageSize(
                [out]       ULONG                   *pcbSize,
                [in]        DWORD                   dwFlags);   // COMMIT_xxx Flags

        HRESULT LoadOffsetTable(
                [in]        IStream                 *pStream);

        HRESULT SaveOffsetTable(
                [in]        IStream                 *pStream,
                [in]        DWORD                   dwFlags);   // COMMIT_xxx Flags

        HRESULT GetFlags(
                [out]       DWORD                   *pdwFlags);

        HRESULT Commit(
                [in]        DWORD                   dwFlags);   // COMMIT_xxx Flags

        HRESULT HandsOffStorage(void);

        HRESULT BindToObject(
                [in]        const HBODY             hBody,
                [in]        REFIID                  riid,
                [out, iid_is(riid)] void            **ppvObject);

        // NOTE: High word of SAVEBODY_* is reserved for private internal flags
        cpp_quote("#define SAVEBODY_KEEPBOUNDARY    0x00000001")
        HRESULT SaveBody(
                [in]        HBODY                   hBody,
                [in]        DWORD                   dwFlags,
                [in]        IStream                 *pStream);

        HRESULT InsertBody(
                [in]        BODYLOCATION            location,
                [in]        HBODY                   hPivot,
                [out]       LPHBODY                 phBody);

        HRESULT GetBody(
                [in]        BODYLOCATION            location,
                [in,unique] HBODY                   hPivot,
                [out]       LPHBODY                 phBody);

        cpp_quote("#define DELETE_PROMOTE_CHILDREN 0x00000001")
        cpp_quote("#define DELETE_CHILDREN_ONLY    0x00000002")
        HRESULT DeleteBody(
                [in]        HBODY                   hBody,
                [in]        DWORD                   dwFlags);

        HRESULT MoveBody(
                [in]        HBODY                   hBody,
                [in]        BODYLOCATION            location);

        HRESULT CountBodies(
                [in]        HBODY                   hParent,
                [in]        boolean                 fRecurse,
                [out]       ULONG                  *pcBodies);

        HRESULT FindFirst(
                [in,out]    LPFINDBODY              pFindBody,
                [out]       LPHBODY                 phBody);

        HRESULT FindNext(
                [in,out]    LPFINDBODY              pFindBody,
                [out]       LPHBODY                 phBody);

        HRESULT ResolveURL(
                [in,unique] HBODY                   hRelated,
                [in,unique] LPCSTR                  pszBase,
                [in,unique] LPCSTR                  pszURL,
                [in]        DWORD                   dwFlags,
                [in,out,unique] LPHBODY             phBody);

        HRESULT ToMultipart(
                [in]            HBODY                   hBody,
                [in]            LPCSTR                  pszSubType,
                [in,out,unique] LPHBODY                 phMultipart);

        HRESULT GetBodyOffsets(
                [in]        HBODY                   hBody,
                [in,out]    LPBODYOFFSETS           pOffsets);

        HRESULT GetCharset(
                [out]       LPHCHARSET              phCharset);

        HRESULT SetCharset(
                [in]        HCHARSET                hCharset,
                [in]        CSETAPPLYTYPE           applytype);

        HRESULT IsBodyType(
                [in]        HBODY                   hBody,
                [in]        IMSGBODYTYPE            bodytype);

        HRESULT IsContentType(
                [in]        HBODY                   hBody,
                [in,unique] LPCSTR                  pszPriType,
                [in,unique] LPCSTR                  pszSubType);

        HRESULT QueryBodyProp(
                [in]        HBODY                   hBody,
                [in]        LPCSTR                  pszName,
                [in]        LPCSTR                  pszCriteria,
                [in]        boolean                 fSubString,
                [in]        boolean                 fCaseSensitive);

        HRESULT GetBodyProp(
                [in]        HBODY                   hBody,
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in, out]   LPPROPVARIANT           pValue);

        HRESULT SetBodyProp(
                [in]        HBODY                   hBody,
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT DeleteBodyProp(
                [in]        HBODY                   hBody,
                [in]        LPCSTR                  pszName);

        HRESULT SetOption(
                [in]        const TYPEDID           oid,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT GetOption(
                [in]        const TYPEDID           oid,
                [in,out]    LPPROPVARIANT           pValue);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeMessage - Supports Aggregation
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CD5-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeMessage"),
    ]
    interface IMimeMessage : IMimeMessageTree
    {
        typedef [unique] IMimeMessage *LPMIMEMESSAGE;

        typedef DWORD TEXTTYPE;

        typedef enum tagIMSGFLAGS {
            IMF_ATTACHMENTS    = 0x00000001,   // The message has attachments
            IMF_MULTIPART      = 0x00000002,   // The message is a multipart message
            IMF_SUBMULTIPART   = 0x00000004,   // The message has a nested multipart section
            IMF_MIME           = 0x00000008,   // The message is in MIME format
            IMF_HTML           = 0x00000010,   // The message has a text/html body
            IMF_PLAIN          = 0x00000020,   // The message has a text/plain body
            IMF_PARTIAL        = 0x00000040,   // The message has un-matching boundaries, or is a message/partial
            IMF_SIGNED         = 0x00000080,   // The message is signed
            IMF_ENCRYPTED      = 0x00000100,   // The message is secured
            IMF_TNEF           = 0x00000200,   // The message has a Microsoft TNEF attachment
            IMF_MHTML          = 0x00000400,   // The message has a MIME-HTML multipart/related section
            IMF_SECURE         = 0x00000800,   // The message has a cryptographic enhancement
            IMF_TEXT           = 0x00001000,   // The message contains text/xxx part(s)
            IMF_CSETTAGGED     = 0x00002000,   // The message was tagged with a charset
            IMF_NEWS           = 0x00004000,   // The message has nntp (news) headers (Newsgroup, Path, etc)
            IMF_VOICEMAIL      = 0x00008000,   // The message has the X-Voicemail Header Set to something
            IMF_HASVCARD       = 0x00010000,   // The message has a text/v-card attachment.
            IMF_RFC1154        = 0x00020000    // The message was decoded using RFC1154.
        } IMSGFLAGS;

        typedef enum tagIMSGPRIORITY {
            IMSG_PRI_LOW       = 5,
            IMSG_PRI_NORMAL    = 3,
            IMSG_PRI_HIGH      = 1
        } IMSGPRIORITY;

        cpp_quote("#define WPF_HTML                         0x00000001")    // Full-fidelity HTML (if not set, mimeole will downgrade to plain-text)
        cpp_quote("#define WPF_AUTOINLINE                   0x00000002")    // Inline images that are marked as attachment
        cpp_quote("#define WPF_SLIDESHOW                    0x00000004")    // Show all inlined images in a slideshow
        cpp_quote("#define WPF_ATTACHLINKS                  0x00000008")    // Put links to the attachments in the WebPage
        cpp_quote("#define WPF_IMAGESONLY                   0x00000010")    // Only show inline images
        cpp_quote("#define WPF_NOMETACHARSET                0x00000020")    // Only show inline images
        cpp_quote("#define WPF_TEXTONLY                     0x00000040")    // No HTML tags whatsoever

        typedef struct tagWEBPAGEOPTIONS {
            DWORD           cbSize;             // Size of this structure
            DWORD           dwFlags;            // WPF_xxx Flags
            DWORD           dwDelay;            // Delay time in milliseconds for auto-slide-show
            WCHAR           wchQuote;           // Quote char to use for reply ticking
            BOOL            fQuoteSpaces;       // Insert space between quote chars
        } WEBPAGEOPTIONS, *LPWEBPAGEOPTIONS;

        cpp_quote("#define TXT_PLAIN                        0x00000001")
        cpp_quote("#define TXT_HTML                         0x00000002")
        cpp_quote("#define URL_ATTACH_INTO_MIXED            0x00000001")
        cpp_quote("#define URL_ATTACH_GENERATE_CID          0x00000002")
        cpp_quote("#define URL_ATTACH_SET_CNTTYPE           0x00000004")
        cpp_quote("#define URL_RESOLVE_RENDERED             0x00000001")
        cpp_quote("#define URL_RESULVE_NO_BASE              0x00000002")

        HRESULT    CreateWebPage(
                [in]        IStream                  *pRootStm,
                [in]        LPWEBPAGEOPTIONS          pOptions,
                [in]        IMimeMessageCallback     *pCallback,
                [out]       IMoniker                **ppMoniker);

        HRESULT GetProp(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in,out]    LPPROPVARIANT           pValue);

        HRESULT SetProp(
                [in]        LPCSTR                  pszName,
                [in]        DWORD                   dwFlags,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT DeleteProp(
                [in]        LPCSTR                  pszName);

        HRESULT QueryProp(
                [in]        LPCSTR                  pszName,
                [in]        LPCSTR                  pszCriteria,
                [in]        boolean                 fSubString,
                [in]        boolean                 fCaseSensitive);

        HRESULT GetTextBody(
                [in]            DWORD                   dwTxtType,
                [in]            ENCODINGTYPE            ietEncoding,
                [in,out,unique] IStream                 **ppStream,
                [in,out,unique] LPHBODY                 phBody);

        HRESULT SetTextBody(
                [in]            DWORD                   dwTxtType,
                [in]            ENCODINGTYPE            ietEncoding,
                [in,unique]     HBODY                   hAlternative,
                [in]            IStream                 *pStream,
                [in,out,unique] LPHBODY                 phBody);

        HRESULT AttachObject(
                [in]                REFIID          riid,
                [in, iid_is(riid)]  void            *pvObject,
                [in,out,unique]     LPHBODY         phBody);

        HRESULT AttachFile(
                [in,unique]     LPCSTR              pszFilePath,
                [in,unique]     IStream             *pstmFile,
                [in,out,unique] LPHBODY             phBody);

        HRESULT AttachURL(
                [in,unique] LPCSTR                  pszBase,
                [in,unique] LPCSTR                  pszURL,
                [in]        DWORD                   dwFlags,
                [in]        IStream                 *pstmURL,
                [in,out,unique] LPSTR               *ppszCIDURL,
                [out]       LPHBODY                 phBody);

        HRESULT GetAttachments(
                [out]       ULONG                   *pcAttach,
                [out]       LPHBODY                 *pprghAttach);

        HRESULT GetAddressTable(
                [out]       IMimeAddressTable       **ppTable);

        HRESULT GetSender(
                [in,out]    LPADDRESSPROPS          pAddress);

        HRESULT GetAddressTypes(
                [in]        DWORD                   dwAdrTypes,
                [in]        DWORD                   dwProps,
                [in,out]    LPADDRESSLIST           pList);

        HRESULT GetAddressFormat(
                [in]        DWORD                   dwAdrType,
                [in]        ADDRESSFORMAT           format,
                [out]       LPSTR                   *ppszFormat);

        HRESULT EnumAddressTypes(
                [in]        DWORD                   dwAdrTypes,
                [in]        DWORD                   dwProps,
                [out]       IMimeEnumAddressTypes   **ppEnum);

        HRESULT SplitMessage(
                [in]        ULONG                   cbMaxPart,
                [out]       IMimeMessageParts       **ppParts);

        HRESULT    GetRootMoniker(
                [out]       IMoniker                **ppMoniker);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeMessageW
    // ---------------------------------------------------------------------------------------
    [
        uuid(F90ADFEF-D01F-11d2-A004-00A0C90C9BB6),
        helpstring("IMimeMessageW"),
    ]
    interface IMimeMessageW : IMimeMessage
    {
        typedef IMimeMessageW *LPMIMEMESSAGEW;

        HRESULT GetPropW(
                [in]        LPCWSTR                 pwszName,
                [in]        DWORD                   dwFlags,
                [in,out]    LPPROPVARIANT           pValue);

        HRESULT SetPropW(
                [in]        LPCWSTR                 pwszName,
                [in]        DWORD                   dwFlags,
                [in]        LPCPROPVARIANT          pValue);

        HRESULT DeletePropW(
                [in]        LPCWSTR                 pwszName);

        HRESULT QueryPropW(
                [in]        LPCWSTR                 pwszName,
                [in]        LPCWSTR                 pwszCriteria,
                [in]        boolean                 fSubString,
                [in]        boolean                 fCaseSensitive);

        HRESULT AttachFileW(
                [in]        LPCWSTR                 pwszFilePath,
                [in]        IStream                 *pstmFile,
                [in,out,unique] LPHBODY             phBody);

        HRESULT AttachURLW(
                [in]        LPCWSTR                 pwszBase,
                [in]        LPCWSTR                 pwszURL,
                [in]        DWORD                   dwFlags,
                [in]        IStream                 *pstmURL,
                [out]       LPWSTR                  *ppwszCIDURL,
                [out]       LPHBODY                 phBody);

        HRESULT GetAddressFormatW(
                [in]        DWORD                   dwAdrType,
                [in]        ADDRESSFORMAT           format,
                [out]       LPWSTR                 *ppwszFormat);

        HRESULT ResolveURLW(
                [in,unique]     HBODY                   hRelated,
                [in,unique]     LPCWSTR                 pwszBase,
                [in,unique]     LPCWSTR                 pwszURL,
                [in]            DWORD                   dwFlags,
                [in,out,unique] LPHBODY                 phBody);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeWebPageCallback
    // ---------------------------------------------------------------------------------------
    [
        uuid(761AA641-7BDA-11d1-8AA9-00C04FB951F3),
        helpstring("IMimeMessageCallback"),
    ]
    interface IMimeMessageCallback : IUnknown
    {
        typedef IMimeMessageCallback *LPMIMEMESSAGECALLBACK;

        // Returns S_OK if wrote something into pStream
        HRESULT OnWebPageSplitter([in] DWORD cInlined, [in] IStream *pStream);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IPersistMime
    // ---------------------------------------------------------------------------------------
    [
        uuid(DE4AD8DA-555F-11d1-8DD0-00C04FB951F9),
        helpstring("IPersistMime"),
    ]
    interface IPersistMime : IPersist
    {
        typedef IPersistMime *LPPERSISTMIME;

        cpp_quote("#define PMS_HTML            0x00000001")
        cpp_quote("#define PMS_TEXT            0x00000002")

        HRESULT Load([in] IMimeMessage *pMsg);
        HRESULT Save([in] IMimeMessage *pMsg, [in] DWORD dwFlags);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeMessageParts - Used for splitting and re-combining partial messages
    // ---------------------------------------------------------------------------------------
    [
        uuid(C558834F-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeMessageParts"),
    ]
    interface IMimeMessageParts : IUnknown
    {
        typedef [unique] IMimeMessageParts *LPMIMEMESSAGEPARTS;

        HRESULT CombineParts(
                [out]       IMimeMessage          **ppMessage);

        HRESULT AddPart(
                [in]        IMimeMessage           *pMessage);

        HRESULT SetMaxParts(
                [in]        ULONG                   cParts);

        HRESULT CountParts(
                [out]       ULONG                  *pcParts);

        HRESULT EnumParts(
                [out]       IMimeEnumMessageParts **ppEnum);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEnumHeaderRows
    // ---------------------------------------------------------------------------------------
    [
        uuid(C558834D-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeEnumHeaderRows"),
    ]
    interface IMimeEnumHeaderRows : IUnknown
    {
        typedef [unique] IMimeEnumHeaderRows *LPMIMEENUMHEADERROWS;

        typedef struct tagENUMHEADERROW {
            HHEADERROW      hRow;
            LPSTR           pszHeader;
            LPSTR           pszData;
            ULONG           cchData;
            DWORD_PTR       dwReserved;
        } ENUMHEADERROW, *LPENUMHEADERROW;

        HRESULT Next(
                [in]        ULONG                   cFetch,
                [in,out]    LPENUMHEADERROW         prgRow,
                [out]       ULONG                  *pcFetched);

        HRESULT Skip(
                [in]        ULONG                  cItems);

        HRESULT Reset(void);

        HRESULT Clone(
                [out]       IMimeEnumHeaderRows  **ppEnum);

        HRESULT Count(
                [out]       ULONG                  *pcItems);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEnumProperties
    // ---------------------------------------------------------------------------------------
    [
        uuid(FD853CEE-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeEnumProperties"),
    ]
    interface IMimeEnumProperties : IUnknown
    {
        typedef [unique] IMimeEnumProperties *LPMIMEENUMPROPERTIES;

        typedef struct tagENUMPROPERTY {
            LPSTR           pszName;
            HHEADERROW      hRow;
            DWORD           dwPropId;
        } ENUMPROPERTY, *LPENUMPROPERTY;

        HRESULT Next(
                [in]        ULONG                   cFetch,
                [in,out]    LPENUMPROPERTY          prgProp,
                [out]       ULONG                   *pcFetched);

        HRESULT Skip(
                [in]        ULONG                   cItems);

        HRESULT Reset(void);

        HRESULT Clone(
                [out]       IMimeEnumProperties     **ppEnum);

        HRESULT Count(
                [out]       ULONG                   *pcItems);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEnumAddressTypes
    // ---------------------------------------------------------------------------------------
    [
        uuid(C5588354-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeEnumAddressTypes"),
    ]
    interface IMimeEnumAddressTypes : IUnknown
    {
        typedef [unique] IMimeEnumAddressTypes *LPMIMEENUMADDRESSTYPES;

        HRESULT Next(
                [in]            ULONG                   cFetch,
                [in,out]        LPADDRESSPROPS          prgAdr,
                [in,out,unique] ULONG                   *pcFetched);

        HRESULT Skip(
                [in]        ULONG                   cItems);

        HRESULT Reset(void);

        HRESULT Clone(
                [out]       IMimeEnumAddressTypes   **ppEnum);

        HRESULT Count(
                [out]       ULONG                   *pcItems);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEnumMessageParts - Used to enumerate IMimeMessageParts container
    // ---------------------------------------------------------------------------------------
    [
        uuid(C5588350-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeEnumMessageParts"),
    ]
    interface IMimeEnumMessageParts : IUnknown
    {
        typedef [unique] IMimeEnumMessageParts *LPMIMEENUMMESSAGEPARTS;

        HRESULT Next(
                [in]        ULONG                   cFetch,
                [in,out]    IMimeMessage            **prgpMessage,
                [out]       ULONG                   *pcFetched);

        HRESULT Skip(
                [in]        ULONG                   cItems);

        HRESULT Reset(void);

        HRESULT Clone(
                [out]       IMimeEnumMessageParts   **ppEnum);

        HRESULT Count(
                [out]       ULONG                   *pcItems);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IHashTable
    // ---------------------------------------------------------------------------------------
    [
        uuid(64577981-86D7-11d1-BDFC-00C04FA31009),
        helpstring("IHashTable"),
    ]
    interface IHashTable : IUnknown
    {
        typedef [unique] IHashTable *LPHASHTABLE;

        // For use with IHashTable::Insert
        const DWORD HF_NO_DUPLICATES = 0x00000001;  // If duplicate entry exists, replace old data with new data


        HRESULT Init(
                [in]        DWORD                   dwSize,
                [in]        BOOL                    fDupeKeys);

        HRESULT Insert(
                [in]        LPSTR                   psz,
                [in]        LPVOID                  pv,
                [in]        DWORD                   dwFlags);

        HRESULT Replace(
                [in]        LPSTR                   psz,
                [in]        LPVOID                  pv);

        HRESULT Find(
                [in]        LPSTR                   psz,
                [in]        BOOL                    fRemove,
                [out]       LPVOID                  *ppv);

        // enumeration. can walk the entries in the hash table
        // use Reset to rest the enumerator and Next to walk the
        // entries
        HRESULT Reset(void);

        HRESULT Next(
                [in]        ULONG                   cFetch,
                [out,size_is(*pcFetched)]   LPVOID  **prgpv,
                [in,out]    ULONG                   *pcFetched);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeAllocator
    // ---------------------------------------------------------------------------------------
    [
        uuid(C5588351-7F86-11d0-8252-00C04FD85AB4),
        helpstring("IMimeAllocator"),
    ]
    interface IMimeAllocator : IMalloc
    {
        typedef [unique] IMimeAllocator *LPMIMEALLOCATOR;

        HRESULT FreeParamInfoArray(
                [in]        ULONG                   cParams,
                [in]        LPMIMEPARAMINFO         prgParam,
                [in]        boolean                 fFreeArray);

        HRESULT FreeAddressList(
                [in,out]    LPADDRESSLIST           pList);

        HRESULT FreeAddressProps(
                [in,out]    LPADDRESSPROPS          pAddress);

        HRESULT ReleaseObjects(
                [in]        ULONG                   cObjects,
                [in]        IUnknown                **prgpUnknown,
                [in]        boolean                 fFreeArray);

        HRESULT FreeEnumHeaderRowArray(
                [in]        ULONG                   cRows,
                [in]        LPENUMHEADERROW         prgRow,
                [in]        boolean                 fFreeArray);

        HRESULT FreeEnumPropertyArray(
                [in]        ULONG                   cProps,
                [in]        LPENUMPROPERTY          prgProp,
                [in]        boolean                 fFreeArray);

        HRESULT FreeThumbprint(
                [in]        THUMBBLOB               *pthumbprint);

        HRESULT PropVariantClear(
                [in]        LPPROPVARIANT           pProp);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeObjResolver
    // ---------------------------------------------------------------------------------------
    [
        uuid(FECEAFFD-C441-11d1-960E-00C04FBD7C09),
        helpstring("IMimeObjResolver"),
    ]
    interface IMimeObjResolver : IUnknown
    {
        typedef [unique] IMimeObjResolver *LPMIMEOBJRESOLVER;

        HRESULT MimeOleObjectFromMoniker(
                [in]        BINDF               bindf,
                [in]        IMoniker           *pmkOriginal,
                [in]        IBindCtx           *pBindCtx,
                [in]        REFIID              riid,
                [out]       LPVOID             *ppvObject,
                [out]       IMoniker          **ppmkNew);

    }
}

typedef enum tagFNTSYSTYPE {
    FNT_SYS_ICON            = 0,
    FNT_SYS_ICON_BOLD,
    FNT_SYS_MENU,
    FNT_SYS_ICON_STRIKEOUT,
    FNT_SYS_LAST
} FNTSYSTYPE;


    // ---------------------------------------------------------------------------------------
    // IID_IFontCache
    // ---------------------------------------------------------------------------------------
    [
        uuid(B0D17FC2-7BC4-11d1-BDFA-00C04FA31009),
        helpstring("IFontCache"),
    ]
    interface IFontCache : IUnknown
    {
        typedef [unique] IFontCache *LPFONTCACHE;

        [local]
        HRESULT Init(
                [in]        HKEY                    hkey,
                [in]        LPCSTR                  pszIntlKey,
                [in]        DWORD                   dwFlags);

        HRESULT GetFont(
                [in]        FNTSYSTYPE              fntType,
                [in,unique] HCHARSET                hCharset,
                [out]       HFONT                   *phFont);

        HRESULT OnOptionChange(void);

        HRESULT GetJP_ISOControl(
                [out]       BOOL                    *pfUseSIO);

    }

    // ---------------------------------------------------------------------------------------
    // IID_IFontCacheNotify
    // ---------------------------------------------------------------------------------------
    [
        uuid(B0D17FC5-7BC4-11d1-BDFA-00C04FA31009),
        helpstring("IFontCacheNotify"),
    ]
    interface IFontCacheNotify : IUnknown
    {
        typedef [unique] IFontCacheNotify *LPFONTCACHENOTIFY;

        HRESULT OnPreFontChange(void);
        HRESULT OnPostFontChange(void);
    }

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEditTag
    // ---------------------------------------------------------------------------------------
    [
        uuid(70183210-7b36-11d2-8c12-00c04fa31009),
        helpstring("IID_IMimeEditTag"),
    ]

    interface IMimeEditTag : IUnknown
    {
        typedef [unique] IMimeEditTag *PMIMEEDITTAG;

        // get and set the source-attributes on a tag. This is tag-specific and is where the data is coming from
        // implementors should adjust the html source accordingly
        HRESULT GetSrc(
                [out]       BSTR            *pbstr);

        HRESULT SetSrc(
                [in]        BSTR            bstr);

        // destination is set by the MHTML packager. It is the location that the tag will end up after
        // being archived into the Mime-Message. Might be a CID: or the original URL location. Implementors
        // should just hold onto and return this member data
        HRESULT GetDest(
                [out]       BSTR            *pbstr);

        HRESULT SetDest(
                [in]        BSTR            bstr);

        // called by the packer before the document is persisted. The tag should remove any temporary state
        // and change it's data parameters to point the the destination (if set)
        HRESULT OnPreSave();

        // called after the packer has saved the document. The tag should restore it's temporary state and
        // revert back to the original source url
        HRESULT OnPostSave();

        // called by the packer to make sure that this tag should be packaged.
        HRESULT CanPackage();

        // called by the packer to validate a mime-type

        HRESULT IsValidMimeType(
                [in]        LPWSTR        pszTypeW);
    };

    // ---------------------------------------------------------------------------------------
    // IID_IMimeEditTagCollection
    // ---------------------------------------------------------------------------------------
    [
        uuid(d09ee528-7b38-11d2-8c12-00c04fa31009),
        helpstring("IID_IMimeEditTagCollection"),
    ]

    interface IMimeEditTagCollection : IUnknown
    {
        typedef [unique] IMimeEditTagCollection *PMIMEEDITTAGCOLLECTION;

        HRESULT Init(
                [in]        IUnknown  *pHtmlDoc);

        HRESULT Next(
                [in]        ULONG           cFetch,
                [out]       IMimeEditTag  **ppTag,
                [out]       ULONG          *pcFetched);

        HRESULT Reset();
        HRESULT Count(
                [out]       ULONG           *pcItems);
    };

    // ----------------------------------------------------------------------
    // IID_IMimeSecurityCallback
    // ----------------------------------------------------------------------
    [
        uuid(ba715ae0-a740-11d2-8b22-0080c76b34c6),
        local,
        helpstring("IMimeSecurityCallback"),
    ]
    interface IMimeSecurityCallback : IUnknown
    {

cpp_quote("")
cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_UNKNOWN         0")
cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_KEYTRANS        1")
cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_KEYAGREE        2")
cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_MAIL_LIST       3")
cpp_quote("")
cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_CERTIFICATE   0")
cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_KEYTRANS      1")
cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_PROVIDER      2")
cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_EPHEMERAL_KEYAGREE 3")
cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_STATIC_KEYAGREE  4")
cpp_quote("")
cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_CERTIFICATE    0")
cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_ISSUERSERIAL   1")
cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_KEY_ID         2")
cpp_quote("")
        typedef struct tagCMS_RECIPIENT_INFO {
            DWORD                       dwRecipientType;
            PCCERT_CONTEXT              pccert;

            CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
            void *                      pvKeyEncryptionAuxInfo;
            DWORD                       cbKeyEncryptionAuxInfo;

            CRYPT_ALGORITHM_IDENTIFIER  KeyWrapAlgorithm;
            void *                      pvKeyWrapAuxInfo;
            DWORD                       cbKeyWrapAuxInfo;

            DWORD                       dwU1;
            [switch_type(DWORD), switch_is(dwU1)]
            union {
                [case(1)] CRYPT_BIT_BLOB SubjectPublicKey;
                [case(2)] struct {
                    HCRYPTPROV          hprov;
                    HCRYPTKEY           hkey;
                } u2;
                [case(3)] struct {
                    CRYPT_DATA_BLOB     UserKeyingMaterial;
                    CRYPT_ALGORITHM_IDENTIFIER EphemeralAlgorithm;
                    CRYPT_BIT_BLOB      SubjectPublicKey;
                } u3;
                [case(4)] struct {
                    CRYPT_DATA_BLOB     UserKeyingMaterial;
                    HCRYPTPROV          hprov;
                    DWORD               dwKeySpec;
                    CERT_ID             senderCertId;
                    CRYPT_BIT_BLOB      SubjectPublicKey;
                } u4;
            } u1;

            //  KEY ID
            //
            //  Key Ids are:
            //  1) IssuerAndSerialNumber
            //  2) SKI + filetime + attributes
            //  3) KI + filetime + attributes
            //

            DWORD                         dwU3;
            [switch_type(DWORD), switch_is(dwU3)]
            union {
                [case(1)] CERT_ISSUER_SERIAL_NUMBER     IssuerSerial;
                [case(2)] CRYPT_DATA_BLOB               KeyId;
            } u3;

            FILETIME                    filetime;
            PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
        } CMS_RECIPIENT_INFO, *PCMS_RECIPIENT_INFO;

        typedef union tagCMS_CTRL_DECRYPT_INFO {
            CMSG_CTRL_KEY_TRANS_DECRYPT_PARA            trans;
            CMSG_CTRL_KEY_AGREE_DECRYPT_PARA            agree;
            CMSG_CTRL_MAIL_LIST_DECRYPT_PARA            maillist;
        } CMS_CTRL_DECRYPT_INFO, *PCMS_CTRL_DECYRPT_INFO;


        HRESULT FindKeyFor(
                [in]            HWND hwnd,
                [in]            DWORD dwFlags,
                [in]            DWORD dwRecipientIndex,
                [in]            const CMSG_CMS_RECIPIENT_INFO * pRecipInfo,
                [out]           DWORD * pdwCtrl,
                [in,out]        CMS_CTRL_DECRYPT_INFO * pDecryptInfo,
                [out]           PCCERT_CONTEXT * ppccert);

        HRESULT GetParameters(
                [in]            PCCERT_CONTEXT pccert,
                [in]            HCERTSTORE hstoreMsg,
                [in,out]        DWORD * pcbParams,
                [in,out]        BYTE ** pbParams);
        }
cpp_quote("// {80830b40-962c-11d2-8af6-0080c76b34c6}")
cpp_quote("DEFINE_GUID(IID_IMimeSecurity2, 0x80830b40, 0x962c, 0x11d2, 0x8a, 0xf6, 0x00, 0x80, 0xc7, 0x6b, 0x34, 0xc6);")
cpp_quote("")
cpp_quote("#define SMIME_RECIPIENT_REPLACE_ALL                  0x00000001")
cpp_quote("")
cpp_quote("#define SMIME_ATTRIBUTE_SET_SIGNED                   0")
cpp_quote("#define SMIME_ATTRIBUTE_SET_UNSIGNED                 1")
cpp_quote("#define SMIME_ATTRIBUTE_SET_UNPROTECTED              2")
cpp_quote("")
cpp_quote("#define SMIME_ATTR_REPLACE_EXISTING                  0")
cpp_quote("#define SMIME_ATTR_ADD_TO_EXISTING                   1")
cpp_quote("#define SMIME_ATTR_ADD_IF_NOT_EXISTS                 2")
cpp_quote("")
cpp_quote("#define SMIME_SUPPORT_LABELS                         0x00000001")
cpp_quote("#define SMIME_SUPPORT_RECEIPTS                       0x00000002")
cpp_quote("#define SMIME_SUPPORT_MAILLIST                       0x00000004")
cpp_quote("#define SMIME_SUPPORT_KEY_AGREE                      0x00000008")
cpp_quote("")

        // ---------------------------------------------------------------------------------
        // IID_IMimeSecurity2
        // ---------------------------------------------------------------------------------
        [
            uuid(80830b40-962c-11d2-8af6-0080c76b34c6),
            local,
            helpstring("IMimeSecurity2"),
        ]
        interface IMimeSecurity2 : IUnknown
        {

        HRESULT Encode(
                [in]    HWND hwnd,
                [in]    DWORD dwFlags);

        HRESULT Decode(
                [in]    HWND hwnd,
                [in]    DWORD dwFlags,
                [in]    IMimeSecurityCallback * pCallback);

        HRESULT GetRecipientCount(
                [in]    DWORD dwFlags,
                [out]   DWORD * pdwRecipCount);

        HRESULT AddRecipient(
                [in]    DWORD dwFlags,
                [in]    DWORD cRecipData,
                [in]    PCMS_RECIPIENT_INFO recipData);

        HRESULT GetRecipient(
                [in]    DWORD dwFlags,
                [in]    DWORD iRecipient,
                [in]    DWORD cRecipients,
                [in,out] PCMS_RECIPIENT_INFO pRecipData);

        HRESULT DeleteRecipient(
                [in]    DWORD dwFlags,
                [in]    DWORD iRecipent,
                [in]    DWORD cRecipients);

        HRESULT GetAttribute(
                [in]    DWORD dwFlags,
                [in]    DWORD iSigner,
                [in]    DWORD iAttributeSet,
                [in]    DWORD iInstance,
                [in]    LPCSTR pszObjectId,
                [out]   CRYPT_ATTRIBUTE ** ppattr);

        HRESULT SetAttribute(
                [in]    DWORD dwFlags,
                [in]    DWORD iSigner,
                [in]    DWORD iAttributeSet,
                [in]    const CRYPT_ATTRIBUTE * pattr);

        HRESULT DeleteAttribute(
                [in]    DWORD dwFlags,
                [in]    DWORD iSigner,
                [in]    DWORD iAttributeSet,
                [in]    DWORD iInstance,
                [in]    LPCSTR pszObjId);

        HRESULT CreateReceipt(
                [in]    DWORD dwFlags,
                [in]    DWORD cbFromNames,
                [in]    const BYTE * pbFromNames,
                [in]    DWORD cSignerCertificates,
                [in]    PCCERT_CONTEXT * rgSignerCertificates,
                [out]   IMimeMessage ** ppMimeMessageReceipt);

        HRESULT GetReceiptSendersList(
                [in]    DWORD dwFlags,
                [out]   DWORD * pcSendersList,
                [out]   CERT_NAME_BLOB ** rgSendersList);

        HRESULT VerifyReceipt(
                [in]    DWORD dwFlags,
                [in]    IMimeMessage * pMimeMessageReceipt);

        HRESULT CapabilitiesSupported(
                [in,out] DWORD * pdwFeatures);
        }

        cpp_quote("#define NGH_DEFAULT                            0x00000000  // Display the default newsgroup view for a product type")
        cpp_quote("#define NGH_FULLSEARCH                         0x00000001  // Execute the query against available newsgroups, and display results.")

        // ---------------------------------------------------------------------------------------
        // IID_INewsgroupHelp
        //
        // INewsgroupHelp -- provides a url location for newsgroup help for a given product.
        //                   Optionally, formats a full query string for an immediate search.
        //
        // *******************************************************************
        //
        //  GetURL
        //
        //  Parameter List:
        //
        //  [in]        LPCWSTR     pwszProductGroup    -- A string representation of a GUID for a Microsoft product group.
        //  [in]        DWORD       dwFlags             -- Specify the default view, or to prepare a full query string
        //  [in, opt]   LPCWSTR     pwszSearchString    -- Search text for a query
        //  [in, opt]   LANGID     *pLangID             -- Optional LANGID. If omitted, the default LANGID is used.
        //  [out]       LPWSTR    **ppwszURL            -- A url link to newsgroup help
        //
        // ---------------------------------------------------------------------------------------
        [
            uuid(0887C54F-4F42-4937-81DA-BC9C97494627),
            helpstring("INewsgroupHelp"),
        ]
        interface INewsgroupHelp : IUnknown
        {
            import "unknwn.idl";

            HRESULT GetUrl(
                [in]        LPCWSTR                 pwszProductGroup,
                [in]        DWORD                   dwFlags,
                [in,unique] LPCWSTR                 pwszSearchText,
                [in,unique] LANGID                 *pLangID,
                [out]       LPWSTR                 *ppwszUrl);
        }

        // ---------------------------------------------------------------------------------------
        // IID_IHashTableW
        // ---------------------------------------------------------------------------------------
        [
            uuid(71d6b38c-7a15-42c6-af84-b2a5dc242ceb),
            local,
            helpstring("IHashTableW"),
        ]
        interface IHashTableW : IUnknown
        {
            HRESULT InsertW(
                    [in]        LPCWSTR                  pwsz,
                    [in]        LPVOID                   pv,
                    [in]        DWORD                    dwFlags);

            HRESULT ReplaceW(
                    [in]        LPCWSTR                  pwsz,
                    [in]        LPVOID                   pv);

            HRESULT FindW(
                    [in]        LPCWSTR                  pwsz,
                    [in]        BOOL                     fRemove,
                    [out]       LPVOID                   *ppv);
        }

cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// CMDSETID_MimeEdit commands")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MECMDID_DIRTY                  1")
cpp_quote("#define MECMDID_EMPTY                  2")
cpp_quote("#define MECMDID_STYLE                  3")
cpp_quote("#define MECMDID_EDITHTML               4")
cpp_quote("#define MECMDID_DOWNGRADEPLAINTEXT     5")
cpp_quote("#define MECMDID_SETTEXT                6")
cpp_quote("#define MECMDID_ROT13                  7")
cpp_quote("#define MECMDID_INSERTTEXTFILE         8")
cpp_quote("#define MECMDID_VIEWSOURCE             9")
cpp_quote("#define MECMDID_FORMATFONT            10")
cpp_quote("#define MECMDID_PREVIEWFORMAT         11")
cpp_quote("#define MECMDID_EDITMODE              12")
cpp_quote("#define MECMDID_CHARSET               13")
cpp_quote("#define MECMDID_SAVEASSTATIONERY      14")
cpp_quote("#define MECMDID_BACKGROUNDIMAGE       15")
cpp_quote("#define MECMDID_INSERTTEXT            16")
cpp_quote("#define MECMDID_INSERTHTML            17")
cpp_quote("#define MECMDID_BACKGROUNDCOLOR       18")
cpp_quote("#define MECMDID_APPLYDOCUMENT         19")
cpp_quote("#define MECMDID_SAVEATTACHMENTS       20")
cpp_quote("#define MECMDID_BACKGROUNDSOUND       21")
cpp_quote("#define MECMDID_INSERTBGSOUND         22")
cpp_quote("#define MECMDID_SHOWSOURCETABS        23")
cpp_quote("#define MECMDID_SETSOURCETAB	         24")
cpp_quote("#define MECMDID_TABLINKS              25")
cpp_quote("#define MECMDID_FORMATPARAGRAPH       26")
cpp_quote("#define MECMDID_CANENCODETEXT         27")
cpp_quote("#define MECMDID_RELOAD_EXTERNAL_CONTENT 28")
cpp_quote("#define MECMDID_EXTERNAL_CONTENT_BLOCKED 29")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MEO_FLAGS")  //used by MEHOSTCMDID_FLAGS
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MEO_FLAGS_INCLUDEMSG             0x0001")    // include message when loading
cpp_quote("#define MEO_FLAGS_HTML                   0x0002")    // status of HTML mode
cpp_quote("#define MEO_FLAGS_AUTOINLINE             0x0004")    // want autoinlined attachments
cpp_quote("#define MEO_FLAGS_SLIDESHOW              0x0008")    // show autoinline images as slideshow
cpp_quote("#define MEO_FLAGS_AUTOTEXT               0x0010")    // autotext or not
cpp_quote("#define MEO_FLAGS_BLOCKQUOTE             0x0020")    // blockquote indentation on reply
cpp_quote("#define MEO_FLAGS_SENDIMAGES             0x0040")    // MHTML on or off
cpp_quote("#define MEO_FLAGS_DONTSPELLCHECKQUOTED   0x0080")    // don't spell check quoted text
cpp_quote("#define MEO_FLAGS_SENDEXTERNALIMGSRC     0x0100")    // send external image on reply/fwd
cpp_quote("#define MEO_FLAGS_REPLYATEND             0x0200")    // Insert replies at end of included messages
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MECMDID_VIEWSOURCE options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MECMD_VS_HTML                    0x0001")        // view HTML source
cpp_quote("#define MECMD_VS_MESSAGE                 0x0002")    // view message source
cpp_quote("")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MEST_")  //used by MECMDID_SETSOURCETAB
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MEST_EDIT						0")    // goto the edit tab
cpp_quote("#define MEST_SOURCE	                    1")    // goto the source tab
cpp_quote("#define MEST_PREVIEW                     2")    // goto the preview tab
cpp_quote("#define MEST_NEXT	                    3")    // goto the next tab
cpp_quote("#define MEST_PREVIOUS					4")    // goto the previous tab
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MECMDID_STYLE options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MESTYLE_NOHEADER                0")     // no header at all
cpp_quote("#define MESTYLE_PREVIEW                 1")     // preview header
cpp_quote("#define MESTYLE_FORMATBAR               2")     // formatting bar
cpp_quote("#define MESTYLE_MINIHEADER              3")     // mini header for focus changes
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MECMDID_HEADER_TYLE options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MEHEADER_NONE            0x00")
cpp_quote("#define MEHEADER_NEWS            0x01")
cpp_quote("#define MEHEADER_MAIL            0x02")
cpp_quote("#define MEHEADER_FORCE_ENGLISH   0x04")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MECMDID_SIGNATURE_ENABLED options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MESIG_AUTO                0x0001")
cpp_quote("#define MESIG_MANUAL              0x0002")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MECMDID_SIGNATURE_OPTIONS options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MESIGOPT_PLAIN            0x0001")
cpp_quote("#define MESIGOPT_TOP              0x0002")
cpp_quote("#define MESIGOPT_PREFIX           0x0004")
cpp_quote("#define MESIGOPT_BOTTOM           0x0008")
cpp_quote("#define MESIGOPT_HTML             0x0010")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MEHOSTCMDID_BORDERFLAGS options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MEBF_OUTERCLIENTEDGE  0x0001")
cpp_quote("#define MEBF_INNERCLIENTEDGE  0x0002")
cpp_quote("#define MEBF_FORMATBARSEP     0x0004")
cpp_quote("#define MEBF_NOSCROLL         0x0008")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MEHOSTCMDID_SPELL_OPTIONS options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MESPELLOPT_IGNORENUMBER      0x0001")
cpp_quote("#define MESPELLOPT_IGNOREUPPER       0x0002")
cpp_quote("#define MESPELLOPT_IGNOREDBCS        0x0004")
cpp_quote("#define MESPELLOPT_IGNOREPROTECT     0x0008")
cpp_quote("#define MESPELLOPT_IGNOREURL         0x0010")
cpp_quote("#define MESPELLOPT_ALWAYSSUGGEST     0x0020")
cpp_quote("#define MESPELLOPT_CHECKONSEND       0x0040")
cpp_quote("#define MESPELLOPT_CHECKONTYPE       0x0080")
cpp_quote("")
cpp_quote("// -------------------------------------------------------------------------------")
cpp_quote("// MEHOSTCMDID_MESSAGE_TYPE options")
cpp_quote("// -------------------------------------------------------------------------------")
cpp_quote("#define MEMESSAGETYPE_NEWS       0x0001")
cpp_quote("#define MEMESSAGETYPE_MAIL       0x0002")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MEHOSTCMDID_SOURCEEDIT_FLAGS options")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MESRCFLAGS_COLOR      0x0001")
cpp_quote("")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// CMDSETID_MimeEditHost commands")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MEHOSTCMDID_SIGNATURE_ENABLED    1")
cpp_quote("#define MEHOSTCMDID_SIGNATURE_OPTIONS    2")
cpp_quote("#define MEHOSTCMDID_SIGNATURE            3")
cpp_quote("#define MEHOSTCMDID_HEADER_TYPE          4")
cpp_quote("#define MEHOSTCMDID_ONPARSECOMPLETE      5")
cpp_quote("#define MEHOSTCMDID_FLAGS                6")
cpp_quote("#define MEHOSTCMDID_QUOTE_CHAR           7")
cpp_quote("#define MEHOSTCMDID_REPLY_TICK_COLOR     8")
cpp_quote("#define MEHOSTCMDID_COMPOSE_FONT         9")
cpp_quote("#define MEHOSTCMDID_ADD_TO_ADDRESSBOOK  10")
cpp_quote("#define MEHOSTCMDID_ADD_TO_FAVORITES    11")
cpp_quote("#define MEHOSTCMDID_SLIDESHOW_DELAY     12")
cpp_quote("#define MEHOSTCMDID_FONTCACHE           13")
cpp_quote("#define MEHOSTCMDID_BORDERFLAGS         14")
cpp_quote("#define MEHOSTCMDID_SECURITY_ZONE       15")
cpp_quote("#define MEHOSTCMDID_SPELL_OPTIONS       16")
cpp_quote("#define MEHOSTCMDID_SAVEATTACH_PATH     17")
cpp_quote("#define MEHOSTCMDID_SOURCEEDIT_FLAGS    18")
cpp_quote("#define MEHOSTCMDID_SPELL_LANGUAGE      19")
cpp_quote("#define MEHOSTCMDID_HTML_HELP           20")
cpp_quote("#define MEHOSTCMDID_UNSAFEATTACHMENTS   21")
cpp_quote("#define MEHOSTCMDID_IS_READ_IN_TEXT_ONLY 22")
cpp_quote("#define MEHOSTCMDID_QUOTE_SPACES                 23")
cpp_quote("#define MEHOSTCMDID_BLOCK_EXTERNAL_CONTENT       24")
cpp_quote("#define MEHOSTCMDID_RELOAD_WITH_EXTERNAL_CONTENT 25")
cpp_quote("#define MEHOSTCMDID_GETCOMPOSEFONT	            26")
cpp_quote("#define MEHOSTCMDID_RESETSETTINGS                27")
cpp_quote("#define MEHOSTCMDID_GETREADFONT                  28")
cpp_quote("#define MEHOSTCMDID_MESSAGE_TYPE                 29")
cpp_quote("#define MEHOSTCMDID_COMMUNITIES                  30")
cpp_quote("#define MEHOSTCMDID_COMMUNITIES_SERVER           31")
cpp_quote("#define MEHOSTCMDID_PASSPORT_AUTHENTICATED       32")
cpp_quote("#define MEHOSTCMDID_COMMUNITYSITE                33")
cpp_quote("#define MEHOSTCMDID_PASSPORT_MANAGER             34")
cpp_quote("#define MEHOSTCMDID_COMMUNITY_VOTE               35")
cpp_quote("#define MEHOSTCMDID_PHISHING_SITE                36")
cpp_quote("#define MEHOSTCMDID_CHARSET                      37")
cpp_quote("#define MEHOSTCMDID_USE_WEBPREVIEW_SECURITY      38")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MimeOLE Exported C API Functions")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#ifdef __cplusplus")
cpp_quote("extern \"C\" {")
cpp_quote("#endif // __cplusplus")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Depends")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#include <urlmon.h>")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// API Name Decoration")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#if !defined(_MIMEOLE_)")
cpp_quote("#define MIMEOLEAPI EXTERN_C DECLSPEC_IMPORT HRESULT WINAPI")
cpp_quote("#define MIMEOLEAPI_(_type_) EXTERN_C DECLSPEC_IMPORT _type_ WINAPI")
cpp_quote("#else")
cpp_quote("#define MIMEOLEAPI EXTERN_C HRESULT WINAPI")
cpp_quote("#define MIMEOLEAPI_(_type_) EXTERN_C _type_ WINAPI")
cpp_quote("#endif // _MIMEOLE_")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Constants")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define NOFLAGS                 0")
cpp_quote("#define CCHMAX_CID              255")
cpp_quote("#define CCHMAX_MID              255")
cpp_quote("#define CCHMAX_INTERNET_DATE    50")
cpp_quote("")
cpp_quote("#define MECD_HTML                0x0001")
cpp_quote("#define MECD_PLAINTEXT           0x0002")
cpp_quote("#define MECD_ENCODEIMAGES        0x0004")
cpp_quote("#define MECD_ENCODEFILEURLSONLY  0x0008")
cpp_quote("#define MECD_ENCODESOUNDS        0x0010")
cpp_quote("#define MECD_ENCODEVIDEO         0x0020")
cpp_quote("#define MECD_ENCODEPLUGINS       0x0040")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// Macros")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("#define MimeOleVariantInit(_pProp) \\")
cpp_quote("    ZeroMemory(_pProp, sizeof(PROPVARIANT))")
cpp_quote("")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MimeOLE API Prototypes")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("")
cpp_quote("#define MIMEOLE_COMPAT_OE5 0x00000001")
cpp_quote("#define MIMEOLE_COMPAT_MLANG2 0x00000002")
cpp_quote("MIMEOLEAPI MimeOleSetCompatMode(")
cpp_quote("            /* in */        DWORD               dwMode);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleContentTypeFromUrl(")
cpp_quote("            /* in */        LPCSTR              pszBase,")
cpp_quote("            /* in */        LPCSTR              pszUrl,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszCntType);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleParseMhtmlUrl(")
cpp_quote("            /* in */        __in LPSTR          pszUrl,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszRootUrl,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszBodyUrl);")
cpp_quote("")
cpp_quote("#ifndef MAC")
cpp_quote("MIMEOLEAPI MimeOleObjectFromUrl(")
cpp_quote("            /* in */        LPCSTR              pszUrl,")
cpp_quote("            /* in */        BOOL                fCreate,")
cpp_quote("            /* in */        REFIID              riid, ")
cpp_quote("            /* out */       LPVOID              *ppvObject, ")
cpp_quote("            /* out */       IUnknown            **ppUnkKeepAlive);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleObjectFromMoniker(")
cpp_quote("            /* in */        BINDF               bindf,")
cpp_quote("            /* in */        IMoniker            *pmkOriginal,")
cpp_quote("            /* in */        IBindCtx            *pBindCtx,")
cpp_quote("            /* in */        REFIID              riid, ")
cpp_quote("            /* out */       LPVOID              *ppvObject,")
cpp_quote("            /* out */       IMoniker            **ppmkNew);")
cpp_quote("#endif   // !MAC")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCombineURL(")
cpp_quote("            __in_ecount(cchBase) LPCSTR          pszBase,")
cpp_quote("                                 ULONG           cchBase,")
cpp_quote("            __in_ecount(cchURL)  LPCSTR          pszURL,")
cpp_quote("                                 ULONG           cchURL,")
cpp_quote("                                 BOOL            fUnEscape,")
cpp_quote("            __deref_out          LPSTR           *ppszAbsolute);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetSubjectFileName(")
cpp_quote("            /* in */        IMimePropertySet    *pPropertySet,")
cpp_quote("            /* out */       ULONG               *pulPart,")
cpp_quote("            /* out */       ULONG               *pulTotal,")
cpp_quote("            /* in,out */    __out_ecount(cchMax) LPSTR  pszFileName,")
cpp_quote("            /* in */        ULONG               cchMax);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateWebDocument(")
cpp_quote("            /* in */        LPCSTR              pszBase,")
cpp_quote("            /* in */        LPCSTR              pszURL,")
cpp_quote("            /* out */       IMimeWebDocument    **ppDocument);")
cpp_quote("    ")
cpp_quote("MIMEOLEAPI MimeOleGetRelatedSection(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        boolean             fCreate,")
cpp_quote("            /* out */       LPHBODY             phRelated,")
cpp_quote("            /* out */       boolean             *pfMultiple);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetMixedSection(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        boolean             fCreate,")
cpp_quote("            /* out */       LPHBODY             phMixed,")
cpp_quote("            /* out */       boolean             *pfMultiple);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetAlternativeSection(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* out */       LPHBODY             phAlternative,")
cpp_quote("            /* out */       boolean             *pfMultiple);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGenerateCID(")
cpp_quote("            /* in,out */    __out_ecount(cchMax) LPSTR  pszCID,")
cpp_quote("            /* in */        ULONG               cchMax,")
cpp_quote("            /* in */        boolean             fAbsolute);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGenerateMID(")
cpp_quote("            /* in,out */    __out_ecount(cchMax) LPSTR  pszMID,")
cpp_quote("            /* in */        ULONG               cchMax,")
cpp_quote("            /* in */        boolean             fAbsolute);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateByteStream(")
cpp_quote("            /* out */       IStream             **ppStream);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetPropertySchema(")
cpp_quote("            /* out */       IMimePropertySchema **ppSchema);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleQueryString(")
cpp_quote("            /* in */        LPCSTR              pszSearchMe,")
cpp_quote("            /* in */        LPCSTR              pszCriteria,")
cpp_quote("            /* in */        boolean             fSubString,")
cpp_quote("            /* in */        boolean             fCaseSensitive);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetPropA(")
cpp_quote("            /* in */        IMimePropertySet    *pPropertyset,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSetPropA(")
cpp_quote("            /* in */        IMimePropertySet    *pPropertyset,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* in */        LPCSTR              pszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetPropW(")
cpp_quote("            /* in */        IMimePropertySet    *pPropertyset,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* out */       __deref_out LPWSTR  *ppszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSetPropW(")
cpp_quote("            /* in */        IMimePropertySet    *pPropertyset,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* in */        __deref_out LPWSTR  pszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetBodyPropA(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        HBODY               hBody,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSetBodyPropA(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        HBODY               hBody,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* in */        LPCSTR              pszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetBodyPropW(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        HBODY               hBody,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* out */       __deref_out LPWSTR  *ppszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSetBodyPropW(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree,")
cpp_quote("            /* in */        HBODY               hBody,")
cpp_quote("            /* in */        LPCSTR              pszName,")
cpp_quote("            /* in */        DWORD               dwFlags,")
cpp_quote("            /* in */        LPCWSTR             pszData);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateHeaderTable(")
cpp_quote("            /* out */       IMimeHeaderTable    **ppTable);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleVariantFree(")
cpp_quote("            /* in,out */    LPPROPVARIANT       pProp);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleVariantCopy(")
cpp_quote("            /* out */       LPPROPVARIANT       pDest, ")
cpp_quote("            /* in */        LPPROPVARIANT       pSource);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetExtClassId(")
cpp_quote("            /* in */        LPCSTR              pszExtension, ")
cpp_quote("            /* out */       LPCLSID             pclsid);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleEncodeHeader(")
cpp_quote("            /* in */        HCHARSET            hCharset, ")
cpp_quote("            /* in */        LPPROPVARIANT       pData, ")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszEncoded, ")
cpp_quote("            /* in,out */    LPRFC1522INFO       pRfc1522Info);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleDecodeHeader(")
cpp_quote("            /* in */        HCHARSET            hCharset, ")
cpp_quote("            /* in */        LPCSTR              pszData, ")
cpp_quote("            /* out */       LPPROPVARIANT       pDecoded, ")
cpp_quote("            /* in,out */    LPRFC1522INFO       pRfc1522Info);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleRfc1522Decode(")
cpp_quote("            /* in */  __in                       LPCSTR              pszValue,")
cpp_quote("            /* in */  __out_ecount_opt(cchmax)   LPSTR               pszCharset, ")
cpp_quote("            /* in */                             ULONG               cchmax, ")
cpp_quote("            /* out */ __out_opt                  LPSTR               *ppszDecoded);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleRfc1522Encode(")
cpp_quote("            /* in */  __in   LPCSTR              pszValue, ")
cpp_quote("            /* in */  __in   HCHARSET            hCharset, ")
cpp_quote("            /* out */ __out  LPSTR               *ppszEncoded);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetInternat(")
cpp_quote("            /* out */       IMimeInternational  **ppInternat);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleFindCharset(")
cpp_quote("            /* in */        LPCSTR              pszCharset, ")
cpp_quote("            /* out */       LPHCHARSET          phCharset);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetCharsetInfo(")
cpp_quote("            /* in */        HCHARSET            hCharset, ")
cpp_quote("            /* out */       LPINETCSETINFO      pCsetInfo);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetCodePageInfo(")
cpp_quote("            /* in */        CODEPAGEID          cpiCodePage, ")
cpp_quote("            /* out */       LPCODEPAGEINFO      pCodePageInfo);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetDefaultCharset(")
cpp_quote("            /* out */       LPHCHARSET          phCharset);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSetDefaultCharset(")
cpp_quote("            /* in */        HCHARSET            hCharset);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetCodePageCharset(")
cpp_quote("            /* in */        CODEPAGEID          cpiCodePage, ")
cpp_quote("            /* in */        CHARSETTYPE         ctCsetType, ")
cpp_quote("            /* out */       LPHCHARSET          phCharset);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateVirtualStream(")
cpp_quote("            /* out */       IStream             **ppStream);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleOpenFileStream(")
cpp_quote("            /* in */        LPCSTR              pszFilePath, ")
cpp_quote("            /* in */        DWORD               dwCreationDistribution, ")
cpp_quote("            /* in */        DWORD               dwAccess, ")
cpp_quote("            /* out */       IStream             **ppstmFile);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleIsTnefStream(")
cpp_quote("            /* in */        IStream             *pStream);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGenerateFileName(")
cpp_quote("            /* in */        LPCSTR              pszContentType, ")
cpp_quote("            /* in */        LPCSTR              pszSuggest, ")
cpp_quote("            /* in */        LPCSTR              pszDefaultExt, ")
cpp_quote("            /* in,out */    __deref_out LPSTR   *ppszFileName);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetFileExtension(")
cpp_quote("            /* in */        LPCSTR              pszFilePath, ")
cpp_quote("            /* in,out */    __out_ecount(cchMax) LPSTR  pszExt, ")
cpp_quote("            /* in */        ULONG               cchMax);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateSecurity(")
cpp_quote("            /* out */       IMimeSecurity       **ppSecurity);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleInetDateToFileTime(")
cpp_quote("            /* in */        LPCSTR              pszDate, ")
cpp_quote("            /* out */       LPFILETIME          pft);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleFileTimeToInetDate(")
cpp_quote("            /* in */        LPFILETIME          pft, ")
cpp_quote("            /* in,out */    __out_ecount(cchMax) LPSTR  pszDate, ")
cpp_quote("            /* in */        ULONG               cchMax);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateMessageParts(")
cpp_quote("            /* out */       IMimeMessageParts   **ppParts);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetAllocator(")
cpp_quote("            /* out */       IMimeAllocator      **ppAllocator);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleParseRfc822Address(")
cpp_quote("            /* in */        DWORD               dwAdrType,")
cpp_quote("            /* in */        ENCODINGTYPE        ietEncoding,")
cpp_quote("            /* in */        LPCSTR              pszRfc822Adr, ")
cpp_quote("            /* out */       LPADDRESSLIST       pList);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateMessage(")
cpp_quote("            /* in */        IUnknown            *pUnkOuter,")
cpp_quote("            /* out */       IMimeMessage        **ppMessage);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleMergePartialHeaders(")
cpp_quote("            /* in */        IStream             *pstmIn, ")
cpp_quote("            /* in */        IStream             *pstmOut);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleEscapeString(")
cpp_quote("            /* in */        CODEPAGEID          cpiCodePage, ")
cpp_quote("            /* in */        LPCSTR              pszIn, ")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszOut);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleUnEscapeStringInPlace(")
cpp_quote("            /* in, out*/    __inout_opt LPSTR   pszIn);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetExtContentType(")
cpp_quote("            /* in */        LPCSTR              pszExtension,")
cpp_quote("            /* out */       __deref_out LPSTR   *ppszContentType);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetExtContentTypeW(")
cpp_quote("            /* in */        LPCWSTR             pszExtension,")
cpp_quote("            /* out */       __deref_out LPWSTR  *ppszContentType);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetContentTypeExt(")
cpp_quote("            /* in */        LPCSTR              pszContentType, ")
cpp_quote("            /* out */       __deref_out LPSTR  *ppszExtension);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetFileInfo(")
cpp_quote("            /* in */        __in LPSTR            pszFilePath, ")
cpp_quote("            /* out */       __deref_opt_out LPSTR *ppszCntType,")
cpp_quote("            /* out */       __deref_opt_out LPSTR *ppszSubType,")
cpp_quote("            /* out */       __deref_opt_out LPSTR *ppszCntDesc,")
cpp_quote("            /* out */       __deref_opt_out LPSTR *ppszFileName,")
cpp_quote("            /* out */       __deref_opt_out LPSTR *ppszExtension);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetFileInfoW(")
cpp_quote("            /* in */        __in LPWSTR            pszFilePath, ")
cpp_quote("            /* out */       __deref_opt_out LPWSTR *ppszCntType,")
cpp_quote("            /* out */       __deref_opt_out LPWSTR *ppszSubType,")
cpp_quote("            /* out */       __deref_opt_out LPWSTR *ppszCntDesc,")
cpp_quote("            /* out */       __deref_opt_out LPWSTR *ppszFileName,")
cpp_quote("            /* out */       __deref_opt_out LPWSTR *ppszExtension);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateBody(")
cpp_quote("            /* out */       IMimeBody           **ppBody);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreatePropertySet(")
cpp_quote("            /* in */        IUnknown            *pUnkOuter, ")
cpp_quote("            /* out */       IMimePropertySet    **ppPropertySet);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateMessageTree(")
cpp_quote("            /* in */        IUnknown            *pUnkOuter, ")
cpp_quote("            /* out */       IMimeMessageTree    **ppMessageTree);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleGetCertsFromThumbprints(")
cpp_quote("            /* in */        THUMBBLOB *const    rgThumbprint,")
cpp_quote("            /* in,out */    X509CERTRESULT *const pResults,")
cpp_quote("            /* in */        const HCERTSTORE *const rghCertStore,")
cpp_quote("            /* in */        const DWORD         cCertStore);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSplitMessage(")
cpp_quote("            /* in */        IMimeMessage        *pMessage,")
cpp_quote("            /* in */        ULONG               cbMaxPart,")
cpp_quote("            /* out */       IMimeMessageParts   **ppParts);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleClearDirtyTree(")
cpp_quote("            /* in */        IMimeMessageTree    *pTree);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleConvertEnrichedToHTML(")
cpp_quote("            /* in */        CODEPAGEID           codepage,")
cpp_quote("            /* in */        IStream             *pIn,")
cpp_quote("            /* in */        IStream             *pOut);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleIsEnrichedStream(")
cpp_quote("            /* in */        IStream             *pStream);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapsToDlg(")
cpp_quote("            /* in */         LPBYTE          pbSMimeCaps,")
cpp_quote("            /* in */         DWORD           cbSMimeCaps,")
cpp_quote("            /* in */         DWORD           cCerts,")
cpp_quote("            /* in */         PCX509CERT *    rgCerts,")
cpp_quote("            /* in */         HWND            hwndDlg,")
cpp_quote("            /* in */         DWORD           idEncAlgs,")
cpp_quote("            /* in */         DWORD           idSignAlgs,")
cpp_quote("            /* in */         DWORD           idBlob);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapsFromDlg(")
cpp_quote("             /* in */        HWND            hwnd,")
cpp_quote("             /* in */        DWORD           idEncAlgs,")
cpp_quote("             /* in */        DWORD           idSignAlgs,")
cpp_quote("             /* in */        DWORD           idBlob,")
cpp_quote("             /* in/out */    LPBYTE          pbSMimeCaps,")
cpp_quote("             /* in/out */    DWORD *         pcbSmimeCaps);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapInit(")
cpp_quote("             /* in */        LPBYTE          pbSMimeCap,")
cpp_quote("             /* in */        DWORD           cbSMimeCap,")
cpp_quote("             /* out */       LPVOID *        ppv);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapAddSMimeCap(")
cpp_quote("             /* in */        LPBYTE          pbSMimeCap,")
cpp_quote("             /* in */        DWORD           cbSMimeCap,")
cpp_quote("             /* in/out */    LPVOID          pv);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapAddCert(")
cpp_quote("             /* in */        LPBYTE          pbCert,")
cpp_quote("             /* in */        DWORD           cbCert,")
cpp_quote("             /* in */        BOOL        fParanoid,")
cpp_quote("             /* in/out */    LPVOID          pv);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapGetEncAlg(")
cpp_quote("             /* in */        LPVOID          pv,")
cpp_quote("             /* in/out */    LPBYTE          pbEncode,")
cpp_quote("             /* in/out */    DWORD *         pcbEncode,")
cpp_quote("             /* in/out */    DWORD *         pdwBits);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapGetHashAlg(")
cpp_quote("             /* in */        LPVOID          pv,")
cpp_quote("             /* in/out */    LPBYTE          pbEncode,")
cpp_quote("             /* in/out */    DWORD *         pcbEncode,")
cpp_quote("             /* in/out */    DWORD *         pfBlobSign);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapRelease(")
cpp_quote("             /* in */        LPVOID          pv);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleAlgNameFromSMimeCap(")
cpp_quote("             /* in */        LPBYTE          pb,")
cpp_quote("             /* in */        DWORD           cb,")
cpp_quote("             /* out */       LPCSTR *        ppzProtocol);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleAlgStrengthFromSMimeCap(")
cpp_quote("             /* in */        LPBYTE          pb,")
cpp_quote("             /* in */        DWORD           cb,")
cpp_quote("             /* in */        BOOL            fEncryption,")
cpp_quote("             /* out */       DWORD *         pdwStrength);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleSMimeCapsFull(")
cpp_quote("		/* in */	LPVOID 		pv,")
cpp_quote("		/* in */	BOOL		fFullEncryption,")
cpp_quote(" 		/* in */	BOOL 		fFullSigning,")
cpp_quote("		/* in/out */	LPBYTE 		pbSymCaps,")
cpp_quote("		/* in/out */	DWORD * 	pcbSymCaps);")
cpp_quote("")
cpp_quote("")
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleCreateHashTable(")
cpp_quote("            /* in */       DWORD            dwSize,")
cpp_quote("            /* in */       BOOL             fDupeKeys,")
cpp_quote("            /* out */      IHashTable       **ppHashTable);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleStripHeaders(")
cpp_quote("            /* in */       IMimeMessage     *pMessage,")
cpp_quote("            /* in */       HBODY             hBody,")
cpp_quote("            /* in */       LPCSTR            pszNameDelete,")
cpp_quote("            /* in */       LPCSTR            pszHeaderAdd,")
cpp_quote("            /* in */       IStream         **ppStream);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeOleParseRfc822AddressW(")
cpp_quote("            /* in */        DWORD               dwAdrType,")
cpp_quote("            /* in */        LPCWSTR             pwszRfc822Adr, ")
cpp_quote("            /* out */       LPADDRESSLIST       pList);")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("")
cpp_quote("#if (_WIN32_OE >= 0x0500)")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("// MimeEdit API Prototypes")
cpp_quote("// --------------------------------------------------------------------------------")
cpp_quote("MIMEOLEAPI MimeEditViewSource(")
cpp_quote("            /* in */        HWND                hwndParent,")
cpp_quote("            /* in */        IMimeMessage        *pMsg);")
cpp_quote("")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeEditIsSafeToRun(")
cpp_quote("            /* in */        HWND                hwndParent,")
cpp_quote("            /* in */        LPCSTR              lpszFileName,")
cpp_quote("            /* in */        BOOL                fPrompt);")
cpp_quote("")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeEditVerifyTrust(")
cpp_quote("            /* in */        HWND                hwndParent,")
cpp_quote("            /* in */        LPCSTR              lpszFileName,")
cpp_quote("            /* in */        LPCSTR              lpszPathName);")
cpp_quote("")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeEditCreateMimeDocument(")
cpp_quote("            /* in */        IUnknown             *pDoc,")
cpp_quote("            /* in */        IMimeMessage         *pMsgSrc,")
cpp_quote("            /* in */        DWORD                dwFlags,")
cpp_quote("            /* out */       IMimeMessage         **ppMsg);")
cpp_quote("")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeEditGetBackgroundImageUrl(")
cpp_quote("            /* in */        IUnknown             *pDoc,")
cpp_quote("            /* out */       BSTR                 *pbstr);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeEditDocumentFromStream(")
cpp_quote("            /* in */        IStream              *pstm,")
cpp_quote("            /* in */        REFIID               riid,")
cpp_quote("            /* out */       void                 **ppDoc);")
cpp_quote("")
cpp_quote("MIMEOLEAPI MimeGetAddressFormatW(")
cpp_quote("            /* in */        REFIID               riid,")
cpp_quote("            /* in */        LPVOID               pvObject,")
cpp_quote("            /* in */        DWORD                dwAdrType,")
cpp_quote("            /* in */        ADDRESSFORMAT        format,")
cpp_quote("            /* out */       __deref_out LPWSTR   *ppszFormat);")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("")
cpp_quote("#if (_WIN32_OE >= 0x501)")
cpp_quote("#ifdef __WINCRYPT_H__")
cpp_quote("//+-------------------------------------------------------------------------")
cpp_quote("//  RecipientID")
cpp_quote("//")
cpp_quote("//  The value of dwRecepintType MUST be 0.")
cpp_quote("//--------------------------------------------------------------------------")
cpp_quote("#define szOID_Microsoft_Encryption_Cert   \"1.3.6.1.4.1.311.16.4\"")
cpp_quote("typedef struct _CRYPT_RECIPIENT_ID {")
cpp_quote("    DWORD               dwRecipientType;")
cpp_quote("    CERT_NAME_BLOB      Issuer;")
cpp_quote("    CRYPT_INTEGER_BLOB  SerialNumber;")
cpp_quote("} CRYPT_RECIPIENT_ID, * PCRYPT_RECIPIENT_ID;")
cpp_quote("#endif // __WINCRYPT_H__")
cpp_quote("")
cpp_quote("#endif //_WIN32_OE")
cpp_quote("#ifdef __cplusplus")
cpp_quote("}")
cpp_quote("#endif // __cplusplus")
cpp_quote("")
cpp_quote("#ifdef UNICODE")
cpp_quote("// Restoring predefined unicode macros")
cpp_quote("#pragma pop_macro(\"GetProp\")")
cpp_quote("#pragma pop_macro(\"SetProp\")")
cpp_quote("#endif // UNICODE")

