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