+
+/**
+ * \brief Set the progress method to call when the parsing of the
+ * directory progress
+ * @param method Method to call
+ * @param arg Argument to pass to the method
+ * @param argDelete Argument
+ * \warning In python : the arg parameter isn't considered
+ */
+void DicomDir::SetProgressMethod( DicomDir::Method *method, void *arg,
+ DicomDir::Method *argDelete )
+{
+ if ( ProgressArg && ProgressMethodArgDelete )
+ {
+ ProgressMethodArgDelete( ProgressArg );
+ }
+
+ ProgressMethod = method;
+ ProgressArg = arg;
+ ProgressMethodArgDelete = argDelete;
+}
+
+/**
+ * \brief Set the end method to call when the parsing of the directory ends
+ * @param method Method to call
+ * @param arg Argument to pass to the method
+ * @param argDelete Argument
+ * \warning In python : the arg parameter isn't considered
+ */
+void DicomDir::SetEndMethod( DicomDir::Method *method, void *arg,
+ DicomDir::Method *argDelete )
+{
+ if ( EndArg && EndMethodArgDelete )
+ {
+ EndMethodArgDelete( EndArg );
+ }
+
+ EndMethod = method;
+ EndArg = arg;
+ EndMethodArgDelete = argDelete;
+}
+
+/**
+ * \brief Set the method to delete the argument
+ * The argument is destroyed when the method is changed or when the
+ * class is destroyed
+ * @param method Method to call to delete the argument
+ */
+void DicomDir::SetStartMethodArgDelete( DicomDir::Method *method )
+{
+ StartMethodArgDelete = method;
+}
+
+/**
+ * \brief Set the method to delete the argument
+ * The argument is destroyed when the method is changed or when the
+ * class is destroyed
+ * @param method Method to call to delete the argument
+ */
+void DicomDir::SetProgressMethodArgDelete( DicomDir::Method *method )
+{
+ ProgressMethodArgDelete = method;
+}
+
+/**
+ * \brief Set the method to delete the argument
+ * The argument is destroyed when the method is changed or when
+ * the class is destroyed
+ * @param method Method to call to delete the argument
+ */
+void DicomDir::SetEndMethodArgDelete( DicomDir::Method *method )
+{
+ EndMethodArgDelete = method;
+}
+
+/**
+ * \brief writes on disc a DICOMDIR
+ * \ warning does NOT add the missing elements in the header :
+ * it's up to the user doing it !
+ * @param fileName file to be written to
+ * @return false only when fail to open
+ */
+
+bool DicomDir::WriteDicomDir(std::string const &fileName)
+{
+ int i;
+ uint16_t sq[4] = { 0x0004, 0x1220, 0xffff, 0xffff };
+ uint16_t sqt[4]= { 0xfffe, 0xe0dd, 0xffff, 0xffff };
+
+ std::ofstream *fp = new std::ofstream(fileName.c_str(),
+ std::ios::out | std::ios::binary);
+ if ( !fp )
+ {
+ gdcmWarningMacro("Failed to open(write) File: " << fileName.c_str());
+ return false;
+ }
+
+ char filePreamble[128];
+ memset(filePreamble, 0, 128);
+ fp->write(filePreamble, 128);
+ binary_write( *fp, "DICM");
+
+ DicomDirMeta *ptrMeta = GetMeta();
+ ptrMeta->WriteContent(fp, ExplicitVR);
+
+ // force writing 0004|1220 [SQ ], that CANNOT exist within DicomDirMeta
+ for(i=0;i<4;++i)
+ {
+ binary_write(*fp, sq[i]);
+ }
+
+ for(ListDicomDirPatient::iterator cc = Patients.begin();
+ cc != Patients.end();
+ ++cc )
+ {
+ (*cc)->WriteContent( fp, ExplicitVR );
+ }
+
+ // force writing Sequence Delimitation Item
+ for(i=0;i<4;++i)
+ {
+ binary_write(*fp, sqt[i]); // fffe e0dd ffff ffff
+ }
+
+ fp->close();
+ delete fp;
+
+ return true;
+}
+
+/**
+ * \brief Anonymize a DICOMDIR
+ * @return true
+ */
+
+bool DicomDir::AnonymizeDicomDir()
+{
+ ValEntry *v;
+ // Something clever to be found to forge the Patient names
+ std::ostringstream s;
+ int i = 1;
+ for(ListDicomDirPatient::iterator cc = Patients.begin();
+ cc!= Patients.end();
+ ++cc)
+ {
+ s << i;
+ v = (*cc)->GetValEntry(0x0010, 0x0010) ; // Patient's Name
+ if (v)
+ {
+ v->SetValue(s.str());
+ }
+
+ v = (*cc)->GetValEntry(0x0010, 0x0020) ; // Patient ID
+ if (v)
+ {
+ v->SetValue(" ");
+ }
+
+ v = (*cc)->GetValEntry(0x0010, 0x0030) ; // Patient's BirthDate
+ if (v)
+ {
+ v->SetValue(" ");
+ }
+ s << "";
+ i++;
+ }
+ return true;
+}