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