14e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum/* 24e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Copyright (C) 2017 The Android Open Source Project 34e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * 44e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Licensed under the Apache License, Version 2.0 (the "License"); 54e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * you may not use this file except in compliance with the License. 64e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * You may obtain a copy of the License at 74e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * 84e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * http://www.apache.org/licenses/LICENSE-2.0 94e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * 104e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Unless required by applicable law or agreed to in writing, software 114e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * distributed under the License is distributed on an "AS IS" BASIS, 124e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * See the License for the specific language governing permissions and 144e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * limitations under the License. 154e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum */ 164e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 174e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumpackage android.net.lowpan; 184e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.annotation.NonNull; 2080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.icu.text.StringPrep; 2180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.icu.text.StringPrepParseException; 2280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.os.Parcel; 2380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.os.Parcelable; 2480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport android.util.Log; 254e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumimport com.android.internal.util.HexDump; 2680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport java.nio.charset.StandardCharsets; 2780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport java.util.Arrays; 2880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumimport java.util.Objects; 294e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 304e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum/** 314e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Describes an instance of a LoWPAN network. 324e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * 334e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * @hide 344e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum */ 35325b7f5a066bc69c2ad32e1290274d18f40e423bRobert Quattlebaum// @SystemApi 3680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaumpublic class LowpanIdentity implements Parcelable { 3780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private static final String TAG = LowpanIdentity.class.getSimpleName(); 384e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 394e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum // Constants 4080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public static final int UNSPECIFIED_CHANNEL = -1; 4180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public static final int UNSPECIFIED_PANID = 0xFFFFFFFF; 4280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum // Builder 434e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 444e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum /** @hide */ 4580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum // @SystemApi 4680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public static class Builder { 4780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private static final StringPrep stringPrep = 4880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum StringPrep.getInstance(StringPrep.RFC3920_RESOURCEPREP); 4980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 5080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum final LowpanIdentity mIdentity = new LowpanIdentity(); 5180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 5280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private static String escape(@NonNull byte[] bytes) { 5380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum StringBuffer sb = new StringBuffer(); 5480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum for (byte b : bytes) { 5580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (b >= 32 && b <= 126) { 5680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append((char) b); 5780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } else { 5880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append(String.format("\\0x%02x", b & 0xFF)); 5980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 6080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 6180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return sb.toString(); 6280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 634e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 6480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public Builder setLowpanIdentity(@NonNull LowpanIdentity x) { 6580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Objects.requireNonNull(x); 6680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setRawName(x.getRawName()); 6780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setXpanid(x.getXpanid()); 6880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setPanid(x.getPanid()); 6980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setChannel(x.getChannel()); 7080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setType(x.getType()); 7180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return this; 7280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 734e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 7480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public Builder setName(@NonNull String name) { 7580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Objects.requireNonNull(name); 7680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum try { 7780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mName = stringPrep.prepare(name, StringPrep.DEFAULT); 7880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mRawName = mIdentity.mName.getBytes(StandardCharsets.UTF_8); 7980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mIsNameValid = true; 8080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } catch (StringPrepParseException x) { 8180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Log.w(TAG, x.toString()); 8280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum setRawName(name.getBytes(StandardCharsets.UTF_8)); 8380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 8480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return this; 8580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 864e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 8780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public Builder setRawName(@NonNull byte[] name) { 8880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Objects.requireNonNull(name); 8980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mRawName = name.clone(); 9080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mName = new String(name, StandardCharsets.UTF_8); 9180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum try { 9280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum String nameCheck = stringPrep.prepare(mIdentity.mName, StringPrep.DEFAULT); 9380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mIsNameValid = 9480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Arrays.equals(nameCheck.getBytes(StandardCharsets.UTF_8), name); 9580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } catch (StringPrepParseException x) { 9680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Log.w(TAG, x.toString()); 9780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mIsNameValid = false; 9880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 994e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 10080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum // Non-normal names must be rendered differently to avoid confusion. 10180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (!mIdentity.mIsNameValid) { 10280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mName = "«" + escape(name) + "»"; 10380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 1044e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1054e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return this; 1064e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1074e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1084e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public Builder setXpanid(byte x[]) { 10980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mXpanid = (x != null ? x.clone() : null); 1104e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return this; 1114e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1124e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1134e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public Builder setPanid(int x) { 11480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mPanid = x; 1154e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return this; 1164e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1174e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 11880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public Builder setType(@NonNull String x) { 11980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mType = x; 1204e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return this; 1214e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1224e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1234e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public Builder setChannel(int x) { 12480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum mIdentity.mChannel = x; 1254e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return this; 1264e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1274e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1284e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public LowpanIdentity build() { 12980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return mIdentity; 1304e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1314e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1324e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1334e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum LowpanIdentity() {} 1344e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1354e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum // Instance Variables 1364e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 13780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private String mName = ""; 13880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private boolean mIsNameValid = true; 13980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private byte[] mRawName = new byte[0]; 14080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private String mType = ""; 14180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private byte[] mXpanid = new byte[0]; 14280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private int mPanid = UNSPECIFIED_PANID; 14380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum private int mChannel = UNSPECIFIED_CHANNEL; 1444e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 14580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum // Public Getters 1464e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1474e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public String getName() { 1484e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return mName; 1494e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1504e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 15180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public boolean isNameValid() { 15280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return mIsNameValid; 15380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 15480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 15580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public byte[] getRawName() { 15680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return mRawName.clone(); 15780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 15880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 1594e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public byte[] getXpanid() { 16080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return mXpanid.clone(); 1614e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1624e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1634e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public int getPanid() { 1644e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return mPanid; 1654e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1664e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 16780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public String getType() { 1684e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return mType; 1694e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1704e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 1714e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum public int getChannel() { 1724e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum return mChannel; 1734e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1744e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 17580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum @Override 17680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public String toString() { 17780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum StringBuffer sb = new StringBuffer(); 17880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 17980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append("Name:").append(getName()); 18080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 18180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (mType.length() > 0) { 18280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append(", Type:").append(mType); 1834e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 18480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 18580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (mXpanid.length > 0) { 18680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append(", XPANID:").append(HexDump.toHexString(mXpanid)); 1874e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 18880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 18980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (mPanid != UNSPECIFIED_PANID) { 19080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append(", PANID:").append(String.format("0x%04X", mPanid)); 1914e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 19280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 19380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (mChannel != UNSPECIFIED_CHANNEL) { 19480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum sb.append(", Channel:").append(mChannel); 1954e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 19680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 19780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return sb.toString(); 1984e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 1994e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 20080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum @Override 20180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public boolean equals(Object obj) { 20280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum if (!(obj instanceof LowpanIdentity)) { 20380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return false; 20480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 20580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum LowpanIdentity rhs = (LowpanIdentity) obj; 20680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return Arrays.equals(mRawName, rhs.mRawName) 20780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum && Arrays.equals(mXpanid, rhs.mXpanid) 20880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum && mType.equals(rhs.mType) 20980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum && mPanid == rhs.mPanid 21080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum && mChannel == rhs.mChannel; 2114e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum } 2124e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 2134e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum @Override 21480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public int hashCode() { 21580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return Objects.hash( 21680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Arrays.hashCode(mRawName), mType, Arrays.hashCode(mXpanid), mPanid, mChannel); 21780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 2184e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 21980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum /** Implement the Parcelable interface. */ 22080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum @Override 22180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public int describeContents() { 22280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return 0; 22380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 2244e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 22580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum /** Implement the Parcelable interface. */ 22680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum @Override 22780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public void writeToParcel(Parcel dest, int flags) { 22880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum dest.writeByteArray(mRawName); 22980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum dest.writeString(mType); 23080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum dest.writeByteArray(mXpanid); 23180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum dest.writeInt(mPanid); 23280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum dest.writeInt(mChannel); 23380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 2344e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 23580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum /** Implement the Parcelable interface. */ 23680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public static final Creator<LowpanIdentity> CREATOR = 23780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum new Creator<LowpanIdentity>() { 2384e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 23980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public LowpanIdentity createFromParcel(Parcel in) { 24080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum Builder builder = new Builder(); 2414e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum 24280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum builder.setRawName(in.createByteArray()); 24380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum builder.setType(in.readString()); 24480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum builder.setXpanid(in.createByteArray()); 24580aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum builder.setPanid(in.readInt()); 24680aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum builder.setChannel(in.readInt()); 24780aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 24880aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return builder.build(); 24980aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 25080aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum 25180aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum public LowpanIdentity[] newArray(int size) { 25280aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum return new LowpanIdentity[size]; 25380aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum } 25480aca1e3b3d3f7afd64a7f18cb2f3ae556f46ccfRobert Quattlebaum }; 2554e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum} 256