diff --git a/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.cpp b/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.cpp index 07de69a223..ab81bf5345 100644 --- a/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.cpp +++ b/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.cpp @@ -1,116 +1,141 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "QmitkDicomDirectoryListener.h" #include #include #include #include +#include QmitkDicomDirectoryListener::QmitkDicomDirectoryListener() : m_FileSystemWatcher(new QFileSystemWatcher()) +, m_IsListening(true) { - connect(m_FileSystemWatcher,SIGNAL(directoryChanged(const QString&)),this,SLOT(OnDirectoryChanged(const QString&))); + connect(m_FileSystemWatcher,SIGNAL(directoryChanged(const QString&)),this,SLOT(OnDirectoryChanged(const QString&))); } QmitkDicomDirectoryListener::~QmitkDicomDirectoryListener() { + m_IsListening = false; + RemoveTemporaryFiles(); delete m_FileSystemWatcher; } - void QmitkDicomDirectoryListener::OnDirectoryChanged(const QString&) -{ - SetFilesToImport(); - m_ImportingFiles.append(m_FilesToImport); - emit SignalAddDicomData(m_FilesToImport); -} - -void QmitkDicomDirectoryListener::OnDicomImportFinished(const QStringList& finishedFiles) { - RemoveFilesFromDirectoryAndImportingFilesList(finishedFiles); -} - -void QmitkDicomDirectoryListener::SetFilesToImport() -{ - m_FilesToImport.clear(); - QDir listenerDirectory(m_DicomListenerDirectory); - QFileInfoList entries = listenerDirectory.entryInfoList(QDir::Files); - if(!entries.isEmpty()) + if(m_IsListening) { - QFileInfoList::const_iterator file; - for(file = entries.constBegin(); file != entries.constEnd(); ++file ) + QDirIterator it( m_DicomListenerDirectory.absolutePath() , QDir::Files , QDirIterator::Subdirectories); + QString currentPath; + + m_FilesToImport.clear(); + while(it.hasNext()) { - if(!m_ImportingFiles.contains((*file).absoluteFilePath())) + it.next(); + currentPath = it.fileInfo().absoluteFilePath(); + if(!m_AlreadyImportedFiles.contains(currentPath)) { - m_FilesToImport.append((*file).absoluteFilePath()); + m_AlreadyImportedFiles.insert( currentPath , currentPath ); + m_FilesToImport.append(currentPath); } } - } + if(!m_FilesToImport.isEmpty()) + { + emit SignalAddDicomData(m_FilesToImport); + } + } } -void QmitkDicomDirectoryListener::RemoveFilesFromDirectoryAndImportingFilesList(const QStringList& files) +void QmitkDicomDirectoryListener::OnImportFinished(const QStringList& files) { - QStringListIterator fileToDeleteIterator(files); - while(fileToDeleteIterator.hasNext()) + m_IsListening = false; + RemoveTemporaryFiles(files); + RemoveAlreadyImportedEntries(files); + m_IsListening = true; +} + +void QmitkDicomDirectoryListener::OnDicomNetworkError(const QString& errorMsg) +{ + m_IsListening = false; + m_AlreadyImportedFiles.clear(); +} + +void QmitkDicomDirectoryListener::RemoveAlreadyImportedEntries(const QStringList& fileEntries) +{ + QStringListIterator it(fileEntries); + QString currentEntry; + while(it.hasNext()) { - QFile file(fileToDeleteIterator.next()); - if(m_ImportingFiles.contains(file.fileName())) + currentEntry = m_DicomListenerDirectory.absoluteFilePath(it.next()); + if(m_AlreadyImportedFiles.contains(currentEntry)) { - m_ImportingFiles.removeOne(file.fileName()); - file.remove(); + m_AlreadyImportedFiles.remove(currentEntry); } } } -void QmitkDicomDirectoryListener::SetDicomListenerDirectory(const QString& directory) +void QmitkDicomDirectoryListener::RemoveTemporaryFiles(const QStringList& fileEntries) { - if(isOnlyListenedDirectory(directory)) + QStringListIterator it(fileEntries); + QString currentEntry; + while(it.hasNext()) { - QDir listenerDirectory = QDir(directory); - CreateListenerDirectory(listenerDirectory); - - m_DicomListenerDirectory=listenerDirectory.absolutePath(); - m_FileSystemWatcher->addPath(m_DicomListenerDirectory); - MITK_INFO << m_DicomListenerDirectory.toStdString(); + currentEntry = m_DicomListenerDirectory.absoluteFilePath(it.next()); + m_DicomListenerDirectory.remove(currentEntry); } } -const QString& QmitkDicomDirectoryListener::GetDicomListenerDirectory() +void QmitkDicomDirectoryListener::RemoveTemporaryFiles() { - return m_DicomListenerDirectory; -} - -void QmitkDicomDirectoryListener::CreateListenerDirectory(const QDir& directory) -{ - if(!directory.exists()) + QDirIterator it( m_DicomListenerDirectory.absolutePath() , QDir::AllEntries , QDirIterator::Subdirectories); + while(it.hasNext()) { - directory.mkpath(directory.absolutePath()); + it.next(); + m_DicomListenerDirectory.remove(it.fileInfo().absoluteFilePath()); } } -bool QmitkDicomDirectoryListener::isOnlyListenedDirectory(const QString& directory) +void QmitkDicomDirectoryListener::SetDicomListenerDirectory(const QString& directory) { - bool isOnlyListenedDirectory = false; - if(m_FileSystemWatcher->directories().count()==0||m_FileSystemWatcher->directories().count()==1) + QDir dir(directory); + if(dir.exists()) { - if(!m_FileSystemWatcher->directories().contains(directory)) - { - isOnlyListenedDirectory = true; - } + m_DicomListenerDirectory=dir; + m_FileSystemWatcher->addPath(m_DicomListenerDirectory.absolutePath()); } - return isOnlyListenedDirectory; -} \ No newline at end of file + else + { + dir.mkpath(directory); + m_DicomListenerDirectory=dir; + m_FileSystemWatcher->addPath(m_DicomListenerDirectory.absolutePath()); + } +} + +QString QmitkDicomDirectoryListener::GetDicomListenerDirectory() +{ + return m_DicomListenerDirectory.absolutePath(); +} + +bool QmitkDicomDirectoryListener::IsListening() +{ + return m_IsListening; +} + +void QmitkDicomDirectoryListener::SetListening(bool listening) +{ + m_IsListening = listening; +} diff --git a/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.h b/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.h index 010cda4e90..25e58bcb6f 100644 --- a/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.h +++ b/Plugins/org.mitk.gui.qt.dicom/src/internal/QmitkDicomDirectoryListener.h @@ -1,78 +1,95 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkDicomDirectoryListener_h #define QmitkDicomDirectoryListener_h #include #include +#include #include #include #include #include class QmitkDicomDirectoryListener : public QObject { Q_OBJECT public: QmitkDicomDirectoryListener(); - + virtual ~QmitkDicomDirectoryListener(); /// @brief sets listened directory, note that only one directory can be set. void SetDicomListenerDirectory(const QString&); /// @brief get filepath to the listened directory. - const QString& GetDicomListenerDirectory(); + QString GetDicomListenerDirectory(); + + /// @brief get the status whether the directorey listener is listening or not. + bool IsListening(); + + /// @brief set the directory listener listening. + void SetListening(bool listening); signals: /// @brief signal starts the dicom import of the given file (the QStringList will only contain one file here). void SignalAddDicomData(const QStringList&); public slots: /// \brief called when listener directory changes void OnDirectoryChanged(const QString&); - /// \brief called when import is finished - void OnDicomImportFinished(const QStringList&); + /// \brief called when error occours during dicom store request + void OnDicomNetworkError(const QString&); + /// \brief called when import of files is finished. + void OnImportFinished(const QStringList&); protected: - /// \brief creates directory if it's not already existing. + /// \brief creates directory if it's not already existing. void CreateListenerDirectory(const QDir& directory); - /// \brief checks wheter the given directory is the only directory that is listened. - bool isOnlyListenedDirectory(const QString& directory); - - /// \brief Composes the filename and initializes m_LastRetrievedFile with it + /// \brief Composes the filename and initializes m_LastRetrievedFile with it. void SetFilesToImport(); - /// \brief removes files from - void RemoveFilesFromDirectoryAndImportingFilesList(const QStringList& files); + /// \brief removes files from listener directory. + void RemoveTemporaryFiles(); + + /// \brief removes files in the files list from listener directory. + void RemoveTemporaryFiles(const QStringList& files); + + /// \brief removes entries from m_AlreadyImportedFiles hash table. + void RemoveAlreadyImportedEntries(const QStringList& files); QFileSystemWatcher* m_FileSystemWatcher; + QStringList m_FilesToImport; - QStringList m_ImportingFiles; - QString m_DicomListenerDirectory; + + QHash m_AlreadyImportedFiles; + + QDir m_DicomListenerDirectory; + + bool m_IsListening; }; #endif // QmitkDicomListener_h \ No newline at end of file