- if (length > MaxSizeLoadEntry)
- {
- if (BinEntry *binEntryPtr = dynamic_cast< BinEntry* >(entry) )
- {
- s << GDCM_NOTLOADED;
- s << " Ad.:" << (long)entry->GetOffset();
- s << " x(" << std::hex << entry->GetOffset() << ")";
- s << std::dec;
- s << " Lgt:" << entry->GetLength();
- s << " x(" << std::hex << entry->GetLength() << ")";
- binEntryPtr->SetValue(s.str());
- }
- else if (ValEntry *valEntryPtr = dynamic_cast< ValEntry* >(entry) )
- {
- s << GDCM_NOTLOADED;
- s << " Address:" << (long)entry->GetOffset();
- s << " Length:" << entry->GetLength();
- s << " x(" << std::hex << entry->GetLength() << ")";
- valEntryPtr->SetValue(s.str());
- }
- else
- {
- // fusible
- gdcmErrorMacro( "MaxSizeLoadEntry exceeded, neither a BinEntry "
- << "nor a ValEntry ?! Should never print that !" );
- }
-
- // to be sure we are at the end of the value ...
- Fp->seekg((long)entry->GetOffset()+(long)entry->GetLength(),
- std::ios::beg);
- return;
- }
-
- // When we find a BinEntry not very much can be done :
- if (BinEntry *binEntryPtr = dynamic_cast< BinEntry* >(entry) )
- {
- s << GDCM_BINLOADED;
- binEntryPtr->SetValue(s.str());
- LoadEntryBinArea(binEntryPtr); // last one, not to erase length !
- return;
- }
-
- if ( IsDocEntryAnInteger(entry) )
- {
- uint32_t NewInt;
- int nbInt;
- // When short integer(s) are expected, read and convert the following
- // (n * 2) characters properly i.e. consider them as short integers as
- // opposed to strings.
- // Elements with Value Multiplicity > 1
- // contain a set of integers (not a single one)
- if (vr == "US" || vr == "SS")
- {
- nbInt = length / 2;
- NewInt = ReadInt16();
- s << NewInt;
- if (nbInt > 1)
- {
- for (int i=1; i < nbInt; i++)
- {
- s << '\\';
- NewInt = ReadInt16();
- s << NewInt;
- }
- }
- }
- // See above comment on multiple integers (mutatis mutandis).
- else if (vr == "UL" || vr == "SL")
- {
- nbInt = length / 4;
- NewInt = ReadInt32();
- s << NewInt;
- if (nbInt > 1)
- {
- for (int i=1; i < nbInt; i++)
- {
- s << '\\';
- NewInt = ReadInt32();
- s << NewInt;
- }
- }
- }
-#ifdef GDCM_NO_ANSI_STRING_STREAM
- s << std::ends; // to avoid oddities on Solaris
-#endif //GDCM_NO_ANSI_STRING_STREAM
-
- ((ValEntry *)entry)->SetValue(s.str());
- return;
- }
-
- // FIXME: We need an additional byte for storing \0 that is not on disk
- char *str = new char[length+1];
- Fp->read(str, (size_t)length);
- str[length] = '\0'; //this is only useful when length is odd
- // Special DicomString call to properly handle \0 and even length
- std::string newValue;
- if( length % 2 )
- {
- newValue = Util::DicomString(str, length+1);
- gdcmWarningMacro("Warning: bad length: " << length <<
- " For string :" << newValue.c_str());
- // Since we change the length of string update it length
- //entry->SetReadLength(length+1);
- }
- else
- {
- newValue = Util::DicomString(str, length);
- }
- delete[] str;