X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=3386f159c86a72b0bc6a036ab8a3e551fcefb18d;hb=fbd2698cb0545343abc2d8aefe92bab1f5b3eaa3;hp=5ce5f5769ba9a4df2ba73308bad28385668d0732;hpb=a6152ede9f919769745b51f8fe560251a20c6a1a;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index 5ce5f576..3386f159 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2005/07/06 00:15:11 $ - Version: $Revision: 1.256 $ + Date: $Date: 2005/07/07 16:37:40 $ + Version: $Revision: 1.262 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -62,11 +62,13 @@ Document::Document() // Load will set it to true if sucessfull Group0002Parsed = false; IsDocumentAlreadyLoaded = false; + IsDocumentModified = true; LoadMode = 0x00000000; // default : load everything, later + SetFileName(""); } /** - * \brief Constructor (not to break the API) + * \brief Constructor (DEPRECATED : not to break the API) * @param fileName 'Document' (File or DicomDir) to be open for parsing */ Document::Document( std::string const &fileName ) @@ -83,8 +85,10 @@ Document::Document( std::string const &fileName ) // Load will set it to true if sucessfull IsDocumentAlreadyLoaded = false; + IsDocumentModified = true; - Load(fileName); + SetFileName(fileName); + Load( ); } /** * \brief Canonical destructor. @@ -99,26 +103,57 @@ Document::~Document () // Public /** - * \brief Loader - * @param fileName 'Document' (File or DicomDir) to be open for parsing + * \brief Loader. use SetLoadMode(), SetFileName() before ! * @return false if file cannot be open or no swap info was found, * or no tag was found. */ -bool Document::Load( std::string const &fileName ) +bool Document::Load( ) { - // We should clean out anything that already exists. - // Check IsDocumentAlreadyLoaded to be sure. - if ( IsDocumentAlreadyLoaded ) + if ( GetFileName() == "" ) { - gdcmWarningMacro( "A file was already parsed inside this " - << "gdcm::Document (previous name was: " - << Filename.c_str() << ". New name is :" - << fileName ); - // todo : clean out the 'Document' - // Should we call ClearEntry() on the parent object ?!? + gdcmWarningMacro( "Use SetFileName, before !" ); + return false; } - + return DoTheLoadingDocumentJob( ); +} +/** + * \brief Loader. (DEPRECATED : not to break the API) + * @param fileName 'Document' (File or DicomDir) to be open for parsing + * @return false if file cannot be open or no swap info was found, + * or no tag was found. + */ +bool Document::Load( std::string const &fileName ) +{ Filename = fileName; + return DoTheLoadingDocumentJob( ); +} + +/** + * \brief Performs the Loading Job (internal use only) + * @return false if file cannot be open or no swap info was found, + * or no tag was found. + */ +bool Document::DoTheLoadingDocumentJob( ) +{ + if ( ! IsDocumentModified ) // Nothing to do ! + return true; + + // if ( Filename == fileName ) + // { + // gdcmWarningMacro( "The file was already parsed inside this " + // << "gdcm::Document (its name is: " + // << Filename.c_str() ); + // return true; + // } + + //gdcmWarningMacro( "A file was already parsed inside this " + // << "gdcm::Document (previous name was: " + // << Filename.c_str() << ". New name is :" + // << fileName ); + // clean out the Entries, if already parsed + // (probabely a mistake from the user) + + ClearEntry(); Fp = 0; if ( !OpenFile() ) @@ -858,7 +893,7 @@ void Document::Initialize() * \brief Parses a DocEntrySet (Zero-level DocEntries or SQ Item DocEntries) * @param set DocEntrySet we are going to parse ('zero level' or a SQItem) * @param offset start of parsing - * @param l_max length to parse + * @param l_max length to parse (meaningless when we are in 'delimitor mode') * @param delim_mode : whether we are in 'delimitor mode' (l=0xffffff) or not */ void Document::ParseDES(DocEntrySet *set, long offset, @@ -879,7 +914,6 @@ void Document::ParseDES(DocEntrySet *set, long offset, break; } - used = true; newDocEntry = ReadNextDocEntry( ); if ( !newDocEntry ) @@ -887,15 +921,16 @@ void Document::ParseDES(DocEntrySet *set, long offset, break; } - vr = newDocEntry->GetVR(); + used = true; newValEntry = dynamic_cast(newDocEntry); newBinEntry = dynamic_cast(newDocEntry); - newSeqEntry = dynamic_cast(newDocEntry); - if ( newValEntry || newBinEntry ) + if ( newValEntry || newBinEntry ) { + //////////////////////////// ContentEntry if ( newBinEntry ) { + vr = newDocEntry->GetVR(); if ( Filetype == ExplicitVR && !Global::GetVR()->IsVROfBinaryRepresentable(vr) ) { @@ -907,6 +942,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, } //////////////////// BinEntry or UNKOWN VR: + // When "this" is a Document the Key is simply of the // form ( group, elem )... if ( dynamic_cast< Document* > ( set ) ) @@ -916,21 +952,26 @@ void Document::ParseDES(DocEntrySet *set, long offset, // but when "this" is a SQItem, we are inserting this new // valEntry in a sequence item, and the key has the // generalized form (refer to \ref BaseTagKey): - if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) - { - newBinEntry->SetKey( parentSQItem->GetBaseTagKey() - + newBinEntry->GetKey() ); - } - LoadDocEntry( newBinEntry ); + // time waste hunting + //if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) + //{ + // newBinEntry->SetKey( parentSQItem->GetBaseTagKey() + // + newBinEntry->GetKey() ); + //} + if ( !set->AddEntry( newBinEntry ) ) { - //Expect big troubles if here - //delete newBinEntry; - gdcmWarningMacro("in ParseDES : shouldn't get here !"); - used=false; + gdcmWarningMacro( "in ParseDES : cannot add a BinEntry " + << newBinEntry->GetKey() ); + used=false; } - } + else + { + // Load only if we can add (not a duplicate key) + LoadDocEntry( newBinEntry ); + } + } // end BinEntry else { /////////////////////// ValEntry @@ -944,14 +985,13 @@ void Document::ParseDES(DocEntrySet *set, long offset, // ...but when "set" is a SQItem, we are inserting this new // valEntry in a sequence item. Hence the key has the // generalized form (refer to \ref BaseTagKey): - if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) - { - newValEntry->SetKey( parentSQItem->GetBaseTagKey() - + newValEntry->GetKey() ); - } - - LoadDocEntry( newValEntry ); - bool delimitor=newValEntry->IsItemDelimitor(); + + // time waste hunting + //if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) + //{ + // newValEntry->SetKey( parentSQItem->GetBaseTagKey() + // + newValEntry->GetKey() ); + //} if ( LoadMode & NO_SHADOW ) // User asked to skip, if possible, // shadow groups ( if possible : @@ -976,18 +1016,20 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( !set->AddEntry( newValEntry ) ) { - // If here expect big troubles - // delete newValEntry; //otherwise mem leak + gdcmWarningMacro( "in ParseDES : cannot add a ValEntry " + << newValEntry->GetKey() ); used=false; } - - if (delimitor) + else { - if ( !used ) - delete newDocEntry; - break; + // Load only if we can add (not a duplicate key) + LoadDocEntry( newValEntry ); } - if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max ) + + bool delimitor=newValEntry->IsItemDelimitor(); + + if ( delimitor || + (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) { if ( !used ) delete newDocEntry; @@ -1032,8 +1074,10 @@ void Document::ParseDES(DocEntrySet *set, long offset, used = false; continue; } + // delay the dynamic cast as late as possible + newSeqEntry = dynamic_cast(newDocEntry); - // no other way to create it ... + // no other way to create the Delimitor ... newSeqEntry->SetDelimitorMode( delim_mode_intern ); // At the top of the hierarchy, stands a Document. When "set" @@ -1048,11 +1092,14 @@ void Document::ParseDES(DocEntrySet *set, long offset, // But when "set" is already a SQItem, we are building a nested // sequence, and hence the depth level of the new SeqEntry // we are building, is one level deeper: + + // time waste hunting if (SQItem *parentSQItem = dynamic_cast< SQItem* > ( set ) ) { newSeqEntry->SetDepthLevel( parentSQItem->GetDepthLevel() + 1 ); - newSeqEntry->SetKey( parentSQItem->GetBaseTagKey() - + newSeqEntry->GetKey() ); + + // newSeqEntry->SetKey( parentSQItem->GetBaseTagKey() + // + newSeqEntry->GetKey() ); } if ( l != 0 ) @@ -1063,6 +1110,8 @@ void Document::ParseDES(DocEntrySet *set, long offset, } if ( !set->AddEntry( newSeqEntry ) ) { + gdcmWarningMacro( "in ParseDES : cannot add a SeqEntry " + << newSeqEntry->GetKey() ); used = false; } @@ -1072,11 +1121,11 @@ void Document::ParseDES(DocEntrySet *set, long offset, delete newDocEntry; break; } - } + } // end SeqEntry : VR = "SQ" if ( !used ) delete newDocEntry; - } + } // end While } /** @@ -1116,12 +1165,14 @@ void Document::ParseSQ( SeqEntry *seqEntry, } // create the current SQItem SQItem *itemSQ = new SQItem( seqEntry->GetDepthLevel() ); +/* std::ostringstream newBase; newBase << seqEntry->GetKey() << "/" << SQItemNumber << "#"; itemSQ->SetBaseTagKey( newBase.str() ); +*/ unsigned int l = newDocEntry->GetReadLength(); if ( l == 0xffffffff )