Mercurial > hg > svcore
diff base/ViewManager.cpp @ 75:163f3428bbe0
* Create temporary directory, cleaned up on exit, and use it to store
(inter alia) audio samples for the sample-player plugin.
* Ensure newly added layers always have unique names
* Make sure configure pairs for real-time plugins are stored in the
configuration Xml along with parameter & program settings
author | Chris Cannam |
---|---|
date | Mon, 10 Apr 2006 13:52:32 +0000 |
parents | e1aad27029e3 |
children | f277a171749d |
line wrap: on
line diff
--- a/base/ViewManager.cpp Fri Apr 07 17:50:33 2006 +0000 +++ b/base/ViewManager.cpp Mon Apr 10 13:52:32 2006 +0000 @@ -20,6 +20,11 @@ #include <iostream> +#include <QDir> +#include <QFile> + +#include <cassert> + // #define DEBUG_VIEW_MANAGER 1 ViewManager::ViewManager() : @@ -45,6 +50,11 @@ SLOT(considerZoomChange(void *, unsigned long, bool))); } +ViewManager::~ViewManager() +{ + if (m_tmpdir != "") deleteTemporaryDirectory(m_tmpdir); +} + unsigned long ViewManager::getGlobalCentreFrame() const { @@ -351,6 +361,94 @@ } } +QString +ViewManager::getTemporaryDirectory() +{ + if (m_tmpdir != "") return m_tmpdir; + + // Generate a temporary directory. Qt4.1 doesn't seem to be able + // to do this for us, and mkdtemp is not standard. This method is + // based on the way glibc does mkdtemp. + + static QString chars = + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + + QString suffix; + int padlen = 6, attempts = 100; + unsigned int r = time(0) ^ getpid(); + + for (int i = 0; i < padlen; ++i) { + suffix += "X"; + } + + for (int j = 0; j < attempts; ++j) { + + unsigned int v = r; + + for (int i = 0; i < padlen; ++i) { + suffix[i] = chars[v % 62]; + v /= 62; + } + + QString candidate = QString("sv_%1").arg(suffix); + + if (QDir::temp().mkpath(candidate)) { + m_tmpdir = QDir::temp().filePath(candidate); + break; + } + + r = r + 7777; + } + + if (m_tmpdir == "") { + std::cerr << "ERROR: ViewManager::getTemporaryDirectory: " + << "Unable to create a temporary directory!" << std::endl; + assert(0); + } + + return m_tmpdir; +} + +void +ViewManager::deleteTemporaryDirectory(QString tmpdir) +{ + if (tmpdir == "") return; + + QDir dir(tmpdir); + dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); + + for (unsigned int i = 0; i < dir.count(); ++i) { + + QFileInfo fi(dir.filePath(dir[i])); + + if (fi.isDir()) { + deleteTemporaryDirectory(fi.absoluteFilePath()); + } else { + if (!QFile(fi.absoluteFilePath()).remove()) { + std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: " + << "Failed to unlink file \"" + << fi.absoluteFilePath().toStdString() << "\"" + << std::endl; + } + } + } + + QString dirname = dir.dirName(); + if (dirname != "") { + if (!dir.cdUp()) { + std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: " + << "Failed to cd to parent directory of " + << tmpdir.toStdString() << std::endl; + return; + } + if (!dir.rmdir(dirname)) { + std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: " + << "Failed to remove directory " + << dirname.toStdString() << std::endl; + } + } +} + #ifdef INCLUDE_MOCFILES #include "ViewManager.moc.cpp" #endif