SocketAPI: Enhance SyncFileStatus to have share information.

Added a new class SyncFileStatus to reflect that properly.
This commit is contained in:
Klaas Freitag 2014-07-10 14:27:52 +02:00
parent 9dacad99fa
commit c6deb392fd
6 changed files with 177 additions and 76 deletions

View file

@ -87,6 +87,7 @@ set(libsync_SRCS
mirall/clientproxy.cpp mirall/clientproxy.cpp
mirall/syncrunfilelog.cpp mirall/syncrunfilelog.cpp
mirall/cookiejar.cpp mirall/cookiejar.cpp
mirall/syncfilestatus.cpp
creds/dummycredentials.cpp creds/dummycredentials.cpp
creds/abstractcredentials.cpp creds/abstractcredentials.cpp
creds/credentialsfactory.cpp creds/credentialsfactory.cpp

View file

@ -373,17 +373,17 @@ void Folder::bubbleUpSyncResult()
qDebug() << "Processing result list and logging took " << timer.elapsed() << " Milliseconds."; qDebug() << "Processing result list and logging took " << timer.elapsed() << " Milliseconds.";
_syncResult.setWarnCount(ignoredItems); _syncResult.setWarnCount(ignoredItems);
createGuiLog( firstItemNew._file, FILE_STATUS_NEW, newItems ); createGuiLog( firstItemNew._file, SyncFileStatus(SyncFileStatus::STATUS_NEW), newItems );
createGuiLog( firstItemDeleted._file, FILE_STATUS_REMOVE, removedItems ); createGuiLog( firstItemDeleted._file, SyncFileStatus(SyncFileStatus::STATUS_REMOVE), removedItems );
createGuiLog( firstItemUpdated._file, FILE_STATUS_UPDATED, updatedItems ); createGuiLog( firstItemUpdated._file, SyncFileStatus(SyncFileStatus::STATUS_UPDATED), updatedItems );
if( !firstItemRenamed.isEmpty() ) { if( !firstItemRenamed.isEmpty() ) {
SyncFileStatus status = FILE_STATUS_RENAME; SyncFileStatus status(SyncFileStatus::STATUS_RENAME);
// if the path changes it's rather a move // if the path changes it's rather a move
QDir renTarget = QFileInfo(firstItemRenamed._renameTarget).dir(); QDir renTarget = QFileInfo(firstItemRenamed._renameTarget).dir();
QDir renSource = QFileInfo(firstItemRenamed._file).dir(); QDir renSource = QFileInfo(firstItemRenamed._file).dir();
if(renTarget != renSource) { if(renTarget != renSource) {
status = FILE_STATUS_MOVE; status.set(SyncFileStatus::STATUS_MOVE);
} }
createGuiLog( firstItemRenamed._file, status, renamedItems, firstItemRenamed._renameTarget ); createGuiLog( firstItemRenamed._file, status, renamedItems, firstItemRenamed._renameTarget );
} }
@ -402,36 +402,36 @@ void Folder::createGuiLog( const QString& filename, SyncFileStatus status, int c
// not all possible values of status are evaluated here because the others // not all possible values of status are evaluated here because the others
// are not used in the calling function. Please check there. // are not used in the calling function. Please check there.
switch (status) { switch (status.tag()) {
case FILE_STATUS_REMOVE: case SyncFileStatus::STATUS_REMOVE:
if( count > 1 ) { if( count > 1 ) {
text = tr("%1 and %2 other files have been removed.", "%1 names a file.").arg(file).arg(count-1); text = tr("%1 and %2 other files have been removed.", "%1 names a file.").arg(file).arg(count-1);
} else { } else {
text = tr("%1 has been removed.", "%1 names a file.").arg(file); text = tr("%1 has been removed.", "%1 names a file.").arg(file);
} }
break; break;
case FILE_STATUS_NEW: case SyncFileStatus::STATUS_NEW:
if( count > 1 ) { if( count > 1 ) {
text = tr("%1 and %2 other files have been downloaded.", "%1 names a file.").arg(file).arg(count-1); text = tr("%1 and %2 other files have been downloaded.", "%1 names a file.").arg(file).arg(count-1);
} else { } else {
text = tr("%1 has been downloaded.", "%1 names a file.").arg(file); text = tr("%1 has been downloaded.", "%1 names a file.").arg(file);
} }
break; break;
case FILE_STATUS_UPDATED: case SyncFileStatus::STATUS_UPDATED:
if( count > 1 ) { if( count > 1 ) {
text = tr("%1 and %2 other files have been updated.").arg(file).arg(count-1); text = tr("%1 and %2 other files have been updated.").arg(file).arg(count-1);
} else { } else {
text = tr("%1 has been updated.", "%1 names a file.").arg(file); text = tr("%1 has been updated.", "%1 names a file.").arg(file);
} }
break; break;
case FILE_STATUS_RENAME: case SyncFileStatus::STATUS_RENAME:
if( count > 1 ) { if( count > 1 ) {
text = tr("%1 has been renamed to %2 and %3 other files have been renamed.").arg(file).arg(renameTarget).arg(count-1); text = tr("%1 has been renamed to %2 and %3 other files have been renamed.").arg(file).arg(renameTarget).arg(count-1);
} else { } else {
text = tr("%1 has been renamed to %2.", "%1 and %2 name files.").arg(file).arg(renameTarget); text = tr("%1 has been renamed to %2.", "%1 and %2 name files.").arg(file).arg(renameTarget);
} }
break; break;
case FILE_STATUS_MOVE: case SyncFileStatus::STATUS_MOVE:
if( count > 1 ) { if( count > 1 ) {
text = tr("%1 has been moved to %2 and %3 other files have been moved.").arg(file).arg(renameTarget).arg(count-1); text = tr("%1 has been moved to %2 and %3 other files have been moved.").arg(file).arg(renameTarget).arg(count-1);
} else { } else {

View file

@ -21,6 +21,7 @@
#include "mirall/progressdispatcher.h" #include "mirall/progressdispatcher.h"
#include "mirall/syncjournaldb.h" #include "mirall/syncjournaldb.h"
#include "mirall/clientproxy.h" #include "mirall/clientproxy.h"
#include "mirall/syncfilestatus.h"
#include <csync.h> #include <csync.h>
@ -42,23 +43,7 @@ class SyncEngine;
class FolderWatcher; class FolderWatcher;
enum SyncFileStatus { class OWNCLOUDSYNC_EXPORT Folder : public QObject
FILE_STATUS_NONE,
FILE_STATUS_EVAL,
FILE_STATUS_REMOVE,
FILE_STATUS_RENAME,
FILE_STATUS_MOVE,
FILE_STATUS_NEW,
FILE_STATUS_CONFLICT,
FILE_STATUS_IGNORE,
FILE_STATUS_SYNC,
FILE_STATUS_STAT_ERROR,
FILE_STATUS_ERROR,
FILE_STATUS_UPDATED,
FILE_STATUS_SHARED
};
class Folder : public QObject
{ {
Q_OBJECT Q_OBJECT

View file

@ -72,7 +72,7 @@ SyncFileStatus recursiveFolderStatus(Folder *folder, const QString& fileName )
const QStringList dirEntries = dir.entryList( QDir::AllEntries | QDir::NoDotAndDotDot ); const QStringList dirEntries = dir.entryList( QDir::AllEntries | QDir::NoDotAndDotDot );
SyncFileStatus result = FILE_STATUS_SYNC; SyncFileStatus result(SyncFileStatus::STATUS_SYNC);
foreach( const QString entry, dirEntries ) { foreach( const QString entry, dirEntries ) {
QFileInfo fi(entry); QFileInfo fi(entry);
@ -88,10 +88,10 @@ SyncFileStatus recursiveFolderStatus(Folder *folder, const QString& fileName )
sfs = fileStatus(folder, fs ); sfs = fileStatus(folder, fs );
} }
if( sfs == FILE_STATUS_STAT_ERROR || sfs == FILE_STATUS_ERROR ) { if( sfs.tag() == SyncFileStatus::STATUS_STAT_ERROR || sfs.tag() == SyncFileStatus::STATUS_ERROR ) {
return FILE_STATUS_ERROR; return SyncFileStatus::STATUS_ERROR;
} else if( sfs == FILE_STATUS_EVAL || sfs == FILE_STATUS_NEW) { } else if( sfs.tag() == SyncFileStatus::STATUS_EVAL || sfs.tag() == SyncFileStatus::STATUS_NEW) {
result = FILE_STATUS_EVAL; result.set(SyncFileStatus::STATUS_EVAL);
} }
} }
return result; return result;
@ -112,12 +112,12 @@ SyncFileStatus fileStatus(Folder *folder, const QString& fileName )
QFileInfo fi(file); QFileInfo fi(file);
if( !fi.exists() ) { if( !fi.exists() ) {
return FILE_STATUS_STAT_ERROR; return SyncFileStatus(SyncFileStatus::STATUS_STAT_ERROR);
} }
// file is ignored? // file is ignored?
if( fi.isSymLink() ) { if( fi.isSymLink() ) {
return FILE_STATUS_IGNORE; return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
} }
int type = CSYNC_FTW_TYPE_FILE; int type = CSYNC_FTW_TYPE_FILE;
if( fi.isDir() ) { if( fi.isDir() ) {
@ -126,28 +126,28 @@ SyncFileStatus fileStatus(Folder *folder, const QString& fileName )
CSYNC_EXCLUDE_TYPE excl = csync_excluded(folder->csyncContext(), file.toUtf8(), type); CSYNC_EXCLUDE_TYPE excl = csync_excluded(folder->csyncContext(), file.toUtf8(), type);
if( excl != CSYNC_NOT_EXCLUDED ) { if( excl != CSYNC_NOT_EXCLUDED ) {
return FILE_STATUS_IGNORE; return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
} }
SyncFileStatus stat = FILE_STATUS_NONE;
SyncJournalFileRecord rec = folder->journalDb()->getFileRecord(fileName); SyncJournalFileRecord rec = folder->journalDb()->getFileRecord(fileName);
if( !rec.isValid() ) { if( !rec.isValid() ) {
return FILE_STATUS_NEW; return SyncFileStatus(SyncFileStatus::STATUS_NEW);
} }
SyncFileStatus stat(SyncFileStatus::STATUS_NONE);
if( type == CSYNC_FTW_TYPE_DIR ) { if( type == CSYNC_FTW_TYPE_DIR ) {
// compute recursive status of the directory // compute recursive status of the directory
stat = recursiveFolderStatus( folder, fileName ); stat = recursiveFolderStatus( folder, fileName );
} else if(fi.lastModified() != rec._modtime ) { } else if(fi.lastModified() != rec._modtime ) {
// file was locally modified. // file was locally modified.
stat = FILE_STATUS_EVAL; stat.set(SyncFileStatus::STATUS_EVAL);
} else { } else {
stat = FILE_STATUS_SYNC; stat.set(SyncFileStatus::STATUS_SYNC);
} }
if (rec._remotePerm.contains("S")) { if (rec._remotePerm.contains("S")) {
// FIXME! that should be an additional flag // FIXME! that should be an additional flag
stat = FILE_STATUS_SHARED; stat.setSharedWithMe(true);
} }
return stat; return stat;
@ -294,44 +294,16 @@ void SocketApi::command_RETRIEVE_FILE_STATUS(const QString& argument, QLocalSock
QString statusString; QString statusString;
Folder* folder = FolderMan::instance()->folderForPath( argument ); Folder* syncFolder = FolderMan::instance()->folderForPath( argument );
if (!syncFolder) {
// this can happen in offline mode e.g.: nothing to worry about // this can happen in offline mode e.g.: nothing to worry about
if (!folder) {
DEBUG << "folder offline or not watched:" << argument; DEBUG << "folder offline or not watched:" << argument;
statusString = QLatin1String("NOP"); statusString = QLatin1String("NOP");
} } else {
const QString file = argument.mid(syncFolder->path().length());
SyncFileStatus fileStatus = SocketApiHelper::fileStatus(syncFolder, file);
if( statusString.isEmpty() ) { statusString = fileStatus.toSocketAPIString();
SyncFileStatus fileStatus = SocketApiHelper::fileStatus(folder, argument.mid(folder->path().length()) );
switch(fileStatus)
{
case FILE_STATUS_NONE:
statusString = QLatin1String("NONE");
break;
case FILE_STATUS_EVAL:
case FILE_STATUS_NEW:
statusString = QLatin1String("NEED_SYNC");
break;
case FILE_STATUS_IGNORE:
statusString = QLatin1String("IGNORE");
break;
case FILE_STATUS_SYNC:
case FILE_STATUS_UPDATED:
statusString = QLatin1String("OK");
break;
case FILE_STATUS_STAT_ERROR:
case FILE_STATUS_ERROR:
statusString = QLatin1String("ERROR");
break;
case FILE_STATUS_SHARED:
statusString = QLatin1String("SHARED");
break;
default:
qWarning() << "This status should not be there" << fileStatus;
Q_ASSERT(false);
statusString = QLatin1String("NONE");
}
} }
QString message = QLatin1String("STATUS:")+statusString+QLatin1Char(':')+argument; QString message = QLatin1String("STATUS:")+statusString+QLatin1Char(':')+argument;

View file

@ -0,0 +1,87 @@
/*
* 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.
*/
#include "mirall/syncfilestatus.h"
#include <QDebug>
namespace Mirall {
SyncFileStatus::SyncFileStatus()
:_tag(STATUS_NONE), _sharedWithMe(false)
{
}
SyncFileStatus::SyncFileStatus(SyncFileStatusTag tag)
:_tag(tag), _sharedWithMe(false)
{
}
void SyncFileStatus::set(SyncFileStatusTag tag)
{
_tag = tag;
}
SyncFileStatus::SyncFileStatusTag SyncFileStatus::tag()
{
return _tag;
}
void SyncFileStatus::setSharedWithMe(bool isShared)
{
_sharedWithMe = isShared;
}
bool SyncFileStatus::sharedWithMe()
{
return _sharedWithMe;
}
QString SyncFileStatus::toSocketAPIString() const
{
QString statusString;
switch(_tag)
{
case STATUS_NONE:
statusString = QLatin1String("NONE");
break;
case STATUS_EVAL:
statusString = QLatin1String("SYNC");
break;
case STATUS_NEW:
statusString = QLatin1String("NEW");
break;
case STATUS_IGNORE:
statusString = QLatin1String("IGNORE");
break;
case STATUS_SYNC:
case STATUS_UPDATED:
statusString = QLatin1String("OK");
break;
case STATUS_STAT_ERROR:
case STATUS_ERROR:
statusString = QLatin1String("ERROR");
break;
default:
qWarning() << "This status should not be here:" << _tag;
Q_ASSERT(false);
statusString = QLatin1String("NONE");
}
if(_sharedWithMe) {
statusString += QLatin1String("+SWM");
}
return statusString;
}
}

View file

@ -0,0 +1,56 @@
/*
* 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 SYNCFILESTATUS_H
#define SYNCFILESTATUS_H
#include <QString>
namespace Mirall {
class SyncFileStatus
{
public:
enum SyncFileStatusTag {
STATUS_NONE,
STATUS_EVAL,
STATUS_REMOVE,
STATUS_RENAME,
STATUS_MOVE,
STATUS_NEW,
STATUS_CONFLICT,
STATUS_IGNORE,
STATUS_SYNC,
STATUS_STAT_ERROR,
STATUS_ERROR,
STATUS_UPDATED
};
SyncFileStatus();
SyncFileStatus(SyncFileStatusTag);
void set(SyncFileStatusTag tag);
SyncFileStatusTag tag();
void setSharedWithMe( bool isShared );
bool sharedWithMe();
QString toSocketAPIString() const;
private:
SyncFileStatusTag _tag;
bool _sharedWithMe;
};
}
#endif // SYNCFILESTATUS_H