|
|
|
//=============================================================================
|
|
|
|
// File: dw_mime.cpp
|
|
|
|
// Contents: Various functions
|
|
|
|
// Maintainer: Doug Sauder <dwsauder@fwb.gulf.net>
|
|
|
|
// WWW: http://www.fwb.gulf.net/~dwsauder/mimepp.html
|
|
|
|
//
|
|
|
|
// Copyright (c) 1996, 1997 Douglas W. Sauder
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// IN NO EVENT SHALL DOUGLAS W. SAUDER BE LIABLE TO ANY PARTY FOR DIRECT,
|
|
|
|
// INDIRECT, SPECIAL, INCIDENTAL, OR CONSETQUENTIAL DAMAGES ARISING OUT OF
|
|
|
|
// THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF DOUGLAS W. SAUDER
|
|
|
|
// HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
|
|
|
// DOUGLAS W. SAUDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT
|
|
|
|
// NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
|
|
|
// PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS"
|
|
|
|
// BASIS, AND DOUGLAS W. SAUDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
|
|
|
|
// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
#define DW_IMPLEMENTATION
|
|
|
|
|
|
|
|
#include <mimelib/config.h>
|
|
|
|
#include <mimelib/debug.h>
|
|
|
|
#include <mimelib/string.h>
|
|
|
|
#include <mimelib/msgcmp.h>
|
|
|
|
#include <mimelib/enum.h>
|
|
|
|
#include <mimelib/utility.h>
|
|
|
|
|
|
|
|
|
|
|
|
void DwInitialize()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DwFinalize()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int DwCteStrToEnum(const DwString& aStr)
|
|
|
|
{
|
|
|
|
int cte = DwMime::kCteUnknown;
|
|
|
|
int ch = aStr[0];
|
|
|
|
switch (ch) {
|
|
|
|
case '7':
|
|
|
|
if( DwStrcasecmp(aStr, "7bit") == 0 ) {
|
|
|
|
cte = DwMime::kCte7bit;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case '8':
|
|
|
|
if (DwStrcasecmp(aStr, "8bit") == 0) {
|
|
|
|
cte = DwMime::kCte8bit;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'B':
|
|
|
|
case 'b':
|
|
|
|
if (DwStrcasecmp(aStr, "base64") == 0) {
|
|
|
|
cte = DwMime::kCteBase64;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "binary") == 0) {
|
|
|
|
cte = DwMime::kCteBinary;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'Q':
|
|
|
|
case 'q':
|
|
|
|
if (DwStrcasecmp(aStr, "quoted-printable") == 0) {
|
|
|
|
cte = DwMime::kCteQuotedPrintable;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return cte;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DwCteEnumToStr(int aEnum, DwString& aStr)
|
|
|
|
{
|
|
|
|
switch (aEnum) {
|
|
|
|
case DwMime::kCte7bit:
|
|
|
|
aStr = "7bit";
|
|
|
|
break;
|
|
|
|
case DwMime::kCte8bit:
|
|
|
|
aStr = "8bit";
|
|
|
|
break;
|
|
|
|
case DwMime::kCteBinary:
|
|
|
|
aStr = "binary";
|
|
|
|
break;
|
|
|
|
case DwMime::kCteBase64:
|
|
|
|
aStr = "base64";
|
|
|
|
break;
|
|
|
|
case DwMime::kCteQuotedPrintable:
|
|
|
|
aStr = "quoted-printable";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int DwTypeStrToEnum(const DwString& aStr)
|
|
|
|
{
|
|
|
|
int type = DwMime::kTypeUnknown;
|
|
|
|
int ch = aStr[0];
|
|
|
|
switch (ch) {
|
|
|
|
case 'A':
|
|
|
|
case 'a':
|
|
|
|
if (DwStrcasecmp(aStr, "application") == 0) {
|
|
|
|
type = DwMime::kTypeApplication;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "audio") == 0) {
|
|
|
|
type = DwMime::kTypeAudio;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'I':
|
|
|
|
case 'i':
|
|
|
|
if (DwStrcasecmp(aStr, "image") == 0) {
|
|
|
|
type = DwMime::kTypeImage;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'M':
|
|
|
|
case 'm':
|
|
|
|
if (DwStrcasecmp(aStr, "message") == 0) {
|
|
|
|
type = DwMime::kTypeMessage;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "multipart") == 0) {
|
|
|
|
type = DwMime::kTypeMultipart;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'T':
|
|
|
|
case 't':
|
|
|
|
if (DwStrcasecmp(aStr, "text") == 0) {
|
|
|
|
type = DwMime::kTypeText;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'V':
|
|
|
|
case 'v':
|
|
|
|
if (DwStrcasecmp(aStr, "video") == 0) {
|
|
|
|
type = DwMime::kTypeVideo;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
type = DwMime::kTypeNull;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DwTypeEnumToStr(int aEnum, DwString& aStr)
|
|
|
|
{
|
|
|
|
switch (aEnum) {
|
|
|
|
case DwMime::kTypeNull:
|
|
|
|
aStr = "";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeUnknown:
|
|
|
|
default:
|
|
|
|
aStr = "Unknown";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeText:
|
|
|
|
aStr = "Text";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeMultipart:
|
|
|
|
aStr = "Multipart";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeMessage:
|
|
|
|
aStr = "Message";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeApplication:
|
|
|
|
aStr = "Application";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeImage:
|
|
|
|
aStr = "Image";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeAudio:
|
|
|
|
aStr = "Audio";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeVideo:
|
|
|
|
aStr = "Video";
|
|
|
|
break;
|
|
|
|
case DwMime::kTypeModel:
|
|
|
|
aStr = "Model";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int DwSubtypeStrToEnum(const DwString& aStr)
|
|
|
|
{
|
|
|
|
if (aStr.empty()) {
|
|
|
|
return DwMime::kSubtypeNull;
|
|
|
|
}
|
|
|
|
int type = DwMime::kSubtypeUnknown;
|
|
|
|
int ch = aStr[0];
|
|
|
|
switch (ch) {
|
|
|
|
case 'A':
|
|
|
|
case 'a':
|
|
|
|
if (DwStrcasecmp(aStr, "alternative") == 0) {
|
|
|
|
type = DwMime::kSubtypeAlternative;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'B':
|
|
|
|
case 'b':
|
|
|
|
if (DwStrcasecmp(aStr, "basic") == 0) {
|
|
|
|
type = DwMime::kSubtypeBasic;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'C':
|
|
|
|
case 'c':
|
|
|
|
if (DwStrcasecmp(aStr, "calendar") == 0) {
|
|
|
|
type = DwMime::kSubtypeVCal;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'D':
|
|
|
|
case 'd':
|
|
|
|
if (DwStrcasecmp(aStr, "digest") == 0) {
|
|
|
|
type = DwMime::kSubtypeDigest;
|
|
|
|
}
|
|
|
|
if (DwStrcasecmp(aStr, "directory") == 0) {
|
|
|
|
type = DwMime::kSubtypeDirectory;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "disposition-notification") == 0 ) {
|
|
|
|
type = DwMime::kSubtypeDispositionNotification;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'E':
|
|
|
|
case 'e':
|
|
|
|
if (DwStrcasecmp(aStr, "enriched") == 0) {
|
|
|
|
type = DwMime::kSubtypeEnriched;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "external-body") == 0) {
|
|
|
|
type = DwMime::kSubtypeExternalBody;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "encrypted") == 0) {
|
|
|
|
type = DwMime::kSubtypeEncrypted;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'G':
|
|
|
|
case 'g':
|
|
|
|
if (DwStrcasecmp(aStr, "gif") == 0) {
|
|
|
|
type = DwMime::kSubtypeGif;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'H':
|
|
|
|
case 'h':
|
|
|
|
if (DwStrcasecmp(aStr, "html") == 0) {
|
|
|
|
type = DwMime::kSubtypeHtml;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'J':
|
|
|
|
case 'j':
|
|
|
|
if (DwStrcasecmp(aStr, "jpeg") == 0) {
|
|
|
|
type = DwMime::kSubtypeJpeg;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'M':
|
|
|
|
case 'm':
|
|
|
|
if (DwStrcasecmp(aStr, "mixed") == 0) {
|
|
|
|
type = DwMime::kSubtypeMixed;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "mpeg") == 0) {
|
|
|
|
type = DwMime::kSubtypeMpeg;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "ms-tnef") == 0) {
|
|
|
|
type = DwMime::kSubtypeMsTNEF;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'O':
|
|
|
|
case 'o':
|
|
|
|
if (DwStrcasecmp(aStr, "octet-stream") == 0) {
|
|
|
|
type = DwMime::kSubtypeOctetStream;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'P':
|
|
|
|
case 'p':
|
|
|
|
if (DwStrcasecmp(aStr, "plain") == 0) {
|
|
|
|
type = DwMime::kSubtypePlain;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "parallel") == 0) {
|
|
|
|
type = DwMime::kSubtypeParallel;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "partial") == 0) {
|
|
|
|
type = DwMime::kSubtypePartial;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "postscript") == 0) {
|
|
|
|
type = DwMime::kSubtypePostscript;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "pgp-signature") == 0) {
|
|
|
|
type = DwMime::kSubtypePgpSignature;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "pgp-encrypted") == 0) {
|
|
|
|
type = DwMime::kSubtypePgpEncrypted;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "pgp") == 0) {
|
|
|
|
type = DwMime::kSubtypePgpClearsigned;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "pkcs7-signature") == 0) {
|
|
|
|
type = DwMime::kSubtypePkcs7Signature;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "pkcs7-mime") == 0) {
|
|
|
|
type = DwMime::kSubtypePkcs7Mime;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'R':
|
|
|
|
case 'r':
|
|
|
|
if (DwStrcasecmp(aStr, "richtext") == 0) {
|
|
|
|
type = DwMime::kSubtypeRichtext;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "rfc822") == 0) {
|
|
|
|
type = DwMime::kSubtypeRfc822;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "report") == 0) {
|
|
|
|
type = DwMime::kSubtypeReport;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "rtf") == 0) {
|
|
|
|
type = DwMime::kSubtypeRtf;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "related") == 0) {
|
|
|
|
type = DwMime::kSubtypeRelated;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'S':
|
|
|
|
case 's':
|
|
|
|
if (DwStrcasecmp(aStr, "signed") == 0) {
|
|
|
|
type = DwMime::kSubtypeSigned;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'V':
|
|
|
|
case 'v':
|
|
|
|
if (DwStrcasecmp(aStr, "vnd.de.bund.bsi.chiasmus-text") == 0) {
|
|
|
|
type = DwMime::kSubtypeChiasmusText;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'X':
|
|
|
|
case 'x':
|
|
|
|
if (DwStrcasecmp(aStr, "x-vcard") == 0) {
|
|
|
|
type = DwMime::kSubtypeXVCard;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "x-pkcs7-signature") == 0) {
|
|
|
|
type = DwMime::kSubtypePkcs7Signature;
|
|
|
|
}
|
|
|
|
else if (DwStrcasecmp(aStr, "x-pkcs7-mime") == 0) {
|
|
|
|
type = DwMime::kSubtypePkcs7Mime;
|
|
|
|
}
|
|
|
|
if (DwStrcasecmp(aStr, "x-diff") == 0) {
|
|
|
|
type = DwMime::kSubtypeXDiff;
|
|
|
|
}
|
|
|
|
if (DwStrcasecmp(aStr, "x-vcalendar") == 0) {
|
|
|
|
type = DwMime::kSubtypeVCal;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return type;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void DwSubtypeEnumToStr(int aEnum, DwString& aStr)
|
|
|
|
{
|
|
|
|
switch (aEnum) {
|
|
|
|
case DwMime::kSubtypeNull:
|
|
|
|
aStr = "";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeUnknown:
|
|
|
|
default:
|
|
|
|
aStr = "Unknown";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePlain:
|
|
|
|
aStr = "Plain";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeRichtext:
|
|
|
|
aStr = "Richtext";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeEnriched:
|
|
|
|
aStr = "Enriched";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeHtml:
|
|
|
|
aStr = "HTML";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeVCal:
|
|
|
|
aStr = "Calendar";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeXVCard:
|
|
|
|
aStr = "X-VCard";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeDirectory:
|
|
|
|
aStr = "Directory";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeXDiff:
|
|
|
|
aStr = "X-Diff";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeRtf:
|
|
|
|
aStr = "RTF";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeMixed:
|
|
|
|
aStr = "Mixed";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeSigned:
|
|
|
|
aStr = "Signed";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeEncrypted:
|
|
|
|
aStr = "Encrypted";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeAlternative:
|
|
|
|
aStr = "Alternative";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeDigest:
|
|
|
|
aStr = "Digest";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeParallel:
|
|
|
|
aStr = "Parallel";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeReport:
|
|
|
|
aStr = "report";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeRelated:
|
|
|
|
aStr = "Related";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeRfc822:
|
|
|
|
aStr = "Rfc822";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeDispositionNotification:
|
|
|
|
aStr = "disposition-notification";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePartial:
|
|
|
|
aStr = "Partial";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeExternalBody:
|
|
|
|
aStr = "External-body";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePostscript:
|
|
|
|
aStr = "Postscript";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeOctetStream:
|
|
|
|
aStr = "Octet-stream";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePgpSignature:
|
|
|
|
aStr = "pgp-signature";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePgpEncrypted:
|
|
|
|
aStr = "pgp-encrypted";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePgpClearsigned:
|
|
|
|
aStr = "pgp";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePkcs7Signature:
|
|
|
|
aStr = "pkcs7-signature";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypePkcs7Mime:
|
|
|
|
aStr = "pkcs7-mime";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeMsTNEF:
|
|
|
|
aStr = "ms-tnef";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeChiasmusText:
|
|
|
|
aStr = "vnd.de.bund.bsi.chiasmus-text";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeJpeg:
|
|
|
|
aStr = "jpeg";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeGif:
|
|
|
|
aStr = "gif";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeBasic:
|
|
|
|
aStr = "basic";
|
|
|
|
break;
|
|
|
|
case DwMime::kSubtypeMpeg:
|
|
|
|
aStr = "mpeg";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|