aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/abstract/MCAddress.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/abstract/MCAddress.cc')
-rw-r--r--src/core/abstract/MCAddress.cc112
1 files changed, 112 insertions, 0 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;
+}
+