+
+
+/**
+ * \brief Parses a DocEntrySet (Zero-level DocEntries or SQ Item DocEntries)
+ * @return false if file is not ACR-NEMA / PAPYRUS / DICOM
+ */
+
+long gdcmDocument::ParseES(gdcmDocEntrySet *set, long offset, long l_max, bool delim_mode) {
+
+ gdcmDocEntry *NewDocEntry = (gdcmDocEntry *)0;
+ gdcmValEntry *vl;
+ gdcmSeqEntry *sq;
+ long l;
+ while (true) {
+ NewDocEntry = ReadNextDocEntry( );
+ if (!NewDocEntry)
+ break;
+ if (NewDocEntry->GetVR() !="SQ") {
+ vl= new gdcmValEntry(NewDocEntry->GetDictEntry());
+ vl->Copy(NewDocEntry);
+ delete NewDocEntry;
+ set->AddEntry(vl);
+ if (!delim_mode && vl->isItemDelimitor())
+ break;
+
+ } else { // VR = "SQ"
+ l=NewDocEntry->GetReadLength();
+ if (l == 0xffffffff)
+ delim_mode = true;
+ else
+ delim_mode = false;
+ sq = new gdcmSeqEntry(NewDocEntry->GetDictEntry());
+ sq->Copy(NewDocEntry);
+ long lgt = ParseSQ((gdcmDocEntrySet *)sq, offset, l, delim_mode);
+ set->AddEntry(sq);
+ if ( !delim_mode && ftell(fp)-offset >= l_max)
+ break;
+ }
+ }
+ return l; // ??
+}
+
+
+
+
+long gdcmDocument::ParseSQ(gdcmDocEntrySet *set, long offset, long l_max, bool delim_mode) {
+
+ gdcmDocEntry *NewDocEntry = (gdcmDocEntry *)0;
+ gdcmSQItem *itemSQ;
+ bool dlm_mod;
+ int lgr, l, lgth;
+
+ while (true) {
+ if(delim_mode) {
+ NewDocEntry = ReadNextDocEntry();
+ if (NewDocEntry->isSequenceDelimitor())
+ // =====> ATTENTION : il faudra tout de meme ajouter
+ // le Sequence Delimiter ?!?
+ //set.Add(???);
+ break;
+ }
+ if (!delim_mode && (ftell(fp)-offset) >= l_max){
+ break;
+ }
+ itemSQ = new gdcmSQItem();
+
+ l= NewDocEntry->GetLength();
+ if (l ==0xffffffff)
+ dlm_mod = true;
+ else
+ dlm_mod=false;
+
+ lgr=ParseES(itemSQ, offset, l, dlm_mod);
+ ((gdcmSeqEntry *)set)->AddEntry(itemSQ);
+ }
+ //Update(lgth); // TODO // to go on compiling
+ return(lgth);
+}
+
+
+/**
+ * \brief Parses the header of the file and load element values.
+ * @return false if file is not ACR-NEMA / PAPYRUS / DICOM
+ */
+
+/* =======================================================================
+// Replaced by ParseSQ
+
+bool gdcmDocument::LoadHeaderEntries(bool exception_on_error) throw(gdcmFormatError) {
+ (void)exception_on_error;
+ rewind(fp);
+ if (!CheckSwap())
+ return false;
+
+ gdcmDocEntry *newDocEntry = (gdcmDocEntry *)0;
+ while ( (newDocEntry = ReadNextDocEntry()) ) {
+ SkipDocEntry(newDocEntry);
+ if ( (ignoreShadow==0) || (newDocEntry->GetGroup()%2) == 0) {
+ AddDocEntry(newDocEntry);
+ }
+ }
+ rewind(fp);
+ // Be carefull : merging this two loops may cause troubles ...
+ for (ListTag::iterator i = GetListEntry().begin();
+ i != GetListEntry().end();
+ ++i)
+ {
+ LoadDocEntry(*i);
+ }
+ rewind(fp);
+
+ // Load 'non string' values
+
+
+ // --------------------------------------------------------------
+ // Special Patch to allow gdcm to read ACR-LibIDO formated images
+ //
+ // if recognition code tells us we deal with a LibIDO image
+ // we switch lineNumber and columnNumber
+ //
+ std::string RecCode;
+ RecCode = GetEntryByNumber(0x0008, 0x0010); // recognition code
+ if (RecCode == "ACRNEMA_LIBIDO_1.1" ||
+ RecCode == "CANRME_AILIBOD1_1." ) // for brain-damaged softwares
+ // with "little-endian strings"
+ {
+ filetype = ACR_LIBIDO;
+ std::string rows = GetEntryByNumber(0x0028, 0x0010);
+ std::string columns = GetEntryByNumber(0x0028, 0x0011);
+ SetEntryByNumber(columns, 0x0028, 0x0010);
+ SetEntryByNumber(rows , 0x0028, 0x0011);
+ }
+ // ----------------- End of Special Patch ----------------
+ return true;
+}
+======================================================================= */
+
+