126d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff/* -*- Mode: Java; tab-width: 4 -*- 226d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * 326d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * Copyright (c) 2004 Apple Computer, Inc. All rights reserved. 426d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * 526d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License"); 626d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * you may not use this file except in compliance with the License. 726d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * You may obtain a copy of the License at 826d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * 926d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * http://www.apache.org/licenses/LICENSE-2.0 1026d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * 1126d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * Unless required by applicable law or agreed to in writing, software 1226d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS, 1326d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1426d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * See the License for the specific language governing permissions and 1526d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff * limitations under the License. 1626d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff 177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff To do: 187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff - implement remove() 197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff - fix set() to replace existing values 2026d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff */ 2126d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff 227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpackage android.net.nsd; 2326d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff 247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Parcelable; 257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffimport android.os.Parcel; 267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.Arrays; 2821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff/** 307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * This class handles TXT record data for DNS based service discovery as specified at 317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * http://tools.ietf.org/html/draft-cheshire-dnsext-dns-sd-11 327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * DNS-SD specifies that a TXT record corresponding to an SRV record consist of 347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * a packed array of bytes, each preceded by a length byte. Each string 357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * is an attribute-value pair. 367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * The DnsSdTxtRecord object stores the entire TXT data as a single byte array, traversing it 387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * as need be to implement its various methods. 39527ba07b637cedf206fec0d3b0cf92141700a23cIrfan Sheriff * @hide 407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriffpublic class DnsSdTxtRecord implements Parcelable { 437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private static final byte mSeperator = '='; 447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private byte[] mData; 467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Constructs a new, empty TXT record. */ 487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public DnsSdTxtRecord() { 497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData = new byte[0]; 507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Constructs a new TXT record from a byte array in the standard format. */ 537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public DnsSdTxtRecord(byte[] data) { 547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData = (byte[]) data.clone(); 557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Copy constructor */ 587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public DnsSdTxtRecord(DnsSdTxtRecord src) { 597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (src != null && src.mData != null) { 607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData = (byte[]) src.mData.clone(); 617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Set a key/value pair. Setting an existing key will replace its value. 667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param key Must be ascii with no '=' 677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param value matching value to key 687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void set(String key, String value) { 707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] keyBytes; 717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] valBytes; 727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int valLen; 737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (value != null) { 757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff valBytes = value.getBytes(); 767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff valLen = valBytes.length; 777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } else { 787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff valBytes = null; 797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff valLen = 0; 807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff try { 837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff keyBytes = key.getBytes("US-ASCII"); 847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff catch (java.io.UnsupportedEncodingException e) { 867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff throw new IllegalArgumentException("key should be US-ASCII"); 877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i = 0; i < keyBytes.length; i++) { 907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (keyBytes[i] == '=') { 917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff throw new IllegalArgumentException("= is not a valid character in key"); 927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (keyBytes.length + valLen >= 255) { 967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff throw new IllegalArgumentException("Key and Value length cannot exceed 255 bytes"); 977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int currentLoc = remove(key); 1007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (currentLoc == -1) 1017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff currentLoc = keyCount(); 1027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff insert(keyBytes, valBytes, currentLoc); 1047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 1077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Get a value for a key 1087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 1097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @param key 1107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * @return The value associated with the key 1117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 1127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public String get(String key) { 1137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] val = this.getValue(key); 1147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return val != null ? new String(val) : null; 1157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Remove a key/value pair. If found, returns the index or -1 if not found */ 1187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public int remove(String key) { 1197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avStart = 0; 1207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i=0; avStart < mData.length; i++) { 1227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avLen = mData[avStart]; 1237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (key.length() <= avLen && 1247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff (key.length() == avLen || mData[avStart + key.length() + 1] == mSeperator)) { 1257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String s = new String(mData, avStart + 1, key.length()); 1267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (0 == key.compareToIgnoreCase(s)) { 1277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] oldBytes = mData; 1287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData = new byte[oldBytes.length - avLen - 1]; 1297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(oldBytes, 0, mData, 0, avStart); 1307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(oldBytes, avStart + avLen + 1, mData, avStart, 1317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff oldBytes.length - avStart - avLen - 1); 1327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return i; 1337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff avStart += (0xFF & (avLen + 1)); 1367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return -1; 1387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Return the count of keys */ 1417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public int keyCount() { 1427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int count = 0, nextKey; 1437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (nextKey = 0; nextKey < mData.length; count++) { 1447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff nextKey += (0xFF & (mData[nextKey] + 1)); 1457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return count; 1477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Return true if key is present, false if not. */ 1507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public boolean contains(String key) { 1517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String s = null; 1527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i = 0; null != (s = this.getKey(i)); i++) { 1537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (0 == key.compareToIgnoreCase(s)) return true; 1547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return false; 1567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /* Gets the size in bytes */ 1597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public int size() { 1607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return mData.length; 1617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /* Gets the raw data in bytes */ 1647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public byte[] getRawData() { 16521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return (byte[]) mData.clone(); 1667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private void insert(byte[] keyBytes, byte[] value, int index) { 1697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] oldBytes = mData; 1707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int valLen = (value != null) ? value.length : 0; 1717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int insertion = 0; 1727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int newLen, avLen; 1737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i = 0; i < index && insertion < mData.length; i++) { 1757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff insertion += (0xFF & (mData[insertion] + 1)); 1767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff avLen = keyBytes.length + valLen + (value != null ? 1 : 0); 1797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff newLen = avLen + oldBytes.length + 1; 1807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData = new byte[newLen]; 1827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(oldBytes, 0, mData, 0, insertion); 1837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int secondHalfLen = oldBytes.length - insertion; 1847d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(oldBytes, insertion, mData, newLen - secondHalfLen, secondHalfLen); 1857d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData[insertion] = (byte) avLen; 1867d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(keyBytes, 0, mData, insertion + 1, keyBytes.length); 1877d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (value != null) { 1887d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff mData[insertion + 1 + keyBytes.length] = mSeperator; 1897d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(value, 0, mData, insertion + keyBytes.length + 2, valLen); 1907d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1917d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 1927d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1937d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Return a key in the TXT record by zero-based index. Returns null if index exceeds the total number of keys. */ 1947d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private String getKey(int index) { 1957d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avStart = 0; 1967d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 1977d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i=0; i < index && avStart < mData.length; i++) { 1987d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff avStart += mData[avStart] + 1; 1997d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2007d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2017d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (avStart < mData.length) { 2027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avLen = mData[avStart]; 2037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int aLen = 0; 2047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (aLen=0; aLen < avLen; aLen++) { 2067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mData[avStart + aLen + 1] == mSeperator) break; 2077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return new String(mData, avStart + 1, aLen); 2097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return null; 2117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 2147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Look up a key in the TXT record by zero-based index and return its value. 2157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Returns null if index exceeds the total number of keys. 2167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Returns null if the key is present with no value. 2177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private byte[] getValue(int index) { 2197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avStart = 0; 2207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] value = null; 2217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i=0; i < index && avStart < mData.length; i++) { 2237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff avStart += mData[avStart] + 1; 2247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2257d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2267d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (avStart < mData.length) { 2277d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int avLen = mData[avStart]; 2287d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int aLen = 0; 2297d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2307d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (aLen=0; aLen < avLen; aLen++) { 2317d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (mData[avStart + aLen + 1] == mSeperator) { 2327d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff value = new byte[avLen - aLen - 1]; 2337d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff System.arraycopy(mData, avStart + aLen + 2, value, 0, avLen - aLen - 1); 2347d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff break; 2357d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2367d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2377d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2387d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return value; 2397d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2407d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2417d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private String getValueAsString(int index) { 2427d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff byte[] value = this.getValue(index); 2437d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return value != null ? new String(value) : null; 2447d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2457d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2467d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff private byte[] getValue(String forKey) { 2477d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String s = null; 2487d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff int i; 2497d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2507d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (i = 0; null != (s = this.getKey(i)); i++) { 2517d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (0 == forKey.compareToIgnoreCase(s)) { 2527d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return this.getValue(i); 2537d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2547d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2557d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2567d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return null; 2577d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2587d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2597d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** 2607d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Return a string representation. 2617d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * Example : {key1=value1},{key2=value2}.. 2627d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * 2637d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * For a key say like "key3" with null value 2647d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff * {key1=value1},{key2=value2}{key3} 2657d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff */ 2667d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public String toString() { 2677d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String a, result = null; 2687d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 2697d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff for (int i = 0; null != (a = this.getKey(i)); i++) { 2707d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String av = "{" + a; 2717d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff String val = this.getValueAsString(i); 2727d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (val != null) 2737d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff av += "=" + val + "}"; 2747d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff else 2757d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff av += "}"; 2767d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff if (result == null) 2777d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff result = av; 2787d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff else 2797d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff result = result + ", " + av; 2807d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2817d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return result != null ? result : ""; 2827d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 2837d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 28421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff @Override 28521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public boolean equals(Object o) { 28621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (o == this) { 28721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 28821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 28921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!(o instanceof DnsSdTxtRecord)) { 29021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 29121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 29221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 29321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff DnsSdTxtRecord record = (DnsSdTxtRecord)o; 29421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return Arrays.equals(record.mData, mData); 29521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 29621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 29721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff @Override 29821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff public int hashCode() { 29921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return Arrays.hashCode(mData); 30021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 30121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 3027d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Implement the Parcelable interface */ 3037d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public int describeContents() { 3047d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return 0; 3057d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3067d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3077d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Implement the Parcelable interface */ 3087d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public void writeToParcel(Parcel dest, int flags) { 3097d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff dest.writeByteArray(mData); 3107d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3117d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3127d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff /** Implement the Parcelable interface */ 3137d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public static final Creator<DnsSdTxtRecord> CREATOR = 3147d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff new Creator<DnsSdTxtRecord>() { 3157d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public DnsSdTxtRecord createFromParcel(Parcel in) { 3167d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff DnsSdTxtRecord info = new DnsSdTxtRecord(); 3177d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff in.readByteArray(info.mData); 3187d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return info; 3197d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3207d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff 3217d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff public DnsSdTxtRecord[] newArray(int size) { 3227d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff return new DnsSdTxtRecord[size]; 3237d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff } 3247d024d372431effc87168afdc7cbe387680c4935Irfan Sheriff }; 32526d4452a08813cdbb7280c475fe5527cdc9673a3Irfan Sheriff} 326