X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=inline;f=src%2FgdcmDocument.cxx;h=fa1d4a7d8d494cd55aa2c6aaba2f0a204cd94227;hb=d25c25666b3d84678bbb8c178000a583c71a2db4;hp=3e3c3ac1bdf1d3ef6ce2a8f5050ab5379481d4fe;hpb=61e1a3e0ce5480990a0d0b844cf0e86d1775306d;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 3e3c3ac1..fa1d4a7d 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -1,5 +1,20 @@ -// gdcmDocument.cxx -//----------------------------------------------------------------------------- +/*========================================================================= + + Program: gdcm + Module: $RCSfile: gdcmDocument.cxx,v $ + Language: C++ + Date: $Date: 2004/06/21 12:38:29 $ + Version: $Revision: 1.21 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/Gdcm/License.htm 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 notices for more information. + +=========================================================================*/ #include "gdcmDocument.h" #include "gdcmValEntry.h" @@ -80,23 +95,23 @@ const unsigned int gdcmDocument::MAX_SIZE_PRINT_ELEMENT_VALUE = 64; * with a FALSE value for the 'enable_sequence' param. * ('public elements' may be embedded in 'shadow Sequences') */ -gdcmDocument::gdcmDocument(const char *inFilename, - bool exception_on_error, - bool enable_sequences, - bool ignore_shadow) +gdcmDocument::gdcmDocument(std::string const & inFilename, + bool exception_on_error, + bool enable_sequences, + bool ignore_shadow) : gdcmElementSet(-1) { enableSequences=enable_sequences; - ignoreShadow =ignore_shadow; + IgnoreShadow =ignore_shadow; SetMaxSizeLoadEntry(MAX_SIZE_LOAD_ELEMENT_VALUE); - filename = inFilename; + Filename = inFilename; Initialise(); if ( !OpenFile(exception_on_error)) return; dbg.Verbose(0, "gdcmDocument::gdcmDocument: starting parsing of file: ", - filename.c_str()); + Filename.c_str()); rewind(fp); fseek(fp,0L,SEEK_END); @@ -110,6 +125,7 @@ gdcmDocument::gdcmDocument(const char *inFilename, SQDepthLevel=0; long l=ParseDES( this, beg, lgt, false); // le Load sera fait a la volee + (void)l; //is l used anywhere ? CloseFile(); // -------------------------------------------------------------- @@ -124,7 +140,7 @@ gdcmDocument::gdcmDocument(const char *inFilename, RecCode == "CANRME_AILIBOD1_1." ) // for brain-damaged softwares // with "little-endian strings" { - filetype = gdcmACR_LIBIDO; + Filetype = gdcmACR_LIBIDO; std::string rows = GetEntryByNumber(0x0028, 0x0010); std::string columns = GetEntryByNumber(0x0028, 0x0011); SetEntryByNumber(columns, 0x0028, 0x0010); @@ -227,7 +243,7 @@ bool gdcmDocument::SetShaDict(DictKey dictName){ * false otherwise. */ bool gdcmDocument::IsReadable(void) { - if(filetype==gdcmUnknown) { + if(Filetype==gdcmUnknown) { dbg.Verbose(0, "gdcmDocument::IsReadable: wrong filetype"); return(false); } @@ -410,7 +426,7 @@ bool gdcmDocument::IsDicomV3(void) { * @return the FileType code */ FileType gdcmDocument::GetFileType(void) { - return(filetype); + return Filetype; } /** @@ -421,7 +437,7 @@ FileType gdcmDocument::GetFileType(void) { FILE *gdcmDocument::OpenFile(bool exception_on_error) throw(gdcmFileError) { - fp=fopen(filename.c_str(),"rb"); + fp=fopen(Filename.c_str(),"rb"); if(!fp) { @@ -429,11 +445,9 @@ FILE *gdcmDocument::OpenFile(bool exception_on_error) throw gdcmFileError("gdcmDocument::gdcmDocument(const char *, bool)"); else { - std::cout <<"gdcmDocument::OpenFile cannot open file: " - << filename.c_str() << std::endl; dbg.Verbose(0, "gdcmDocument::OpenFile cannot open file: ", - filename.c_str()); - return (NULL); + Filename.c_str()); + return NULL; } } @@ -444,22 +458,22 @@ FILE *gdcmDocument::OpenFile(bool exception_on_error) //ACR -- or DICOM with no Preamble -- if( zero == 0x0008 || zero == 0x0800 || zero == 0x0002 || zero == 0x0200) - return(fp); + return fp; //DICOM fseek(fp, 126L, SEEK_CUR); char dicm[4]; fread(dicm, (size_t)4, (size_t)1, fp); if( memcmp(dicm, "DICM", 4) == 0 ) - return(fp); + return fp; fclose(fp); - dbg.Verbose(0, "gdcmDocument::OpenFile not DICOM/ACR", filename.c_str()); + dbg.Verbose(0, "gdcmDocument::OpenFile not DICOM/ACR", Filename.c_str()); } else { - dbg.Verbose(0, "gdcmDocument::OpenFile cannot open file", filename.c_str()); + dbg.Verbose(0, "gdcmDocument::OpenFile cannot open file", Filename.c_str()); } - return(NULL); + return NULL; } /** @@ -543,7 +557,7 @@ bool gdcmDocument::Write(FILE *fp, FileType type) { */ WriteEntries(fp,type); - return(true); + return true; } /** @@ -559,7 +573,8 @@ bool gdcmDocument::Write(FILE *fp, FileType type) { gdcmValEntry * gdcmDocument::ReplaceOrCreateByNumber( std::string Value, guint16 Group, - guint16 Elem ){ + guint16 Elem ) +{ gdcmDocEntry* CurrentEntry; gdcmValEntry* ValEntry; @@ -572,7 +587,7 @@ gdcmValEntry * gdcmDocument::ReplaceOrCreateByNumber( { dbg.Verbose(0, "gdcmDocument::ReplaceOrCreateByNumber: call to" " NewDocEntryByNumber failed."); - return (gdcmValEntry *)0; + return NULL; } ValEntry = new gdcmValEntry(CurrentEntry); if ( !AddEntry(ValEntry)) @@ -592,13 +607,13 @@ gdcmValEntry * gdcmDocument::ReplaceOrCreateByNumber( { dbg.Verbose(0, "gdcmDocument::ReplaceOrCreateByNumber: removal" " of previous DocEntry failed."); - return (gdcmValEntry *)0; + return NULL; } if ( !AddEntry(ValEntry)) { dbg.Verbose(0, "gdcmDocument::ReplaceOrCreateByNumber: adding" " promoted ValEntry failed."); - return (gdcmValEntry *)0; + return NULL; } } } @@ -630,12 +645,14 @@ gdcmBinEntry * gdcmDocument::ReplaceOrCreateByNumber( a =NewBinEntryByNumber(Group, Elem); if (a == NULL) return NULL; + b = new gdcmBinEntry(a); AddEntry(b); } SetEntryByNumber(voidArea, lgth, Group, Elem); b->SetVoidArea(voidArea); - return (gdcmBinEntry*)b; + + return b; } @@ -666,7 +683,7 @@ bool gdcmDocument::ReplaceIfExistByNumber(char* Value, guint16 Group, guint16 El */ int gdcmDocument::CheckIfEntryExistByNumber(guint16 group, guint16 element ) { std::string key = gdcmDictEntry::TranslateToKey(group, element ); - return (tagHT.count(key)); + return tagHT.count(key); } /** @@ -683,7 +700,7 @@ std::string gdcmDocument::GetEntryByName(std::string tagName) { if( dictEntry == NULL) return GDCM_UNFOUND; - return(GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement())); + return GetEntryByNumber(dictEntry->GetGroup(),dictEntry->GetElement()); } /** @@ -772,8 +789,8 @@ bool gdcmDocument::SetEntryByName(std::string content,std::string tagName) { if( dictEntry == NULL) return false; - return(SetEntryByNumber(content,dictEntry->GetGroup(), - dictEntry->GetElement())); + return SetEntryByNumber(content,dictEntry->GetGroup(), + dictEntry->GetElement()); } /** @@ -827,6 +844,7 @@ bool gdcmDocument::SetEntryByNumber(void *content, guint16 group, guint16 element) { + (void)lgth; //not used TagKey key = gdcmDictEntry::TranslateToKey(group, element); if ( ! tagHT.count(key)) return false; @@ -881,8 +899,7 @@ size_t gdcmDocument::GetEntryOffsetByNumber(guint16 Group, guint16 Elem) gdcmDocEntry* Entry = GetDocEntryByNumber(Group, Elem); if (!Entry) { - dbg.Verbose(1, "gdcmDocument::GetDocEntryByNumber", - "failed to Locate gdcmDocEntry"); + dbg.Verbose(1, "gdcmDocument::GetDocEntryByNumber: no entry present."); return (size_t)0; } return Entry->GetOffset(); @@ -900,8 +917,7 @@ void * gdcmDocument::GetEntryVoidAreaByNumber(guint16 Group, guint16 Elem) gdcmDocEntry* Entry = GetDocEntryByNumber(Group, Elem); if (!Entry) { - dbg.Verbose(1, "gdcmDocument::GetDocEntryByNumber", - "failed to Locate gdcmDocEntry"); + dbg.Verbose(1, "gdcmDocument::GetDocEntryByNumber: no entry"); return (NULL); } return ((gdcmBinEntry *)Entry)->GetVoidArea(); @@ -920,11 +936,12 @@ void *gdcmDocument::LoadEntryVoidArea(guint16 Group, guint16 Elem) return NULL; size_t o =(size_t)Element->GetOffset(); fseek(fp, o, SEEK_SET); - size_t l=Element->GetLength(); + size_t l = Element->GetLength(); char* a = new char[l]; - if(!a) + if(!a) { + dbg.Verbose(0, "gdcmDocument::LoadEntryVoidArea cannot allocate a"); return NULL; - + } SetEntryVoidAreaByNumber(a, Group, Elem); /// \todo check the result size_t l2 = fread(a, 1, l ,fp); @@ -962,7 +979,7 @@ bool gdcmDocument::SetEntryVoidAreaByNumber(void * area, * Only non even entries are analyzed */ void gdcmDocument::UpdateShaEntries(void) { - gdcmDictEntry *entry; + //gdcmDictEntry *entry; std::string vr; /// \todo TODO : still any use to explore recursively the whole structure? @@ -1141,12 +1158,12 @@ void gdcmDocument::WriteEntryTagVRLength(gdcmDocEntry *tag, */ // \todo TODO : to be re -written recursively ! -void gdcmDocument::WriteEntryValue(gdcmDocEntry *tag, FILE *_fp,FileType type) +void gdcmDocument::WriteEntryValue(gdcmDocEntry *Entry, FILE *_fp,FileType type) { (void)type; - guint16 group = tag->GetGroup(); - VRKey vr = tag->GetVR(); - guint32 lgr = tag->GetReadLength(); + guint16 group = Entry->GetGroup(); + VRKey vr = Entry->GetVR(); + guint32 lgr = Entry->GetReadLength(); if (vr == "SQ") // SeQuences have no value: @@ -1155,15 +1172,9 @@ void gdcmDocument::WriteEntryValue(gdcmDocEntry *tag, FILE *_fp,FileType type) // Delimiters have no associated value: return; - //-------------------------------- - // - // FIXME :right now, both value and voidArea belong to gdcmValue - // - // ------------------------------- - -// if (gdcmBinEntry* BinEntry = dynamic_cast< gdcmBinEntry* >(tag) ) { +// if (gdcmBinEntry* BinEntry = dynamic_cast< gdcmBinEntry* >(Entry) ) { void *voidArea; - gdcmBinEntry *BinEntry= (gdcmBinEntry *)tag;; + gdcmBinEntry *BinEntry= (gdcmBinEntry *)Entry;; voidArea = BinEntry->GetVoidArea(); if (voidArea != NULL) { // there is a 'non string' LUT, overlay, etc @@ -1179,7 +1190,7 @@ void gdcmDocument::WriteEntryValue(gdcmDocEntry *tag, FILE *_fp,FileType type) // we split the string and write each value as a short int std::vector tokens; tokens.erase(tokens.begin(),tokens.end()); // clean any previous value - Tokenize (((gdcmValEntry *)tag)->GetValue(), tokens, "\\"); + Tokenize (((gdcmValEntry *)Entry)->GetValue(), tokens, "\\"); for (unsigned int i=0; i tokens; tokens.erase(tokens.begin(),tokens.end()); // clean any previous value - Tokenize (((gdcmValEntry *)tag)->GetValue(), tokens, "\\"); + Tokenize (((gdcmValEntry *)Entry)->GetValue(), tokens, "\\"); for (unsigned int i=0; iGetValue().c_str(), + fwrite (((gdcmValEntry *)Entry)->GetValue().c_str(), (size_t)lgr ,(size_t)1, _fp); // Elem value } @@ -1239,6 +1250,7 @@ bool gdcmDocument::WriteEntry(gdcmDocEntry *tag, FILE *_fp,FileType type) if (gdcmBinEntry* BinEntry = dynamic_cast< gdcmBinEntry* >(tag) ) { + (void)BinEntry; //not used /// \todo FIXME : when voidArea belong to gdcmBinEntry only, fix /// voidArea length // @@ -1254,6 +1266,8 @@ bool gdcmDocument::WriteEntry(gdcmDocEntry *tag, FILE *_fp,FileType type) WriteEntryValue(tag, _fp, type); return true; } + + return false; //default behavior ? } /** @@ -1370,7 +1384,7 @@ long gdcmDocument::ParseDES(gdcmDocEntrySet *set, long offset, long l_max, bool gdcmBinEntry *bn; gdcmSeqEntry *sq; VRKey vr; - long l; + unsigned long l; int depth; depth = set->GetDepthLevel(); @@ -1454,6 +1468,7 @@ long gdcmDocument::ParseDES(gdcmDocEntrySet *set, long offset, long l_max, bool long lgt = ParseSQ( sq, NewDocEntry->GetOffset(), l, delim_mode); + (void)lgt; //not used... } // FIXME : on en fait quoi, de lgt ? set->AddEntry(sq); @@ -1479,8 +1494,10 @@ long gdcmDocument::ParseSQ(gdcmSeqEntry *set, gdcmDocEntry *NewDocEntry = (gdcmDocEntry *)0; gdcmSQItem *itemSQ; bool dlm_mod; - int lgr, l, lgth; + int lgr, lgth; + unsigned int l; int depth = set->GetDepthLevel(); + (void)depth; //not used while (true) { NewDocEntry = ReadNextDocEntry(); @@ -1641,7 +1658,7 @@ void gdcmDocument::LoadDocEntry(gdcmDocEntry *Entry) guint16 length16; - if ( (filetype == gdcmExplicitVR) && (! Entry->IsImplicitVR()) ) + if ( (Filetype == gdcmExplicitVR) && (! Entry->IsImplicitVR()) ) { if ( (vr=="OB") || (vr=="OW") || (vr=="SQ") || (vr=="UN") ) { @@ -1748,7 +1765,7 @@ void gdcmDocument::LoadDocEntry(gdcmDocEntry *Entry) */ void gdcmDocument::FindDocEntryVR( gdcmDocEntry *Entry) { - if (filetype != gdcmExplicitVR) + if (Filetype != gdcmExplicitVR) return; char VR[3]; @@ -2180,7 +2197,7 @@ bool gdcmDocument::IsDocEntryAnInteger(gdcmDocEntry *Entry) { * (swaps it depending on processor endianity) * @return read value */ -guint16 gdcmDocument::ReadInt16(void) { +guint16 gdcmDocument::ReadInt16() { guint16 g; size_t item_read; item_read = fread (&g, (size_t)2,(size_t)1, fp); @@ -2200,7 +2217,7 @@ guint16 gdcmDocument::ReadInt16(void) { * (swaps it depending on processor endianity) * @return read value */ -guint32 gdcmDocument::ReadInt32(void) { +guint32 gdcmDocument::ReadInt32() { guint32 g; size_t item_read; item_read = fread (&g, (size_t)4,(size_t)1, fp); @@ -2232,7 +2249,7 @@ void gdcmDocument::SkipBytes(guint32 NBytes) { void gdcmDocument::Initialise(void) { RefPubDict = gdcmGlobal::GetDicts()->GetDefaultPubDict(); - RefShaDict = (gdcmDict*)0; + RefShaDict = NULL; } /** @@ -2305,13 +2322,13 @@ bool gdcmDocument::CheckSwap() { // Use gdcmDocument::dicom_vr to test all the possibilities // instead of just checking for UL, OB and UI !? group 0000 { - filetype = gdcmExplicitVR; + Filetype = gdcmExplicitVR; dbg.Verbose(1, "gdcmDocument::CheckSwap:", "explicit Value Representation"); } else { - filetype = gdcmImplicitVR; + Filetype = gdcmImplicitVR; dbg.Verbose(1, "gdcmDocument::CheckSwap:", "not an explicit Value Representation"); } @@ -2356,19 +2373,19 @@ bool gdcmDocument::CheckSwap() { switch (s32) { case 0x00040000 : sw = 3412; - filetype = gdcmACR; + Filetype = gdcmACR; return true; case 0x04000000 : sw = 4321; - filetype = gdcmACR; + Filetype = gdcmACR; return true; case 0x00000400 : sw = 2143; - filetype = gdcmACR; + Filetype = gdcmACR; return true; case 0x00000004 : sw = 0; - filetype = gdcmACR; + Filetype = gdcmACR; return true; default : @@ -2394,18 +2411,18 @@ bool gdcmDocument::CheckSwap() { case 0x0004 : case 0x0008 : sw = 0; - filetype = gdcmACR; + Filetype = gdcmACR; return true; case 0x0200 : case 0x0400 : case 0x0800 : sw = 4321; - filetype = gdcmACR; + Filetype = gdcmACR; return true; default : dbg.Verbose(0, "gdcmDocument::CheckSwap:", "ACR/NEMA unfound swap info (Really hopeless !)"); - filetype = gdcmUnknown; + Filetype = gdcmUnknown; return false; } @@ -2812,7 +2829,7 @@ void gdcmDocument::Parse7FE0 (void) // BTW, what is the purpous of those length anyhow !? char * BasicOffsetTableItemValue = new char[ItemLength + 1]; fread(BasicOffsetTableItemValue, ItemLength, 1, fp); - for (int i=0; i < ItemLength; i += 4){ + for (unsigned int i=0; i < ItemLength; i += 4){ guint32 IndividualLength; IndividualLength = str2num(&BasicOffsetTableItemValue[i],guint32); std::ostringstream s; @@ -2827,7 +2844,7 @@ void gdcmDocument::Parse7FE0 (void) // JPEG Image //// We then skip (not reading them) all the fragments of images: - while ( ItemLength = ReadItemTagLength() ) + while ( (ItemLength = ReadItemTagLength()) ) { SkipBytes(ItemLength); } @@ -2840,7 +2857,7 @@ void gdcmDocument::Parse7FE0 (void) long RleSegmentLength[15], fragmentLength; // while 'Sequence Delimiter Item' (fffe,e0dd) not found - while ( fragmentLength = ReadSequenceDelimiterTagLength() ) + while ( (fragmentLength = ReadSequenceDelimiterTagLength()) ) { // Parse fragments of the current Fragment (Frame) //------------------ scanning (not reading) fragment pixels @@ -2879,7 +2896,6 @@ void gdcmDocument::Parse7FE0 (void) SkipBytes(RleSegmentLength[nbRleSegments]); } } - return; } /** @@ -2889,47 +2905,49 @@ void gdcmDocument::Parse7FE0 (void) * @param document * @return true if 'smaller' */ - bool gdcmDocument::operator<(gdcmDocument &document){ +bool gdcmDocument::operator<(gdcmDocument &document) +{ std::string s1,s2; // Patient Name s1=this->GetEntryByNumber(0x0010,0x0010); s2=document.GetEntryByNumber(0x0010,0x0010); if(s1 < s2) - return(true); + return true; else if(s1 > s2) - return(false); + return false; else { // Patient ID s1=this->GetEntryByNumber(0x0010,0x0020); s2=document.GetEntryByNumber(0x0010,0x0020); if (s1 < s2) - return(true); + return true; else if (s1 > s2) - return(1); + return true; else { // Study Instance UID s1=this->GetEntryByNumber(0x0020,0x000d); s2=document.GetEntryByNumber(0x0020,0x000d); if (s1 < s2) - return(true); + return true; else if(s1 > s2) - return(false); + return false; else { // Serie Instance UID s1=this->GetEntryByNumber(0x0020,0x000e); s2=document.GetEntryByNumber(0x0020,0x000e); if (s1 < s2) - return(true); + return true; else if(s1 > s2) - return(false); + return false; } } } - return(false); + + return false; }