Explorar el Código

Fixed crashed caused by usage of global DICOM dictionary (led to crash on some windows systems since the undefined order of global dictionary and logger instantiation/usage). Minor re-formatting.

Michael Onken hace 14 años
padre
commit
11b47bbe0a
Se han modificado 1 ficheros con 19 adiciones y 25 borrados
  1. 19 25
      Libs/DICOM/Core/ctkDICOMDataset.cpp

+ 19 - 25
Libs/DICOM/Core/ctkDICOMDataset.cpp

@@ -38,18 +38,11 @@ class ctkDICOMDatasetPrivate
 
 
     bool m_DICOMDataSetInitialized;
     bool m_DICOMDataSetInitialized;
 
 
-    static const QScopedPointer<const DcmDataDictionary> s_Dictionary;
-
     DcmDataset* m_DcmDataset;
     DcmDataset* m_DcmDataset;
 };
 };
 
 
-const QScopedPointer<const DcmDataDictionary> ctkDICOMDatasetPrivate::s_Dictionary(new DcmDataDictionary(OFTrue, OFTrue));
-// = QScopedPointer<const DcmDataDictionary>(new DcmDataDictionary(OFTrue, OFTrue));
-
-
 
 
-
-ctkDICOMDataset::ctkDICOMDataset() 
+ctkDICOMDataset::ctkDICOMDataset()
 :d_ptr(new ctkDICOMDatasetPrivate)
 :d_ptr(new ctkDICOMDatasetPrivate)
 {
 {
   Q_D(ctkDICOMDataset);
   Q_D(ctkDICOMDataset);
@@ -57,7 +50,7 @@ ctkDICOMDataset::ctkDICOMDataset()
   d->m_DcmDataset = this;
   d->m_DcmDataset = this;
 }
 }
 
 
-ctkDICOMDataset::~ctkDICOMDataset() 
+ctkDICOMDataset::~ctkDICOMDataset()
 {
 {
   Q_D(ctkDICOMDataset);
   Q_D(ctkDICOMDataset);
   if(d->m_DcmDataset != this)
   if(d->m_DcmDataset != this)
@@ -123,7 +116,7 @@ void ctkDICOMDataset::InitializeFromFile(const QString& filename,
 {
 {
   Q_UNUSED(maxReadLength);
   Q_UNUSED(maxReadLength);
   DcmDataset *dataset;
   DcmDataset *dataset;
-  
+
   DcmFileFormat fileformat;
   DcmFileFormat fileformat;
   OFCondition status = fileformat.loadFile(filename.toAscii().data(), readXfer, groupLength, readMode);
   OFCondition status = fileformat.loadFile(filename.toAscii().data(), readXfer, groupLength, readMode);
   dataset = fileformat.getAndRemoveDataset();
   dataset = fileformat.getAndRemoveDataset();
@@ -416,7 +409,7 @@ OFString ctkDICOMDataset::Encode( const DcmTag& tag, const QString& qstring ) co
   Q_UNUSED(tag);
   Q_UNUSED(tag);
   return OFString( qstring.toLatin1().data() ); // Latin1 is ISO 8859, which is the default character set of DICOM (PS 3.5-2008, Page 18)
   return OFString( qstring.toLatin1().data() ); // Latin1 is ISO 8859, which is the default character set of DICOM (PS 3.5-2008, Page 18)
 }
 }
-    
+
 QString ctkDICOMDataset::GetAllElementValuesAsString( const DcmTag& tag ) const
 QString ctkDICOMDataset::GetAllElementValuesAsString( const DcmTag& tag ) const
 {
 {
   this->EnsureDcmDataSetIsInitialized();
   this->EnsureDcmDataSetIsInitialized();
@@ -883,30 +876,31 @@ QString ctkDICOMDataset::TagKey( const DcmTag& tag )
 
 
 QString ctkDICOMDataset::TagDescription( const DcmTag& tag )
 QString ctkDICOMDataset::TagDescription( const DcmTag& tag )
 {
 {
-  if (!ctkDICOMDatasetPrivate::s_Dictionary->isDictionaryLoaded()) return QString("<no DICOM dictionary loaded. application broken>");
-  const DcmDictEntry* entry = ctkDICOMDatasetPrivate::s_Dictionary->findEntry(tag, NULL);
+  if (!dcmDataDict.isDictionaryLoaded())
+    return QString("<no DICOM dictionary loaded. application broken>");
+  const DcmDataDictionary& globalDict = dcmDataDict.rdlock();
+  const DcmDictEntry* entry = globalDict.findEntry(tag, NULL);
+  QString returnName("Unknown");
   if (entry)
   if (entry)
   {
   {
-    return QString(entry->getTagName());
-  }
-  else
-  {
-    return QString("<unknown>");
+    returnName = entry->getTagName();
   }
   }
+  dcmDataDict.unlock();
+  return returnName;
 }
 }
 
 
 QString ctkDICOMDataset::TagVR( const DcmTag& tag )
 QString ctkDICOMDataset::TagVR( const DcmTag& tag )
 {
 {
-  if (!ctkDICOMDatasetPrivate::s_Dictionary->isDictionaryLoaded()) return QString("<no DICOM dictionary loaded. application broken>");
-  const DcmDictEntry* entry = ctkDICOMDatasetPrivate::s_Dictionary->findEntry(tag, NULL);
+  if (!dcmDataDict.isDictionaryLoaded()) return QString("<no DICOM dictionary loaded. application broken>");
+  const DcmDataDictionary& globalDataDict = dcmDataDict.rdlock();
+  const DcmDictEntry* entry = globalDataDict.findEntry(tag, NULL);
+  QString returnVR("UN");
   if (entry)
   if (entry)
   {
   {
-    return QString(entry->getVR().getVRName());
-  }
-  else
-  {
-    return QString("UN"); // unknown
+    returnVR = entry->getVR().getVRName();
   }
   }
+  dcmDataDict.unlock();
+  return returnVR;
 }
 }
 
 
 QString ctkDICOMDataset::GetStoredSerialization()
 QString ctkDICOMDataset::GetStoredSerialization()