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