diff options
author | CodaFi <devteam.codafi@gmail.com> | 2013-04-28 17:37:52 -0600 |
---|---|---|
committer | CodaFi <devteam.codafi@gmail.com> | 2013-04-28 17:37:52 -0600 |
commit | d9da8ea6e22361a35c0bf94237c8c16d5021a3b4 (patch) | |
tree | e5e68ac9a9906d128c2179b82cd8b60c8a64c721 | |
parent | 10c9d0abf0e8009277fb2006cffb76b8a26865c7 (diff) |
Providers API
-rw-r--r-- | build-mac/mailcore2.xcodeproj/project.pbxproj | 107 | ||||
-rw-r--r-- | resources/providers.json | 739 | ||||
-rw-r--r-- | src/core/MCCore.h | 1 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.cc | 211 | ||||
-rw-r--r-- | src/core/provider/MCMailProvider.h | 64 | ||||
-rw-r--r-- | src/core/provider/MCMailProvidersManager.cc | 70 | ||||
-rw-r--r-- | src/core/provider/MCMailProvidersManager.h | 49 | ||||
-rw-r--r-- | src/core/provider/MCNetService.cc | 102 | ||||
-rw-r--r-- | src/core/provider/MCNetService.h | 48 | ||||
-rw-r--r-- | src/core/provider/MCProvider.h | 16 | ||||
-rw-r--r-- | src/objc/provider/MCOMailProvider.h | 32 | ||||
-rw-r--r-- | src/objc/provider/MCOMailProvider.mm | 113 | ||||
-rw-r--r-- | src/objc/provider/MCOMailProvidersManager.h | 23 | ||||
-rw-r--r-- | src/objc/provider/MCOMailProvidersManager.mm | 69 | ||||
-rw-r--r-- | src/objc/provider/MCONetService.h | 29 | ||||
-rw-r--r-- | src/objc/provider/MCONetService.mm | 90 | ||||
m--------- | submodules/libjson | 0 | ||||
-rw-r--r-- | tests/test-all.mm | 8 |
18 files changed, 1771 insertions, 0 deletions
diff --git a/build-mac/mailcore2.xcodeproj/project.pbxproj b/build-mac/mailcore2.xcodeproj/project.pbxproj index 0f756a83..360214fc 100644 --- a/build-mac/mailcore2.xcodeproj/project.pbxproj +++ b/build-mac/mailcore2.xcodeproj/project.pbxproj @@ -7,6 +7,29 @@ objects = { /* Begin PBXBuildFile section */ + 843EE40B172DD5B900C882AA /* MCOMailProvidersManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 843EE40A172DD5B900C882AA /* MCOMailProvidersManager.mm */; }; + 843EE40C172DD5B900C882AA /* MCOMailProvidersManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 843EE40A172DD5B900C882AA /* MCOMailProvidersManager.mm */; }; + 843EE40F172DD71300C882AA /* MCMailProvidersManager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 843EE40D172DD71200C882AA /* MCMailProvidersManager.cc */; }; + 843EE410172DD71300C882AA /* MCMailProvidersManager.cc in Sources */ = {isa = PBXBuildFile; fileRef = 843EE40D172DD71200C882AA /* MCMailProvidersManager.cc */; }; + 843EE411172DDF5100C882AA /* MCProvider.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E73172DAD0200E60AA3 /* MCProvider.h */; }; + 843EE412172DDF5100C882AA /* MCMailProvidersManager.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 843EE40E172DD71200C882AA /* MCMailProvidersManager.h */; }; + 843EE413172DDF5100C882AA /* MCMailProvider.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E75172DAD3300E60AA3 /* MCMailProvider.h */; }; + 843EE414172DDF5100C882AA /* MCNetService.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E79172DAD7500E60AA3 /* MCNetService.h */; }; + 843EE415172DDF5F00C882AA /* MCProvider.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E73172DAD0200E60AA3 /* MCProvider.h */; }; + 843EE416172DDF5F00C882AA /* MCMailProvidersManager.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 843EE40E172DD71200C882AA /* MCMailProvidersManager.h */; }; + 843EE417172DDF5F00C882AA /* MCMailProvider.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E75172DAD3300E60AA3 /* MCMailProvider.h */; }; + 843EE418172DDF5F00C882AA /* MCNetService.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 84AF9E79172DAD7500E60AA3 /* MCNetService.h */; }; + 84AF9E76172DAD3300E60AA3 /* MCMailProvider.cc in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E74172DAD3300E60AA3 /* MCMailProvider.cc */; }; + 84AF9E77172DAD3300E60AA3 /* MCMailProvider.cc in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E74172DAD3300E60AA3 /* MCMailProvider.cc */; }; + 84AF9E7A172DAD7500E60AA3 /* MCNetService.cc in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E78172DAD7500E60AA3 /* MCNetService.cc */; }; + 84AF9E7B172DAD7500E60AA3 /* MCNetService.cc in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E78172DAD7500E60AA3 /* MCNetService.cc */; }; + 84AF9E7E172DBAF600E60AA3 /* providers.json in Resources */ = {isa = PBXBuildFile; fileRef = 84AF9E7D172DBAF600E60AA3 /* providers.json */; }; + 84AF9E80172DBB0300E60AA3 /* providers.json in Resources */ = {isa = PBXBuildFile; fileRef = 84AF9E7D172DBAF600E60AA3 /* providers.json */; }; + 84AF9E82172DBB0B00E60AA3 /* providers.json in Resources */ = {isa = PBXBuildFile; fileRef = 84AF9E7D172DBAF600E60AA3 /* providers.json */; }; + 84AF9E88172DBC4700E60AA3 /* MCOMailProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E87172DBC4700E60AA3 /* MCOMailProvider.mm */; }; + 84AF9E89172DBC4700E60AA3 /* MCOMailProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E87172DBC4700E60AA3 /* MCOMailProvider.mm */; }; + 84AF9E8C172DBE4100E60AA3 /* MCONetService.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E8B172DBE4000E60AA3 /* MCONetService.mm */; }; + 84AF9E8D172DBE4100E60AA3 /* MCONetService.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84AF9E8B172DBE4000E60AA3 /* MCONetService.mm */; }; 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 */; }; @@ -648,6 +671,10 @@ dstPath = include/MailCore; dstSubfolderSpec = 16; files = ( + 843EE411172DDF5100C882AA /* MCProvider.h in CopyFiles */, + 843EE412172DDF5100C882AA /* MCMailProvidersManager.h in CopyFiles */, + 843EE413172DDF5100C882AA /* MCMailProvider.h in CopyFiles */, + 843EE414172DDF5100C882AA /* MCNetService.h in CopyFiles */, C6AC113417124D0600B715B7 /* MCLibetpanTypes.h in CopyFiles */, C63CD68C16BE1BC800DB18F1 /* MCHTMLRendererCallback.h in CopyFiles */, C6A81BFC1707821F00882C15 /* MCOPOP.h in CopyFiles */, @@ -823,6 +850,10 @@ dstPath = include/MailCore; dstSubfolderSpec = 16; files = ( + 843EE415172DDF5F00C882AA /* MCProvider.h in CopyFiles */, + 843EE416172DDF5F00C882AA /* MCMailProvidersManager.h in CopyFiles */, + 843EE417172DDF5F00C882AA /* MCMailProvider.h in CopyFiles */, + 843EE418172DDF5F00C882AA /* MCNetService.h in CopyFiles */, C6AC113517124D0A00B715B7 /* MCLibetpanTypes.h in CopyFiles */, C6BA2B0C1705F4E6003F0E9E /* MCHTMLRendererCallback.h in CopyFiles */, C6BA2B0D1705F4E6003F0E9E /* MCOMultipart.h in CopyFiles */, @@ -986,6 +1017,20 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 843EE409172DD5B900C882AA /* MCOMailProvidersManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCOMailProvidersManager.h; path = provider/MCOMailProvidersManager.h; sourceTree = "<group>"; }; + 843EE40A172DD5B900C882AA /* MCOMailProvidersManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MCOMailProvidersManager.mm; path = provider/MCOMailProvidersManager.mm; sourceTree = "<group>"; }; + 843EE40D172DD71200C882AA /* MCMailProvidersManager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MCMailProvidersManager.cc; path = ../provider/MCMailProvidersManager.cc; sourceTree = "<group>"; }; + 843EE40E172DD71200C882AA /* MCMailProvidersManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCMailProvidersManager.h; path = ../provider/MCMailProvidersManager.h; sourceTree = "<group>"; }; + 84AF9E73172DAD0200E60AA3 /* MCProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCProvider.h; path = ../provider/MCProvider.h; sourceTree = "<group>"; }; + 84AF9E74172DAD3300E60AA3 /* MCMailProvider.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MCMailProvider.cc; path = ../provider/MCMailProvider.cc; sourceTree = "<group>"; }; + 84AF9E75172DAD3300E60AA3 /* MCMailProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCMailProvider.h; path = ../provider/MCMailProvider.h; sourceTree = "<group>"; }; + 84AF9E78172DAD7500E60AA3 /* MCNetService.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MCNetService.cc; path = ../provider/MCNetService.cc; sourceTree = "<group>"; }; + 84AF9E79172DAD7500E60AA3 /* MCNetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCNetService.h; path = ../provider/MCNetService.h; sourceTree = "<group>"; }; + 84AF9E7D172DBAF600E60AA3 /* providers.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = providers.json; path = ../resources/providers.json; sourceTree = "<group>"; }; + 84AF9E86172DBC4700E60AA3 /* MCOMailProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCOMailProvider.h; path = provider/MCOMailProvider.h; sourceTree = "<group>"; }; + 84AF9E87172DBC4700E60AA3 /* MCOMailProvider.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MCOMailProvider.mm; path = provider/MCOMailProvider.mm; sourceTree = "<group>"; }; + 84AF9E8A172DBE4000E60AA3 /* MCONetService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MCONetService.h; path = provider/MCONetService.h; sourceTree = "<group>"; }; + 84AF9E8B172DBE4000E60AA3 /* MCONetService.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MCONetService.mm; path = provider/MCONetService.mm; sourceTree = "<group>"; }; 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>"; }; @@ -1379,6 +1424,34 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 84AF9E72172DACC900E60AA3 /* provider */ = { + isa = PBXGroup; + children = ( + 84AF9E73172DAD0200E60AA3 /* MCProvider.h */, + 843EE40D172DD71200C882AA /* MCMailProvidersManager.cc */, + 843EE40E172DD71200C882AA /* MCMailProvidersManager.h */, + 84AF9E74172DAD3300E60AA3 /* MCMailProvider.cc */, + 84AF9E75172DAD3300E60AA3 /* MCMailProvider.h */, + 84AF9E78172DAD7500E60AA3 /* MCNetService.cc */, + 84AF9E79172DAD7500E60AA3 /* MCNetService.h */, + ); + name = provider; + path = smtp; + sourceTree = "<group>"; + }; + 84AF9E84172DBC1000E60AA3 /* provider */ = { + isa = PBXGroup; + children = ( + 84AF9E86172DBC4700E60AA3 /* MCOMailProvider.h */, + 84AF9E87172DBC4700E60AA3 /* MCOMailProvider.mm */, + 84AF9E8A172DBE4000E60AA3 /* MCONetService.h */, + 84AF9E8B172DBE4000E60AA3 /* MCONetService.mm */, + 843EE409172DD5B900C882AA /* MCOMailProvidersManager.h */, + 843EE40A172DD5B900C882AA /* MCOMailProvidersManager.mm */, + ); + name = provider; + sourceTree = "<group>"; + }; C63CD67616BDCDD300DB18F1 /* renderer */ = { isa = PBXGroup; children = ( @@ -1594,6 +1667,7 @@ C63CD67616BDCDD300DB18F1 /* renderer */, C64EA6DF169E847800778456 /* rfc822 */, C64EA6EB169E847800778456 /* smtp */, + 84AF9E72172DACC900E60AA3 /* provider */, C64EA782169F23AB00778456 /* MCCore.h */, ); path = core; @@ -1797,6 +1871,7 @@ C6BD28A1170BD78E00A91AC1 /* mailcore-framework */ = { isa = PBXGroup; children = ( + 84AF9E7D172DBAF600E60AA3 /* providers.json */, C6BD28A2170BD79D00A91AC1 /* framework-Info.plist */, C6BD28A8170BDB6B00A91AC1 /* MCOFramework.h */, C6BD28A9170BDB6B00A91AC1 /* MCOFramework.mm */, @@ -1813,6 +1888,7 @@ F8EA941316BAED500011AC6F /* imap */, C64BB25B16FD3E98000DB34C /* rfc822 */, C6D42C1816AE03D6002BB4F9 /* utils */, + 84AF9E84172DBC1000E60AA3 /* provider */, C6EB30DC16B5B7770091F4F1 /* MCObjC.h */, ); path = objc; @@ -1961,6 +2037,7 @@ C64EA74B169E854B00778456 /* CopyFiles */, C64EA533169E772200778456 /* Sources */, C64EA534169E772200778456 /* Frameworks */, + 84AF9E7F172DBB0000E60AA3 /* Resources */, ); buildRules = ( ); @@ -2015,6 +2092,7 @@ C6BA2B0B1705F4E6003F0E9E /* CopyFiles */, C6BA2B981705F4E6003F0E9E /* Sources */, C6BA2C151705F4E6003F0E9E /* Frameworks */, + 84AF9E81172DBB0900E60AA3 /* Resources */, ); buildRules = ( ); @@ -2076,6 +2154,22 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 84AF9E7F172DBB0000E60AA3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84AF9E80172DBB0300E60AA3 /* providers.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 84AF9E81172DBB0900E60AA3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 84AF9E82172DBB0B00E60AA3 /* providers.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; C6A81B8F1706840C00882C15 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -2087,6 +2181,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 84AF9E7E172DBAF600E60AA3 /* providers.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2277,6 +2372,12 @@ C6D6F954171E5CB8006F5B28 /* MCMD5.cpp in Sources */, C6D6F956171E5CB8006F5B28 /* MCNull.cpp in Sources */, C6D6F967171FCF9F006F5B28 /* MCJSONParser.cpp in Sources */, + 84AF9E76172DAD3300E60AA3 /* MCMailProvider.cc in Sources */, + 84AF9E7A172DAD7500E60AA3 /* MCNetService.cc in Sources */, + 84AF9E88172DBC4700E60AA3 /* MCOMailProvider.mm in Sources */, + 84AF9E8C172DBE4100E60AA3 /* MCONetService.mm in Sources */, + 843EE40B172DD5B900C882AA /* MCOMailProvidersManager.mm in Sources */, + 843EE40F172DD71300C882AA /* MCMailProvidersManager.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2441,6 +2542,12 @@ C6D6F955171E5CB8006F5B28 /* MCMD5.cpp in Sources */, C6D6F957171E5CB8006F5B28 /* MCNull.cpp in Sources */, C6D6F968171FCF9F006F5B28 /* MCJSONParser.cpp in Sources */, + 84AF9E77172DAD3300E60AA3 /* MCMailProvider.cc in Sources */, + 84AF9E7B172DAD7500E60AA3 /* MCNetService.cc in Sources */, + 84AF9E89172DBC4700E60AA3 /* MCOMailProvider.mm in Sources */, + 84AF9E8D172DBE4100E60AA3 /* MCONetService.mm in Sources */, + 843EE40C172DD5B900C882AA /* MCOMailProvidersManager.mm in Sources */, + 843EE410172DD71300C882AA /* MCMailProvidersManager.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/resources/providers.json b/resources/providers.json new file mode 100644 index 00000000..d758aa38 --- /dev/null +++ b/resources/providers.json @@ -0,0 +1,739 @@ +{ + "mobileme":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"mail.me.com", + "ssl":true + }, + { + "port":143, + "hostname":"mail.me.com", + "starttls":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"smtp.me.com", + "starttls":true + } + ] + }, + "domain-match":[ + "me\\.com", + "mac\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "dreamhost":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"mail.{domain}", + "ssl":true + }, + { + "port":143, + "hostname":"mail.{domain}", + "starttls":true + } + ], + "smtp":[ + { + "port":465, + "hostname":"mail.{domain}", + "ssl":true + }, + { + "port":587, + "hostname":"mail.{domain}", + "starttls":true + }, + { + "port":25, + "hostname":"mail.{domain}", + "starttls":true + } + ] + }, + "mx":[ + "mx1.sub4.homie.mail.dreamhost.com", + "mx2.sub4.homie.mail.dreamhost.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "insecure-default":{ + "servers":{ + "imap":[ + { + "port":143, + "starttls":true + }, + { + "port":143 + } + ], + "smtp":[ + { + "port":587, + "starttls":true + }, + { + "port":25, + "starttls":true + }, + { + "port":587 + }, + { + "port":25 + } + ] + }, + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "euro-apple":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"phonehome.euro.apple.com", + "ssl":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"phonehome.apple.com", + "starttls":true + } + ] + }, + "domain-match":[ + "euro\\.apple\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "default":{ + "servers":{ + "imap":[ + { + "port":993, + "ssl":true + }, + { + "port":143, + "starttls":true + } + ], + "smtp":[ + { + "port":465, + "ssl":true + }, + { + "port":587, + "starttls":true + }, + { + "port":25, + "starttls":true + } + ] + }, + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "insecure-fixed-port":{ + "servers":{ + "imap":[ + { + "starttls":true + }, + { + + } + ], + "smtp":[ + { + "starttls":true + }, + { + + } + ] + }, + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "aol":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"imap.aol.com", + "ssl":true + }, + { + "port":143, + "hostname":"imap.aol.com", + "starttls":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"smtp.aol.com", + "starttls":true + }, + { + "port":465, + "hostname":"smtp.aol.com", + "ssl":true + }, + { + "port":25, + "hostname":"smtp.aol.com", + "starttls":true + } + ] + }, + "domain-match":[ + "aim\\.com", + "aol\\..*", + "jp\\.aol\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Saved", + "spam":"Spam", + "sentmail":"Sent", + "trash":"Trash" + } + }, + "yahoo":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"imap.mail.yahoo.com", + "ssl":true + }, + { + "port":143, + "hostname":"imap.mail.yahoo.com", + "starttls":true + } + ], + "smtp":[ + { + "port":465, + "hostname":"smtp.mail.yahoo.com", + "ssl":true + } + ] + }, + "domain-match":[ + "yahoo\\..*", + "ymail\\.com", + "rocketmail\\.com", + "xtra\\.co\\.nz" + ], + "mailboxes":{ + "drafts":"Draft", + "allmail":"Archive", + "spam":"Bulk Mail", + "sentmail":"Sent", + "trash":"Trash" + } + }, + "gmail":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"imap.gmail.com", + "ssl":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"smtp.gmail.com", + "starttls":true + }, + { + "port":465, + "hostname":"smtp.gmail.com", + "ssl":true + }, + { + "port":25, + "hostname":"smtp.gmail.com", + "starttls":true + } + ] + }, + "mx":[ + "aspmx2.googlemail.com", + "aspmx.l.google.com", + "aspmx3.googlemail.com", + "alt1.aspmx.l.google.com", + "alt2.aspmx.l.google.com" + ], + "domain-match":[ + "googlemail\\.com", + "gmail\\.com" + ] + }, + "gmx":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"imap.gmx.com", + "ssl":true + }, + { + "port":143, + "hostname":"imap.gmx.com", + "starttls":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"mail.gmx.com", + "starttls":true + }, + { + "port":465, + "hostname":"mail.gmx.com", + "ssl":true + }, + { + "port":25, + "hostname":"mail.gmx.com", + "starttls":true + } + ] + }, + "domain-match":[ + "gmx\\..*", + "caramail\\..*" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Spam", + "sentmail":"Sent", + "trash":"Trash" + } + }, + "fastmail":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"mail.messagingengine.com", + "ssl":true + }, + { + "port":143, + "hostname":"mail.messagingengine.com", + "starttls":true + } + ], + "smtp":[ + { + "port":587, + "hostname":"mail.messagingengine.com", + "starttls":true + }, + { + "port":465, + "hostname":"mail.messagingengine.com", + "ssl":true + }, + { + "port":25, + "hostname - 2":"mail.messagingengine.com", + "starttls":true + } + ] + }, + "domain-match":[ + "123mail\\.org", + "fastmail\\..*", + "airpost\\.net", + "eml\\.cc", + "fmail\\.co\\.uk", + "fmgirl\\.com", + "fmguy\\.com", + "mailbolt\\.com", + "mailcan\\.com", + "mailhaven\\.com", + "mailmight\\.com", + "ml1\\.net", + "mm\\.st", + "myfastmail\\.com", + "proinbox\\.com", + "promessage\\.com", + "rushpost\\.com", + "sent\\.as", + "sent\\.at", + "sent\\.com", + "speedymail\\.org", + "warpmail\\.net", + "xsmail\\.com", + "150mail\\.com", + "150ml\\.com", + "16mail\\.com", + "2-mail\\.com", + "4email\\.net", + "50mail\\.com", + "allmail\\.net", + "bestmail\\.us", + "cluemail\\.com", + "elitemail\\.org", + "emailcorner\\.net", + "emailengine\\.net", + "emailengine\\.org", + "emailgroups\\.net", + "emailplus\\.org", + "emailuser\\.net", + "f-m\\.fm", + "fast-email\\.com", + "fast-mail\\.org", + "fastem\\.com", + "fastemail\\.us", + "fastemailer\\.com", + "fastest\\.cc", + "fastimap\\.com", + "fastmailbox\\.net", + "fastmessaging\\.com", + "fea\\.st", + "fmailbox\\.com", + "ftml\\.net", + "h-mail\\.us", + "hailmail\\.net", + "imap-mail\\.com", + "imap\\.cc", + "imapmail\\.org", + "inoutbox\\.com", + "internet-e-mail\\.com", + "internet-mail\\.org", + "internetemails\\.net", + "internetmailing\\.net", + "jetemail\\.net", + "justemail\\.net", + "letterboxes\\.org", + "mail-central\\.com", + "mail-page\\.com", + "mailandftp\\.com", + "mailas\\.com", + "mailc\\.net", + "mailforce\\.net", + "mailftp\\.com", + "mailingaddress\\.org", + "mailite\\.com", + "mailnew\\.com", + "mailsent\\.net", + "mailservice\\.ms", + "mailup\\.net", + "mailworks\\.org", + "mymacmail\\.com", + "nospammail\\.net", + "ownmail\\.net", + "petml\\.com", + "postinbox\\.com", + "postpro\\.net", + "realemail\\.net", + "reallyfast\\.biz", + "reallyfast\\.info", + "speedpost\\.net", + "ssl-mail\\.com", + "swift-mail\\.com", + "the-fastest\\.net", + "the-quickest\\.com", + "theinternetemail\\.com", + "veryfast\\.biz", + "veryspeedy\\.net", + "yepmail\\.net", + "your-mail\\.com", + "operamail\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk Mail", + "sentmail":"Sent Items", + "trash":"Trash" + } + }, + "apple":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"phonehome.apple.com", + "ssl":true + } + ], + "smtp":[ + { + "port":465, + "tls":true, + "hostname":"phonehome.apple.com" + }, + { + "port":587, + "hostname":"phonehome.apple.com", + "starttls":true + } + ] + }, + "domain-match":[ + "apple\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "asia-apple":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"phonehome.asia.apple.com", + "ssl":true + } + ], + "smtp":[ + { + "port":465, + "tls":true, + "hostname":"phonehome.asia.apple.com" + }, + { + "port":587, + "hostname":"phonehome.asia.apple.com", + "starttls":true + } + ] + }, + "domain-match":[ + "asia\\.apple\\.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "rackspace":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"secure.emailsrvr.com", + "ssl":true + }, + { + "port":143, + "hostname":"secure.emailsrvr.com", + "starttls":true + }, + { + "port":143, + "hostname":"secure.emailsrvr.com" + } + ], + "smtp":[ + { + "port":465, + "hostname":"secure.emailsrvr.com", + "ssl":true + }, + { + "port":587, + "hostname":"secure.emailsrvr.com", + "starttls":true + }, + { + "port":25, + "hostname":"secure.emailsrvr.com", + "starttls":true + }, + { + "port":587, + "hostname":"secure.emailsrvr.com" + }, + { + "port":25, + "hostname":"secure.emailsrvr.com" + } + ] + }, + "mx":[ + "mx1.emailsrvr.com", + "mx2.emailsrvr.com" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "zimbra":{ + "servers":{ + "imap":[ + { + "port":993, + "ssl":true + }, + { + "port":143, + "starttls":true + } + ], + "smtp":[ + { + "port":587, + "starttls":true + }, + { + "port":465, + "ssl":true + }, + { + "port":25, + "starttls":true + } + ] + }, + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent", + "trash":"Trash" + } + }, + "ovh":{ + "servers":{ + "imap":[ + { + "port":993, + "hostname":"mail.{domain}", + "ssl":true + }, + { + "port":143, + "hostname":"mail.{domain}" + } + ], + "smtp":[ + { + "port":465, + "hostname":"mail.{domain}", + "ssl":true + }, + { + "port":587, + "hostname":"mail.{domain}" + }, + { + "port":25, + "hostname":"mail.{domain}" + } + ] + }, + "mx":[ + "mx0.ovh.net", + "mx1.ovh.net", + "mx2.ovh.net", + "mx3.ovh.net", + "mx4.ovh.net" + ], + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + }, + "fixed-port":{ + "servers":{ + "imap":[ + { + "ssl":true + }, + { + "starttls":true + } + ], + "smtp":[ + { + "starttls":true + }, + { + "ssl":true + } + ] + }, + "mailboxes":{ + "drafts":"Drafts", + "allmail":"Archive", + "spam":"Junk", + "sentmail":"Sent Messages", + "trash":"Deleted Messages" + } + } +}
\ No newline at end of file diff --git a/src/core/MCCore.h b/src/core/MCCore.h index 952ae1b5..24351281 100644 --- a/src/core/MCCore.h +++ b/src/core/MCCore.h @@ -16,5 +16,6 @@ #include <MailCore/MCRFC822.h> #include <MailCore/MCSMTP.h> #include <MailCore/MCRenderer.h> +#include <MailCore/MCProvider.h> #endif diff --git a/src/core/provider/MCMailProvider.cc b/src/core/provider/MCMailProvider.cc new file mode 100644 index 00000000..e9f64872 --- /dev/null +++ b/src/core/provider/MCMailProvider.cc @@ -0,0 +1,211 @@ +// +// MCMailProvider.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCMailProvider.h" +#include "MCNetService.h" +#include "MCIterator.h" +#include "MCJSON.h" + +#include <regex.h> + +using namespace mailcore; + +void MailProvider::init() +{ + mImapServices = new Array(); + mSmtpServices = new Array(); + mPopServices = new Array(); + mMxSet = new Set(); +} + +void MailProvider::initWihInfo(HashMap * info) +{ + init(); + + Array * imapInfos; + Array * smtpInfos; + Array * popInfos; + HashMap * serverInfo; + Array * mxs; + + mDomainMatch = (Array *) info->objectForKey(MCSTR("domain-match"))->retain(); + mMailboxPaths = (HashMap *) info->objectForKey(MCSTR("mailboxes"))->retain(); + mxs = (Array *) info->objectForKey(MCSTR("mx")); + mc_foreacharray(String, mx, mxs) { + mMxSet->addObject(mx->lowercaseString()); + } + + serverInfo = (HashMap *) info->objectForKey(MCSTR("servers")); + imapInfos = (Array *) serverInfo->objectForKey(MCSTR("imap")); + smtpInfos = (Array *) serverInfo->objectForKey(MCSTR("smtp")); + popInfos = (Array *) serverInfo->objectForKey(MCSTR("pop")); + + mc_foreacharray(HashMap, imapInfo, imapInfos) { + NetService * service; + + service = new NetService(imapInfo); + mImapServices->addObject(service); + service->release(); + } + + mc_foreacharray(HashMap, smtpInfo, smtpInfos) { + NetService * service; + + service = new NetService(smtpInfo); + mSmtpServices->addObject(service); + service->release(); + } + + mc_foreacharray(HashMap, popInfo, popInfos) { + NetService * service; + + service = new NetService(popInfo); + mPopServices->addObject(service); + service->release(); + } +} + +MailProvider::MailProvider(HashMap * info) +{ + initWihInfo(info); +} + +MailProvider::MailProvider(Data * infoData) { + initWihInfo((HashMap *) JSON::objectFromJSONData(infoData)); +} + +MailProvider::~MailProvider() { + delete mImapServices; + delete mSmtpServices; + delete mPopServices; + delete mMxSet; + delete mDomainMatch; + delete mMailboxPaths; + delete mIdentifier; +} + +void MailProvider::setIdentifier(String * identifier) { + mIdentifier = identifier; +} + +String * MailProvider::identifier() { + return mIdentifier; +} + +Array * MailProvider::imapServices() +{ + return mImapServices; +} + +Array * MailProvider::smtpServices() +{ + return mSmtpServices; +} + +Array * MailProvider::popServices() +{ + return mPopServices; +} + +bool MailProvider::matchEmail(String * email) +{ + Array * components; + String * domain; + const char * cDomain; + + components = email->componentsSeparatedByString(MCSTR("@")); + if (components->count() < 2) + return false; + + domain = (String *) components->lastObject(); + cDomain = domain->UTF8Characters(); + + mc_foreacharray(String, match, mDomainMatch) { + regex_t r; + bool matched; + + match = String::stringWithUTF8Format("^%s$", match->UTF8Characters()); + if (regcomp(&r, match->UTF8Characters(), REG_EXTENDED | REG_ICASE | REG_NOSUB) != 0) + continue; + + matched = false; + if (regexec(&r, cDomain, 0, NULL, 0) == 0) { + matched = true; + } + + regfree(&r); + + if (matched) + return true; + } + + return false; +} + +bool MailProvider::matchMX(String * hostname) +{ + return mMxSet->containsObject(hostname->lowercaseString()); +} + +String * MailProvider::sentMailFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("sentmail")); +} + +String * MailProvider::starredFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("starred")); +} + +String * MailProvider::allMailFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("allmail")); +} + +String * MailProvider::trashFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("trash")); +} + +String * MailProvider::draftsFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("drafts")); +} + +String * MailProvider::spamFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("spam")); +} + +String * MailProvider::importantFolderPath() +{ + return (String *) mMailboxPaths->objectForKey(MCSTR("important")); +} + +bool MailProvider::isMainFolder(String * folderPath, String * prefix) +{ + mc_foreachdictionaryValue(Object, path, mMailboxPaths) { + String * fullPath; + + if (prefix != NULL) { + fullPath = prefix->stringByAppendingString((String *) path); + } + else { + fullPath = (String *) path; + } + + if (fullPath->isEqual(folderPath)) + return true; + } + + return false; +} + +String * MailProvider::description() { + return String::stringWithUTF8Format("<%s:%p, %s>", className()->UTF8Characters(), this, identifier()); +} diff --git a/src/core/provider/MCMailProvider.h b/src/core/provider/MCMailProvider.h new file mode 100644 index 00000000..04f46750 --- /dev/null +++ b/src/core/provider/MCMailProvider.h @@ -0,0 +1,64 @@ +// +// MCMailProvider.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCMailProvider__ +#define __MAILCORE__MCMailProvider__ + +#include <MailCore/MCBaseTypes.h> + +#ifdef __cplusplus + +namespace mailcore { + class NetService; + + class MailProvider : public Object { + + public: + MailProvider(HashMap * info); + MailProvider(Data * infoData); + ~MailProvider(); + + void setIdentifier(String * identifier); + String * identifier(); + + Array * imapServices(); + Array * smtpServices(); + Array * popServices(); + + bool matchEmail(String * email); + bool matchMX(String * hostname); + + String * sentMailFolderPath(); + String * starredFolderPath(); + String * allMailFolderPath(); + String * trashFolderPath(); + String * draftsFolderPath(); + String * spamFolderPath(); + String * importantFolderPath(); + + bool isMainFolder(String * folderPath, String * prefix); + + virtual String * description(); + + private: + String * mIdentifier; + Array * mDomainMatch; + Array * mImapServices; + Array * mSmtpServices; + Array * mPopServices; + HashMap * mMailboxPaths; + Set* mMxSet; + + void init(); + void initWihInfo(HashMap * info); + }; +}; + +#endif + +#endif /* defined(__MAILCORE__MCMailProvider__) */ diff --git a/src/core/provider/MCMailProvidersManager.cc b/src/core/provider/MCMailProvidersManager.cc new file mode 100644 index 00000000..0b45f4da --- /dev/null +++ b/src/core/provider/MCMailProvidersManager.cc @@ -0,0 +1,70 @@ +// +// MCMailProvidersManager.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCMailProvidersManager.h" +#include "MCMailProvider.h" +#include "MCJSON.h" + +using namespace mailcore; + +void MailProvidersManager::init() +{ + mProviders = new HashMap(); +} + +MailProvider * MailProvidersManager::providerForEmail(String * email) +{ + mc_foreachdictionaryValue(Object, identifier, mProviders) { + MailProvider * provider; + + provider = (MailProvider *) mProviders->objectForKey(identifier); + if (provider->matchEmail(email)) + return provider; + } + + return NULL; +} + +MailProvider * MailProvidersManager::providerForMX(String * hostname) +{ + mc_foreachdictionaryValue(Object, identifier, mProviders) { + MailProvider * provider; + + provider = (MailProvider *) mProviders->objectForKey(identifier); + if (provider->matchMX(hostname)) + return provider; + } + + return NULL; +} + +MailProvider * MailProvidersManager::providerForIdentifier(String * identifier) +{ + return (MailProvider *) mProviders->objectForKey(identifier); +} + +void MailProvidersManager::registerProviders(HashMap * providers) +{ + mc_foreachdictionaryValue(Object, identifier, providers) { + MailProvider * provider; + + provider = new MailProvider((HashMap *) providers->objectForKey(identifier)); + provider->setIdentifier((String *) identifier); + mProviders->setObjectForKey(provider, identifier); + provider->release(); + } +} + +void MailProvidersManager::registerProvidersFilename(String * filename) +{ + HashMap * providersInfos; + + providersInfos = (HashMap *) JSON::objectFromJSONData(Data::dataWithContentsOfFile(filename)); + registerProviders(providersInfos); + providersInfos->release(); +} diff --git a/src/core/provider/MCMailProvidersManager.h b/src/core/provider/MCMailProvidersManager.h new file mode 100644 index 00000000..978ec7d9 --- /dev/null +++ b/src/core/provider/MCMailProvidersManager.h @@ -0,0 +1,49 @@ +// +// MCMailProvidersManager.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCMailProvidersManager__ +#define __MAILCORE__MCMailProvidersManager__ + +#include <MailCore/MCBaseTypes.h> + +#ifdef __cplusplus + +namespace mailcore { + class MailProvider; + + class MailProvidersManager : public Object { + + public: + static MailProvidersManager * sharedManager() + { + static MailProvidersManager * instance = new MailProvidersManager(); + instance->init(); + return instance; + } + + MailProvider * providerForEmail(String * email); + MailProvider * providerForMX(String * hostname); + MailProvider * providerForIdentifier(String * identifier); + + void registerProviders(HashMap * providers); + void registerProvidersFilename(String * filename); + + private: + MailProvidersManager() {}; + MailProvidersManager(MailProvidersManager const&); + void operator=(MailProvidersManager const&); + + HashMap * mProviders; + + void init(); + }; +} + +#endif + +#endif /* defined(__MAILCORE__MCMailProvidersManager__) */ diff --git a/src/core/provider/MCNetService.cc b/src/core/provider/MCNetService.cc new file mode 100644 index 00000000..0ffcbaef --- /dev/null +++ b/src/core/provider/MCNetService.cc @@ -0,0 +1,102 @@ +// +// MCNetService.cpp +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#include "MCNetService.h" + +using namespace mailcore; + +void NetService::init() { + +} + +NetService::NetService(HashMap * info) { + init(); + + bool ssl; + bool starttls; + + this->setHostname((String *) info->objectForKey(MCSTR("hostname"))); + this->setPort(((Value *) info->objectForKey(MCSTR("port")))->intValue()); + ssl = ((Value *) info->objectForKey(MCSTR("ssl")))->boolValue(); + starttls = ((Value *) info->objectForKey(MCSTR("starttls")))->boolValue(); + if (ssl) { + mConnectionType = ConnectionTypeTLS; + } + else if (starttls) { + mConnectionType = ConnectionTypeStartTLS; + } + else { + mConnectionType = ConnectionTypeClear; + } +} + +NetService::~NetService() { + delete mHostname; +} + +void NetService::setHostname(String *hostname) +{ + mHostname = hostname; +} + +String * NetService::hostname() +{ + return mHostname; +} + +void NetService::setPort(unsigned int port) +{ + mPort = port; +} + +unsigned int NetService::port() +{ + return mPort; +} + +void NetService::setConnectionType(ConnectionType connectionType) +{ + mConnectionType = connectionType; +} + +ConnectionType NetService::connectionType() +{ + return mConnectionType; +} + +String * NetService::normalizedHostnameWithEmail(String * email) { + Array *components = email->componentsSeparatedByString(MCSTR("@")); + String *hostname = (String *) mHostname->copy(); + if (components->count() != 0) { + hostname->replaceOccurrencesOfString(MCSTR("{domain}"), (String *) components->lastObject()); + return hostname; + } + return mHostname; +} + +HashMap * NetService::info() { + HashMap * result; + + result = new HashMap(); + if (mHostname != NULL) { + result->setObjectForKey(mHostname, MCSTR("hostname")); + } + if (mPort != 0) { + result->setObjectForKey(Value::valueWithIntValue(mPort), MCSTR("port")); + } + switch (mConnectionType & ConnectionTypeMask) { + case ConnectionTypeTLS: + result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("ssl")); + break; + case ConnectionTypeStartTLS: + result->setObjectForKey(Value::valueWithBoolValue(true), MCSTR("starttls")); + break; + } + + return result; +} diff --git a/src/core/provider/MCNetService.h b/src/core/provider/MCNetService.h new file mode 100644 index 00000000..c2560ec3 --- /dev/null +++ b/src/core/provider/MCNetService.h @@ -0,0 +1,48 @@ +// +// MCNetService.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE__MCNetService__ +#define __MAILCORE__MCNetService__ + +#include <MailCore/MCBaseTypes.h> +#include <MailCore/MCMessageConstants.h> + +#ifdef __cplusplus + +namespace mailcore { + class NetService : public Object { + + public: + NetService(HashMap * info); + ~NetService(); + + void setHostname(String * hostname); + String * hostname(); + + void setPort(unsigned int port); + unsigned int port(); + + void setConnectionType(ConnectionType connectionType); + ConnectionType connectionType(); + + HashMap * info(); + + String * normalizedHostnameWithEmail(String * email); + + private: + String * mHostname; + unsigned int mPort; + ConnectionType mConnectionType; + + void init(); + }; +} + +#endif + +#endif /* defined(__MAILCORE__MCNetService__) */ diff --git a/src/core/provider/MCProvider.h b/src/core/provider/MCProvider.h new file mode 100644 index 00000000..ef3c2f8c --- /dev/null +++ b/src/core/provider/MCProvider.h @@ -0,0 +1,16 @@ +// +// MCProvider.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#ifndef __MAILCORE_MCPROVIDER_H_ +#define __MAILCORE_MCPROVIDER_H_ + +#include <MailCore/MCMailProvidersManager.h> +#include <MailCore/MCMailProvider.h> +#include <MailCore/MCNetService.h> + +#endif diff --git a/src/objc/provider/MCOMailProvider.h b/src/objc/provider/MCOMailProvider.h new file mode 100644 index 00000000..6a5ed9b4 --- /dev/null +++ b/src/objc/provider/MCOMailProvider.h @@ -0,0 +1,32 @@ +// +// MCOMailProvider.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import <Foundation/Foundation.h> + +@interface MCOMailProvider : NSObject + +@property (nonatomic, copy) NSString * identifier; + +- (id) initWithInfo:(NSDictionary *)info; + +- (NSArray *) imapServices; +- (NSArray *) smtpServices; +- (NSArray *) popServices; + +- (BOOL) matchEmail:(NSString *)email; +- (BOOL) matchMX:(NSString *)hostname; + +- (NSString *) sentMailFolderPath; +- (NSString *) starredFolderPath; +- (NSString *) allMailFolderPath; +- (NSString *) trashFolderPath; +- (NSString *) draftsFolderPath; +- (NSString *) spamFolderPath; +- (NSString *) importantFolderPath; + +@end diff --git a/src/objc/provider/MCOMailProvider.mm b/src/objc/provider/MCOMailProvider.mm new file mode 100644 index 00000000..4eb5f9fb --- /dev/null +++ b/src/objc/provider/MCOMailProvider.mm @@ -0,0 +1,113 @@ +// +// MCOMailProvider.m +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCOMailProvider.h" +#include "MCMailProvider.h" + +#import "NSDictionary+MCO.h" +#import "NSArray+MCO.h" +#import "NSString+MCO.h" + +@implementation MCOMailProvider { + mailcore::MailProvider * _provider; +} + +- (mailcore::Object *) mco_mcObject +{ + return _provider; +} + ++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object +{ + mailcore::MailProvider * provider = (mailcore::MailProvider *) object; + return [[self alloc] initWithProvider:provider]; +} + +- (id) initWithInfo:(NSDictionary *)info +{ + self = [super init]; + + _provider = new mailcore::MailProvider([info mco_mcHashMap]); + + return self; +} + +- (id) initWithProvider:(mailcore::MailProvider *)provider +{ + self = [super init]; + + _provider = provider; + + return self; +} + +- (NSArray *) imapServices +{ + return [NSArray mco_arrayWithMCArray:_provider->imapServices()]; +} + +- (NSArray *) smtpServices +{ + return [NSArray mco_arrayWithMCArray:_provider->smtpServices()]; +} + +- (NSArray *) popServices +{ + return [NSArray mco_arrayWithMCArray:_provider->popServices()]; +} + +- (BOOL) matchEmail:(NSString *)email +{ + return _provider->matchEmail(email.mco_mcString); +} + +- (BOOL) matchMX:(NSString *)hostname +{ + return _provider->matchMX(hostname.mco_mcString); +} + +- (NSString *) sentMailFolderPath +{ + return [NSString mco_stringWithMCString:_provider->sentMailFolderPath()]; +} + +- (NSString *) starredFolderPath +{ + return [NSString mco_stringWithMCString:_provider->starredFolderPath()]; +} + +- (NSString *) allMailFolderPath +{ + return [NSString mco_stringWithMCString:_provider->allMailFolderPath()]; +} + +- (NSString *) trashFolderPath +{ + return [NSString mco_stringWithMCString:_provider->trashFolderPath()]; +} + +- (NSString *) draftsFolderPath +{ + return [NSString mco_stringWithMCString:_provider->draftsFolderPath()]; +} + +- (NSString *) spamFolderPath +{ + return [NSString mco_stringWithMCString:_provider->spamFolderPath()]; +} + +- (NSString *) importantFolderPath +{ + return [NSString mco_stringWithMCString:_provider->spamFolderPath()]; +} + +- (BOOL) isMainFolder:(NSString *)folderPath prefix:(NSString *)prefix { + return _provider->isMainFolder(folderPath.mco_mcString, prefix.mco_mcString); +} + +@end diff --git a/src/objc/provider/MCOMailProvidersManager.h b/src/objc/provider/MCOMailProvidersManager.h new file mode 100644 index 00000000..55b5e6af --- /dev/null +++ b/src/objc/provider/MCOMailProvidersManager.h @@ -0,0 +1,23 @@ +// +// MCOMailProvidersManager.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import <Foundation/Foundation.h> + +@class MCOMailProvider; + +@interface MCOMailProvidersManager : NSObject + ++ (MCOMailProvidersManager *) sharedManager; + +- (MCOMailProvider *) providerForEmail:(NSString *)email; +- (MCOMailProvider *) providerForMX:(NSString *)hostname; +- (MCOMailProvider *) providerForIdentifier:(NSString *)identifier; +- (void) registerProviders:(NSDictionary *)providers; +- (void) registerProvidersFilename:(NSString *)filename; + +@end diff --git a/src/objc/provider/MCOMailProvidersManager.mm b/src/objc/provider/MCOMailProvidersManager.mm new file mode 100644 index 00000000..f7b11cb9 --- /dev/null +++ b/src/objc/provider/MCOMailProvidersManager.mm @@ -0,0 +1,69 @@ +// +// MCOMailProvidersManager.m +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCOMailProvidersManager.h" +#include "MCMailProvidersManager.h" +#import "MCOMailProvider.h" + +#import "NSString+MCO.h" +#import "NSDictionary+MCO.h" +#import "NSObject+MCO.h" + +@implementation MCOMailProvidersManager + ++ (MCOMailProvidersManager *) sharedManager +{ + static MCOMailProvidersManager *sharedInstance = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; \ + }); + return sharedInstance; +} + +- (id) init +{ + NSString * filename; + + self = [super init]; + + filename = [[NSBundle bundleForClass:[self class]] pathForResource:@"providers" ofType:@"json"]; + [self registerProvidersFilename:filename]; + + return self; +} + +- (void) registerProviders:(NSDictionary *)providers +{ + mailcore::MailProvidersManager::sharedManager()->registerProviders(providers.mco_mcHashMap); +} + +- (void) registerProvidersFilename:(NSString *)filename +{ + mailcore::MailProvidersManager::sharedManager()->registerProvidersFilename(filename.mco_mcString); +} + +- (MCOMailProvider *) providerForEmail:(NSString *)email +{ + mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForEmail(email.mco_mcString); + return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider]; +} + +- (MCOMailProvider *) providerForMX:(NSString *)hostname +{ + mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForMX(hostname.mco_mcString); + return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider]; +} + +- (MCOMailProvider *) providerForIdentifier:(NSString *)identifier +{ + mailcore::MailProvider *provider = mailcore::MailProvidersManager::sharedManager()->providerForIdentifier(identifier.mco_mcString); + return [MCOMailProvider mco_objectWithMCObject:(mailcore::Object *) provider]; +} + +@end diff --git a/src/objc/provider/MCONetService.h b/src/objc/provider/MCONetService.h new file mode 100644 index 00000000..e1e02141 --- /dev/null +++ b/src/objc/provider/MCONetService.h @@ -0,0 +1,29 @@ +// +// MCONetService.h +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import <Foundation/Foundation.h> + +typedef enum { + MCONetServiceConnectionTypeClear = 1 << 0, + MCONetServiceConnectionTypeStartTLS = 1 << 1, + MCONetServiceConnectionTypeTLS = 1 << 2, + MCONetServiceConnectionTypeMask = (MCONetServiceConnectionTypeClear | MCONetServiceConnectionTypeStartTLS | MCONetServiceConnectionTypeTLS) +} MCONetServiceConnectionType; + +@interface MCONetService : NSObject + +@property (nonatomic, copy) NSString * hostname; +@property (nonatomic, assign) unsigned int port; +@property (nonatomic, assign) MCONetServiceConnectionType connectionType; + ++ (MCONetService *) netServiceWithInfo:(NSDictionary *)info; + +- (id) initWithInfo:(NSDictionary *)info; +- (NSDictionary *) info; + +@end diff --git a/src/objc/provider/MCONetService.mm b/src/objc/provider/MCONetService.mm new file mode 100644 index 00000000..eb2ad6f5 --- /dev/null +++ b/src/objc/provider/MCONetService.mm @@ -0,0 +1,90 @@ +// +// MCONetService.m +// mailcore2 +// +// Created by Robert Widmann on 4/28/13. +// Copyright (c) 2013 MailCore. All rights reserved. +// + +#import "MCONetService.h" +#include "MCNetService.h" + +#import "NSDictionary+MCO.h" +#import "NSString+MCO.h" + +@implementation MCONetService { + mailcore::NetService * _netService; +} + +- (mailcore::Object *) mco_mcObject +{ + return _netService; +} + ++ (NSObject *) mco_objectWithMCObject:(mailcore::Object *)object +{ + mailcore::NetService * netService = (mailcore::NetService *) object; + return [[self alloc] initWithNetService:netService]; +} + ++ (MCONetService *) netServiceWithInfo:(NSDictionary *)info +{ + return [[[MCONetService alloc] initWithInfo:info] autorelease]; +} + +- (id) initWithInfo:(NSDictionary *)info +{ + self = [super init]; + + _netService = new mailcore::NetService(info.mco_mcHashMap); + + return self; +} + +- (id) initWithNetService:(mailcore::NetService *)netService +{ + self = [super init]; + + _netService = netService; + + return self; +} + +- (void) setHostname:(NSString *)hostname { + _netService->setHostname(hostname.mco_mcString); +} + +- (NSString *) hostname { + return [NSString mco_stringWithMCString:_netService->hostname()]; +} + +- (void) setPort:(unsigned int)port { + _netService->setPort(port); +} + +- (unsigned int) port { + return _netService->port(); +} + +- (MCONetServiceConnectionType) connectionType { + return (MCONetServiceConnectionType) _netService->connectionType(); +} + +- (NSDictionary *) info +{ + return [NSDictionary mco_dictionaryWithMCHashMap:_netService->info()]; +} + +- (NSString*)hostnameWithEmail:(NSString*)email +{ + NSString *result = nil; + NSArray *components = [email componentsSeparatedByString:@"@"]; + if (components.count == 0) { + return self.hostname; + } else { + result = [self.hostname stringByReplacingOccurrencesOfString:@"{domain}" withString:[components lastObject]]; + } + return [NSString mco_stringWithMCString:_netService->normalizedHostnameWithEmail(email.mco_mcString)]; +} + +@end diff --git a/submodules/libjson b/submodules/libjson new file mode 160000 +Subproject 7f1c2b717575ed0d0a2fbdf17b6b742773e4d1f diff --git a/tests/test-all.mm b/tests/test-all.mm index 73981e82..8a8c04ed 100644 --- a/tests/test-all.mm +++ b/tests/test-all.mm @@ -285,6 +285,13 @@ static void testAddresses() MCLog("%s", MCUTF8DESC(str)); } +static void testProviders() { + NSString *filename = [[NSBundle bundleForClass:[MCOMessageBuilder class]] pathForResource:@"providers" ofType:@"json"]; + mailcore::MailProvidersManager::sharedManager()->registerProvidersFilename(filename.mco_mcString); + + NSLog(@"Providers: %s", MCUTF8DESC(mailcore::MailProvidersManager::sharedManager()->providerForEmail(MCSTR("email1@gmail.com")))); +} + static void testAttachments() { mailcore::Attachment *attachment = mailcore::Attachment::attachmentWithText(MCSTR("Hello World")); @@ -351,6 +358,7 @@ void testAll() //testAsyncPOP(); //testAddresses(); //testAttachments(); + testProviders(); testObjC(); MCLog("pool release"); |