/* * file_handle.cpp - File handle * * Copyright (c) 2016-2017 Intel Corporation * * 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. * * Author: Yinhang Liu * Author: Wind Yuan */ #include "file_handle.h" #define INVALID_SIZE (size_t)(-1) namespace XCam { FileHandle::FileHandle () : _fp (NULL) , _file_name (NULL) , _file_size (INVALID_SIZE) {} FileHandle::FileHandle (const char *name, const char *option) : _fp (NULL) , _file_name (NULL) , _file_size (INVALID_SIZE) { open (name, option); } FileHandle::~FileHandle () { close (); } bool FileHandle::end_of_file() { if (!is_valid ()) return true; return feof (_fp); } XCamReturn FileHandle::open (const char *name, const char *option) { XCAM_ASSERT (name); if (!name) return XCAM_RETURN_ERROR_FILE; close (); XCAM_ASSERT (!_file_name && !_fp); _fp = fopen (name, option); if (!_fp) return XCAM_RETURN_ERROR_FILE; _file_name = strndup (name, 512); return XCAM_RETURN_NO_ERROR; } XCamReturn FileHandle::close () { if (_fp) { fclose (_fp); _fp = NULL; } if (_file_name) { xcam_free (_file_name); _file_name = NULL; } _file_size = INVALID_SIZE; return XCAM_RETURN_NO_ERROR; } XCamReturn FileHandle::rewind () { if (!is_valid ()) return XCAM_RETURN_ERROR_FILE; return (fseek (_fp, 0L, SEEK_SET) == 0) ? XCAM_RETURN_NO_ERROR : XCAM_RETURN_ERROR_FILE; } XCamReturn FileHandle::get_file_size (size_t &size) { if (_file_size != INVALID_SIZE) { size = _file_size; return XCAM_RETURN_NO_ERROR; } fpos_t cur_pos; long file_size; if (fgetpos (_fp, &cur_pos) < 0) goto read_error; if (fseek (_fp, 0L, SEEK_END) != 0) goto read_error; if ((file_size = ftell (_fp)) <= 0) goto read_error; if (fsetpos (_fp, &cur_pos) < 0) goto read_error; _file_size = file_size; size = file_size; return XCAM_RETURN_NO_ERROR; read_error: XCAM_LOG_ERROR ("get file size failed with errno:%d", errno); return XCAM_RETURN_ERROR_FILE; } XCamReturn FileHandle::read_file (void *buf, const size_t &size) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if (fread (buf, 1, size, _fp) != size) { if (end_of_file ()) { ret = XCAM_RETURN_BYPASS; } else { XCAM_LOG_ERROR ("read file failed, size doesn't match"); ret = XCAM_RETURN_ERROR_FILE; } } return ret; } XCamReturn FileHandle::write_file (const void *buf, const size_t &size) { XCamReturn ret = XCAM_RETURN_NO_ERROR; if (fwrite (buf, 1, size, _fp) != size) { XCAM_LOG_ERROR ("write file failed, size doesn't match"); ret = XCAM_RETURN_ERROR_FILE; } return ret; } }