diff options
author | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-10-24 23:55:12 -0700 |
---|---|---|
committer | Hoa V. DINH <dinh.viet.hoa@gmail.com> | 2014-10-24 23:55:12 -0700 |
commit | 386f84abe048c4b37cef42195d612b480021df3f (patch) | |
tree | 99ed0ecf0a60706e88c295203b5c1d84836f0f80 /src | |
parent | 46242b129d4e22a0d95a23263339cb273c98b44d (diff) |
Fixed crash, additional memory usage optimization
Diffstat (limited to 'src')
-rw-r--r-- | src/cmake/core.cmake | 1 | ||||
-rw-r--r-- | src/core/basetypes/MCData.h | 7 | ||||
-rw-r--r-- | src/core/basetypes/MCDataMac.mm | 22 | ||||
-rw-r--r-- | src/core/rfc822/MCMessageParser.cc | 6 | ||||
-rw-r--r-- | src/core/rfc822/MCMessageParser.h | 10 | ||||
-rw-r--r-- | src/core/rfc822/MCMessageParserMac.mm | 34 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPFetchContentOperation.mm | 2 |
7 files changed, 73 insertions, 9 deletions
diff --git a/src/cmake/core.cmake b/src/cmake/core.cmake index 59139908..4b0782cf 100644 --- a/src/cmake/core.cmake +++ b/src/cmake/core.cmake @@ -14,6 +14,7 @@ IF(APPLE) core/basetypes/MCAutoreleasePoolMac.mm core/basetypes/MCMainThread.mm core/basetypes/MCObjectMac.mm + core/basetypes/MCDataMac.mm core/rfc822/MCMessageParserMac.mm ) ENDIF() diff --git a/src/core/basetypes/MCData.h b/src/core/basetypes/MCData.h index e7363644..131cb722 100644 --- a/src/core/basetypes/MCData.h +++ b/src/core/basetypes/MCData.h @@ -5,6 +5,10 @@ #include <MailCore/MCObject.h> #include <MailCore/MCMessageConstants.h> +#ifdef __APPLE__ +#import <CoreFoundation/CoreFoundation.h> +#endif + #ifdef __cplusplus namespace mailcore { @@ -41,6 +45,9 @@ namespace mailcore { public: // private virtual String * charsetWithFilteredHTML(bool filterHTML, String * hintCharset = NULL); +#ifdef __APPLE__ + virtual CFDataRef destructiveNSData(); +#endif public: // subclass behavior Data(Data * otherData); diff --git a/src/core/basetypes/MCDataMac.mm b/src/core/basetypes/MCDataMac.mm new file mode 100644 index 00000000..8081b1f9 --- /dev/null +++ b/src/core/basetypes/MCDataMac.mm @@ -0,0 +1,22 @@ +// +// MCDataMac.m +// mailcore2 +// +// Created by Hoa V. DINH on 10/24/14. +// Copyright (c) 2014 MailCore. All rights reserved. +// + +#include "MCData.h" + +#import <Foundation/Foundation.h> + +using namespace mailcore; + +CFDataRef Data::destructiveNSData() +{ + NSData * result = [NSData dataWithBytesNoCopy:(void *) mBytes length:mLength]; + mBytes = NULL; + mAllocated = 0; + mLength = 0; + return (CFDataRef) result; +} diff --git a/src/core/rfc822/MCMessageParser.cc b/src/core/rfc822/MCMessageParser.cc index f8a25bda..404bc862 100644 --- a/src/core/rfc822/MCMessageParser.cc +++ b/src/core/rfc822/MCMessageParser.cc @@ -105,12 +105,12 @@ AbstractPart * MessageParser::mainPart() Data * MessageParser::data() { +#if __APPLE__ if (mNSData != NULL) { return dataFromNSData(); } - else { - return mData; - } +#endif + return mData; } String * MessageParser::description() diff --git a/src/core/rfc822/MCMessageParser.h b/src/core/rfc822/MCMessageParser.h index 3b34ab9e..eba0e052 100644 --- a/src/core/rfc822/MCMessageParser.h +++ b/src/core/rfc822/MCMessageParser.h @@ -5,8 +5,8 @@ #include <MailCore/MCBaseTypes.h> #include <MailCore/MCAbstractMessage.h> #include <MailCore/MCAbstractPart.h> -#ifdef __OBJC__ -#import <Foundation/Foundation.h> +#ifdef __APPLE__ +#import <CoreFoundation/CoreFoundation.h> #endif #ifdef __cplusplus @@ -42,10 +42,10 @@ namespace mailcore { virtual HashMap * serializable(); -#ifdef __OBJC__ +#ifdef __APPLE__ public: - static MessageParser * messageParserWithData(NSData * data); - MessageParser(NSData * data); + static MessageParser * messageParserWithData(CFDataRef data); + MessageParser(CFDataRef data); #endif private: diff --git a/src/core/rfc822/MCMessageParserMac.mm b/src/core/rfc822/MCMessageParserMac.mm new file mode 100644 index 00000000..6748ed1a --- /dev/null +++ b/src/core/rfc822/MCMessageParserMac.mm @@ -0,0 +1,34 @@ +// +// MCMessageParserMac.m +// mailcore2 +// +// Created by Hoa V. DINH on 10/24/14. +// Copyright (c) 2014 MailCore. All rights reserved. +// + +#include "MCMessageParser.h" + +#import <Foundation/Foundation.h> + +#import "NSData+MCO.h" + +using namespace mailcore; + +MessageParser * MessageParser::messageParserWithData(CFDataRef data) +{ + MessageParser * parser = new MessageParser(data); + return (MessageParser *) parser->autorelease(); +} + +MessageParser::MessageParser(CFDataRef data) +{ + init(); + + setBytes((char *) [(NSData *) data bytes], (unsigned int) [(NSData *) data length]); + mNSData = [(NSData *) data retain]; +} + +Data * MessageParser::dataFromNSData() +{ + return [(NSData *) mNSData mco_mcData]; +} diff --git a/src/objc/imap/MCOIMAPFetchContentOperation.mm b/src/objc/imap/MCOIMAPFetchContentOperation.mm index 791307ca..9ca4c1c4 100644 --- a/src/objc/imap/MCOIMAPFetchContentOperation.mm +++ b/src/objc/imap/MCOIMAPFetchContentOperation.mm @@ -61,7 +61,7 @@ typedef void (^CompletionType)(NSError *error, NSData * data); nativeType *op = MCO_NATIVE_INSTANCE; if (op->error() == mailcore::ErrorNone) { - _completionBlock(nil, MCO_TO_OBJC(op->data())); + _completionBlock(nil, (NSData *) op->data()->destructiveNSData()); } else { _completionBlock([NSError mco_errorWithErrorCode:op->error()], nil); } |