Isis 3 Programmer Reference
CnetDisplayProperties.cpp
1
7/* SPDX-License-Identifier: CC0-1.0 */
8
9#include "CnetDisplayProperties.h"
10
11#include <iostream>
12
13#include <QAtomicInt>
14#include <QFile>
15#include <QFileInfo>
16#include <QFuture>
17#include <QFutureWatcher>
18#include <QMap>
19#include <QReadWriteLock>
20#include <QString>
21#include <QStringList>
22#include <QTextStream>
23#include <QTimer>
24#include <QtConcurrentRun>
25
26#include "ControlNet.h"
27#include "Cube.h"
28#include "IException.h"
29#include "IString.h"
30#include "SerialNumber.h"
31
32
33namespace Isis {
34 CnetDisplayProperties *CnetDisplayProperties::m_instance = NULL;
35
36
37 CnetDisplayProperties *CnetDisplayProperties::getInstance() {
38 return m_instance ? m_instance : m_instance = new CnetDisplayProperties;
39 }
40
41
42 CnetDisplayProperties::CnetDisplayProperties() {
43 nullify();
44
45 useFileNames = true;
46 m_curComposing = false;
47 m_showFullPath = false;
48
49 m_readWriteLock = new QReadWriteLock;
50
51 m_serialNumberToFileNameMap = new QMap< QString, QString >;
52
53 m_composedCount = new QAtomicInt;
54 m_interruptFlag = new QAtomicInt;
55 m_interruptFlag->fetchAndStoreRelaxed(0);
56
57 m_composeStatusPoller = new QTimer;
58 connect(m_composeStatusPoller, SIGNAL(timeout()),
59 this, SLOT(composeStatusUpdated()));
60
61 m_composeWatcher = new QFutureWatcher< QMap< QString, QString > >;
62 connect(m_composeWatcher, SIGNAL(finished()),
63 this, SLOT(serialNumbersComposed()));
64 }
65
66
67// CnetDisplayProperties::CnetDisplayProperties(
68// CnetDisplayProperties const & other)
69// {
70// nullify();
71//
72// useFileNames = other.useFileNames;
73// m_serialNumberToFileNameMap = new QMap< QString, QString >(
74// *other.m_serialNumberToFileNameMap);
75//
76// m_composeStatusPoller = new QTimer;
77//
78// m_composeWatcher = new QFutureWatcher< QMap< QString, QString > >;
79// connect(m_composeWatcher, SIGNAL(finished()),
80// this, SLOT(serialNumbersComposed()));
81// }
82
83
84 CnetDisplayProperties::~CnetDisplayProperties() {
85 delete m_serialNumberToFileNameMap;
86 m_serialNumberToFileNameMap = NULL;
87
88 delete m_composeWatcher;
89 m_composeWatcher = NULL;
90
91 delete m_composedCount;
92 m_composedCount = NULL;
93
94 delete m_interruptFlag;
95 m_interruptFlag = NULL;
96 }
97
98
99 bool CnetDisplayProperties::currentlyComposing() const {
100 return m_curComposing;
101 }
102
103
112 QList<QString> CnetDisplayProperties::getCubeList(ControlNet *cnet) const {
113 QList<QString> results;
114
115 if (!currentlyComposing()) {
116 foreach (QString serialNumber, cnet->GetCubeSerials()) {
117 QString possibleFileName = getImageName(serialNumber, true);
118
119 if (possibleFileName != serialNumber)
120 results.append(possibleFileName);
121 }
122 }
123
124 return results;
125 }
126
127
128 QString CnetDisplayProperties::getFileName(QString fileName,
129 bool forceFullPaths) const {
130 QString result;
131
132 if (forceFullPaths || getShowsFullPaths())
133 result = fileName;
134 else
135 result = QFileInfo(fileName).fileName();
136
137 return result;
138 }
139
140
152 QString CnetDisplayProperties::getImageName(QString cubeSerialNumber,
153 bool forceFullPaths) const {
154
155 QString imageName = cubeSerialNumber;
156
157 m_readWriteLock->lockForRead();
158
159 if (m_serialNumberToFileNameMap && useFileNames &&
160 m_serialNumberToFileNameMap->contains(cubeSerialNumber)) {
161 QString value = m_serialNumberToFileNameMap->value(cubeSerialNumber);
162 m_readWriteLock->unlock();
163
164 if (value.toLower() != "unknown")
165 imageName = getFileName(value, forceFullPaths);
166 }
167 else {
168 m_readWriteLock->unlock();
169 }
170
171 return imageName;
172 }
173
174
175 QString CnetDisplayProperties::getSerialNumber(QString imageId) {
176 QString sn = imageId;
177
178 if (m_serialNumberToFileNameMap && useFileNames) {
179 m_readWriteLock->lockForRead();
180 QMapIterator< QString, QString > i(*m_serialNumberToFileNameMap);
181
182 bool found = false;
183 while (!found && i.hasNext()) {
184 i.next();
185 if (i.value() == imageId) {
186 found = true;
187 sn = i.key();
188 }
189 }
190
191 m_readWriteLock->unlock();
192 }
193
194 return sn;
195 }
196
197
198 bool CnetDisplayProperties::getShowsFullPaths() const {
199 return m_showFullPath;
200 }
201
202
203 void CnetDisplayProperties::setCubeList(QString fileName) {
204 QFile imageListFile(fileName);
205
206 if (!imageListFile.exists()) {
207 IString msg = "The file [";
208 msg += (IString) fileName;
209 msg += "] does not exist.\n";
210 throw IException(IException::Programmer, msg, _FILEINFO_);
211 }
212
213 if (!imageListFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
214 IString msg = "The file [";
215 msg += (IString) fileName;
216 msg += "] failed to open.\n";
217 throw IException(IException::Programmer, msg, _FILEINFO_);
218 }
219
220 QStringList imageFileNames;
221 QTextStream ts(&imageListFile);
222
223 while (!ts.atEnd())
224 imageFileNames << ts.readLine();
225
226 imageListFile.close();
227
228 m_curComposing = true;
229
230 QFuture< QMap< QString, QString > > future = QtConcurrent::run(
231 this, &CnetDisplayProperties::composeSerialNumbers, imageFileNames);
232
233 m_composeWatcher->setFuture(future);
234 }
235
236
237 void CnetDisplayProperties::setFileNameUsage(bool preferFileNames) {
238 useFileNames = preferFileNames;
239 }
240
241
242// CnetDisplayProperties & CnetDisplayProperties::operator=(
243// CnetDisplayProperties const & other)
244// {
245// if (this != &other)
246// {
247// m_composeWatcher->waitForFinished();
248// useFileNames = other.useFileNames;
249// }
250//
251// return *this;
252// }
253
254
255 void CnetDisplayProperties::setShowsFullPaths(bool newState) {
256 m_showFullPath = newState;
257 }
258
259
260 QMap< QString, QString > CnetDisplayProperties::composeSerialNumbers(
261 QStringList fileNames) {
262 emit composeProgressRangeChanged(0, fileNames.size() - 1);
263 m_composedCount->fetchAndStoreRelaxed(0);
264
266
267 for (int i = 0; *m_interruptFlag == 0 && i < fileNames.size(); i++) {
268 QString fileName = fileNames[i];
269
270 Cube cube;
271 cube.open(fileName);
272
273 newMap.insert(SerialNumber::Compose(fileName), fileNames[i]);
274
275 m_composedCount->fetchAndAddRelaxed(1);
276 }
277
278 return newMap;
279 }
280
281
282 void CnetDisplayProperties::nullify() {
283 m_serialNumberToFileNameMap = NULL;
284 m_composeWatcher = NULL;
285
286 m_composedCount = NULL;
287 m_interruptFlag = NULL;
288
289 m_readWriteLock = NULL;
290 }
291
292
293 void CnetDisplayProperties::composeStatusUpdated() {
294 emit composeProgressChanged(*m_composedCount);
295 }
296
297
298 void CnetDisplayProperties::serialNumbersComposed() {
299 if (*m_interruptFlag) {
300 m_interruptFlag->fetchAndStoreRelaxed(0);
301 }
302 else {
303 m_readWriteLock->lockForWrite();
304 *m_serialNumberToFileNameMap = m_composeWatcher->result();
305
306 m_readWriteLock->unlock();
307 }
308
309 m_curComposing = false;
310 m_composeStatusPoller->stop();
311 emit composeProgressRangeChanged(0, 0);
312 emit composeProgressChanged(0);
313 emit compositionFinished();
314 }
315}
QList< QString > getCubeList(ControlNet *cnet) const
TODO comment me.
QString getImageName(QString cubeSerialNumber, bool forceFullPaths=false) const
a control network
Definition ControlNet.h:258
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition IException.h:146
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.
Definition Apollo.h:16