| /* |
| * 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 <[email protected]> |
| * Author: Wind Yuan <[email protected]> |
| */ |
| |
| #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; |
| } |
| |
| } |