1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "gdcmPreamble.h"
#include <cstring> // memset
namespace gdcm
{
Preamble::Preamble():Internal(nullptr)
{
Create();
}
Preamble::~Preamble()
{
delete[] Internal;
}
std::istream &Preamble::Read(std::istream &is)
{
// \precondition: we are at beginning of Preamble
gdcmAssertAlwaysMacro( !IsEmpty() /*&& is.tellg() == 0*/ );
if( is.read(Internal, 128+4) )
{
if( Internal[128+0] == 'D'
&& Internal[128+1] == 'I'
&& Internal[128+2] == 'C'
&& Internal[128+3] == 'M')
{
return is;
}
}
// else reset everything !
delete[] Internal;
Internal = nullptr;
throw Exception( "Not a DICOM V3 file (No Preamble)" );
// \postcondition we are after the Preamble (or at the beginning of file if none)
}
void Preamble::Valid()
{
if( !Internal ) Internal = new char[128+4];
memset( Internal, 0, 128 );
memcpy( Internal+128, "DICM", 4);
}
void Preamble::Create()
{
if( !Internal ) Internal = new char[128+4];
memset( Internal, 0, 128 );
memcpy( Internal+128, "DICM", 4);
}
void Preamble::Remove()
{
delete[] Internal;
Internal = nullptr; // important
}
// \precondition we are at the beginning of file
std::ostream const &Preamble::Write(std::ostream &os) const
{
// assert ( os.tellg()+0 == 0 );
if( Internal )
{
os.write( Internal, 128+4);
}
// \postcondition a valid Preamble has been written to stream
return os;
}
void Preamble::Clear()
{
}
void Preamble::Print(std::ostream &) const
{
}
} // end namespace gdcm