/*****************************************************************************/
// Copyright 2006-2007 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE: Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/
/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_file_stream.cpp#2 $ */
/* $DateTime: 2012/06/01 07:28:57 $ */
/* $Change: 832715 $ */
/* $Author: tknoll $ */
/*****************************************************************************/
#include "dng_file_stream.h"
#include "dng_exceptions.h"
/*****************************************************************************/
dng_file_stream::dng_file_stream (const char *filename,
bool output,
uint32 bufferSize)
: dng_stream ((dng_abort_sniffer *) NULL,
bufferSize,
0)
, fFile (NULL)
{
fFile = fopen (filename, output ? "wb" : "rb");
if (!fFile)
{
#if qDNGValidate
ReportError ("Unable to open file",
filename);
ThrowSilentError ();
#else
ThrowOpenFile ();
#endif
}
}
/*****************************************************************************/
dng_file_stream::~dng_file_stream ()
{
if (fFile)
{
fclose (fFile);
fFile = NULL;
}
}
/*****************************************************************************/
uint64 dng_file_stream::DoGetLength ()
{
if (fseek (fFile, 0, SEEK_END) != 0)
{
ThrowReadFile ();
}
return (uint64) ftell (fFile);
}
/*****************************************************************************/
void dng_file_stream::DoRead (void *data,
uint32 count,
uint64 offset)
{
if (fseek (fFile, (long) offset, SEEK_SET) != 0)
{
ThrowReadFile ();
}
uint32 bytesRead = (uint32) fread (data, 1, count, fFile);
if (bytesRead != count)
{
ThrowReadFile ();
}
}
/*****************************************************************************/
void dng_file_stream::DoWrite (const void *data,
uint32 count,
uint64 offset)
{
if (fseek (fFile, (uint32) offset, SEEK_SET) != 0)
{
ThrowWriteFile ();
}
uint32 bytesWritten = (uint32) fwrite (data, 1, count, fFile);
if (bytesWritten != count)
{
ThrowWriteFile ();
}
}
/*****************************************************************************/