9#include "CnetDisplayProperties.h"
17#include <QFutureWatcher>
19#include <QReadWriteLock>
24#include <QtConcurrentRun>
26#include "ControlNet.h"
28#include "IException.h"
30#include "SerialNumber.h"
34 CnetDisplayProperties *CnetDisplayProperties::m_instance = NULL;
37 CnetDisplayProperties *CnetDisplayProperties::getInstance() {
38 return m_instance ? m_instance : m_instance =
new CnetDisplayProperties;
42 CnetDisplayProperties::CnetDisplayProperties() {
46 m_curComposing =
false;
47 m_showFullPath =
false;
49 m_readWriteLock =
new QReadWriteLock;
53 m_composedCount =
new QAtomicInt;
54 m_interruptFlag =
new QAtomicInt;
55 m_interruptFlag->fetchAndStoreRelaxed(0);
57 m_composeStatusPoller =
new QTimer;
58 connect(m_composeStatusPoller, SIGNAL(timeout()),
59 this, SLOT(composeStatusUpdated()));
61 m_composeWatcher =
new QFutureWatcher< QMap< QString, QString > >;
62 connect(m_composeWatcher, SIGNAL(finished()),
63 this, SLOT(serialNumbersComposed()));
84 CnetDisplayProperties::~CnetDisplayProperties() {
85 delete m_serialNumberToFileNameMap;
86 m_serialNumberToFileNameMap = NULL;
88 delete m_composeWatcher;
89 m_composeWatcher = NULL;
91 delete m_composedCount;
92 m_composedCount = NULL;
94 delete m_interruptFlag;
95 m_interruptFlag = NULL;
99 bool CnetDisplayProperties::currentlyComposing()
const {
100 return m_curComposing;
113 QList<QString> results;
115 if (!currentlyComposing()) {
116 foreach (QString serialNumber, cnet->GetCubeSerials()) {
117 QString possibleFileName =
getImageName(serialNumber,
true);
119 if (possibleFileName != serialNumber)
120 results.append(possibleFileName);
128 QString CnetDisplayProperties::getFileName(QString fileName,
129 bool forceFullPaths)
const {
132 if (forceFullPaths || getShowsFullPaths())
135 result = QFileInfo(fileName).fileName();
153 bool forceFullPaths)
const {
155 QString imageName = cubeSerialNumber;
157 m_readWriteLock->lockForRead();
159 if (m_serialNumberToFileNameMap && useFileNames &&
160 m_serialNumberToFileNameMap->contains(cubeSerialNumber)) {
161 QString value = m_serialNumberToFileNameMap->value(cubeSerialNumber);
162 m_readWriteLock->unlock();
164 if (value.toLower() !=
"unknown")
165 imageName = getFileName(value, forceFullPaths);
168 m_readWriteLock->unlock();
175 QString CnetDisplayProperties::getSerialNumber(QString imageId) {
176 QString sn = imageId;
178 if (m_serialNumberToFileNameMap && useFileNames) {
179 m_readWriteLock->lockForRead();
180 QMapIterator< QString, QString > i(*m_serialNumberToFileNameMap);
183 while (!found && i.hasNext()) {
185 if (i.value() == imageId) {
191 m_readWriteLock->unlock();
198 bool CnetDisplayProperties::getShowsFullPaths()
const {
199 return m_showFullPath;
203 void CnetDisplayProperties::setCubeList(QString fileName) {
204 QFile imageListFile(fileName);
206 if (!imageListFile.exists()) {
207 IString msg =
"The file [";
208 msg += (IString) fileName;
209 msg +=
"] does not exist.\n";
213 if (!imageListFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
214 IString msg =
"The file [";
215 msg += (IString) fileName;
216 msg +=
"] failed to open.\n";
221 QTextStream ts(&imageListFile);
224 imageFileNames << ts.readLine();
226 imageListFile.close();
228 m_curComposing =
true;
230 QFuture< QMap< QString, QString > > future = QtConcurrent::run(
231 this, &CnetDisplayProperties::composeSerialNumbers, imageFileNames);
233 m_composeWatcher->setFuture(future);
237 void CnetDisplayProperties::setFileNameUsage(
bool preferFileNames) {
238 useFileNames = preferFileNames;
255 void CnetDisplayProperties::setShowsFullPaths(
bool newState) {
256 m_showFullPath = newState;
262 emit composeProgressRangeChanged(0, fileNames.size() - 1);
263 m_composedCount->fetchAndStoreRelaxed(0);
267 for (
int i = 0; *m_interruptFlag == 0 && i < fileNames.size(); i++) {
268 QString fileName = fileNames[i];
275 m_composedCount->fetchAndAddRelaxed(1);
282 void CnetDisplayProperties::nullify() {
283 m_serialNumberToFileNameMap = NULL;
284 m_composeWatcher = NULL;
286 m_composedCount = NULL;
287 m_interruptFlag = NULL;
289 m_readWriteLock = NULL;
293 void CnetDisplayProperties::composeStatusUpdated() {
294 emit composeProgressChanged(*m_composedCount);
298 void CnetDisplayProperties::serialNumbersComposed() {
299 if (*m_interruptFlag) {
300 m_interruptFlag->fetchAndStoreRelaxed(0);
303 m_readWriteLock->lockForWrite();
304 *m_serialNumberToFileNameMap = m_composeWatcher->result();
306 m_readWriteLock->unlock();
309 m_curComposing =
false;
310 m_composeStatusPoller->stop();
311 emit composeProgressRangeChanged(0, 0);
312 emit composeProgressChanged(0);
313 emit compositionFinished();
QList< QString > getCubeList(ControlNet *cnet) const
TODO comment me.
QString getImageName(QString cubeSerialNumber, bool forceFullPaths=false) const
@ Programmer
This error is for when a programmer made an API call that was illegal.
static QString Compose(Pvl &label, bool def2filename=false)
Compose a SerialNumber from a PVL.
This is free and unencumbered software released into the public domain.