/*
* 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 <yinhangx.liu@intel.com>
* Author: Wind Yuan <feng.yuan@intel.com>
*/
#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;
}
}