diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2015-02-02 16:21:26 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2015-02-02 16:21:26 +0900 |
commit | b9346aa9e09dd397dac8367bcf04bf7ef8403b94 (patch) | |
tree | d606a3e9e6081ec9cd91d73b7145b7dcf62eff91 /tdefilereplace/tdefilereplacepart.cpp | |
parent | 1b697b6bf7c1e3bd0f9b6d0bb9cdf5b47b7ebc13 (diff) | |
download | tdewebdev-b9346aa9e09dd397dac8367bcf04bf7ef8403b94.tar.gz tdewebdev-b9346aa9e09dd397dac8367bcf04bf7ef8403b94.zip |
TDEFileReplace: fixed unresponsive GUI and application crash when circular references are found on the file system.
Added a message to advice the user of the possible circular reference. This relates to bug 2264.
Manually cherry-picked from commit d7398464 (tdeutils).
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'tdefilereplace/tdefilereplacepart.cpp')
-rw-r--r-- | tdefilereplace/tdefilereplacepart.cpp | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/tdefilereplace/tdefilereplacepart.cpp b/tdefilereplace/tdefilereplacepart.cpp index e0bb9f97..e91fa462 100644 --- a/tdefilereplace/tdefilereplacepart.cpp +++ b/tdefilereplace/tdefilereplacepart.cpp @@ -52,6 +52,9 @@ #include "commandengine.h" #include "whatthis.h" +// Change this as well if increasing the max value allowed for the m_spbMaxDepth spinbox +static const int CIRCULAR_LINK_DETECTION_LEVEL = 256; + using namespace whatthisNameSpace; //PUBLIC CONSTRUCTORS @@ -71,6 +74,7 @@ TDEFileReplacePart::TDEFileReplacePart(TQWidget* parentWidget, const char* , TQO m_optionMask = TQDir::Files; m_w = widget(); m_option = 0; + m_circ_ref_warning_shown = false; loadOptionsFromRC(); initView(); @@ -130,7 +134,10 @@ void TDEFileReplacePart::slotSearchingOperation() uint filesNumber = 0; if(m_option->m_recursive) - recursiveFileSearch(currentDirectory, currentFilter, filesNumber); + { + m_circ_ref_warning_shown = false; + recursiveFileSearch(currentDirectory, currentFilter, filesNumber, 0); + } else fileSearch(currentDirectory, currentFilter); @@ -196,7 +203,8 @@ void TDEFileReplacePart::slotReplacingOperation() if(m_option->m_recursive) { int filesNumber = 0; - recursiveFileReplace(currentDirectory, filesNumber); + m_circ_ref_warning_shown = false; + recursiveFileReplace(currentDirectory, filesNumber, 0); } else { @@ -962,11 +970,24 @@ void TDEFileReplacePart::fileReplace() } } -void TDEFileReplacePart::recursiveFileReplace(const TQString& directoryName, int& filesNumber) +void TDEFileReplacePart::recursiveFileReplace(const TQString& directoryName, int& filesNumber, int depth) { //if m_stop == true then interrupts recursion if(m_stop) return; + else if (!depth > CIRCULAR_LINK_DETECTION_LEVEL) + { + if (!m_circ_ref_warning_shown) + { + KMessageBox::information(m_w, + i18n("It seems you have a circular reference in your file system." + "The search has been limited to this sublevel to prevent" + "TDEFileReplace from crashing."), + i18n("Circular reference detected")); + m_circ_ref_warning_shown = true; + } + return; + } else { TQDir d(directoryName); @@ -995,13 +1016,13 @@ void TDEFileReplacePart::recursiveFileReplace(const TQString& directoryName, int TQFileInfo qi(filePath); m_view->displayScannedFiles(filesNumber); + kapp->processEvents(); //if filePath is a directory then recursion if(qi.isDir()) - recursiveFileReplace(filePath, filesNumber); + recursiveFileReplace(filePath, filesNumber, depth+1); else { - kapp->processEvents(); if(m_option->m_backup) replaceAndBackup(d.canonicalPath(), fileName); else @@ -1285,6 +1306,19 @@ void TDEFileReplacePart::recursiveFileSearch(const TQString& directoryName, cons // if m_stop == true then interrupt recursion if(m_stop) return; + else if (depth > CIRCULAR_LINK_DETECTION_LEVEL) + { + if (!m_circ_ref_warning_shown) + { + KMessageBox::information(m_w, + i18n("It seems you have a circular reference in your file system. " + "The search has been limited to this sublevel to prevent " + "TDEFileReplace from crashing."), + i18n("Circular reference detected")); + m_circ_ref_warning_shown = true; + } + return; + } else { TQDir d(directoryName); @@ -1312,12 +1346,12 @@ void TDEFileReplacePart::recursiveFileSearch(const TQString& directoryName, cons m_view->displayScannedFiles(filesNumber); + kapp->processEvents(); // Searchs recursively if "filePath" is a directory if(fileInfo.isDir()) - recursiveFileSearch(filePath+"/"+fileName, filters, filesNumber); + recursiveFileSearch(filePath+"/"+fileName, filters, filesNumber, depth+1); else { - kapp->processEvents(); search(filePath, fileName); filesNumber++; m_view->displayScannedFiles(filesNumber); |