1b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff/*
2b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * Copyright (C) 2012 The Android Open Source Project
3b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *
4b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * Licensed under the Apache License, Version 2.0 (the "License");
5b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * you may not use this file except in compliance with the License.
6b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * You may obtain a copy of the License at
7b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *
8b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *      http://www.apache.org/licenses/LICENSE-2.0
9b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *
10b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * Unless required by applicable law or agreed to in writing, software
11b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * distributed under the License is distributed on an "AS IS" BASIS,
12b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * See the License for the specific language governing permissions and
14b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * limitations under the License.
15b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff */
16b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
17b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffpackage android.net.wifi;
18b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
19b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport android.os.Parcel;
206e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamathimport android.os.Parcelable;
21b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
22b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.io.ByteArrayOutputStream;
23b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.ByteBuffer;
24b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.CharBuffer;
25b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.charset.Charset;
26b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.charset.CharsetDecoder;
27b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.charset.CoderResult;
28b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffimport java.nio.charset.CodingErrorAction;
29fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkeyimport java.util.Locale;
30b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
31b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff/**
32b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * Stores SSID octets and handles conversion.
33b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *
34b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * For Ascii encoded string, any octet < 32 or > 127 is encoded as
35b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * a "\x" followed by the hex representation of the octet.
36b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * Exception chars are ", \, \e, \n, \r, \t which are escaped by a \
37b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * See src/utils/common.c for the implementation in the supplicant.
38b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff *
39b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff * @hide
40b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff */
41b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriffpublic class WifiSsid implements Parcelable {
42b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private static final String TAG = "WifiSsid";
43b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
446e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath    public final ByteArrayOutputStream octets = new ByteArrayOutputStream(32);
45b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
46b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private static final int HEX_RADIX = 16;
47b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public static final String NONE = "<unknown ssid>";
48b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
49b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private WifiSsid() {
50b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
51b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
52a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang    public static WifiSsid createFromByteArray(byte ssid[]) {
53a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang        WifiSsid wifiSsid = new WifiSsid();
54a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang        if (ssid != null) {
55a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang            wifiSsid.octets.write(ssid, 0/* the start offset */, ssid.length);;
56a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang        }
57a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang        return wifiSsid;
58a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang    }
59a6ea570a4afdb1de16ea3d1433cbba9ea2284423Ningyuan Wang
60b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public static WifiSsid createFromAsciiEncoded(String asciiEncoded) {
61b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        WifiSsid a = new WifiSsid();
62b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        a.convertToBytes(asciiEncoded);
63b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return a;
64b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
65b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
66b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public static WifiSsid createFromHex(String hexStr) {
67b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        WifiSsid a = new WifiSsid();
68b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (hexStr == null) return a;
69b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
70b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (hexStr.startsWith("0x") || hexStr.startsWith("0X")) {
71b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            hexStr = hexStr.substring(2);
72b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
73b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
74b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        for (int i = 0; i < hexStr.length()-1; i += 2) {
75b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            int val;
76b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            try {
77b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                val = Integer.parseInt(hexStr.substring(i, i + 2), HEX_RADIX);
78b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            } catch(NumberFormatException e) {
79b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                val = 0;
80b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            }
81b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            a.octets.write(val);
82b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
83b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return a;
84b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
85b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
86b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /* This function is equivalent to printf_decode() at src/utils/common.c in
87b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff     * the supplicant */
88b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    private void convertToBytes(String asciiEncoded) {
89b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        int i = 0;
90b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        int val = 0;
91b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        while (i< asciiEncoded.length()) {
92b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            char c = asciiEncoded.charAt(i);
93b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            switch (c) {
94b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                case '\\':
95b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    i++;
96b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    switch(asciiEncoded.charAt(i)) {
97b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '\\':
98b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write('\\');
9911de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
100b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
101b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '"':
102b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write('"');
10311de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
104b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
105b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case 'n':
106b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write('\n');
10711de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
108b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
109b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case 'r':
110b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write('\r');
11111de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
112b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
113b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case 't':
114b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write('\t');
11511de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
116b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
117b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case 'e':
118b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write(27); //escape char
11911de9e5537914bbe140fd99ad55333e48a14a667Irfan Sheriff                            i++;
120b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
121b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case 'x':
122b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            i++;
123b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            try {
124b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                val = Integer.parseInt(asciiEncoded.substring(i, i + 2), HEX_RADIX);
125b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            } catch (NumberFormatException e) {
126b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                val = -1;
127b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            }
128b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            if (val < 0) {
129b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                val = Character.digit(asciiEncoded.charAt(i), HEX_RADIX);
130b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                if (val < 0) break;
131b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                octets.write(val);
132b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                i++;
133b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            } else {
134b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                octets.write(val);
135b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                i += 2;
136b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            }
137b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
138b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '0':
139b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '1':
140b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '2':
141b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '3':
142b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '4':
143b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '5':
144b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '6':
145b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        case '7':
146b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            val = asciiEncoded.charAt(i) - '0';
147b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            i++;
148b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            if (asciiEncoded.charAt(i) >= '0' && asciiEncoded.charAt(i) <= '7') {
149b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                val = val * 8 + asciiEncoded.charAt(i) - '0';
150b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                i++;
151b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            }
152b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            if (asciiEncoded.charAt(i) >= '0' && asciiEncoded.charAt(i) <= '7') {
153b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                val = val * 8 + asciiEncoded.charAt(i) - '0';
154b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                                i++;
155b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            }
156b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            octets.write(val);
157b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
158b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                        default:
159b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                            break;
160b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    }
161b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    break;
162b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                default:
163b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    octets.write(c);
164b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    i++;
165b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                    break;
166b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            }
167b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
168b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
169b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
170b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    @Override
171b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String toString() {
172462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        byte[] ssidBytes = octets.toByteArray();
173462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        // Supplicant returns \x00\x00\x00\x00\x00\x00\x00\x00 hex string
174462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        // for a hidden access point. Make sure we maintain the previous
175462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        // behavior of returning empty string for this case.
176462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        if (octets.size() <= 0 || isArrayAllZeroes(ssidBytes)) return "";
177b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        // TODO: Handle conversion to other charsets upon failure
178b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        Charset charset = Charset.forName("UTF-8");
179b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        CharsetDecoder decoder = charset.newDecoder()
180b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                .onMalformedInput(CodingErrorAction.REPLACE)
181b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                .onUnmappableCharacter(CodingErrorAction.REPLACE);
182b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        CharBuffer out = CharBuffer.allocate(32);
183b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
184462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        CoderResult result = decoder.decode(ByteBuffer.wrap(ssidBytes), out, true);
185b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        out.flip();
186b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        if (result.isError()) {
187b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            return NONE;
188b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
189b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return out.toString();
190b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
191b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
192462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff    private boolean isArrayAllZeroes(byte[] ssidBytes) {
193462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        for (int i = 0; i< ssidBytes.length; i++) {
194462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff            if (ssidBytes[i] != 0) return false;
195462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        }
196462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff        return true;
197462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff    }
198462ff630e441f5bc36c4b926ce81bdb35fe7d04bIrfan Sheriff
199b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** @hide */
2006e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath    public boolean isHidden() {
2016e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath        return isArrayAllZeroes(octets.toByteArray());
2026e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath    }
2036e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath
2046e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath    /** @hide */
205b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public byte[] getOctets() {
2066e86fa8a6b69dfb8c8117791dc0f100b80fb616fNarayan Kamath        return octets.toByteArray();
207b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
208b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
209b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** @hide */
210b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public String getHexString() {
211b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        String out = "0x";
212b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        byte[] ssidbytes = getOctets();
213b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        for (int i = 0; i < octets.size(); i++) {
214fea17de7aaa5729d3111102b2734b158403d2780Jeff Sharkey            out += String.format(Locale.US, "%02x", ssidbytes[i]);
215b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        }
21691ec9298d90ea6c279decdb52fae2fa5d28813d0zhangshuxiao        return (octets.size() > 0) ? out : null;
217b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
218b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
219b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
220b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public int describeContents() {
221b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        return 0;
222b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
223b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
224b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
225b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public void writeToParcel(Parcel dest, int flags) {
226b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        dest.writeInt(octets.size());
227b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        dest.writeByteArray(octets.toByteArray());
228b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    }
229b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
230b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    /** Implement the Parcelable interface {@hide} */
231b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff    public static final Creator<WifiSsid> CREATOR =
232b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        new Creator<WifiSsid>() {
233b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            public WifiSsid createFromParcel(Parcel in) {
234b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                WifiSsid ssid = new WifiSsid();
235b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                int length = in.readInt();
236b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                byte b[] = new byte[length];
237b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                in.readByteArray(b);
238b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                ssid.octets.write(b, 0, length);
239b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                return ssid;
240b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            }
241b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff
242b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            public WifiSsid[] newArray(int size) {
243b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff                return new WifiSsid[size];
244b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff            }
245b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff        };
246b6deeed3ceff9e0f754697987b7c724901996082Irfan Sheriff}
247