#include "gdcmWriter.h"
#include "gdcmFileMetaInformation.h"
#include "gdcmDataSet.h"
#include "gdcmTrace.h"
#include "gdcmExplicitDataElement.h"
#include "gdcmImplicitDataElement.h"
#include "gdcmSwapper.h"
#include "gdcmValue.h"
#include "gdcmItem.h"
#include "gdcmSequenceOfItems.h"
#include "gdcmParseException.h"
#include "gdcmDeflateStream.h"
namespace gdcm
{
Writer::Writer():Stream(nullptr),Ofstream(nullptr),F(new File),CheckFileMetaInformation(true),WriteDataSetOnly(false)
{
}
Writer::~Writer()
{
if (Ofstream)
{
delete Ofstream;
Ofstream = nullptr;
Stream = nullptr;
}
}
bool Writer::Write()
{
if( !Stream || !*Stream )
{
gdcmErrorMacro( "No Filename" );
return false;
}
std::ostream &os = *Stream;
FileMetaInformation &Header = F->GetHeader();
DataSet &DS = F->GetDataSet();
if( DS.IsEmpty() )
{
gdcmErrorMacro( "DS empty" );
return false;
}
if( !WriteDataSetOnly )
{
if( CheckFileMetaInformation )
{
FileMetaInformation duplicate( Header );
try
{
duplicate.FillFromDataSet( DS );
}
catch(gdcm::Exception &ex)
{
(void)ex; gdcmErrorMacro( "Could not recreate the File Meta Header, please report:" << ex.what() );
return false;
}
duplicate.Write(os);
}
else
{
Header.Write(os);
}
}
const TransferSyntax &ts = Header.GetDataSetTransferSyntax();
if( !ts.IsValid() )
{
gdcmErrorMacro( "Invalid Transfer Syntax" );
return false;
}
if( ts == TransferSyntax::DeflatedExplicitVRLittleEndian )
{
try {
zlib_stream::zip_ostream gzos( os );
gdcm_assert( ts.GetNegociatedType() == TransferSyntax::Explicit );
DS.Write<ExplicitDataElement,SwapperNoOp>(gzos);
} catch (...){
return false;
}
return !os.fail();
}
try
{
if( ts.GetSwapCode() == SwapCode::BigEndian )
{
if( ts.GetNegociatedType() == TransferSyntax::Implicit )
{
DS.Write<ImplicitDataElement,SwapperDoOp>(os);
}
else
{
gdcm_assert( ts.GetNegociatedType() == TransferSyntax::Explicit );
DS.Write<ExplicitDataElement,SwapperDoOp>(os);
}
}
else {
if( ts.GetNegociatedType() == TransferSyntax::Implicit )
{
DS.Write<ImplicitDataElement,SwapperNoOp>(os);
}
else
{
gdcm_assert( ts.GetNegociatedType() == TransferSyntax::Explicit );
DS.Write<ExplicitDataElement,SwapperNoOp>(os);
}
}
}
catch(std::exception &ex)
{
(void)ex; gdcmErrorMacro( ex.what() );
return false;
}
catch(...)
{
gdcmErrorMacro( "what the hell" );
return false;
}
os.flush();
if (Ofstream)
{
Ofstream->close();
}
return !os.fail();
}
void Writer::SetFileName(const char *utf8path)
{
if (Ofstream)
{
if (Ofstream->is_open())
{
Ofstream->close();
}
delete Ofstream;
}
Ofstream = new std::ofstream();
if (utf8path && *utf8path)
{
#ifdef _MSC_VER
const std::wstring uncpath = System::ConvertToUNC(utf8path);
Ofstream->open(uncpath.c_str(), std::ios::out | std::ios::binary);
#else
Ofstream->open(utf8path, std::ios::out | std::ios::binary);
#endif
}
Stream = Ofstream;
}
}