/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "FixedBlockAdapter.h" #include "FixedBlockReader.h" FixedBlockReader::FixedBlockReader(FixedBlockProcessor &fixedBlockProcessor) : FixedBlockAdapter(fixedBlockProcessor) { mPosition = mSize; } int32_t FixedBlockReader::open(int32_t bytesPerFixedBlock) { int32_t result = FixedBlockAdapter::open(bytesPerFixedBlock); mPosition = mSize; // Indicate no data in storage. return result; } int32_t FixedBlockReader::readFromStorage(uint8_t *buffer, int32_t numBytes) { int32_t bytesToRead = numBytes; int32_t dataAvailable = mSize - mPosition; if (bytesToRead > dataAvailable) { bytesToRead = dataAvailable; } memcpy(buffer, &mStorage[mPosition], bytesToRead); mPosition += bytesToRead; return bytesToRead; } int32_t FixedBlockReader::processVariableBlock(uint8_t *buffer, int32_t numBytes) { int32_t result = 0; int32_t bytesLeft = numBytes; while(bytesLeft > 0 && result == 0) { if (mPosition < mSize) { // Use up bytes currently in storage. int32_t bytesRead = readFromStorage(buffer, bytesLeft); buffer += bytesRead; bytesLeft -= bytesRead; } else if (bytesLeft >= mSize) { // Read through if enough for a complete block. result = mFixedBlockProcessor.onProcessFixedBlock(buffer, mSize); buffer += mSize; bytesLeft -= mSize; } else { // Just need a partial block so we have to use storage. result = mFixedBlockProcessor.onProcessFixedBlock(mStorage.get(), mSize); mPosition = 0; } } return result; }