aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar CodaFi <devteam.codafi@gmail.com>2013-04-28 17:37:52 -0600
committerGravatar CodaFi <devteam.codafi@gmail.com>2013-04-28 17:37:52 -0600
commitd9da8ea6e22361a35c0bf94237c8c16d5021a3b4 (patch)
treee5e68ac9a9906d128c2179b82cd8b60c8a64c721
parent10c9d0abf0e8009277fb2006cffb76b8a26865c7 (diff)
Providers API
-rw-r--r--build-mac/mailcore2.xcodeproj/project.pbxproj107
-rw-r--r--resources/providers.json739
-rw-r--r--src/core/MCCore.h1
-rw-r--r--src/core/provider/MCMailProvider.cc211
-rw-r--r--src/core/provider/MCMailProvider.h64
-rw-r--r--src/core/provider/MCMailProvidersManager.cc70
-rw-r--r--src/core/provider/MCMailProvidersManager.h49
-rw-r--r--src/core/provider/MCNetService.cc102
-rw-r--r--src/core/provider/MCNetService.h48
-rw-r--r--src/core/provider/MCProvider.h16
-rw-r--r--src/objc/provider/MCOMailProvider.h32
-rw-r--r--src/objc/provider/MCOMailProvider.mm113
-rw-r--r--src/objc/provider/MCOMailProvidersManager.h23
-rw-r--r--src/objc/provider/MCOMailProvidersManager.mm69
-rw-r--r--src/objc/provider/MCONetService.h29
-rw-r--r--src/objc/provider/MCONetService.mm90
m---------submodules/libjson0
-rw-r--r--tests/test-all.mm8
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");