2013-09-16 00:49:24 +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.
|
|
|
|
*/
|
|
|
|
|
2013-01-15 23:41:52 +04:00
|
|
|
#ifndef SYNCFILEITEM_H
|
|
|
|
#define SYNCFILEITEM_H
|
|
|
|
|
|
|
|
#include <QVector>
|
2013-05-03 21:11:00 +04:00
|
|
|
#include <QString>
|
2014-03-26 21:02:25 +04:00
|
|
|
#include <QDateTime>
|
2013-05-16 15:54:22 +04:00
|
|
|
#include <QMetaType>
|
2015-04-15 16:19:11 +03:00
|
|
|
#include <QSharedPointer>
|
2013-01-15 23:41:52 +04:00
|
|
|
|
|
|
|
#include <csync.h>
|
|
|
|
|
2015-03-12 14:56:43 +03:00
|
|
|
#if defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && !defined(Q_CC_CLANG) && (__GNUC__ * 100 + __GNUC_MINOR__ < 408)
|
|
|
|
// openSuse 12.3 didn't like enum bitfields.
|
|
|
|
#define BITFIELD(size)
|
|
|
|
#else
|
|
|
|
#define BITFIELD(size) :size
|
|
|
|
#endif
|
|
|
|
|
2015-06-26 18:07:47 +03:00
|
|
|
|
2014-11-10 00:34:07 +03:00
|
|
|
namespace OCC {
|
2013-01-15 23:41:52 +04:00
|
|
|
|
2015-06-29 19:56:09 +03:00
|
|
|
/**
|
|
|
|
* @brief The SyncFileItem class
|
|
|
|
* @ingroup libsync
|
2015-06-26 18:07:47 +03:00
|
|
|
*/
|
2013-01-15 23:41:52 +04:00
|
|
|
class SyncFileItem {
|
|
|
|
public:
|
2013-10-04 17:13:36 +04:00
|
|
|
enum Direction {
|
2013-08-07 14:15:28 +04:00
|
|
|
None = 0,
|
|
|
|
Up,
|
2013-10-04 17:13:36 +04:00
|
|
|
Down };
|
2013-08-07 14:15:28 +04:00
|
|
|
|
2013-10-04 17:13:36 +04:00
|
|
|
enum Type {
|
2013-12-06 17:11:51 +04:00
|
|
|
UnknownType = 0,
|
|
|
|
File = CSYNC_FTW_TYPE_FILE,
|
2013-10-03 22:00:58 +04:00
|
|
|
Directory = CSYNC_FTW_TYPE_DIR,
|
2013-12-06 17:11:51 +04:00
|
|
|
SoftLink = CSYNC_FTW_TYPE_SLINK
|
2013-10-04 17:13:36 +04:00
|
|
|
};
|
2013-01-15 23:41:52 +04:00
|
|
|
|
2013-10-04 17:13:36 +04:00
|
|
|
enum Status {
|
|
|
|
NoStatus,
|
|
|
|
|
|
|
|
FatalError, ///< Error that causes the sync to stop
|
|
|
|
NormalError, ///< Error attached to a particular file
|
|
|
|
SoftError, ///< More like an information
|
|
|
|
|
|
|
|
Success, ///< The file was properly synced
|
|
|
|
Conflict, ///< The file was properly synced, but a conflict was created
|
2014-10-08 11:07:05 +04:00
|
|
|
FileIgnored, ///< The file is in the ignored list (or blacklisted with no retries left)
|
2014-06-23 15:56:17 +04:00
|
|
|
Restoration ///< The file was restored because what should have been done was not allowed
|
2013-10-04 17:13:36 +04:00
|
|
|
};
|
|
|
|
|
2014-06-20 14:54:46 +04:00
|
|
|
SyncFileItem() : _type(UnknownType), _direction(None), _isDirectory(false),
|
2015-07-13 16:41:11 +03:00
|
|
|
_serverHasIgnoredFiles(false), _hasBlacklistEntry(false), _status(NoStatus),
|
2015-07-09 16:05:37 +03:00
|
|
|
_isRestoration(false), _should_update_metadata(false),
|
2015-03-11 13:41:42 +03:00
|
|
|
_httpErrorCode(0), _requestDuration(0), _affectedItems(1),
|
|
|
|
_instruction(CSYNC_INSTRUCTION_NONE), _modtime(0), _size(0), _inode(0)
|
2014-12-06 14:27:50 +03:00
|
|
|
{
|
|
|
|
}
|
2013-01-15 23:41:52 +04:00
|
|
|
|
2013-05-03 21:11:00 +04:00
|
|
|
friend bool operator==(const SyncFileItem& item1, const SyncFileItem& item2) {
|
2015-02-19 15:13:45 +03:00
|
|
|
return item1._originalFile == item2._originalFile;
|
2013-05-03 21:11:00 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
friend bool operator<(const SyncFileItem& item1, const SyncFileItem& item2) {
|
2013-05-15 17:22:20 +04:00
|
|
|
// Sort by destination
|
2015-02-12 21:15:55 +03:00
|
|
|
auto d1 = item1.destination();
|
|
|
|
auto d2 = item2.destination();
|
|
|
|
|
|
|
|
// But this we need to order it so the slash come first. It should be this order:
|
|
|
|
// "foo", "foo/bar", "foo-bar"
|
|
|
|
// This is important since we assume that the contents of a folder directly follows
|
|
|
|
// its contents
|
|
|
|
|
|
|
|
auto data1 = d1.constData();
|
|
|
|
auto data2 = d2.constData();
|
|
|
|
|
2015-10-05 06:20:09 +03:00
|
|
|
// Find the length of the largest prefix
|
2015-02-12 21:15:55 +03:00
|
|
|
int prefixL = 0;
|
|
|
|
auto minSize = std::min(d1.size(), d2.size());
|
|
|
|
while (prefixL < minSize && data1[prefixL] == data2[prefixL]) { prefixL++; }
|
|
|
|
|
|
|
|
if (prefixL == d2.size())
|
|
|
|
return false;
|
2015-02-17 20:22:22 +03:00
|
|
|
if (prefixL == d1.size())
|
|
|
|
return true;
|
2015-02-12 21:15:55 +03:00
|
|
|
|
|
|
|
if (data1[prefixL] == '/')
|
|
|
|
return true;
|
|
|
|
if (data2[prefixL] == '/')
|
|
|
|
return false;
|
|
|
|
|
|
|
|
return data1[prefixL] < data2[prefixL];
|
2013-01-15 23:41:52 +04:00
|
|
|
}
|
|
|
|
|
2013-05-15 17:22:20 +04:00
|
|
|
QString destination() const {
|
2014-09-05 12:06:19 +04:00
|
|
|
if (!_renameTarget.isEmpty()) {
|
|
|
|
return _renameTarget;
|
|
|
|
}
|
|
|
|
return _file;
|
2013-05-15 17:22:20 +04:00
|
|
|
}
|
|
|
|
|
2013-02-14 19:25:00 +04:00
|
|
|
bool isEmpty() const {
|
|
|
|
return _file.isEmpty();
|
|
|
|
}
|
|
|
|
|
2014-10-13 19:23:42 +04:00
|
|
|
bool hasErrorStatus() const {
|
|
|
|
return _status == SyncFileItem::SoftError
|
|
|
|
|| _status == SyncFileItem::NormalError
|
|
|
|
|| _status == SyncFileItem::FatalError
|
|
|
|
|| !_errorString.isEmpty();
|
|
|
|
}
|
|
|
|
|
2015-10-05 06:20:09 +03:00
|
|
|
// Variables useful for everybody
|
2013-01-15 23:41:52 +04:00
|
|
|
QString _file;
|
|
|
|
QString _renameTarget;
|
2015-03-12 14:56:43 +03:00
|
|
|
Type _type BITFIELD(3);
|
|
|
|
Direction _direction BITFIELD(2);
|
|
|
|
bool _isDirectory BITFIELD(1);
|
2015-07-13 16:41:11 +03:00
|
|
|
bool _serverHasIgnoredFiles BITFIELD(1);
|
2015-03-11 13:41:42 +03:00
|
|
|
|
|
|
|
/// Whether there's an entry in the blacklist table.
|
|
|
|
/// Note: that entry may have retries left, so this can be true
|
|
|
|
/// without the status being FileIgnored.
|
2015-03-12 14:56:43 +03:00
|
|
|
bool _hasBlacklistEntry BITFIELD(1);
|
2015-03-11 13:41:42 +03:00
|
|
|
|
2015-10-05 06:20:09 +03:00
|
|
|
// Variables useful to report to the user
|
2015-03-12 14:56:43 +03:00
|
|
|
Status _status BITFIELD(4);
|
|
|
|
bool _isRestoration BITFIELD(1); // The original operation was forbidden, and this is a restoration
|
2015-07-09 16:05:37 +03:00
|
|
|
bool _should_update_metadata BITFIELD(1);
|
2015-03-11 13:41:42 +03:00
|
|
|
quint16 _httpErrorCode;
|
|
|
|
QString _errorString; // Contains a string only in case of error
|
|
|
|
QByteArray _responseTimeStamp;
|
|
|
|
quint64 _requestDuration;
|
|
|
|
quint32 _affectedItems; // the number of affected items by the operation on this item.
|
|
|
|
// usually this value is 1, but for removes on dirs, it might be much higher.
|
2013-10-04 17:13:36 +04:00
|
|
|
|
|
|
|
// Variables used by the propagator
|
|
|
|
csync_instructions_e _instruction;
|
2015-03-11 13:41:42 +03:00
|
|
|
QString _originalFile; // as it is in the csync tree
|
2013-10-25 15:28:48 +04:00
|
|
|
time_t _modtime;
|
|
|
|
QByteArray _etag;
|
|
|
|
quint64 _size;
|
2014-05-06 14:55:54 +04:00
|
|
|
quint64 _inode;
|
2014-03-24 15:21:44 +04:00
|
|
|
QByteArray _fileId;
|
2014-06-06 17:24:17 +04:00
|
|
|
QByteArray _remotePerm;
|
2015-10-14 16:03:40 +03:00
|
|
|
QByteArray _checksumHeader;
|
2014-06-03 13:50:13 +04:00
|
|
|
QString _directDownloadUrl;
|
|
|
|
QString _directDownloadCookies;
|
2014-10-08 11:07:05 +04:00
|
|
|
|
2014-03-26 21:02:25 +04:00
|
|
|
struct {
|
|
|
|
quint64 _size;
|
|
|
|
time_t _modtime;
|
|
|
|
QByteArray _etag;
|
|
|
|
QByteArray _fileId;
|
2014-04-03 18:56:36 +04:00
|
|
|
quint64 _other_size;
|
|
|
|
time_t _other_modtime;
|
|
|
|
QByteArray _other_etag;
|
|
|
|
QByteArray _other_fileId;
|
2015-03-12 14:56:43 +03:00
|
|
|
enum csync_instructions_e _instruction BITFIELD(16);
|
|
|
|
enum csync_instructions_e _other_instruction BITFIELD(16);
|
2014-04-03 18:56:36 +04:00
|
|
|
} log;
|
2013-01-15 23:41:52 +04:00
|
|
|
};
|
|
|
|
|
2015-04-15 16:19:11 +03:00
|
|
|
typedef QSharedPointer<SyncFileItem> SyncFileItemPtr;
|
|
|
|
inline bool operator<(const SyncFileItemPtr& item1, const SyncFileItemPtr& item2) {
|
|
|
|
return *item1 < *item2;
|
|
|
|
}
|
2013-05-03 21:11:00 +04:00
|
|
|
|
2015-04-15 16:19:11 +03:00
|
|
|
typedef QVector<SyncFileItemPtr> SyncFileItemVector;
|
2013-01-15 23:41:52 +04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2014-11-10 00:34:07 +03:00
|
|
|
Q_DECLARE_METATYPE(OCC::SyncFileItem)
|
2013-05-16 15:54:22 +04:00
|
|
|
|
2013-01-15 23:41:52 +04:00
|
|
|
#endif // SYNCFILEITEM_H
|