17cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/*
27cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Copyright 2012, The Android Open Source Project
37cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *
47cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
57cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * you may not use this file except in compliance with the License.
67cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * You may obtain a copy of the License at
77cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *
87cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
97cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *
107cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Unless required by applicable law or agreed to in writing, software
117cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
127cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * See the License for the specific language governing permissions and
147cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * limitations under the License.
157cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines */
167cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
177cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include <sys/stat.h>
187cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include <stdlib.h>
197cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "bcinfo/Wrap/file_wrapper_input.h"
217cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
227cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesFileWrapperInput::FileWrapperInput(const char* name) :
237cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    _name(name), _at_eof(false), _size_found(false), _size(0) {
247cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  _file = fopen(name, "rb");
25900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes  if (_file == nullptr) {
267cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    fprintf(stderr, "Unable to open: %s\n", name);
277cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    exit(1);
287cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
297cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
307cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
317cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesFileWrapperInput::~FileWrapperInput() {
327cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  fclose(_file);
337cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
347cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
357cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinessize_t FileWrapperInput::Read(uint8_t* buffer, size_t wanted) {
367cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  size_t found = fread((char*) buffer, 1, wanted, _file);
377cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  if (feof(_file) || ferror(_file)) {
387cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    _at_eof = true;
397cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
407cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  return found;
417cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
427cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
437cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesbool FileWrapperInput::AtEof() {
447cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  return _at_eof;
457cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
467cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
477cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesoff_t FileWrapperInput::Size() {
487cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  if (_size_found) return _size;
497cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  struct stat st;
50900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes  if (stat(_name, &st) == 0) {
517cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    _size_found = true;
527cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    _size = st.st_size;
537cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    return _size;
547cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  } else {
557cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    fprintf(stderr, "Unable to compute file size: %s\n", _name);
567cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines    exit(1);
577cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  }
587cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  // NOT REACHABLE.
597cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines  return 0;
607cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
617cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines
627cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesbool FileWrapperInput::Seek(uint32_t pos) {
63900c6c1f08f7c572125d7d39abe0f0f9eafbfa14Chris Wailes  return fseek(_file, (long) pos, SEEK_SET) == 0;
647cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}
65