You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
3.1 KiB
C++
183 lines
3.1 KiB
C++
/*****************************************************************************/
|
|
// Copyright 2006-2019 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.
|
|
/*****************************************************************************/
|
|
|
|
#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
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
#if qWinOS
|
|
|
|
/*****************************************************************************/
|
|
|
|
dng_file_stream::dng_file_stream (const wchar_t *filename,
|
|
bool output,
|
|
uint32 bufferSize)
|
|
|
|
: dng_stream ((dng_abort_sniffer *) NULL,
|
|
bufferSize,
|
|
0)
|
|
|
|
, fFile (NULL)
|
|
|
|
{
|
|
|
|
fFile = _wfopen (filename, output ? L"wb" : L"rb");
|
|
|
|
if (!fFile)
|
|
{
|
|
|
|
#if qDNGValidate
|
|
|
|
char filenameCString[256];
|
|
|
|
size_t returnCount;
|
|
|
|
wcstombs_s (&returnCount,
|
|
filenameCString,
|
|
256,
|
|
filename,
|
|
_TRUNCATE);
|
|
|
|
ReportError ("Unable to open file",
|
|
filenameCString);
|
|
|
|
ThrowSilentError ();
|
|
|
|
#else
|
|
|
|
ThrowOpenFile ();
|
|
|
|
#endif // qDNGValidate
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
#endif // qWinOS
|
|
|
|
/*****************************************************************************/
|
|
|
|
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 ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|