DatagramPacket.java revision 06a62bfda6aa4919d92a505ede4c8cd247fe15ba
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
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    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     */
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int length;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    /**
38f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Size of internal buffer that is used to store received data. Should be
39f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * greater or equal to "length" field.
40f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
41f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    int capacity;
42f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    InetAddress address;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int port = -1; // The default port number is -1
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    int offset = 0;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
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        super();
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setData(data, offset, length);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the port
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code aPort} of the address {@code host}. The {@code length} must be
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lesser than or equal to the size of {@code data}. The first {@code
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * length} bytes from the byte array position {@code offset} are sent.
84f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array which stores the characters to be sent.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset of {@code data} where to read from.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of data.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address of the target host.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aPort
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port of the target host.
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int offset, int length,
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress host, int aPort) {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, offset, length);
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setPort(aPort);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = host;
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the port
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code aPort} of the address {@code host}. The {@code length} must be
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * lesser than or equal to the size of {@code data}. The first {@code
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * length} bytes are sent.
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a byte array which stores the characters to be sent.
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of data.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address of the target host.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port of the target host.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int length, InetAddress host, int port) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, 0, length, host, port);
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the sender or destination IP address of this datagram packet.
124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the address from where the datagram was received or to which it
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is sent.
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized InetAddress getAddress() {
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return address;
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the data of this datagram packet.
134f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the received data or the data to be sent.
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized byte[] getData() {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return data;
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the length of the data stored in this datagram packet.
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the length of the received data or the data to be sent.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getLength() {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return length;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the offset of the data stored in this datagram packet.
152f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the position of the received data or the data to be sent.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getOffset() {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return offset;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the port number of the target or sender host of this datagram
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * packet.
162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the port number of the origin or target host.
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getPort() {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return port;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the IP address of the target host.
171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param addr
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setAddress(InetAddress addr) {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = addr;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the data buffer for this datagram packet.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to store the data.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param anOffset
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer offset where the data is stored.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aLength
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data to be sent or the length of buffer to
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            store the received data.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setData(byte[] buf, int anOffset, int aLength) {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (0 > anOffset || anOffset > buf.length || 0 > aLength
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || aLength > buf.length - anOffset) {
19306a62bfda6aa4919d92a505ede4c8cd247fe15baElliott Hughes            throw new IllegalArgumentException();
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        data = buf;
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = anOffset;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        length = aLength;
198f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        capacity = aLength;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the data buffer for this datagram packet. The length of the datagram
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * packet is set to the buffer length.
204f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param buf
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer to store the data.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setData(byte[] buf) {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        length = buf.length; // This will check for null
210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        capacity = buf.length;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        data = buf;
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        offset = 0;
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
21655392539fea537abfb6581b474918f9d611fba27Jesse Wilson     * Gets the current capacity value.
217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
21855392539fea537abfb6581b474918f9d611fba27Jesse Wilson     * @return the current capacity value
21955392539fea537abfb6581b474918f9d611fba27Jesse Wilson     */
22055392539fea537abfb6581b474918f9d611fba27Jesse Wilson    synchronized int getCapacity() {
22155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        return capacity;
22255392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
22355392539fea537abfb6581b474918f9d611fba27Jesse Wilson
22455392539fea537abfb6581b474918f9d611fba27Jesse Wilson    /**
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the length of the datagram packet. This length plus the offset must
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be lesser than or equal to the buffer size.
227f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param len
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of this datagram packet.
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setLength(int len) {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (0 > len || offset + len > data.length) {
233b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IndexOutOfBoundsException();
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        length = len;
236f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        capacity = len;
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
24055392539fea537abfb6581b474918f9d611fba27Jesse Wilson     * An alternative to {@link #setLength(int)}, that doesn't reset the {@link #capacity}
24155392539fea537abfb6581b474918f9d611fba27Jesse Wilson     * field.
242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
24355392539fea537abfb6581b474918f9d611fba27Jesse Wilson     * @param len the length of this datagram packet
24455392539fea537abfb6581b474918f9d611fba27Jesse Wilson     */
24555392539fea537abfb6581b474918f9d611fba27Jesse Wilson    synchronized void setLengthOnly(int len) {
24655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        if (0 > len || offset + len > data.length) {
247b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IndexOutOfBoundsException();
24855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
24955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        length = len;
25055392539fea537abfb6581b474918f9d611fba27Jesse Wilson    }
25155392539fea537abfb6581b474918f9d611fba27Jesse Wilson
25255392539fea537abfb6581b474918f9d611fba27Jesse Wilson    /**
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the port number of the target host of this datagram packet.
254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aPort
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host port number.
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setPort(int aPort) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (aPort < 0 || aPort > 65535) {
260b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("Port out of range: " + aPort);
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        port = aPort;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address {@code sockAddr}. The {@code length} must be lesser than or equal
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the size of {@code data}. The first {@code length} bytes of the data
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are sent.
270f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte array to store the data.
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address and port.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error in the underlying protocol occurs.
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
280f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    public DatagramPacket(byte[] data, int length, SocketAddress sockAddr)
281f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            throws SocketException {
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, 0, length);
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setSocketAddress(sockAddr);
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code DatagramPacket} object to send data to the
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address {@code sockAddr}. The {@code length} must be lesser than or equal
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the size of {@code data}. The first {@code length} bytes of the data
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are sent.
291f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param data
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte array to store the data.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the offset of the data.
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the length of the data.
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target host address and port.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error in the underlying protocol occurs.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public DatagramPacket(byte[] data, int offset, int length,
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SocketAddress sockAddr) throws SocketException {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(data, offset, length);
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        setSocketAddress(sockAddr);
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the host address and the port to which this datagram packet is sent
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as a {@code SocketAddress} object.
312f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the SocketAddress of the target host.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized SocketAddress getSocketAddress() {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(getAddress(), getPort());
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the {@code SocketAddress} for this datagram packet.
321f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sockAddr
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the SocketAddress of the target host.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setSocketAddress(SocketAddress sockAddr) {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(sockAddr instanceof InetSocketAddress)) {
327b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("Socket address not an InetSocketAddress: " +
328b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes                    (sockAddr == null ? null : sockAddr.getClass()));
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetSocketAddress inetAddr = (InetSocketAddress) sockAddr;
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        port = inetAddr.getPort();
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        address = inetAddr.getAddress();
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
335