1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.car.trust;
18 
19 import android.annotation.NonNull;
20 
21 import com.android.car.BLEStreamProtos.BLEMessageProto.BLEMessage;
22 
23 import java.io.ByteArrayOutputStream;
24 import java.io.IOException;
25 
26 /**
27  * Manage a stream in which the {@code payload} field of
28  * {@link com.android.car.trust.BLEStream.BLEMessage} is written to.
29  */
30 class BLEMessagePayloadStream {
31     private ByteArrayOutputStream mPendingData = new ByteArrayOutputStream();
32     private boolean mIsComplete;
33 
34     /**
35      * Clears this data stream.
36      */
reset()37     public void reset() {
38         mPendingData.reset();
39         mIsComplete = false;
40     }
41 
42     /**
43      * Extracts the payload from the given {@code BLEMessage} and writes it to the stream.
44      *
45      * @param message The {@link com.android.car.trust.BLEStream.BLEMessage} to parse.
46      */
write(BLEMessage message)47     public void write(BLEMessage message) throws IOException {
48         mPendingData.write(message.getPayload().toByteArray());
49         mIsComplete = message.getPacketNumber() == message.getTotalPackets();
50     }
51 
52     /**
53      * Returns {@code true} if a complete payload has been formed.
54      */
isComplete()55     public boolean isComplete() {
56         return mIsComplete;
57     }
58 
59     /**
60      * Returns the current contents of a stream as a byte array.
61      */
62     @NonNull
toByteArray()63     public byte[] toByteArray() {
64         return mPendingData.toByteArray();
65     }
66 }
67