- // 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;
-
- if ( ValEntry *valEntry = dynamic_cast<ValEntry* >(entry) )
- {
- if ( Fp->fail() || Fp->eof())
- {
- if ( Fp->fail() )
- gdcmWarningMacro("--> fail");
-
- gdcmWarningMacro("Unread element value " << valEntry->GetKey()
- << " lgt : " << valEntry->GetReadLength()
- << " at " << std::hex << valEntry->GetOffset());
- valEntry->SetValue(GDCM_UNREAD);
- return;
- }
-
-// if ( vr == "UI" )
-// {
-// // Because of correspondance with the VR dic
-// valEntry->SetValue(newValue);
-// }
-// else
-// {
-// valEntry->SetValue(newValue);
-// }
-
-// Anybody remembers the genesis of strange previous (commented out) code?
- valEntry->SetValue(newValue);
-
- }
- else
- {
- gdcmWarningMacro("Should have a ValEntry, here ! " << valEntry->GetKey()
- << " lgt : " << valEntry->GetReadLength()
- << " at " << std::hex << valEntry->GetOffset());
- }