diff options
-rw-r--r-- | build-mac/mailcore2.xcodeproj/project.pbxproj | 4 | ||||
-rw-r--r-- | src/core/renderer/MCHTMLRendererCallback.h | 3 | ||||
-rw-r--r-- | src/objc/abstract/MCOAbstract.h | 1 | ||||
-rw-r--r-- | src/objc/abstract/MCOHTMLRendererDelegate.h | 30 | ||||
-rw-r--r-- | src/objc/rfc822/MCOMessageParser.h | 22 | ||||
-rw-r--r-- | src/objc/rfc822/MCOMessageParser.mm | 124 |
6 files changed, 160 insertions, 24 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 72706121..557af90d 100644 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -16,6 +16,7 @@ C623C58716FD6A61001BBEFC /* MCOOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25716FD3BC2000DB34C /* MCOOperation.h */; }; C623C58816FD6DF6001BBEFC /* NSValue+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25016FC2846000DB34C /* NSValue+MCO.h */; }; C623C58916FD8B71001BBEFC /* MCOUtils.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB26C16FD62FB000DB34C /* MCOUtils.h */; }; + C623C58C16FE54C9001BBEFC /* MCOHTMLRendererDelegate.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C623C58B16FE52C0001BBEFC /* MCOHTMLRendererDelegate.h */; }; C62C6ED416A2A0E600737497 /* MCIMAPIdentityOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6ED216A2A0E600737497 /* MCIMAPIdentityOperation.cc */; }; C62C6ED816A398FA00737497 /* MCIMAPFolderInfoOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C62C6ED616A398FA00737497 /* MCIMAPFolderInfoOperation.cc */; }; C62C6EDA16A3D60700737497 /* MCIMAPAsyncConnection.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA7FD16A295B500778456 /* MCIMAPAsyncConnection.cc */; }; @@ -247,6 +248,7 @@ C07AD27FF065FA4408F65F19 /* MCOIMAPCheckAccountOperation.h in CopyFiles */, C64BB24816EEFCBC000DB34C /* MCOAbstractMessage.mm in CopyFiles */, C63CD68E16BE324100DB18F1 /* MCOIMAPFetchFoldersOperation.h in CopyFiles */, + C623C58C16FE54C9001BBEFC /* MCOHTMLRendererDelegate.h in CopyFiles */, C623C58916FD8B71001BBEFC /* MCOUtils.h in CopyFiles */, C64EA74F169E859600778456 /* MCAbstractMessage.h in CopyFiles */, C623C58816FD6DF6001BBEFC /* NSValue+MCO.h in CopyFiles */, @@ -372,6 +374,7 @@ C07AD98150338A79BF83CCEF /* MCOIMAPCheckAccountOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPCheckAccountOperation.h; sourceTree = "<group>"; }; C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSError+MCO.mm"; sourceTree = "<group>"; }; C623C58A16FD8C22001BBEFC /* MCOAbstractMessage+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MCOAbstractMessage+Private.h"; sourceTree = "<group>"; }; + C623C58B16FE52C0001BBEFC /* MCOHTMLRendererDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCOHTMLRendererDelegate.h; sourceTree = "<group>"; }; C62C6ED216A2A0E600737497 /* MCIMAPIdentityOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPIdentityOperation.cc; sourceTree = "<group>"; }; C62C6ED316A2A0E600737497 /* MCIMAPIdentityOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPIdentityOperation.h; sourceTree = "<group>"; }; C62C6ED616A398FA00737497 /* MCIMAPFolderInfoOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPFolderInfoOperation.cc; sourceTree = "<group>"; }; @@ -669,6 +672,7 @@ C64BB24316EDAAFD000DB34C /* MCOMessageHeader.h */, C64BB24E16EEFFE2000DB34C /* MCOMessageHeader+Private.h */, C64BB24416EDAAFE000DB34C /* MCOMessageHeader.mm */, + C623C58B16FE52C0001BBEFC /* MCOHTMLRendererDelegate.h */, ); path = abstract; sourceTree = "<group>"; diff --git a/src/core/renderer/MCHTMLRendererCallback.h b/src/core/renderer/MCHTMLRendererCallback.h index c2015e16..fdccdce2 100644 --- a/src/core/renderer/MCHTMLRendererCallback.h +++ b/src/core/renderer/MCHTMLRendererCallback.h @@ -40,7 +40,10 @@ namespace mailcore { virtual String * templateForEmbeddedMessageHeader(); virtual String * templateForAttachmentSeparator(); + // Can be used to filter some HTML tags. virtual String * filterHTMLForPart(String * html); + + // Can be used to hide quoted text. virtual String * filterHTMLForMessage(String * html); }; diff --git a/src/objc/abstract/MCOAbstract.h b/src/objc/abstract/MCOAbstract.h index af257614..429da6bd 100644 --- a/src/objc/abstract/MCOAbstract.h +++ b/src/objc/abstract/MCOAbstract.h @@ -15,5 +15,6 @@ #import <mailcore/MCOAbstractPart.h> #import <mailcore/MCOAddress.h> #import <mailcore/MCOMessageHeader.h> +#import <mailcore/MCOHTMLRendererDelegate.h> #endif diff --git a/src/objc/abstract/MCOHTMLRendererDelegate.h b/src/objc/abstract/MCOHTMLRendererDelegate.h new file mode 100644 index 00000000..b480835e --- /dev/null +++ b/src/objc/abstract/MCOHTMLRendererDelegate.h @@ -0,0 +1,30 @@ +// +// MCOHTMLRendererDelegate.h +// mailcore2 +// +// Created by DINH Viêt Hoà on 3/23/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef mailcore2_MCOHTMLRendererDelegate_h +#define mailcore2_MCOHTMLRendererDelegate_h + +@protocol MCOHTMLRendererDelegate <NSObject> + +- (BOOL) MCOAbstractMessage:(MCOAbstractMessage *)msg canPreviewPart:(MCOAbstractPart *)part; +- (NSDictionary *) MCOAbstractMessage:(MCOAbstractMessage *)msg templateValuesForHeader:(MCOMessageHeader *)part; +- (NSDictionary *) MCOAbstractMessage:(MCOAbstractMessage *)msg templateValuesForPart:(MCOAbstractPart *)part; +- (NSString *) MCOAbstractMessage_templateForMainHeader:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForImage:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForAttachment:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForMessage:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForEmbeddedMessage:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForEmbeddedMessageHeader:(MCOAbstractMessage *)msg; +- (NSString *) MCOAbstractMessage_templateForAttachmentSeparator:(MCOAbstractMessage *)msg; + +- (NSString *) MCOAbstractMessage:(MCOAbstractMessage *)msg filterHTMLForPart:(NSString *)html; +- (NSString *) MCOAbstractMessage:(MCOAbstractMessage *)msg filterHTMLForMessage:(NSString *)html; + +@end + +#endif diff --git a/src/objc/rfc822/MCOMessageParser.h b/src/objc/rfc822/MCOMessageParser.h index 7d086d7a..fd1f5304 100644 --- a/src/objc/rfc822/MCOMessageParser.h +++ b/src/objc/rfc822/MCOMessageParser.h @@ -12,11 +12,11 @@ #import <mailcore/MCOAbstractMessage.h> -@protocol MCOMessageParserDelegate; +@protocol MCOHTMLRendererDelegate; @interface MCOMessageParser : MCOAbstractMessage -@property (nonatomic, assign) id <MCOMessageParserDelegate> delegate; +@property (nonatomic, assign) id <MCOHTMLRendererDelegate> rendererDelegate; + (MCOMessageParser *) messageParserWithData:(NSData *)data; @@ -30,22 +30,4 @@ @end -@protocol MCOMessageParserDelegate - -- (BOOL) MCOMessageParser:(MCOMessageParser *)parser canPreviewPart:(MCOAbstractPart *)part; -- (NSDictionary *) MCOMessageParser:(MCOMessageParser *)parser templateValuesForHeader:(MCOMessageHeader *)part; -- (NSDictionary *) MCOMessageParser:(MCOMessageParser *)parser templateValuesForPart:(MCOAbstractPart *)part; -- (NSString *) MCOMessageParser_templateForMainHeader:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForImage:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForAttachment:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForMessage:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForEmbeddedMessage:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForEmbeddedMessageHeader:(MCOMessageParser *)parser; -- (NSString *) MCOMessageParser_templateForAttachmentSeparator:(MCOMessageParser *)parser; - -- (NSString *) MCOMessageParser_filterHTMLForPart:(NSString *)html; -- (NSString *) MCOMessageParser_filterHTMLForMessage:(NSString *)html; - -@end - #endif diff --git a/src/objc/rfc822/MCOMessageParser.mm b/src/objc/rfc822/MCOMessageParser.mm index a964c064..5ff3db13 100644 --- a/src/objc/rfc822/MCOMessageParser.mm +++ b/src/objc/rfc822/MCOMessageParser.mm @@ -9,16 +9,131 @@ #import "MCOMessageParser.h" #include "MCRFC822.h" +#include "MCRenderer.h" +#import "MCOHTMLRendererDelegate.h" #import "NSObject+MCO.h" #import "MCOAbstractMessage+Private.h" #import "MCOUtils.h" +class MCOMessageParserRenderedCallback : public mailcore::Object, public mailcore::HTMLRendererTemplateCallback { +public: + MCOMessageParserRenderedCallback(MCOMessageParser * parser) + { + _parser = parser; + } + + virtual bool canPreviewPart(mailcore::AbstractPart * part) + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage:canPreviewPart:)]) { + return [rendererDelegate() MCOAbstractMessage:_parser canPreviewPart:MCO_TO_OBJC(part)]; + } + return mailcore::HTMLRendererTemplateCallback::canPreviewPart(part); + } + + virtual mailcore::HashMap * templateValuesForHeader(mailcore::MessageHeader * header) + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage:templateValuesForHeader:)]) { + return MCO_FROM_OBJC(mailcore::HashMap, [rendererDelegate() MCOAbstractMessage:_parser templateValuesForHeader:MCO_TO_OBJC(header)]); + } + return mailcore::HTMLRendererTemplateCallback::templateValuesForHeader(header); + } + + virtual mailcore::HashMap * templateValuesForPart(mailcore::AbstractPart * part) + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage:templateValuesForPart:)]) { + return MCO_FROM_OBJC(mailcore::HashMap, [rendererDelegate() MCOAbstractMessage:_parser templateValuesForPart:MCO_TO_OBJC(part)]); + } + return mailcore::HTMLRendererTemplateCallback::templateValuesForPart(part); + } + + virtual mailcore::String * templateForMainHeader() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForMainHeader:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForMainHeader:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForMainHeader(); + } + + virtual mailcore::String * templateForImage() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForImage:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForImage:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForImage(); + } + + virtual mailcore::String * templateForAttachment() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForAttachment:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForAttachment:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForAttachment(); + } + + virtual mailcore::String * templateForMessage() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForMessage:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForMessage:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForMessage(); + } + + virtual mailcore::String * templateForEmbeddedMessage() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForEmbeddedMessage:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForEmbeddedMessage:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForEmbeddedMessage(); + } + + virtual mailcore::String * templateForEmbeddedMessageHeader() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForEmbeddedMessageHeader:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForEmbeddedMessageHeader:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForEmbeddedMessageHeader(); + } + + virtual mailcore::String * templateForAttachmentSeparator() + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage_templateForAttachmentSeparator:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage_templateForAttachmentSeparator:_parser]); + } + return mailcore::HTMLRendererTemplateCallback::templateForAttachmentSeparator(); + } + + virtual mailcore::String * filterHTMLForPart(mailcore::String * html) + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage:filterHTMLForPart:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage:_parser filterHTMLForPart:MCO_TO_OBJC(html)]); + } + return mailcore::HTMLRendererTemplateCallback::filterHTMLForPart(html); + } + + virtual mailcore::String * filterHTMLForMessage(mailcore::String * html) + { + if ([rendererDelegate() respondsToSelector:@selector(MCOAbstractMessage:filterHTMLForMesage:)]) { + return MCO_FROM_OBJC(mailcore::String, [rendererDelegate() MCOAbstractMessage:_parser filterHTMLForMessage:MCO_TO_OBJC(html)]); + } + return mailcore::HTMLRendererTemplateCallback::filterHTMLForMessage(html); + } + +private: + id <MCOHTMLRendererDelegate> rendererDelegate() + { + return [_parser rendererDelegate]; + } + + MCOMessageParser * _parser; +}; + @implementation MCOMessageParser { - id <MCOMessageParserDelegate> _delegate; + id <MCOHTMLRendererDelegate> _rendererDelegate; + MCOMessageParserRenderedCallback * _htmlRenderCallback; } -@synthesize delegate = _delegate; +@synthesize rendererDelegate = _rendererDelegate; #define nativeType mailcore::MessageParser @@ -42,12 +157,14 @@ { mailcore::MessageParser * message = new mailcore::MessageParser([data mco_mcData]); self = [super initWithMCMessage:message]; + _htmlRenderCallback = new MCOMessageParserRenderedCallback(self); message->release(); return self; } - (void) dealloc { + _htmlRenderCallback->release(); [super dealloc]; } @@ -63,8 +180,7 @@ - (NSString *) htmlRendering { -#warning should implement callbacks - return MCO_TO_OBJC(MCO_NATIVE_INSTANCE->htmlRendering()); + return MCO_TO_OBJC(MCO_NATIVE_INSTANCE->htmlRendering(_htmlRenderCallback)); } @end |