/* * Copyright (c) 2008-2024 Jonathan Schleifer <js@nil.im> * * All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3.0 only, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public License * version 3.0 along with this program. If not, see * <https://www.gnu.org/licenses/>. */ #include "config.h" #import "OFLOCDNSResourceRecord.h" @implementation OFLOCDNSResourceRecord @synthesize size = _size, horizontalPrecision = _horizontalPrecision; @synthesize verticalPrecision = _verticalPrecision, latitude = _latitude; @synthesize longitude = _longitude, altitude = _altitude; - (instancetype)initWithName: (OFString *)name DNSClass: (OFDNSClass)DNSClass recordType: (OFDNSRecordType)recordType TTL: (uint32_t)TTL { OF_INVALID_INIT_METHOD } - (instancetype)initWithName: (OFString *)name DNSClass: (OFDNSClass)DNSClass size: (uint8_t)size horizontalPrecision: (uint8_t)horizontalPrecision verticalPrecision: (uint8_t)verticalPrecision latitude: (uint32_t)latitude longitude: (uint32_t)longitude altitude: (uint32_t)altitude TTL: (uint32_t)TTL { self = [super initWithName: name DNSClass: DNSClass recordType: OFDNSRecordTypeLOC TTL: TTL]; @try { _size = size; _horizontalPrecision = horizontalPrecision; _verticalPrecision = verticalPrecision; _latitude = latitude; _longitude = longitude; _altitude = altitude; } @catch (id e) { [self release]; @throw e; } return self; } - (bool)isEqual: (id)object { OFLOCDNSResourceRecord *record; if (object == self) return true; if (![object isKindOfClass: [OFLOCDNSResourceRecord class]]) return false; record = object; if (record->_name != _name && ![record->_name isEqual: _name]) return false; if (record->_DNSClass != _DNSClass) return false; if (record->_recordType != _recordType) return false; if (record->_size != _size) return false; if (record->_horizontalPrecision != _horizontalPrecision) return false; if (record->_verticalPrecision != _verticalPrecision) return false; if (record->_latitude != _latitude) return false; if (record->_longitude != _longitude) return false; if (record->_altitude != _altitude) return false; return true; } - (unsigned long)hash { unsigned long hash; OFHashInit(&hash); OFHashAddHash(&hash, _name.hash); OFHashAddByte(&hash, _DNSClass >> 8); OFHashAddByte(&hash, _DNSClass); OFHashAddByte(&hash, _recordType >> 8); OFHashAddByte(&hash, _recordType); OFHashAddByte(&hash, _size); OFHashAddByte(&hash, _horizontalPrecision); OFHashAddByte(&hash, _verticalPrecision); OFHashAddByte(&hash, _latitude >> 24); OFHashAddByte(&hash, _latitude >> 16); OFHashAddByte(&hash, _latitude >> 8); OFHashAddByte(&hash, _latitude); OFHashAddByte(&hash, _longitude >> 24); OFHashAddByte(&hash, _longitude >> 16); OFHashAddByte(&hash, _longitude >> 8); OFHashAddByte(&hash, _longitude); OFHashAddByte(&hash, _altitude >> 24); OFHashAddByte(&hash, _altitude >> 16); OFHashAddByte(&hash, _altitude >> 8); OFHashAddByte(&hash, _altitude); OFHashFinalize(&hash); return hash; } - (OFString *)description { return [OFString stringWithFormat: @"<%@:\n" @"\tName = %@\n" @"\tClass = %@\n" @"\tSize = %ue%u\n" @"\tHorizontal precision = %ue%u\n" @"\tVertical precision = %ue%u\n" @"\tLatitude = %f\n" @"\tLongitude = %f\n" @"\tAltitude = %f\n" @"\tTTL = %" PRIu32 "\n" @">", self.className, _name, OFDNSClassName(_DNSClass), _size >> 4, _size & 0xF, _horizontalPrecision >> 4, _horizontalPrecision & 0xF, _verticalPrecision >> 4, _verticalPrecision & 0xF, ((double)_latitude - 2147483648) / 3600000, ((double)_longitude - 2147483648) / 3600000, ((double)_altitude - 10000000) / 100, _TTL]; } @end