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
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a datagram packet which contains data either to be sent
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or received through a {@code DatagramSocket}. It holds additional information
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * such as its source or destination host.
24f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see DatagramSocket
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class DatagramPacket {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private byte[] data;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    /**
32f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Length of the data to be sent or size of data that was received via
33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * DatagramSocket#receive() method call.
34f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
35e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private int length;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    /**
38e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * The last user-supplied length (as opposed to a length set by simply receiving a packet).
39e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * This length (unlike 'length') is sticky, and survives until the user sets another length.
40e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * It's used to limit the amount of data that will be taken from future packets.
41f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
42e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private int userSuppliedLength;
43f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
44e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private InetAddress address;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private int port = -1; // The default port number is -1
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    private int offset = 0;
49f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to receive data up to
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code length} bytes.
53f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array to store the read characters.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data buffer.
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int length) {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, 0, length);
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to receive data up to
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code length} bytes with a specified buffer offset.
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array to store the read characters.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset of the byte array where the bytes is written.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data.
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int offset, int length) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setData(data, offset, length);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the port
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code aPort} of the address {@code host}. The {@code length} must be
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lesser than or equal to the size of {@code data}. The first {@code
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * length} bytes from the byte array position {@code offset} are sent.
83f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array which stores the characters to be sent.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset of {@code data} where to read from.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of data.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address of the target host.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aPort
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port of the target host.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
95e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    public DatagramPacket(byte[] data, int offset, int length, InetAddress host, int aPort) {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, offset, length);
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setPort(aPort);
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = host;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the port
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code aPort} of the address {@code host}. The {@code length} must be
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lesser than or equal to the size of {@code data}. The first {@code
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * length} bytes are sent.
106f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array which stores the characters to be sent.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of data.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address of the target host.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port of the target host.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int length, InetAddress host, int port) {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, 0, length, host, port);
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the sender or destination IP address of this datagram packet.
122f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the address from where the datagram was received or to which it
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is sent.
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized InetAddress getAddress() {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return address;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the data of this datagram packet.
132f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the received data or the data to be sent.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized byte[] getData() {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return data;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the length of the data stored in this datagram packet.
141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the length of the received data or the data to be sent.
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getLength() {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return length;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the offset of the data stored in this datagram packet.
150f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the received data or the data to be sent.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getOffset() {
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return offset;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the port number of the target or sender host of this datagram
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * packet.
160f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the port number of the origin or target host.
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getPort() {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return port;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the IP address of the target host.
169f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param addr
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setAddress(InetAddress addr) {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = addr;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the data buffer for this datagram packet.
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
180a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    public synchronized void setData(byte[] data, int offset, int byteCount) {
181a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        if ((offset | byteCount) < 0 || offset > data.length || byteCount > data.length - offset) {
18206a62bfda6aa4919d92a505ede4c8cd247fe15baElliott Hughes            throw new IllegalArgumentException();
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
184a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        this.data = data;
185a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        this.offset = offset;
186a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        this.length = byteCount;
187e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        this.userSuppliedLength = byteCount;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the data buffer for this datagram packet. The length of the datagram
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * packet is set to the buffer length.
193f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to store the data.
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setData(byte[] buf) {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        length = buf.length; // This will check for null
199e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        userSuppliedLength = length;
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        data = buf;
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = 0;
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the length of the datagram packet. This length plus the offset must
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be lesser than or equal to the buffer size.
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
208a1603838fe9e865575c87982e32c6343740e464cElliott Hughes     * @param length
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of this datagram packet.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
211a1603838fe9e865575c87982e32c6343740e464cElliott Hughes    public synchronized void setLength(int length) {
212e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        if (length < 0 || offset + length > data.length) {
213e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes            throw new IndexOutOfBoundsException("length=" + length + ", offset=" + offset +
214e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes                                                ", buffer size=" + data.length);
215e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        }
216e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        this.length = length;
217e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        this.userSuppliedLength = length;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * Resets 'length' to the last user-supplied length, ready to receive another packet.
222e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * @hide for PlainDatagramSocketImpl
22355392539fea537abfb6581b474918f9d611fba27Jesse Wilson     */
224e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    public void resetLengthForReceive() {
225e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes        this.length = userSuppliedLength;
226e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    }
227e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes
228e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    /**
229e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * Sets 'length' without changing 'userSuppliedLength', after receiving a packet.
230e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     * @hide for IoBridge
231e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes     */
232e50d82455c813210a2d452070f45fd38d9903159Elliott Hughes    public void setReceivedLength(int length) {
233a1603838fe9e865575c87982e32c6343740e464cElliott Hughes        this.length = length;
23455392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
23555392539fea537abfb6581b474918f9d611fba27Jesse Wilson
23655392539fea537abfb6581b474918f9d611fba27Jesse Wilson    /**
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the port number of the target host of this datagram packet.
238f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aPort
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host port number.
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setPort(int aPort) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (aPort < 0 || aPort > 65535) {
244b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("Port out of range: " + aPort);
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        port = aPort;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address {@code sockAddr}. The {@code length} must be lesser than or equal
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the size of {@code data}. The first {@code length} bytes of the data
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are sent.
254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte array to store the data.
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address and port.
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error in the underlying protocol occurs.
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
26470c145d9e9dd2a0244f813c217501a1b84189a43Elliott Hughes    public DatagramPacket(byte[] data, int length, SocketAddress sockAddr) throws SocketException {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, 0, length);
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setSocketAddress(sockAddr);
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address {@code sockAddr}. The {@code length} must be lesser than or equal
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the size of {@code data}. The first {@code length} bytes of the data
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are sent.
274f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte array to store the data.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset of the data.
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address and port.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error in the underlying protocol occurs.
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int offset, int length,
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SocketAddress sockAddr) throws SocketException {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, offset, length);
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setSocketAddress(sockAddr);
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the host address and the port to which this datagram packet is sent
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as a {@code SocketAddress} object.
295f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the SocketAddress of the target host.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized SocketAddress getSocketAddress() {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(getAddress(), getPort());
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code SocketAddress} for this datagram packet.
304f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the SocketAddress of the target host.
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setSocketAddress(SocketAddress sockAddr) {
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(sockAddr instanceof InetSocketAddress)) {
310b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("Socket address not an InetSocketAddress: " +
311b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes                    (sockAddr == null ? null : sockAddr.getClass()));
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetSocketAddress inetAddr = (InetSocketAddress) sockAddr;
31470c145d9e9dd2a0244f813c217501a1b84189a43Elliott Hughes        if (inetAddr.isUnresolved()) {
31570c145d9e9dd2a0244f813c217501a1b84189a43Elliott Hughes            throw new IllegalArgumentException("Socket address unresolved: " + sockAddr);
31670c145d9e9dd2a0244f813c217501a1b84189a43Elliott Hughes        }
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        port = inetAddr.getPort();
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = inetAddr.getAddress();
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
321