Blame IlmImf/ImfStdIO.cpp

Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
//
Packit 0d464f
// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas
Packit 0d464f
// Digital Ltd. LLC
Packit 0d464f
// 
Packit 0d464f
// All rights reserved.
Packit 0d464f
// 
Packit 0d464f
// Redistribution and use in source and binary forms, with or without
Packit 0d464f
// modification, are permitted provided that the following conditions are
Packit 0d464f
// met:
Packit 0d464f
// *       Redistributions of source code must retain the above copyright
Packit 0d464f
// notice, this list of conditions and the following disclaimer.
Packit 0d464f
// *       Redistributions in binary form must reproduce the above
Packit 0d464f
// copyright notice, this list of conditions and the following disclaimer
Packit 0d464f
// in the documentation and/or other materials provided with the
Packit 0d464f
// distribution.
Packit 0d464f
// *       Neither the name of Industrial Light & Magic nor the names of
Packit 0d464f
// its contributors may be used to endorse or promote products derived
Packit 0d464f
// from this software without specific prior written permission. 
Packit 0d464f
// 
Packit 0d464f
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit 0d464f
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit 0d464f
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit 0d464f
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit 0d464f
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit 0d464f
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit 0d464f
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit 0d464f
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit 0d464f
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit 0d464f
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.67
Packit 0d464f
//
Packit 0d464f
///////////////////////////////////////////////////////////////////////////
Packit 0d464f
Packit 0d464f
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
//
Packit 0d464f
//	Low-level file input and output for OpenEXR
Packit 0d464f
//	based on C++ standard iostreams.
Packit 0d464f
//
Packit 0d464f
//-----------------------------------------------------------------------------
Packit 0d464f
Packit 0d464f
#include <ImfStdIO.h>
Packit 0d464f
#include "Iex.h"
Packit 0d464f
#include <errno.h>
Packit 0d464f
Packit 0d464f
using namespace std;
Packit 0d464f
#include "ImfNamespace.h"
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_ENTER
Packit 0d464f
Packit 0d464f
namespace {
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
clearError ()
Packit 0d464f
{
Packit 0d464f
    errno = 0;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
checkError (istream &is, streamsize expected = 0)
Packit 0d464f
{
Packit 0d464f
    if (!is)
Packit 0d464f
    {
Packit 0d464f
	if (errno)
Packit 0d464f
	    IEX_NAMESPACE::throwErrnoExc();
Packit 0d464f
Packit 0d464f
	if (is.gcount() < expected) 
Packit 0d464f
	{
Packit 0d464f
		THROW (IEX_NAMESPACE::InputExc, "Early end of file: read " << is.gcount() 
Packit 0d464f
			<< " out of " << expected << " requested bytes.");
Packit 0d464f
	}
Packit 0d464f
	return false;
Packit 0d464f
    }
Packit 0d464f
Packit 0d464f
    return true;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
checkError (ostream &os)
Packit 0d464f
{
Packit 0d464f
    if (!os)
Packit 0d464f
    {
Packit 0d464f
	if (errno)
Packit 0d464f
	    IEX_NAMESPACE::throwErrnoExc();
Packit 0d464f
Packit 0d464f
	throw IEX_NAMESPACE::ErrnoExc ("File output failed.");
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
} // namespace
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdIFStream::StdIFStream (const char fileName[]):
Packit 0d464f
    OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName),
Packit 0d464f
    _is (new ifstream (fileName, ios_base::binary)),
Packit 0d464f
    _deleteStream (true)
Packit 0d464f
{
Packit 0d464f
    if (!*_is)
Packit 0d464f
    {
Packit 0d464f
	delete _is;
Packit 0d464f
	IEX_NAMESPACE::throwErrnoExc();
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
    
Packit 0d464f
StdIFStream::StdIFStream (ifstream &is, const char fileName[]):
Packit 0d464f
    OPENEXR_IMF_INTERNAL_NAMESPACE::IStream (fileName),
Packit 0d464f
    _is (&is),
Packit 0d464f
    _deleteStream (false)
Packit 0d464f
{
Packit 0d464f
    // empty
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdIFStream::~StdIFStream ()
Packit 0d464f
{
Packit 0d464f
    if (_deleteStream)
Packit 0d464f
	delete _is;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
bool
Packit 0d464f
StdIFStream::read (char c[/*n*/], int n)
Packit 0d464f
{
Packit 0d464f
    if (!*_is)
Packit 0d464f
        throw IEX_NAMESPACE::InputExc ("Unexpected end of file.");
Packit 0d464f
Packit 0d464f
    clearError();
Packit 0d464f
    _is->read (c, n);
Packit 0d464f
    return checkError (*_is, n);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Int64
Packit 0d464f
StdIFStream::tellg ()
Packit 0d464f
{
Packit 0d464f
    return std::streamoff (_is->tellg());
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdIFStream::seekg (Int64 pos)
Packit 0d464f
{
Packit 0d464f
    _is->seekg (pos);
Packit 0d464f
    checkError (*_is);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdIFStream::clear ()
Packit 0d464f
{
Packit 0d464f
    _is->clear();
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdOFStream::StdOFStream (const char fileName[]):
Packit 0d464f
    OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName),
Packit 0d464f
    _os (new ofstream (fileName, ios_base::binary)),
Packit 0d464f
    _deleteStream (true)
Packit 0d464f
{
Packit 0d464f
    if (!*_os)
Packit 0d464f
    {
Packit 0d464f
	delete _os;
Packit 0d464f
	IEX_NAMESPACE::throwErrnoExc();
Packit 0d464f
    }
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdOFStream::StdOFStream (ofstream &os, const char fileName[]):
Packit 0d464f
    OPENEXR_IMF_INTERNAL_NAMESPACE::OStream (fileName),
Packit 0d464f
    _os (&os),
Packit 0d464f
    _deleteStream (false)
Packit 0d464f
{
Packit 0d464f
    // empty
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdOFStream::~StdOFStream ()
Packit 0d464f
{
Packit 0d464f
    if (_deleteStream)
Packit 0d464f
	delete _os;
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdOFStream::write (const char c[/*n*/], int n)
Packit 0d464f
{
Packit 0d464f
    clearError();
Packit 0d464f
    _os->write (c, n);
Packit 0d464f
    checkError (*_os);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Int64
Packit 0d464f
StdOFStream::tellp ()
Packit 0d464f
{
Packit 0d464f
    return std::streamoff (_os->tellp());
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdOFStream::seekp (Int64 pos)
Packit 0d464f
{
Packit 0d464f
    _os->seekp (pos);
Packit 0d464f
    checkError (*_os);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
StdOSStream::StdOSStream (): OPENEXR_IMF_INTERNAL_NAMESPACE::OStream ("(string)")
Packit 0d464f
{
Packit 0d464f
    // empty
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdOSStream::write (const char c[/*n*/], int n)
Packit 0d464f
{
Packit 0d464f
    clearError();
Packit 0d464f
    _os.write (c, n);
Packit 0d464f
    checkError (_os);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
Int64
Packit 0d464f
StdOSStream::tellp ()
Packit 0d464f
{
Packit 0d464f
    return std::streamoff (_os.tellp());
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
void
Packit 0d464f
StdOSStream::seekp (Int64 pos)
Packit 0d464f
{
Packit 0d464f
    _os.seekp (pos);
Packit 0d464f
    checkError (_os);
Packit 0d464f
}
Packit 0d464f
Packit 0d464f
Packit 0d464f
OPENEXR_IMF_INTERNAL_NAMESPACE_SOURCE_EXIT