+/**
+ * \brief Parses a DocEntrySet (Zero-level DocEntries or SQ Item DocEntries)
+ * @return length of the parsed set.
+ */
+
+long gdcmDocument::ParseDES(gdcmDocEntrySet *set,
+ long offset,
+ long l_max,
+ bool delim_mode)
+{
+ gdcmDocEntry *newDocEntry = 0;
+ gdcmValEntry *newValEntry = 0;
+ unsigned long l = 0;
+
+ int depth = set->GetDepthLevel();
+ while (true)
+ {
+ if ( !delim_mode && (ftell(Fp)-offset) >= l_max)
+ {
+ break;
+ }
+ newDocEntry = ReadNextDocEntry( );
+ if ( !newDocEntry )
+ {
+ break;
+ }
+
+ gdcmVRKey vr = newDocEntry->GetVR();
+ if ( vr != "SQ" )
+ {
+
+ if ( gdcmGlobal::GetVR()->IsVROfGdcmStringRepresentable(vr) )
+ {
+ /////// ValEntry
+ newValEntry = new gdcmValEntry(newDocEntry->GetDictEntry());
+ newValEntry->Copy(newDocEntry);
+ newValEntry->SetDepthLevel(depth);
+ set->AddEntry(newValEntry);
+ LoadDocEntry(newValEntry);
+ if (newValEntry->IsItemDelimitor())
+ {
+ break;
+ }
+ if ( !delim_mode && (ftell(Fp)-offset) >= l_max)
+ {
+ break;
+ }
+ }
+ else
+ {
+ if ( ! gdcmGlobal::GetVR()->IsVROfGdcmBinaryRepresentable(vr) )
+ {
+ ////// Neither ValEntry NOR BinEntry: should mean UNKOWN VR
+ dbg.Verbose(0, "gdcmDocument::ParseDES: neither Valentry, "
+ "nor BinEntry. Probably unknown VR.");
+ }
+
+ ////// BinEntry or UNKOWN VR:
+ gdcmBinEntry *bn = new gdcmBinEntry(newDocEntry->GetDictEntry());
+ bn->Copy(newDocEntry);
+ set->AddEntry(bn);
+ LoadDocEntry(bn);
+ }
+
+ if (newDocEntry->GetGroup() == 0x7fe0 &&
+ newDocEntry->GetElement() == 0x0010 )
+ {
+ if (newDocEntry->GetReadLength()==0xffffffff)
+ {
+ // Broken US.3405.1.dcm
+ Parse7FE0(); // to skip the pixels
+ // (multipart JPEG/RLE are trouble makers)
+ }
+ else
+ {
+ SkipToNextDocEntry(newDocEntry);
+ l = newDocEntry->GetFullLength();
+ }
+ }
+ else
+ {
+ // to be sure we are at the beginning
+ SkipToNextDocEntry(newDocEntry);
+ l = newDocEntry->GetFullLength();
+ }
+ }
+ else
+ {
+ // VR = "SQ"
+ l = newDocEntry->GetReadLength();
+ if ( l != 0 ) // don't mess the delim_mode for zero-length sequence
+ {
+ if ( l == 0xffffffff )
+ {
+ delim_mode = true;
+ }
+ else
+ {
+ delim_mode = false;
+ }
+ }
+ // no other way to create it ...
+ gdcmSeqEntry *sq = new gdcmSeqEntry(newDocEntry->GetDictEntry(),
+ set->GetDepthLevel());
+ sq->Copy(newDocEntry);
+ sq->SetDelimitorMode(delim_mode);
+ sq->SetDepthLevel(depth);
+
+ if ( l != 0 )
+ { // Don't try to parse zero-length sequences
+ long lgt = ParseSQ( sq,
+ newDocEntry->GetOffset(),
+ l, delim_mode);
+ (void)lgt; //not used...
+ }
+ set->AddEntry(sq);
+ if ( !delim_mode && (ftell(Fp)-offset) >= l_max)
+ {
+ break;
+ }
+ }
+ delete newDocEntry;
+ }
+ return l; // Probably useless
+}
+
+/**
+ * \brief Parses a Sequence ( SeqEntry after SeqEntry)
+ * @return parsed length for this level
+ */
+long gdcmDocument::ParseSQ(gdcmSeqEntry *set,
+ long offset, long l_max, bool delim_mode)
+{
+ int SQItemNumber = 0;
+ bool dlm_mod;
+ //int depth = set->GetDepthLevel();
+ //(void)depth; //not used
+
+ while (true)
+ {
+ gdcmDocEntry *newDocEntry = ReadNextDocEntry();
+ if ( !newDocEntry )
+ {
+ // FIXME Should warn user
+ break;
+ }
+ if( delim_mode )
+ {
+ if ( newDocEntry->IsSequenceDelimitor() )
+ {
+ set->SetSequenceDelimitationItem( newDocEntry );
+ break;
+ }
+ }
+ if ( !delim_mode && (ftell(Fp)-offset) >= l_max)
+ {
+ break;
+ }
+
+ gdcmSQItem *itemSQ = new gdcmSQItem(set->GetDepthLevel());
+ itemSQ->AddEntry(newDocEntry);
+ unsigned int l = newDocEntry->GetReadLength();
+
+ if ( l == 0xffffffff )
+ {
+ dlm_mod = true;
+ }
+ else
+ {
+ dlm_mod = false;
+ }
+
+ int lgr = ParseDES(itemSQ, newDocEntry->GetOffset(), l, dlm_mod);
+ (void)lgr; //FIXME not used
+
+ set->AddEntry(itemSQ, SQItemNumber);
+ SQItemNumber++;
+ if ( !delim_mode && (ftell(Fp)-offset) >= l_max)
+ {
+ break;
+ }
+ }
+
+ int lgth = ftell(Fp) - offset;
+ return lgth;
+}
+