2013-07-05 20:46:43 +04:00
|
|
|
/*
|
|
|
|
* Copyright (C) by Klaas Freitag <freitag@owncloud.com>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; version 2 of the License.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef PROGRESSDISPATCHER_H
|
|
|
|
#define PROGRESSDISPATCHER_H
|
|
|
|
|
2014-04-29 17:30:19 +04:00
|
|
|
#include "owncloudlib.h"
|
2013-07-05 20:46:43 +04:00
|
|
|
#include <QObject>
|
2013-07-26 15:44:38 +04:00
|
|
|
#include <QHash>
|
2013-07-31 00:22:43 +04:00
|
|
|
#include <QTime>
|
|
|
|
#include <QQueue>
|
2013-10-08 16:07:46 +04:00
|
|
|
#include <QElapsedTimer>
|
2015-01-30 15:36:20 +03:00
|
|
|
#include <QTimer>
|
2014-12-06 14:27:50 +03:00
|
|
|
#include <QDebug>
|
|
|
|
|
2014-03-14 16:03:16 +04:00
|
|
|
#include "syncfileitem.h"
|
2013-07-05 20:46:43 +04:00
|
|
|
|
2014-11-10 00:34:07 +03:00
|
|
|
namespace OCC {
|
2013-07-05 20:46:43 +04:00
|
|
|
|
2015-08-11 14:31:19 +03:00
|
|
|
class PropagatorJob;
|
|
|
|
|
2015-06-29 19:56:09 +03:00
|
|
|
/**
|
|
|
|
* @brief The ProgressInfo class
|
|
|
|
* @ingroup libsync
|
2015-06-26 18:07:47 +03:00
|
|
|
*/
|
2015-05-20 12:59:33 +03:00
|
|
|
class OWNCLOUDSYNC_EXPORT ProgressInfo : public QObject
|
2013-07-05 20:46:43 +04:00
|
|
|
{
|
2015-01-30 15:36:20 +03:00
|
|
|
Q_OBJECT
|
|
|
|
public:
|
2016-05-20 16:07:54 +03:00
|
|
|
ProgressInfo();
|
|
|
|
|
|
|
|
/** Resets for a new sync run.
|
|
|
|
*/
|
|
|
|
void reset();
|
2015-01-30 15:36:20 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Called when propagation starts.
|
|
|
|
*
|
2016-05-20 16:07:54 +03:00
|
|
|
* isUpdatingEstimates() will return true afterwards.
|
2015-01-30 15:36:20 +03:00
|
|
|
*/
|
2016-05-20 16:07:54 +03:00
|
|
|
void startEstimateUpdates();
|
2015-01-30 15:36:20 +03:00
|
|
|
|
|
|
|
/**
|
2016-05-20 16:07:54 +03:00
|
|
|
* Returns true when startEstimateUpdates() was called.
|
2015-01-30 15:36:20 +03:00
|
|
|
*
|
|
|
|
* This is used when the SyncEngine wants to indicate a new sync
|
|
|
|
* is about to start via the transmissionProgress() signal. The
|
2016-05-20 16:07:54 +03:00
|
|
|
* first ProgressInfo will have isUpdatingEstimates() == false.
|
2015-01-30 15:36:20 +03:00
|
|
|
*/
|
2016-05-20 16:07:54 +03:00
|
|
|
bool isUpdatingEstimates() const;
|
2015-01-30 15:36:20 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Increase the file and size totals by the amount indicated in item.
|
|
|
|
*/
|
|
|
|
void adjustTotalsForFile(const SyncFileItem & item);
|
|
|
|
|
|
|
|
quint64 totalFiles() const;
|
|
|
|
quint64 completedFiles() const;
|
|
|
|
|
|
|
|
quint64 totalSize() const;
|
|
|
|
quint64 completedSize() const;
|
|
|
|
|
|
|
|
/** Number of a file that is currently in progress. */
|
|
|
|
quint64 currentFile() const;
|
|
|
|
|
2015-07-02 14:49:19 +03:00
|
|
|
/** Return true if the size needs to be taken in account in the total amount of time */
|
2015-01-30 11:17:15 +03:00
|
|
|
static inline bool isSizeDependent(const SyncFileItem & item)
|
|
|
|
{
|
|
|
|
return ! item._isDirectory && (
|
|
|
|
item._instruction == CSYNC_INSTRUCTION_CONFLICT
|
|
|
|
|| item._instruction == CSYNC_INSTRUCTION_SYNC
|
2016-01-06 12:01:22 +03:00
|
|
|
|| item._instruction == CSYNC_INSTRUCTION_NEW
|
|
|
|
|| item._instruction == CSYNC_INSTRUCTION_TYPE_CHANGE);
|
2014-03-14 16:03:16 +04:00
|
|
|
}
|
|
|
|
|
2015-01-30 15:36:20 +03:00
|
|
|
/**
|
|
|
|
* Holds estimates about progress, returned to the user.
|
|
|
|
*/
|
|
|
|
struct Estimates
|
|
|
|
{
|
|
|
|
/// Estimated completion amount per second. (of bytes or files)
|
|
|
|
quint64 estimatedBandwidth;
|
2014-03-14 16:03:16 +04:00
|
|
|
|
2015-07-02 14:49:19 +03:00
|
|
|
/// Estimated time remaining in milliseconds.
|
2015-01-30 15:36:20 +03:00
|
|
|
quint64 estimatedEta;
|
|
|
|
};
|
2014-03-14 16:03:16 +04:00
|
|
|
|
2015-01-30 15:36:20 +03:00
|
|
|
/**
|
|
|
|
* Holds the current state of something making progress and maintains an
|
|
|
|
* estimate of the current progress per second.
|
|
|
|
*/
|
2015-05-20 12:59:33 +03:00
|
|
|
struct OWNCLOUDSYNC_EXPORT Progress
|
2015-01-30 15:36:20 +03:00
|
|
|
{
|
|
|
|
Progress()
|
|
|
|
: _progressPerSec(0)
|
|
|
|
, _prevCompleted(0)
|
|
|
|
, _initialSmoothing(1.0)
|
2015-07-02 14:49:19 +03:00
|
|
|
, _completed(0)
|
|
|
|
, _total(0)
|
2015-01-30 15:36:20 +03:00
|
|
|
{
|
2014-04-25 02:08:25 +04:00
|
|
|
}
|
2014-04-27 01:48:12 +04:00
|
|
|
|
2015-01-30 15:36:20 +03:00
|
|
|
/** Returns the estimates about progress per second and eta. */
|
|
|
|
Estimates estimates() const;
|
|
|
|
|
|
|
|
quint64 completed() const;
|
|
|
|
quint64 remaining() const;
|
|
|
|
|
|
|
|
private:
|
2014-04-25 02:08:25 +04:00
|
|
|
/**
|
2015-01-30 15:36:20 +03:00
|
|
|
* Update the exponential moving average estimate of _progressPerSec.
|
2014-04-28 19:49:27 +04:00
|
|
|
*/
|
2015-01-30 15:36:20 +03:00
|
|
|
void update();
|
|
|
|
|
2015-08-11 11:38:04 +03:00
|
|
|
/**
|
|
|
|
* Changes the _completed value and does sanity checks on
|
|
|
|
* _prevCompleted and _total.
|
|
|
|
*/
|
|
|
|
void setCompleted(quint64 completed);
|
|
|
|
|
2015-07-02 14:49:19 +03:00
|
|
|
// Updated by update()
|
2015-01-30 15:36:20 +03:00
|
|
|
double _progressPerSec;
|
|
|
|
quint64 _prevCompleted;
|
|
|
|
|
|
|
|
// Used to get to a good value faster when
|
|
|
|
// progress measurement stats. See update().
|
|
|
|
double _initialSmoothing;
|
|
|
|
|
2015-07-02 14:49:19 +03:00
|
|
|
// Set and updated by ProgressInfo
|
|
|
|
quint64 _completed;
|
|
|
|
quint64 _total;
|
|
|
|
|
2015-01-30 15:36:20 +03:00
|
|
|
friend class ProgressInfo;
|
|
|
|
};
|
|
|
|
|
2015-05-20 12:59:33 +03:00
|
|
|
struct OWNCLOUDSYNC_EXPORT ProgressItem
|
2015-01-30 15:36:20 +03:00
|
|
|
{
|
|
|
|
SyncFileItem _item;
|
|
|
|
Progress _progress;
|
2014-03-14 16:03:16 +04:00
|
|
|
};
|
2015-01-30 15:36:20 +03:00
|
|
|
QHash<QString, ProgressItem> _currentItems;
|
|
|
|
|
|
|
|
SyncFileItem _lastCompletedItem;
|
|
|
|
|
|
|
|
// Used during local and remote update phase
|
|
|
|
QString _currentDiscoveredFolder;
|
|
|
|
|
|
|
|
void setProgressComplete(const SyncFileItem &item);
|
|
|
|
|
2015-08-11 11:38:04 +03:00
|
|
|
void setProgressItem(const SyncFileItem &item, quint64 completed);
|
2015-01-30 15:36:20 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the total completion estimate
|
|
|
|
*/
|
|
|
|
Estimates totalProgress() const;
|
|
|
|
|
2016-08-15 14:36:53 +03:00
|
|
|
/**
|
|
|
|
* Get the optimistic eta.
|
|
|
|
*
|
|
|
|
* This value is based on the highest observed transfer bandwidth
|
|
|
|
* and files-per-second speed.
|
|
|
|
*/
|
|
|
|
quint64 optimisticEta() const;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether the remaining-time estimate is trusted.
|
|
|
|
*
|
|
|
|
* We don't trust it if it is hugely above the optimistic estimate.
|
|
|
|
* See #5046.
|
|
|
|
*/
|
|
|
|
bool trustEta() const;
|
|
|
|
|
2015-01-30 15:36:20 +03:00
|
|
|
/**
|
|
|
|
* Get the current file completion estimate structure
|
|
|
|
*/
|
|
|
|
Estimates fileProgress(const SyncFileItem &item) const;
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
/**
|
|
|
|
* Called every second once started, this function updates the
|
|
|
|
* estimates.
|
|
|
|
*/
|
|
|
|
void updateEstimates();
|
|
|
|
|
|
|
|
private:
|
|
|
|
// Sets the completed size by summing finished jobs with the progress
|
|
|
|
// of active ones.
|
|
|
|
void recomputeCompletedSize();
|
|
|
|
|
|
|
|
// Triggers the update() slot every second once propagation started.
|
|
|
|
QTimer _updateEstimatesTimer;
|
|
|
|
|
|
|
|
Progress _sizeProgress;
|
|
|
|
Progress _fileProgress;
|
|
|
|
|
|
|
|
// All size from completed jobs only.
|
|
|
|
quint64 _totalSizeOfCompletedJobs;
|
|
|
|
|
|
|
|
// The fastest observed rate of files per second in this sync.
|
|
|
|
double _maxFilesPerSecond;
|
|
|
|
double _maxBytesPerSecond;
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace Progress {
|
2014-03-14 16:03:16 +04:00
|
|
|
|
2014-04-29 17:30:19 +04:00
|
|
|
OWNCLOUDSYNC_EXPORT QString asActionString( const SyncFileItem& item );
|
|
|
|
OWNCLOUDSYNC_EXPORT QString asResultString( const SyncFileItem& item );
|
2013-11-25 19:16:33 +04:00
|
|
|
|
2014-04-29 17:30:19 +04:00
|
|
|
OWNCLOUDSYNC_EXPORT bool isWarningKind( SyncFileItem::Status );
|
2015-01-08 13:42:14 +03:00
|
|
|
OWNCLOUDSYNC_EXPORT bool isIgnoredKind( SyncFileItem::Status );
|
2014-03-14 16:03:16 +04:00
|
|
|
|
2013-08-17 13:21:32 +04:00
|
|
|
}
|
2013-07-05 20:46:43 +04:00
|
|
|
|
2013-07-23 15:32:24 +04:00
|
|
|
/**
|
|
|
|
* @file progressdispatcher.h
|
|
|
|
* @brief A singleton class to provide sync progress information to other gui classes.
|
|
|
|
*
|
|
|
|
* How to use the ProgressDispatcher:
|
|
|
|
* Just connect to the two signals either to progress for every individual file
|
|
|
|
* or the overall sync progress.
|
|
|
|
*
|
|
|
|
*/
|
2014-04-29 17:30:19 +04:00
|
|
|
class OWNCLOUDSYNC_EXPORT ProgressDispatcher : public QObject
|
2013-07-05 20:46:43 +04:00
|
|
|
{
|
|
|
|
Q_OBJECT
|
2013-07-23 15:32:24 +04:00
|
|
|
|
|
|
|
friend class Folder; // only allow Folder class to access the setting slots.
|
2013-07-05 20:46:43 +04:00
|
|
|
public:
|
|
|
|
static ProgressDispatcher* instance();
|
|
|
|
~ProgressDispatcher();
|
|
|
|
|
|
|
|
signals:
|
2013-07-23 15:32:24 +04:00
|
|
|
/**
|
2013-07-26 15:44:38 +04:00
|
|
|
@brief Signals the progress of data transmission.
|
2013-07-23 15:32:24 +04:00
|
|
|
|
|
|
|
@param[out] folder The folder which is being processed
|
2014-03-14 16:03:16 +04:00
|
|
|
@param[out] progress A struct with all progress info.
|
2013-07-23 15:32:24 +04:00
|
|
|
|
|
|
|
*/
|
2015-01-30 15:36:20 +03:00
|
|
|
void progressInfo( const QString& folder, const ProgressInfo& progress );
|
2014-06-06 17:52:55 +04:00
|
|
|
/**
|
2015-08-11 14:45:02 +03:00
|
|
|
* @brief: the item was completed by a job
|
2014-06-06 17:52:55 +04:00
|
|
|
*/
|
2015-08-11 14:45:02 +03:00
|
|
|
void itemCompleted(const QString &folder,
|
|
|
|
const SyncFileItem & item,
|
|
|
|
const PropagatorJob & job);
|
2013-07-05 20:46:43 +04:00
|
|
|
|
2013-07-23 15:32:24 +04:00
|
|
|
protected:
|
2015-01-30 15:36:20 +03:00
|
|
|
void setProgressInfo(const QString& folder, const ProgressInfo& progress);
|
2013-07-05 20:46:43 +04:00
|
|
|
|
|
|
|
private:
|
|
|
|
ProgressDispatcher(QObject* parent = 0);
|
2013-10-08 16:07:46 +04:00
|
|
|
|
|
|
|
QElapsedTimer _timer;
|
2013-07-05 20:46:43 +04:00
|
|
|
static ProgressDispatcher* _instance;
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
#endif // PROGRESSDISPATCHER_H
|