玉兔远程控制 0.1.0-bate4
载入中...
搜索中...
未找到
ListFileModel.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include <QAtomicInt>
5#include <QLoggingCategory>
6#include <QLocale>
7#include "ListFileModel.h"
8#include "Stats.h"
9
10static Q_LOGGING_CATEGORY(log, "FileTransfer.ListFileModel")
11
12static QAtomicInt g_Id;
13
14CFileTransfer::CFileTransfer(const QString& localFile,
15 const QString& remoteFile,
16 Direction dir)
17 : QObject()
18 , m_szLocalFile(localFile)
19 , m_LocalPermission(0x0644)
20 , m_szRemoteFile(remoteFile)
21 , m_RemotePermission(0x0644)
22 , m_nFileSize(0)
23 , m_nTransferSize(0)
24 , m_Direction(dir)
25 , m_State(State::No)
26 , m_Priority(Priority::Normal)
27 , m_nLastSize(0)
28 , m_fSpeed(0)
29{
30 m_nId = g_Id++;
31}
32
33QString CFileTransfer::HeaderData(int section)
34{
35 switch((ColumnValue)section) {
36 case ColumnValue::LocalFiles:
37 return tr("Local files");
38 case ColumnValue::Direction:
39 return tr("Direction");
40 case ColumnValue::RemoteFiles:
41 return tr("Remote files");
42 case ColumnValue::FileSize:
43 return tr("File size");
44 case ColumnValue::Speed:
45 return tr("Speed");
46 case ColumnValue::State:
47 return tr("state");
48 case ColumnValue::Time:
49 return tr("Time");
50 case ColumnValue::Explanation:
51 return tr("Explanation");
52 case ColumnValue::Priority:
53 return tr("Priority");
54 default:
55 break;
56 }
57 return QString();
58}
59
60QVariant CFileTransfer::Data(int column, int role)
61{
62 if(Qt::TextAlignmentRole == role) {
63 switch((ColumnValue)column) {
64 case ColumnValue::Direction:
65 case ColumnValue::State:
66 case ColumnValue::Priority:
67 return Qt::AlignHCenter;
68 case ColumnValue::FileSize:
69 case ColumnValue::Speed:
70 return Qt::AlignRight;
71 default:
72 return Qt::AlignLeft;
73 }
74 }
75
76 if(Qt::DisplayRole == role) {
77 QString szData;
78 switch ((ColumnValue)column) {
79 case ColumnValue::LocalFiles:
80 szData = GetLocalFile();
81 break;
82 case ColumnValue::RemoteFiles:
83 szData = GetRemoteFile();
84 break;
85 case ColumnValue::FileSize: {
86 szData = CStats::Convertbytes(GetTransferSize()) + "/" + CStats::Convertbytes(GetFileSize());
87 break;
88 }
89 case ColumnValue::Direction:
90 szData = GetDirectionName();
91 break;
92 case ColumnValue::State:
93 szData = GetStateName();
94 break;
95 case ColumnValue::Priority:
96 szData = GetPriority();
97 break;
98 case ColumnValue::Speed:
99 szData = CStats::Convertbytes(GetSpeed());
100 break;
101 case ColumnValue::Time:
102 szData = GetFinishTime();
103 break;
104 case ColumnValue::Explanation:
105 szData = GetExplanation();
106 break;
107 default:
108 break;
109 }
110 return szData;
111 }
112
113 return QVariant();
114}
115
116int CFileTransfer::GetId()
117{
118 return m_nId;
119}
120
121QString CFileTransfer::GetDirectionName()
122{
123 switch ((Direction)GetDirection()) {
124 case Direction::Upload:
125 return "---->";
126 return tr("Upload");
127 case Direction::Download:
128 return "<----";
129 return tr("Download");
130 }
131 return QString();
132}
133
134CFileTransfer::Direction CFileTransfer::GetDirection()
135{
136 return m_Direction;
137}
138
139void CFileTransfer::SetDirection(Direction d)
140{
141 m_Direction = d;
142}
143
144QString CFileTransfer::GetLocalFile()
145{
146 return m_szLocalFile;
147}
148
149void CFileTransfer::SetLocaleFile(const QString &szFile)
150{
151 m_szLocalFile = szFile;
152}
153
154QString CFileTransfer::GetRemoteFile()
155{
156 return m_szRemoteFile;
157}
158
159void CFileTransfer::SetRemoteFile(const QString &szFile)
160{
161 m_szRemoteFile = szFile;
162}
163
164quint64 CFileTransfer::GetFileSize()
165{
166 return m_nFileSize;
167}
168
169void CFileTransfer::SetFileSize(quint64 size)
170{
171 m_nFileSize = size;
172}
173
174quint64 CFileTransfer::GetTransferSize()
175{
176 return m_nTransferSize;
177}
178
179void CFileTransfer::slotTransferSize(quint64 nAddSize)
180{
181 m_nTransferSize += nAddSize;
182 QDateTime tmCur = QDateTime::currentDateTime();
183 int nSec = m_tmLast.secsTo(tmCur);
184 if(nSec < 1) return;
185 m_fSpeed = ((float_t)(m_nTransferSize - m_nLastSize)) / (float_t)nSec;
186 m_tmLast = tmCur;
187 m_nLastSize = m_nTransferSize;
188}
189
190float_t CFileTransfer::GetSpeed()
191{
192 return m_fSpeed;
193}
194
195QString CFileTransfer::GetFinishTime()
196{
197 return m_FinishTime.toString(QLocale::system().dateTimeFormat(QLocale::ShortFormat));
198}
199
200void CFileTransfer::slotFinish()
201{
202 m_FinishTime = QDateTime::currentDateTime();
203}
204
205void CFileTransfer::SetFinishTime(QString szTime) {
206 if(szTime.isEmpty()) return;
207 m_FinishTime = QDateTime::fromString(szTime, QLocale::system().dateTimeFormat(QLocale::ShortFormat));
208}
209
210quint32 CFileTransfer::GetLocalPermission() const
211{
212 return m_LocalPermission;
213}
214
215void CFileTransfer::SetLocalPermission(quint32 newLocalPermission)
216{
217 m_LocalPermission = newLocalPermission;
218}
219
220quint32 CFileTransfer::GetRemotePermission() const
221{
222 return m_RemotePermission;
223}
224
225void CFileTransfer::SetRemotePermission(quint32 newRemotePermission)
226{
227 m_RemotePermission = newRemotePermission;
228}
229
230QString CFileTransfer::GetStateName()
231{
232 switch (GetState()) {
233 case State::No:
234 return QString();
235 case State::Opening:
236 return tr("Opening");
237 case State::Transferring:
238 return tr("Transferring");
239 case State::Closing:
240 return tr("Closing");
241 case State::Stop:
242 return tr("Stop");
243 case State::Fail:
244 return tr("Fail");
245 case State::Finish:
246 return tr("Finish");
247 }
248 return QString();
249}
250CFileTransfer::State CFileTransfer::GetState()
251{
252 return m_State;
253}
254
255void CFileTransfer::slotSetstate(State s)
256{
257 if(State::Opening == s)
258 m_tmLast = QDateTime::currentDateTime();
259 m_State = s;
260}
261
262QString CFileTransfer::GetPriority()
263{
264 switch((Priority)m_Priority) {
265 case Priority::Height:
266 return tr("High");
267 case Priority::Normal:
268 return tr("Normal");
269 case Priority::Lower:
270 return tr("Lower");
271 default:
272 break;
273 }
274 return QString();
275}
276
277void CFileTransfer::slotSetPrority(Priority p)
278{
279 m_Priority = p;
280}
281
282QString CFileTransfer::GetExplanation()
283{
284 return m_szExplanation;
285}
286
287void CFileTransfer::slotSetExplanation(const QString &explanation)
288{
289 m_szExplanation = explanation;
290}
291
292CListFileModel::CListFileModel(QObject *parent)
293 : QAbstractTableModel(parent)
294{
295}
296
297QVariant CListFileModel::headerData(int section, Qt::Orientation orientation, int role) const
298{
299 //qDebug(log) << Q_FUNC_INFO << section << orientation << role;
300 if(Qt::DisplayRole != role)
301 return QVariant();
302 if(Qt::Vertical == orientation) {
303 if(m_lstFile.size() <= section || 0 > section)
304 return QVariant();
305 auto p = m_lstFile.at(section);
306 if(p)
307 return p->GetId();
308 return QVariant();
309 }
310 return CFileTransfer::HeaderData(section);
311}
312
313int CListFileModel::rowCount(const QModelIndex &parent) const
314{
315 //qDebug(log) << Q_FUNC_INFO << parent;
316 if (parent.isValid())
317 return 0;
318 return m_lstFile.size();
319}
320
321int CListFileModel::columnCount(const QModelIndex &parent) const
322{
323 //qDebug(log) << Q_FUNC_INFO << parent;
324 if (parent.isValid())
325 return 0;
326
327 return (int)CFileTransfer::ColumnValue::End;
328}
329
330QVariant CListFileModel::data(const QModelIndex &index, int role) const
331{
332 //qDebug(log) << Q_FUNC_INFO << index << role;
333 if (!index.isValid())
334 return QVariant();
335
336 int r = index.row();
337 if(r > m_lstFile.size() || r < 0)
338 return QVariant();
339
340 auto p = m_lstFile.at(r);
341 if(p)
342 return p->Data(index.column(), role);
343
344 return QVariant();
345}
346
347QModelIndex CListFileModel::AddFileTransfer(QSharedPointer<CFileTransfer> f)
348{
349 if(!f) return QModelIndex();
350 int r = m_lstFile.size();
351 beginInsertRows(QModelIndex(), r, r);
352 m_lstFile.append(f);
353 endInsertRows();
354 emit dataChanged(index(r, 0), index(r, (int)CFileTransfer::ColumnValue::End));
355 return index(r, 0);
356}
357
358int CListFileModel::RemoveFileTransfer(int id)
359{
360 int nRet = 0;
361 for(int i = 0; i < m_lstFile.size(); i++) {
362 auto p = m_lstFile.at(i);
363 if(p) {
364 if(p->GetId() == id) {
365 beginRemoveRows(QModelIndex(), i, i);
366 m_lstFile.removeAt(i);
367 endRemoveRows();
368 return 0;
369 }
370 }
371 }
372 return nRet;
373}
374
375int CListFileModel::RemoveFileTransfer(QList<int> ids)
376{
377 if(ids.isEmpty()) return 0;
378 std::sort(ids.begin(), ids.end());
379 beginResetModel();
380 auto it = std::remove_if(m_lstFile.begin(), m_lstFile.end(),
381 [&](QSharedPointer<CFileTransfer> f){
382 return ids.contains(f->GetId());
383 });
384 m_lstFile.erase(it, m_lstFile.end());
385 endResetModel();
386 return 0;
387}
388
389QSharedPointer<CFileTransfer> CListFileModel::GetFileTransfer(const QModelIndex &index)
390{
391 if (!index.isValid())
392 return QSharedPointer<CFileTransfer>();
393 int r = index.row();
394 if(0 > r || m_lstFile.size() <= r)
395 return QSharedPointer<CFileTransfer>();
396 return m_lstFile.at(r);
397}
398
399bool CListFileModel::removeRows(int row, int count, const QModelIndex &parent)
400{
401 beginRemoveRows(parent, row, row + count - 1);
402#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
403 m_lstFile.remove(row, count);
404#else
405 for(int i = row + count - 1; i >= row && i < m_lstFile.size();) {
406 m_lstFile.removeAt(i--);
407 }
408#endif
409 endRemoveRows();
410 return true;
411}
412
413void CListFileModel::UpdateFileTransfer(QSharedPointer<CFileTransfer> f)
414{
415 if(!f) return;
416 int r = m_lstFile.indexOf(f);
417 if(-1 == r)
418 return;
419 //qDebug(log) << "Find:" << r;
420 QModelIndex topLeft = index(r, 0);
421 QModelIndex bootRight = index(r, (int)CFileTransfer::ColumnValue::End - 1);
422 emit dataChanged(topLeft, bootRight);
423}
424
425int CListFileModel::Load(QSettings &set)
426{
427 int nCount = 0;
428 beginResetModel();
429 nCount = set.value("Model/ListFile/Count").toInt();
430 for(int i = 0; i < nCount; i++) {
431 set.beginGroup("Model/ListFile/FileTransfer" + QString::number(i));
432 QString szLocal = set.value("Local/File").toString();
433 CFileTransfer::Direction direction =
434 (CFileTransfer::Direction)set.value("Direction", (int)CFileTransfer::Direction::Upload).toInt();
435 QString szRemoteFile = set.value("Remote/File").toString();
436 QSharedPointer<CFileTransfer> f(
437 new CFileTransfer(szLocal, szRemoteFile, direction));
438 f->SetRemotePermission(set.value("Remote/Permission", f->GetRemotePermission()).toULongLong());
439 f->SetFileSize(set.value("File/Size", f->GetFileSize()).toULongLong());
440 f->slotTransferSize(set.value("File/Size/Transfer", f->GetTransferSize()).toULongLong());
441 CFileTransfer::State state = (CFileTransfer::State)set.value("State", (int)f->GetState()).toInt();
442 if(!(CFileTransfer::State::Finish == state || CFileTransfer::State::Fail == state))
443 state = CFileTransfer::State::No;
444 f->slotSetstate(state);
445 //f->slotSetPrority((CFileTransfer::Priority)set.value("Prioity", f->GetPriority()).toInt());
446 f->slotSetExplanation(set.value("Explanation", f->GetExplanation()).toString());
447 f->SetFinishTime(set.value("FinishTime", f->GetFinishTime()).toString());
448 set.endGroup();
449 m_lstFile.append(f);
450 }
451 endResetModel();
452 return 0;
453}
454
455int CListFileModel::Save(QSettings &set)
456{
457 set.setValue("Model/ListFile/Count", m_lstFile.size());
458 for(int i = 0; i < m_lstFile.size(); i++) {
459 auto f = m_lstFile.at(i);
460 set.beginGroup("Model/ListFile/FileTransfer" + QString::number(i));
461 set.setValue("Local/File", f->GetLocalFile());
462 set.setValue("Direction", (int)f->GetDirection());
463 set.setValue("Remote/File", f->GetRemoteFile());
464 set.setValue("Remote/Permission", f->GetRemotePermission());
465 set.setValue("File/Size", f->GetFileSize());
466 set.setValue("File/Size/Transfer", f->GetTransferSize());
467 CFileTransfer::State state = f->GetState();
468 if(!(CFileTransfer::State::Finish == state || CFileTransfer::State::Fail == state))
469 state = CFileTransfer::State::No;
470 set.setValue("State", (int)state);
471 //set.setValue("Prioity", f->GetPriority());
472 set.setValue("Explanation", f->GetExplanation());
473 set.setValue("FinishTime", f->GetFinishTime());
474 set.endGroup();
475 }
476 return 0;
477}