5#include <QLoggingCategory> 
    7#include "ListFileModel.h" 
   10static Q_LOGGING_CATEGORY(log, 
"FileTransfer.ListFileModel")
 
   12static QAtomicInt g_Id;
 
   15                             const QString& remoteFile,
 
   18    , m_szLocalFile(localFile)
 
   19    , m_LocalPermission(0x0644)
 
   20    , m_szRemoteFile(remoteFile)
 
   21    , m_RemotePermission(0x0644)
 
   26    , m_Priority(Priority::Normal)
 
   33QString CFileTransfer::HeaderData(
int section)
 
   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:
 
   46    case ColumnValue::State:
 
   48    case ColumnValue::Time:
 
   50    case ColumnValue::Explanation:
 
   51        return tr(
"Explanation");
 
   52    case ColumnValue::Priority:
 
   53        return tr(
"Priority");
 
   60QVariant CFileTransfer::Data(
int column, 
int role)
 
   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;
 
   76    if(Qt::DisplayRole == role) {
 
   78        switch ((ColumnValue)column) {
 
   79        case ColumnValue::LocalFiles:
 
   80            szData = GetLocalFile();
 
   82        case ColumnValue::RemoteFiles:
 
   83            szData = GetRemoteFile();
 
   85        case ColumnValue::FileSize: {
 
   86            szData = CStats::Convertbytes(GetTransferSize()) + 
"/" + CStats::Convertbytes(GetFileSize());
 
   89        case ColumnValue::Direction:
 
   90            szData = GetDirectionName();
 
   92        case ColumnValue::State:
 
   93            szData = GetStateName();
 
   95        case ColumnValue::Priority:
 
   96            szData = GetPriority();
 
   98        case ColumnValue::Speed:
 
   99            szData = CStats::Convertbytes(GetSpeed());
 
  101        case ColumnValue::Time:
 
  102            szData = GetFinishTime();
 
  104        case ColumnValue::Explanation:
 
  105            szData = GetExplanation();
 
  116int CFileTransfer::GetId()
 
  121QString CFileTransfer::GetDirectionName()
 
  123    switch ((Direction)GetDirection()) {
 
  124    case Direction::Upload:
 
  127    case Direction::Download:
 
  129        return tr(
"Download");
 
  134CFileTransfer::Direction CFileTransfer::GetDirection()
 
  139void CFileTransfer::SetDirection(Direction d)
 
  144QString CFileTransfer::GetLocalFile()
 
  146    return m_szLocalFile;
 
  149void CFileTransfer::SetLocaleFile(
const QString &szFile)
 
  151    m_szLocalFile = szFile;
 
  154QString CFileTransfer::GetRemoteFile()
 
  156    return m_szRemoteFile;
 
  159void CFileTransfer::SetRemoteFile(
const QString &szFile)
 
  161    m_szRemoteFile = szFile;
 
  164quint64 CFileTransfer::GetFileSize()
 
  169void CFileTransfer::SetFileSize(quint64 size)
 
  174quint64 CFileTransfer::GetTransferSize()
 
  176    return m_nTransferSize;
 
  179void CFileTransfer::slotTransferSize(quint64 nAddSize)
 
  181    m_nTransferSize += nAddSize;
 
  182    QDateTime tmCur = QDateTime::currentDateTime();
 
  183    int nSec = m_tmLast.secsTo(tmCur);
 
  185    m_fSpeed = ((float_t)(m_nTransferSize - m_nLastSize)) / (float_t)nSec;
 
  187    m_nLastSize = m_nTransferSize;
 
  190float_t CFileTransfer::GetSpeed()
 
  195QString CFileTransfer::GetFinishTime()
 
  197    return m_FinishTime.toString(QLocale::system().dateTimeFormat(QLocale::ShortFormat));
 
  200void CFileTransfer::slotFinish()
 
  202    m_FinishTime = QDateTime::currentDateTime();
 
  205void CFileTransfer::SetFinishTime(QString szTime) {
 
  206    if(szTime.isEmpty()) 
return;
 
  207    m_FinishTime = QDateTime::fromString(szTime, QLocale::system().dateTimeFormat(QLocale::ShortFormat));
 
  210quint32 CFileTransfer::GetLocalPermission()
 const 
  212    return m_LocalPermission;
 
  215void CFileTransfer::SetLocalPermission(quint32 newLocalPermission)
 
  217    m_LocalPermission = newLocalPermission;
 
  220quint32 CFileTransfer::GetRemotePermission()
 const 
  222    return m_RemotePermission;
 
  225void CFileTransfer::SetRemotePermission(quint32 newRemotePermission)
 
  227    m_RemotePermission = newRemotePermission;
 
  230QString CFileTransfer::GetStateName()
 
  232    switch (GetState()) {
 
  236        return tr(
"Opening");
 
  237    case State::Transferring:
 
  238        return tr(
"Transferring");
 
  240        return tr(
"Closing");
 
  250CFileTransfer::State CFileTransfer::GetState()
 
  255void CFileTransfer::slotSetstate(State s)
 
  257    if(State::Opening == s)
 
  258        m_tmLast = QDateTime::currentDateTime();
 
  262QString CFileTransfer::GetPriority()
 
  264    switch((Priority)m_Priority) {
 
  265    case Priority::Height:
 
  267    case Priority::Normal:
 
  269    case Priority::Lower:
 
  277void CFileTransfer::slotSetPrority(Priority p)
 
  282QString CFileTransfer::GetExplanation()
 
  284    return m_szExplanation;
 
  287void CFileTransfer::slotSetExplanation(
const QString &explanation)
 
  289    m_szExplanation = explanation;
 
  292CListFileModel::CListFileModel(QObject *parent)
 
  293    : QAbstractTableModel(parent)
 
  297QVariant CListFileModel::headerData(
int section, Qt::Orientation orientation, 
int role)
 const 
  300    if(Qt::DisplayRole != role)
 
  302    if(Qt::Vertical == orientation) {
 
  303        if(m_lstFile.size() <= section || 0 > section)
 
  305        auto p = m_lstFile.at(section);
 
  310    return CFileTransfer::HeaderData(section);
 
  313int CListFileModel::rowCount(
const QModelIndex &parent)
 const 
  316    if (parent.isValid())
 
  318    return m_lstFile.size();
 
  321int CListFileModel::columnCount(
const QModelIndex &parent)
 const 
  324    if (parent.isValid())
 
  327    return (
int)CFileTransfer::ColumnValue::End;
 
  330QVariant CListFileModel::data(
const QModelIndex &index, 
int role)
 const 
  333    if (!index.isValid())
 
  337    if(r > m_lstFile.size() || r < 0)
 
  340    auto p = m_lstFile.at(r);
 
  342        return p->Data(index.column(), role);
 
  347QModelIndex CListFileModel::AddFileTransfer(QSharedPointer<CFileTransfer> f)
 
  349    if(!f) 
return QModelIndex();
 
  350    int r = m_lstFile.size();
 
  351    beginInsertRows(QModelIndex(), r, r);
 
  354    emit dataChanged(index(r, 0), index(r, (
int)CFileTransfer::ColumnValue::End));
 
  358int CListFileModel::RemoveFileTransfer(
int id)
 
  361    for(
int i = 0; i < m_lstFile.size(); i++) {
 
  362        auto p = m_lstFile.at(i);
 
  364            if(p->GetId() == 
id) {
 
  365                beginRemoveRows(QModelIndex(), i, i);
 
  366                m_lstFile.removeAt(i);
 
  375int CListFileModel::RemoveFileTransfer(QList<int> ids)
 
  377    if(ids.isEmpty()) 
return 0;
 
  378    std::sort(ids.begin(), ids.end());
 
  380    auto it = std::remove_if(m_lstFile.begin(), m_lstFile.end(),
 
  381                             [&](QSharedPointer<CFileTransfer> f){
 
  382                                 return ids.contains(f->GetId());
 
  384    m_lstFile.erase(it, m_lstFile.end());
 
  389QSharedPointer<CFileTransfer> CListFileModel::GetFileTransfer(
const QModelIndex &index)
 
  391    if (!index.isValid())
 
  392        return QSharedPointer<CFileTransfer>();
 
  394    if(0 > r || m_lstFile.size() <= r)
 
  395        return QSharedPointer<CFileTransfer>();
 
  396    return m_lstFile.at(r);
 
  399bool CListFileModel::removeRows(
int row, 
int count, 
const QModelIndex &parent)
 
  401    beginRemoveRows(parent, row, row + count - 1);
 
  402#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 
  403    m_lstFile.remove(row, count);
 
  405    for(
int i = row + count - 1; i >= row && i < m_lstFile.size();) {
 
  406        m_lstFile.removeAt(i--);
 
  413void CListFileModel::UpdateFileTransfer(QSharedPointer<CFileTransfer> f)
 
  416    int r = m_lstFile.indexOf(f);
 
  420    QModelIndex topLeft = index(r, 0);
 
  421    QModelIndex bootRight = index(r, (
int)CFileTransfer::ColumnValue::End - 1);
 
  422    emit dataChanged(topLeft, bootRight);
 
  425int CListFileModel::Load(QSettings &set)
 
  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(
 
  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);
 
  446        f->slotSetExplanation(set.value(
"Explanation", f->GetExplanation()).toString());
 
  447        f->SetFinishTime(set.value(
"FinishTime", f->GetFinishTime()).toString());
 
  455int CListFileModel::Save(QSettings &set)
 
  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);
 
  472        set.setValue(
"Explanation", f->GetExplanation());
 
  473        set.setValue(
"FinishTime", f->GetFinishTime());