Mercurial > hg > svcore
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 |