5#include <QLoggingCategory>
7#include "ListFileModel.h"
8#include "ChannelSFTP.h"
11static Q_LOGGING_CATEGORY(log,
"FileTransfer.ListFileModel")
13static QAtomicInt g_Id;
16 const QString& remoteFile,
19 , m_szLocalFile(localFile)
20 , m_LocalPermission(0x0644)
21 , m_szRemoteFile(remoteFile)
22 , m_RemotePermission(0x0644)
27 , m_Priority(Priority::Normal)
34QString CFileTransfer::HeaderData(
int section)
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:
47 case ColumnValue::State:
49 case ColumnValue::Time:
51 case ColumnValue::Explanation:
52 return tr(
"Explanation");
53 case ColumnValue::Priority:
54 return tr(
"Priority");
61QVariant CFileTransfer::Data(
int column,
int role)
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;
77 if(Qt::DisplayRole == role) {
79 switch ((ColumnValue)column) {
80 case ColumnValue::LocalFiles:
81 szData = GetLocalFile();
83 case ColumnValue::RemoteFiles:
84 szData = GetRemoteFile();
86 case ColumnValue::FileSize: {
87 szData = CStats::Convertbytes(GetTransferSize()) +
"/" + CStats::Convertbytes(GetFileSize());
90 case ColumnValue::Direction:
91 szData = GetDirectionName();
93 case ColumnValue::State:
94 szData = GetStateName();
96 case ColumnValue::Priority:
97 szData = GetPriority();
99 case ColumnValue::Speed:
100 szData = CStats::Convertbytes(GetSpeed());
102 case ColumnValue::Time:
103 szData = GetFinishTime();
105 case ColumnValue::Explanation:
106 szData = GetExplanation();
117int CFileTransfer::GetId()
122QString CFileTransfer::GetDirectionName()
124 switch ((Direction)GetDirection()) {
125 case Direction::Upload:
128 case Direction::Download:
130 return tr(
"Download");
135CFileTransfer::Direction CFileTransfer::GetDirection()
140void CFileTransfer::SetDirection(Direction d)
145QString CFileTransfer::GetLocalFile()
147 return m_szLocalFile;
150void CFileTransfer::SetLocaleFile(
const QString &szFile)
152 m_szLocalFile = szFile;
155QString CFileTransfer::GetRemoteFile()
157 return m_szRemoteFile;
160void CFileTransfer::SetRemoteFile(
const QString &szFile)
162 m_szRemoteFile = szFile;
165quint64 CFileTransfer::GetFileSize()
170void CFileTransfer::SetFileSize(quint64 size)
175quint64 CFileTransfer::GetTransferSize()
177 return m_nTransferSize;
180void CFileTransfer::slotTransferSize(quint64 nAddSize)
182 m_nTransferSize += nAddSize;
183 QDateTime tmCur = QDateTime::currentDateTime();
184 int nSec = m_tmLast.secsTo(tmCur);
186 m_fSpeed = ((float_t)(m_nTransferSize - m_nLastSize)) / (float_t)nSec;
188 m_nLastSize = m_nTransferSize;
191float_t CFileTransfer::GetSpeed()
196QString CFileTransfer::GetFinishTime()
198 return m_FinishTime.toString(QLocale::system().dateTimeFormat(QLocale::ShortFormat));
201void CFileTransfer::slotFinish()
203 m_FinishTime = QDateTime::currentDateTime();
206void CFileTransfer::SetFinishTime(QString szTime) {
207 if(szTime.isEmpty())
return;
208 m_FinishTime = QDateTime::fromString(szTime, QLocale::system().dateTimeFormat(QLocale::ShortFormat));
211quint32 CFileTransfer::GetLocalPermission()
const
213 return m_LocalPermission;
216void CFileTransfer::SetLocalPermission(quint32 newLocalPermission)
218 m_LocalPermission = newLocalPermission;
221quint32 CFileTransfer::GetRemotePermission()
const
223 return m_RemotePermission;
226void CFileTransfer::SetRemotePermission(quint32 newRemotePermission)
228 m_RemotePermission = newRemotePermission;
231QString CFileTransfer::GetStateName()
233 switch (GetState()) {
237 return tr(
"Opening");
238 case State::Transferring:
239 return tr(
"Transferring");
241 return tr(
"Closing");
251CFileTransfer::State CFileTransfer::GetState()
256void CFileTransfer::slotSetstate(State s)
258 if(State::Opening == s)
259 m_tmLast = QDateTime::currentDateTime();
263QString CFileTransfer::GetPriority()
265 switch((Priority)m_Priority) {
266 case Priority::Height:
268 case Priority::Normal:
270 case Priority::Lower:
278void CFileTransfer::slotSetPrority(Priority p)
283QString CFileTransfer::GetExplanation()
285 return m_szExplanation;
288void CFileTransfer::slotSetExplanation(
const QString &explanation)
290 m_szExplanation = explanation;
293CListFileModel::CListFileModel(QObject *parent)
294 : QAbstractTableModel(parent)
298QVariant CListFileModel::headerData(
int section, Qt::Orientation orientation,
int role)
const
301 if(Qt::DisplayRole != role)
303 if(Qt::Vertical == orientation) {
304 if(m_lstFile.size() <= section || 0 > section)
306 auto p = m_lstFile.at(section);
311 return CFileTransfer::HeaderData(section);
314int CListFileModel::rowCount(
const QModelIndex &parent)
const
317 if (parent.isValid())
319 return m_lstFile.size();
322int CListFileModel::columnCount(
const QModelIndex &parent)
const
325 if (parent.isValid())
328 return (
int)CFileTransfer::ColumnValue::End;
331QVariant CListFileModel::data(
const QModelIndex &index,
int role)
const
334 if (!index.isValid())
338 if(r > m_lstFile.size() || r < 0)
341 auto p = m_lstFile.at(r);
343 return p->Data(index.column(), role);
348QModelIndex CListFileModel::AddFileTransfer(QSharedPointer<CFileTransfer> f)
350 if(!f)
return QModelIndex();
351 int r = m_lstFile.size();
352 beginInsertRows(QModelIndex(), r, r);
355 emit dataChanged(index(r, 0), index(r, (
int)CFileTransfer::ColumnValue::End));
359int CListFileModel::RemoveFileTransfer(
int id)
362 for(
int i = 0; i < m_lstFile.size(); i++) {
363 auto p = m_lstFile.at(i);
365 if(p->GetId() ==
id) {
366 beginRemoveRows(QModelIndex(), i, i);
367 m_lstFile.removeAt(i);
376int CListFileModel::RemoveFileTransfer(QList<int> ids)
378 if(ids.isEmpty())
return 0;
379 std::sort(ids.begin(), ids.end());
381 auto it = std::remove_if(m_lstFile.begin(), m_lstFile.end(),
382 [&](QSharedPointer<CFileTransfer> f){
383 return ids.contains(f->GetId());
385 m_lstFile.erase(it, m_lstFile.end());
390QSharedPointer<CFileTransfer> CListFileModel::GetFileTransfer(
const QModelIndex &index)
392 if (!index.isValid())
393 return QSharedPointer<CFileTransfer>();
395 if(0 > r || m_lstFile.size() <= r)
396 return QSharedPointer<CFileTransfer>();
397 return m_lstFile.at(r);
400bool CListFileModel::removeRows(
int row,
int count,
const QModelIndex &parent)
402 beginRemoveRows(parent, row, row + count - 1);
403 m_lstFile.remove(row, count);
408void CListFileModel::UpdateFileTransfer(QSharedPointer<CFileTransfer> f)
411 int r = m_lstFile.indexOf(f);
415 QModelIndex topLeft = index(r, 0);
416 QModelIndex bootRight = index(r, (
int)CFileTransfer::ColumnValue::End - 1);
417 emit dataChanged(topLeft, bootRight);
420int CListFileModel::Load(QSettings &set)
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(
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);
441 f->slotSetExplanation(set.value(
"Explanation", f->GetExplanation()).toString());
442 f->SetFinishTime(set.value(
"FinishTime", f->GetFinishTime()).toString());
450int CListFileModel::Save(QSettings &set)
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);
467 set.setValue(
"Explanation", f->GetExplanation());
468 set.setValue(
"FinishTime", f->GetFinishTime());