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