aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/abstract/MCAddress.cc112
-rw-r--r--src/core/abstract/MCAddress.h5
-rw-r--r--src/objc/abstract/MCOAddress.h14
-rw-r--r--src/objc/abstract/MCOAddress.mm15
m---------submodules/libjson0
5 files changed, 145 insertions, 1 deletions
diff --git a/src/core/abstract/MCAddress.cc b/src/core/abstract/MCAddress.cc
index 3afd07b9..4f6fc303 100644
--- a/src/core/abstract/MCAddress.cc
+++ b/src/core/abstract/MCAddress.cc
@@ -5,6 +5,9 @@
using namespace mailcore;
+static Array * lep_address_list_from_lep_mailbox(struct mailimf_mailbox_list * mb_list, int encoded);
+static Array * lep_address_list_from_lep_addr(struct mailimf_address_list * addr_list, int encoded);
+
Address::Address()
{
init();
@@ -161,6 +164,48 @@ Address * Address::addressWithNonEncodedRFC822String(String * nonEncodedRFC822St
return result;
}
+Array * Address::addressesWithRFC822String(String * string)
+{
+ const char * utf8String;
+ size_t currentIndex;
+ struct mailimf_address_list * addr_list;
+ Array * result;
+ int r;
+
+ utf8String = string->UTF8Characters();
+ currentIndex = 0;
+
+ r = mailimf_address_list_parse(utf8String, strlen(utf8String), &currentIndex, &addr_list);
+ if (r != MAILIMF_NO_ERROR)
+ return NULL;
+
+ result = lep_address_list_from_lep_addr(addr_list, 1);
+ mailimf_address_list_free(addr_list);
+
+ return result;
+}
+
+Array * Address::addressesWithNonEncodedRFC822String(String * string)
+{
+ const char * utf8String;
+ size_t currentIndex;
+ struct mailimf_address_list * addr_list;
+ Array * result;
+ int r;
+
+ utf8String = string->UTF8Characters();
+ currentIndex = 0;
+
+ r = mailimf_address_list_parse(utf8String, strlen(utf8String), &currentIndex, &addr_list);
+ if (r != MAILIMF_NO_ERROR)
+ return NULL;
+
+ result = lep_address_list_from_lep_addr(addr_list, 0);
+ mailimf_address_list_free(addr_list);
+
+ return result;
+}
+
String * Address::description()
{
String * result = String::string();
@@ -356,3 +401,70 @@ String * Address::nonEncodedRFC822String()
return result;
}
+
+static Array * lep_address_list_from_lep_mailbox(struct mailimf_mailbox_list * mb_list, int encoded)
+{
+ Array * result;
+ clistiter * cur;
+
+ result = new Array();
+ for(cur = clist_begin(mb_list->mb_list) ; cur != NULL ; cur = clist_next(cur)) {
+ struct mailimf_mailbox * mb;
+ Address * address;
+
+ mb = (mailimf_mailbox *) clist_content(cur);
+ if (encoded) {
+ address = Address::addressWithIMFMailbox(mb);
+ }
+ else {
+ address = Address::addressWithNonEncodedIMFMailbox(mb);
+ }
+ result->addObject(address);
+ }
+
+ return result;
+}
+
+static Array * lep_address_list_from_lep_addr(struct mailimf_address_list * addr_list, int encoded)
+{
+ Array * result;
+ clistiter * cur;
+
+ result = new Array();
+
+ for(cur = clist_begin(addr_list->ad_list) ; cur != NULL ;
+ cur = clist_next(cur)) {
+ struct mailimf_address * addr;
+
+ addr = (mailimf_address *) clist_content(cur);
+ switch (addr->ad_type) {
+ case MAILIMF_ADDRESS_MAILBOX:
+ {
+ Address * address;
+
+ if (encoded) {
+ address = Address::addressWithIMFMailbox(addr->ad_data.ad_mailbox);
+ }
+ else {
+ address = Address::addressWithNonEncodedIMFMailbox(addr->ad_data.ad_mailbox);
+ }
+ result->addObject(address);
+ break;
+ }
+
+ case MAILIMF_ADDRESS_GROUP:
+ {
+ if (addr->ad_data.ad_group->grp_mb_list != NULL) {
+ Array * subArray;
+
+ subArray = lep_address_list_from_lep_mailbox(addr->ad_data.ad_group->grp_mb_list, encoded);
+ result->addObjectsFromArray(subArray);
+ }
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
diff --git a/src/core/abstract/MCAddress.h b/src/core/abstract/MCAddress.h
index 6843e89b..4c132ed3 100644
--- a/src/core/abstract/MCAddress.h
+++ b/src/core/abstract/MCAddress.h
@@ -17,7 +17,10 @@ namespace mailcore {
static Address * addressWithMailbox(String * mailbox);
static Address * addressWithRFC822String(String * RFC822String);
static Address * addressWithNonEncodedRFC822String(String * nonEncodedRFC822String);
-
+
+ static Array * addressesWithRFC822String(String * string);
+ static Array * addressesWithNonEncodedRFC822String(String * string);
+
virtual void setDisplayName(String * displayName);
virtual String * displayName();
diff --git a/src/objc/abstract/MCOAddress.h b/src/objc/abstract/MCOAddress.h
index 7a741a04..33f2c545 100644
--- a/src/objc/abstract/MCOAddress.h
+++ b/src/objc/abstract/MCOAddress.h
@@ -47,4 +47,18 @@
@end
+@interface MCOAddress (MCONSArray)
+
+// Returns an NSArray of MCOAddress objects that contain the parsed
+// forms of the RFC822 encoded addresses.
+// For example: @[ @"DINH Vi=C3=AAt Ho=C3=A0 <hoa@etpan.org>" ]
++ (NSArray *) addressesWithRFC822String:(NSString *)string;
+
+// Returns an NSArray of MCOAddress objects that contain the parsed
+// forms of non-encoded RFC822 addresses.
+// For example: @[ "DINH Viêt Hoà <hoa@etpan.org>" ]
++ (NSArray *) addressesWithNonEncodedRFC822String:(NSString *)string;
+
+@end
+
#endif
diff --git a/src/objc/abstract/MCOAddress.mm b/src/objc/abstract/MCOAddress.mm
index 663aa10e..6676e1a2 100644
--- a/src/objc/abstract/MCOAddress.mm
+++ b/src/objc/abstract/MCOAddress.mm
@@ -14,6 +14,7 @@
#include "MCAddress.h"
#include "NSString+MCO.h"
#include "NSObject+MCO.h"
+#include "NSArray+MCO.h"
@implementation MCOAddress {
mailcore::Address * _nativeAddress;
@@ -134,3 +135,17 @@ MCO_OBJC_SYNTHESIZE_STRING(setMailbox, mailbox)
}
@end
+
+@implementation MCOAddress (MCONSArray)
+
++ (NSArray *) addressesWithRFC822String:(NSString *)string
+{
+ return [NSArray mco_arrayWithMCArray:mailcore::Address::addressesWithRFC822String(string.mco_mcString)];
+}
+
++ (NSArray *) addressesWithNonEncodedRFC822String:(NSString *)string
+{
+ return [NSArray mco_arrayWithMCArray:mailcore::Address::addressesWithNonEncodedRFC822String(string.mco_mcString)];
+}
+
+@end
diff --git a/submodules/libjson b/submodules/libjson
-Subproject fdbe0a6c2a8c1c31a761a91e5014340dcd94fd6
+Subproject 7f1c2b717575ed0d0a2fbdf17b6b742773e4d1f