diff options
author | Matt Ronge <mronge@mronge.com> | 2013-01-31 20:33:49 -0600 |
---|---|---|
committer | Matt Ronge <mronge@mronge.com> | 2013-01-31 20:33:49 -0600 |
commit | 3d95ea21fa92fe859eb14781c44185c5da4a62b9 (patch) | |
tree | 955a95f8fe5e9da040f158acbd2f046688cefde5 | |
parent | b1eb6ca70a0399a6202bc34e26bd5501ae0c3ac9 (diff) |
Start of an Obj-C async API
-rw-r--r-- | build-mac/mailcore2.xcodeproj/project.pbxproj | 52 | ||||
-rw-r--r-- | src/core/basetypes/MCOperation.cc | 5 | ||||
-rw-r--r-- | src/core/basetypes/MCOperation.h | 2 | ||||
-rw-r--r-- | src/objc/MCOConstants.h | 17 | ||||
-rw-r--r-- | src/objc/MCObjC.h | 7 | ||||
-rw-r--r-- | src/objc/imap/MCOCheckAccountOperation.h | 12 | ||||
-rw-r--r-- | src/objc/imap/MCOCheckAccountOperation.mm | 25 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPSession.h | 30 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPSession.m | 13 | ||||
-rw-r--r-- | src/objc/imap/MCOIMAPSession.mm | 130 | ||||
-rw-r--r-- | src/objc/imap/MCOOperation+Internal.h.h | 13 | ||||
-rw-r--r-- | src/objc/imap/MCOOperation+Internal.h.m | 13 | ||||
-rw-r--r-- | src/objc/imap/MCOOperation+Internals.h | 17 | ||||
-rw-r--r-- | src/objc/imap/MCOOperation.h | 21 | ||||
-rw-r--r-- | src/objc/imap/MCOOperation.mm | 77 | ||||
-rw-r--r-- | src/objc/utils/NSError+MCO.h | 14 | ||||
-rw-r--r-- | src/objc/utils/NSError+MCO.m | 10 | ||||
-rw-r--r-- | src/objc/utils/NSError+MCO.mm | 18 | ||||
-rw-r--r-- | tests/main.mm | 22 |
19 files changed, 496 insertions, 2 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index e062fcd0..84da20d3 100644 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -7,6 +7,15 @@ objects = { /* Begin PBXBuildFile section */ + C07AD27FF065FA4408F65F19 /* MCOCheckAccountOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD98150338A79BF83CCEF /* MCOCheckAccountOperation.h */; }; + C07AD5D7FD82F8ACAB576231 /* NSError+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD44B013BB42A240B4F04 /* NSError+MCO.h */; }; + C07AD81B53C5CEEC3A80E117 /* MCOOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD7F5AFD80134A72B2CDA /* MCOOperation.h */; }; + C07AD99B2E2054C684DB8FF6 /* NSError+MCO.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */; }; + C07ADA0FE807DC9D166BBF37 /* MCOCheckAccountOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07AD721E48D521D6E3F4943 /* MCOCheckAccountOperation.mm */; }; + C07ADA66C41ADE958A8FCDB8 /* MCOConstants.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD972CED96BD61F395435 /* MCOConstants.h */; }; + C07ADABEC4F5BD428DD5D169 /* MCOOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07ADA45C4D358FA342A9C91 /* MCOOperation.mm */; }; + C07ADC28B83E7959BF114D46 /* MCOIMAPSession.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */; }; + C07ADEB0D26FD9BDD2709D39 /* MCOOperation+Internals.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD358A724B6DDD869929C /* MCOOperation+Internals.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 */; }; @@ -165,6 +174,7 @@ C6D42C2A16AE0507002BB4F9 /* NSData+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6D42C1916AE03D6002BB4F9 /* NSData+MCO.h */; }; C6D42C2C16AE0509002BB4F9 /* NSString+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6D42C1B16AE03D6002BB4F9 /* NSString+MCO.h */; }; C6EB30DE16B5B8050091F4F1 /* MCObjC.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C6EB30DC16B5B7770091F4F1 /* MCObjC.h */; }; + F8EA941716BB1C9D0011AC6F /* MCOIMAPSession.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = F8EA941416BAED6E0011AC6F /* MCOIMAPSession.h */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -266,6 +276,12 @@ C64EA77D169E859600778456 /* MCSMTP.h in CopyFiles */, C64EA77E169E859600778456 /* MCSMTPProgressCallback.h in CopyFiles */, C64EA77F169E859600778456 /* MCSMTPSession.h in CopyFiles */, + C07AD81B53C5CEEC3A80E117 /* MCOOperation.h in CopyFiles */, + F8EA941716BB1C9D0011AC6F /* MCOIMAPSession.h in CopyFiles */, + C07ADEB0D26FD9BDD2709D39 /* MCOOperation+Internals.h in CopyFiles */, + C07ADA66C41ADE958A8FCDB8 /* MCOConstants.h in CopyFiles */, + C07AD27FF065FA4408F65F19 /* MCOCheckAccountOperation.h in CopyFiles */, + C07AD5D7FD82F8ACAB576231 /* NSError+MCO.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -281,6 +297,15 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPSession.mm; sourceTree = "<group>"; }; + C07AD358A724B6DDD869929C /* MCOOperation+Internals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MCOOperation+Internals.h"; sourceTree = "<group>"; }; + C07AD44B013BB42A240B4F04 /* NSError+MCO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+MCO.h"; sourceTree = "<group>"; }; + C07AD721E48D521D6E3F4943 /* MCOCheckAccountOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOCheckAccountOperation.mm; sourceTree = "<group>"; }; + C07AD7F5AFD80134A72B2CDA /* MCOOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOOperation.h; sourceTree = "<group>"; }; + C07AD972CED96BD61F395435 /* MCOConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOConstants.h; sourceTree = "<group>"; }; + C07AD98150338A79BF83CCEF /* MCOCheckAccountOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOCheckAccountOperation.h; sourceTree = "<group>"; }; + C07ADA45C4D358FA342A9C91 /* MCOOperation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOOperation.mm; sourceTree = "<group>"; }; + C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSError+MCO.mm"; 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>"; }; @@ -452,6 +477,7 @@ C6D42C1B16AE03D6002BB4F9 /* NSString+MCO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+MCO.h"; sourceTree = "<group>"; }; C6D42C1C16AE03D6002BB4F9 /* NSString+MCO.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSString+MCO.mm"; sourceTree = "<group>"; }; C6EB30DC16B5B7770091F4F1 /* MCObjC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCObjC.h; sourceTree = "<group>"; }; + F8EA941416BAED6E0011AC6F /* MCOIMAPSession.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPSession.h; sourceTree = "<group>"; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -771,8 +797,10 @@ C6D42C0016ADF5AF002BB4F9 /* objc */ = { isa = PBXGroup; children = ( + F8EA941316BAED500011AC6F /* imap */, C6D42C1816AE03D6002BB4F9 /* utils */, C6EB30DC16B5B7770091F4F1 /* MCObjC.h */, + C07AD972CED96BD61F395435 /* MCOConstants.h */, ); path = objc; sourceTree = "<group>"; @@ -786,10 +814,26 @@ C6D42C1C16AE03D6002BB4F9 /* NSString+MCO.mm */, C64FF38F16B3C13000F8C162 /* MCOObjectWrapper.h */, C64FF39016B3C13000F8C162 /* MCOObjectWrapper.mm */, + C07AD44B013BB42A240B4F04 /* NSError+MCO.h */, + C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */, ); path = utils; sourceTree = "<group>"; }; + F8EA941316BAED500011AC6F /* imap */ = { + isa = PBXGroup; + children = ( + F8EA941416BAED6E0011AC6F /* MCOIMAPSession.h */, + C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */, + C07AD7F5AFD80134A72B2CDA /* MCOOperation.h */, + C07ADA45C4D358FA342A9C91 /* MCOOperation.mm */, + C07AD358A724B6DDD869929C /* MCOOperation+Internals.h */, + C07AD98150338A79BF83CCEF /* MCOCheckAccountOperation.h */, + C07AD721E48D521D6E3F4943 /* MCOCheckAccountOperation.mm */, + ); + path = imap; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -949,6 +993,10 @@ C6D42C1D16AE03D6002BB4F9 /* NSData+MCO.mm in Sources */, C6D42C1E16AE03D6002BB4F9 /* NSString+MCO.mm in Sources */, C64FF39116B3C13000F8C162 /* MCOObjectWrapper.mm in Sources */, + C07ADC28B83E7959BF114D46 /* MCOIMAPSession.mm in Sources */, + C07ADABEC4F5BD428DD5D169 /* MCOOperation.mm in Sources */, + C07ADA0FE807DC9D166BBF37 /* MCOCheckAccountOperation.mm in Sources */, + C07AD99B2E2054C684DB8FF6 /* NSError+MCO.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -978,6 +1026,7 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -1016,6 +1065,7 @@ ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = NO; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; @@ -1069,6 +1119,7 @@ "-lcrypto", "-lsasl2", "-liconv", + "-all_load", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1087,6 +1138,7 @@ "-lcrypto", "-lsasl2", "-liconv", + "-all_load", ); PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/src/core/basetypes/MCOperation.cc b/src/core/basetypes/MCOperation.cc index 61dd48e6..d42a0598 100644 --- a/src/core/basetypes/MCOperation.cc +++ b/src/core/basetypes/MCOperation.cc @@ -43,3 +43,8 @@ bool Operation::isCancelled() void Operation::main() { } + +void Operation::start() +{ +} + diff --git a/src/core/basetypes/MCOperation.h b/src/core/basetypes/MCOperation.h index c873f7e8..e5b8fa33 100644 --- a/src/core/basetypes/MCOperation.h +++ b/src/core/basetypes/MCOperation.h @@ -23,6 +23,8 @@ namespace mailcore { virtual bool isCancelled(); virtual void main(); + + virtual void start(); private: OperationCallback * mCallback; diff --git a/src/objc/MCOConstants.h b/src/objc/MCOConstants.h new file mode 100644 index 00000000..355fceb3 --- /dev/null +++ b/src/objc/MCOConstants.h @@ -0,0 +1,17 @@ +typedef enum { + MCOConnectionTypeClear = 1 << 0, + MCOConnectionTypeStartTLS = 1 << 1, + MCOConnectionTypeTLS = 1 << 2, +} MCOConnectionType; + +typedef enum { + MCOAuthTypeSASLNone = 0, + MCOAuthTypeSASLCRAMMD5 = 1 << 0, + MCOAuthTypeSASLPlain = 1 << 1, + MCOAuthTypeSASLGSSAPI = 1 << 2, + MCOAuthTypeSASLDIGESTMD5 = 1 << 3, + MCOAuthTypeSASLLogin = 1 << 4, + MCOAuthTypeSASLSRP = 1 << 5, + MCOAuthTypeSASLNTLM = 1 << 6, + MCOAuthTypeSASLKerberosV4 = 1 << 7, +} MCOAuthType; diff --git a/src/objc/MCObjC.h b/src/objc/MCObjC.h index 82fda937..364d5692 100644 --- a/src/objc/MCObjC.h +++ b/src/objc/MCObjC.h @@ -11,9 +11,14 @@ #ifdef __OBJC__ +#import <mailcore/MCOObjectWrapper.h> #import <mailcore/NSData+MCO.h> #import <mailcore/NSString+MCO.h> -#import <mailcore/MCOObjectWrapper.h> +#import <mailcore/NSError+MCO.h> +#import <mailcore/MCOIMAPSession.h> +#import <mailcore/MCOOperation.h> +#import <mailcore/MCOCheckAccountOperation.h> + #endif diff --git a/src/objc/imap/MCOCheckAccountOperation.h b/src/objc/imap/MCOCheckAccountOperation.h new file mode 100644 index 00000000..340eb4fc --- /dev/null +++ b/src/objc/imap/MCOCheckAccountOperation.h @@ -0,0 +1,12 @@ +// +// MCOCheckAccountOperation.h +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + +#import <mailcore/MCOOperation.h> + +@interface MCOCheckAccountOperation : MCOOperation +@end diff --git a/src/objc/imap/MCOCheckAccountOperation.mm b/src/objc/imap/MCOCheckAccountOperation.mm new file mode 100644 index 00000000..2c3c2239 --- /dev/null +++ b/src/objc/imap/MCOCheckAccountOperation.mm @@ -0,0 +1,25 @@ +// +// MCOCheckAccountOperation.m +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + +#import <mailcore/MCCore.h> + +#import "MCOOperation+Internals.h" +#import "MCOCheckAccountOperation.h" +#import "NSError+MCO.h" + +using namespace mailcore; + +@implementation MCOCheckAccountOperation + +- (void)operationCompleted { + IMAPOperation *op = dynamic_cast<IMAPOperation *>(self.operation); + NSError *error = [NSError mco_errorWithErrorCode:op->error()]; + self.completionBlock(error, self, nil); // No data to return +} + +@end diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h new file mode 100644 index 00000000..233220a4 --- /dev/null +++ b/src/objc/imap/MCOIMAPSession.h @@ -0,0 +1,30 @@ +// +// MCOIMAPSession.h +// mailcore2 +// +// Created by Matt Ronge on 1/31/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import <Foundation/Foundation.h> +#import <mailcore/MCOConstants.h> +#import <mailcore/MCOOperation.h> + +@class MCOCheckAccountOperation; + +@interface MCOIMAPSession : NSObject +@property (nonatomic, strong) NSString *hostname; +@property (nonatomic, assign) unsigned int port; +@property (nonatomic, strong) NSString *username; +@property (nonatomic, strong) NSString *password; +@property (nonatomic, assign) MCOAuthType authType; +@property (nonatomic, assign) MCOConnectionType connectionType; + +@property (nonatomic, assign) NSTimeInterval timeout; +@property (nonatomic, assign) BOOL checkCertificateEnabled; +@property (nonatomic, assign) BOOL VoIPEnabled; +@property (nonatomic, strong) NSString *delimiter; + +- (MCOCheckAccountOperation *)checkAccount:(MCOCompletionBlock)completionBlock; + +@end diff --git a/src/objc/imap/MCOIMAPSession.m b/src/objc/imap/MCOIMAPSession.m new file mode 100644 index 00000000..c5254685 --- /dev/null +++ b/src/objc/imap/MCOIMAPSession.m @@ -0,0 +1,13 @@ +// +// MCOIMAPSession.m +// mailcore2 +// +// Created by Matt Ronge on 1/31/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCOIMAPSession.h" + +@implementation MCOIMAPSession + +@end diff --git a/src/objc/imap/MCOIMAPSession.mm b/src/objc/imap/MCOIMAPSession.mm new file mode 100644 index 00000000..56e747a5 --- /dev/null +++ b/src/objc/imap/MCOIMAPSession.mm @@ -0,0 +1,130 @@ +// +// MCOIMAPSession.m +// mailcore2 +// +// Created by Matt Ronge on 1/31/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCOIMAPSession.h" +#import "MCOOperation+Internals.h" +#import "MCOObjectWrapper.h" +#import "MCOCheckAccountOperation.h" + +#import "NSString+MCO.h" + +#import <mailcore/MCAsync.h> + + +using namespace mailcore; + +@implementation MCOIMAPSession { + MCOObjectWrapper *_wrapper; +} + +- (id)init { + self = [super init]; + if (self) { + _wrapper = [MCOObjectWrapper objectWrapperWithObject:new IMAPAsyncSession()]; + } + return self; +} + +- (IMAPAsyncSession *)session { + return dynamic_cast<IMAPAsyncSession *>([_wrapper object]); +} + +- (NSString *)hostname { + return [NSString mco_stringWithMCString:self.session->hostname()]; +} + +- (void)setHostname:(NSString *)hostname { + self.session->setHostname([hostname mco_mcString]); +} + +- (unsigned int)port { + return self.session->port(); +} + +- (void)setPort:(unsigned int)port { + self.session->setPort(port); +} + +- (NSString *)username { + return [NSString mco_stringWithMCString:self.session->username()]; +} + +- (void)setUsername:(NSString *)username { + self.session->setUsername([username mco_mcString]); +} + +- (NSString *)password { + return [NSString mco_stringWithMCString:self.session->password()]; +} + +- (void)setPassword:(NSString *)password { + self.session->setPassword([password mco_mcString]); +} + +- (void)setAuthType:(MCOAuthType)authType { + self.session->setAuthType((AuthType)authType); +} + +- (MCOAuthType)authType { + return (MCOAuthType)self.session->authType(); +} + +- (void)setConnectionType:(MCOConnectionType)connectionType { + self.session->setConnectionType((ConnectionType)connectionType); +} + +- (MCOConnectionType)connectionType{ + return (MCOConnectionType)self.session->connectionType(); +} + +- (void)setTimeout:(NSTimeInterval)timeout { + self.session->setTimeout((time_t)timeout); +} + +- (NSTimeInterval)timeout { + return (NSTimeInterval)self.session->timeout(); +} + +- (void)setCheckCertificateEnabled:(BOOL)checkCertificateEnabled { + self.session->setCheckCertificateEnabled(checkCertificateEnabled); +} + +- (BOOL)checkCertificateEnabled { + return (BOOL)self.session->isCheckCertificateEnabled(); +} + +- (void)setVoIPEnabled:(BOOL)VoIPEnabled { + self.session->setVoIPEnabled(VoIPEnabled); +} + +- (BOOL)VoIPEnabled { + return (BOOL)self.session->isVoIPEnabled(); +} + +- (NSString *)delimiter { + char delim = self.session->delimiter(); + return [NSString stringWithFormat:@"%c", delim]; +} + +- (void)setDelimiter:(NSString *)delimiter { + NSAssert(delimiter.length == 1, @"Delimiter has to be a single char"); + char delim = [delimiter UTF8String][0]; + self.session->setDelimiter(delim); +} + +#pragma mark - Operations + +- (MCOCheckAccountOperation *)checkAccount:(MCOCompletionBlock)completionBlock { + IMAPOperation *coreOp = self.session->checkAccountOperation(); + MCOCheckAccountOperation *op = [[MCOCheckAccountOperation alloc] initWithOperation:coreOp]; + op.completionBlock = completionBlock; + [op start]; + return [op autorelease]; + +} +@end diff --git a/src/objc/imap/MCOOperation+Internal.h.h b/src/objc/imap/MCOOperation+Internal.h.h new file mode 100644 index 00000000..298cc2fd --- /dev/null +++ b/src/objc/imap/MCOOperation+Internal.h.h @@ -0,0 +1,13 @@ +// +// MCOOperation+Internal.h.h +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + + + +@interface MCOOperation_Internal : NSObject + +@end diff --git a/src/objc/imap/MCOOperation+Internal.h.m b/src/objc/imap/MCOOperation+Internal.h.m new file mode 100644 index 00000000..dcde8895 --- /dev/null +++ b/src/objc/imap/MCOOperation+Internal.h.m @@ -0,0 +1,13 @@ +// +// MCOOperation+Internal.h.m +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + +#import "MCOOperation+Internal.h" + +@implementation MCOOperation_Internal_h + +@end diff --git a/src/objc/imap/MCOOperation+Internals.h b/src/objc/imap/MCOOperation+Internals.h new file mode 100644 index 00000000..3f12338d --- /dev/null +++ b/src/objc/imap/MCOOperation+Internals.h @@ -0,0 +1,17 @@ +// +// MCOOperation+Internals.h +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import <mailcore/MCOperation.h> +#import <mailcore/MCOOperation.h> + +// Shhh, secret stuff in here + +@interface MCOOperation () +- (id)initWithOperation:(mailcore::Operation *)op; +- (mailcore::Operation *)operation; +@end
\ No newline at end of file diff --git a/src/objc/imap/MCOOperation.h b/src/objc/imap/MCOOperation.h new file mode 100644 index 00000000..bd13a343 --- /dev/null +++ b/src/objc/imap/MCOOperation.h @@ -0,0 +1,21 @@ +// +// MCOOperation.h +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + +#import <Foundation/Foundation.h> + +@class MCOOperation; + +typedef void (^MCOCompletionBlock)(NSError *error, MCOOperation *op, id response); + +@interface MCOOperation : NSObject +@property (copy) MCOCompletionBlock completionBlock; +@property (readonly) BOOL isCancelled; + +- (void)cancel; +- (void)start; +@end diff --git a/src/objc/imap/MCOOperation.mm b/src/objc/imap/MCOOperation.mm new file mode 100644 index 00000000..62cf98ad --- /dev/null +++ b/src/objc/imap/MCOOperation.mm @@ -0,0 +1,77 @@ +// +// MCOOperation.m +// mailcore2 +// +// Created by Matt Ronge on 01/31/13. +// Copyright (c) 2013 __MyCompanyName__. All rights reserved. +// + +#import "MCOOperation.h" +#import "MCOperation.h" +#import "MCOperationCallback.h" +#import "MCOObjectWrapper.h" + +#import <Foundation/Foundation.h> + +using namespace mailcore; + +@interface MCOOperation () +- (void)operationCompleted; +@end + +class CompletionCallback : public Object, public OperationCallback { +public: + CompletionCallback(MCOOperation *op) { + mOperation = op; + } + + virtual void operationFinished(Operation * op) + { + [mOperation operationCompleted]; + } + + private: + MCOOperation *mOperation; +}; + +@implementation MCOOperation { + MCOObjectWrapper *_wrapper; // Operation + MCOObjectWrapper *_completionWrapper; // CompletionCallback +} + +- (id)initWithOperation:(Operation *)op +{ + self = [super init]; + if (self) { + _wrapper = [MCOObjectWrapper objectWrapperWithObject:op]; + + CompletionCallback *callback = new CompletionCallback(self); + _completionWrapper = [MCOObjectWrapper objectWrapperWithObject:callback]; + self.operation->setCallback(callback); + } + return self; +} + +- (BOOL)isCancelled +{ + return self.operation->isCancelled(); +} + +- (void)cancel +{ + self.operation->cancel(); +} + +- (void)start +{ + self.operation->start(); +} + +- (Operation *)operation { + return dynamic_cast<Operation *>([_wrapper object]); +} + +- (void)operationCompleted { +} + +@end diff --git a/src/objc/utils/NSError+MCO.h b/src/objc/utils/NSError+MCO.h new file mode 100644 index 00000000..1d8ca85b --- /dev/null +++ b/src/objc/utils/NSError+MCO.h @@ -0,0 +1,14 @@ +// +// Created by mronge on 1/31/13. +// + + +#import <Foundation/Foundation.h> + +#import <MailCore/MCMessageConstants.h> + +@interface NSError (MCO) +#ifdef __cplusplus ++ (NSError *)mco_errorWithErrorCode:(mailcore::ErrorCode)code; +#endif +@end
\ No newline at end of file diff --git a/src/objc/utils/NSError+MCO.m b/src/objc/utils/NSError+MCO.m new file mode 100644 index 00000000..6ffd9499 --- /dev/null +++ b/src/objc/utils/NSError+MCO.m @@ -0,0 +1,10 @@ +// +// Created by mronge on 1/31/13. +// + + +#import "NSError+MCO.h" + + +@implementation NSError (MCO) +@end
\ No newline at end of file diff --git a/src/objc/utils/NSError+MCO.mm b/src/objc/utils/NSError+MCO.mm new file mode 100644 index 00000000..966d41bb --- /dev/null +++ b/src/objc/utils/NSError+MCO.mm @@ -0,0 +1,18 @@ +// +// Created by mronge on 1/31/13. +// + + +#import "NSError+MCO.h" + +@implementation NSError (MCO) ++ (NSError *)mco_errorWithErrorCode:(mailcore::ErrorCode)code { + if (code == mailcore::ErrorNone) { + return nil; + } + + NSError *error = [NSError errorWithDomain:@"MailCore" code:(int)code + userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Unknown error: %d", (int)code]}]; + return error; +} +@end
\ No newline at end of file diff --git a/tests/main.mm b/tests/main.mm index 56a270fa..fe1efb2e 100644 --- a/tests/main.mm +++ b/tests/main.mm @@ -270,6 +270,24 @@ static void testAsyncPOP() [[NSRunLoop currentRunLoop] run]; } +void testObjc() +{ + MCOIMAPSession *session = [[MCOIMAPSession alloc] init]; + session.username = @"username"; + session.password = @"password"; + session.hostname = @"imap.gmail.com"; + session.port = 993; + session.connectionType = MCOConnectionTypeTLS; + + [session checkAccount:^(NSError *err, MCOOperation *op, id result) { + NSLog(@"CONNECTED? %@", err); + }]; + + [[NSRunLoop currentRunLoop] run]; + [session release]; +} + + void testAll() { u_setDataDirectory("/usr/local/share/icu"); @@ -286,7 +304,9 @@ void testAll() //testAsyncSMTP(data); //testAsyncIMAP(); //testAsyncPOP(); - + + testObjc(); + MCLog("pool release"); pool->release(); } |