#include "gdcmUtil.h"
#include "gdcmElValSet.h"
#include "gdcmTS.h"
-#include <sstream>
+#ifdef GDCM_NO_ANSI_STRING_STREAM
+# include <strstream>
+# define ostringstream ostrstream
+# else
+# include <sstream>
+#endif
+
gdcmElValSet::~gdcmElValSet() {
for (TagElValueHT::iterator tag = tagHt.begin(); tag != tagHt.end(); ++tag) {
gdcmElValue* EntryToDelete = tag->second;
if ( EntryToDelete )
delete EntryToDelete;
+ tag->second=NULL;
}
+
tagHt.clear();
// Since Add() adds symetrical in both tagHt and NameHt we can
// assume all the pointed gdcmElValues are already cleaned-up when
NameHt.clear();
}
-TagElValueHT & gdcmElValSet::GetTagHt(void) {
- return tagHt;
-}
-
-
-ListTag & gdcmElValSet::GetListElem(void) {
- return listElem;
-}
-
/**
* \ingroup gdcmElValSet
* \brief
void gdcmElValSet::Print(std::ostream & os) {
size_t o;
- short int g, e;
+ unsigned short int g, e;
TSKey v;
std::string d2;
gdcmTS * ts = gdcmGlobal::GetTS();
+ std::ostringstream s;
for (TagElValueHT::iterator tag = tagHt.begin();
tag != tagHt.end();
v = tag->second->GetValue();
o = tag->second->GetOffset();
d2 = _CreateCleanString(v); // replace non printable characters by '.'
-
- os << tag->first << ": ";
- os << " lgr : " << tag->second->GetLength();
- os << ", Offset : " << o;
- os << " x(" << std::hex << o << std::dec << ") ";
- os << "\t[" << tag->second->GetVR() << "]";
- os << "\t[" << tag->second->GetName() << "]";
- os << "\t[" << d2 << "]";
-
+
+ s << tag->first << ": ";
+ s << " lgr : " <<tag->second->GetLength();
+ s << ",\t Offset : " << o;
+ s << " x(" << std::hex << o << std::dec << ") ";
+ s << "\t[" << tag->second->GetVR() << "]";
+ s << "\t[" << tag->second->GetName() << "]";
+ s << "\t[" << d2 << "]";
+
// Display the UID value (instead of displaying the rough code)
if (g == 0x0002) { // Some more to be displayed ?
if ( (e == 0x0010) || (e == 0x0002) )
- os << " ==>\t[" << ts->GetValue(v) << "]";
+ s << " ==>\t[" << ts->GetValue(v) << "]";
} else {
if (g == 0x0008) {
if ( (e == 0x0016) || (e == 0x1150) )
- os << " ==>\t[" << ts->GetValue(v) << "]";
+ s << " ==>\t[" << ts->GetValue(v) << "]";
}
}
- os << std::endl;
+ s << std::endl;
}
+
- std::cout << "----------------------------------------------" << std::endl;
-
- //for (ListTag::iterator i = listElem.begin();
-
- char tag[9];
+ guint32 lgth;
+ char greltag[10]; //group element tag
- for (std::list<gdcmElValue*>::iterator i = listElem.begin();
+ for (ListTag::iterator i = listElem.begin();
i != listElem.end();
++i){
- sprintf(tag,"%04x|%04x",(*i)->GetGroup(),(*i)->GetElement());
g = (*i)->GetGroup();
e = (*i)->GetElement();
v = (*i)->GetValue();
o = (*i)->GetOffset();
+ sprintf(greltag,"%04x|%04x",g,e);
d2 = _CreateCleanString(v); // replace non printable characters by '.'
- //os << std::hex <<g << "|" << e << std::dec << ": ";
- os << tag << " : ";
- os << " lgr : " << (*i)->GetLength();
- os << ", Offset : " << o;
- os << " x(" << std::hex << o << std::dec << ") ";
- os << "\t[" << (*i)->GetVR() << "]";
- os << "\t[" << (*i)->GetName() << "]";
- os << "\t[" << d2 << "]";
+ s << greltag << ": lgth : ";
+ lgth = (*i)->GetReadLength();
+ if ( lgth == 0xffffffff)
+ s << std::hex << lgth << std::dec ;
+ else
+ s << lgth;
+ s << ",\t Offset : " << o;
+ s << " x(" << std::hex << o << std::dec << ") ";
+ s << "\t[" << (*i)->GetVR() << "]";
+ s << "\t[" << (*i)->GetName() << "]";
+ s << "\t[" << d2 << "]";
// Display the UID value (instead of displaying the rough code)
if (g == 0x0002) { // Any more to be displayed ?
if ( (e == 0x0010) || (e == 0x0002) )
- os << " ==>\t[" << ts->GetValue(v) << "]";
+ s << " ==>\t[" << ts->GetValue(v) << "]";
} else {
if (g == 0x0008) {
if ( (e == 0x0016) || (e == 0x1150) )
- os << " ==>\t[" << ts->GetValue(v) << "]";
+ s << " ==>\t[" << ts->GetValue(v) << "]";
}
}
- os << std::endl;
-
+ s << std::endl;
}
-
+ os<<s.str();
}
/**
else
lgr = l;
tagHt[key]->SetLength(lgr);
-
-
-
return 1;
}
/**
* \ingroup gdcmElValSet
- * \brief
- * @param type
- * @param _fp
+ * \brief writes on disc according to the requested format
+ * \ (ACR-NEMA, DICOM, RAW) the image
+ * \ warning does NOT add the missing elements in the header :
+ * \ it's up to the user doing it !
+ * \ (function CheckHeaderCoherence to be written)
+ * @param type type of the File to be written
+ * (ACR-NEMA, DICOM, RAW)
+ * @param _fp already open file pointer
* @return
*/
void gdcmElValSet::WriteElements(FileType type, FILE * _fp) {
guint16 val_uint16;
std::vector<std::string> tokens;
+
+ // TODO : use listElem to iterate, not TagHt!
+ // pb : gdcmElValSet.Add does NOT update listElem
+ // find a trick in STL to do it, at low cost !
void *ptr;
val = tag2->second->GetValue().c_str();
vr = tag2->second->GetVR();
- // std::cout << "Tag "<< std::hex << gr << " " << el << std::endl;
-
if ( type == ACR ) {
if (gr < 0x0008) continue; // ignore pure DICOM V3 groups
if (gr %2) continue; // ignore shadow groups