diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/abstract/MCMessageConstants.h | 387 | ||||
-rw-r--r-- | src/core/basetypes/MCConnectionLogger.h | 15 | ||||
-rw-r--r-- | src/core/basetypes/MCConnectionLoggerUtils.cc | 19 | ||||
-rw-r--r-- | src/core/basetypes/MCHTMLCleaner.cc | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.cpp | 16 | ||||
-rw-r--r-- | src/core/basetypes/MCLibetpan.h | 14 | ||||
-rw-r--r-- | src/core/basetypes/MCObject.cc | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueue.cc | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCOperationQueueCallback.h | 4 | ||||
-rw-r--r-- | src/core/basetypes/MCString.cc | 54 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.cc | 24 | ||||
-rw-r--r-- | src/core/imap/MCIMAPSession.h | 6 | ||||
-rw-r--r-- | src/core/pop/MCPOPSession.cc | 5 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.cc | 108 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.h | 4 | ||||
-rw-r--r-- | src/core/provider/MCNetService.cc | 62 | ||||
-rw-r--r-- | src/core/provider/MCNetService.h | 53 | ||||
-rw-r--r-- | src/core/smtp/MCSMTPSession.cc | 7 |
18 files changed, 461 insertions, 326 deletions
diff --git a/src/core/abstract/MCMessageConstants.h b/src/core/abstract/MCMessageConstants.h index 417bdb6c..9e1b46b7 100644 --- a/src/core/abstract/MCMessageConstants.h +++ b/src/core/abstract/MCMessageConstants.h @@ -4,214 +4,215 @@ #ifdef __cplusplus namespace mailcore { - - enum ConnectionType { - ConnectionTypeClear = 1 << 0, - ConnectionTypeStartTLS = 1 << 1, - ConnectionTypeTLS = 1 << 2, - }; + + enum ConnectionType { + ConnectionTypeClear = 1 << 0, + ConnectionTypeStartTLS = 1 << 1, + ConnectionTypeTLS = 1 << 2, + }; - enum AuthType { - AuthTypeSASLNone = 0, - AuthTypeSASLCRAMMD5 = 1 << 0, - AuthTypeSASLPlain = 1 << 1, - AuthTypeSASLGSSAPI = 1 << 2, - AuthTypeSASLDIGESTMD5 = 1 << 3, - AuthTypeSASLLogin = 1 << 4, - AuthTypeSASLSRP = 1 << 5, - AuthTypeSASLNTLM = 1 << 6, - AuthTypeSASLKerberosV4 = 1 << 7, - }; + enum AuthType { + AuthTypeSASLNone = 0, + AuthTypeSASLCRAMMD5 = 1 << 0, + AuthTypeSASLPlain = 1 << 1, + AuthTypeSASLGSSAPI = 1 << 2, + AuthTypeSASLDIGESTMD5 = 1 << 3, + AuthTypeSASLLogin = 1 << 4, + AuthTypeSASLSRP = 1 << 5, + AuthTypeSASLNTLM = 1 << 6, + AuthTypeSASLKerberosV4 = 1 << 7, + AuthTypeXOAuth2 = 1 << 8, + }; - enum IMAPFolderFlag { - IMAPFolderFlagNone = 0, - IMAPFolderFlagMarked = 1 << 0, - IMAPFolderFlagUnmarked = 1 << 1, - IMAPFolderFlagNoSelect = 1 << 2, - IMAPFolderFlagNoInferiors = 1 << 3, - IMAPFolderFlagInbox = 1 << 4, - IMAPFolderFlagSentMail = 1 << 5, - IMAPFolderFlagStarred = 1 << 6, - IMAPFolderFlagAllMail = 1 << 7, - IMAPFolderFlagTrash = 1 << 8, - IMAPFolderFlagDrafts = 1 << 9, - IMAPFolderFlagSpam = 1 << 10, - IMAPFolderFlagImportant = 1 << 11, - IMAPFolderFlagArchive = 1 << 12, + enum IMAPFolderFlag { + IMAPFolderFlagNone = 0, + IMAPFolderFlagMarked = 1 << 0, + IMAPFolderFlagUnmarked = 1 << 1, + IMAPFolderFlagNoSelect = 1 << 2, + IMAPFolderFlagNoInferiors = 1 << 3, + IMAPFolderFlagInbox = 1 << 4, + IMAPFolderFlagSentMail = 1 << 5, + IMAPFolderFlagStarred = 1 << 6, + IMAPFolderFlagAllMail = 1 << 7, + IMAPFolderFlagTrash = 1 << 8, + IMAPFolderFlagDrafts = 1 << 9, + IMAPFolderFlagSpam = 1 << 10, + IMAPFolderFlagImportant = 1 << 11, + IMAPFolderFlagArchive = 1 << 12, IMAPFolderFlagAll = IMAPFolderFlagAllMail, IMAPFolderFlagJunk = IMAPFolderFlagSpam, IMAPFolderFlagFlagged = IMAPFolderFlagStarred, - }; + }; - enum MessageFlag { - MessageFlagNone = 0, - MessageFlagSeen = 1 << 0, - MessageFlagAnswered = 1 << 1, - MessageFlagFlagged = 1 << 2, - MessageFlagDeleted = 1 << 3, - MessageFlagDraft = 1 << 4, - MessageFlagMDNSent = 1 << 5, - MessageFlagForwarded = 1 << 6, - MessageFlagSubmitPending = 1 << 7, - MessageFlagSubmitted = 1 << 8, - } ; + enum MessageFlag { + MessageFlagNone = 0, + MessageFlagSeen = 1 << 0, + MessageFlagAnswered = 1 << 1, + MessageFlagFlagged = 1 << 2, + MessageFlagDeleted = 1 << 3, + MessageFlagDraft = 1 << 4, + MessageFlagMDNSent = 1 << 5, + MessageFlagForwarded = 1 << 6, + MessageFlagSubmitPending = 1 << 7, + MessageFlagSubmitted = 1 << 8, + } ; - enum IMAPMessagesRequestKind { - IMAPMessagesRequestKindUid = 0, // This is the default and it's always fetched - IMAPMessagesRequestKindFlags = 1 << 0, - IMAPMessagesRequestKindHeaders = 1 << 1, - IMAPMessagesRequestKindStructure = 1 << 2, - IMAPMessagesRequestKindInternalDate = 1 << 3, - IMAPMessagesRequestKindFullHeaders = 1 << 4, - IMAPMessagesRequestKindHeaderSubject = 1 << 5, - IMAPMessagesRequestKindGmailLabels = 1 << 6, - IMAPMessagesRequestKindGmailMessageID = 1 << 7, - IMAPMessagesRequestKindGmailThreadID = 1 << 8, - }; + enum IMAPMessagesRequestKind { + IMAPMessagesRequestKindUid = 0, // This is the default and it's always fetched + IMAPMessagesRequestKindFlags = 1 << 0, + IMAPMessagesRequestKindHeaders = 1 << 1, + IMAPMessagesRequestKindStructure = 1 << 2, + IMAPMessagesRequestKindInternalDate = 1 << 3, + IMAPMessagesRequestKindFullHeaders = 1 << 4, + IMAPMessagesRequestKindHeaderSubject = 1 << 5, + IMAPMessagesRequestKindGmailLabels = 1 << 6, + IMAPMessagesRequestKindGmailMessageID = 1 << 7, + IMAPMessagesRequestKindGmailThreadID = 1 << 8, + }; - enum IMAPFetchRequestType { - IMAPFetchRequestTypeUID = 0, - IMAPFetchRequestTypeSequence = 1 - }; + enum IMAPFetchRequestType { + IMAPFetchRequestTypeUID = 0, + IMAPFetchRequestTypeSequence = 1 + }; - enum IMAPStoreFlagsRequestKind { - IMAPStoreFlagsRequestKindAdd, - IMAPStoreFlagsRequestKindRemove, - IMAPStoreFlagsRequestKindSet, - }; + enum IMAPStoreFlagsRequestKind { + IMAPStoreFlagsRequestKindAdd, + IMAPStoreFlagsRequestKindRemove, + IMAPStoreFlagsRequestKindSet, + }; - enum IMAPWorkaround { - IMAPWorkaroundGmail = 1 << 0, - IMAPWorkaroundYahoo = 1 << 1, - IMAPWorkaroundExchange2003 = 1 << 2, - }; + enum IMAPWorkaround { + IMAPWorkaroundGmail = 1 << 0, + IMAPWorkaroundYahoo = 1 << 1, + IMAPWorkaroundExchange2003 = 1 << 2, + }; - enum IMAPCapability { - IMAPCapabilityACL, - IMAPCapabilityBinary, - IMAPCapabilityCatenate, - IMAPCapabilityChildren, - IMAPCapabilityCompressDeflate, - IMAPCapabilityCondstore, - IMAPCapabilityEnable, - IMAPCapabilityIdle, - IMAPCapabilityId, - IMAPCapabilityLiteralPlus, - IMAPCapabilityMultiAppend, - IMAPCapabilityNamespace, - IMAPCapabilityQResync, - IMAPCapabilityQuota, - IMAPCapabilitySort, - IMAPCapabilityStartTLS, - IMAPCapabilityThreadOrderedSubject, - IMAPCapabilityThreadReferences, - IMAPCapabilityUIDPlus, - IMAPCapabilityUnselect, - IMAPCapabilityXList, - IMAPCapabilityAuthAnonymous, - IMAPCapabilityAuthCRAMMD5, - IMAPCapabilityAuthDigestMD5, - IMAPCapabilityAuthExternal, - IMAPCapabilityAuthGSSAPI, - IMAPCapabilityAuthKerberosV4, - IMAPCapabilityAuthLogin, - IMAPCapabilityAuthNTLM, - IMAPCapabilityAuthOTP, - IMAPCapabilityAuthPlain, - IMAPCapabilityAuthSKey, - IMAPCapabilityAuthSRP, - }; + enum IMAPCapability { + IMAPCapabilityACL, + IMAPCapabilityBinary, + IMAPCapabilityCatenate, + IMAPCapabilityChildren, + IMAPCapabilityCompressDeflate, + IMAPCapabilityCondstore, + IMAPCapabilityEnable, + IMAPCapabilityIdle, + IMAPCapabilityId, + IMAPCapabilityLiteralPlus, + IMAPCapabilityMultiAppend, + IMAPCapabilityNamespace, + IMAPCapabilityQResync, + IMAPCapabilityQuota, + IMAPCapabilitySort, + IMAPCapabilityStartTLS, + IMAPCapabilityThreadOrderedSubject, + IMAPCapabilityThreadReferences, + IMAPCapabilityUIDPlus, + IMAPCapabilityUnselect, + IMAPCapabilityXList, + IMAPCapabilityAuthAnonymous, + IMAPCapabilityAuthCRAMMD5, + IMAPCapabilityAuthDigestMD5, + IMAPCapabilityAuthExternal, + IMAPCapabilityAuthGSSAPI, + IMAPCapabilityAuthKerberosV4, + IMAPCapabilityAuthLogin, + IMAPCapabilityAuthNTLM, + IMAPCapabilityAuthOTP, + IMAPCapabilityAuthPlain, + IMAPCapabilityAuthSKey, + IMAPCapabilityAuthSRP, + }; - enum POPCapability { - POPCapabilityNone, - POPCapabilityStartTLS, - POPCapabilityTop, - POPCapabilityUser, - POPCapabilityRespCodes, - POPCapabilityPipelining, - POPCapabilityUIDL, - POPCapabilitySASL, - POPCapabilityAuthAnonymous, - POPCapabilityAuthCRAMMD5, - POPCapabilityAuthDigestMD5, - POPCapabilityAuthExternal, - POPCapabilityAuthGSSAPI, - POPCapabilityAuthKerberosV4, - POPCapabilityAuthLogin, - POPCapabilityAuthNTLM, - POPCapabilityAuthOTP, - POPCapabilityAuthPlain, - POPCapabilityAuthSKey, - POPCapabilityAuthSRP, - }; + enum POPCapability { + POPCapabilityNone, + POPCapabilityStartTLS, + POPCapabilityTop, + POPCapabilityUser, + POPCapabilityRespCodes, + POPCapabilityPipelining, + POPCapabilityUIDL, + POPCapabilitySASL, + POPCapabilityAuthAnonymous, + POPCapabilityAuthCRAMMD5, + POPCapabilityAuthDigestMD5, + POPCapabilityAuthExternal, + POPCapabilityAuthGSSAPI, + POPCapabilityAuthKerberosV4, + POPCapabilityAuthLogin, + POPCapabilityAuthNTLM, + POPCapabilityAuthOTP, + POPCapabilityAuthPlain, + POPCapabilityAuthSKey, + POPCapabilityAuthSRP, + }; - enum Encoding { - Encoding7Bit = 0, // should match MAILIMAP_BODY_FLD_ENC_7BIT - Encoding8Bit = 1, // should match MAILIMAP_BODY_FLD_ENC_8BIT - EncodingBinary = 2, // should match MAILIMAP_BODY_FLD_ENC_BINARY - EncodingBase64 = 3, // should match MAILIMAP_BODY_FLD_ENC_BASE64 - EncodingQuotedPrintable = 4, // should match MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE - EncodingOther = 5, // should match MAILIMAP_BODY_FLD_ENC_OTHER - // negative values should be used for other encoding - EncodingUUEncode = -1 - }; - - enum IMAPSearchKind { - IMAPSearchKindNone, - IMAPSearchKindFrom, - IMAPSearchKindRecipient, - IMAPSearchKindSubject, - IMAPSearchKindContent, - IMAPSearchKindHeader, - IMAPSearchKindOr, - IMAPSearchKindAnd, - }; - - enum ErrorCode { - ErrorNone, - ErrorConnection, - ErrorTLSNotAvailable, - ErrorParse, - ErrorCertificate, - ErrorAuthentication, - ErrorGmailIMAPNotEnabled, - ErrorGmailExceededBandwidthLimit, - ErrorGmailTooManySimultaneousConnections, - ErrorMobileMeMoved, - ErrorYahooUnavailable, - ErrorNonExistantFolder, - ErrorRename, - ErrorDelete, - ErrorCreate, - ErrorSubscribe, - ErrorAppend, - ErrorCopy, - ErrorExpunge, - ErrorFetch, - ErrorIdle, - ErrorIdentity, - ErrorNamespace, - ErrorStore, + enum Encoding { + Encoding7Bit = 0, // should match MAILIMAP_BODY_FLD_ENC_7BIT + Encoding8Bit = 1, // should match MAILIMAP_BODY_FLD_ENC_8BIT + EncodingBinary = 2, // should match MAILIMAP_BODY_FLD_ENC_BINARY + EncodingBase64 = 3, // should match MAILIMAP_BODY_FLD_ENC_BASE64 + EncodingQuotedPrintable = 4, // should match MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE + EncodingOther = 5, // should match MAILIMAP_BODY_FLD_ENC_OTHER + // negative values should be used for other encoding + EncodingUUEncode = -1 + }; + + enum IMAPSearchKind { + IMAPSearchKindNone, + IMAPSearchKindFrom, + IMAPSearchKindRecipient, + IMAPSearchKindSubject, + IMAPSearchKindContent, + IMAPSearchKindHeader, + IMAPSearchKindOr, + IMAPSearchKindAnd, + }; + + enum ErrorCode { + ErrorNone, + ErrorConnection, + ErrorTLSNotAvailable, + ErrorParse, + ErrorCertificate, + ErrorAuthentication, + ErrorGmailIMAPNotEnabled, + ErrorGmailExceededBandwidthLimit, + ErrorGmailTooManySimultaneousConnections, + ErrorMobileMeMoved, + ErrorYahooUnavailable, + ErrorNonExistantFolder, + ErrorRename, + ErrorDelete, + ErrorCreate, + ErrorSubscribe, + ErrorAppend, + ErrorCopy, + ErrorExpunge, + ErrorFetch, + ErrorIdle, + ErrorIdentity, + ErrorNamespace, + ErrorStore, ErrorCapability, - ErrorStartTLSNotAvailable, - ErrorSendMessageIllegalAttachment, - ErrorStorageLimit, - ErrorSendMessageNotAllowed, - ErrorNeedsConnectToWebmail, - ErrorSendMessage, - ErrorAuthenticationRequired, - ErrorFetchMessageList, - ErrorDeleteMessage, + ErrorStartTLSNotAvailable, + ErrorSendMessageIllegalAttachment, + ErrorStorageLimit, + ErrorSendMessageNotAllowed, + ErrorNeedsConnectToWebmail, + ErrorSendMessage, + ErrorAuthenticationRequired, + ErrorFetchMessageList, + ErrorDeleteMessage, ErrorInvalidAccount, - }; - - enum PartType { - PartTypeSingle, - PartTypeMessage, - PartTypeMultipartMixed, - PartTypeMultipartRelated, - PartTypeMultipartAlternative, - }; + }; + + enum PartType { + PartTypeSingle, + PartTypeMessage, + PartTypeMultipartMixed, + PartTypeMultipartRelated, + PartTypeMultipartAlternative, + }; } #endif diff --git a/src/core/basetypes/MCConnectionLogger.h b/src/core/basetypes/MCConnectionLogger.h index 8083d12d..dd596857 100644 --- a/src/core/basetypes/MCConnectionLogger.h +++ b/src/core/basetypes/MCConnectionLogger.h @@ -9,6 +9,8 @@ #ifndef __MAILCORE_CONNECTION_LOGGER_H_ #define __MAILCORE_CONNECTION_LOGGER_H_ +#include <stdlib.h> + #ifdef __cplusplus namespace mailcore { @@ -17,20 +19,23 @@ namespace mailcore { class String; enum ConnectionLogType { - ConnectionLogTypeGeneric, + // Received data ConnectionLogTypeReceived, + // Sent data ConnectionLogTypeSent, + // Sent private data ConnectionLogTypeSentPrivate, - ConnectionLogTypeErrorGeneric, + // Parse error + ConnectionLogTypeErrorParse, + // Error while receiving data - log() is called with a NULL buffer. ConnectionLogTypeErrorReceived, + // Error while sending data - log() is called with a NULL buffer. ConnectionLogTypeErrorSent, - ConnectionLogTypeErrorSentPrivate, }; class ConnectionLogger { public: - virtual void logBuffer(ConnectionLogType logType, Data * buffer) {} - virtual void logString(ConnectionLogType logType, String * log) {} + virtual void log(void * sender, ConnectionLogType logType, Data * buffer) {} }; } diff --git a/src/core/basetypes/MCConnectionLoggerUtils.cc b/src/core/basetypes/MCConnectionLoggerUtils.cc index 669c8449..234713e7 100644 --- a/src/core/basetypes/MCConnectionLoggerUtils.cc +++ b/src/core/basetypes/MCConnectionLoggerUtils.cc @@ -14,21 +14,12 @@ mailcore::ConnectionLogType mailcore::getConnectionType(int log_type) { - ConnectionLogType type = ConnectionLogTypeGeneric; + ConnectionLogType type = (ConnectionLogType) -1; bool isBuffer = false; switch (log_type) { - case MAILSTREAM_LOG_TYPE_INFO_GENERIC: - type = ConnectionLogTypeGeneric; - break; - case MAILSTREAM_LOG_TYPE_INFO_RECEIVED: - type = ConnectionLogTypeReceived; - break; - case MAILSTREAM_LOG_TYPE_INFO_SENT: - type = ConnectionLogTypeSent; - break; - case MAILSTREAM_LOG_TYPE_ERROR_GENERIC: - type = ConnectionLogTypeErrorGeneric; + case MAILSTREAM_LOG_TYPE_ERROR_PARSE: + type = ConnectionLogTypeErrorParse; isBuffer = true; break; case MAILSTREAM_LOG_TYPE_ERROR_RECEIVED: @@ -60,9 +51,7 @@ bool mailcore::isBufferFromLogType(int log_type) bool isBuffer = false; switch (log_type) { - case MAILSTREAM_LOG_TYPE_ERROR_GENERIC: - case MAILSTREAM_LOG_TYPE_ERROR_RECEIVED: - case MAILSTREAM_LOG_TYPE_ERROR_SENT: + case MAILSTREAM_LOG_TYPE_ERROR_PARSE: case MAILSTREAM_LOG_TYPE_DATA_RECEIVED: case MAILSTREAM_LOG_TYPE_DATA_SENT: case MAILSTREAM_LOG_TYPE_DATA_SENT_PRIVATE: diff --git a/src/core/basetypes/MCHTMLCleaner.cc b/src/core/basetypes/MCHTMLCleaner.cc index 12f1371e..7d45d3f2 100644 --- a/src/core/basetypes/MCHTMLCleaner.cc +++ b/src/core/basetypes/MCHTMLCleaner.cc @@ -68,6 +68,7 @@ String * HTMLCleaner::cleanHTML(String * input) String * result = String::stringWithUTF8Characters((const char *) output.bp); + tidyBufFree(&docbuf); tidyBufFree(&output); tidyBufFree(&errbuf); tidyRelease(tdoc); diff --git a/src/core/basetypes/MCLibetpan.cpp b/src/core/basetypes/MCLibetpan.cpp new file mode 100644 index 00000000..c8258cc2 --- /dev/null +++ b/src/core/basetypes/MCLibetpan.cpp @@ -0,0 +1,16 @@ +// +// MCLibetpan.cpp +// mailcore2 +// +// Created by Hoa Dinh on 6/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCLibetpan.h" + +#include <libetpan/libetpan.h> + +__attribute__((constructor)) +static void initialize() { + mailstream_cfstream_enabled = 1; +} diff --git a/src/core/basetypes/MCLibetpan.h b/src/core/basetypes/MCLibetpan.h new file mode 100644 index 00000000..ef7db1f8 --- /dev/null +++ b/src/core/basetypes/MCLibetpan.h @@ -0,0 +1,14 @@ +// +// MCLibetpan.h +// mailcore2 +// +// Created by Hoa Dinh on 6/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE_MCLIBETPAN_H_ +#define __MAILCORE_MCLIBETPAN_H_ + +// No API in this file. + +#endif diff --git a/src/core/basetypes/MCObject.cc b/src/core/basetypes/MCObject.cc index 879c194f..235738cd 100644 --- a/src/core/basetypes/MCObject.cc +++ b/src/core/basetypes/MCObject.cc @@ -83,7 +83,9 @@ String * Object::className() { int status; char * unmangled = abi::__cxa_demangle(typeid(* this).name(), NULL, NULL, &status); - return mailcore::String::uniquedStringWithUTF8Characters(unmangled); + String * result = String::uniquedStringWithUTF8Characters(unmangled); + free(unmangled); + return result; } String * Object::description() diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc index d4529fab..9c30ad22 100644 --- a/src/core/basetypes/MCOperationQueue.cc +++ b/src/core/basetypes/MCOperationQueue.cc @@ -159,7 +159,7 @@ void OperationQueue::stoppedOnMainThread(void * context) mStarted = false; if (mCallback) { - mCallback->queueStoppedRunning(); + mCallback->queueStoppedRunning(this); } release(); // (2) @@ -173,7 +173,7 @@ void OperationQueue::startThread() return; if (mCallback) { - mCallback->queueStartRunning(); + mCallback->queueStartRunning(this); } retain(); // (3) diff --git a/src/core/basetypes/MCOperationQueueCallback.h b/src/core/basetypes/MCOperationQueueCallback.h index 367888bb..605de030 100644 --- a/src/core/basetypes/MCOperationQueueCallback.h +++ b/src/core/basetypes/MCOperationQueueCallback.h @@ -15,8 +15,8 @@ namespace mailcore { class OperationQueueCallback { public: - virtual void queueStartRunning() {} - virtual void queueStoppedRunning() {} + virtual void queueStartRunning(OperationQueue * queue) {} + virtual void queueStoppedRunning(OperationQueue * queue) {} }; } diff --git a/src/core/basetypes/MCString.cc b/src/core/basetypes/MCString.cc index 832ffac2..034e3299 100644 --- a/src/core/basetypes/MCString.cc +++ b/src/core/basetypes/MCString.cc @@ -10,6 +10,9 @@ #include <libetpan/libetpan.h> #include <libxml/xmlmemory.h> #include <libxml/HTMLparser.h> +#if __APPLE__ +#include <CoreFoundation/CoreFoundation.h> +#endif #include "MCData.h" #include "MCHash.h" @@ -781,7 +784,9 @@ String * String::stringWithVUTF8Format(const char * format, va_list ap) { char * result; vasprintf(&result, format, ap); - return stringWithUTF8Characters(result); + String * str = stringWithUTF8Characters(result); + free(result); + return str; } String * String::stringWithUTF8Characters(const char * UTF8Characters) @@ -1121,6 +1126,20 @@ String * String::uppercaseString() void String::appendBytes(const char * bytes, unsigned int length, const char * charset) { +#if __APPLE__ + CFStringRef encodingName = CFStringCreateWithCString(NULL, charset, kCFStringEncodingUTF8); + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding(encodingName); + CFStringRef cfStr = CFStringCreateWithBytes(NULL, (const UInt8 *) bytes, (CFIndex) length, encoding, false); + if (cfStr != NULL) { + CFDataRef data = CFStringCreateExternalRepresentation(NULL, cfStr, kCFStringEncodingUTF16LE, '_'); + if (data != NULL) { + appendCharactersLength((const UChar *) CFDataGetBytePtr(data), (unsigned int) CFDataGetLength(data) / 2); + CFRelease(data); + } + CFRelease(cfStr); + } + CFRelease(encodingName); +#else UErrorCode err; err = U_ZERO_ERROR; @@ -1150,6 +1169,7 @@ void String::appendBytes(const char * bytes, unsigned int length, const char * c free(dest); ucnv_close(converter); +#endif } String * String::extractedSubject() @@ -1773,7 +1793,7 @@ String * String::flattenHTML() bool String::hasSuffix(String * suffix) { - if (mLength > suffix->mLength) { + if (mLength >= suffix->mLength) { if (u_memcmp(suffix->mUnicodeChars + (mLength - suffix->mLength), mUnicodeChars, suffix->mLength) == 0) { return true; @@ -1784,7 +1804,7 @@ bool String::hasSuffix(String * suffix) bool String::hasPrefix(String * prefix) { - if (mLength > prefix->mLength) { + if (mLength >= prefix->mLength) { if (u_memcmp(prefix->mUnicodeChars, mUnicodeChars, prefix->mLength) == 0) { return true; } @@ -1810,13 +1830,34 @@ String * String::pathExtension() Data * String::dataUsingEncoding(const char * charset) { - UErrorCode err; - Data * data; - if (charset == NULL) { charset = "utf-8"; } +#if __APPLE__ + Data * data; + + data = NULL; + CFStringRef encodingName = CFStringCreateWithCString(NULL, charset, kCFStringEncodingUTF8); + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding(encodingName); + CFStringRef cfStr = CFStringCreateWithBytes(NULL, (const UInt8 *) mUnicodeChars, + (CFIndex) mLength * sizeof(* mUnicodeChars), kCFStringEncodingUTF16LE, false); + if (cfStr != NULL) { + CFDataRef cfData = CFStringCreateExternalRepresentation(NULL, cfStr, encoding, '_'); + if (cfData != NULL) { + data = Data::dataWithBytes((const char *) CFDataGetBytePtr(cfData), + (unsigned int) CFDataGetLength(cfData)); + CFRelease(cfData); + } + CFRelease(cfStr); + } + CFRelease(encodingName); + + return data; +#else + UErrorCode err; + Data * data; + err = U_ZERO_ERROR; UConverter * converter = ucnv_open(charset, &err); if (converter == NULL) { @@ -1846,6 +1887,7 @@ Data * String::dataUsingEncoding(const char * charset) ucnv_close(converter); return data; +#endif } const char * String::fileSystemRepresentation() diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index c3327872..125cae2f 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -317,6 +317,7 @@ void IMAPSession::init() mPort = 0; mUsername = NULL; mPassword = NULL; + mOAuth2Token = NULL; mAuthType = AuthTypeSASLNone; mConnectionType = ConnectionTypeClear; mCheckCertificateEnabled = true; @@ -359,6 +360,7 @@ IMAPSession::~IMAPSession() MC_SAFE_RELEASE(mHostname); MC_SAFE_RELEASE(mUsername); MC_SAFE_RELEASE(mPassword); + MC_SAFE_RELEASE(mOAuth2Token); MC_SAFE_RELEASE(mWelcomeString); MC_SAFE_RELEASE(mDefaultNamespace); MC_SAFE_RELEASE(mCurrentFolder); @@ -405,6 +407,16 @@ String * IMAPSession::password() return mPassword; } +void IMAPSession::setOAuth2Token(String * token) +{ + MC_SAFE_REPLACE_COPY(String, mOAuth2Token, token); +} + +String * IMAPSession::OAuth2Token() +{ + return mOAuth2Token; +} + void IMAPSession::setAuthType(AuthType authType) { mAuthType = authType; @@ -502,15 +514,17 @@ static void logger(mailimap * imap, int log_type, const char * buffer, size_t si return; ConnectionLogType type = getConnectionType(log_type); + if ((int) type == -1) + return; + bool isBuffer = isBufferFromLogType(log_type); if (isBuffer) { Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logBuffer(type, data); + session->connectionLogger()->log(session, type, data); } else { - Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logString(type, String::stringWithData(data)); + session->connectionLogger()->log(session, type, NULL); } } @@ -748,6 +762,10 @@ void IMAPSession::login(ErrorCode * pError) utf8username, utf8username, utf8password, NULL/* realm */); break; + + case AuthTypeXOAuth2: + r = mailimap_oauth2_authenticate(mImap, MCUTF8(mUsername), MCUTF8(mOAuth2Token)); + break; } if (r == MAILIMAP_ERROR_STREAM) { * pError = ErrorConnection; diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h index 757613e8..53510b0b 100644 --- a/src/core/imap/MCIMAPSession.h +++ b/src/core/imap/MCIMAPSession.h @@ -38,6 +38,11 @@ namespace mailcore { virtual void setPassword(String * password); virtual String * password(); + // To authenticate using OAuth2, username and oauth2token should be set. + // auth type to use is AuthTypeOAuth2. + virtual void setOAuth2Token(String * token); + virtual String * OAuth2Token(); + virtual void setAuthType(AuthType authType); virtual AuthType authType(); @@ -154,6 +159,7 @@ namespace mailcore { unsigned int mPort; String * mUsername; String * mPassword; + String * mOAuth2Token; AuthType mAuthType; ConnectionType mConnectionType; bool mCheckCertificateEnabled; diff --git a/src/core/pop/MCPOPSession.cc b/src/core/pop/MCPOPSession.cc index fe15c500..fea4e5e0 100644 --- a/src/core/pop/MCPOPSession.cc +++ b/src/core/pop/MCPOPSession.cc @@ -160,11 +160,10 @@ static void logger(mailpop3 * pop3, int log_type, const char * buffer, size_t si if (isBuffer) { Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logBuffer(type, data); + session->connectionLogger()->log(session, type, data); } else { - Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logString(type, String::stringWithData(data)); + session->connectionLogger()->log(session, type, NULL); } } diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc index b814e2ea..43fd94f9 100644 --- a/src/core/provider/MCMailProvider.cc +++ b/src/core/provider/MCMailProvider.cc @@ -18,7 +18,7 @@ using namespace mailcore; void MailProvider::init() { mIdentifier = NULL; - mImapServices = new Array(); + mImapServices = new Array(); mSmtpServices = new Array(); mPopServices = new Array(); mDomainMatch = new Array(); @@ -31,15 +31,27 @@ MailProvider::MailProvider() init(); } +MailProvider::MailProvider(MailProvider * other) +{ + init(); + MC_SAFE_REPLACE_COPY(String, mIdentifier, other->mIdentifier); + MC_SAFE_REPLACE_COPY(Array, mImapServices, other->mImapServices); + MC_SAFE_REPLACE_COPY(Array, mSmtpServices, other->mSmtpServices); + MC_SAFE_REPLACE_COPY(Array, mPopServices, other->mPopServices); + MC_SAFE_REPLACE_COPY(Array, mDomainMatch, other->mDomainMatch); + MC_SAFE_REPLACE_COPY(Set, mMxSet, other->mMxSet); + MC_SAFE_REPLACE_COPY(HashMap, mMailboxPaths, other->mMailboxPaths); +} + MailProvider::~MailProvider() { - MC_SAFE_RELEASE(mImapServices); - MC_SAFE_RELEASE(mSmtpServices); - MC_SAFE_RELEASE(mPopServices); - MC_SAFE_RELEASE(mMxSet); - MC_SAFE_RELEASE(mDomainMatch); - MC_SAFE_RELEASE(mMailboxPaths); - MC_SAFE_RELEASE(mIdentifier); + MC_SAFE_RELEASE(mImapServices); + MC_SAFE_RELEASE(mSmtpServices); + MC_SAFE_RELEASE(mPopServices); + MC_SAFE_RELEASE(mMxSet); + MC_SAFE_RELEASE(mDomainMatch); + MC_SAFE_RELEASE(mMailboxPaths); + MC_SAFE_RELEASE(mIdentifier); } MailProvider * MailProvider::providerWithInfo(HashMap * info) @@ -52,7 +64,7 @@ MailProvider * MailProvider::providerWithInfo(HashMap * info) void MailProvider::fillWithInfo(HashMap * info) { - Array * imapInfos; + Array * imapInfos; Array * smtpInfos; Array * popInfos; HashMap * serverInfo; @@ -68,9 +80,9 @@ void MailProvider::fillWithInfo(HashMap * info) } mxs = (Array *) info->objectForKey(MCSTR("mx")); mMxSet->removeAllObjects(); - mc_foreacharray(String, mx, mxs) { - mMxSet->addObject(mx->lowercaseString()); - } + mc_foreacharray(String, mx, mxs) { + mMxSet->addObject(mx->lowercaseString()); + } serverInfo = (HashMap *) info->objectForKey(MCSTR("servers")); imapInfos = (Array *) serverInfo->objectForKey(MCSTR("imap")); @@ -78,52 +90,52 @@ void MailProvider::fillWithInfo(HashMap * info) popInfos = (Array *) serverInfo->objectForKey(MCSTR("pop")); mImapServices->removeAllObjects(); - mc_foreacharray(HashMap, imapInfo, imapInfos) { - NetService * service = NetService::serviceWithInfo(imapInfo); + mc_foreacharray(HashMap, imapInfo, imapInfos) { + NetService * service = NetService::serviceWithInfo(imapInfo); mImapServices->addObject(service); - } - + } + mSmtpServices->removeAllObjects(); - mc_foreacharray(HashMap, smtpInfo, smtpInfos) { - NetService * service = NetService::serviceWithInfo(smtpInfo); - mSmtpServices->addObject(service); - } - + mc_foreacharray(HashMap, smtpInfo, smtpInfos) { + NetService * service = NetService::serviceWithInfo(smtpInfo); + mSmtpServices->addObject(service); + } + mPopServices->removeAllObjects(); - mc_foreacharray(HashMap, popInfo, popInfos) { - NetService * service = NetService::serviceWithInfo(popInfo); - mPopServices->addObject(service); - } + mc_foreacharray(HashMap, popInfo, popInfos) { + NetService * service = NetService::serviceWithInfo(popInfo); + mPopServices->addObject(service); + } } void MailProvider::setIdentifier(String * identifier) { - MC_SAFE_REPLACE_COPY(String, mIdentifier, identifier); + MC_SAFE_REPLACE_COPY(String, mIdentifier, identifier); } String * MailProvider::identifier() { - return mIdentifier; + return mIdentifier; } Array * MailProvider::imapServices() { - return mImapServices; + return mImapServices; } Array * MailProvider::smtpServices() { - return mSmtpServices; + return mSmtpServices; } Array * MailProvider::popServices() { - return mPopServices; + return mPopServices; } bool MailProvider::matchEmail(String * email) { - Array * components; + Array * components; String * domain; const char * cDomain; @@ -133,9 +145,9 @@ bool MailProvider::matchEmail(String * email) domain = (String *) components->lastObject(); cDomain = domain->UTF8Characters(); - - mc_foreacharray(String, match, mDomainMatch) { - regex_t r; + + mc_foreacharray(String, match, mDomainMatch) { + regex_t r; bool matched; match = String::stringWithUTF8Format("^%s$", match->UTF8Characters()); @@ -151,14 +163,14 @@ bool MailProvider::matchEmail(String * email) if (matched) return true; - } + } return false; } bool MailProvider::matchMX(String * hostname) { - return mMxSet->containsObject(hostname->lowercaseString()); + return mMxSet->containsObject(hostname->lowercaseString()); } String * MailProvider::sentMailFolderPath() @@ -168,38 +180,38 @@ String * MailProvider::sentMailFolderPath() String * MailProvider::starredFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("starred")); + return (String *) mMailboxPaths->objectForKey(MCSTR("starred")); } String * MailProvider::allMailFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("allmail")); + return (String *) mMailboxPaths->objectForKey(MCSTR("allmail")); } String * MailProvider::trashFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("trash")); + return (String *) mMailboxPaths->objectForKey(MCSTR("trash")); } String * MailProvider::draftsFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("drafts")); + return (String *) mMailboxPaths->objectForKey(MCSTR("drafts")); } String * MailProvider::spamFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("spam")); + return (String *) mMailboxPaths->objectForKey(MCSTR("spam")); } String * MailProvider::importantFolderPath() { - return (String *) mMailboxPaths->objectForKey(MCSTR("important")); + return (String *) mMailboxPaths->objectForKey(MCSTR("important")); } bool MailProvider::isMainFolder(String * folderPath, String * prefix) { - mc_foreachdictionaryValue(String, path, mMailboxPaths) { - String * fullPath; + mc_foreachdictionaryValue(String, path, mMailboxPaths) { + String * fullPath; if (prefix != NULL) { fullPath = prefix->stringByAppendingString((String *) path); @@ -210,7 +222,7 @@ bool MailProvider::isMainFolder(String * folderPath, String * prefix) if (fullPath->isEqual(folderPath)) return true; - } + } return false; } @@ -219,3 +231,9 @@ String * MailProvider::description() { return String::stringWithUTF8Format("<%s:%p, %s>", className()->UTF8Characters(), this, MCUTF8(mIdentifier)); } + +Object * MailProvider::copy() +{ + return new MailProvider(this); +} + diff --git a/src/core/provider/MCMailProvider.h b/src/core/provider/MCMailProvider.h index 306b180d..81b816e9 100644 --- a/src/core/provider/MCMailProvider.h +++ b/src/core/provider/MCMailProvider.h @@ -45,8 +45,10 @@ namespace mailcore { virtual bool isMainFolder(String * folderPath, String * prefix); public: // subclass behavior + MailProvider(MailProvider * other); virtual String * description(); - + virtual Object * copy(); + public: // private virtual void setIdentifier(String * identifier); virtual void fillWithInfo(HashMap * info); diff --git a/src/core/provider/MCNetService.cc b/src/core/provider/MCNetService.cc index 53ae7475..f760dc61 100644 --- a/src/core/provider/MCNetService.cc +++ b/src/core/provider/MCNetService.cc @@ -19,12 +19,20 @@ void NetService::init() NetService::NetService() { - init(); + init(); +} + +NetService::NetService(NetService * other) +{ + init(); + MC_SAFE_REPLACE_COPY(String, mHostname, other->mHostname); + mPort = other->mPort; + mConnectionType = other->mConnectionType; } NetService::~NetService() { - MC_SAFE_RELEASE(mHostname); + MC_SAFE_RELEASE(mHostname); } NetService * NetService::serviceWithInfo(HashMap * info) @@ -37,10 +45,10 @@ NetService * NetService::serviceWithInfo(HashMap * info) void NetService::fillWithInfo(HashMap * info) { - bool ssl = false; + bool ssl = false; bool starttls = false; - - setHostname((String *) info->objectForKey(MCSTR("hostname"))); + + setHostname((String *) info->objectForKey(MCSTR("hostname"))); if (info->objectForKey(MCSTR("port")) != NULL) { setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue()); } @@ -68,57 +76,57 @@ void NetService::setHostname(String *hostname) String * NetService::hostname() { - return mHostname; + return mHostname; } void NetService::setPort(unsigned int port) { - mPort = port; + mPort = port; } unsigned int NetService::port() { - return mPort; + return mPort; } void NetService::setConnectionType(ConnectionType connectionType) { - mConnectionType = connectionType; + mConnectionType = connectionType; } ConnectionType NetService::connectionType() { - return mConnectionType; + return mConnectionType; } String * NetService::normalizedHostnameWithEmail(String * email) { - Array *components = email->componentsSeparatedByString(MCSTR("@")); - String *hostname = (String *) mHostname->copy(); - if (components->count() != 0) { - hostname->replaceOccurrencesOfString(MCSTR("{domain}"), (String *) components->lastObject()); - return hostname; - } - return mHostname; + Array *components = email->componentsSeparatedByString(MCSTR("@")); + String *hostname = (String *) mHostname->copy(); + if (components->count() != 0) { + hostname->replaceOccurrencesOfString(MCSTR("{domain}"), (String *) components->lastObject()); + return hostname; + } + return mHostname; } HashMap * NetService::info() { - HashMap * result; + HashMap * result; result = new HashMap(); if (mHostname != NULL) { - result->setObjectForKey(MCSTR("hostname"), mHostname); + result->setObjectForKey(MCSTR("hostname"), mHostname); } if (mPort != 0) { - result->setObjectForKey(MCSTR("port"), Value::valueWithIntValue(mPort)); + result->setObjectForKey(MCSTR("port"), Value::valueWithIntValue(mPort)); } switch (mConnectionType) { case ConnectionTypeTLS: - result->setObjectForKey(MCSTR("ssl"), Value::valueWithBoolValue(true)); + result->setObjectForKey(MCSTR("ssl"), Value::valueWithBoolValue(true)); break; case ConnectionTypeStartTLS: - result->setObjectForKey(MCSTR("starttls"), Value::valueWithBoolValue(true)); + result->setObjectForKey(MCSTR("starttls"), Value::valueWithBoolValue(true)); break; default: break; @@ -126,3 +134,13 @@ HashMap * NetService::info() return result; } + +String * NetService::description() +{ + return String::stringWithUTF8Format("<%s:%p, hostname: %s, port: %u>", className()->UTF8Characters(), this, MCUTF8(mHostname), mPort); +} + +Object * NetService::copy() +{ + return new NetService(this); +} diff --git a/src/core/provider/MCNetService.h b/src/core/provider/MCNetService.h index 7b0b9e14..d3aa5dd7 100644 --- a/src/core/provider/MCNetService.h +++ b/src/core/provider/MCNetService.h @@ -15,35 +15,40 @@ #ifdef __cplusplus namespace mailcore { - class NetService : public Object { - - public: - NetService(); - virtual ~NetService(); - - virtual void setHostname(String * hostname); - virtual String * hostname(); - - virtual void setPort(unsigned int port); - virtual unsigned int port(); - - virtual void setConnectionType(ConnectionType connectionType); - virtual ConnectionType connectionType(); - - virtual String * normalizedHostnameWithEmail(String * email); + class NetService : public Object { + + public: + NetService(); + virtual ~NetService(); + + virtual void setHostname(String * hostname); + virtual String * hostname(); + + virtual void setPort(unsigned int port); + virtual unsigned int port(); + + virtual void setConnectionType(ConnectionType connectionType); + virtual ConnectionType connectionType(); + + virtual String * normalizedHostnameWithEmail(String * email); public: // serialization static NetService * serviceWithInfo(HashMap * info); - virtual HashMap * info(); + virtual HashMap * info(); + + public: //subclass behavior + NetService(NetService * other); + virtual String * description(); + virtual Object * copy(); + + private: + String * mHostname; + unsigned int mPort; + ConnectionType mConnectionType; - private: - String * mHostname; - unsigned int mPort; - ConnectionType mConnectionType; - - void init(); + void init(); void fillWithInfo(HashMap * info); - }; + }; } #endif diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc index e74a540a..dcbad71e 100644 --- a/src/core/smtp/MCSMTPSession.cc +++ b/src/core/smtp/MCSMTPSession.cc @@ -164,7 +164,7 @@ void SMTPSession::bodyProgress(unsigned int current, unsigned int maximum) } -static void logger(mailsmtp * pop3, int log_type, const char * buffer, size_t size, void * context) +static void logger(mailsmtp * smtp, int log_type, const char * buffer, size_t size, void * context) { SMTPSession * session = (SMTPSession *) context; @@ -176,11 +176,10 @@ static void logger(mailsmtp * pop3, int log_type, const char * buffer, size_t si if (isBuffer) { Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logBuffer(type, data); + session->connectionLogger()->log(session, type, data); } else { - Data * data = Data::dataWithBytes(buffer, (unsigned int) size); - session->connectionLogger()->logString(type, String::stringWithData(data)); + session->connectionLogger()->log(session, type, NULL); } } |