aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build-mac/mailcore2.xcodeproj/project.pbxproj4
-rw-r--r--src/core/renderer/MCHTMLRendererCallback.h3
-rw-r--r--src/objc/abstract/MCOAbstract.h1
-rw-r--r--src/objc/abstract/MCOHTMLRendererDelegate.h30
-rw-r--r--src/objc/rfc822/MCOMessageParser.h22
-rw-r--r--src/objc/rfc822/MCOMessageParser.mm124
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