+ {
+ // Only if user passed a root directory
+ // ------------------------------------
+ if ( GetFileName() == "." )
+ {
+ // user passed '.' as Name
+ // we get current directory name
+ char buf[2048];
+ const char *cwd = getcwd(buf, 2048);
+ if( cwd )
+ {
+ SetFileName( buf ); // will be converted into a string
+ }
+ else
+ {
+ gdcmErrorMacro( "Path was too long to fit on 2048 bytes" );
+ }
+ }
+ NewMeta();
+ gdcmDebugMacro( "Parse directory and create the DicomDir : "
+ << GetFileName() );
+ ParseDirectory();
+ }
+ return true;
+}
+
+/**
+ * \brief This predicate, based on hopefully reasonable heuristics,
+ * decides whether or not the current document was properly parsed
+ * and contains the mandatory information for being considered as
+ * a well formed and usable DicomDir.
+ * @return true when Document is the one of a reasonable DicomDir,
+ * false otherwise.
+ */
+bool DicomDir::IsReadable()
+{
+ if ( Filetype == Unknown )
+ {
+ gdcmErrorMacro( "Wrong filetype for " << GetFileName());
+ return false;
+ }
+ if ( !MetaElems )
+ {
+ gdcmWarningMacro( "Meta Elements missing in DicomDir");
+ return false;
+ }
+ if ( Patients.size() <= 0 )
+ {
+ gdcmWarningMacro( "NO Patient in DicomDir");
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * \brief adds *the* Meta to a partially created DICOMDIR
+ */
+DicomDirMeta *DicomDir::NewMeta()
+{
+ if ( MetaElems )
+ MetaElems->Delete();
+
+ DocEntry *entry = GetFirstEntry();
+ if ( entry )
+ {
+ MetaElems = DicomDirMeta::New(true); // true = empty
+
+ entry = GetFirstEntry();
+ while( entry )
+ {
+ if ( dynamic_cast<SeqEntry *>(entry) )
+ break;
+
+ MetaElems->AddEntry(entry);
+ RemoveEntry(entry);
+
+ entry = GetFirstEntry();
+ }
+ }
+ else // after root directory parsing
+ {
+ MetaElems = DicomDirMeta::New(false); // false = not empty
+ }
+ MetaElems->SetSQItemNumber(0); // To avoid further missprinting
+ return MetaElems;
+}
+
+/**
+ * \brief adds a new Patient (with the basic elements) to a partially created
+ * DICOMDIR
+ */
+DicomDirPatient *DicomDir::NewPatient()
+{
+ DicomDirPatient *dd = DicomDirPatient::New();
+ AddPatientToEnd( dd );
+ return dd;