aboutsummaryrefslogtreecommitdiffhomepage
path: root/example/mac/macExample/macExample/MCTMsgViewController.m
diff options
context:
space:
mode:
Diffstat (limited to 'example/mac/macExample/macExample/MCTMsgViewController.m')
-rw-r--r--example/mac/macExample/macExample/MCTMsgViewController.m255
1 files changed, 255 insertions, 0 deletions
diff --git a/example/mac/macExample/macExample/MCTMsgViewController.m b/example/mac/macExample/macExample/MCTMsgViewController.m
new file mode 100644
index 00000000..2f8dea38
--- /dev/null
+++ b/example/mac/macExample/macExample/MCTMsgViewController.m
@@ -0,0 +1,255 @@
+//
+// MCTMsgViewController.m
+// testUI
+//
+// Created by DINH Viêt Hoà on 1/20/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import "MCTMsgViewController.h"
+
+#import "MCOMessageView.h"
+
+@interface MCTMsgViewController () <MCOMessageViewDelegate>
+
+@end
+
+@implementation MCTMsgViewController
+
+@synthesize folder = _folder;
+@synthesize session = _session;
+
+- (void) awakeFromNib
+{
+ _storage = [[NSMutableDictionary alloc] init];
+ _ops = [[NSMutableArray alloc] init];;
+ _pending = [[NSMutableSet alloc] init];;
+ _callbacks = [[NSMutableDictionary alloc] init];
+}
+
+- (void) setMessage:(MCOIMAPMessage *)message
+{
+ NSLog(@"set message : %@", message);
+ for(MCOOperation * op in _ops) {
+ [op cancel];
+ }
+ [_ops removeAllObjects];
+
+ [_callbacks removeAllObjects];
+ [_pending removeAllObjects];
+ [_storage removeAllObjects];
+ [_message release];
+ _message = [message retain];
+
+ if (0) {
+ [_messageView setDelegate:self];
+ [_messageView setFolder:_folder];
+ [_messageView setMessage:message];
+ }
+ else {
+ [_messageView setMessage:NULL];
+ MCOIMAPFetchContentOperation * op = [_session fetchMessageByUIDOperationWithFolder:_folder uid:[_message uid]];
+ [_ops addObject:op];
+ [op start:^(NSError * error, NSData * data) {
+ if ([error code] != MCOErrorNone) {
+ return;
+ }
+
+ NSAssert(data != nil, @"data != nil");
+
+ MCOMessageParser * msg = [MCOMessageParser messageParserWithData:data];
+ [_messageView setDelegate:self];
+ [_messageView setFolder:_folder];
+ [_messageView setMessage:msg];
+ }];
+ }
+}
+
+- (MCOIMAPMessage *) message
+{
+ return _message;
+}
+
+- (MCOIMAPFetchContentOperation *) _fetchIMAPPartWithUniqueID:(NSString *)partUniqueID folder:(NSString *)folder
+{
+ NSLog(@"%@ is missing, fetching", partUniqueID);
+
+ if ([_pending containsObject:partUniqueID]) {
+ return NULL;
+ }
+
+ MCOIMAPPart * part = (MCOIMAPPart *) [_message partForUniqueID:partUniqueID];
+ NSAssert(part != nil, @"part != nil");
+
+ [_pending addObject:partUniqueID];
+
+ MCOIMAPFetchContentOperation * op = [_session fetchMessageAttachmentByUIDOperationWithFolder:folder uid:[_message uid] partID:[part partID] encoding:[part encoding]];
+ [_ops addObject:op];
+ [op start:^(NSError * error, NSData * data) {
+ if ([error code] != MCOErrorNone) {
+ [self _callbackForPartUniqueID:partUniqueID error:error];
+ return;
+ }
+
+ NSAssert(data != NULL, @"data != nil");
+ [_ops removeObject:op];
+ [_storage setObject:data forKey:partUniqueID];
+ [_pending removeObject:partUniqueID];
+ NSLog(@"downloaded %@", partUniqueID);
+
+ [self _callbackForPartUniqueID:partUniqueID error:nil];
+ }];
+
+ return op;
+}
+
+typedef void (^DownloadCallback)(NSError * error);
+
+- (void) _callbackForPartUniqueID:(NSString *)partUniqueID error:(NSError *)error
+{
+ NSArray * blocks;
+ blocks = [_callbacks objectForKey:partUniqueID];
+ NSLog(@"%@", blocks);
+ for(DownloadCallback block in blocks) {
+ block(error);
+ }
+ NSLog(@"done: %@", blocks);
+}
+
+- (NSString *) MCOMessageView_templateForAttachment:(MCOMessageView *)view
+{
+ return @"<div><img src=\"http://www.iconshock.com/img_jpg/OFFICE/general/jpg/128/attachment_icon.jpg\"/></div>\
+{{#HASSIZE}}\
+<div>- {{FILENAME}}, {{SIZE}}</div>\
+{{/HASSIZE}}\
+{{#NOSIZE}}\
+<div>- {{FILENAME}}</div>\
+{{/NOSIZE}}";
+}
+
+- (NSString *) MCOMessageView_templateForMessage:(MCOMessageView *)view
+{
+ return @"<div style=\"padding-bottom: 20px; font-family: Helvetica; font-size: 13px;\">{{HEADER}}</div><div>{{BODY}}</div>";
+}
+
+- (BOOL) MCOMessageView:(MCOMessageView *)view canPreviewPart:(MCOAbstractPart *)part
+{
+ // tiff, tif, pdf
+ NSString * mimeType = [[part mimeType] lowercaseString];
+ if ([mimeType isEqualToString:@"image/tiff"]) {
+ return YES;
+ }
+ else if ([mimeType isEqualToString:@"image/tif"]) {
+ return YES;
+ }
+ else if ([mimeType isEqualToString:@"application/pdf"]) {
+ return YES;
+ }
+
+ NSString * ext = nil;
+ if ([part filename] != nil) {
+ if ([[part filename] pathExtension] != nil) {
+ ext = [[[part filename] pathExtension] lowercaseString];
+ }
+ }
+ if (ext != nil) {
+ if ([ext isEqualToString:@"tiff"]) {
+ return YES;
+ }
+ else if ([ext isEqualToString:@"tif"]) {
+ return YES;
+ }
+ else if ([ext isEqualToString:@"pdf"]) {
+ return YES;
+ }
+ }
+
+ return NO;
+}
+
+- (NSString *) MCOMessageView:(MCOMessageView *)view filteredHTML:(NSString *)html
+{
+ return html;
+}
+
+- (NSData *) MCOMessageView:(MCOMessageView *)view dataForPartWithUniqueID:(NSString *)partUniqueID
+{
+ NSData * data = [_storage objectForKey:partUniqueID];
+ return data;
+}
+
+- (void) MCOMessageView:(MCOMessageView *)view fetchDataForPartWithUniqueID:(NSString *)partUniqueID
+ downloadedFinished:(void (^)(NSError * error))downloadFinished
+{
+ MCOIMAPFetchContentOperation * op = [self _fetchIMAPPartWithUniqueID:partUniqueID folder:_folder];
+ [op setProgress:^(unsigned int current, unsigned int maximum) {
+ NSLog(@"progress content: %u/%u", current, maximum);
+ }];
+ [_ops addObject:op];
+ if (downloadFinished != NULL) {
+ NSMutableArray * blocks;
+ blocks = [_callbacks objectForKey:partUniqueID];
+ if (blocks == nil) {
+ blocks = [NSMutableArray array];
+ [_callbacks setObject:blocks forKey:partUniqueID];
+ }
+ [blocks addObject:[[downloadFinished copy] autorelease]];
+ }
+}
+
+- (NSData *) MCOMessageView:(MCOMessageView *)view previewForData:(NSData *)data isHTMLInlineImage:(BOOL)isHTMLInlineImage
+{
+ if (isHTMLInlineImage) {
+ return data;
+ }
+ else {
+ return [self _convertToJPEGData:data];
+ }
+}
+
+#define IMAGE_PREVIEW_HEIGHT 300
+#define IMAGE_PREVIEW_WIDTH 500
+
+- (NSData *) _convertToJPEGData:(NSData *)data
+{
+ CGImageSourceRef imageSource;
+ CGImageRef thumbnail;
+ NSMutableDictionary * info;
+ int width;
+ int height;
+ float quality;
+
+ width = IMAGE_PREVIEW_WIDTH;
+ height = IMAGE_PREVIEW_HEIGHT;
+ quality = 1.0;
+
+ imageSource = CGImageSourceCreateWithData((CFDataRef) data, NULL);
+ if (imageSource == NULL)
+ return nil;
+
+ info = [[NSMutableDictionary alloc] init];
+ [info setObject:(id) kCFBooleanTrue forKey:(id) kCGImageSourceCreateThumbnailWithTransform];
+ [info setObject:(id) kCFBooleanTrue forKey:(id) kCGImageSourceCreateThumbnailFromImageAlways];
+ [info setObject:(id) [NSNumber numberWithFloat:(float) IMAGE_PREVIEW_WIDTH] forKey:(id) kCGImageSourceThumbnailMaxPixelSize];
+ thumbnail = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, (CFDictionaryRef) info);
+ [info release];
+
+ CGImageDestinationRef destination;
+ NSMutableData * destData = [NSMutableData data];
+
+ destination = CGImageDestinationCreateWithData((CFMutableDataRef) destData,
+ (CFStringRef) @"public.jpeg",
+ 1, NULL);
+
+ CGImageDestinationAddImage(destination, thumbnail, NULL);
+ CGImageDestinationFinalize(destination);
+
+ CFRelease(destination);
+
+ CFRelease(thumbnail);
+ CFRelease(imageSource);
+
+ return destData;
+}
+
+@end