Ver código fonte

Merge branch 'dicom-db-insert-cleanup'

Marco Nolden 13 anos atrás
pai
commit
1fe68c0021

+ 1 - 1
Libs/DICOM/Core/ctkDICOMDatabase.cpp

@@ -453,7 +453,7 @@ void ctkDICOMDatabase::insert( DcmDataset *dataset, bool storeFile, bool generat
     return;
   }
   ctkDICOMDataset ctkDataset;
-  ctkDataset.InitializeFromDataset(dataset);
+  ctkDataset.InitializeFromDataset(dataset, false /* do not take ownership */);
   this->insert(ctkDataset,storeFile,generateThumbnail);
 }
 void ctkDICOMDatabase::insert( const ctkDICOMDataset& ctkDataset, bool storeFile, bool generateThumbnail)

+ 15 - 6
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -32,12 +32,13 @@ class ctkDICOMDatasetPrivate
 {
   public:
 
-    ctkDICOMDatasetPrivate() : m_DcmDataset(0) {}
+    ctkDICOMDatasetPrivate() : m_DcmDataset(0), m_TakeOwnership(true) {}
 
     QString m_SpecificCharacterSet;
 
     bool m_DICOMDataSetInitialized;
     bool m_StrictErrorHandling;
+    bool m_TakeOwnership;
 
     DcmDataset* m_DcmDataset;
 };
@@ -48,6 +49,7 @@ ctkDICOMDataset::ctkDICOMDataset(bool strictErrorHandling)
 {
   Q_D(ctkDICOMDataset);
   d->m_DcmDataset = new DcmDataset();
+  d->m_TakeOwnership = true;
   d->m_DICOMDataSetInitialized = false;
   d->m_StrictErrorHandling = strictErrorHandling;
 }
@@ -55,23 +57,30 @@ ctkDICOMDataset::ctkDICOMDataset(bool strictErrorHandling)
 ctkDICOMDataset::~ctkDICOMDataset()
 {
   Q_D(ctkDICOMDataset);
-  delete d->m_DcmDataset;
+  if ( d->m_TakeOwnership)
+  {
+    delete d->m_DcmDataset;
+  }
 }
 
 
-void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset)
+void ctkDICOMDataset::InitializeFromDataset(DcmDataset* dataset, bool takeOwnership)
 {
   Q_D(ctkDICOMDataset);
 
   if(d->m_DcmDataset != dataset)
   {
-    delete d->m_DcmDataset;
+    if (d->m_TakeOwnership)
+    {
+      delete d->m_DcmDataset;
+    }
     d->m_DcmDataset = NULL;
   }
 
   if (dataset)
   {
     d->m_DcmDataset=dataset;
+    d->m_TakeOwnership = takeOwnership;
     if (!d->m_DICOMDataSetInitialized)
     {
       d->m_DICOMDataSetInitialized = true;
@@ -127,7 +136,7 @@ void ctkDICOMDataset::InitializeFromFile(const QString& filename,
     return;
   }
 
-  InitializeFromDataset(dataset);
+  InitializeFromDataset(dataset, true);
 }
 
 void ctkDICOMDataset::Serialize()
@@ -977,7 +986,7 @@ bool ctkDICOMDataset::SaveToFile(const QString& filePath) const
 {
   Q_D(const ctkDICOMDataset);
   DcmFileFormat* fileformat = new DcmFileFormat ( d->m_DcmDataset );
-  OFCondition status = fileformat->saveFile ( filePath.toAscii() );
+  OFCondition status = fileformat->saveFile ( QDir::toNativeSeparators( filePath).toAscii()  );
   delete fileformat;
   return status.good();
 }

+ 1 - 1
Libs/DICOM/Core/ctkDICOMDataset.h

@@ -75,7 +75,7 @@ public:
     /// should copy information from a DcmDataset object.
 
     /// \warning Derived classes must call PDICOMDataset::InitializeFromDataset(...) to correctly copy encoding information.
-    virtual void InitializeFromDataset(DcmDataset* dataset);
+    virtual void InitializeFromDataset(DcmDataset* dataset, bool takeOwnership = false);
 
     ///
     /// \brief For initialization from file in a constructor / assignment.