aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--build-mac/mailcore2.xcodeproj/project.pbxproj52
-rw-r--r--src/core/basetypes/MCOperation.cc5
-rw-r--r--src/core/basetypes/MCOperation.h2
-rw-r--r--src/objc/MCOConstants.h17
-rw-r--r--src/objc/MCObjC.h7
-rw-r--r--src/objc/imap/MCOCheckAccountOperation.h12
-rw-r--r--src/objc/imap/MCOCheckAccountOperation.mm25
-rw-r--r--src/objc/imap/MCOIMAPSession.h30
-rw-r--r--src/objc/imap/MCOIMAPSession.m13
-rw-r--r--src/objc/imap/MCOIMAPSession.mm130
-rw-r--r--src/objc/imap/MCOOperation+Internal.h.h13
-rw-r--r--src/objc/imap/MCOOperation+Internal.h.m13
-rw-r--r--src/objc/imap/MCOOperation+Internals.h17
-rw-r--r--src/objc/imap/MCOOperation.h21
-rw-r--r--src/objc/imap/MCOOperation.mm77
-rw-r--r--src/objc/utils/NSError+MCO.h14
-rw-r--r--src/objc/utils/NSError+MCO.m10
-rw-r--r--src/objc/utils/NSError+MCO.mm18
-rw-r--r--tests/main.mm22
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();
}