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