1238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde/*
2238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Copyright (c) 2015 The Android Open Source Project
3238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Copyright (c) 2015 Samsung LSI
4238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde *
5238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Licensed under the Apache License, Version 2.0 (the "License");
6238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * you may not use this file except in compliance with the License.
7238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * You may obtain a copy of the License at
8238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde *
9238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde *      http://www.apache.org/licenses/LICENSE-2.0
10238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde *
11238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * Unless required by applicable law or agreed to in writing, software
12238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * distributed under the License is distributed on an "AS IS" BASIS,
13238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * See the License for the specific language governing permissions and
15238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde * limitations under the License.
16238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde */
17238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
18238e0f934f1f47263b384bc745ae0678c777130dCasper Bondepackage javax.obex;
19238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
20238e0f934f1f47263b384bc745ae0678c777130dCasper Bondeimport java.io.IOException;
21238e0f934f1f47263b384bc745ae0678c777130dCasper Bondeimport java.io.InputStream;
22238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
23238e0f934f1f47263b384bc745ae0678c777130dCasper Bondepublic class ObexPacket {
24238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    public int mHeaderId;
25238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    public int mLength;
26238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    public byte[] mPayload = null;
27238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
28238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    private ObexPacket(int headerId, int length) {
29238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        mHeaderId = headerId;
30238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        mLength = length;
31238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    }
32238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
33238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    /**
34238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * Create a complete OBEX packet by reading data from an InputStream.
35238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @param is the input stream to read from.
36238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @return the OBEX packet read.
37238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @throws IOException if an IO exception occurs during read.
38238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     */
39238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    public static ObexPacket read(InputStream is) throws IOException {
40238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        int headerId = is.read();
41238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        return read(headerId, is);
42238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    }
43238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
44238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    /**
45238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * Read the remainder of an OBEX packet, with a specified headerId.
46238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @param headerId the headerId already read from the stream.
47238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @param is the stream to read from, assuming 1 byte have already been read.
48238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @return the OBEX packet read.
49238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     * @throws IOException
50238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde     */
51238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    public static ObexPacket read(int headerId, InputStream is) throws IOException {
52238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        // Read the 2 byte length field from the stream
53238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        int length = is.read();
54238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        length = (length << 8) + is.read();
55238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
56238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        ObexPacket newPacket = new ObexPacket(headerId, length);
57238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde
58238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        int bytesReceived;
59238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        byte[] temp = null;
60238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        if (length > 3) {
61238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            // First three bytes already read, compensating for this
62238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            temp = new byte[length - 3];
63238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            bytesReceived = is.read(temp);
64238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            while (bytesReceived != temp.length) {
65238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde                bytesReceived += is.read(temp, bytesReceived, temp.length - bytesReceived);
66238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde            }
67238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        }
68238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        newPacket.mPayload = temp;
69238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde        return newPacket;
70238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde    }
71238e0f934f1f47263b384bc745ae0678c777130dCasper Bonde}
72