diff options
-rw-r--r-- | src/core/abstract/MCAddress.cc | 112 | ||||
-rw-r--r-- | src/core/abstract/MCAddress.h | 5 | ||||
-rw-r--r-- | src/objc/abstract/MCOAddress.h | 20 | ||||
-rw-r--r-- | src/objc/abstract/MCOAddress.mm | 15 |
4 files changed, 151 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), ¤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; +} + 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..4b2055a7 100644 --- a/src/objc/abstract/MCOAddress.h +++ b/src/objc/abstract/MCOAddress.h @@ -47,4 +47,24 @@ @end +@interface MCOAddress (LEPNSArray) + +/** + Returns an NSArray of LEPAddress objects that contain the parsed forms of the RFC822 encoded NSString passed to it. + + @param string An RFC822 encoded NSString object containing multiple addresses. + @return An array of LEPAddress objects + */ ++ (NSArray *) addressesWithRFC822String:(NSString *)string; + +/** + Returns an NSArray of LEPAddress objects that contain the parsed forms of the RFC822 non-encoded NSString passed to it. + + @param string An RFC822 non-encoded NSString object containing multiple addresses. + @return An array of LEPAddress objects + */ ++ (NSArray *) addressesWithNonEncodedRFC822String:(NSString *)string; + +@end + #endif diff --git a/src/objc/abstract/MCOAddress.mm b/src/objc/abstract/MCOAddress.mm index 663aa10e..38f16bb0 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 (LEPNSArray) + ++ (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 |