X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=481752945178cfb211ee4640383a2eca0aab537b;hb=f7276083b636d98a16f347fde5916a3fca6855db;hp=d4410d1b47a6ca947374137ca51b9c5e360ebba2;hpb=2bfcd91b06ec416462da3f080917576cc8793c18;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index d4410d1b..48175294 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/10/23 15:28:26 $ - Version: $Revision: 1.303 $ + Date: $Date: 2005/10/26 17:06:33 $ + Version: $Revision: 1.312 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -386,7 +386,8 @@ FileType Document::GetFileType() * \brief Accessor to the Transfer Syntax (when present) of the * current document (it internally handles reading the * value from disk when only parsing occured). - * @return The encountered Transfer Syntax of the current document. + * @return The encountered Transfer Syntax of the current document, if DICOM. + * GDCM_UNKNOWN for ACR-NEMA files (or broken headers ...) */ std::string Document::GetTransferSyntax() { @@ -500,6 +501,43 @@ uint32_t Document::SwapLong(uint32_t a) return a; } +/** + * \brief Swaps back the bytes of 8-byte long 'double' accordingly to + * processor order. + * @return The properly swaped 64 bits double. + */ +double Document::SwapDouble(double a) +{ + switch (SwapCode) + { + // There were no 'double' at ACR-NEMA time. + // We just have to deal with 'straight Little Endian' and + // 'straight Big Endian' + case 1234 : + break; + case 4321 : + { + char *beg = (char *)&a; + char *end = beg + 7; + char t; + for (unsigned int i = 0; i<7; i++) + { + t = *beg; + *beg = *end; + *end = t; + beg++, + end--; + } + } + break; + default : + gdcmErrorMacro( "Unset swap code:" << SwapCode ); + a = 0.; + } + return a; +} + + // // -----------------File I/O --------------- /** @@ -605,7 +643,7 @@ void Document::WriteContent(std::ofstream *fp, FileType filetype) // Skip if user wants to write an ACR-NEMA file if ( filetype == ImplicitVR || filetype == ExplicitVR || - filetype == JPEG ) + filetype == JPEG ) { // writing Dicom File Preamble char filePreamble[128]; @@ -718,10 +756,9 @@ void Document::LoadEntryBinArea(DataEntry *entry) } case 8: { - gdcmWarningMacro("Can't swap 64 bits data"); -/* uint64_t *data64 = (uint64_t *)data; + double *data64 = (double *)data; for(i=0;iGetGroup(), - // newDocEntry->GetElement(), - // newDocEntry->GetVR().c_str() ); + if( Debug::GetDebugFlag() ) + std::cerr<GetKey()<<" "<GetVR()<Delete(); // Load only if we can add (not a duplicate key) LoadDocEntry( newDataEntry ); } @@ -1057,7 +1094,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, (!delim_mode && ((long)(Fp->tellg())-offset) >= l_max) ) { if ( !used ) - delete newDocEntry; + newDocEntry->Delete(); break; } @@ -1087,7 +1124,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, if ( newDocEntry->GetGroup()%2 != 0 ) { Fp->seekg( l, std::ios::cur); - delete newDocEntry; // Delete, not in the set + newDocEntry->Delete(); // Delete, not in the set continue; } } @@ -1095,7 +1132,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, { // User asked to skip *any* SeQuence Fp->seekg( l, std::ios::cur); - delete newDocEntry; // Delete, not in the set + newDocEntry->Delete(); // Delete, not in the set continue; } // delay the dynamic cast as late as possible @@ -1144,18 +1181,22 @@ void Document::ParseDES(DocEntrySet *set, long offset, << newSeqEntry->GetOffset() << " )" ); used = false; } + else + { + newDocEntry->Delete(); + } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { if ( !used ) - delete newDocEntry; - break; + newDocEntry->Delete(); + break; } } // end SeqEntry : VR = "SQ" if ( !used ) { - delete newDocEntry; + newDocEntry->Delete(); } first = false; } // end While @@ -1189,16 +1230,17 @@ void Document::ParseSQ( SeqEntry *seqEntry, if ( newDocEntry->IsSequenceDelimitor() ) { seqEntry->SetDelimitationItem( newDocEntry ); + newDocEntry->Delete(); break; } } if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { - delete newDocEntry; + newDocEntry->Delete(); break; } // create the current SQItem - SQItem *itemSQ = new SQItem( seqEntry->GetDepthLevel() ); + SQItem *itemSQ = SQItem::New( seqEntry->GetDepthLevel() ); unsigned int l = newDocEntry->GetReadLength(); if ( l == 0xffffffff ) @@ -1212,7 +1254,6 @@ void Document::ParseSQ( SeqEntry *seqEntry, // Let's try :------------ // remove fff0,e000, created out of the SQItem - delete newDocEntry; Fp->seekg(offsetStartCurrentSQItem, std::ios::beg); // fill up the current SQItem, starting at the beginning of fff0,e000 @@ -1222,6 +1263,8 @@ void Document::ParseSQ( SeqEntry *seqEntry, // end try ----------------- seqEntry->AddSQItem( itemSQ, SQItemNumber ); + itemSQ->Delete(); + newDocEntry->Delete(); SQItemNumber++; if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max ) { @@ -1240,7 +1283,7 @@ DocEntry *Document::Backtrack(DocEntry *docEntry) { // delete the Item Starter, built erroneously out of any Sequence // it's not yet in the HTable/chained list - delete docEntry; + docEntry->Delete(); // Get all info we can from PreviousDocEntry uint16_t group = PreviousDocEntry->GetGroup(); @@ -1495,10 +1538,11 @@ VRKey Document::FindDocEntryVR() VRKey vr; Fp->read(&(vr[0]),(size_t)2); - gdcmDebugMacro( "--> VR: " << vr ) + //gdcmDebugMacro( "--> VR: " << vr ) if ( !CheckDocEntryVR(vr) ) { - gdcmWarningMacro( "Unknown VR '" << vr << "'" ) + gdcmWarningMacro( "Unknown VR '" << vr << "' at offset :" + << positionOnEntry ); Fp->seekg(positionOnEntry, std::ios::beg); return GDCM_VRUNKNOWN; } @@ -1975,7 +2019,7 @@ DocEntry *Document::ReadNextDocEntry() } } } - gdcmDebugMacro( "Found VR: " << vr << " / Real VR: " << realVR ); + // gdcmDebugMacro( "Found VR: " << vr << " / Real VR: " << realVR ); DocEntry *newEntry; if ( Global::GetVR()->IsVROfSequence(realVR) ) @@ -2012,7 +2056,7 @@ DocEntry *Document::ReadNextDocEntry() catch ( FormatError ) { // Call it quits - delete newEntry; + newEntry->Delete(); return 0; }