/** \file
 *
 *  Contains the FileInStream class implementation.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "FileInStream.h"

FileInStream::FileInStream( FILE* file, bool autoClose )
    : file_( file ),
      autoClose_( autoClose ),
      filename_( "unknown" )
{}

/// Constructor
FileInStream::FileInStream( const char* filename )
    : autoClose_( true )
{
    filename_ = filename;
    file_ = fopen( filename, "rb" );
}

FileInStream::~FileInStream()
{
    if( autoClose_ )
    {
        close();
    }
}

void FileInStream::close()
{
    MutexLocker locker( fileMutex_ );
    if( NULL != file_ )
    {
        fclose( file_ );
        file_ = NULL;
    };
}

/// reads num bytes from the stream to the buffer
InStream& FileInStream::read( char* buffer, size_t num )
{
    MutexLocker locker( fileMutex_ );
    if( NULL != file_ )
    {
        setBytesRead( fread( ( void * ) buffer, 1, num, file_ ) );
    }
    return *this;
}

bool FileInStream::seek( unsigned int location )
{
    MutexLocker locker( fileMutex_ );
    if( NULL != file_ )
    {
        return fseek( file_, location, SEEK_SET ) == 0;
    }
    return false;
}

bool FileInStream::eof()
{
    MutexLocker locker( fileMutex_ );
    if( NULL != file_ )
    {
        return feof( file_ ) != 0;
    }
    return true;
}

void FileInStream::clearErr()
{
    MutexLocker locker( fileMutex_ );
    if( NULL != file_ )
    {
        clearerr( file_ );
    }
}
