1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughespackage java.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20b5bde2fd72189192b52e726a2d606d70c3c8a34bElliott Hughesimport java.nio.ByteOrder;
212a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughesimport java.nio.charset.StandardCharsets;
22f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughesimport libcore.io.Memory;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass Socks4Message {
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int COMMAND_CONNECT = 1;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int COMMAND_BIND = 2;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int RETURN_SUCCESS = 90;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int RETURN_FAILURE = 91;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int RETURN_CANNOT_CONNECT_TO_IDENTD = 92;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int RETURN_DIFFERENT_USER_IDS = 93;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int REPLY_LENGTH = 8;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static final int INDEX_VERSION = 0;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int SOCKS_VERSION = 4;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_COMMAND = 1;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_PORT = 2;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_IP = 4;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int INDEX_USER_ID = 8;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int BUFFER_LENGTH = 256;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final int MAX_USER_ID_LENGTH = BUFFER_LENGTH - INDEX_USER_ID;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected byte[] buffer;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socks4Message() {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer = new byte[BUFFER_LENGTH];
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setVersionNumber(SOCKS_VERSION);
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Get the request's command or result.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getCommandOrResult() {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer[INDEX_COMMAND];
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the request's command or result.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setCommandOrResult(int command) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_COMMAND] = (byte) command;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
773bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the request's port number.
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getPort() {
80f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        return Memory.peekShort(buffer, INDEX_PORT, ByteOrder.BIG_ENDIAN);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the request's port number.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPort(int port) {
87f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        Memory.pokeShort(buffer, INDEX_PORT, (short) port, ByteOrder.BIG_ENDIAN);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
903bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes    /**
913bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the IP address of the request as an integer.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getIP() {
94f934c3d2c8dd9e6bc5299cef41adace2a671637dElliott Hughes        return Memory.peekInt(buffer, INDEX_IP, ByteOrder.BIG_ENDIAN);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the IP address. This expects an array of four bytes in host order.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setIP(byte[] ip) {
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_IP] = ip[0];
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_IP + 1] = ip[1];
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_IP + 2] = ip[2];
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_IP + 3] = ip[3];
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1083bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the user id for authentication.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getUserId() {
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getString(INDEX_USER_ID, MAX_USER_ID_LENGTH);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the user id for authentication.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setUserId(String id) {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setString(INDEX_USER_ID, MAX_USER_ID_LENGTH, id);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StringBuilder buf = new StringBuilder(50);
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append("Version: ");
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(Integer.toHexString(getVersionNumber()));
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(" Command: ");
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(Integer.toHexString(getCommandOrResult()));
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(" Port: ");
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(getPort());
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(" IP: ");
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(Integer.toHexString(getIP()));
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(" User ID: ");
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buf.append(getUserId());
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buf.toString();
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1383bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the total number of bytes used for the request. This method
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * searches for the end of the user id, then searches for the end of the
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * password and returns the final index as the requests length.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLength() {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int index = 0;
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Look for the end of the user id.
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (index = INDEX_USER_ID; buffer[index] != 0; index++) {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /*
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * Finds the end of the user id by searching for the null
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * termination of the user id string.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Increment the index to include the NULL character in the length;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        index++;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return index;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1593bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns an error string corresponding to the given error value.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getErrorString(int error) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        switch (error) {
163b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        case RETURN_FAILURE:
164b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            return "Failure to connect to SOCKS server";
165b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        case RETURN_CANNOT_CONNECT_TO_IDENTD:
166b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            return "Unable to connect to identd to verify user";
167b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        case RETURN_DIFFERENT_USER_IDS:
168b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            return "Failure - user ids do not match";
169b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        default:
170b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            return "Success";
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1753bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the message's byte buffer.
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte[] getBytes() {
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Get a String from the buffer at the offset given. The method reads until
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it encounters a null value or reaches the maxLength given.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String getString(int offset, int maxLength) {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int index = offset;
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int lastIndex = index + maxLength;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (index < lastIndex && (buffer[index] != 0)) {
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            index++;
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1912a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughes        return new String(buffer, offset, index - offset, StandardCharsets.ISO_8859_1);
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1953bf03b8be207d0c760bcad5eae5028e854498376Elliott Hughes     * Returns the SOCKS version number. Should always be 4.
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int getVersionNumber() {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return buffer[INDEX_VERSION];
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Put a string into the buffer at the offset given.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void setString(int offset, int maxLength, String theString) {
2052a6f23ff8690ac2f025588a360547ce96cde0943Elliott Hughes        byte[] stringBytes = theString.getBytes(StandardCharsets.ISO_8859_1);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = Math.min(stringBytes.length, maxLength);
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        System.arraycopy(stringBytes, 0, buffer, offset, length);
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[offset + length] = 0;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the SOCKS version number. This should always be 4.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void setVersionNumber(int number) {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        buffer[INDEX_VERSION] = (byte) number;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
218