[Pkg-owncloud-commits] [owncloud-client] 65/211: SocketAPI: Cleanup, removed helper namespace, added as private methods.
Sandro Knauß
hefee-guest at moszumanska.debian.org
Sat Oct 25 09:10:27 UTC 2014
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit dd28a645a1f434990ca0f262dcce3932ec77b387
Author: Klaas Freitag <freitag at owncloud.com>
Date: Mon Oct 13 15:38:57 2014 +0200
SocketAPI: Cleanup, removed helper namespace, added as private methods.
---
src/mirall/socketapi.cpp | 405 +++++++++++++++++++++++------------------------
src/mirall/socketapi.h | 10 +-
2 files changed, 207 insertions(+), 208 deletions(-)
diff --git a/src/mirall/socketapi.cpp b/src/mirall/socketapi.cpp
index 0dbf6f1..5b32c71 100644
--- a/src/mirall/socketapi.cpp
+++ b/src/mirall/socketapi.cpp
@@ -67,213 +67,6 @@ namespace Mirall {
#define DEBUG qDebug() << "SocketApi: "
-namespace SocketApiHelper {
-
-SyncFileStatus fileStatus(Folder *folder, const QString& systemFileName, c_strlist_t *excludes );
-
-/**
- * @brief recursiveFolderStatus
- * @param fileName - the relative file name to examine
- * @return the resulting status
- *
- * The resulting status can only be either SYNC which means all files
- * are in sync, ERROR if an error occured, or EVAL if something needs
- * to be synced underneath this dir.
- */
-// compute the file status of a directory recursively. It returns either
-// "all in sync" or "needs update" or "error", no more details.
-SyncFileStatus recursiveFolderStatus(Folder *folder, const QString& fileName, c_strlist_t *excludes )
-{
- QDir dir(folder->path() + fileName);
-
- const QStringList dirEntries = dir.entryList( QDir::AllEntries | QDir::NoDotAndDotDot );
-
- SyncFileStatus result(SyncFileStatus::STATUS_SYNC);
-
- foreach( const QString entry, dirEntries ) {
- QString normalizedFile = QString(fileName + QLatin1Char('/') + entry).normalized(QString::NormalizationForm_C);
- QFileInfo fi(entry);
- SyncFileStatus sfs;
-
- if( fi.isDir() ) {
- sfs = recursiveFolderStatus(folder, normalizedFile, excludes );
- } else {
- QString fs( normalizedFile );
- if( fileName.isEmpty() ) {
- // toplevel, no slash etc. needed.
- fs = entry.normalized(QString::NormalizationForm_C);
- }
- sfs = fileStatus(folder, fs, excludes);
- }
-
- if( sfs.tag() == SyncFileStatus::STATUS_STAT_ERROR || sfs.tag() == SyncFileStatus::STATUS_ERROR ) {
- return SyncFileStatus::STATUS_ERROR;
- } else if( sfs.tag() == SyncFileStatus::STATUS_EVAL || sfs.tag() == SyncFileStatus::STATUS_NEW) {
- result.set(SyncFileStatus::STATUS_EVAL);
- }
- }
- return result;
-}
-
-SyncJournalFileRecord dbFileRecord_capi( Folder *folder, QString fileName )
-{
-
- // FIXME: Check if this stat is really needed, or is it done in the caller?
- if( !(folder && folder->journalDb()) ) {
- return SyncJournalFileRecord();
- }
-
- QFileInfo fi(fileName);
- if( fi.isAbsolute() ) {
- fileName.remove(0, folder->path().length());
- }
-
- QString dbFileName = folder->journalDb()->databaseFilePath();
-
- sqlite3 *db = NULL;
- sqlite3_stmt *stmt = NULL;
- SyncJournalFileRecord rec;
- int rc;
- const char* query = "SELECT inode, mode, modtime, type, md5, fileid, remotePerm FROM "
- "metadata WHERE phash=:ph";
-
- if( sqlite3_open_v2(dbFileName.toUtf8().constData(), &db,
- SQLITE_OPEN_READONLY+SQLITE_OPEN_NOMUTEX, NULL) == SQLITE_OK ) {
-
- rc = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
- if( rc != SQLITE_OK ) {
- qDebug() << "Unable to prepare the query statement.";
- return rec;
- }
- qlonglong phash = SyncJournalDb::getPHash( fileName );
- sqlite3_bind_int64(stmt, 1, (long long signed int)phash);
-
- // int column_count = sqlite3_column_count(stmt);
-
- rc = sqlite3_step(stmt);
-
- if (rc == SQLITE_ROW ) {
- rec._path = fileName;
- rec._inode = sqlite3_column_int64(stmt,0);;
- rec._mode = sqlite3_column_int(stmt, 1);
- rec._modtime = Utility::qDateTimeFromTime_t( strtoul((char*)sqlite3_column_text(stmt, 2), NULL, 10));
- rec._type = sqlite3_column_int(stmt, 3);;
- rec._etag = QByteArray((char*)sqlite3_column_text(stmt, 4));
- rec._fileId = QByteArray((char*)sqlite3_column_text(stmt, 5));
- rec._remotePerm = QByteArray((char*)sqlite3_column_text(stmt, 6));
- }
- sqlite3_finalize(stmt);
- sqlite3_close(db);
- }
- return rec;
-}
-
-SyncJournalFileRecord dbFileRecord( Folder *folder, QString fileName )
-{
- if( !folder ) {
- return SyncJournalFileRecord();
- }
-
- QFileInfo fi(fileName);
- if( fi.isAbsolute() ) {
- fileName.remove(0, folder->path().length());
- }
- return( folder->journalDb()->getFileRecord(fileName) );
-}
-
-/**
- * Get status about a single file.
- */
-SyncFileStatus fileStatus(Folder *folder, const QString& systemFileName, c_strlist_t *excludes )
-{
- QString file = folder->path();
- QString fileName = systemFileName.normalized(QString::NormalizationForm_C);
-
- bool isSyncRootFolder = true;
- if( fileName != QLatin1String("/") && !fileName.isEmpty() ) {
- file = folder->path() + fileName;
- isSyncRootFolder = false;
- }
-
- if( fileName.endsWith(QLatin1Char('/')) ) {
- fileName.truncate(fileName.length()-1);
- qDebug() << "Removed trailing slash: " << fileName;
- }
-
- QFileInfo fi(file);
-
- if( !fi.exists() ) {
- qDebug() << "OO File " << file << " is not existing";
- return SyncFileStatus(SyncFileStatus::STATUS_STAT_ERROR);
- }
-
- // file is ignored?
- if( fi.isSymLink() ) {
- return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
- }
- int type = CSYNC_FTW_TYPE_FILE;
- if( fi.isDir() ) {
- type = CSYNC_FTW_TYPE_DIR;
- }
-
- // '\' is ignored, so convert to unix path before passing the path in.
- QString unixFileName = QDir::fromNativeSeparators(fileName);
-
- CSYNC_EXCLUDE_TYPE excl = csync_excluded_no_ctx(excludes, unixFileName.toUtf8(), type);
- if( excl != CSYNC_NOT_EXCLUDED ) {
- return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
- }
-
- // Problem: for the sync dir itself we do not have a record in the sync journal
- // so the next check must not be used for the sync root folder.
- SyncJournalFileRecord rec = dbFileRecord_capi(folder, unixFileName );
- if( !isSyncRootFolder && !rec.isValid() ) {
- // check the parent folder if it is shared and if it is allowed to create a file/dir within
- QDir d( fi.path() );
- QString parentPath = d.path();
- SyncJournalFileRecord dirRec = dbFileRecord_capi(folder, parentPath);
- while( !d.isRoot() && !(d.exists() && dirRec.isValid()) ) {
- d.cdUp(); // returns true if the dir exists.
-
- parentPath = d.path();
- // cut the folder path
- dirRec = dbFileRecord_capi(folder, parentPath);
- }
- if( dirRec.isValid() ) {
- if( dirRec._type == CSYNC_FTW_TYPE_DIR ) {
- if( !dirRec._remotePerm.contains("K") ) {
- return SyncFileStatus::STATUS_ERROR;
- }
- } else {
- if( !dirRec._remotePerm.contains("C") ) {
- return SyncFileStatus::STATUS_ERROR;
- }
- }
- }
- return SyncFileStatus(SyncFileStatus::STATUS_NEW);
- }
-
- SyncFileStatus status(SyncFileStatus::STATUS_NONE);
- if( type == CSYNC_FTW_TYPE_DIR ) {
- // compute recursive status of the directory
- status = recursiveFolderStatus( folder, fileName, excludes );
- } else if( FileSystem::getModTime(fi.absoluteFilePath()) != Utility::qDateTimeToTime_t(rec._modtime) ) {
- // file was locally modified.
- status.set(SyncFileStatus::STATUS_EVAL);
- } else {
- status.set(SyncFileStatus::STATUS_SYNC);
- }
-
- if (rec._remotePerm.contains("S")) {
- status.setSharedWithMe(true);
- }
-
- return status;
-}
-
-
-}
-
SocketApi::SocketApi(QObject* parent)
: QObject(parent)
, _excludes(0)
@@ -570,5 +363,203 @@ void SocketApi::command_VERSION(const QString&, SocketType* socket)
}
+/**
+ * @brief recursiveFolderStatus
+ * @param fileName - the relative file name to examine
+ * @return the resulting status
+ *
+ * The resulting status can only be either SYNC which means all files
+ * are in sync, ERROR if an error occured, or EVAL if something needs
+ * to be synced underneath this dir.
+ */
+// compute the file status of a directory recursively. It returns either
+// "all in sync" or "needs update" or "error", no more details.
+SyncFileStatus SocketApi::recursiveFolderStatus(Folder *folder, const QString& fileName, c_strlist_t *excludes )
+{
+ QDir dir(folder->path() + fileName);
+
+ const QStringList dirEntries = dir.entryList( QDir::AllEntries | QDir::NoDotAndDotDot );
+
+ SyncFileStatus result(SyncFileStatus::STATUS_SYNC);
+
+ foreach( const QString entry, dirEntries ) {
+ QString normalizedFile = QString(fileName + QLatin1Char('/') + entry).normalized(QString::NormalizationForm_C);
+ QFileInfo fi(entry);
+ SyncFileStatus sfs;
+
+ if( fi.isDir() ) {
+ sfs = recursiveFolderStatus(folder, normalizedFile, excludes );
+ } else {
+ QString fs( normalizedFile );
+ if( fileName.isEmpty() ) {
+ // toplevel, no slash etc. needed.
+ fs = entry.normalized(QString::NormalizationForm_C);
+ }
+ sfs = fileStatus(folder, fs, excludes);
+ }
+
+ if( sfs.tag() == SyncFileStatus::STATUS_STAT_ERROR || sfs.tag() == SyncFileStatus::STATUS_ERROR ) {
+ return SyncFileStatus::STATUS_ERROR;
+ } else if( sfs.tag() == SyncFileStatus::STATUS_EVAL || sfs.tag() == SyncFileStatus::STATUS_NEW) {
+ result.set(SyncFileStatus::STATUS_EVAL);
+ }
+ }
+ return result;
+}
+
+SyncJournalFileRecord SocketApi::dbFileRecord_capi( Folder *folder, QString fileName )
+{
+ if( !(folder && folder->journalDb()) ) {
+ return SyncJournalFileRecord();
+ }
+
+ if( fileName.startsWith( folder->path() )) {
+ fileName.remove(0, folder->path().length());
+ }
+
+ QString dbFileName = folder->journalDb()->databaseFilePath();
+
+ sqlite3 *db = NULL;
+ sqlite3_stmt *stmt = NULL;
+ SyncJournalFileRecord rec;
+ int rc;
+ const char* query = "SELECT inode, mode, modtime, type, md5, fileid, remotePerm FROM "
+ "metadata WHERE phash=:ph";
+
+ if( sqlite3_open_v2(dbFileName.toUtf8().constData(), &db,
+ SQLITE_OPEN_READONLY+SQLITE_OPEN_NOMUTEX, NULL) == SQLITE_OK ) {
+
+ rc = sqlite3_prepare_v2(db, query, strlen(query), &stmt, NULL);
+ if( rc != SQLITE_OK ) {
+ qDebug() << "Unable to prepare the query statement.";
+ return rec;
+ }
+ qlonglong phash = SyncJournalDb::getPHash( fileName );
+ sqlite3_bind_int64(stmt, 1, (long long signed int)phash);
+
+ // int column_count = sqlite3_column_count(stmt);
+
+ rc = sqlite3_step(stmt);
+
+ if (rc == SQLITE_ROW ) {
+ rec._path = fileName;
+ rec._inode = sqlite3_column_int64(stmt,0);;
+ rec._mode = sqlite3_column_int(stmt, 1);
+ rec._modtime = Utility::qDateTimeFromTime_t( strtoul((char*)sqlite3_column_text(stmt, 2), NULL, 10));
+ rec._type = sqlite3_column_int(stmt, 3);;
+ rec._etag = QByteArray((char*)sqlite3_column_text(stmt, 4));
+ rec._fileId = QByteArray((char*)sqlite3_column_text(stmt, 5));
+ rec._remotePerm = QByteArray((char*)sqlite3_column_text(stmt, 6));
+ }
+ sqlite3_finalize(stmt);
+ sqlite3_close(db);
+ }
+ return rec;
+}
+
+SyncJournalFileRecord SocketApi::dbFileRecord( Folder *folder, QString fileName )
+{
+ if( !folder ) {
+ return SyncJournalFileRecord();
+ }
+
+ QFileInfo fi(fileName);
+ if( fi.isAbsolute() ) {
+ fileName.remove(0, folder->path().length());
+ }
+ return( folder->journalDb()->getFileRecord(fileName) );
+}
+
+/**
+ * Get status about a single file.
+ */
+SyncFileStatus SocketApi::fileStatus(Folder *folder, const QString& systemFileName, c_strlist_t *excludes )
+{
+ QString file = folder->path();
+ QString fileName = systemFileName.normalized(QString::NormalizationForm_C);
+
+ bool isSyncRootFolder = true;
+ if( fileName != QLatin1String("/") && !fileName.isEmpty() ) {
+ file = folder->path() + fileName;
+ isSyncRootFolder = false;
+ }
+
+ if( fileName.endsWith(QLatin1Char('/')) ) {
+ fileName.truncate(fileName.length()-1);
+ qDebug() << "Removed trailing slash: " << fileName;
+ }
+
+ QFileInfo fi(file);
+
+ if( !fi.exists() ) {
+ qDebug() << "OO File " << file << " is not existing";
+ return SyncFileStatus(SyncFileStatus::STATUS_STAT_ERROR);
+ }
+
+ // file is ignored?
+ if( fi.isSymLink() ) {
+ return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
+ }
+ int type = CSYNC_FTW_TYPE_FILE;
+ if( fi.isDir() ) {
+ type = CSYNC_FTW_TYPE_DIR;
+ }
+
+ // '\' is ignored, so convert to unix path before passing the path in.
+ QString unixFileName = QDir::fromNativeSeparators(fileName);
+
+ CSYNC_EXCLUDE_TYPE excl = csync_excluded_no_ctx(excludes, unixFileName.toUtf8(), type);
+ if( excl != CSYNC_NOT_EXCLUDED ) {
+ return SyncFileStatus(SyncFileStatus::STATUS_IGNORE);
+ }
+
+ // Problem: for the sync dir itself we do not have a record in the sync journal
+ // so the next check must not be used for the sync root folder.
+ SyncJournalFileRecord rec = dbFileRecord_capi(folder, unixFileName );
+ if( !isSyncRootFolder && !rec.isValid() ) {
+ // check the parent folder if it is shared and if it is allowed to create a file/dir within
+ QDir d( fi.path() );
+ QString parentPath = d.path();
+ SyncJournalFileRecord dirRec = dbFileRecord_capi(folder, parentPath);
+ while( !d.isRoot() && !(d.exists() && dirRec.isValid()) ) {
+ d.cdUp(); // returns true if the dir exists.
+
+ parentPath = d.path();
+ // cut the folder path
+ dirRec = dbFileRecord_capi(folder, parentPath);
+ }
+ if( dirRec.isValid() ) {
+ if( dirRec._type == CSYNC_FTW_TYPE_DIR ) {
+ if( !dirRec._remotePerm.contains("K") ) {
+ return SyncFileStatus::STATUS_ERROR;
+ }
+ } else {
+ if( !dirRec._remotePerm.contains("C") ) {
+ return SyncFileStatus::STATUS_ERROR;
+ }
+ }
+ }
+ return SyncFileStatus(SyncFileStatus::STATUS_NEW);
+ }
+
+ SyncFileStatus status(SyncFileStatus::STATUS_NONE);
+ if( type == CSYNC_FTW_TYPE_DIR ) {
+ // compute recursive status of the directory
+ status = recursiveFolderStatus( folder, fileName, excludes );
+ } else if( FileSystem::getModTime(fi.absoluteFilePath()) != Utility::qDateTimeToTime_t(rec._modtime) ) {
+ // file was locally modified.
+ status.set(SyncFileStatus::STATUS_EVAL);
+ } else {
+ status.set(SyncFileStatus::STATUS_SYNC);
+ }
+
+ if (rec._remotePerm.contains("S")) {
+ status.setSharedWithMe(true);
+ }
+
+ return status;
+}
+
+
} // namespace Mirall
diff --git a/src/mirall/socketapi.h b/src/mirall/socketapi.h
index 039f4cc..1c36cc4 100644
--- a/src/mirall/socketapi.h
+++ b/src/mirall/socketapi.h
@@ -26,7 +26,7 @@ extern "C" {
#include <QLocalServer>
#include "mirall/syncfileitem.h"
-
+#include "mirall/syncjournalfilerecord.h"
class QUrl;
class QLocalSocket;
class QStringList;
@@ -35,6 +35,9 @@ namespace Mirall {
typedef QLocalSocket SocketType;
+class SyncFileStatus;
+class Folder;
+
class SocketApi : public QObject
{
Q_OBJECT
@@ -57,6 +60,11 @@ private slots:
void slotSyncItemDiscovered(const QString &, const SyncFileItem &);
private:
+ SyncFileStatus fileStatus(Folder *folder, const QString& systemFileName, c_strlist_t *excludes );
+ SyncJournalFileRecord dbFileRecord( Folder *folder, QString fileName );
+ SyncJournalFileRecord dbFileRecord_capi( Folder *folder, QString fileName );
+ SyncFileStatus recursiveFolderStatus(Folder *folder, const QString& fileName, c_strlist_t *excludes );
+
void sendMessage(SocketType* socket, const QString& message, bool doWait = false);
void broadcastMessage(const QString& verb, const QString &path, const QString &status = QString::null, bool doWait = false);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list