aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar CodaFi <devteam.codafi@gmail.com>2013-06-22 20:38:22 -0600
committerGravatar CodaFi <devteam.codafi@gmail.com>2013-06-22 20:38:22 -0600
commiteb8b3fe42b0fc2fcaf9d5ca3f7570ccbbe99b02c (patch)
treecba7b6eea1ae818437749cac07b36b5e0e531b5d
parenta24460880422f224c7d0ab906207bd5af7e0e8fc (diff)
parent74752eb7c987a2c1704f6f92486e4a4d3f77cbfb (diff)
Merge remote-tracking branch 'upstream/master' into NSCoding-NSCopying
-rw-r--r--build-mac/mailcore2.xcodeproj/project.pbxproj48
-rwxr-xr-xexample/ios/iOS UI Test/iOS UI Test/MCTMsgViewController.mm6
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h2
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m23
-rw-r--r--example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib235
-rw-r--r--example/mac/macExample/macExample/MCTMsgViewController.m2
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.cc44
-rw-r--r--src/async/imap/MCIMAPAsyncConnection.h6
-rw-r--r--src/async/imap/MCIMAPAsyncSession.cc1
-rw-r--r--src/async/imap/MCIMAPAsyncSession.h8
-rw-r--r--src/async/imap/MCIMAPDisconnectOperation.cc28
-rw-r--r--src/async/imap/MCIMAPDisconnectOperation.h32
-rw-r--r--src/async/imap/MCIMAPFetchFoldersOperation.h2
-rw-r--r--src/async/imap/MCIMAPFetchMessagesOperation.h2
-rw-r--r--src/async/imap/MCIMAPFolderStatusOperation.cc45
-rw-r--r--src/async/imap/MCIMAPFolderStatusOperation.h16
-rw-r--r--src/async/imap/MCIMAPIdleOperation.h2
-rw-r--r--src/async/imap/MCIMAPStoreLabelsOperation.h6
-rw-r--r--src/async/pop/MCPOPAsyncSession.cc5
-rw-r--r--src/async/pop/MCPOPAsyncSession.h4
-rw-r--r--src/async/pop/MCPOPFetchMessagesOperation.h2
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.cc61
-rw-r--r--src/async/smtp/MCSMTPAsyncSession.h12
-rw-r--r--src/async/smtp/MCSMTPDisconnectOperation.cc28
-rw-r--r--src/async/smtp/MCSMTPDisconnectOperation.h32
-rw-r--r--src/async/smtp/MCSMTPOperation.cc1
-rw-r--r--src/async/smtp/MCSMTPSendWithDataOperation.cc2
-rw-r--r--src/core/abstract/MCAbstractMessage.h4
-rw-r--r--src/core/abstract/MCAbstractMessagePart.cc15
-rw-r--r--src/core/abstract/MCAbstractMessagePart.h3
-rw-r--r--src/core/abstract/MCAbstractMultipart.cc18
-rw-r--r--src/core/abstract/MCAbstractMultipart.h2
-rw-r--r--src/core/abstract/MCAbstractPart.cc10
-rw-r--r--src/core/abstract/MCAbstractPart.h4
-rw-r--r--src/core/abstract/MCMessageHeader.h24
-rw-r--r--src/core/basetypes/MCAssert.c (renamed from src/core/basetypes/MCAssert.cc)2
-rw-r--r--src/core/basetypes/MCAssert.h14
-rw-r--r--src/core/basetypes/MCMainThread.h11
-rw-r--r--src/core/basetypes/MCMainThread.mm9
-rw-r--r--src/core/basetypes/MCObject.cc71
-rw-r--r--src/core/basetypes/MCObject.h1
-rw-r--r--src/core/basetypes/MCOperationQueue.cc20
-rw-r--r--src/core/basetypes/MCOperationQueue.h65
-rw-r--r--src/core/basetypes/MCOperationQueueCallback.h22
-rw-r--r--src/core/imap/MCIMAPFolderStatus.cc52
-rw-r--r--src/core/imap/MCIMAPFolderStatus.h35
-rw-r--r--src/core/imap/MCIMAPMessage.h6
-rw-r--r--src/core/imap/MCIMAPNamespace.h6
-rw-r--r--src/core/imap/MCIMAPNamespaceItem.h2
-rw-r--r--src/core/imap/MCIMAPSession.cc29
-rw-r--r--src/core/imap/MCIMAPSession.h269
-rw-r--r--src/core/provider/MCMailProvider.h16
-rw-r--r--src/core/renderer/MCAddressDisplay.h6
-rw-r--r--src/core/renderer/MCHTMLRenderer.h6
-rw-r--r--src/core/rfc822/MCMessageBuilder.cc14
-rw-r--r--src/core/rfc822/MCMessageBuilder.h4
-rw-r--r--src/core/rfc822/MCMessageParser.cc1
-rw-r--r--src/core/smtp/MCSMTPSession.cc4
-rw-r--r--src/core/smtp/MCSMTPSession.h5
-rw-r--r--src/objc/abstract/MCOAbstractMessage.h16
-rw-r--r--src/objc/abstract/MCOAbstractPart.h3
-rw-r--r--src/objc/abstract/MCOAbstractPart.mm1
-rw-r--r--src/objc/imap/MCOIMAPFolderStatus.h18
-rw-r--r--src/objc/imap/MCOIMAPFolderStatus.m35
-rw-r--r--src/objc/imap/MCOIMAPFolderStatus.mm72
-rw-r--r--src/objc/imap/MCOIMAPFolderStatusOperation.mm8
-rw-r--r--src/objc/imap/MCOIMAPMessage.h4
-rw-r--r--src/objc/imap/MCOIMAPNamespace.h4
-rw-r--r--src/objc/imap/MCOIMAPNamespaceItem.h2
-rw-r--r--src/objc/imap/MCOIMAPSearchExpression.mm14
-rw-r--r--src/objc/imap/MCOIMAPSession.h4
-rw-r--r--src/objc/pop/MCOPOPSession.h10
-rw-r--r--src/objc/pop/MCOPOPSession.mm6
-rw-r--r--src/objc/provider/MCOMailProvider.h6
-rw-r--r--src/objc/provider/MCOMailProvider.mm2
-rw-r--r--src/objc/rfc822/MCOMessageBuilder.h4
76 files changed, 1078 insertions, 536 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj
index be7f3652..41df2d15 100644
--- a/build-mac/mailcore2.xcodeproj/project.pbxproj
+++ b/build-mac/mailcore2.xcodeproj/project.pbxproj
@@ -12,9 +12,9 @@
9E774D8A1767C7F60065EB9B /* MCIMAPFolderStatus.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9E774D881767C7F60065EB9B /* MCIMAPFolderStatus.cc */; };
9E774D8B1767CD3C0065EB9B /* MCIMAPFolderStatus.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9E774D871767C54E0065EB9B /* MCIMAPFolderStatus.h */; };
9E774D8C1767CD490065EB9B /* MCIMAPFolderStatus.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9E774D871767C54E0065EB9B /* MCIMAPFolderStatus.h */; };
- 9EF9AB09175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.m */; };
- 9EF9AB0A175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.m */; };
- 9EF9AB0B175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.m */; };
+ 9EF9AB09175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.mm */; };
+ 9EF9AB0A175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.mm */; };
+ 9EF9AB0B175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.mm */; };
9EF9AB11175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB10175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc */; };
9EF9AB12175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB10175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc */; };
9EF9AB19175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9EF9AB18175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm */; };
@@ -29,6 +29,10 @@
C07AD5D7FD82F8ACAB576231 /* NSError+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C07AD44B013BB42A240B4F04 /* NSError+MCO.h */; };
C07AD99B2E2054C684DB8FF6 /* NSError+MCO.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */; };
C07ADC28B83E7959BF114D46 /* MCOIMAPSession.mm in Sources */ = {isa = PBXBuildFile; fileRef = C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */; };
+ C608167517759967001F1018 /* MCSMTPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */; };
+ C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */; };
+ C608167B177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */; };
+ C608167C177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */ = {isa = PBXBuildFile; fileRef = C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */; };
C623C58616FD6A50001BBEFC /* MCOConstants.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB26D16FD63F6000DB34C /* MCOConstants.h */; };
C623C58716FD6A61001BBEFC /* MCOOperation.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25716FD3BC2000DB34C /* MCOOperation.h */; };
C623C58816FD6DF6001BBEFC /* NSValue+MCO.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = C64BB25016FC2846000DB34C /* NSValue+MCO.h */; };
@@ -115,7 +119,7 @@
C64EA6FF169E847800778456 /* MCMessageHeader.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA69F169E847800778456 /* MCMessageHeader.cc */; };
C64EA701169E847800778456 /* MCAutoreleasePool.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A2169E847800778456 /* MCAutoreleasePool.cc */; };
C64EA704169E847800778456 /* MCArray.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A5169E847800778456 /* MCArray.cc */; };
- C64EA706169E847800778456 /* MCAssert.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A7169E847800778456 /* MCAssert.cc */; };
+ C64EA706169E847800778456 /* MCAssert.c in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A7169E847800778456 /* MCAssert.c */; };
C64EA708169E847800778456 /* MCData.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A9169E847800778456 /* MCData.cc */; };
C64EA70A169E847800778456 /* MCHash.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6AB169E847800778456 /* MCHash.cc */; };
C64EA70C169E847800778456 /* MCHashMap.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6AD169E847800778456 /* MCHashMap.cc */; };
@@ -435,7 +439,7 @@
C6BA2B9E1705F4E6003F0E9E /* MCMessageHeader.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA69F169E847800778456 /* MCMessageHeader.cc */; };
C6BA2B9F1705F4E6003F0E9E /* MCAutoreleasePool.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A2169E847800778456 /* MCAutoreleasePool.cc */; };
C6BA2BA01705F4E6003F0E9E /* MCArray.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A5169E847800778456 /* MCArray.cc */; };
- C6BA2BA11705F4E6003F0E9E /* MCAssert.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A7169E847800778456 /* MCAssert.cc */; };
+ C6BA2BA11705F4E6003F0E9E /* MCAssert.c in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A7169E847800778456 /* MCAssert.c */; };
C6BA2BA21705F4E6003F0E9E /* MCData.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6A9169E847800778456 /* MCData.cc */; };
C6BA2BA31705F4E6003F0E9E /* MCHash.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6AB169E847800778456 /* MCHash.cc */; };
C6BA2BA41705F4E6003F0E9E /* MCHashMap.cc in Sources */ = {isa = PBXBuildFile; fileRef = C64EA6AD169E847800778456 /* MCHashMap.cc */; };
@@ -1064,7 +1068,7 @@
9E774D871767C54E0065EB9B /* MCIMAPFolderStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPFolderStatus.h; sourceTree = "<group>"; };
9E774D881767C7F60065EB9B /* MCIMAPFolderStatus.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPFolderStatus.cc; sourceTree = "<group>"; };
9EF9AB06175F2EC60027FA3B /* MCOIMAPFolderStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPFolderStatus.h; sourceTree = "<group>"; };
- 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MCOIMAPFolderStatus.m; sourceTree = "<group>"; };
+ 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPFolderStatus.mm; sourceTree = "<group>"; };
9EF9AB0E175F30C20027FA3B /* MCIMAPFolderStatusOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPFolderStatusOperation.h; sourceTree = "<group>"; };
9EF9AB10175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPFolderStatusOperation.cc; sourceTree = "<group>"; };
9EF9AB16175F35C60027FA3B /* MCOIMAPFolderStatusOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPFolderStatusOperation.h; sourceTree = "<group>"; };
@@ -1072,6 +1076,11 @@
C07AD057D3C8FBDC7AC95733 /* MCOIMAPSession.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MCOIMAPSession.mm; sourceTree = "<group>"; };
C07AD44B013BB42A240B4F04 /* NSError+MCO.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+MCO.h"; sourceTree = "<group>"; };
C07ADFE43E22B38EFF23ADB5 /* NSError+MCO.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSError+MCO.mm"; sourceTree = "<group>"; };
+ C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCSMTPDisconnectOperation.cc; sourceTree = "<group>"; };
+ C608167417759967001F1018 /* MCSMTPDisconnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCSMTPDisconnectOperation.h; sourceTree = "<group>"; };
+ C6081678177625AD001F1018 /* MCOperationQueueCallback.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MCOperationQueueCallback.h; sourceTree = "<group>"; };
+ C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCIMAPDisconnectOperation.cc; sourceTree = "<group>"; };
+ C608167A177635D2001F1018 /* MCIMAPDisconnectOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCIMAPDisconnectOperation.h; 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>"; };
C623C58D16FE6B45001BBEFC /* MCOIMAPOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCOIMAPOperation.h; sourceTree = "<group>"; };
@@ -1176,7 +1185,7 @@
C64EA6A4169E847800778456 /* MCBaseTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCBaseTypes.h; sourceTree = "<group>"; };
C64EA6A5169E847800778456 /* MCArray.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCArray.cc; sourceTree = "<group>"; };
C64EA6A6169E847800778456 /* MCArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCArray.h; sourceTree = "<group>"; };
- C64EA6A7169E847800778456 /* MCAssert.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCAssert.cc; sourceTree = "<group>"; };
+ C64EA6A7169E847800778456 /* MCAssert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = MCAssert.c; sourceTree = "<group>"; };
C64EA6A8169E847800778456 /* MCAssert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCAssert.h; sourceTree = "<group>"; };
C64EA6A9169E847800778456 /* MCData.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MCData.cc; sourceTree = "<group>"; };
C64EA6AA169E847800778456 /* MCData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MCData.h; sourceTree = "<group>"; };
@@ -1667,8 +1676,10 @@
C62C6ED716A398FA00737497 /* MCIMAPFolderInfoOperation.h */,
C64BB22916E5C0A3000DB34C /* MCIMAPCapabilityOperation.cc */,
C64BB22A16E5C0A3000DB34C /* MCIMAPCapabilityOperation.h */,
- 9EF9AB0E175F30C20027FA3B /* MCIMAPFolderStatusOperation.h */,
9EF9AB10175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc */,
+ 9EF9AB0E175F30C20027FA3B /* MCIMAPFolderStatusOperation.h */,
+ C6081679177635D2001F1018 /* MCIMAPDisconnectOperation.cc */,
+ C608167A177635D2001F1018 /* MCIMAPDisconnectOperation.h */,
);
path = imap;
sourceTree = "<group>";
@@ -1704,6 +1715,8 @@
C64EA690169E847800778456 /* MCSMTPAsyncSession.h */,
C64EA79C169F29A700778456 /* MCSMTPSendWithDataOperation.cc */,
C64EA79D169F29A700778456 /* MCSMTPSendWithDataOperation.h */,
+ C608167317759967001F1018 /* MCSMTPDisconnectOperation.cc */,
+ C608167417759967001F1018 /* MCSMTPDisconnectOperation.h */,
C64EA7D816A1386500778456 /* MCSMTPOperation.cc */,
C64EA7D916A1386600778456 /* MCSMTPOperation.h */,
C64EA7E116A1425400778456 /* MCSMTPOperationCallback.h */,
@@ -1759,7 +1772,7 @@
C64EA6A4169E847800778456 /* MCBaseTypes.h */,
C64EA6A5169E847800778456 /* MCArray.cc */,
C64EA6A6169E847800778456 /* MCArray.h */,
- C64EA6A7169E847800778456 /* MCAssert.cc */,
+ C64EA6A7169E847800778456 /* MCAssert.c */,
C64EA6A8169E847800778456 /* MCAssert.h */,
C64EA6A9169E847800778456 /* MCData.cc */,
C64EA6AA169E847800778456 /* MCData.h */,
@@ -1797,6 +1810,7 @@
C64EA6C0169E847800778456 /* MCOperationCallback.h */,
C64EA6C1169E847800778456 /* MCOperationQueue.cc */,
C64EA6C2169E847800778456 /* MCOperationQueue.h */,
+ C6081678177625AD001F1018 /* MCOperationQueueCallback.h */,
C63CD68F16BE566D00DB18F1 /* MCHTMLCleaner.cc */,
C63CD69016BE566E00DB18F1 /* MCHTMLCleaner.h */,
C64BB22C16E5C1EE000DB34C /* MCIndexSet.cc */,
@@ -2071,7 +2085,7 @@
C6F61F9717016B460073032E /* MCOIMAPSearchExpression.h */,
C6F61F9817016B460073032E /* MCOIMAPSearchExpression.mm */,
9EF9AB06175F2EC60027FA3B /* MCOIMAPFolderStatus.h */,
- 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.m */,
+ 9EF9AB07175F2EC60027FA3B /* MCOIMAPFolderStatus.mm */,
9EF9AB16175F35C60027FA3B /* MCOIMAPFolderStatusOperation.h */,
9EF9AB18175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm */,
);
@@ -2303,7 +2317,7 @@
C64EA6FF169E847800778456 /* MCMessageHeader.cc in Sources */,
C64EA701169E847800778456 /* MCAutoreleasePool.cc in Sources */,
C64EA704169E847800778456 /* MCArray.cc in Sources */,
- C64EA706169E847800778456 /* MCAssert.cc in Sources */,
+ C64EA706169E847800778456 /* MCAssert.c in Sources */,
C64EA708169E847800778456 /* MCData.cc in Sources */,
C64EA70A169E847800778456 /* MCHash.cc in Sources */,
C64EA70C169E847800778456 /* MCHashMap.cc in Sources */,
@@ -2419,11 +2433,13 @@
C6F61F9917016B460073032E /* MCOIMAPSearchExpression.mm in Sources */,
C6F61F9F17016EA10073032E /* MCOIMAPFolderInfo.m in Sources */,
C6F61FB51702AB340073032E /* MCOIMAPBaseOperation.mm in Sources */,
+ C608167517759967001F1018 /* MCSMTPDisconnectOperation.cc in Sources */,
C6A81BBF17068E5E00882C15 /* MCOSMTPSession.mm in Sources */,
C6A81BC317068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */,
C6A81BC717068EB000882C15 /* MCOSMTPOperation.mm in Sources */,
C6A81BD61706903500882C15 /* MCOPOPSession.mm in Sources */,
C6A81BDA1706903E00882C15 /* MCOPOPFetchHeaderOperation.mm in Sources */,
+ C608167B177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */,
C6A81BDE1706904800882C15 /* MCOPOPFetchMessageOperation.mm in Sources */,
C6A81BE21706905600882C15 /* MCOPOPOperation.mm in Sources */,
C6A81BE61706906D00882C15 /* MCOPOPFetchMessagesOperation.mm in Sources */,
@@ -2441,7 +2457,7 @@
C6CF62C6175324F0006398B9 /* MCMailProvider.cc in Sources */,
C6CF62C8175324F0006398B9 /* MCMailProvidersManager.cc in Sources */,
C6CF62CA175324F0006398B9 /* MCNetService.cc in Sources */,
- 9EF9AB09175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */,
+ 9EF9AB09175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */,
9EF9AB11175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc in Sources */,
9EF9AB19175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm in Sources */,
9E774D891767C7F60065EB9B /* MCIMAPFolderStatus.cc in Sources */,
@@ -2454,7 +2470,7 @@
files = (
C64EA7AB16A00AF600778456 /* main.mm in Sources */,
C6A81BAF170684D300882C15 /* test-all.mm in Sources */,
- 9EF9AB0B175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */,
+ 9EF9AB0B175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */,
9EF9AB1B175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -2481,7 +2497,7 @@
C6BA2B9E1705F4E6003F0E9E /* MCMessageHeader.cc in Sources */,
C6BA2B9F1705F4E6003F0E9E /* MCAutoreleasePool.cc in Sources */,
C6BA2BA01705F4E6003F0E9E /* MCArray.cc in Sources */,
- C6BA2BA11705F4E6003F0E9E /* MCAssert.cc in Sources */,
+ C6BA2BA11705F4E6003F0E9E /* MCAssert.c in Sources */,
C6BA2BA21705F4E6003F0E9E /* MCData.cc in Sources */,
C6BA2BA31705F4E6003F0E9E /* MCHash.cc in Sources */,
C6BA2BA41705F4E6003F0E9E /* MCHashMap.cc in Sources */,
@@ -2597,11 +2613,13 @@
C6BA2C121705F4E6003F0E9E /* MCOIMAPSearchExpression.mm in Sources */,
C6BA2C131705F4E6003F0E9E /* MCOIMAPFolderInfo.m in Sources */,
C6BA2C141705F4E6003F0E9E /* MCOIMAPBaseOperation.mm in Sources */,
+ C608167617759968001F1018 /* MCSMTPDisconnectOperation.cc in Sources */,
C6A81BC017068E5E00882C15 /* MCOSMTPSession.mm in Sources */,
C6A81BC417068E9500882C15 /* MCOSMTPSendOperation.mm in Sources */,
C6A81BC817068EB000882C15 /* MCOSMTPOperation.mm in Sources */,
C6A81BD71706903500882C15 /* MCOPOPSession.mm in Sources */,
C6A81BDB1706903E00882C15 /* MCOPOPFetchHeaderOperation.mm in Sources */,
+ C608167C177635D2001F1018 /* MCIMAPDisconnectOperation.cc in Sources */,
C6A81BDF1706904800882C15 /* MCOPOPFetchMessageOperation.mm in Sources */,
C6A81BE31706905600882C15 /* MCOPOPOperation.mm in Sources */,
C6A81BE71706906D00882C15 /* MCOPOPFetchMessagesOperation.mm in Sources */,
@@ -2619,7 +2637,7 @@
C6CF62C7175324F0006398B9 /* MCMailProvider.cc in Sources */,
C6CF62C9175324F0006398B9 /* MCMailProvidersManager.cc in Sources */,
C6CF62CB175324F0006398B9 /* MCNetService.cc in Sources */,
- 9EF9AB0A175F2EC60027FA3B /* MCOIMAPFolderStatus.m in Sources */,
+ 9EF9AB0A175F2EC60027FA3B /* MCOIMAPFolderStatus.mm in Sources */,
9EF9AB12175F319A0027FA3B /* MCIMAPFolderStatusOperation.cc in Sources */,
9EF9AB1A175F36600027FA3B /* MCOIMAPFolderStatusOperation.mm in Sources */,
9E774D8A1767C7F60065EB9B /* MCIMAPFolderStatus.cc in Sources */,
diff --git a/example/ios/iOS UI Test/iOS UI Test/MCTMsgViewController.mm b/example/ios/iOS UI Test/iOS UI Test/MCTMsgViewController.mm
index dd2b36ee..ca3aecfc 100755
--- a/example/ios/iOS UI Test/iOS UI Test/MCTMsgViewController.mm
+++ b/example/ios/iOS UI Test/iOS UI Test/MCTMsgViewController.mm
@@ -91,7 +91,7 @@
MCLog("%s is missing, fetching", partUniqueID.description.UTF8String);
if ([_pending containsObject:partUniqueID]) {
- return NULL;
+ return nil;
}
MCOIMAPPart * part = (MCOIMAPPart *) [_message partForUniqueID:partUniqueID];
@@ -205,7 +205,9 @@ typedef void (^DownloadCallback)(NSError * error);
[op setProgress:^(unsigned int current, unsigned int maximum) {
MCLog("progress content: %u/%u", current, maximum);
}];
- [_ops addObject:op];
+ if (op != nil) {
+ [_ops addObject:op];
+ }
if (downloadFinished != NULL) {
NSMutableArray * blocks;
blocks = [_callbacks objectForKey:partUniqueID];
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h
index 2172b4d4..e5f5da48 100644
--- a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.h
@@ -11,6 +11,7 @@
extern NSString * const UsernameKey;
extern NSString * const PasswordKey;
extern NSString * const HostnameKey;
+extern NSString * const FetchFullMessageKey;
@protocol SettingsViewControllerDelegate;
@@ -19,6 +20,7 @@ extern NSString * const HostnameKey;
@property (weak, nonatomic) IBOutlet UITextField *emailTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@property (weak, nonatomic) IBOutlet UITextField *hostnameTextField;
+@property (weak, nonatomic) IBOutlet UISwitch *fetchFullMessageSwitch;
@property (nonatomic, weak) id<SettingsViewControllerDelegate> delegate;
- (IBAction)done:(id)sender;
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m
index 6fbd6db2..e2f0d2c5 100644
--- a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.m
@@ -12,24 +12,27 @@
NSString * const UsernameKey = @"username";
NSString * const PasswordKey = @"password";
NSString * const HostnameKey = @"hostname";
+NSString * const FetchFullMessageKey = @"FetchFullMessageEnabled";
@implementation SettingsViewController
- (void)done:(id)sender {
- [[NSUserDefaults standardUserDefaults] setObject:self.emailTextField.text ?: @"" forKey:UsernameKey];
- [[FXKeychain defaultKeychain] setObject:self.passwordTextField.text ?: @"" forKey:PasswordKey];
- [[NSUserDefaults standardUserDefaults] setObject:self.hostnameTextField.text ?: @"" forKey:HostnameKey];
-
- [self.delegate settingsViewControllerFinished:self];
+ [[NSUserDefaults standardUserDefaults] setObject:self.emailTextField.text ?: @"" forKey:UsernameKey];
+ [[FXKeychain defaultKeychain] setObject:self.passwordTextField.text ?: @"" forKey:PasswordKey];
+ [[NSUserDefaults standardUserDefaults] setObject:self.hostnameTextField.text ?: @"" forKey:HostnameKey];
+ [[NSUserDefaults standardUserDefaults] setBool:[self.fetchFullMessageSwitch isOn] forKey:FetchFullMessageKey];
+
+ [self.delegate settingsViewControllerFinished:self];
}
- (void)viewDidLoad {
[super viewDidLoad];
-
- self.view.backgroundColor = [UIColor underPageBackgroundColor];
- self.emailTextField.text = [[NSUserDefaults standardUserDefaults] stringForKey:UsernameKey];
- self.passwordTextField.text = [[FXKeychain defaultKeychain] objectForKey:PasswordKey];
- self.hostnameTextField.text = [[NSUserDefaults standardUserDefaults] stringForKey:HostnameKey];
+
+ self.view.backgroundColor = [UIColor underPageBackgroundColor];
+ self.emailTextField.text = [[NSUserDefaults standardUserDefaults] stringForKey:UsernameKey];
+ self.passwordTextField.text = [[FXKeychain defaultKeychain] objectForKey:PasswordKey];
+ self.hostnameTextField.text = [[NSUserDefaults standardUserDefaults] stringForKey:HostnameKey];
+ self.fetchFullMessageSwitch.on = [[NSUserDefaults standardUserDefaults] boolForKey:FetchFullMessageKey];
}
@end
diff --git a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib
index 00041150..3de561bd 100644
--- a/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib
+++ b/example/ios/iOS UI Test/iOS UI Test/SettingsViewController.xib
@@ -2,9 +2,9 @@
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
<data>
<int key="IBDocument.SystemTarget">1552</int>
- <string key="IBDocument.SystemVersion">12D78</string>
+ <string key="IBDocument.SystemVersion">12E55</string>
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
- <string key="IBDocument.AppKitVersion">1187.37</string>
+ <string key="IBDocument.AppKitVersion">1187.39</string>
<string key="IBDocument.HIToolboxVersion">626.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
@@ -14,8 +14,10 @@
<string>IBNSLayoutConstraint</string>
<string>IBProxyObject</string>
<string>IBUIBarButtonItem</string>
+ <string>IBUILabel</string>
<string>IBUINavigationBar</string>
<string>IBUINavigationItem</string>
+ <string>IBUISwitch</string>
<string>IBUITextField</string>
<string>IBUIView</string>
</array>
@@ -136,7 +138,7 @@
<string key="NSFrame">{{20, 142}, {280, 30}}</string>
<reference key="NSSuperview" ref="191373211"/>
<reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
+ <reference key="NSNextKeyView" ref="484795553"/>
<string key="NSReuseIdentifierKey">_NS:9</string>
<bool key="IBUIOpaque">NO</bool>
<bool key="IBUIClipsSubviews">YES</bool>
@@ -159,6 +161,44 @@
<reference key="IBUIFontDescription" ref="985700861"/>
<reference key="IBUIFont" ref="649714166"/>
</object>
+ <object class="IBUISwitch" id="348875194">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{208, 180}, {94, 27}}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIContentHorizontalAlignment">0</int>
+ <int key="IBUIContentVerticalAlignment">0</int>
+ </object>
+ <object class="IBUILabel" id="484795553">
+ <reference key="NSNextResponder" ref="191373211"/>
+ <int key="NSvFlags">292</int>
+ <string key="NSFrame">{{20, 183}, {143, 21}}</string>
+ <reference key="NSSuperview" ref="191373211"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="348875194"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <bool key="IBUIOpaque">NO</bool>
+ <bool key="IBUIClipsSubviews">YES</bool>
+ <int key="IBUIContentMode">7</int>
+ <bool key="IBUIUserInteractionEnabled">NO</bool>
+ <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <string key="IBUIText">Fetch full message</string>
+ <object class="NSColor" key="IBUITextColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MCAwIDAAA</bytes>
+ <string key="IBUIColorCocoaTouchKeyPath">darkTextColor</string>
+ </object>
+ <nil key="IBUIHighlightedColor"/>
+ <int key="IBUIBaselineAdjustment">0</int>
+ <reference key="IBUIFontDescription" ref="985700861"/>
+ <reference key="IBUIFont" ref="649714166"/>
+ <bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+ </object>
</array>
<string key="NSFrame">{{0, 20}, {320, 548}}</string>
<reference key="NSSuperview"/>
@@ -193,14 +233,6 @@
<array class="NSMutableArray" key="connectionRecords">
<object class="IBConnectionRecord">
<object class="IBCocoaTouchOutletConnection" key="connection">
- <string key="label">view</string>
- <reference key="source" ref="372490531"/>
- <reference key="destination" ref="191373211"/>
- </object>
- <int key="connectionID">3</int>
- </object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchOutletConnection" key="connection">
<string key="label">emailTextField</string>
<reference key="source" ref="372490531"/>
<reference key="destination" ref="339913914"/>
@@ -224,6 +256,22 @@
<int key="connectionID">55</int>
</object>
<object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">fetchFullMessageSwitch</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="348875194"/>
+ </object>
+ <int key="connectionID">68</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBCocoaTouchOutletConnection" key="connection">
+ <string key="label">view</string>
+ <reference key="source" ref="372490531"/>
+ <reference key="destination" ref="191373211"/>
+ </object>
+ <int key="connectionID">69</int>
+ </object>
+ <object class="IBConnectionRecord">
<object class="IBCocoaTouchEventConnection" key="connection">
<string key="label">done:</string>
<reference key="source" ref="38144743"/>
@@ -244,6 +292,70 @@
<int key="objectID">1</int>
<reference key="object" ref="191373211"/>
<array class="NSMutableArray" key="children">
+ <object class="IBNSLayoutConstraint" id="148058045">
+ <reference key="firstItem" ref="348875194"/>
+ <int key="firstAttribute">3</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="394260873"/>
+ <int key="secondAttribute">4</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">8</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">6</int>
+ <float key="scoringTypeFloat">24</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="719571487">
+ <reference key="firstItem" ref="191373211"/>
+ <int key="firstAttribute">6</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="348875194"/>
+ <int key="secondAttribute">6</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="918242346">
+ <reference key="firstItem" ref="484795553"/>
+ <int key="firstAttribute">10</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="348875194"/>
+ <int key="secondAttribute">10</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">0.0</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">6</int>
+ <float key="scoringTypeFloat">24</float>
+ <int key="contentType">2</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="342906512">
+ <reference key="firstItem" ref="484795553"/>
+ <int key="firstAttribute">5</int>
+ <int key="relation">0</int>
+ <reference key="secondItem" ref="191373211"/>
+ <int key="secondAttribute">5</int>
+ <float key="multiplier">1</float>
+ <object class="IBNSLayoutSymbolicConstant" key="constant">
+ <double key="value">20</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="191373211"/>
+ <int key="scoringType">8</int>
+ <float key="scoringTypeFloat">29</float>
+ <int key="contentType">3</int>
+ </object>
<object class="IBNSLayoutConstraint" id="1036238214">
<reference key="firstItem" ref="191373211"/>
<int key="firstAttribute">6</int>
@@ -440,6 +552,8 @@
<reference ref="339913914"/>
<reference ref="923634912"/>
<reference ref="394260873"/>
+ <reference ref="348875194"/>
+ <reference ref="484795553"/>
</array>
<reference key="parent" ref="0"/>
</object>
@@ -551,6 +665,80 @@
<reference key="object" ref="1036238214"/>
<reference key="parent" ref="191373211"/>
</object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="348875194"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="719571487"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="148058045"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">59</int>
+ <reference key="object" ref="484795553"/>
+ <array class="NSMutableArray" key="children">
+ <object class="IBNSLayoutConstraint" id="269062633">
+ <reference key="firstItem" ref="484795553"/>
+ <int key="firstAttribute">8</int>
+ <int key="relation">0</int>
+ <nil key="secondItem"/>
+ <int key="secondAttribute">0</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">21</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="484795553"/>
+ <int key="scoringType">3</int>
+ <float key="scoringTypeFloat">9</float>
+ <int key="contentType">1</int>
+ </object>
+ <object class="IBNSLayoutConstraint" id="670227139">
+ <reference key="firstItem" ref="484795553"/>
+ <int key="firstAttribute">7</int>
+ <int key="relation">0</int>
+ <nil key="secondItem"/>
+ <int key="secondAttribute">0</int>
+ <float key="multiplier">1</float>
+ <object class="IBLayoutConstant" key="constant">
+ <double key="value">143</double>
+ </object>
+ <float key="priority">1000</float>
+ <reference key="containingView" ref="484795553"/>
+ <int key="scoringType">3</int>
+ <float key="scoringTypeFloat">9</float>
+ <int key="contentType">1</int>
+ </object>
+ </array>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">60</int>
+ <reference key="object" ref="342906512"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">61</int>
+ <reference key="object" ref="918242346"/>
+ <reference key="parent" ref="191373211"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">70</int>
+ <reference key="object" ref="670227139"/>
+ <reference key="parent" ref="484795553"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">71</int>
+ <reference key="object" ref="269062633"/>
+ <reference key="parent" ref="484795553"/>
+ </object>
</array>
</object>
<dictionary class="NSMutableDictionary" key="flattenedProperties">
@@ -572,6 +760,10 @@
<reference ref="457196062"/>
<reference ref="662191761"/>
<reference ref="1036238214"/>
+ <reference ref="342906512"/>
+ <reference ref="918242346"/>
+ <reference ref="719571487"/>
+ <reference ref="148058045"/>
</array>
<string key="10.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="11.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
@@ -594,13 +786,27 @@
<string key="52.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="53.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="54.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <boolean value="NO" key="56.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="59.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <array key="59.IBViewMetadataConstraints">
+ <reference ref="670227139"/>
+ <reference ref="269062633"/>
+ </array>
+ <boolean value="NO" key="59.IBViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
+ <string key="60.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="61.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="70.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <string key="71.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</dictionary>
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
<nil key="activeLocalization"/>
<dictionary class="NSMutableDictionary" key="localizations"/>
<nil key="sourceID"/>
- <int key="maxID">55</int>
+ <int key="maxID">71</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
@@ -628,6 +834,7 @@
</object>
<dictionary class="NSMutableDictionary" key="outlets">
<string key="emailTextField">UITextField</string>
+ <string key="fetchFullMessageSwitch">UISwitch</string>
<string key="hostnameTextField">UITextField</string>
<string key="passwordTextField">UITextField</string>
</dictionary>
@@ -636,6 +843,10 @@
<string key="name">emailTextField</string>
<string key="candidateClassName">UITextField</string>
</object>
+ <object class="IBToOneOutletInfo" key="fetchFullMessageSwitch">
+ <string key="name">fetchFullMessageSwitch</string>
+ <string key="candidateClassName">UISwitch</string>
+ </object>
<object class="IBToOneOutletInfo" key="hostnameTextField">
<string key="name">hostnameTextField</string>
<string key="candidateClassName">UITextField</string>
diff --git a/example/mac/macExample/macExample/MCTMsgViewController.m b/example/mac/macExample/macExample/MCTMsgViewController.m
index dcb6f41c..f26b783f 100644
--- a/example/mac/macExample/macExample/MCTMsgViewController.m
+++ b/example/mac/macExample/macExample/MCTMsgViewController.m
@@ -76,7 +76,7 @@
NSLog(@"%@ is missing, fetching", partUniqueID);
if ([_pending containsObject:partUniqueID]) {
- return NULL;
+ return nil;
}
MCOIMAPPart * part = (MCOIMAPPart *) [_message partForUniqueID:partUniqueID];
diff --git a/src/async/imap/MCIMAPAsyncConnection.cc b/src/async/imap/MCIMAPAsyncConnection.cc
index 5b1269da..02320b3a 100644
--- a/src/async/imap/MCIMAPAsyncConnection.cc
+++ b/src/async/imap/MCIMAPAsyncConnection.cc
@@ -30,9 +30,30 @@
#include "MCIMAPIdleOperation.h"
#include "MCIMAPIdentityOperation.h"
#include "MCIMAPCapabilityOperation.h"
+#include "MCOperationQueueCallback.h"
+#include "MCIMAPDisconnectOperation.h"
using namespace mailcore;
+namespace mailcore {
+ class IMAPOperationQueueCallback : public Object, public OperationQueueCallback {
+ public:
+ IMAPOperationQueueCallback(IMAPAsyncConnection * connection) {
+ mConnection = connection;
+ }
+
+ virtual ~IMAPOperationQueueCallback() {
+ }
+
+ virtual void queueIdle() {
+ mConnection->tryAutomaticDisconnect();
+ }
+
+ private:
+ IMAPAsyncConnection * mConnection;
+ };
+}
+
IMAPAsyncConnection::IMAPAsyncConnection()
{
mSession = new IMAPSession();
@@ -40,10 +61,13 @@ IMAPAsyncConnection::IMAPAsyncConnection()
mDefaultNamespace = NULL;
mDelimiter = 0;
mLastFolder = NULL;
+ mQueueCallback = new IMAPOperationQueueCallback(this);
+ mQueue->setCallback(mQueueCallback);
}
IMAPAsyncConnection::~IMAPAsyncConnection()
{
+ MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mLastFolder);
MC_SAFE_RELEASE(mDefaultNamespace);
MC_SAFE_RELEASE(mQueue);
@@ -439,10 +463,28 @@ unsigned int IMAPAsyncConnection::operationsCount()
void IMAPAsyncConnection::runOperation(IMAPOperation * operation)
{
-#warning disconnect after delay
+ cancelDelayedPerformMethod((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL);
mQueue->addOperation(operation);
}
+void IMAPAsyncConnection::tryAutomaticDisconnect()
+{
+ // It's safe since no thread is running when this function is called.
+ if (mSession->isDisconnected()) {
+ return;
+ }
+
+ performMethodAfterDelay((Object::Method) &IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay, NULL, 30);
+}
+
+void IMAPAsyncConnection::tryAutomaticDisconnectAfterDelay(void * context)
+{
+ IMAPDisconnectOperation * op = new IMAPDisconnectOperation();
+ op->setSession(this);
+ op->autorelease();
+ op->start();
+}
+
void IMAPAsyncConnection::setLastFolder(String * folder)
{
MC_SAFE_REPLACE_COPY(String, mLastFolder, folder);
diff --git a/src/async/imap/MCIMAPAsyncConnection.h b/src/async/imap/MCIMAPAsyncConnection.h
index 4843702b..7869644c 100644
--- a/src/async/imap/MCIMAPAsyncConnection.h
+++ b/src/async/imap/MCIMAPAsyncConnection.h
@@ -25,6 +25,7 @@ namespace mailcore {
class IMAPFetchNamespaceOperation;
class IMAPIdentityOperation;
class IMAPCapabilityOperation;
+ class IMAPOperationQueueCallback;
class IMAPAsyncConnection : public Object {
public:
@@ -116,8 +117,9 @@ namespace mailcore {
char mDelimiter;
IMAPNamespace * mDefaultNamespace;
String * mLastFolder;
+ IMAPOperationQueueCallback * mQueueCallback;
- void queue(IMAPOperation * op);
+ virtual void tryAutomaticDisconnectAfterDelay(void * context);
public: // private
virtual void runOperation(IMAPOperation * operation);
@@ -127,6 +129,8 @@ namespace mailcore {
virtual void setLastFolder(String * folder);
virtual String * lastFolder();
+
+ virtual void tryAutomaticDisconnect();
};
}
diff --git a/src/async/imap/MCIMAPAsyncSession.cc b/src/async/imap/MCIMAPAsyncSession.cc
index 766b6fe6..3fbd5470 100644
--- a/src/async/imap/MCIMAPAsyncSession.cc
+++ b/src/async/imap/MCIMAPAsyncSession.cc
@@ -10,6 +10,7 @@
#include "MCIMAPAsyncConnection.h"
#include "MCIMAPNamespace.h"
+#include "MCOperationQueueCallback.h"
#define DEFAULT_MAX_CONNECTIONS 3
diff --git a/src/async/imap/MCIMAPAsyncSession.h b/src/async/imap/MCIMAPAsyncSession.h
index a2bc05f8..390fdab8 100644
--- a/src/async/imap/MCIMAPAsyncSession.h
+++ b/src/async/imap/MCIMAPAsyncSession.h
@@ -142,10 +142,10 @@ namespace mailcore {
bool mAllowsFolderConcurrentAccessEnabled;
unsigned int mMaximumConnections;
- IMAPAsyncConnection * sessionForFolder(String * folder, bool urgent = false);
- IMAPAsyncConnection * session();
- IMAPAsyncConnection * matchingSessionForFolder(String * folder);
- IMAPAsyncConnection * availableSession();
+ virtual IMAPAsyncConnection * sessionForFolder(String * folder, bool urgent = false);
+ virtual IMAPAsyncConnection * session();
+ virtual IMAPAsyncConnection * matchingSessionForFolder(String * folder);
+ virtual IMAPAsyncConnection * availableSession();
};
}
diff --git a/src/async/imap/MCIMAPDisconnectOperation.cc b/src/async/imap/MCIMAPDisconnectOperation.cc
new file mode 100644
index 00000000..070eeaae
--- /dev/null
+++ b/src/async/imap/MCIMAPDisconnectOperation.cc
@@ -0,0 +1,28 @@
+//
+// MCIMAPDisconnectOperation.cc
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#include "MCIMAPDisconnectOperation.h"
+
+#include "MCIMAPAsyncConnection.h"
+#include "MCIMAPSession.h"
+
+using namespace mailcore;
+
+IMAPDisconnectOperation::IMAPDisconnectOperation()
+{
+}
+
+IMAPDisconnectOperation::~IMAPDisconnectOperation()
+{
+}
+
+void IMAPDisconnectOperation::main()
+{
+ session()->session()->disconnect();
+ setError(ErrorCode::ErrorNone);
+}
diff --git a/src/async/imap/MCIMAPDisconnectOperation.h b/src/async/imap/MCIMAPDisconnectOperation.h
new file mode 100644
index 00000000..5d572def
--- /dev/null
+++ b/src/async/imap/MCIMAPDisconnectOperation.h
@@ -0,0 +1,32 @@
+//
+// MCIMAPDisconnectOperation.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_MCIMAPDISCONNECTOPERATION_H_
+#define __MAILCORE_MCIMAPDISCONNECTOPERATION_H_
+
+#include <MailCore/MCBaseTypes.h>
+#include <MailCore/MCAbstract.h>
+#include <MailCore/MCIMAPOperation.h>
+
+#ifdef __cplusplus
+
+namespace mailcore {
+
+ class IMAPDisconnectOperation : public IMAPOperation {
+ public:
+ IMAPDisconnectOperation();
+ virtual ~IMAPDisconnectOperation();
+
+ public: // subclass behavior
+ virtual void main();
+ };
+}
+
+#endif
+
+#endif \ No newline at end of file
diff --git a/src/async/imap/MCIMAPFetchFoldersOperation.h b/src/async/imap/MCIMAPFetchFoldersOperation.h
index ebc49ca8..c59bf85a 100644
--- a/src/async/imap/MCIMAPFetchFoldersOperation.h
+++ b/src/async/imap/MCIMAPFetchFoldersOperation.h
@@ -32,7 +32,7 @@ namespace mailcore {
virtual void main();
private:
- String * mFolder;
+ String * /* IMAPFolder */ mFolder;
bool mFetchSubscribedEnabled;
Array * mFolders;
void setDelimiterDataOnMainThread(char * delimiterData);
diff --git a/src/async/imap/MCIMAPFetchMessagesOperation.h b/src/async/imap/MCIMAPFetchMessagesOperation.h
index c719ef6a..64f75bbf 100644
--- a/src/async/imap/MCIMAPFetchMessagesOperation.h
+++ b/src/async/imap/MCIMAPFetchMessagesOperation.h
@@ -44,7 +44,7 @@ namespace mailcore {
bool mFetchByUidEnabled;
IndexSet * mIndexes;
IMAPMessagesRequestKind mKind;
- Array * mMessages;
+ Array * /* IMAPMessage */ mMessages;
IndexSet * mVanishedMessages;
uint64_t mModSequenceValue;
diff --git a/src/async/imap/MCIMAPFolderStatusOperation.cc b/src/async/imap/MCIMAPFolderStatusOperation.cc
index 89484624..0ca7d884 100644
--- a/src/async/imap/MCIMAPFolderStatusOperation.cc
+++ b/src/async/imap/MCIMAPFolderStatusOperation.cc
@@ -16,40 +16,12 @@ using namespace mailcore;
IMAPFolderStatusOperation::IMAPFolderStatusOperation()
{
- mUidNext = 0;
- mUidValidity = 0;
- mMessageCount = 0;
- mRecentCount = 0;
- mUnseenCount = 0;
+ mStatus = NULL;
}
IMAPFolderStatusOperation::~IMAPFolderStatusOperation()
{
-}
-
-uint32_t IMAPFolderStatusOperation::uidNext()
-{
- return mUidNext;
-}
-
-uint32_t IMAPFolderStatusOperation::uidValidity()
-{
- return mUidValidity;
-}
-
-uint32_t IMAPFolderStatusOperation::messageCount()
-{
- return mMessageCount;
-}
-
-uint32_t IMAPFolderStatusOperation::recentCount()
-{
- return mRecentCount;
-}
-
-uint32_t IMAPFolderStatusOperation::unseenCount()
-{
- return mUnseenCount;
+ MC_SAFE_RELEASE(mStatus);
}
void IMAPFolderStatusOperation::main()
@@ -68,13 +40,12 @@ void IMAPFolderStatusOperation::main()
return;
}
-
- mUidNext = status->uidNext();
- mUidValidity = status->uidValidity();
- mMessageCount = status->messageCount();
- mRecentCount = status->recentCount();
- mUnseenCount = status->unseenCount();
-
+ MC_SAFE_REPLACE_RETAIN(IMAPFolderStatus, mStatus, status);
setError(error);
}
+IMAPFolderStatus * IMAPFolderStatusOperation::status()
+{
+ return mStatus;
+}
+
diff --git a/src/async/imap/MCIMAPFolderStatusOperation.h b/src/async/imap/MCIMAPFolderStatusOperation.h
index 71811ca7..d8c30fea 100644
--- a/src/async/imap/MCIMAPFolderStatusOperation.h
+++ b/src/async/imap/MCIMAPFolderStatusOperation.h
@@ -17,27 +17,21 @@
namespace mailcore {
+ class IMAPFolderStatus;
+
class IMAPFolderStatusOperation : public IMAPOperation {
public:
IMAPFolderStatusOperation();
virtual ~IMAPFolderStatusOperation();
- virtual uint32_t uidNext();
- virtual uint32_t uidValidity();
- virtual uint32_t messageCount();
- virtual uint32_t recentCount();
- virtual uint32_t unseenCount();
+ // Results.
+ virtual IMAPFolderStatus * status();
public: // subclass behavior
virtual void main();
private:
-
- uint32_t mUidNext;
- uint32_t mUidValidity;
- uint32_t mMessageCount;
- uint32_t mRecentCount;
- uint32_t mUnseenCount;
+ IMAPFolderStatus * mStatus;
};
}
diff --git a/src/async/imap/MCIMAPIdleOperation.h b/src/async/imap/MCIMAPIdleOperation.h
index de19469a..32ed0877 100644
--- a/src/async/imap/MCIMAPIdleOperation.h
+++ b/src/async/imap/MCIMAPIdleOperation.h
@@ -31,7 +31,7 @@ namespace mailcore {
private:
uint32_t mLastKnownUid;
- bool mSetupSuccess;
+ bool mSetupSuccess;
void prepare();
void unprepare();
};
diff --git a/src/async/imap/MCIMAPStoreLabelsOperation.h b/src/async/imap/MCIMAPStoreLabelsOperation.h
index fea31fd8..117a0a83 100644
--- a/src/async/imap/MCIMAPStoreLabelsOperation.h
+++ b/src/async/imap/MCIMAPStoreLabelsOperation.h
@@ -27,8 +27,8 @@ namespace mailcore {
virtual void setKind(IMAPStoreFlagsRequestKind kind);
virtual IMAPStoreFlagsRequestKind kind();
- virtual void setLabels(Array * labels);
- virtual Array * labels();
+ virtual void setLabels(Array * /* String */ labels);
+ virtual Array * /* String */ labels();
public: // subclass behavior
virtual void main();
@@ -36,7 +36,7 @@ namespace mailcore {
private:
IndexSet * mUids;
IMAPStoreFlagsRequestKind mKind;
- Array * mLabels;
+ Array * /* String */ mLabels;
};
}
diff --git a/src/async/pop/MCPOPAsyncSession.cc b/src/async/pop/MCPOPAsyncSession.cc
index 2cdbd225..39f356db 100644
--- a/src/async/pop/MCPOPAsyncSession.cc
+++ b/src/async/pop/MCPOPAsyncSession.cc
@@ -144,6 +144,11 @@ POPOperation * POPAsyncSession::deleteMessagesOperation(IndexSet * indexes)
return op;
}
+POPOperation * POPAsyncSession::disconnectOperation()
+{
+ return deleteMessagesOperation(IndexSet::indexSet());
+}
+
POPOperation * POPAsyncSession::checkAccountOperation()
{
POPCheckAccountOperation * op = new POPCheckAccountOperation();
diff --git a/src/async/pop/MCPOPAsyncSession.h b/src/async/pop/MCPOPAsyncSession.h
index f05b98b5..166675e0 100644
--- a/src/async/pop/MCPOPAsyncSession.h
+++ b/src/async/pop/MCPOPAsyncSession.h
@@ -52,7 +52,7 @@ namespace mailcore {
virtual void setCheckCertificateEnabled(bool enabled);
virtual bool isCheckCertificateEnabled();
- virtual POPFetchMessagesOperation * fetchMessagesOperation();
+ virtual POPFetchMessagesOperation * fetchMessagesOperation();
virtual POPFetchHeaderOperation * fetchHeaderOperation(unsigned int index);
@@ -61,6 +61,8 @@ namespace mailcore {
// Will disconnect.
virtual POPOperation * deleteMessagesOperation(IndexSet * indexes);
+ virtual POPOperation * disconnectOperation();
+
virtual POPOperation * checkAccountOperation();
private:
diff --git a/src/async/pop/MCPOPFetchMessagesOperation.h b/src/async/pop/MCPOPFetchMessagesOperation.h
index e9d68014..74c97d4d 100644
--- a/src/async/pop/MCPOPFetchMessagesOperation.h
+++ b/src/async/pop/MCPOPFetchMessagesOperation.h
@@ -26,7 +26,7 @@ namespace mailcore {
virtual void main();
private:
- Array * mMessages;
+ Array * /* POPMessageInfo */ mMessages;
};
}
diff --git a/src/async/smtp/MCSMTPAsyncSession.cc b/src/async/smtp/MCSMTPAsyncSession.cc
index 95101a50..cf028ced 100644
--- a/src/async/smtp/MCSMTPAsyncSession.cc
+++ b/src/async/smtp/MCSMTPAsyncSession.cc
@@ -1,22 +1,44 @@
#include "MCSMTPAsyncSession.h"
#include "MCSMTPSession.h"
-//#include "MCSMTPSendWithRecipientOperation.h"
#include "MCSMTPSendWithDataOperation.h"
-//#include "MCSMTPSendWithBuilderOperation.h"
#include "MCSMTPCheckAccountOperation.h"
+#include "MCSMTPDisconnectOperation.h"
#include "MCSMTPOperation.h"
+#include "MCOperationQueueCallback.h"
using namespace mailcore;
+namespace mailcore {
+ class SMTPOperationQueueCallback : public Object, public OperationQueueCallback {
+ public:
+ SMTPOperationQueueCallback(SMTPAsyncSession * session) {
+ mSession = session;
+ }
+
+ virtual ~SMTPOperationQueueCallback() {
+ }
+
+ virtual void queueIdle() {
+ mSession->tryAutomaticDisconnect();
+ }
+
+ private:
+ SMTPAsyncSession * mSession;
+ };
+}
+
SMTPAsyncSession::SMTPAsyncSession()
{
mSession = new SMTPSession();
mQueue = new OperationQueue();
+ mQueueCallback = new SMTPOperationQueueCallback(this);
+ mQueue->setCallback(mQueueCallback);
}
SMTPAsyncSession::~SMTPAsyncSession()
{
+ MC_SAFE_RELEASE(mQueueCallback);
MC_SAFE_RELEASE(mQueue);
MC_SAFE_RELEASE(mSession);
}
@@ -113,7 +135,7 @@ bool SMTPAsyncSession::useHeloIPEnabled()
void SMTPAsyncSession::runOperation(SMTPOperation * operation)
{
-#warning disconnect after delay
+ cancelDelayedPerformMethod((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL);
mQueue->addOperation(operation);
}
@@ -122,35 +144,31 @@ SMTPSession * SMTPAsyncSession::session()
return mSession;
}
-#if 0
-SMTPOperation * SMTPAsyncSession::sendMessageOperationWithFromAndRecipient(Address * from, Array * recipients, Data * messageData)
+void SMTPAsyncSession::tryAutomaticDisconnect()
{
- SMTPSendWithRecipientOperation * op = new SMTPSendWithRecipientOperation();
- op->setSession(this);
- op->setFrom(from);
- op->setRecipients(recipients);
- op->setMessageData(messageData);
- return (SMTPOperation *) op->autorelease();
+ // It's safe since no thread is running when this function is called.
+ if (mSession->isDisconnected()) {
+ return;
+ }
+
+ performMethodAfterDelay((Object::Method) &SMTPAsyncSession::tryAutomaticDisconnectAfterDelay, NULL, 30);
}
-#endif
-SMTPOperation * SMTPAsyncSession::sendMessageOperation(Data * messageData)
+void SMTPAsyncSession::tryAutomaticDisconnectAfterDelay(void * context)
{
- SMTPSendWithDataOperation * op = new SMTPSendWithDataOperation();
+ SMTPDisconnectOperation * op = new SMTPDisconnectOperation();
op->setSession(this);
- op->setMessageData(messageData);
- return (SMTPOperation *) op->autorelease();
+ op->autorelease();
+ op->start();
}
-#if 0
-SMTPOperation * SMTPAsyncSession::sendMessageOperation(MessageBuilder * msg)
+SMTPOperation * SMTPAsyncSession::sendMessageOperation(Data * messageData)
{
- SMTPSendWithBuilderOperation * op = new SMTPSendWithBuilderOperation();
+ SMTPSendWithDataOperation * op = new SMTPSendWithDataOperation();
op->setSession(this);
- op->setBuilder(msg);
+ op->setMessageData(messageData);
return (SMTPOperation *) op->autorelease();
}
-#endif
SMTPOperation * SMTPAsyncSession::checkAccountOperation(Address * from)
{
@@ -159,4 +177,3 @@ SMTPOperation * SMTPAsyncSession::checkAccountOperation(Address * from)
op->setSession(this);
return (SMTPOperation *) op->autorelease();
}
-
diff --git a/src/async/smtp/MCSMTPAsyncSession.h b/src/async/smtp/MCSMTPAsyncSession.h
index 0be287af..9cd7a8f0 100644
--- a/src/async/smtp/MCSMTPAsyncSession.h
+++ b/src/async/smtp/MCSMTPAsyncSession.h
@@ -13,6 +13,7 @@ namespace mailcore {
class SMTPOperation;
class SMTPSession;
class Address;
+ class SMTPOperationQueueCallback;
class SMTPAsyncSession : public Object {
public:
@@ -52,13 +53,14 @@ namespace mailcore {
public: // private
virtual void runOperation(SMTPOperation * operation);
virtual SMTPSession * session();
+ virtual void tryAutomaticDisconnect();
private:
- SMTPSession * mSession;
- OperationQueue * mQueue;
-
- void queue(SMTPOperation * op);
-
+ SMTPSession * mSession;
+ OperationQueue * mQueue;
+ SMTPOperationQueueCallback * mQueueCallback;
+
+ virtual void tryAutomaticDisconnectAfterDelay(void * context);
};
}
diff --git a/src/async/smtp/MCSMTPDisconnectOperation.cc b/src/async/smtp/MCSMTPDisconnectOperation.cc
new file mode 100644
index 00000000..592ceb48
--- /dev/null
+++ b/src/async/smtp/MCSMTPDisconnectOperation.cc
@@ -0,0 +1,28 @@
+//
+// SMTPDisconnectOperation.cpp
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#include "MCSMTPDisconnectOperation.h"
+
+#include "MCSMTPAsyncSession.h"
+#include "MCSMTPSession.h"
+
+using namespace mailcore;
+
+SMTPDisconnectOperation::SMTPDisconnectOperation()
+{
+}
+
+SMTPDisconnectOperation::~SMTPDisconnectOperation()
+{
+}
+
+void SMTPDisconnectOperation::main()
+{
+ session()->session()->disconnect();
+ setError(ErrorCode::ErrorNone);
+}
diff --git a/src/async/smtp/MCSMTPDisconnectOperation.h b/src/async/smtp/MCSMTPDisconnectOperation.h
new file mode 100644
index 00000000..dacf72a6
--- /dev/null
+++ b/src/async/smtp/MCSMTPDisconnectOperation.h
@@ -0,0 +1,32 @@
+//
+// SMTPDisconnectOperation.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_MCSMTPDISCONNECTOPERATION_H_
+#define __MAILCORE_MCSMTPDISCONNECTOPERATION_H_
+
+#include <MailCore/MCBaseTypes.h>
+#include <MailCore/MCAbstract.h>
+#include <MailCore/MCSMTPOperation.h>
+
+#ifdef __cplusplus
+
+namespace mailcore {
+
+ class SMTPDisconnectOperation : public SMTPOperation {
+ public:
+ SMTPDisconnectOperation();
+ virtual ~SMTPDisconnectOperation();
+
+ public: // subclass behavior
+ virtual void main();
+ };
+}
+
+#endif
+
+#endif \ No newline at end of file
diff --git a/src/async/smtp/MCSMTPOperation.cc b/src/async/smtp/MCSMTPOperation.cc
index 532c6ab4..e8211a24 100644
--- a/src/async/smtp/MCSMTPOperation.cc
+++ b/src/async/smtp/MCSMTPOperation.cc
@@ -82,4 +82,3 @@ void SMTPOperation::bodyProgressOnMainThread(void * ctx)
}
free(context);
}
-
diff --git a/src/async/smtp/MCSMTPSendWithDataOperation.cc b/src/async/smtp/MCSMTPSendWithDataOperation.cc
index bb2c5ea9..b64f835b 100644
--- a/src/async/smtp/MCSMTPSendWithDataOperation.cc
+++ b/src/async/smtp/MCSMTPSendWithDataOperation.cc
@@ -38,4 +38,6 @@ void SMTPSendWithDataOperation::main()
ErrorCode error;
session()->session()->sendMessage(mMessageData, this, &error);
setError(error);
+
+ //tryAutomaticDisconnect();
}
diff --git a/src/core/abstract/MCAbstractMessage.h b/src/core/abstract/MCAbstractMessage.h
index 49c4805b..d7384b36 100644
--- a/src/core/abstract/MCAbstractMessage.h
+++ b/src/core/abstract/MCAbstractMessage.h
@@ -21,8 +21,8 @@ namespace mailcore {
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
- virtual Array * attachments();
- virtual Array * htmlInlineAttachments();
+ virtual Array * /* AbstractPart */ attachments();
+ virtual Array * /* AbstractPart */ htmlInlineAttachments();
public: //subclass behavior
AbstractMessage(AbstractMessage * other);
diff --git a/src/core/abstract/MCAbstractMessagePart.cc b/src/core/abstract/MCAbstractMessagePart.cc
index 649fcc32..d2cb232e 100644
--- a/src/core/abstract/MCAbstractMessagePart.cc
+++ b/src/core/abstract/MCAbstractMessagePart.cc
@@ -66,21 +66,6 @@ AbstractPart * AbstractMessagePart::mainPart()
void AbstractMessagePart::setMainPart(AbstractPart * mainPart)
{
MC_SAFE_REPLACE_RETAIN(AbstractPart, mMainPart, mainPart);
- applyMessage();
-}
-
-void AbstractMessagePart::applyMessage()
-{
- if (mMainPart == NULL)
- return;
-
- mMainPart->setMessage(message());
-}
-
-void AbstractMessagePart::setMessage(AbstractMessage * message)
-{
- AbstractPart::setMessage(message);
- applyMessage();
}
AbstractPart * AbstractMessagePart::partForContentID(String * contentID)
diff --git a/src/core/abstract/MCAbstractMessagePart.h b/src/core/abstract/MCAbstractMessagePart.h
index 1ff1def6..bd2ac4e0 100644
--- a/src/core/abstract/MCAbstractMessagePart.h
+++ b/src/core/abstract/MCAbstractMessagePart.h
@@ -27,8 +27,6 @@ namespace mailcore {
virtual String * description();
virtual Object * copy();
- virtual void setMessage(AbstractMessage * message);
-
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
@@ -36,7 +34,6 @@ namespace mailcore {
AbstractPart * mMainPart;
MessageHeader * mHeader;
void init();
- void applyMessage();
};
}
diff --git a/src/core/abstract/MCAbstractMultipart.cc b/src/core/abstract/MCAbstractMultipart.cc
index 7a2f551e..d70b2974 100644
--- a/src/core/abstract/MCAbstractMultipart.cc
+++ b/src/core/abstract/MCAbstractMultipart.cc
@@ -39,7 +39,6 @@ Array * AbstractMultipart::parts()
void AbstractMultipart::setParts(Array * parts)
{
MC_SAFE_REPLACE_COPY(Array, mParts, parts);
- applyMessage();
}
String * AbstractMultipart::description()
@@ -70,23 +69,6 @@ Object * AbstractMultipart::copy()
return new AbstractMultipart(this);
}
-void AbstractMultipart::applyMessage()
-{
- if (mParts == NULL)
- return;
-
- for(unsigned int i = 0 ; i < mParts->count() ; i ++) {
- AbstractPart * part = (AbstractPart *) mParts->objectAtIndex(i);
- part->setMessage(message());
- }
-}
-
-void AbstractMultipart::setMessage(AbstractMessage * message)
-{
- AbstractPart::setMessage(message);
- applyMessage();
-}
-
AbstractPart * AbstractMultipart::partForContentID(String * contentID)
{
for(unsigned int i = 0 ; i < parts()->count() ; i ++) {
diff --git a/src/core/abstract/MCAbstractMultipart.h b/src/core/abstract/MCAbstractMultipart.h
index da77f9a6..11d33666 100644
--- a/src/core/abstract/MCAbstractMultipart.h
+++ b/src/core/abstract/MCAbstractMultipart.h
@@ -22,14 +22,12 @@ namespace mailcore {
virtual String * description();
virtual Object * copy();
- virtual void setMessage(AbstractMessage * message);
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
private:
Array * mParts;
void init();
- void applyMessage();
};
}
diff --git a/src/core/abstract/MCAbstractPart.cc b/src/core/abstract/MCAbstractPart.cc
index a1cf57b0..6991e5fc 100644
--- a/src/core/abstract/MCAbstractPart.cc
+++ b/src/core/abstract/MCAbstractPart.cc
@@ -160,16 +160,6 @@ void AbstractPart::setInlineAttachment(bool inlineAttachment)
mInlineAttachment = inlineAttachment;
}
-AbstractMessage * AbstractPart::message()
-{
- return mMessage;
-}
-
-void AbstractPart::setMessage(AbstractMessage * message)
-{
- mMessage = message;
-}
-
void AbstractPart::importIMAPFields(struct mailimap_body_fields * fields,
struct mailimap_body_ext_1part * extension)
{
diff --git a/src/core/abstract/MCAbstractPart.h b/src/core/abstract/MCAbstractPart.h
index fe8a57d5..b38c1b38 100644
--- a/src/core/abstract/MCAbstractPart.h
+++ b/src/core/abstract/MCAbstractPart.h
@@ -40,9 +40,6 @@ namespace mailcore {
virtual bool isInlineAttachment();
virtual void setInlineAttachment(bool inlineAttachment);
- virtual AbstractMessage * message();
- virtual void setMessage(AbstractMessage * message);
-
virtual AbstractPart * partForContentID(String * contentID);
virtual AbstractPart * partForUniqueID(String * uniqueID);
@@ -67,7 +64,6 @@ namespace mailcore {
String * mContentLocation;
bool mInlineAttachment;
PartType mPartType;
- AbstractMessage * mMessage; // weak
void init();
};
diff --git a/src/core/abstract/MCMessageHeader.h b/src/core/abstract/MCMessageHeader.h
index 3e481db3..f90c1c2d 100644
--- a/src/core/abstract/MCMessageHeader.h
+++ b/src/core/abstract/MCMessageHeader.h
@@ -19,11 +19,11 @@ namespace mailcore {
virtual void setMessageID(String * messageID);
virtual String * messageID();
- virtual void setReferences(Array * references);
- virtual Array * references();
+ virtual void setReferences(Array * /* String */ references);
+ virtual Array * /* String */ references();
- virtual void setInReplyTo(Array * inReplyTo);
- virtual Array * inReplyTo();
+ virtual void setInReplyTo(Array * /* String */ inReplyTo);
+ virtual Array * /* String */ inReplyTo();
virtual void setDate(time_t date);
virtual time_t date();
@@ -37,17 +37,17 @@ namespace mailcore {
virtual void setFrom(Address * from);
virtual Address * from();
- virtual void setTo(Array * to);
- virtual Array * to();
+ virtual void setTo(Array * /* Address */ to);
+ virtual Array * /* Address */ to();
- virtual void setCc(Array * cc);
- virtual Array * cc();
+ virtual void setCc(Array * /* Address */ cc);
+ virtual Array * /* Address */ cc();
- virtual void setBcc(Array * bcc);
- virtual Array * bcc();
+ virtual void setBcc(Array * /* Address */ bcc);
+ virtual Array * /* Address */ bcc();
- virtual void setReplyTo(Array * replyTo);
- virtual Array * replyTo();
+ virtual void setReplyTo(Array * /* Address */ replyTo);
+ virtual Array * /* Address */ replyTo();
virtual void setSubject(String * subject);
virtual String * subject();
diff --git a/src/core/basetypes/MCAssert.cc b/src/core/basetypes/MCAssert.c
index 82b5de26..ce9b5703 100644
--- a/src/core/basetypes/MCAssert.cc
+++ b/src/core/basetypes/MCAssert.c
@@ -3,7 +3,7 @@
#include <stdio.h>
#include <stdlib.h>
-void mailcore::assertInteral(const char * filename, unsigned int line, int cond, const char * condString)
+void MCAssertInternal(const char * filename, unsigned int line, int cond, const char * condString)
{
if (cond) {
return;
diff --git a/src/core/basetypes/MCAssert.h b/src/core/basetypes/MCAssert.h
index f2e1f484..54979d64 100644
--- a/src/core/basetypes/MCAssert.h
+++ b/src/core/basetypes/MCAssert.h
@@ -2,16 +2,14 @@
#define __MAILCORE_MCASSERT_H_
-#ifdef __cplusplus
-
-#define MCAssert(cond) mailcore::assertInteral(__FILE__, __LINE__, cond, #cond)
-
-namespace mailcore {
+#define MCAssert(cond) MCAssertInternal(__FILE__, __LINE__, cond, #cond)
- void assertInteral(const char * filename, unsigned int line, int cond, const char * condString);
-
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void MCAssertInternal(const char * filename, unsigned int line, int cond, const char * condString);
+#ifdef __cplusplus
}
-
#endif
#endif
diff --git a/src/core/basetypes/MCMainThread.h b/src/core/basetypes/MCMainThread.h
index 31819a29..c9fe4e8d 100644
--- a/src/core/basetypes/MCMainThread.h
+++ b/src/core/basetypes/MCMainThread.h
@@ -5,9 +5,14 @@
#ifdef __cplusplus
namespace mailcore {
- void callOnMainThread(void (*)(void *), void * context);
- void callOnMainThreadAndWait(void (*)(void *), void * context);
- void callAfterDelay(void (*)(void *), void * context, double time);
+ void callOnMainThread(void (*)(void *), void * context);
+ void callOnMainThreadAndWait(void (*)(void *), void * context);
+
+ // Returns a "call" object.
+ void * callAfterDelay(void (*)(void *), void * context, double time);
+
+ // Pass the pointer returns by callAfterDelay() to cancel a delayed call.
+ void cancelDelayedCall(void * call);
}
#endif
diff --git a/src/core/basetypes/MCMainThread.mm b/src/core/basetypes/MCMainThread.mm
index 0bdc2ce1..4e9c6fc7 100644
--- a/src/core/basetypes/MCMainThread.mm
+++ b/src/core/basetypes/MCMainThread.mm
@@ -52,13 +52,18 @@ void mailcore::callOnMainThreadAndWait(void (* function)(void *), void * context
[caller release];
}
-void mailcore::callAfterDelay(void (* function)(void *), void * context, double time)
+void * mailcore::callAfterDelay(void (* function)(void *), void * context, double time)
{
LEPPPMainThreadCaller * caller;
caller = [[LEPPPMainThreadCaller alloc] init];
[caller setFunction:function];
[caller setContext:context];
[caller performSelector:@selector(call) withObject:nil afterDelay:time];
- [caller release];
+ return [caller autorelease];
}
+void mailcore::cancelDelayedCall(void * delayedCall)
+{
+ LEPPPMainThreadCaller * caller = (LEPPPMainThreadCaller *) delayedCall;
+ [NSObject cancelPreviousPerformRequestsWithTarget:caller selector:@selector(call) object:nil];
+}
diff --git a/src/core/basetypes/MCObject.cc b/src/core/basetypes/MCObject.cc
index 32d51fc4..879c194f 100644
--- a/src/core/basetypes/MCObject.cc
+++ b/src/core/basetypes/MCObject.cc
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <typeinfo>
#include <cxxabi.h>
+#include <libetpan/libetpan.h>
#include "MCAutoreleasePool.h"
#include "MCString.h"
@@ -115,6 +116,26 @@ struct mainThreadCallData {
Object * obj;
void * context;
Object::Method method;
+ void * caller;
+};
+
+static pthread_once_t delayedPerformOnce = PTHREAD_ONCE_INIT;
+static chash * delayedPerformHash = NULL;
+
+static void reallyInitDelayedPerform()
+{
+ delayedPerformHash = chash_new(CHASH_DEFAULTSIZE, CHASH_COPYKEY);
+}
+
+static void initDelayedPerform()
+{
+ pthread_once(&delayedPerformOnce, reallyInitDelayedPerform);
+}
+
+struct mainThreadCallKeyData {
+ Object * obj;
+ void * context;
+ Object::Method method;
};
static void performOnMainThread(void * info)
@@ -134,7 +155,7 @@ static void performOnMainThread(void * info)
free(data);
}
-static void callAfterDelay(void * info)
+static void performAfterDelay(void * info)
{
struct mainThreadCallData * data;
void * context;
@@ -146,6 +167,15 @@ static void callAfterDelay(void * info)
context = data->context;
method = data->method;
+ chashdatum key;
+ struct mainThreadCallKeyData keyData;
+ keyData.obj = obj;
+ keyData.context = context;
+ keyData.method = method;
+ key.data = &keyData;
+ key.len = sizeof(keyData);
+ chash_delete(delayedPerformHash, &key, NULL);
+
(obj->*method)(context);
free(data);
@@ -159,6 +189,7 @@ void Object::performMethodOnMainThread(Method method, void * context, bool waitU
data->obj = this;
data->context = context;
data->method = method;
+ data->caller = NULL;
if (waitUntilDone) {
callOnMainThreadAndWait(performOnMainThread, data);
@@ -170,12 +201,48 @@ void Object::performMethodOnMainThread(Method method, void * context, bool waitU
void Object::performMethodAfterDelay(Method method, void * context, double delay)
{
+ initDelayedPerform();
+
struct mainThreadCallData * data;
data = (struct mainThreadCallData *) calloc(sizeof(* data), 1);
data->obj = this;
data->context = context;
data->method = method;
+ data->caller = callAfterDelay(performAfterDelay, data, delay);
+
+ chashdatum key;
+ chashdatum value;
+ struct mainThreadCallKeyData keyData;
+ keyData.obj = this;
+ keyData.context = context;
+ keyData.method = method;
+ key.data = &keyData;
+ key.len = sizeof(keyData);
+ value.data = (void *) data;
+ value.len = 0;
+ chash_set(delayedPerformHash, &key, &value, NULL);
+}
+
+void Object::cancelDelayedPerformMethod(Method method, void * context)
+{
+ initDelayedPerform();
- callAfterDelay(performOnMainThread, data, delay);
+ int r;
+ chashdatum key;
+ chashdatum value;
+ struct mainThreadCallKeyData keyData;
+ keyData.obj = this;
+ keyData.context = context;
+ keyData.method = method;
+ key.data = &keyData;
+ key.len = sizeof(keyData);
+ r = chash_get(delayedPerformHash, &key, &value);
+ if (r < 0)
+ return;
+
+ chash_delete(delayedPerformHash, &key, NULL);
+ struct mainThreadCallData * data = (struct mainThreadCallData *) value.data;
+ cancelDelayedCall(data->caller);
+ free(data);
}
diff --git a/src/core/basetypes/MCObject.h b/src/core/basetypes/MCObject.h
index 0fd65d09..01812191 100644
--- a/src/core/basetypes/MCObject.h
+++ b/src/core/basetypes/MCObject.h
@@ -38,6 +38,7 @@ namespace mailcore {
virtual void performMethod(Method method, void * context);
virtual void performMethodOnMainThread(Method method, void * context, bool waitUntilDone = false);
virtual void performMethodAfterDelay(Method method, void * context, double delay);
+ virtual void cancelDelayedPerformMethod(Method method, void * context);
private:
pthread_mutex_t mLock;
diff --git a/src/core/basetypes/MCOperationQueue.cc b/src/core/basetypes/MCOperationQueue.cc
index 72d0041d..f13c9cde 100644
--- a/src/core/basetypes/MCOperationQueue.cc
+++ b/src/core/basetypes/MCOperationQueue.cc
@@ -1,13 +1,15 @@
#include "MCOperationQueue.h"
+#include <libetpan/libetpan.h>
+
#include "MCOperation.h"
#include "MCOperationCallback.h"
+#include "MCOperationQueueCallback.h"
#include "MCMainThread.h"
#include "MCUtils.h"
#include "MCArray.h"
#include "MCLog.h"
#include "MCAutoreleasePool.h"
-#include <libetpan/libetpan.h>
using namespace mailcore;
@@ -21,6 +23,8 @@ OperationQueue::OperationQueue()
mStartSem = mailsem_new();
mStopSem = mailsem_new();
mWaitingFinishedSem = mailsem_new();
+ mQuitting = false;
+ mCallback = NULL;
}
OperationQueue::~OperationQueue()
@@ -153,6 +157,10 @@ void OperationQueue::stoppedOnMainThread(void * context)
mailsem_down(mStopSem);
mStarted = false;
+ if (mCallback) {
+ mCallback->queueIdle();
+ }
+
release(); // (2)
release(); // (3)
@@ -181,6 +189,16 @@ unsigned int OperationQueue::count()
return count;
}
+void OperationQueue::setCallback(OperationQueueCallback * callback)
+{
+ mCallback = callback;
+}
+
+OperationQueueCallback * OperationQueue::callback()
+{
+ return mCallback;
+}
+
#if 0
void OperationQueue::waitUntilAllOperationsAreFinished()
{
diff --git a/src/core/basetypes/MCOperationQueue.h b/src/core/basetypes/MCOperationQueue.h
index b9323dea..ddfe9de2 100644
--- a/src/core/basetypes/MCOperationQueue.h
+++ b/src/core/basetypes/MCOperationQueue.h
@@ -10,41 +10,46 @@
#ifdef __cplusplus
namespace mailcore {
-
- class Operation;
- class Array;
- class OperationQueue : public Object {
- public:
- OperationQueue();
- virtual ~OperationQueue();
-
- virtual void addOperation(Operation * op);
-
+ class Operation;
+ class OperationQueueCallback;
+ class Array;
+
+ class OperationQueue : public Object {
+ public:
+ OperationQueue();
+ virtual ~OperationQueue();
+
+ virtual void addOperation(Operation * op);
+
virtual unsigned int count();
- private:
- Array * mOperations;
- pthread_t mThreadID;
- bool mStarted;
- struct mailsem * mOperationSem;
- struct mailsem * mStartSem;
- struct mailsem * mStopSem;
- pthread_mutex_t mLock;
- bool mWaiting;
- struct mailsem * mWaitingFinishedSem;
- bool mQuitting;
+ virtual void setCallback(OperationQueueCallback * callback);
+ virtual OperationQueueCallback * callback();
- void startThread();
- static void runOperationsOnThread(OperationQueue * queue);
- void runOperations();
- void callbackOnMainThread(Operation * op);
- void checkRunningOnMainThread(void * context);
- void checkRunningAfterDelay(void * context);
+ private:
+ Array * mOperations;
+ pthread_t mThreadID;
+ bool mStarted;
+ struct mailsem * mOperationSem;
+ struct mailsem * mStartSem;
+ struct mailsem * mStopSem;
+ pthread_mutex_t mLock;
+ bool mWaiting;
+ struct mailsem * mWaitingFinishedSem;
+ bool mQuitting;
+ OperationQueueCallback * mCallback;
+
+ void startThread();
+ static void runOperationsOnThread(OperationQueue * queue);
+ void runOperations();
+ void callbackOnMainThread(Operation * op);
+ void checkRunningOnMainThread(void * context);
+ void checkRunningAfterDelay(void * context);
void stoppedOnMainThread(void * context);
-
- };
-
+
+ };
+
}
#endif
diff --git a/src/core/basetypes/MCOperationQueueCallback.h b/src/core/basetypes/MCOperationQueueCallback.h
new file mode 100644
index 00000000..bf7868ae
--- /dev/null
+++ b/src/core/basetypes/MCOperationQueueCallback.h
@@ -0,0 +1,22 @@
+//
+// MCOperationQueueCallback.h
+// mailcore2
+//
+// Created by DINH Viêt Hoà on 6/22/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#ifndef __MAILCORE_OPERATIONQUEUECALLBACK_H_
+#define __MAILCORE_OPERATIONQUEUECALLBACK_H_
+
+namespace mailcore {
+
+ class OperationQueue;
+
+ class OperationQueueCallback {
+ public:
+ virtual void queueIdle() {}
+ };
+}
+
+#endif
diff --git a/src/core/imap/MCIMAPFolderStatus.cc b/src/core/imap/MCIMAPFolderStatus.cc
index 7b6a8bbd..d2cb2281 100644
--- a/src/core/imap/MCIMAPFolderStatus.cc
+++ b/src/core/imap/MCIMAPFolderStatus.cc
@@ -17,6 +17,7 @@ void IMAPFolderStatus::init()
mRecentCount = 0;
mUidNext = 0;
mUidValidity = 0;
+ mHighestModSeqValue = 0;
}
IMAPFolderStatus::IMAPFolderStatus()
@@ -32,63 +33,90 @@ IMAPFolderStatus::IMAPFolderStatus(IMAPFolderStatus * other)
setMessageCount(other->messageCount());
setRecentCount(other->recentCount());
setUidNext(other->uidNext());
- setUidValidity(other->uidValidity());
+ setUidValidity(other->uidValidity());
+ setHighestModSeqValue(other->highestModSeqValue());
}
IMAPFolderStatus::~IMAPFolderStatus()
-{ }
+{
+}
Object * IMAPFolderStatus::copy()
{
return new IMAPFolderStatus(this);
}
-void IMAPFolderStatus::setUnseenCount(u_int32_t unseen)
+void IMAPFolderStatus::setUnseenCount(uint32_t unseen)
{
mUnseenCount = unseen;
}
-u_int32_t IMAPFolderStatus::unseenCount()
+uint32_t IMAPFolderStatus::unseenCount()
{
return mUnseenCount;
}
-void IMAPFolderStatus::setMessageCount(u_int32_t messages)
+void IMAPFolderStatus::setMessageCount(uint32_t messages)
{
mMessageCount = messages;
}
-u_int32_t IMAPFolderStatus::messageCount()
+uint32_t IMAPFolderStatus::messageCount()
{
return mMessageCount;
}
-void IMAPFolderStatus::setRecentCount(u_int32_t recent)
+void IMAPFolderStatus::setRecentCount(uint32_t recent)
{
mRecentCount = recent;
}
-u_int32_t IMAPFolderStatus::recentCount()
+uint32_t IMAPFolderStatus::recentCount()
{
return mRecentCount;
}
-void IMAPFolderStatus::setUidNext(u_int32_t uidNext)
+void IMAPFolderStatus::setUidNext(uint32_t uidNext)
{
mUidNext = uidNext;
}
-u_int32_t IMAPFolderStatus::uidNext()
+uint32_t IMAPFolderStatus::uidNext()
{
return mUidNext;
}
-void IMAPFolderStatus::setUidValidity(u_int32_t uidValidity)
+void IMAPFolderStatus::setUidValidity(uint32_t uidValidity)
{
mUidValidity = uidValidity;
}
-u_int32_t IMAPFolderStatus::uidValidity()
+uint32_t IMAPFolderStatus::uidValidity()
{
return mUidValidity;
}
+
+void IMAPFolderStatus::setHighestModSeqValue(uint64_t highestModSeqValue)
+{
+ mHighestModSeqValue = highestModSeqValue;
+}
+
+uint64_t IMAPFolderStatus::highestModSeqValue()
+{
+ return mHighestModSeqValue;
+}
+
+String * IMAPFolderStatus::description()
+{
+ String * result = String::string();
+ result->appendUTF8Format("<%s:%p msg_count: %u, unseen_count: %u, recent_count: %u, uid_next: %u, uid_validity: %u, highestmodseqvalue :%llu>",
+ className()->UTF8Characters(),
+ this,
+ (unsigned int) messageCount(),
+ (unsigned int) unseenCount(),
+ (unsigned int) recentCount(),
+ (unsigned int) uidNext(),
+ (unsigned int) uidValidity(),
+ (unsigned long long) highestModSeqValue());
+ return result;
+}
diff --git a/src/core/imap/MCIMAPFolderStatus.h b/src/core/imap/MCIMAPFolderStatus.h
index 818cd790..5a6dbac2 100644
--- a/src/core/imap/MCIMAPFolderStatus.h
+++ b/src/core/imap/MCIMAPFolderStatus.h
@@ -23,31 +23,36 @@ namespace mailcore {
IMAPFolderStatus();
virtual ~IMAPFolderStatus();
- virtual void setUnseenCount(u_int32_t unseen);
- virtual u_int32_t unseenCount();
+ virtual void setUnseenCount(uint32_t unseen);
+ virtual uint32_t unseenCount();
- virtual void setMessageCount(u_int32_t messages);
- virtual u_int32_t messageCount();
+ virtual void setMessageCount(uint32_t messages);
+ virtual uint32_t messageCount();
- virtual void setRecentCount(u_int32_t recent);
- virtual u_int32_t recentCount();
+ virtual void setRecentCount(uint32_t recent);
+ virtual uint32_t recentCount();
- virtual void setUidNext(u_int32_t uidNext);
- virtual u_int32_t uidNext();
+ virtual void setUidNext(uint32_t uidNext);
+ virtual uint32_t uidNext();
- virtual void setUidValidity(u_int32_t uidValidity);
- virtual u_int32_t uidValidity();
+ virtual void setUidValidity(uint32_t uidValidity);
+ virtual uint32_t uidValidity();
+
+ virtual void setHighestModSeqValue(uint64_t highestModSeqValue);
+ virtual uint64_t highestModSeqValue();
public: // subclass behavior
IMAPFolderStatus(IMAPFolderStatus * other);
virtual Object * copy();
+ virtual String * description();
private:
- u_int32_t mUnseenCount;
- u_int32_t mMessageCount;
- u_int32_t mRecentCount;
- u_int32_t mUidNext;
- u_int32_t mUidValidity;
+ uint32_t mUnseenCount;
+ uint32_t mMessageCount;
+ uint32_t mRecentCount;
+ uint32_t mUidNext;
+ uint32_t mUidValidity;
+ uint64_t mHighestModSeqValue;
void init();
};
diff --git a/src/core/imap/MCIMAPMessage.h b/src/core/imap/MCIMAPMessage.h
index 5bc5f843..5a9cadcb 100644
--- a/src/core/imap/MCIMAPMessage.h
+++ b/src/core/imap/MCIMAPMessage.h
@@ -35,8 +35,8 @@ namespace mailcore {
virtual void setMainPart(AbstractPart * mainPart);
virtual AbstractPart * mainPart();
- virtual void setGmailLabels(Array * labels);
- virtual Array * gmailLabels();
+ virtual void setGmailLabels(Array * /* String */ labels);
+ virtual Array * /* String */ gmailLabels();
virtual AbstractPart * partForPartID(String * partID);
@@ -58,7 +58,7 @@ namespace mailcore {
MessageFlag mFlags;
MessageFlag mOriginalFlags;
AbstractPart * mMainPart;
- Array * mLabels;
+ Array * /* String */ mLabels;
void init();
};
diff --git a/src/core/imap/MCIMAPNamespace.h b/src/core/imap/MCIMAPNamespace.h
index 09c029e2..4ce0b546 100644
--- a/src/core/imap/MCIMAPNamespace.h
+++ b/src/core/imap/MCIMAPNamespace.h
@@ -18,12 +18,12 @@ namespace mailcore {
virtual String * mainPrefix();
virtual char mainDelimiter();
- virtual Array * prefixes();
+ virtual Array * /* String */ prefixes();
virtual String * pathForComponents(Array * components);
virtual String * pathForComponentsAndPrefix(Array * components, String * prefix);
- virtual Array * componentsFromPath(String * path);
+ virtual Array * /* String */ componentsFromPath(String * path);
virtual bool containsFolderPath(String * path);
@@ -35,7 +35,7 @@ namespace mailcore {
virtual Object * copy();
private:
- Array * mItems;
+ Array * /* String */ mItems;
void init();
IMAPNamespaceItem * mainItem();
IMAPNamespaceItem * itemForPath(String * path);
diff --git a/src/core/imap/MCIMAPNamespaceItem.h b/src/core/imap/MCIMAPNamespaceItem.h
index 4cee0aea..8ab094cc 100644
--- a/src/core/imap/MCIMAPNamespaceItem.h
+++ b/src/core/imap/MCIMAPNamespaceItem.h
@@ -20,7 +20,7 @@ namespace mailcore {
virtual char delimiter();
virtual String * pathForComponents(Array * components);
- virtual Array * componentsForPath(String * path);
+ virtual Array * /* String */ componentsForPath(String * path);
virtual bool containsFolder(String * folder);
diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc
index cdbe6004..4481f086 100644
--- a/src/core/imap/MCIMAPSession.cc
+++ b/src/core/imap/MCIMAPSession.cc
@@ -514,6 +514,8 @@ void IMAPSession::unsetup()
mailimap_free(imap);
imap = NULL;
}
+
+ mState = STATE_DISCONNECTED;
}
void IMAPSession::connect(ErrorCode * pError)
@@ -881,11 +883,14 @@ IMAPFolderStatus * IMAPSession::folderStatus(String * folder, ErrorCode * pError
struct mailimap_status_att_list * status_att_list;
status_att_list = mailimap_status_att_list_new_empty();
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UNSEEN);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_MESSAGES);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_RECENT);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UIDNEXT);
- mailimap_status_att_list_add(status_att_list,MAILIMAP_STATUS_ATT_UIDVALIDITY);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UNSEEN);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_MESSAGES);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_RECENT);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UIDNEXT);
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_UIDVALIDITY);
+ if (mCondstoreEnabled) {
+ mailimap_status_att_list_add(status_att_list, MAILIMAP_STATUS_ATT_HIGHESTMODSEQ);
+ }
r = mailimap_status(mImap, MCUTF8(folder), status_att_list, &status);
@@ -934,7 +939,15 @@ IMAPFolderStatus * IMAPSession::folderStatus(String * folder, ErrorCode * pError
break;
case MAILIMAP_STATUS_ATT_UIDVALIDITY:
fs->setUidValidity(status_info->st_value);
- break;
+ break;
+ case MAILIMAP_STATUS_ATT_EXTENSION: {
+ struct mailimap_extension_data * ext_data = status_info->st_ext_data;
+ if (ext_data->ext_extension == &mailimap_extension_condstore) {
+ struct mailimap_condstore_status_info * status_info = (struct mailimap_condstore_status_info *) ext_data->ext_data;
+ fs->setHighestModSeqValue(status_info->cs_highestmodseq_value);
+ }
+ break;
+ }
}
}
@@ -2901,3 +2914,7 @@ bool IMAPSession::isIdentityEnabled()
return mIdentityEnabled;
}
+bool IMAPSession::isDisconnected()
+{
+ return mState == STATE_DISCONNECTED;
+}
diff --git a/src/core/imap/MCIMAPSession.h b/src/core/imap/MCIMAPSession.h
index 8531b050..c21c36cd 100644
--- a/src/core/imap/MCIMAPSession.h
+++ b/src/core/imap/MCIMAPSession.h
@@ -5,92 +5,90 @@
#include <MailCore/MCBaseTypes.h>
#include <MailCore/MCMessageConstants.h>
-
-
#ifdef __cplusplus
namespace mailcore {
- extern String * IMAPNamespacePersonal;
- extern String * IMAPNamespaceOther;
- extern String * IMAPNamespaceShared;
+ extern String * IMAPNamespacePersonal;
+ extern String * IMAPNamespaceOther;
+ extern String * IMAPNamespaceShared;
- class IMAPNamespace;
- class IMAPSearchExpression;
- class IMAPFolder;
- class IMAPProgressCallback;
+ class IMAPNamespace;
+ class IMAPSearchExpression;
+ class IMAPFolder;
+ class IMAPProgressCallback;
class IMAPSyncResult;
class IMAPFolderStatus;
-
- class IMAPSession : public Object {
- public:
- IMAPSession();
- virtual ~IMAPSession();
-
- virtual void setHostname(String * hostname);
- virtual String * hostname();
+
+ class IMAPSession : public Object {
+ public:
+ IMAPSession();
+ virtual ~IMAPSession();
+
+ virtual void setHostname(String * hostname);
+ virtual String * hostname();
- virtual void setPort(unsigned int port);
- virtual unsigned int port();
+ virtual void setPort(unsigned int port);
+ virtual unsigned int port();
- virtual void setUsername(String * username);
- virtual String * username();
+ virtual void setUsername(String * username);
+ virtual String * username();
- virtual void setPassword(String * password);
- virtual String * password();
+ virtual void setPassword(String * password);
+ virtual String * password();
- virtual void setAuthType(AuthType authType);
- virtual AuthType authType();
+ virtual void setAuthType(AuthType authType);
+ virtual AuthType authType();
- virtual void setConnectionType(ConnectionType connectionType);
- virtual ConnectionType connectionType();
+ virtual void setConnectionType(ConnectionType connectionType);
+ virtual ConnectionType connectionType();
- virtual void setTimeout(time_t timeout);
- virtual time_t timeout();
-
- virtual void setCheckCertificateEnabled(bool enabled);
- virtual bool isCheckCertificateEnabled();
+ virtual void setTimeout(time_t timeout);
+ virtual time_t timeout();
- virtual void setVoIPEnabled(bool enabled);
- virtual bool isVoIPEnabled();
+ virtual void setCheckCertificateEnabled(bool enabled);
+ virtual bool isCheckCertificateEnabled();
+
+ virtual void setVoIPEnabled(bool enabled);
+ virtual bool isVoIPEnabled();
// Needed for fetchSubscribedFolders() and fetchAllFolders().
- virtual void setDelimiter(char delimiter);
- virtual char delimiter();
+ virtual void setDelimiter(char delimiter);
+ virtual char delimiter();
// Needed for fetchSubscribedFolders() and fetchAllFolders().
- virtual void setDefaultNamespace(IMAPNamespace * ns);
- virtual IMAPNamespace * defaultNamespace();
+ virtual void setDefaultNamespace(IMAPNamespace * ns);
+ virtual IMAPNamespace * defaultNamespace();
- virtual void select(String * folder, ErrorCode * pError);
+ virtual void select(String * folder, ErrorCode * pError);
virtual IMAPFolderStatus * folderStatus(String * folder, ErrorCode * pError);
-
- virtual Array * /* IMAPFolder */ fetchSubscribedFolders(ErrorCode * pError);
- virtual Array * /* IMAPFolder */ fetchAllFolders(ErrorCode * pError); // will use xlist if available
- virtual void renameFolder(String * folder, String * otherName, ErrorCode * pError);
- virtual void deleteFolder(String * folder, ErrorCode * pError);
- virtual void createFolder(String * folder, ErrorCode * pError);
+ virtual Array * /* IMAPFolder */ fetchSubscribedFolders(ErrorCode * pError);
+ virtual Array * /* IMAPFolder */ fetchAllFolders(ErrorCode * pError); // will use xlist if available
+
+ virtual void renameFolder(String * folder, String * otherName, ErrorCode * pError);
+ virtual void deleteFolder(String * folder, ErrorCode * pError);
+ virtual void createFolder(String * folder, ErrorCode * pError);
- virtual void subscribeFolder(String * folder, ErrorCode * pError);
- virtual void unsubscribeFolder(String * folder, ErrorCode * pError);
+ virtual void subscribeFolder(String * folder, ErrorCode * pError);
+ virtual void unsubscribeFolder(String * folder, ErrorCode * pError);
- virtual void appendMessage(String * folder, Data * messageData, MessageFlag flags,
+ virtual void appendMessage(String * folder, Data * messageData, MessageFlag flags,
IMAPProgressCallback * progressCallback, uint32_t * createdUID, ErrorCode * pError);
-
- virtual void copyMessages(String * folder, IndexSet * uidSet, String * destFolder,
+
+ virtual void copyMessages(String * folder, IndexSet * uidSet, String * destFolder,
IndexSet ** pDestUIDs, ErrorCode * pError);
-
- virtual void expunge(String * folder, ErrorCode * pError);
-
- virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
+
+ virtual void expunge(String * folder, ErrorCode * pError);
+
+ virtual Array * /* IMAPMessage */ fetchMessagesByUID(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * uids, IMAPProgressCallback * progressCallback, ErrorCode * pError);
- virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind,
+ virtual Array * /* IMAPMessage */ fetchMessagesByNumber(String * folder, IMAPMessagesRequestKind requestKind,
IndexSet * numbers, IMAPProgressCallback * progressCallback, ErrorCode * pError);
- virtual Data * fetchMessageByUID(String * folder, uint32_t uid,
+ virtual Data * fetchMessageByUID(String * folder, uint32_t uid,
IMAPProgressCallback * progressCallback, ErrorCode * pError);
- virtual Data * fetchMessageAttachmentByUID(String * folder, uint32_t uid, String * partID,
+ virtual Data * fetchMessageAttachmentByUID(String * folder, uint32_t uid, String * partID,
Encoding encoding, IMAPProgressCallback * progressCallback, ErrorCode * pError);
virtual HashMap * fetchMessageNumberUIDMapping(String * folder, uint32_t fromUID, uint32_t toUID,
ErrorCode * pError);
@@ -100,94 +98,95 @@ namespace mailcore {
IndexSet * uids, uint64_t modseq,
IMAPProgressCallback * progressCallback, ErrorCode * pError);
- virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError);
- virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError);
-
- virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError);
- virtual IndexSet * search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError);
-
- virtual bool setupIdle();
- virtual void idle(String * folder, uint32_t lastKnownUID, ErrorCode * pError);
- virtual void interruptIdle();
- virtual void unsetupIdle();
-
- virtual void connect(ErrorCode * pError);
- virtual void disconnect();
-
- virtual HashMap * fetchNamespace(ErrorCode * pError);
-
- virtual void login(ErrorCode * pError);
-
- virtual HashMap * identity(String * vendor, String * name, String * version, ErrorCode * pError);
+ virtual void storeFlags(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, MessageFlag flags, ErrorCode * pError);
+ virtual void storeLabels(String * folder, IndexSet * uids, IMAPStoreFlagsRequestKind kind, Array * labels, ErrorCode * pError);
+
+ virtual IndexSet * search(String * folder, IMAPSearchKind kind, String * searchString, ErrorCode * pError);
+ virtual IndexSet * search(String * folder, IMAPSearchExpression * expression, ErrorCode * pError);
+
+ virtual bool setupIdle();
+ virtual void idle(String * folder, uint32_t lastKnownUID, ErrorCode * pError);
+ virtual void interruptIdle();
+ virtual void unsetupIdle();
+
+ virtual void connect(ErrorCode * pError);
+ virtual void disconnect();
+
+ virtual HashMap * fetchNamespace(ErrorCode * pError);
+
+ virtual void login(ErrorCode * pError);
+
+ virtual HashMap * identity(String * vendor, String * name, String * version, ErrorCode * pError);
virtual IndexSet * capability(ErrorCode * pError);
- virtual uint32_t uidValidity();
- virtual uint32_t uidNext();
+ virtual uint32_t uidValidity();
+ virtual uint32_t uidNext();
virtual uint64_t modSequenceValue();
- virtual unsigned int lastFolderMessageCount();
+ virtual unsigned int lastFolderMessageCount();
virtual uint32_t firstUnseenUid();
- virtual bool isIdleEnabled();
- virtual bool isXListEnabled();
- virtual bool isCondstoreEnabled();
- virtual bool isQResyncEnabled();
- virtual bool isIdentityEnabled();
+ virtual bool isIdleEnabled();
+ virtual bool isXListEnabled();
+ virtual bool isCondstoreEnabled();
+ virtual bool isQResyncEnabled();
+ virtual bool isIdentityEnabled();
public: // private
- virtual void loginIfNeeded(ErrorCode * pError);
- virtual void connectIfNeeded(ErrorCode * pError);
-
- private:
- String * mHostname;
- unsigned int mPort;
- String * mUsername;
- String * mPassword;
- AuthType mAuthType;
- ConnectionType mConnectionType;
- bool mCheckCertificateEnabled;
- bool mVoIPEnabled;
- char mDelimiter;
- IMAPNamespace * mDefaultNamespace;
- time_t mTimeout;
-
- bool mBodyProgressEnabled;
- bool mIdleEnabled;
- bool mXListEnabled;
- bool mCondstoreEnabled;
- bool mQResyncEnabled;
- bool mIdentityEnabled;
- String * mWelcomeString;
- bool mNeedsMboxMailWorkaround;
- uint32_t mUIDValidity;
- uint32_t mUIDNext;
- uint64_t mModSequenceValue;
- unsigned int mFolderMsgCount;
- uint32_t mFirstUnseenUid;
-
- unsigned int mLastFetchedSequenceNumber;
- String * mCurrentFolder;
- pthread_mutex_t mIdleLock;
- bool mCanIdle;
- int mState;
- mailimap * mImap;
- IMAPProgressCallback * mProgressCallback;
- unsigned int mProgressItemsCount;
-
- void init();
- void bodyProgress(unsigned int current, unsigned int maximum);
- void itemsProgress(unsigned int current, unsigned int maximum);
- bool checkCertificate();
- static void body_progress(size_t current, size_t maximum, void * context);
- static void items_progress(size_t current, size_t maximum, void * context);
- void setup();
- void unsetup();
- void selectIfNeeded(String * folder, ErrorCode * pError);
- char fetchDelimiterIfNeeded(char defaultDelimiter, ErrorCode * pError);
- IMAPSyncResult * fetchMessages(String * folder, IMAPMessagesRequestKind requestKind, bool fetchByUID,
+ virtual void loginIfNeeded(ErrorCode * pError);
+ virtual void connectIfNeeded(ErrorCode * pError);
+ virtual bool isDisconnected();
+
+ private:
+ String * mHostname;
+ unsigned int mPort;
+ String * mUsername;
+ String * mPassword;
+ AuthType mAuthType;
+ ConnectionType mConnectionType;
+ bool mCheckCertificateEnabled;
+ bool mVoIPEnabled;
+ char mDelimiter;
+ IMAPNamespace * mDefaultNamespace;
+ time_t mTimeout;
+
+ bool mBodyProgressEnabled;
+ bool mIdleEnabled;
+ bool mXListEnabled;
+ bool mCondstoreEnabled;
+ bool mQResyncEnabled;
+ bool mIdentityEnabled;
+ String * mWelcomeString;
+ bool mNeedsMboxMailWorkaround;
+ uint32_t mUIDValidity;
+ uint32_t mUIDNext;
+ uint64_t mModSequenceValue;
+ unsigned int mFolderMsgCount;
+ uint32_t mFirstUnseenUid;
+
+ unsigned int mLastFetchedSequenceNumber;
+ String * mCurrentFolder;
+ pthread_mutex_t mIdleLock;
+ bool mCanIdle;
+ int mState;
+ mailimap * mImap;
+ IMAPProgressCallback * mProgressCallback;
+ unsigned int mProgressItemsCount;
+
+ void init();
+ void bodyProgress(unsigned int current, unsigned int maximum);
+ void itemsProgress(unsigned int current, unsigned int maximum);
+ bool checkCertificate();
+ static void body_progress(size_t current, size_t maximum, void * context);
+ static void items_progress(size_t current, size_t maximum, void * context);
+ void setup();
+ void unsetup();
+ void selectIfNeeded(String * folder, ErrorCode * pError);
+ char fetchDelimiterIfNeeded(char defaultDelimiter, ErrorCode * pError);
+ IMAPSyncResult * fetchMessages(String * folder, IMAPMessagesRequestKind requestKind, bool fetchByUID,
struct mailimap_set * imapset, uint64_t modseq, HashMap * mapping, uint32_t startUid,
IMAPProgressCallback * progressCallback, ErrorCode * pError);
- };
+ };
}
#endif
diff --git a/src/core/provider/MCMailProvider.h b/src/core/provider/MCMailProvider.h
index 50f3deff..306b180d 100644
--- a/src/core/provider/MCMailProvider.h
+++ b/src/core/provider/MCMailProvider.h
@@ -26,9 +26,9 @@ namespace mailcore {
virtual String * identifier();
- virtual Array * imapServices();
- virtual Array * smtpServices();
- virtual Array * popServices();
+ virtual Array * /* NetService */ imapServices();
+ virtual Array * /* NetService */ smtpServices();
+ virtual Array * /* NetService */ popServices();
virtual bool matchEmail(String * email);
virtual bool matchMX(String * hostname);
@@ -53,12 +53,12 @@ namespace mailcore {
private:
String * mIdentifier;
- Array * mDomainMatch;
- Array * mImapServices;
- Array * mSmtpServices;
- Array * mPopServices;
+ Array * /* String */ mDomainMatch;
+ Array * /* NetService */ mImapServices;
+ Array * /* NetService */ mSmtpServices;
+ Array * /* NetService */ mPopServices;
HashMap * mMailboxPaths;
- Set* mMxSet;
+ Set * mMxSet;
void init();
};
diff --git a/src/core/renderer/MCAddressDisplay.h b/src/core/renderer/MCAddressDisplay.h
index d84e55d0..3fe6856d 100644
--- a/src/core/renderer/MCAddressDisplay.h
+++ b/src/core/renderer/MCAddressDisplay.h
@@ -22,9 +22,9 @@ namespace mailcore {
static String * shortDisplayStringForAddress(Address * address);
static String * veryShortDisplayStringForAddress(Address * address);
- static String * displayStringForAddresses(Array * addresses);
- static String * shortDisplayStringForAddresses(Array * addresses);
- static String * veryShortDisplayStringForAddresses(Array * addresses);
+ static String * displayStringForAddresses(Array * /* Address */ addresses);
+ static String * shortDisplayStringForAddresses(Array * /* Address */ addresses);
+ static String * veryShortDisplayStringForAddresses(Array * /* Address */ addresses);
};
};
diff --git a/src/core/renderer/MCHTMLRenderer.h b/src/core/renderer/MCHTMLRenderer.h
index 2a36a9f6..f76510e8 100644
--- a/src/core/renderer/MCHTMLRenderer.h
+++ b/src/core/renderer/MCHTMLRenderer.h
@@ -31,11 +31,11 @@ namespace mailcore {
HTMLRendererIMAPCallback * dataCallback,
HTMLRendererTemplateCallback * htmlCallback);
- static Array * attachmentsForMessage(AbstractMessage * message);
- static Array * htmlInlineAttachmentsForMessage(AbstractMessage * message);
+ static Array * /* AbstractPart */ attachmentsForMessage(AbstractMessage * message);
+ static Array * /* AbstractPart */ htmlInlineAttachmentsForMessage(AbstractMessage * message);
};
};
#endif
-#endif /* defined(__testUI__MCHTMLRenderer__) */
+#endif
diff --git a/src/core/rfc822/MCMessageBuilder.cc b/src/core/rfc822/MCMessageBuilder.cc
index f8fe0064..435557db 100644
--- a/src/core/rfc822/MCMessageBuilder.cc
+++ b/src/core/rfc822/MCMessageBuilder.cc
@@ -553,12 +553,6 @@ String * MessageBuilder::textBody()
void MessageBuilder::setAttachments(Array * attachments)
{
- if (attachments != NULL) {
- for(unsigned int i = 0 ; i < attachments->count() ; i ++) {
- Attachment * attachment = (Attachment *) attachments->objectAtIndex(i);
- attachment->setMessage(this);
- }
- }
MC_SAFE_REPLACE_COPY(Array, mAttachments, attachments);
}
@@ -572,18 +566,11 @@ void MessageBuilder::addAttachment(Attachment * attachment)
if (mAttachments == NULL) {
mAttachments = new Array();
}
- attachment->setMessage(this);
mAttachments->addObject(attachment);
}
void MessageBuilder::setRelatedAttachments(Array * attachments)
{
- if (attachments != NULL) {
- for(unsigned int i = 0 ; i < attachments->count() ; i ++) {
- Attachment * attachment = (Attachment *) attachments->objectAtIndex(i);
- attachment->setMessage(this);
- }
- }
MC_SAFE_REPLACE_COPY(Array, mRelatedAttachments, attachments);
}
@@ -597,7 +584,6 @@ void MessageBuilder::addRelatedAttachment(Attachment * attachment)
if (mRelatedAttachments == NULL) {
mRelatedAttachments = new Array();
}
- attachment->setMessage(this);
mRelatedAttachments->addObject(attachment);
}
diff --git a/src/core/rfc822/MCMessageBuilder.h b/src/core/rfc822/MCMessageBuilder.h
index 63f325d3..409cd9ee 100644
--- a/src/core/rfc822/MCMessageBuilder.h
+++ b/src/core/rfc822/MCMessageBuilder.h
@@ -50,8 +50,8 @@ namespace mailcore {
private:
String * mHTMLBody;
String * mTextBody;
- Array * mAttachments;
- Array * mRelatedAttachments;
+ Array * /* Attachment */ mAttachments;
+ Array * /* Attachment */ mRelatedAttachments;
String * mBoundaryPrefix;
void init();
Data * dataAndFilterBcc(bool filterBcc);
diff --git a/src/core/rfc822/MCMessageParser.cc b/src/core/rfc822/MCMessageParser.cc
index 2a892e6b..b936fabf 100644
--- a/src/core/rfc822/MCMessageParser.cc
+++ b/src/core/rfc822/MCMessageParser.cc
@@ -37,7 +37,6 @@ MessageParser::MessageParser(Data * data)
msg = data_message_init(data->bytes(), data->length());
mailmessage_get_bodystructure(msg, &mime);
mMainPart = (AbstractPart *) Attachment::attachmentsWithMIME(msg->msg_mime)->retain();
- mMainPart->setMessage(this);
mMainPart->applyUniquePartID();
header()->importIMFFields(msg->msg_fields);
mailmessage_free(msg);
diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc
index fd5832f3..3e49ea5f 100644
--- a/src/core/smtp/MCSMTPSession.cc
+++ b/src/core/smtp/MCSMTPSession.cc
@@ -679,3 +679,7 @@ void SMTPSession::sendMessage(MessageBuilder * msg, SMTPProgressCallback * callb
recipients->release();
}
+bool SMTPSession::isDisconnected()
+{
+ return mState == STATE_DISCONNECTED;
+}
diff --git a/src/core/smtp/MCSMTPSession.h b/src/core/smtp/MCSMTPSession.h
index dc949731..57c6e0ce 100644
--- a/src/core/smtp/MCSMTPSession.h
+++ b/src/core/smtp/MCSMTPSession.h
@@ -82,9 +82,12 @@ namespace mailcore {
void loginIfNeeded(ErrorCode * pError);
bool checkCertificate();
- void sendMessage(Address * from, Array * recipients, Data * messageData,
+ void sendMessage(Address * from, Array * /* Address */ recipients, Data * messageData,
SMTPProgressCallback * callback, ErrorCode * pError);
void sendMessage(MessageBuilder * msg, SMTPProgressCallback * callback, ErrorCode * pError);
+
+ public: // private
+ virtual bool isDisconnected();
};
}
diff --git a/src/objc/abstract/MCOAbstractMessage.h b/src/objc/abstract/MCOAbstractMessage.h
index a5c2cc1b..d60bfe8c 100644
--- a/src/objc/abstract/MCOAbstractMessage.h
+++ b/src/objc/abstract/MCOAbstractMessage.h
@@ -26,11 +26,17 @@
/** Returns the part with the given unique identifier.*/
- (MCOAbstractPart *) partForUniqueID:(NSString *)uniqueID;
-/** All attachments in the message */
-- (NSArray *) attachments;
-
-/** All HTML bodies */
-- (NSArray *) htmlInlineAttachments;
+/** All attachments in the message.
+ It will return an array of MCOIMAPPart for MCOIMAPMessage.
+ It will return an array of MCOAttachment for MCOMessageParser.
+ It will return an array of MCOAttachment for MCOMessageBuilder. */
+- (NSArray * /* MCOAbstractPart */) attachments;
+
+/** All image attachments included inline in the message through cid: URLs.
+ It will return an array of MCOIMAPPart for MCOIMAPMessage.
+ It will return an array of MCOAttachment for MCOMessageParser.
+ It will return an array of MCOAttachment for MCOMessageBuilder. */
+- (NSArray * /* MCOAbstractPart */) htmlInlineAttachments;
@end
diff --git a/src/objc/abstract/MCOAbstractPart.h b/src/objc/abstract/MCOAbstractPart.h
index eb9807c4..0703a783 100644
--- a/src/objc/abstract/MCOAbstractPart.h
+++ b/src/objc/abstract/MCOAbstractPart.h
@@ -66,9 +66,6 @@ typedef enum {
/** Returns whether the part is an explicit inline attachment.*/
@property (nonatomic, assign, getter=isInlineAttachment) BOOL inlineAttachment;
-/** Returns the owner message of the part.*/
-@property (nonatomic, weak) MCOAbstractMessage * message;
-
/** Returns the part with the given Content-ID among this part and its subparts.*/
- (MCOAbstractPart *) partForContentID:(NSString *)contentID;
diff --git a/src/objc/abstract/MCOAbstractPart.mm b/src/objc/abstract/MCOAbstractPart.mm
index d2422f34..d36668e6 100644
--- a/src/objc/abstract/MCOAbstractPart.mm
+++ b/src/objc/abstract/MCOAbstractPart.mm
@@ -91,7 +91,6 @@ MCO_OBJC_SYNTHESIZE_STRING(setUniqueID, uniqueID)
MCO_OBJC_SYNTHESIZE_STRING(setContentID, contentID)
MCO_OBJC_SYNTHESIZE_STRING(setContentLocation, contentLocation)
MCO_OBJC_SYNTHESIZE_BOOL(setInlineAttachment, isInlineAttachment)
-MCO_OBJC_SYNTHESIZE(AbstractMessage, setMessage, message)
- (MCOAbstractPart *) partForContentID:(NSString *)contentID
{
diff --git a/src/objc/imap/MCOIMAPFolderStatus.h b/src/objc/imap/MCOIMAPFolderStatus.h
index 9ee1813d..d39e1fc5 100644
--- a/src/objc/imap/MCOIMAPFolderStatus.h
+++ b/src/objc/imap/MCOIMAPFolderStatus.h
@@ -14,10 +14,7 @@
/* This class holds IMAP folder metadata */
-@interface MCOIMAPFolderStatus : NSObject
-
-/** Create an empty instance */
-+ (MCOIMAPFolderStatus *) status;
+@interface MCOIMAPFolderStatus : NSObject <NSCopying>
/** The folder's IMAP UIDNEXT value. Used to determine the uid for the next received message. */
@property (nonatomic, assign) uint32_t uidNext;
@@ -26,17 +23,16 @@
@property (nonatomic, assign) uint32_t uidValidity;
/** Number of recent messages received in the folder */
-@property (nonatomic, assign) uint32_t totalRecent;
+@property (nonatomic, assign) uint32_t recentCount;
/** Number of unseen messages in the folder */
-@property (nonatomic, assign) uint32_t totalUnseen;
-
-// Number of messages in the folder
-@property (nonatomic, assign) uint32_t totalMessages;
-
-// We need also the the folder path
+@property (nonatomic, assign) uint32_t unseenCount;
+/** Number of messages in the folder */
+@property (nonatomic, assign) uint32_t messageCount;
+/** Highest modification sequence value for this folder. See CONDSTORE RFC 4551. */
+@property (nonatomic, assign) uint64_t setHighestModSeqValue;
@end
diff --git a/src/objc/imap/MCOIMAPFolderStatus.m b/src/objc/imap/MCOIMAPFolderStatus.m
deleted file mode 100644
index ceab8a00..00000000
--- a/src/objc/imap/MCOIMAPFolderStatus.m
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// MCOIMAPFolderStatus.m
-// mailcore2
-//
-// Created by Sebastian on 6/5/13.
-// Copyright (c) 2013 MailCore. All rights reserved.
-//
-
-#import "MCOIMAPFolderStatus.h"
-
-
-@implementation MCOIMAPFolderStatus {
- uint32_t total_unseen;
- uint32_t total_messages;
- uint32_t total_recent;
- uint32_t _uidNext;
- uint32_t _uidValidity;
-}
-
-@synthesize uidNext = _uidNext;
-@synthesize uidValidity = _uidValidity;
-@synthesize totalMessages = total_messages;
-@synthesize totalRecent = total_recent;
-@synthesize totalUnseen = total_unseen;
-
-
-
-+ (MCOIMAPFolderStatus *) status
-{
- return [[[MCOIMAPFolderStatus alloc] init] autorelease];
-}
-
-
-
-@end
diff --git a/src/objc/imap/MCOIMAPFolderStatus.mm b/src/objc/imap/MCOIMAPFolderStatus.mm
new file mode 100644
index 00000000..7cd1597d
--- /dev/null
+++ b/src/objc/imap/MCOIMAPFolderStatus.mm
@@ -0,0 +1,72 @@
+//
+// MCOIMAPFolderStatus.m
+// mailcore2
+//
+// Created by Sebastian on 6/5/13.
+// Copyright (c) 2013 MailCore. All rights reserved.
+//
+
+#import "MCOIMAPFolderStatus.h"
+#import "NSObject+MCO.h"
+
+#include "MCIMAPFolderStatus.h"
+
+#define nativeType mailcore::IMAPFolderStatus
+
+@implementation MCOIMAPFolderStatus {
+ mailcore::IMAPFolderStatus * _nativeStatus;
+}
+
++ (void) load
+{
+ MCORegisterClass(self, &typeid(nativeType));
+}
+
+- (id) initWithMCFolderStatus:(mailcore::IMAPFolderStatus *)status
+{
+ self = [super init];
+
+ status->retain();
+ _nativeStatus = status;
+
+ return self;
+}
+
+- (void) dealloc
+{
+ MC_SAFE_RELEASE(_nativeStatus);
+ [super dealloc];
+}
+
++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object
+{
+ mailcore::IMAPFolderStatus * status = (mailcore::IMAPFolderStatus *) object;
+ return [[[self alloc] initWithMCFolderStatus:status] autorelease];
+}
+
+- (mailcore::Object *) mco_mcObject
+{
+ return _nativeStatus;
+}
+
+- (id) copyWithZone:(NSZone *)zone
+{
+ nativeType * nativeObject = (nativeType *) [self mco_mcObject]->copy();
+ id result = [[self class] mco_objectWithMCObject:nativeObject];
+ MC_SAFE_RELEASE(nativeObject);
+ return [result retain];
+}
+
+- (NSString *) description
+{
+ return MCO_OBJC_BRIDGE_GET(description);
+}
+
+MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUnseenCount, unseenCount)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setMessageCount, messageCount)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setRecentCount, recentCount)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUidNext, uidNext)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint32_t, uint32_t, setUidValidity, uidValidity)
+MCO_OBJC_SYNTHESIZE_SCALAR(uint64_t, uint64_t, setHighestModSeqValue, highestModSeqValue)
+
+@end
diff --git a/src/objc/imap/MCOIMAPFolderStatusOperation.mm b/src/objc/imap/MCOIMAPFolderStatusOperation.mm
index 21b937b9..c7f5370c 100644
--- a/src/objc/imap/MCOIMAPFolderStatusOperation.mm
+++ b/src/objc/imap/MCOIMAPFolderStatusOperation.mm
@@ -50,13 +50,7 @@ typedef void (^CompletionType)(NSError *error, MCOIMAPFolderStatus *status);
nativeType *op = MCO_NATIVE_INSTANCE;
if (op->error() == mailcore::ErrorNone) {
- MCOIMAPFolderStatus * status = [MCOIMAPFolderStatus status];
- [status setUidNext:MCO_NATIVE_INSTANCE->uidNext()];
- [status setUidValidity:MCO_NATIVE_INSTANCE->uidValidity()];
- [status setTotalMessages:MCO_NATIVE_INSTANCE->messageCount()];
- [status setTotalRecent:MCO_NATIVE_INSTANCE->recentCount()];
- [status setTotalUnseen:MCO_NATIVE_INSTANCE->unseenCount()];
-
+ MCOIMAPFolderStatus * status = MCO_TO_OBJC(op->status());
_completionBlock(nil, status);
} else {
_completionBlock([NSError mco_errorWithErrorCode:op->error()], nil);
diff --git a/src/objc/imap/MCOIMAPMessage.h b/src/objc/imap/MCOIMAPMessage.h
index d9b54abe..0743e983 100644
--- a/src/objc/imap/MCOIMAPMessage.h
+++ b/src/objc/imap/MCOIMAPMessage.h
@@ -46,8 +46,8 @@
/** Main MIME part of the message */
@property (nonatomic, retain) MCOAbstractPart * mainPart;
-/** Any Gmail labels of the message */
-@property (nonatomic, copy) NSArray * gmailLabels;
+/** All Gmail labels of the message */
+@property (nonatomic, copy) NSArray * /* NSString */ gmailLabels;
/**
Returns the part with the given part identifier.
diff --git a/src/objc/imap/MCOIMAPNamespace.h b/src/objc/imap/MCOIMAPNamespace.h
index f3373c64..5fcda25b 100644
--- a/src/objc/imap/MCOIMAPNamespace.h
+++ b/src/objc/imap/MCOIMAPNamespace.h
@@ -30,7 +30,7 @@
- (char) mainDelimiter;
/** Returns the list of prefixes of this namespace. */
-- (NSArray *) prefixes;
+- (NSArray * /* NSString */) prefixes;
/**
Returns the folder path for the given list of path components in the context
@@ -45,7 +45,7 @@
- (NSString *) pathForComponents:(NSArray *)components prefix:(NSString *)prefix;
/** Returns the components given a folder path. */
-- (NSArray *) componentsFromPath:(NSString *)path;
+- (NSArray * /* NSString */) componentsFromPath:(NSString *)path;
/** Returns YES if the namespace contains the given folder path. */
- (BOOL) containsFolderPath:(NSString *)path;
diff --git a/src/objc/imap/MCOIMAPNamespaceItem.h b/src/objc/imap/MCOIMAPNamespaceItem.h
index b23d0dfc..3063919b 100644
--- a/src/objc/imap/MCOIMAPNamespaceItem.h
+++ b/src/objc/imap/MCOIMAPNamespaceItem.h
@@ -26,7 +26,7 @@
- (NSString *) pathForComponents:(NSArray *)components;
/** Returns components for the given path in the context of this namespace */
-- (NSArray *) componentsForPath:(NSString *)path;
+- (NSArray * /* NSString */) componentsForPath:(NSString *)path;
/** Returns YES if the namespace contains this folder path */
- (BOOL) containsFolder:(NSString *)folder;
diff --git a/src/objc/imap/MCOIMAPSearchExpression.mm b/src/objc/imap/MCOIMAPSearchExpression.mm
index ecc44ba6..dc2e027a 100644
--- a/src/objc/imap/MCOIMAPSearchExpression.mm
+++ b/src/objc/imap/MCOIMAPSearchExpression.mm
@@ -84,23 +84,13 @@
+ (MCOIMAPSearchExpression *) searchAnd:(MCOIMAPSearchExpression *)expression other:(MCOIMAPSearchExpression *)other
{
- mailcore::IMAPSearchExpression * copyExpr = (mailcore::IMAPSearchExpression *) expression->_nativeExpr->copy();
- mailcore::IMAPSearchExpression * copyOther = (mailcore::IMAPSearchExpression *) other->_nativeExpr->copy();
- mailcore::IMAPSearchExpression * result = mailcore::IMAPSearchExpression::searchAnd(copyExpr, copyOther);
- copyExpr->release();
- copyOther->release();
-
+ mailcore::IMAPSearchExpression * result = mailcore::IMAPSearchExpression::searchOr(expression->_nativeExpr, other->_nativeExpr);
return MCO_TO_OBJC(result);
}
+ (MCOIMAPSearchExpression *) searchOr:(MCOIMAPSearchExpression *)expression other:(MCOIMAPSearchExpression *)other
{
- mailcore::IMAPSearchExpression * copyExpr = (mailcore::IMAPSearchExpression *) expression->_nativeExpr->copy();
- mailcore::IMAPSearchExpression * copyOther = (mailcore::IMAPSearchExpression *) other->_nativeExpr->copy();
- mailcore::IMAPSearchExpression * result = mailcore::IMAPSearchExpression::searchOr(copyExpr, copyOther);
- copyExpr->release();
- copyOther->release();
-
+ mailcore::IMAPSearchExpression * result = mailcore::IMAPSearchExpression::searchOr(expression->_nativeExpr, other->_nativeExpr);
return MCO_TO_OBJC(result);
}
diff --git a/src/objc/imap/MCOIMAPSession.h b/src/objc/imap/MCOIMAPSession.h
index 4011a00a..1b394eff 100644
--- a/src/objc/imap/MCOIMAPSession.h
+++ b/src/objc/imap/MCOIMAPSession.h
@@ -309,9 +309,9 @@
MCOIMAPFolderInfoOperation *folderInfo = [session folderInfoOperation:folder];
[folderInfo start:^(NSError *error, MCOIMAPFolderInfo *info) {
- int messageCount = [info messageCount];
int numberOfMessages = 50;
- MCOIndexSet *numbers = [MCOIndexSet indexSetWithRange:MCORangeMake(messageCount - numberOfMessages, numberOfMessages)];
+ numberOfMessages -= 1;
+ MCOIndexSet *numbers = [MCOIndexSet indexSetWithRange:MCORangeMake([info messageCount] - numberOfMessages, numberOfMessages)];
MCOIMAPFetchMessagesOperation *fetchOperation = [session fetchMessagesByNumberOperationWithFolder:folder
requestKind:MCOIMAPMessagesRequestKindUid
diff --git a/src/objc/pop/MCOPOPSession.h b/src/objc/pop/MCOPOPSession.h
index 52f5a9b7..6ecca042 100644
--- a/src/objc/pop/MCOPOPSession.h
+++ b/src/objc/pop/MCOPOPSession.h
@@ -102,6 +102,16 @@ See MCOConnectionType for more information.*/
- (MCOPOPOperation *) deleteMessagesOperationWithIndexes:(MCOIndexSet *)indexes;
/**
+ Returns an operation that will disconnect the session.
+
+ MCOPOPOperation * op = [session disconnectOperation];
+ [op start:^(NSError * error) {
+ ...
+ }];
+ */
+- (MCOPOPOperation *) disconnectOperation;
+
+/**
Returns an operation that will check whether the POP account is valid.
MCOPOPOperation * op = [session checkAccountOperation];
diff --git a/src/objc/pop/MCOPOPSession.mm b/src/objc/pop/MCOPOPSession.mm
index cb060784..10806937 100644
--- a/src/objc/pop/MCOPOPSession.mm
+++ b/src/objc/pop/MCOPOPSession.mm
@@ -80,6 +80,12 @@ MCO_OBJC_SYNTHESIZE_BOOL(setCheckCertificateEnabled, isCheckCertificateEnabled)
return [[[MCOPOPOperation alloc] initWithMCOperation:coreOp] autorelease];
}
+- (MCOPOPOperation *) disconnectOperation
+{
+ mailcore::POPOperation * coreOp = MCO_NATIVE_INSTANCE->disconnectOperation();
+ return [[[MCOPOPOperation alloc] initWithMCOperation:coreOp] autorelease];
+}
+
- (MCOPOPOperation *) checkAccountOperation
{
mailcore::POPOperation * coreOp = MCO_NATIVE_INSTANCE->checkAccountOperation();
diff --git a/src/objc/provider/MCOMailProvider.h b/src/objc/provider/MCOMailProvider.h
index 53f09736..85a23a8d 100644
--- a/src/objc/provider/MCOMailProvider.h
+++ b/src/objc/provider/MCOMailProvider.h
@@ -22,19 +22,19 @@
A list of ways that you can connect to the IMAP server
@return An array of MCONetService
*/
-- (NSArray *) imapServices;
+- (NSArray * /* MCONetService */) imapServices;
/**
A list of ways that you can connect to the SMTP server
@return An array of MCONetService
*/
-- (NSArray *) smtpServices;
+- (NSArray * /* MCONetService */) smtpServices;
/**
A list of ways that you can connect to the POP3 server
@return An array of MCONetService
*/
-- (NSArray *) popServices;
+- (NSArray * /* MCONetService */) popServices;
- (BOOL) matchEmail:(NSString *)email;
- (BOOL) matchMX:(NSString *)hostname;
diff --git a/src/objc/provider/MCOMailProvider.mm b/src/objc/provider/MCOMailProvider.mm
index e8d80407..e35eaec5 100644
--- a/src/objc/provider/MCOMailProvider.mm
+++ b/src/objc/provider/MCOMailProvider.mm
@@ -59,6 +59,8 @@
return self;
}
+MCO_OBJC_SYNTHESIZE_STRING(setIdentifier, identifier);
+
- (NSArray *) imapServices
{
return MCO_OBJC_BRIDGE_GET(imapServices);
diff --git a/src/objc/rfc822/MCOMessageBuilder.h b/src/objc/rfc822/MCOMessageBuilder.h
index 4fa78691..217ec49c 100644
--- a/src/objc/rfc822/MCOMessageBuilder.h
+++ b/src/objc/rfc822/MCOMessageBuilder.h
@@ -41,10 +41,10 @@
@property (nonatomic, copy) NSString * textBody;
/** List of file attachments.*/
-@property (nonatomic, copy) NSArray * attachments;
+@property (nonatomic, copy) NSArray * /* MCOAttachment */ attachments;
/** List of related file attachments (included as cid: link in the HTML part).*/
-@property (nonatomic, copy) NSArray * relatedAttachments;
+@property (nonatomic, copy) NSArray * /* MCOAttachment */ relatedAttachments;
/** Prefix for the boundary identifier. Default value is nil.*/
@property (nonatomic, copy) NSString * boundaryPrefix;