@@ -16,10 +16,11 @@ */ #include "config.h" #import "OFDNSResourceRecord.h" +#import "OFArray.h" #import "OFData.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" @@ -1250,11 +1251,11 @@ self.className, _name, _priority, _weight, _target, _port, _TTL]; } @end @implementation OFTXTDNSResourceRecord -@synthesize textData = _textData; +@synthesize textStrings = _textStrings; - (instancetype)initWithName: (OFString *)name DNSClass: (of_dns_class_t)DNSClass recordType: (of_dns_record_type_t)recordType TTL: (uint32_t)TTL @@ -1262,20 +1263,20 @@ OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name DNSClass: (of_dns_class_t)DNSClass - textData: (OFData *)textData + textStrings: (OFArray OF_GENERIC(OFData *) *)textStrings TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass recordType: OF_DNS_RECORD_TYPE_TXT TTL: TTL]; @try { - _textData = [textData copy]; + _textStrings = [textStrings copy]; } @catch (id e) { [self release]; @throw e; } @@ -1282,11 +1283,11 @@ return self; } - (void)dealloc { - [_textData release]; + [_textStrings release]; [super dealloc]; } - (bool)isEqual: (id)object @@ -1308,12 +1309,12 @@ return false; if (record->_recordType != _recordType) return false; - if (record->_textData != _textData && - ![record->_textData isEqual: _textData]) + if (record->_textStrings != _textStrings && + ![record->_textStrings isEqual: _textStrings]) return false; return true; } @@ -1326,25 +1327,62 @@ OF_HASH_ADD_HASH(hash, _name.hash); OF_HASH_ADD(hash, _DNSClass >> 8); OF_HASH_ADD(hash, _DNSClass); OF_HASH_ADD(hash, _recordType >> 8); OF_HASH_ADD(hash, _recordType); - OF_HASH_ADD_HASH(hash, _textData.hash); + OF_HASH_ADD_HASH(hash, _textStrings.hash); OF_HASH_FINALIZE(hash); return hash; } - (OFString *)description { - return [OFString stringWithFormat: + void *pool = objc_autoreleasePoolPush(); + OFMutableString *text = [OFMutableString string]; + bool first = true; + OFString *ret; + + for (OFData *string in _textStrings) { + const unsigned char *stringItems = string.items; + size_t stringCount = string.count; + + if (first) { + first = false; + [text appendString: @"\""]; + } else + [text appendString: @" \""]; + + for (size_t i = 0; i < stringCount; i++) { + if (stringItems[i] == '\\') + [text appendString: @"\\\\"]; + else if (stringItems[i] == '"') + [text appendString: @"\\\""]; + else if (stringItems[i] < 0x20) + [text appendFormat: @"\\x%02X", stringItems[i]]; + else if (stringItems[i] < 0x7F) + [text appendFormat: @"%c", stringItems[i]]; + else + [text appendFormat: @"\\x%02X", stringItems[i]]; + } + + [text appendString: @"\""]; + } + + ret = [OFString stringWithFormat: @"<%@:\n" @"\tName = %@\n" @"\tClass = %@\n" - @"\tText Data = %@\n" + @"\tText strings = %@\n" @"\tTTL = %" PRIu32 "\n" @">", - self.className, _name, of_dns_class_to_string(_DNSClass), _textData, + self.className, _name, of_dns_class_to_string(_DNSClass), text, _TTL]; + + [ret retain]; + + objc_autoreleasePoolPop(pool); + + return [ret autorelease]; } @end