diff options
author | CodaFi <devteam.codafi@gmail.com> | 2013-06-22 20:38:22 -0600 |
---|---|---|
committer | CodaFi <devteam.codafi@gmail.com> | 2013-06-22 20:38:22 -0600 |
commit | eb8b3fe42b0fc2fcaf9d5ca3f7570ccbbe99b02c (patch) | |
tree | cba7b6eea1ae818437749cac07b36b5e0e531b5d | |
parent | a24460880422f224c7d0ab906207bd5af7e0e8fc (diff) | |
parent | 74752eb7c987a2c1704f6f92486e4a4d3f77cbfb (diff) |
Merge remote-tracking branch 'upstream/master' into NSCoding-NSCopying
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; |