diff options
Diffstat (limited to 'src/core/abstract/MCAddress.cc')
-rw-r--r-- | src/core/abstract/MCAddress.cc | 112 |
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), ¤tIndex, &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), ¤tIndex, &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; +} + |