106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski/* 206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * Copyright (C) 2017 The Android Open Source Project 306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * 406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * you may not use this file except in compliance with the License. 606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * You may obtain a copy of the License at 706460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * 806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * 1006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * See the License for the specific language governing permissions and 1406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski * limitations under the License. 1506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski */ 1606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 17004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski#include "io/BigBufferStream.h" 1806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 1906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskinamespace aapt { 2006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskinamespace io { 2106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 2206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// 2306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// BigBufferInputStream 2406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// 2506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 2606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskibool BigBufferInputStream::Next(const void** data, size_t* size) { 2706460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski if (iter_ == buffer_->end()) { 2806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski return false; 2906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski } 3006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 3106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski if (offset_ == iter_->size) { 3206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski ++iter_; 3306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski if (iter_ == buffer_->end()) { 3406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski return false; 3506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski } 3606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski offset_ = 0; 3706460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski } 3806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 3906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski *data = iter_->buffer.get() + offset_; 4006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski *size = iter_->size - offset_; 4106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski bytes_read_ += iter_->size - offset_; 4206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski offset_ = iter_->size; 4306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski return true; 4406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} 4506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 4606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskivoid BigBufferInputStream::BackUp(size_t count) { 4706460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski if (count > offset_) { 4806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski bytes_read_ -= offset_; 4906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski offset_ = 0; 5006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski } else { 5106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski offset_ -= count; 5206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski bytes_read_ -= count; 5306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski } 5406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} 5506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 56004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskibool BigBufferInputStream::CanRewind() const { 57004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return true; 58004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 5906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 6006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskibool BigBufferInputStream::Rewind() { 6106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski iter_ = buffer_->begin(); 6206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski offset_ = 0; 6306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski bytes_read_ = 0; 6406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski return true; 6506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} 6606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 67004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskisize_t BigBufferInputStream::ByteCount() const { 68004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return bytes_read_; 69004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 7006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 71004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskibool BigBufferInputStream::HadError() const { 72004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return false; 73004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 74004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski 75004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskisize_t BigBufferInputStream::TotalSize() const { 76004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return buffer_->size(); 77004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 7806460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 7906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// 8006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// BigBufferOutputStream 8106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski// 8206460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 8306460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinskibool BigBufferOutputStream::Next(void** data, size_t* size) { 8406460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski *data = buffer_->NextBlock(size); 8506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski return true; 8606460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} 8706460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 88004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskivoid BigBufferOutputStream::BackUp(size_t count) { 89004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski buffer_->BackUp(count); 90004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 9106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 92004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskisize_t BigBufferOutputStream::ByteCount() const { 93004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return buffer_->size(); 94004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 9506460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 96004511660671511ae88e0e837a6f92db28eadaefAdam Lesinskibool BigBufferOutputStream::HadError() const { 97004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski return false; 98004511660671511ae88e0e837a6f92db28eadaefAdam Lesinski} 9906460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski 10006460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} // namespace io 10106460ef0d7072114ea3280e1650f77f55e7223f4Adam Lesinski} // namespace aapt 102