comparison 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
comparison
equal deleted inserted replaced
74:47fd14e29813 75:163f3428bbe0
17 #include "AudioPlaySource.h" 17 #include "AudioPlaySource.h"
18 #include "Model.h" 18 #include "Model.h"
19 #include "CommandHistory.h" 19 #include "CommandHistory.h"
20 20
21 #include <iostream> 21 #include <iostream>
22
23 #include <QDir>
24 #include <QFile>
25
26 #include <cassert>
22 27
23 // #define DEBUG_VIEW_MANAGER 1 28 // #define DEBUG_VIEW_MANAGER 1
24 29
25 ViewManager::ViewManager() : 30 ViewManager::ViewManager() :
26 m_playSource(0), 31 m_playSource(0),
43 connect(this, 48 connect(this,
44 SIGNAL(zoomLevelChanged(void *, unsigned long, bool)), 49 SIGNAL(zoomLevelChanged(void *, unsigned long, bool)),
45 SLOT(considerZoomChange(void *, unsigned long, bool))); 50 SLOT(considerZoomChange(void *, unsigned long, bool)));
46 } 51 }
47 52
53 ViewManager::~ViewManager()
54 {
55 if (m_tmpdir != "") deleteTemporaryDirectory(m_tmpdir);
56 }
57
48 unsigned long 58 unsigned long
49 ViewManager::getGlobalCentreFrame() const 59 ViewManager::getGlobalCentreFrame() const
50 { 60 {
51 #ifdef DEBUG_VIEW_MANAGER 61 #ifdef DEBUG_VIEW_MANAGER
52 std::cout << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << std::endl; 62 std::cout << "ViewManager::getGlobalCentreFrame: returning " << m_globalCentreFrame << std::endl;
349 m_overlayMode = mode; 359 m_overlayMode = mode;
350 emit overlayModeChanged(); 360 emit overlayModeChanged();
351 } 361 }
352 } 362 }
353 363
364 QString
365 ViewManager::getTemporaryDirectory()
366 {
367 if (m_tmpdir != "") return m_tmpdir;
368
369 // Generate a temporary directory. Qt4.1 doesn't seem to be able
370 // to do this for us, and mkdtemp is not standard. This method is
371 // based on the way glibc does mkdtemp.
372
373 static QString chars =
374 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
375
376 QString suffix;
377 int padlen = 6, attempts = 100;
378 unsigned int r = time(0) ^ getpid();
379
380 for (int i = 0; i < padlen; ++i) {
381 suffix += "X";
382 }
383
384 for (int j = 0; j < attempts; ++j) {
385
386 unsigned int v = r;
387
388 for (int i = 0; i < padlen; ++i) {
389 suffix[i] = chars[v % 62];
390 v /= 62;
391 }
392
393 QString candidate = QString("sv_%1").arg(suffix);
394
395 if (QDir::temp().mkpath(candidate)) {
396 m_tmpdir = QDir::temp().filePath(candidate);
397 break;
398 }
399
400 r = r + 7777;
401 }
402
403 if (m_tmpdir == "") {
404 std::cerr << "ERROR: ViewManager::getTemporaryDirectory: "
405 << "Unable to create a temporary directory!" << std::endl;
406 assert(0);
407 }
408
409 return m_tmpdir;
410 }
411
412 void
413 ViewManager::deleteTemporaryDirectory(QString tmpdir)
414 {
415 if (tmpdir == "") return;
416
417 QDir dir(tmpdir);
418 dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot);
419
420 for (unsigned int i = 0; i < dir.count(); ++i) {
421
422 QFileInfo fi(dir.filePath(dir[i]));
423
424 if (fi.isDir()) {
425 deleteTemporaryDirectory(fi.absoluteFilePath());
426 } else {
427 if (!QFile(fi.absoluteFilePath()).remove()) {
428 std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: "
429 << "Failed to unlink file \""
430 << fi.absoluteFilePath().toStdString() << "\""
431 << std::endl;
432 }
433 }
434 }
435
436 QString dirname = dir.dirName();
437 if (dirname != "") {
438 if (!dir.cdUp()) {
439 std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: "
440 << "Failed to cd to parent directory of "
441 << tmpdir.toStdString() << std::endl;
442 return;
443 }
444 if (!dir.rmdir(dirname)) {
445 std::cerr << "WARNING: ViewManager::deleteTemporaryDirectory: "
446 << "Failed to remove directory "
447 << dirname.toStdString() << std::endl;
448 }
449 }
450 }
451
354 #ifdef INCLUDE_MOCFILES 452 #ifdef INCLUDE_MOCFILES
355 #include "ViewManager.moc.cpp" 453 #include "ViewManager.moc.cpp"
356 #endif 454 #endif
357 455