mirror of
https://github.com/nextcloud/desktop.git
synced 2025-10-26 11:17:43 +00:00
csync: apply strict QString handling
This commit is contained in:
parent
82dbf8b5e1
commit
563b347567
@ -261,7 +261,7 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi
|
||||
// the fd the handle will be closed too.
|
||||
int fd = _open_osfhandle((intptr_t)fileHandle, _O_RDONLY);
|
||||
if (fd == -1) {
|
||||
error = "could not make fd from handle";
|
||||
error = QStringLiteral("could not make fd from handle");
|
||||
CloseHandle(fileHandle);
|
||||
return false;
|
||||
}
|
||||
@ -333,9 +333,9 @@ QString FileSystem::fileSystemForPath(const QString &path)
|
||||
{
|
||||
// See also QStorageInfo (Qt >=5.4) and GetVolumeInformationByHandleW (>= Vista)
|
||||
QString drive = path.left(2);
|
||||
if (!drive.endsWith(":"))
|
||||
if (!drive.endsWith(QLatin1Char(':')))
|
||||
return QString();
|
||||
drive.append('\\');
|
||||
drive.append(QLatin1Char('\\'));
|
||||
|
||||
const size_t fileSystemBufferSize = 4096;
|
||||
TCHAR fileSystemBuffer[fileSystemBufferSize];
|
||||
@ -376,13 +376,13 @@ bool FileSystem::moveToTrash(const QString &fileName, QString *errorString)
|
||||
QString trashPath, trashFilePath, trashInfoPath;
|
||||
QString xdgDataHome = QFile::decodeName(qgetenv("XDG_DATA_HOME"));
|
||||
if (xdgDataHome.isEmpty()) {
|
||||
trashPath = QDir::homePath() + "/.local/share/Trash/"; // trash path that should exist
|
||||
trashPath = QDir::homePath() + QStringLiteral("/.local/share/Trash/"); // trash path that should exist
|
||||
} else {
|
||||
trashPath = xdgDataHome + "/Trash/";
|
||||
trashPath = xdgDataHome + QStringLiteral("/Trash/");
|
||||
}
|
||||
|
||||
trashFilePath = trashPath + "files/"; // trash file path contain delete files
|
||||
trashInfoPath = trashPath + "info/"; // trash info path contain delete files information
|
||||
trashFilePath = trashPath + QStringLiteral("files/"); // trash file path contain delete files
|
||||
trashInfoPath = trashPath + QStringLiteral("info/"); // trash info path contain delete files information
|
||||
|
||||
if (!(QDir().mkpath(trashFilePath) && QDir().mkpath(trashInfoPath))) {
|
||||
*errorString = QCoreApplication::translate("FileSystem", "Could not make directories in trash");
|
||||
@ -394,7 +394,7 @@ bool FileSystem::moveToTrash(const QString &fileName, QString *errorString)
|
||||
QDir file;
|
||||
int suffix_number = 1;
|
||||
if (file.exists(trashFilePath + f.fileName())) { //file in trash already exists, move to "filename.1"
|
||||
QString path = trashFilePath + f.fileName() + ".";
|
||||
QString path = trashFilePath + f.fileName() + QLatin1Char('.');
|
||||
while (file.exists(path + QString::number(suffix_number))) { //or to "filename.2" if "filename.1" exists, etc
|
||||
suffix_number++;
|
||||
}
|
||||
@ -413,11 +413,11 @@ bool FileSystem::moveToTrash(const QString &fileName, QString *errorString)
|
||||
|
||||
// create file format for trash info file----- START
|
||||
QFile infoFile;
|
||||
if (file.exists(trashInfoPath + f.fileName() + ".trashinfo")) { //TrashInfo file already exists, create "filename.1.trashinfo"
|
||||
QString filename = trashInfoPath + f.fileName() + "." + QString::number(suffix_number) + ".trashinfo";
|
||||
if (file.exists(trashInfoPath + f.fileName() + QStringLiteral(".trashinfo"))) { //TrashInfo file already exists, create "filename.1.trashinfo"
|
||||
QString filename = trashInfoPath + f.fileName() + QLatin1Char('.') + QString::number(suffix_number) + QStringLiteral(".trashinfo");
|
||||
infoFile.setFileName(filename); //filename+.trashinfo // create file information file in /.local/share/Trash/info/ folder
|
||||
} else {
|
||||
QString filename = trashInfoPath + f.fileName() + ".trashinfo";
|
||||
QString filename = trashInfoPath + f.fileName() + QStringLiteral(".trashinfo");
|
||||
infoFile.setFileName(filename); //filename+.trashinfo // create file information file in /.local/share/Trash/info/ folder
|
||||
}
|
||||
|
||||
@ -425,16 +425,13 @@ bool FileSystem::moveToTrash(const QString &fileName, QString *errorString)
|
||||
|
||||
QTextStream stream(&infoFile); // for write data on open file
|
||||
|
||||
QByteArray info = "[Trash Info]\n";
|
||||
info += "Path=";
|
||||
info += QUrl::toPercentEncoding(f.absoluteFilePath(), "~_-./");
|
||||
info += '\n';
|
||||
info += "DeletionDate=";
|
||||
info += QDateTime::currentDateTime().toString(Qt::ISODate).toLatin1();
|
||||
info += '\n';
|
||||
|
||||
stream << info;
|
||||
|
||||
stream << "[Trash Info]\n"
|
||||
<< "Path="
|
||||
<< QUrl::toPercentEncoding(f.absoluteFilePath(), "~_-./")
|
||||
<< "\n"
|
||||
<< "DeletionDate="
|
||||
<< QDateTime::currentDateTime().toString(Qt::ISODate)
|
||||
<< '\n';
|
||||
infoFile.close();
|
||||
|
||||
// create info file format of trash file----- END
|
||||
@ -479,7 +476,7 @@ bool FileSystem::isFileLocked(const QString &fileName)
|
||||
|
||||
bool FileSystem::isLnkFile(const QString &filename)
|
||||
{
|
||||
return filename.endsWith(".lnk");
|
||||
return filename.endsWith(QLatin1String(".lnk"));
|
||||
}
|
||||
|
||||
bool FileSystem::isJunction(const QString &filename)
|
||||
@ -500,4 +497,33 @@ bool FileSystem::isJunction(const QString &filename)
|
||||
#endif
|
||||
}
|
||||
|
||||
QString FileSystem::pathtoUNC(const QString &str)
|
||||
{
|
||||
int len = 0;
|
||||
QString longStr;
|
||||
|
||||
len = str.length();
|
||||
longStr.reserve(len + 4);
|
||||
|
||||
// prepend \\?\ and convert '/' => '\' to support long names
|
||||
if (str[0] == QLatin1Char('/') || str[0] == QLatin1Char('\\')) {
|
||||
// Don't prepend if already UNC
|
||||
if (!(len > 1 && (str[1] == QLatin1Char('/') || str[1] == QLatin1Char('\\')))) {
|
||||
longStr.append(QStringLiteral("\\\\?"));
|
||||
}
|
||||
} else {
|
||||
longStr.append(QStringLiteral("\\\\?\\")); // prepend string by this four magic chars.
|
||||
}
|
||||
longStr += str;
|
||||
|
||||
/* replace all occurences of / with the windows native \ */
|
||||
|
||||
for (auto it = longStr.begin(); it != longStr.end(); ++it) {
|
||||
if (*it == QLatin1Char('/')) {
|
||||
*it = QLatin1Char('\\');
|
||||
}
|
||||
}
|
||||
return longStr;
|
||||
}
|
||||
|
||||
} // namespace OCC
|
||||
|
||||
@ -156,35 +156,7 @@ namespace FileSystem {
|
||||
* - A conversion is only done if the path len is larger than 245. Otherwise
|
||||
* the windows API functions work with the normal "unixoid" representation too.
|
||||
*/
|
||||
template<typename S>
|
||||
S pathtoUNC(const S &str)
|
||||
{
|
||||
int len = 0;
|
||||
S longStr;
|
||||
|
||||
len = str.length();
|
||||
longStr.reserve(len+4);
|
||||
|
||||
// prepend \\?\ and convert '/' => '\' to support long names
|
||||
if( str[0] == '/' || str[0] == '\\' ) {
|
||||
// Don't prepend if already UNC
|
||||
if( !(len > 1 && (str[1] == '/' || str[1] == '\\')) ) {
|
||||
longStr.append(R"(\\?)");
|
||||
}
|
||||
} else {
|
||||
longStr.append(R"(\\?\)"); // prepend string by this four magic chars.
|
||||
}
|
||||
longStr += str;
|
||||
|
||||
/* replace all occurences of / with the windows native \ */
|
||||
|
||||
for (auto it = longStr.begin(); it != longStr.end(); ++it) {
|
||||
if(*it == '/') {
|
||||
*it = '\\';
|
||||
}
|
||||
}
|
||||
return longStr;
|
||||
}
|
||||
QString OCSYNC_EXPORT pathtoUNC(const QString &str);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
@ -108,7 +108,7 @@ SqlDatabase::CheckDbResult SqlDatabase::checkDb()
|
||||
|
||||
quick_check.next();
|
||||
QString result = quick_check.stringValue(0);
|
||||
if (result != "ok") {
|
||||
if (result != QLatin1String("ok")) {
|
||||
qCWarning(lcSql) << "quick_check returned failure:" << result;
|
||||
return CheckDbResult::NotOk;
|
||||
}
|
||||
@ -384,14 +384,14 @@ void SqlQuery::bindValueInternal(int pos, const QVariant &value)
|
||||
break;
|
||||
case QVariant::DateTime: {
|
||||
const QDateTime dateTime = value.toDateTime();
|
||||
const QString str = dateTime.toString(QLatin1String("yyyy-MM-ddThh:mm:ss.zzz"));
|
||||
const QString str = dateTime.toString(QStringLiteral("yyyy-MM-ddThh:mm:ss.zzz"));
|
||||
res = sqlite3_bind_text16(_stmt, pos, str.utf16(),
|
||||
str.size() * static_cast<int>(sizeof(ushort)), SQLITE_TRANSIENT);
|
||||
break;
|
||||
}
|
||||
case QVariant::Time: {
|
||||
const QTime time = value.toTime();
|
||||
const QString str = time.toString(QLatin1String("hh:mm:ss.zzz"));
|
||||
const QString str = time.toString(QStringLiteral("hh:mm:ss.zzz"));
|
||||
res = sqlite3_bind_text16(_stmt, pos, str.utf16(),
|
||||
str.size() * static_cast<int>(sizeof(ushort)), SQLITE_TRANSIENT);
|
||||
break;
|
||||
@ -462,7 +462,7 @@ int SqlQuery::errorId() const
|
||||
return _errId;
|
||||
}
|
||||
|
||||
QString SqlQuery::lastQuery() const
|
||||
const QByteArray &SqlQuery::lastQuery() const
|
||||
{
|
||||
return _sql;
|
||||
}
|
||||
|
||||
@ -152,7 +152,7 @@ public:
|
||||
bindValueInternal(pos, value);
|
||||
}
|
||||
|
||||
QString lastQuery() const;
|
||||
const QByteArray &lastQuery() const;
|
||||
int numRowsAffected();
|
||||
void reset_and_clear_bindings();
|
||||
void finish();
|
||||
|
||||
@ -26,8 +26,8 @@ PluginFactory::~PluginFactory() = default;
|
||||
|
||||
QString pluginFileName(const QString &type, const QString &name)
|
||||
{
|
||||
return QString(QLatin1String("%1sync_%2_%3"))
|
||||
.arg(APPLICATION_EXECUTABLE, type, name);
|
||||
return QStringLiteral("%1sync_%2_%3")
|
||||
.arg(QStringLiteral(APPLICATION_EXECUTABLE), type, name);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -54,9 +54,9 @@ QByteArray RemotePermissions::toDbValue() const
|
||||
return result;
|
||||
}
|
||||
|
||||
QByteArray RemotePermissions::toString() const
|
||||
QString RemotePermissions::toString() const
|
||||
{
|
||||
return toDbValue();
|
||||
return QString::fromUtf8(toDbValue());
|
||||
}
|
||||
|
||||
RemotePermissions RemotePermissions::fromDbValue(const QByteArray &value)
|
||||
|
||||
@ -66,7 +66,7 @@ public:
|
||||
QByteArray toDbValue() const;
|
||||
|
||||
/// output for display purposes, no defined format (same as toDbValue in practice)
|
||||
QByteArray toString() const;
|
||||
QString toString() const;
|
||||
|
||||
/// read value that was written with toDbValue()
|
||||
static RemotePermissions fromDbValue(const QByteArray &);
|
||||
|
||||
@ -49,25 +49,25 @@ QString SyncFileStatus::toSocketAPIString() const
|
||||
|
||||
switch (_tag) {
|
||||
case StatusNone:
|
||||
statusString = QLatin1String("NOP");
|
||||
statusString = QStringLiteral("NOP");
|
||||
canBeShared = false;
|
||||
break;
|
||||
case StatusSync:
|
||||
statusString = QLatin1String("SYNC");
|
||||
statusString = QStringLiteral("SYNC");
|
||||
break;
|
||||
case StatusWarning:
|
||||
// The protocol says IGNORE, but all implementations show a yellow warning sign.
|
||||
statusString = QLatin1String("IGNORE");
|
||||
statusString = QStringLiteral("IGNORE");
|
||||
break;
|
||||
case StatusUpToDate:
|
||||
statusString = QLatin1String("OK");
|
||||
statusString = QStringLiteral("OK");
|
||||
break;
|
||||
case StatusError:
|
||||
statusString = QLatin1String("ERROR");
|
||||
statusString = QStringLiteral("ERROR");
|
||||
break;
|
||||
case StatusExcluded:
|
||||
// The protocol says IGNORE, but all implementations show a yellow warning sign.
|
||||
statusString = QLatin1String("IGNORE");
|
||||
statusString = QStringLiteral("IGNORE");
|
||||
break;
|
||||
}
|
||||
if (canBeShared && _shared) {
|
||||
|
||||
@ -74,7 +74,7 @@ static QByteArray defaultJournalMode(const QString &dbPath)
|
||||
// WAL journaling mode. They work fine with DELETE.
|
||||
QString fileSystem = FileSystem::fileSystemForPath(dbPath);
|
||||
qCInfo(lcDb) << "Detected filesystem" << fileSystem << "for" << dbPath;
|
||||
if (fileSystem.contains("FAT")) {
|
||||
if (fileSystem.contains(QLatin1String("FAT"))) {
|
||||
qCInfo(lcDb) << "Filesystem contains FAT - using DELETE journal mode";
|
||||
return "DELETE";
|
||||
}
|
||||
@ -109,13 +109,12 @@ QString SyncJournalDb::makeDbName(const QString &localPath,
|
||||
const QString &remotePath,
|
||||
const QString &user)
|
||||
{
|
||||
QString journalPath = QLatin1String(".sync_");
|
||||
QString journalPath = QStringLiteral(".sync_");
|
||||
|
||||
QString key = QString::fromUtf8("%1@%2:%3").arg(user, remoteUrl.toString(), remotePath);
|
||||
QString key = QStringLiteral("%1@%2:%3").arg(user, remoteUrl.toString(), remotePath);
|
||||
|
||||
QByteArray ba = QCryptographicHash::hash(key.toUtf8(), QCryptographicHash::Md5);
|
||||
journalPath.append(ba.left(6).toHex());
|
||||
journalPath.append(".db");
|
||||
journalPath += QString::fromLatin1(ba.left(6).toHex()) + QStringLiteral(".db");
|
||||
|
||||
// If it exists already, the path is clearly usable
|
||||
QFile file(QDir(localPath).filePath(journalPath));
|
||||
@ -142,12 +141,12 @@ bool SyncJournalDb::maybeMigrateDb(const QString &localPath, const QString &abso
|
||||
if (!FileSystem::fileExists(oldDbName)) {
|
||||
return true;
|
||||
}
|
||||
const QString oldDbNameShm = oldDbName + "-shm";
|
||||
const QString oldDbNameWal = oldDbName + "-wal";
|
||||
const QString oldDbNameShm = oldDbName + QStringLiteral("-shm");
|
||||
const QString oldDbNameWal = oldDbName + QStringLiteral("-wal");
|
||||
|
||||
const QString newDbName = absoluteJournalPath;
|
||||
const QString newDbNameShm = newDbName + "-shm";
|
||||
const QString newDbNameWal = newDbName + "-wal";
|
||||
const QString newDbNameShm = newDbName + QStringLiteral("-shm");
|
||||
const QString newDbNameWal = newDbName + QStringLiteral("-wal");
|
||||
|
||||
// Whenever there is an old db file, migrate it to the new db path.
|
||||
// This is done to make switching from older versions to newer versions
|
||||
@ -178,17 +177,17 @@ bool SyncJournalDb::maybeMigrateDb(const QString &localPath, const QString &abso
|
||||
}
|
||||
|
||||
if (!FileSystem::rename(oldDbName, newDbName, &error)) {
|
||||
qCWarning(lcDb) << "Database migration: could not rename " << oldDbName
|
||||
qCWarning(lcDb) << "Database migration: could not rename" << oldDbName
|
||||
<< "to" << newDbName << ":" << error;
|
||||
return false;
|
||||
}
|
||||
if (!FileSystem::rename(oldDbNameWal, newDbNameWal, &error)) {
|
||||
qCWarning(lcDb) << "Database migration: could not rename " << oldDbNameWal
|
||||
qCWarning(lcDb) << "Database migration: could not rename" << oldDbNameWal
|
||||
<< "to" << newDbNameWal << ":" << error;
|
||||
return false;
|
||||
}
|
||||
if (!FileSystem::rename(oldDbNameShm, newDbNameShm, &error)) {
|
||||
qCWarning(lcDb) << "Database migration: could not rename " << oldDbNameShm
|
||||
qCWarning(lcDb) << "Database migration: could not rename" << oldDbNameShm
|
||||
<< "to" << newDbNameShm << ":" << error;
|
||||
return false;
|
||||
}
|
||||
@ -226,7 +225,7 @@ void SyncJournalDb::startTransaction()
|
||||
{
|
||||
if (_transaction == 0) {
|
||||
if (!_db.transaction()) {
|
||||
qCWarning(lcDb) << "ERROR starting transaction: " << _db.error();
|
||||
qCWarning(lcDb) << "ERROR starting transaction:" << _db.error();
|
||||
return;
|
||||
}
|
||||
_transaction = 1;
|
||||
@ -239,7 +238,7 @@ void SyncJournalDb::commitTransaction()
|
||||
{
|
||||
if (_transaction == 1) {
|
||||
if (!_db.commit()) {
|
||||
qCWarning(lcDb) << "ERROR committing to the database: " << _db.error();
|
||||
qCWarning(lcDb) << "ERROR committing to the database:" << _db.error();
|
||||
return;
|
||||
}
|
||||
_transaction = 0;
|
||||
@ -270,7 +269,7 @@ bool SyncJournalDb::checkConnect()
|
||||
// Unfortunately the sqlite isOpen check can return true even when the underlying storage
|
||||
// has become unavailable - and then some operations may cause crashes. See #6049
|
||||
if (!QFile::exists(_dbFile)) {
|
||||
qCWarning(lcDb) << "Database open, but file " + _dbFile + " does not exist";
|
||||
qCWarning(lcDb) << "Database open, but file" << _dbFile << "does not exist";
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
@ -278,26 +277,26 @@ bool SyncJournalDb::checkConnect()
|
||||
}
|
||||
|
||||
if (_dbFile.isEmpty()) {
|
||||
qCWarning(lcDb) << "Database filename" + _dbFile + " is empty";
|
||||
qCWarning(lcDb) << "Database filename" << _dbFile << "is empty";
|
||||
return false;
|
||||
}
|
||||
|
||||
// The database file is created by this call (SQLITE_OPEN_CREATE)
|
||||
if (!_db.openOrCreateReadWrite(_dbFile)) {
|
||||
QString error = _db.error();
|
||||
qCWarning(lcDb) << "Error opening the db: " << error;
|
||||
qCWarning(lcDb) << "Error opening the db:" << error;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!QFile::exists(_dbFile)) {
|
||||
qCWarning(lcDb) << "Database file" + _dbFile + " does not exist";
|
||||
qCWarning(lcDb) << "Database file" << _dbFile << "does not exist";
|
||||
return false;
|
||||
}
|
||||
|
||||
SqlQuery pragma1(_db);
|
||||
pragma1.prepare("SELECT sqlite_version();");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("SELECT sqlite_version()", pragma1);
|
||||
return sqlFail(QStringLiteral("SELECT sqlite_version()"), pragma1);
|
||||
} else {
|
||||
pragma1.next();
|
||||
qCInfo(lcDb) << "sqlite3 version" << pragma1.stringValue(0);
|
||||
@ -309,7 +308,7 @@ bool SyncJournalDb::checkConnect()
|
||||
locking_mode_env = "EXCLUSIVE";
|
||||
pragma1.prepare("PRAGMA locking_mode=" + locking_mode_env + ";");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("Set PRAGMA locking_mode", pragma1);
|
||||
return sqlFail(QStringLiteral("Set PRAGMA locking_mode"), pragma1);
|
||||
} else {
|
||||
pragma1.next();
|
||||
qCInfo(lcDb) << "sqlite3 locking_mode=" << pragma1.stringValue(0);
|
||||
@ -317,7 +316,7 @@ bool SyncJournalDb::checkConnect()
|
||||
|
||||
pragma1.prepare("PRAGMA journal_mode=" + _journalMode + ";");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("Set PRAGMA journal_mode", pragma1);
|
||||
return sqlFail(QStringLiteral("Set PRAGMA journal_mode"), pragma1);
|
||||
} else {
|
||||
pragma1.next();
|
||||
qCInfo(lcDb) << "sqlite3 journal_mode=" << pragma1.stringValue(0);
|
||||
@ -328,7 +327,7 @@ bool SyncJournalDb::checkConnect()
|
||||
if (!env_temp_store.isEmpty()) {
|
||||
pragma1.prepare("PRAGMA temp_store = " + env_temp_store + ";");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("Set PRAGMA temp_store", pragma1);
|
||||
return sqlFail(QStringLiteral("Set PRAGMA temp_store"), pragma1);
|
||||
}
|
||||
qCInfo(lcDb) << "sqlite3 with temp_store =" << env_temp_store;
|
||||
}
|
||||
@ -340,14 +339,14 @@ bool SyncJournalDb::checkConnect()
|
||||
synchronousMode = "NORMAL";
|
||||
pragma1.prepare("PRAGMA synchronous = " + synchronousMode + ";");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("Set PRAGMA synchronous", pragma1);
|
||||
return sqlFail(QStringLiteral("Set PRAGMA synchronous"), pragma1);
|
||||
} else {
|
||||
qCInfo(lcDb) << "sqlite3 synchronous=" << synchronousMode;
|
||||
}
|
||||
|
||||
pragma1.prepare("PRAGMA case_sensitive_like = ON;");
|
||||
if (!pragma1.exec()) {
|
||||
return sqlFail("Set PRAGMA case_sensitivity", pragma1);
|
||||
return sqlFail(QStringLiteral("Set PRAGMA case_sensitivity"), pragma1);
|
||||
}
|
||||
|
||||
sqlite3_create_function(_db.sqliteDb(), "parent_hash", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC, nullptr,
|
||||
@ -406,7 +405,7 @@ bool SyncJournalDb::checkConnect()
|
||||
return checkConnect();
|
||||
}
|
||||
|
||||
return sqlFail("Create table metadata", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table metadata"), createQuery);
|
||||
}
|
||||
|
||||
createQuery.prepare("CREATE TABLE IF NOT EXISTS downloadinfo("
|
||||
@ -418,7 +417,7 @@ bool SyncJournalDb::checkConnect()
|
||||
");");
|
||||
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table downloadinfo", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table downloadinfo"), createQuery);
|
||||
}
|
||||
|
||||
createQuery.prepare("CREATE TABLE IF NOT EXISTS uploadinfo("
|
||||
@ -433,7 +432,7 @@ bool SyncJournalDb::checkConnect()
|
||||
");");
|
||||
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table uploadinfo", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table uploadinfo"), createQuery);
|
||||
}
|
||||
|
||||
// create the blacklist table.
|
||||
@ -447,7 +446,7 @@ bool SyncJournalDb::checkConnect()
|
||||
");");
|
||||
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table blacklist", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table blacklist"), createQuery);
|
||||
}
|
||||
|
||||
createQuery.prepare("CREATE TABLE IF NOT EXISTS async_poll("
|
||||
@ -456,7 +455,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"filesize BIGINT,"
|
||||
"pollpath VARCHAR(4096));");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table async_poll", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table async_poll"), createQuery);
|
||||
}
|
||||
|
||||
// create the selectivesync table.
|
||||
@ -466,7 +465,7 @@ bool SyncJournalDb::checkConnect()
|
||||
");");
|
||||
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table selectivesync", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table selectivesync"), createQuery);
|
||||
}
|
||||
|
||||
// create the checksumtype table.
|
||||
@ -475,7 +474,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"name TEXT UNIQUE"
|
||||
");");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table version", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table version"), createQuery);
|
||||
}
|
||||
|
||||
// create the datafingerprint table.
|
||||
@ -483,7 +482,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"fingerprint TEXT UNIQUE"
|
||||
");");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table datafingerprint", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table datafingerprint"), createQuery);
|
||||
}
|
||||
|
||||
// create the flags table.
|
||||
@ -492,7 +491,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"pinState INTEGER"
|
||||
");");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table flags", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table flags"), createQuery);
|
||||
}
|
||||
|
||||
// create the conflicts table.
|
||||
@ -503,7 +502,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"baseModtime INTEGER"
|
||||
");");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table conflicts", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table conflicts"), createQuery);
|
||||
}
|
||||
|
||||
createQuery.prepare("CREATE TABLE IF NOT EXISTS version("
|
||||
@ -513,7 +512,7 @@ bool SyncJournalDb::checkConnect()
|
||||
"custom VARCHAR(256)"
|
||||
");");
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Create table version", createQuery);
|
||||
return sqlFail(QStringLiteral("Create table version"), createQuery);
|
||||
}
|
||||
|
||||
bool forceRemoteDiscovery = false;
|
||||
@ -530,7 +529,7 @@ bool SyncJournalDb::checkConnect()
|
||||
createQuery.bindValue(3, MIRALL_VERSION_PATCH);
|
||||
createQuery.bindValue(4, MIRALL_VERSION_BUILD);
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Update version", createQuery);
|
||||
return sqlFail(QStringLiteral("Update version"), createQuery);
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -563,12 +562,12 @@ bool SyncJournalDb::checkConnect()
|
||||
createQuery.bindValue(6, minor);
|
||||
createQuery.bindValue(7, patch);
|
||||
if (!createQuery.exec()) {
|
||||
return sqlFail("Update version", createQuery);
|
||||
return sqlFail(QStringLiteral("Update version"), createQuery);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
commitInternal("checkConnect");
|
||||
commitInternal(QStringLiteral("checkConnect"));
|
||||
|
||||
bool rc = updateDatabaseStructure();
|
||||
if (!rc) {
|
||||
@ -588,11 +587,11 @@ bool SyncJournalDb::checkConnect()
|
||||
}
|
||||
|
||||
if (!_deleteDownloadInfoQuery.initOrReset("DELETE FROM downloadinfo WHERE path=?1", _db)) {
|
||||
return sqlFail("prepare _deleteDownloadInfoQuery", _deleteDownloadInfoQuery);
|
||||
return sqlFail(QStringLiteral("prepare _deleteDownloadInfoQuery"), _deleteDownloadInfoQuery);
|
||||
}
|
||||
|
||||
if (!_deleteUploadInfoQuery.initOrReset("DELETE FROM uploadinfo WHERE path=?1", _db)) {
|
||||
return sqlFail("prepare _deleteUploadInfoQuery", _deleteUploadInfoQuery);
|
||||
return sqlFail(QStringLiteral("prepare _deleteUploadInfoQuery"), _deleteUploadInfoQuery);
|
||||
}
|
||||
|
||||
QByteArray sql("SELECT lastTryEtag, lastTryModtime, retrycount, errorstring, lastTryTime, ignoreDuration, renameTarget, errorCategory, requestId "
|
||||
@ -603,11 +602,11 @@ bool SyncJournalDb::checkConnect()
|
||||
sql += " COLLATE NOCASE";
|
||||
}
|
||||
if (!_getErrorBlacklistQuery.initOrReset(sql, _db)) {
|
||||
return sqlFail("prepare _getErrorBlacklistQuery", _getErrorBlacklistQuery);
|
||||
return sqlFail(QStringLiteral("prepare _getErrorBlacklistQuery"), _getErrorBlacklistQuery);
|
||||
}
|
||||
|
||||
// don't start a new transaction now
|
||||
commitInternal(QString("checkConnect End"), false);
|
||||
commitInternal(QStringLiteral("checkConnect End"), false);
|
||||
|
||||
// This avoid reading from the DB if we already know it is empty
|
||||
// thereby speeding up the initial discovery significantly.
|
||||
@ -615,9 +614,9 @@ bool SyncJournalDb::checkConnect()
|
||||
|
||||
// Hide 'em all!
|
||||
FileSystem::setFileHidden(databaseFilePath(), true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + "-wal", true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + "-shm", true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + "-journal", true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + QStringLiteral("-wal"), true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + QStringLiteral("-shm"), true);
|
||||
FileSystem::setFileHidden(databaseFilePath() + QStringLiteral("-journal"), true);
|
||||
|
||||
return rc;
|
||||
}
|
||||
@ -659,113 +658,113 @@ bool SyncJournalDb::updateMetadataTableStructure()
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN fileid VARCHAR(128);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: Add column fileid", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: Add column fileid"), query);
|
||||
re = false;
|
||||
}
|
||||
|
||||
query.prepare("CREATE INDEX metadata_file_id ON metadata(fileid);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: create index fileid", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: create index fileid"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add fileid col");
|
||||
commitInternal(QStringLiteral("update database structure: add fileid col"));
|
||||
}
|
||||
if (columns.indexOf("remotePerm") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN remotePerm VARCHAR(128);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add column remotePerm", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add column remotePerm"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure (remotePerm)");
|
||||
commitInternal(QStringLiteral("update database structure (remotePerm)"));
|
||||
}
|
||||
if (columns.indexOf("filesize") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN filesize BIGINT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateDatabaseStructure: add column filesize", query);
|
||||
sqlFail(QStringLiteral("updateDatabaseStructure: add column filesize"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add filesize col");
|
||||
commitInternal(QStringLiteral("update database structure: add filesize col"));
|
||||
}
|
||||
|
||||
if (true) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS metadata_inode ON metadata(inode);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: create index inode", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: create index inode"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add inode index");
|
||||
commitInternal(QStringLiteral("update database structure: add inode index"));
|
||||
}
|
||||
|
||||
if (true) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS metadata_path ON metadata(path);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: create index path", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: create index path"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add path index");
|
||||
commitInternal(QStringLiteral("update database structure: add path index"));
|
||||
}
|
||||
|
||||
if (1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS metadata_parent ON metadata(parent_hash(path));");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: create index parent", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: create index parent"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add parent index");
|
||||
commitInternal(QStringLiteral("update database structure: add parent index"));
|
||||
}
|
||||
|
||||
if (columns.indexOf("ignoredChildrenRemote") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN ignoredChildrenRemote INT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add ignoredChildrenRemote column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add ignoredChildrenRemote column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add ignoredChildrenRemote col");
|
||||
commitInternal(QStringLiteral("update database structure: add ignoredChildrenRemote col"));
|
||||
}
|
||||
|
||||
if (columns.indexOf("contentChecksum") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN contentChecksum TEXT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add contentChecksum column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add contentChecksum column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add contentChecksum col");
|
||||
commitInternal(QStringLiteral("update database structure: add contentChecksum col"));
|
||||
}
|
||||
if (columns.indexOf("contentChecksumTypeId") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN contentChecksumTypeId INTEGER;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add contentChecksumTypeId column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add contentChecksumTypeId column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add contentChecksumTypeId col");
|
||||
commitInternal(QStringLiteral("update database structure: add contentChecksumTypeId col"));
|
||||
}
|
||||
|
||||
if (!columns.contains("e2eMangledName")) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN e2eMangledName TEXT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add e2eMangledName column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add e2eMangledName column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add e2eMangledName col");
|
||||
commitInternal(QStringLiteral("update database structure: add e2eMangledName col"));
|
||||
}
|
||||
|
||||
if (!columns.contains("isE2eEncrypted")) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE metadata ADD COLUMN isE2eEncrypted INTEGER;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add isE2eEncrypted column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add isE2eEncrypted column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add isE2eEncrypted col");
|
||||
commitInternal(QStringLiteral("update database structure: add isE2eEncrypted col"));
|
||||
}
|
||||
|
||||
auto uploadInfoColumns = tableColumns("uploadinfo");
|
||||
@ -775,10 +774,10 @@ bool SyncJournalDb::updateMetadataTableStructure()
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE uploadinfo ADD COLUMN contentChecksum TEXT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add contentChecksum column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add contentChecksum column"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add contentChecksum col for uploadinfo");
|
||||
commitInternal(QStringLiteral("update database structure: add contentChecksum col for uploadinfo"));
|
||||
}
|
||||
|
||||
auto conflictsColumns = tableColumns("conflicts");
|
||||
@ -788,7 +787,7 @@ bool SyncJournalDb::updateMetadataTableStructure()
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE conflicts ADD COLUMN basePath TEXT;");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: add basePath column", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: add basePath column"), query);
|
||||
re = false;
|
||||
}
|
||||
}
|
||||
@ -797,10 +796,10 @@ bool SyncJournalDb::updateMetadataTableStructure()
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS metadata_e2e_id ON metadata(e2eMangledName);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateMetadataTableStructure: create index e2eMangledName", query);
|
||||
sqlFail(QStringLiteral("updateMetadataTableStructure: create index e2eMangledName"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add e2eMangledName index");
|
||||
commitInternal(QStringLiteral("update database structure: add e2eMangledName index"));
|
||||
}
|
||||
|
||||
return re;
|
||||
@ -819,50 +818,50 @@ bool SyncJournalDb::updateErrorBlacklistTableStructure()
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE blacklist ADD COLUMN lastTryTime INTEGER(8);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateBlacklistTableStructure: Add lastTryTime fileid", query);
|
||||
sqlFail(QStringLiteral("updateBlacklistTableStructure: Add lastTryTime fileid"), query);
|
||||
re = false;
|
||||
}
|
||||
query.prepare("ALTER TABLE blacklist ADD COLUMN ignoreDuration INTEGER(8);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateBlacklistTableStructure: Add ignoreDuration fileid", query);
|
||||
sqlFail(QStringLiteral("updateBlacklistTableStructure: Add ignoreDuration fileid"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add lastTryTime, ignoreDuration cols");
|
||||
commitInternal(QStringLiteral("update database structure: add lastTryTime, ignoreDuration cols"));
|
||||
}
|
||||
if (columns.indexOf("renameTarget") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE blacklist ADD COLUMN renameTarget VARCHAR(4096);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateBlacklistTableStructure: Add renameTarget", query);
|
||||
sqlFail(QStringLiteral("updateBlacklistTableStructure: Add renameTarget"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add renameTarget col");
|
||||
commitInternal(QStringLiteral("update database structure: add renameTarget col"));
|
||||
}
|
||||
|
||||
if (columns.indexOf("errorCategory") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE blacklist ADD COLUMN errorCategory INTEGER(8);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateBlacklistTableStructure: Add errorCategory", query);
|
||||
sqlFail(QStringLiteral("updateBlacklistTableStructure: Add errorCategory"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add errorCategory col");
|
||||
commitInternal(QStringLiteral("update database structure: add errorCategory col"));
|
||||
}
|
||||
|
||||
if (columns.indexOf("requestId") == -1) {
|
||||
SqlQuery query(_db);
|
||||
query.prepare("ALTER TABLE blacklist ADD COLUMN requestId VARCHAR(36);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateBlacklistTableStructure: Add requestId", query);
|
||||
sqlFail(QStringLiteral("updateBlacklistTableStructure: Add requestId"), query);
|
||||
re = false;
|
||||
}
|
||||
commitInternal("update database structure: add errorCategory col");
|
||||
commitInternal(QStringLiteral("update database structure: add errorCategory col"));
|
||||
}
|
||||
|
||||
SqlQuery query(_db);
|
||||
query.prepare("CREATE INDEX IF NOT EXISTS blacklist_index ON blacklist(path collate nocase);");
|
||||
if (!query.exec()) {
|
||||
sqlFail("updateErrorBlacklistTableStructure: create index blacklit", query);
|
||||
sqlFail(QStringLiteral("updateErrorBlacklistTableStructure: create index blacklit"), query);
|
||||
re = false;
|
||||
}
|
||||
|
||||
@ -882,7 +881,7 @@ QVector<QByteArray> SyncJournalDb::tableColumns(const QByteArray &table)
|
||||
while (query.next().hasData) {
|
||||
columns.append(query.baValue(1));
|
||||
}
|
||||
qCDebug(lcDb) << "Columns in the current journal: " << columns;
|
||||
qCDebug(lcDb) << "Columns in the current journal:" << columns;
|
||||
return columns;
|
||||
}
|
||||
|
||||
@ -928,7 +927,7 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
|
||||
QByteArray fileId(record._fileId);
|
||||
if (fileId.isEmpty())
|
||||
fileId = "";
|
||||
QByteArray remotePerm = record._remotePerm.toString();
|
||||
QByteArray remotePerm = record._remotePerm.toDbValue();
|
||||
QByteArray checksumType, checksum;
|
||||
parseChecksumHeader(record._checksumHeader, &checksumType, &checksum);
|
||||
int contentChecksumTypeId = mapChecksumType(checksumType);
|
||||
@ -973,6 +972,7 @@ bool SyncJournalDb::setFileRecord(const SyncJournalFileRecord &_record)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: filename -> QBytearray?
|
||||
bool SyncJournalDb::deleteFileRecord(const QString &filename, bool recursively)
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
@ -1035,7 +1035,7 @@ bool SyncJournalDb::getFileRecord(const QByteArray &filename, SyncJournalFileRec
|
||||
auto next = _getFileRecordQuery.next();
|
||||
if (!next.ok) {
|
||||
QString err = _getFileRecordQuery.error();
|
||||
qCWarning(lcDb) << "No journal entry found for " << filename << "Error: " << err;
|
||||
qCWarning(lcDb) << "No journal entry found for" << filename << "Error:" << err;
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
@ -1243,7 +1243,7 @@ bool SyncJournalDb::listFilesInPath(const QByteArray& path,
|
||||
SyncJournalFileRecord rec;
|
||||
fillFileRecordFromGetQuery(rec, _listFilesInPathQuery);
|
||||
if (!rec._path.startsWith(path) || rec._path.indexOf("/", path.size() + 1) > 0) {
|
||||
qWarning(lcDb) << "hash collision " << path << rec._path;
|
||||
qWarning(lcDb) << "hash collision" << path << rec._path;
|
||||
continue;
|
||||
}
|
||||
rowCallback(rec);
|
||||
@ -1376,7 +1376,7 @@ static bool deleteBatch(SqlQuery &query, const QStringList &entries, const QStri
|
||||
if (entries.isEmpty())
|
||||
return true;
|
||||
|
||||
qCDebug(lcDb) << "Removing stale " << qPrintable(name) << " entries: " << entries.join(", ");
|
||||
qCDebug(lcDb) << "Removing stale" << name << "entries:" << entries.join(QStringLiteral(", "));
|
||||
// FIXME: Was ported from execBatch, check if correct!
|
||||
foreach (const QString &entry, entries) {
|
||||
query.reset_and_clear_bindings();
|
||||
@ -1473,7 +1473,7 @@ QVector<SyncJournalDb::DownloadInfo> SyncJournalDb::getAndDeleteStaleDownloadInf
|
||||
}
|
||||
}
|
||||
|
||||
if (!deleteBatch(_deleteDownloadInfoQuery, superfluousPaths, "downloadinfo"))
|
||||
if (!deleteBatch(_deleteDownloadInfoQuery, superfluousPaths, QStringLiteral("downloadinfo")))
|
||||
return empty_result;
|
||||
|
||||
return deleted_entries;
|
||||
@ -1488,7 +1488,7 @@ int SyncJournalDb::downloadInfoCount()
|
||||
SqlQuery query("SELECT count(*) FROM downloadinfo", _db);
|
||||
|
||||
if (!query.exec()) {
|
||||
sqlFail("Count number of downloadinfo entries failed", query);
|
||||
sqlFail(QStringLiteral("Count number of downloadinfo entries failed"), query);
|
||||
}
|
||||
if (query.next().hasData) {
|
||||
re = query.intValue(0);
|
||||
@ -1592,7 +1592,7 @@ QVector<uint> SyncJournalDb::deleteStaleUploadInfos(const QSet<QString> &keep)
|
||||
}
|
||||
}
|
||||
|
||||
deleteBatch(_deleteUploadInfoQuery, superfluousPaths, "uploadinfo");
|
||||
deleteBatch(_deleteUploadInfoQuery, superfluousPaths, QStringLiteral("uploadinfo"));
|
||||
return ids;
|
||||
}
|
||||
|
||||
@ -1653,7 +1653,7 @@ bool SyncJournalDb::deleteStaleErrorBlacklistEntries(const QSet<QString> &keep)
|
||||
|
||||
SqlQuery delQuery(_db);
|
||||
delQuery.prepare("DELETE FROM blacklist WHERE path = ?");
|
||||
return deleteBatch(delQuery, superfluousPaths, "blacklist");
|
||||
return deleteBatch(delQuery, superfluousPaths, QStringLiteral("blacklist"));
|
||||
}
|
||||
|
||||
void SyncJournalDb::deleteStaleFlagsEntries()
|
||||
@ -1675,7 +1675,7 @@ int SyncJournalDb::errorBlackListEntryCount()
|
||||
SqlQuery query("SELECT count(*) FROM blacklist", _db);
|
||||
|
||||
if (!query.exec()) {
|
||||
sqlFail("Count number of blacklist entries failed", query);
|
||||
sqlFail(QStringLiteral("Count number of blacklist entries failed"), query);
|
||||
}
|
||||
if (query.next().hasData) {
|
||||
re = query.intValue(0);
|
||||
@ -1693,7 +1693,7 @@ int SyncJournalDb::wipeErrorBlacklist()
|
||||
query.prepare("DELETE FROM blacklist");
|
||||
|
||||
if (!query.exec()) {
|
||||
sqlFail("Deletion of whole blacklist failed", query);
|
||||
sqlFail(QStringLiteral("Deletion of whole blacklist failed"), query);
|
||||
return -1;
|
||||
}
|
||||
return query.numRowsAffected();
|
||||
@ -1714,7 +1714,7 @@ void SyncJournalDb::wipeErrorBlacklistEntry(const QString &file)
|
||||
query.prepare("DELETE FROM blacklist WHERE path=?1");
|
||||
query.bindValue(1, file);
|
||||
if (!query.exec()) {
|
||||
sqlFail("Deletion of blacklist item failed.", query);
|
||||
sqlFail(QStringLiteral("Deletion of blacklist item failed."), query);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1728,7 +1728,7 @@ void SyncJournalDb::wipeErrorBlacklistCategory(SyncJournalErrorBlacklistRecord::
|
||||
query.prepare("DELETE FROM blacklist WHERE errorCategory=?1");
|
||||
query.bindValue(1, category);
|
||||
if (!query.exec()) {
|
||||
sqlFail("Deletion of blacklist category failed.", query);
|
||||
sqlFail(QStringLiteral("Deletion of blacklist category failed."), query);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1737,7 +1737,7 @@ void SyncJournalDb::setErrorBlacklistEntry(const SyncJournalErrorBlacklistRecord
|
||||
{
|
||||
QMutexLocker locker(&_mutex);
|
||||
|
||||
qCInfo(lcDb) << "Setting blacklist entry for " << item._file << item._retryCount
|
||||
qCInfo(lcDb) << "Setting blacklist entry for" << item._file << item._retryCount
|
||||
<< item._errorString << item._lastTryTime << item._ignoreDuration
|
||||
<< item._lastTryModtime << item._lastTryEtag << item._renameTarget
|
||||
<< item._errorCategory;
|
||||
@ -1883,7 +1883,7 @@ void SyncJournalDb::setSelectiveSyncList(SyncJournalDb::SelectiveSyncListType ty
|
||||
}
|
||||
}
|
||||
|
||||
commitInternal("setSelectiveSyncList");
|
||||
commitInternal(QStringLiteral("setSelectiveSyncList"));
|
||||
}
|
||||
|
||||
void SyncJournalDb::avoidRenamesOnNextSync(const QByteArray &path)
|
||||
@ -2349,7 +2349,7 @@ bool SyncJournalDb::isOpen()
|
||||
|
||||
void SyncJournalDb::commitInternal(const QString &context, bool startTrans)
|
||||
{
|
||||
qCDebug(lcDb) << "Transaction commit " << context << (startTrans ? "and starting new transaction" : "");
|
||||
qCDebug(lcDb) << "Transaction commit" << context << (startTrans ? "and starting new transaction" : "");
|
||||
commitTransaction();
|
||||
|
||||
if (startTrans) {
|
||||
|
||||
@ -97,7 +97,7 @@ QString Utility::formatFingerprint(const QByteArray &fmhash, bool colonSeparated
|
||||
|
||||
QString fp = QString::fromLatin1(hash.trimmed());
|
||||
if (colonSeparated) {
|
||||
fp.replace(QChar(' '), QChar(':'));
|
||||
fp.replace(QLatin1Char(' '), QLatin1Char(':'));
|
||||
}
|
||||
|
||||
return fp;
|
||||
@ -177,13 +177,14 @@ static QLatin1String platform()
|
||||
QByteArray Utility::userAgentString()
|
||||
{
|
||||
return QStringLiteral("Mozilla/5.0 (%1) mirall/%2 (%3, %4-%5 ClientArchitecture: %6 OsArchitecture: %7)")
|
||||
.arg(platform(),
|
||||
QLatin1String(MIRALL_VERSION_STRING),
|
||||
qApp->applicationName(),
|
||||
QSysInfo::productType(),
|
||||
QSysInfo::kernelVersion(),
|
||||
QSysInfo::buildCpuArchitecture(),
|
||||
QSysInfo::currentCpuArchitecture()).toLatin1();
|
||||
.arg(platform(),
|
||||
QStringLiteral(MIRALL_VERSION_STRING),
|
||||
qApp->applicationName(),
|
||||
QSysInfo::productType(),
|
||||
QSysInfo::kernelVersion(),
|
||||
QSysInfo::buildCpuArchitecture(),
|
||||
QSysInfo::currentCpuArchitecture())
|
||||
.toLatin1();
|
||||
}
|
||||
|
||||
QByteArray Utility::friendlyUserAgentString()
|
||||
@ -240,7 +241,7 @@ QString Utility::compactFormatDouble(double value, int prec, const QString &unit
|
||||
QLocale locale = QLocale::system();
|
||||
QChar decPoint = locale.decimalPoint();
|
||||
QString str = locale.toString(value, 'f', prec);
|
||||
while (str.endsWith('0') || str.endsWith(decPoint)) {
|
||||
while (str.endsWith(QLatin1Char('0')) || str.endsWith(decPoint)) {
|
||||
if (str.endsWith(decPoint)) {
|
||||
str.chop(1);
|
||||
break;
|
||||
@ -367,7 +368,7 @@ QString Utility::fileNameForGuiUse(const QString &fName)
|
||||
{
|
||||
if (isMac()) {
|
||||
QString n(fName);
|
||||
return n.replace(QChar(':'), QChar('/'));
|
||||
return n.replace(QLatin1Char(':'), QLatin1Char('/'));
|
||||
}
|
||||
return fName;
|
||||
}
|
||||
@ -445,12 +446,12 @@ QByteArray Utility::versionOfInstalledBinary(const QString &command)
|
||||
binary = qApp->arguments()[0];
|
||||
}
|
||||
QStringList params;
|
||||
params << QLatin1String("--version");
|
||||
params << QStringLiteral("--version");
|
||||
QProcess process;
|
||||
process.start(binary, params);
|
||||
process.waitForFinished(); // sets current thread to sleep and waits for pingProcess end
|
||||
re = process.readAllStandardOutput();
|
||||
int newline = re.indexOf(QChar('\n'));
|
||||
int newline = re.indexOf('\n');
|
||||
if (newline > 0) {
|
||||
re.truncate(newline);
|
||||
}
|
||||
@ -573,10 +574,10 @@ QUrl Utility::concatUrlPath(const QUrl &url, const QString &concatPath,
|
||||
QString path = url.path();
|
||||
if (!concatPath.isEmpty()) {
|
||||
// avoid '//'
|
||||
if (path.endsWith('/') && concatPath.startsWith('/')) {
|
||||
if (path.endsWith(QLatin1Char('/')) && concatPath.startsWith(QLatin1Char('/'))) {
|
||||
path.chop(1);
|
||||
} // avoid missing '/'
|
||||
else if (!path.endsWith('/') && !concatPath.startsWith('/')) {
|
||||
else if (!path.endsWith(QLatin1Char('/')) && !concatPath.startsWith(QLatin1Char('/'))) {
|
||||
path += QLatin1Char('/');
|
||||
}
|
||||
path += concatPath; // put the complete path together
|
||||
@ -593,9 +594,9 @@ QString Utility::makeConflictFileName(
|
||||
{
|
||||
QString conflictFileName(fn);
|
||||
// Add conflict tag before the extension.
|
||||
int dotLocation = conflictFileName.lastIndexOf('.');
|
||||
int dotLocation = conflictFileName.lastIndexOf(QLatin1Char('.'));
|
||||
// If no extension, add it at the end (take care of cases like foo/.hidden or foo.bar/file)
|
||||
if (dotLocation <= conflictFileName.lastIndexOf('/') + 1) {
|
||||
if (dotLocation <= conflictFileName.lastIndexOf(QLatin1Char('/')) + 1) {
|
||||
dotLocation = conflictFileName.size();
|
||||
}
|
||||
|
||||
@ -603,12 +604,10 @@ QString Utility::makeConflictFileName(
|
||||
if (!user.isEmpty()) {
|
||||
// Don't allow parens in the user name, to ensure
|
||||
// we can find the beginning and end of the conflict tag.
|
||||
const auto userName = sanitizeForFileName(user).replace('(', '_').replace(')', '_');
|
||||
conflictMarker.append(userName);
|
||||
conflictMarker.append(' ');
|
||||
const auto userName = sanitizeForFileName(user).replace(QLatin1Char('('), QLatin1Char('_')).replace(QLatin1Char(')'), QLatin1Char('_'));;
|
||||
conflictMarker += userName + QLatin1Char(' ');
|
||||
}
|
||||
conflictMarker.append(dt.toString("yyyy-MM-dd hhmmss"));
|
||||
conflictMarker.append(')');
|
||||
conflictMarker += dt.toString(QStringLiteral("yyyy-MM-dd hhmmss")) + QLatin1Char(')');
|
||||
|
||||
conflictFileName.insert(dotLocation, conflictMarker);
|
||||
return conflictFileName;
|
||||
@ -636,7 +635,7 @@ bool Utility::isConflictFile(const char *name)
|
||||
|
||||
bool Utility::isConflictFile(const QString &name)
|
||||
{
|
||||
auto bname = name.midRef(name.lastIndexOf('/') + 1);
|
||||
auto bname = name.midRef(name.lastIndexOf(QLatin1Char('/')) + 1);
|
||||
|
||||
if (bname.contains(QStringLiteral("_conflict-")))
|
||||
return true;
|
||||
|
||||
@ -92,7 +92,7 @@ void setLaunchOnStartup_private(const QString &appName, const QString &guiName,
|
||||
QString runPath = QLatin1String(runPathC);
|
||||
QSettings settings(runPath, QSettings::NativeFormat);
|
||||
if (enable) {
|
||||
settings.setValue(appName, QCoreApplication::applicationFilePath().replace('/', '\\'));
|
||||
settings.setValue(appName, QCoreApplication::applicationFilePath().replace(QLatin1Char('/'), QLatin1Char('\\')));
|
||||
} else {
|
||||
settings.remove(appName);
|
||||
}
|
||||
@ -172,7 +172,7 @@ QVariant Utility::registryGetKeyValue(HKEY hRootKey, const QString &subKey, cons
|
||||
// If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, the string may not have been stored with
|
||||
// the proper terminating null characters. Therefore, even if the function returns ERROR_SUCCESS,
|
||||
// the application should ensure that the string is properly terminated before using it; otherwise, it may overwrite a buffer.
|
||||
if (string.at(newCharSize - 1) == QChar('\0'))
|
||||
if (string.at(newCharSize - 1) == QLatin1Char('\0'))
|
||||
string.resize(newCharSize - 1);
|
||||
value = string;
|
||||
}
|
||||
|
||||
@ -50,11 +50,11 @@ QString Vfs::modeToString(Mode mode)
|
||||
Optional<Vfs::Mode> Vfs::modeFromString(const QString &str)
|
||||
{
|
||||
// Note: Strings are used for config and must be stable
|
||||
if (str == "off") {
|
||||
if (str == QLatin1String("off")) {
|
||||
return Off;
|
||||
} else if (str == "suffix") {
|
||||
} else if (str == QLatin1String("suffix")) {
|
||||
return WithSuffix;
|
||||
} else if (str == "wincfapi") {
|
||||
} else if (str == QLatin1String("wincfapi")) {
|
||||
return WindowsCfApi;
|
||||
}
|
||||
return {};
|
||||
@ -116,9 +116,9 @@ VfsOff::~VfsOff() = default;
|
||||
static QString modeToPluginName(Vfs::Mode mode)
|
||||
{
|
||||
if (mode == Vfs::WithSuffix)
|
||||
return "suffix";
|
||||
return QStringLiteral("suffix");
|
||||
if (mode == Vfs::WindowsCfApi)
|
||||
return "win";
|
||||
return QStringLiteral("win");
|
||||
return QString();
|
||||
}
|
||||
|
||||
@ -131,26 +131,26 @@ bool OCC::isVfsPluginAvailable(Vfs::Mode mode)
|
||||
auto name = modeToPluginName(mode);
|
||||
if (name.isEmpty())
|
||||
return false;
|
||||
auto pluginPath = pluginFileName("vfs", name);
|
||||
auto pluginPath = pluginFileName(QStringLiteral("vfs"), name);
|
||||
QPluginLoader loader(pluginPath);
|
||||
|
||||
auto basemeta = loader.metaData();
|
||||
if (basemeta.isEmpty() || !basemeta.contains("IID")) {
|
||||
if (basemeta.isEmpty() || !basemeta.contains(QStringLiteral("IID"))) {
|
||||
qCDebug(lcPlugin) << "Plugin doesn't exist" << loader.fileName();
|
||||
return false;
|
||||
}
|
||||
if (basemeta["IID"].toString() != "org.owncloud.PluginFactory") {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong IID" << loader.fileName() << basemeta["IID"];
|
||||
if (basemeta[QStringLiteral("IID")].toString() != QLatin1String("org.owncloud.PluginFactory")) {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong IID" << loader.fileName() << basemeta[QStringLiteral("IID")];
|
||||
return false;
|
||||
}
|
||||
|
||||
auto metadata = basemeta["MetaData"].toObject();
|
||||
if (metadata["type"].toString() != "vfs") {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong type" << loader.fileName() << metadata["type"];
|
||||
auto metadata = basemeta[QStringLiteral("MetaData")].toObject();
|
||||
if (metadata[QStringLiteral("type")].toString() != QLatin1String("vfs")) {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong type" << loader.fileName() << metadata[QStringLiteral("type")];
|
||||
return false;
|
||||
}
|
||||
if (metadata["version"].toString() != MIRALL_VERSION_STRING) {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong version" << loader.fileName() << metadata["version"];
|
||||
if (metadata[QStringLiteral("version")].toString() != QStringLiteral(MIRALL_VERSION_STRING)) {
|
||||
qCWarning(lcPlugin) << "Plugin has wrong version" << loader.fileName() << metadata[QStringLiteral("version")];
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -182,7 +182,7 @@ std::unique_ptr<Vfs> OCC::createVfsFromPlugin(Vfs::Mode mode)
|
||||
auto name = modeToPluginName(mode);
|
||||
if (name.isEmpty())
|
||||
return nullptr;
|
||||
auto pluginPath = pluginFileName("vfs", name);
|
||||
auto pluginPath = pluginFileName(QStringLiteral("vfs"), name);
|
||||
|
||||
if (!isVfsPluginAvailable(mode)) {
|
||||
qCCritical(lcPlugin) << "Could not load plugin: not existant or bad metadata" << pluginPath;
|
||||
|
||||
@ -1,5 +1,10 @@
|
||||
project(libcsync)
|
||||
set(CMAKE_AUTOMOC TRUE)
|
||||
add_definitions(-DQT_NO_CAST_TO_ASCII
|
||||
-DQT_NO_CAST_FROM_ASCII
|
||||
-DQT_NO_URL_CAST_FROM_STRING
|
||||
-DQT_NO_CAST_FROM_BYTEARRAY)
|
||||
|
||||
# global needed variables
|
||||
set(APPLICATION_NAME "ocsync")
|
||||
|
||||
|
||||
@ -96,16 +96,16 @@ OCSYNC_EXPORT bool csync_is_windows_reserved_word(const QStringRef &filename)
|
||||
size_t len_filename = filename.size();
|
||||
|
||||
// Drive letters
|
||||
if (len_filename == 2 && filename[1] == ':') {
|
||||
if (filename[0] >= 'a' && filename[0] <= 'z') {
|
||||
if (len_filename == 2 && filename.at(1) == QLatin1Char(':')) {
|
||||
if (filename.at(0) >= QLatin1Char('a') && filename.at(0) <= QLatin1Char('z')) {
|
||||
return true;
|
||||
}
|
||||
if (filename[0] >= 'A' && filename[0] <= 'Z') {
|
||||
if (filename.at(0) >= QLatin1Char('A') && filename.at(0) <= QLatin1Char('Z')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (len_filename == 3 || (len_filename > 3 && filename[3] == '.')) {
|
||||
if (len_filename == 3 || (len_filename > 3 && filename.at(3) == QLatin1Char('.'))) {
|
||||
for (const char *word : win_reserved_words_3) {
|
||||
if (filename.left(3).compare(QLatin1String(word), Qt::CaseInsensitive) == 0) {
|
||||
return true;
|
||||
@ -113,7 +113,7 @@ OCSYNC_EXPORT bool csync_is_windows_reserved_word(const QStringRef &filename)
|
||||
}
|
||||
}
|
||||
|
||||
if (len_filename == 4 || (len_filename > 4 && filename[4] == '.')) {
|
||||
if (len_filename == 4 || (len_filename > 4 && filename.at(4) == QLatin1Char('.'))) {
|
||||
for (const char *word : win_reserved_words_4) {
|
||||
if (filename.left(4).compare(QLatin1String(word), Qt::CaseInsensitive) == 0) {
|
||||
return true;
|
||||
@ -137,14 +137,14 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const QString &path, bool exclu
|
||||
|
||||
/* split up the path */
|
||||
QStringRef bname(&path);
|
||||
int lastSlash = path.lastIndexOf('/');
|
||||
int lastSlash = path.lastIndexOf(QLatin1Char('/'));
|
||||
if (lastSlash >= 0) {
|
||||
bname = path.midRef(lastSlash + 1);
|
||||
}
|
||||
|
||||
size_t blen = bname.size();
|
||||
// 9 = strlen(".sync_.db")
|
||||
if (blen >= 9 && bname[0] == '.') {
|
||||
if (blen >= 9 && bname.at(0) == QLatin1Char('.')) {
|
||||
if (bname.contains(QLatin1String(".db"))) {
|
||||
if (bname.startsWith(QLatin1String("._sync_"), Qt::CaseInsensitive) // "._sync_*.db*"
|
||||
|| bname.startsWith(QLatin1String(".sync_"), Qt::CaseInsensitive) // ".sync_*.db*"
|
||||
@ -170,10 +170,10 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const QString &path, bool exclu
|
||||
// as '.' is a separator that is not stored internally, so let's
|
||||
// not allow to sync those to avoid file loss/ambiguities (#416)
|
||||
if (blen > 1) {
|
||||
if (bname[blen-1]== ' ') {
|
||||
if (bname.at(blen - 1) == QLatin1Char(' ')) {
|
||||
match = CSYNC_FILE_EXCLUDE_TRAILING_SPACE;
|
||||
goto out;
|
||||
} else if (bname[blen-1]== '.' ) {
|
||||
} else if (bname.at(blen - 1) == QLatin1Char('.')) {
|
||||
match = CSYNC_FILE_EXCLUDE_INVALID_CHAR;
|
||||
goto out;
|
||||
}
|
||||
@ -226,7 +226,7 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(const QString &path, bool exclu
|
||||
return match;
|
||||
}
|
||||
|
||||
static QString leftIncludeLast(const QString &arr, char c)
|
||||
static QString leftIncludeLast(const QString &arr, const QChar &c)
|
||||
{
|
||||
// left up to and including `c`
|
||||
return arr.left(arr.lastIndexOf(c, arr.size() - 2) + 1);
|
||||
@ -238,7 +238,7 @@ ExcludedFiles::ExcludedFiles(const QString &localPath)
|
||||
: _localPath(localPath)
|
||||
, _clientVersion(MIRALL_VERSION_MAJOR, MIRALL_VERSION_MINOR, MIRALL_VERSION_PATCH)
|
||||
{
|
||||
Q_ASSERT(_localPath.endsWith("/"));
|
||||
Q_ASSERT(_localPath.endsWith(QStringLiteral("/")));
|
||||
// Windows used to use PathMatchSpec which allows *foo to match abc/deffoo.
|
||||
_wildcardsMatchSlash = Utility::isWindows();
|
||||
|
||||
@ -247,7 +247,7 @@ ExcludedFiles::ExcludedFiles(const QString &localPath)
|
||||
return;
|
||||
|
||||
// Load exclude file from base dir
|
||||
QFileInfo fi(_localPath + ".sync-exclude.lst");
|
||||
QFileInfo fi(_localPath + QStringLiteral(".sync-exclude.lst"));
|
||||
if (fi.isReadable())
|
||||
addInTreeExcludeFilePath(fi.absoluteFilePath());
|
||||
}
|
||||
@ -261,7 +261,7 @@ void ExcludedFiles::addExcludeFilePath(const QString &path)
|
||||
|
||||
void ExcludedFiles::addInTreeExcludeFilePath(const QString &path)
|
||||
{
|
||||
BasePathString basePath = leftIncludeLast(path, '/');
|
||||
BasePathString basePath = leftIncludeLast(path, QLatin1Char('/'));
|
||||
_excludeFiles[basePath].append(path);
|
||||
}
|
||||
|
||||
@ -280,9 +280,9 @@ void ExcludedFiles::addManualExclude(const QString &expr, const QString &basePat
|
||||
#if defined(Q_OS_WIN)
|
||||
Q_ASSERT(basePath.size() >= 2 && basePath.at(1) == ':');
|
||||
#else
|
||||
Q_ASSERT(basePath.startsWith('/'));
|
||||
Q_ASSERT(basePath.startsWith(QLatin1Char('/')));
|
||||
#endif
|
||||
Q_ASSERT(basePath.endsWith('/'));
|
||||
Q_ASSERT(basePath.endsWith(QLatin1Char('/')));
|
||||
|
||||
auto key = basePath;
|
||||
_manualExcludes[key].append(expr);
|
||||
@ -406,7 +406,7 @@ bool ExcludedFiles::isExcluded(
|
||||
// We do want to be able to sync with a hidden folder as the target.
|
||||
while (path.size() > basePath.size()) {
|
||||
QFileInfo fi(path);
|
||||
if (fi.fileName() != ".sync-exclude.lst"
|
||||
if (fi.fileName() != QStringLiteral(".sync-exclude.lst")
|
||||
&& (fi.isHidden() || fi.fileName().startsWith(QLatin1Char('.')))) {
|
||||
return true;
|
||||
}
|
||||
@ -452,14 +452,14 @@ CSYNC_EXCLUDE_TYPE ExcludedFiles::traversalPatternMatch(const QString &path, Ite
|
||||
// Check the bname part of the path to see whether the full
|
||||
// regex should be run.
|
||||
QStringRef bnameStr(&path);
|
||||
int lastSlash = path.lastIndexOf('/');
|
||||
int lastSlash = path.lastIndexOf(QLatin1Char('/'));
|
||||
if (lastSlash >= 0) {
|
||||
bnameStr = path.midRef(lastSlash + 1);
|
||||
}
|
||||
|
||||
QString basePath(_localPath + path);
|
||||
while (basePath.size() > _localPath.size()) {
|
||||
basePath = leftIncludeLast(basePath, '/');
|
||||
basePath = leftIncludeLast(basePath, QLatin1Char('/'));
|
||||
QRegularExpressionMatch m;
|
||||
if (filetype == ItemTypeDirectory
|
||||
&& _bnameTraversalRegexDir.contains(basePath)) {
|
||||
@ -483,7 +483,7 @@ CSYNC_EXCLUDE_TYPE ExcludedFiles::traversalPatternMatch(const QString &path, Ite
|
||||
// third capture: full path matching is triggered
|
||||
basePath = _localPath + path;
|
||||
while (basePath.size() > _localPath.size()) {
|
||||
basePath = leftIncludeLast(basePath, '/');
|
||||
basePath = leftIncludeLast(basePath, QLatin1Char('/'));
|
||||
QRegularExpressionMatch m;
|
||||
if (filetype == ItemTypeDirectory
|
||||
&& _fullTraversalRegexDir.contains(basePath)) {
|
||||
@ -517,12 +517,12 @@ CSYNC_EXCLUDE_TYPE ExcludedFiles::fullPatternMatch(const QString &p, ItemType fi
|
||||
// `path` seems to always be relative to `_localPath`, the tests however have not been
|
||||
// written that way... this makes the tests happy for now. TODO Fix the tests at some point
|
||||
QString path = p;
|
||||
if (path[0] == '/')
|
||||
if (path[0] == QLatin1Char('/'))
|
||||
path = path.mid(1);
|
||||
|
||||
QString basePath(_localPath + path);
|
||||
while (basePath.size() > _localPath.size()) {
|
||||
basePath = leftIncludeLast(basePath, '/');
|
||||
basePath = leftIncludeLast(basePath, QLatin1Char('/'));
|
||||
QRegularExpressionMatch m;
|
||||
if (filetype == ItemTypeDirectory
|
||||
&& _fullRegexDir.contains(basePath)) {
|
||||
@ -576,17 +576,17 @@ QString ExcludedFiles::convertToRegexpSyntax(QString exclude, bool wildcardsMatc
|
||||
case '*':
|
||||
flush();
|
||||
if (wildcardsMatchSlash) {
|
||||
regex.append(".*");
|
||||
regex.append(QLatin1String(".*"));
|
||||
} else {
|
||||
regex.append("[^/]*");
|
||||
regex.append(QLatin1String("[^/]*"));
|
||||
}
|
||||
break;
|
||||
case '?':
|
||||
flush();
|
||||
if (wildcardsMatchSlash) {
|
||||
regex.append(".");
|
||||
regex.append(QLatin1Char('.'));
|
||||
} else {
|
||||
regex.append("[^/]");
|
||||
regex.append(QStringLiteral("[^/]"));
|
||||
}
|
||||
break;
|
||||
case '[': {
|
||||
@ -594,19 +594,19 @@ QString ExcludedFiles::convertToRegexpSyntax(QString exclude, bool wildcardsMatc
|
||||
// Find the end of the bracket expression
|
||||
auto j = i + 1;
|
||||
for (; j < len; ++j) {
|
||||
if (exclude[j] == ']')
|
||||
if (exclude[j] == QLatin1Char(']'))
|
||||
break;
|
||||
if (j != len - 1 && exclude[j] == '\\' && exclude[j + 1] == ']')
|
||||
if (j != len - 1 && exclude[j] == QLatin1Char('\\') && exclude[j + 1] == QLatin1Char(']'))
|
||||
++j;
|
||||
}
|
||||
if (j == len) {
|
||||
// no matching ], just insert the escaped [
|
||||
regex.append("\\[");
|
||||
regex.append(QStringLiteral("\\["));
|
||||
break;
|
||||
}
|
||||
// Translate [! to [^
|
||||
QString bracketExpr = exclude.mid(i, j - i + 1);
|
||||
if (bracketExpr.startsWith("[!"))
|
||||
if (bracketExpr.startsWith(QLatin1String("[!")))
|
||||
bracketExpr[1] = '^';
|
||||
regex.append(bracketExpr);
|
||||
i = j;
|
||||
@ -615,7 +615,7 @@ QString ExcludedFiles::convertToRegexpSyntax(QString exclude, bool wildcardsMatc
|
||||
case '\\':
|
||||
flush();
|
||||
if (i == len - 1) {
|
||||
regex.append("\\\\");
|
||||
regex.append(QStringLiteral("\\\\"));
|
||||
break;
|
||||
}
|
||||
// '\*' -> '\*', but '\z' -> '\\z'
|
||||
@ -645,7 +645,7 @@ QString ExcludedFiles::extractBnameTrigger(const QString &exclude, bool wildcard
|
||||
{
|
||||
// We can definitely drop everything to the left of a / - that will never match
|
||||
// any bname.
|
||||
QString pattern = exclude.mid(exclude.lastIndexOf('/') + 1);
|
||||
QString pattern = exclude.mid(exclude.lastIndexOf(QLatin1Char('/')) + 1);
|
||||
|
||||
// Easy case, nothing else can match a slash, so that's it.
|
||||
if (!wildcardsMatchSlash)
|
||||
@ -672,7 +672,7 @@ QString ExcludedFiles::extractBnameTrigger(const QString &exclude, bool wildcard
|
||||
|
||||
// And if there was a wildcard, it starts with a *
|
||||
if (i >= 0)
|
||||
pattern.prepend('*');
|
||||
pattern.prepend(QLatin1Char('*'));
|
||||
|
||||
return pattern;
|
||||
}
|
||||
@ -733,25 +733,25 @@ void ExcludedFiles::prepare(const BasePathString & basePath)
|
||||
auto regexAppend = [](QString &fileDirPattern, QString &dirPattern, const QString &appendMe, bool dirOnly) {
|
||||
QString &pattern = dirOnly ? dirPattern : fileDirPattern;
|
||||
if (!pattern.isEmpty())
|
||||
pattern.append("|");
|
||||
pattern.append(QLatin1Char('|'));
|
||||
pattern.append(appendMe);
|
||||
};
|
||||
|
||||
for (auto exclude : _allExcludes.value(basePath)) {
|
||||
if (exclude[0] == '\n')
|
||||
if (exclude[0] == QLatin1Char('\n'))
|
||||
continue; // empty line
|
||||
if (exclude[0] == '\r')
|
||||
if (exclude[0] == QLatin1Char('\r'))
|
||||
continue; // empty line
|
||||
|
||||
bool matchDirOnly = exclude.endsWith('/');
|
||||
bool matchDirOnly = exclude.endsWith(QLatin1Char('/'));
|
||||
if (matchDirOnly)
|
||||
exclude = exclude.left(exclude.size() - 1);
|
||||
|
||||
bool removeExcluded = (exclude[0] == ']');
|
||||
bool removeExcluded = (exclude[0] == QLatin1Char(']'));
|
||||
if (removeExcluded)
|
||||
exclude = exclude.mid(1);
|
||||
|
||||
bool fullPath = exclude.contains('/');
|
||||
bool fullPath = exclude.contains(QLatin1Char('/'));
|
||||
|
||||
/* Use QRegularExpression, append to the right pattern */
|
||||
auto &bnameFileDir = removeExcluded ? bnameFileDirRemove : bnameFileDirKeep;
|
||||
@ -784,7 +784,7 @@ void ExcludedFiles::prepare(const BasePathString & basePath)
|
||||
// The empty pattern would match everything - change it to match-nothing
|
||||
auto emptyMatchNothing = [](QString &pattern) {
|
||||
if (pattern.isEmpty())
|
||||
pattern = "a^";
|
||||
pattern = QStringLiteral("a^");
|
||||
};
|
||||
emptyMatchNothing(fullFileDirKeep);
|
||||
emptyMatchNothing(fullFileDirRemove);
|
||||
@ -805,58 +805,58 @@ void ExcludedFiles::prepare(const BasePathString & basePath)
|
||||
// If the third group matches, the fullActivatedRegex needs to be applied
|
||||
// to the full path.
|
||||
_bnameTraversalRegexFile[basePath].setPattern(
|
||||
"^(?P<exclude>" + bnameFileDirKeep + ")$|"
|
||||
+ "^(?P<excluderemove>" + bnameFileDirRemove + ")$|"
|
||||
+ "^(?P<trigger>" + bnameTriggerFileDir + ")$");
|
||||
QStringLiteral("^(?P<exclude>%1)$|"
|
||||
"^(?P<excluderemove>%2)$|"
|
||||
"^(?P<trigger>%3)$")
|
||||
.arg(bnameFileDirKeep, bnameFileDirRemove, bnameTriggerFileDir));
|
||||
_bnameTraversalRegexDir[basePath].setPattern(
|
||||
"^(?P<exclude>" + bnameFileDirKeep + "|" + bnameDirKeep + ")$|"
|
||||
+ "^(?P<excluderemove>" + bnameFileDirRemove + "|" + bnameDirRemove + ")$|"
|
||||
+ "^(?P<trigger>" + bnameTriggerFileDir + "|" + bnameTriggerDir + ")$");
|
||||
QStringLiteral("^(?P<exclude>%1|%2)$|"
|
||||
"^(?P<excluderemove>%3|%4)$|"
|
||||
"^(?P<trigger>%5|%6)$")
|
||||
.arg(bnameFileDirKeep, bnameDirKeep, bnameFileDirRemove, bnameDirRemove, bnameTriggerFileDir, bnameTriggerDir));
|
||||
|
||||
// The full traveral regex is applied to the full path if the trigger capture of
|
||||
// the bname regex matches. Its basic form is (exclude)|(excluderemove)".
|
||||
// This pattern can be much simpler than fullRegex since we can assume a traversal
|
||||
// situation and doesn't need to look for bname patterns in parent paths.
|
||||
_fullTraversalRegexFile[basePath].setPattern(
|
||||
QLatin1String("")
|
||||
// Full patterns are anchored to the beginning
|
||||
+ "^(?P<exclude>" + fullFileDirKeep + ")(?:$|/)"
|
||||
+ "|"
|
||||
+ "^(?P<excluderemove>" + fullFileDirRemove + ")(?:$|/)");
|
||||
QStringLiteral("^(?P<exclude>%1)(?:$|/)"
|
||||
"|"
|
||||
"^(?P<excluderemove>%2)(?:$|/)")
|
||||
.arg(fullFileDirKeep, fullFileDirRemove));
|
||||
_fullTraversalRegexDir[basePath].setPattern(
|
||||
QLatin1String("")
|
||||
+ "^(?P<exclude>" + fullFileDirKeep + "|" + fullDirKeep + ")(?:$|/)"
|
||||
+ "|"
|
||||
+ "^(?P<excluderemove>" + fullFileDirRemove + "|" + fullDirRemove + ")(?:$|/)");
|
||||
QStringLiteral("^(?P<exclude>%1|%2)(?:$|/)"
|
||||
"|"
|
||||
"^(?P<excluderemove>%3|%4)(?:$|/)")
|
||||
.arg(fullFileDirKeep, fullDirKeep, fullFileDirRemove, fullDirRemove));
|
||||
|
||||
// The full regex is applied to the full path and incorporates both bname and
|
||||
// full-path patterns. It has the form "(exclude)|(excluderemove)".
|
||||
_fullRegexFile[basePath].setPattern(
|
||||
QLatin1String("(?P<exclude>")
|
||||
// Full patterns are anchored to the beginning
|
||||
+ "^(?:" + fullFileDirKeep + ")(?:$|/)" + "|"
|
||||
// Simple bname patterns can be any path component
|
||||
+ "(?:^|/)(?:" + bnameFileDirKeep + ")(?:$|/)" + "|"
|
||||
// When checking a file for exclusion we must check all parent paths
|
||||
// against the dir-only patterns as well.
|
||||
+ "(?:^|/)(?:" + bnameDirKeep + ")/"
|
||||
+ ")"
|
||||
+ "|"
|
||||
+ "(?P<excluderemove>"
|
||||
+ "^(?:" + fullFileDirRemove + ")(?:$|/)" + "|"
|
||||
+ "(?:^|/)(?:" + bnameFileDirRemove + ")(?:$|/)" + "|"
|
||||
+ "(?:^|/)(?:" + bnameDirRemove + ")/"
|
||||
+ ")");
|
||||
QStringLiteral("(?P<exclude>"
|
||||
// Full patterns are anchored to the beginning
|
||||
"^(?:%1)(?:$|/)|"
|
||||
// Simple bname patterns can be any path component
|
||||
"(?:^|/)(?:%2)(?:$|/)|"
|
||||
// When checking a file for exclusion we must check all parent paths
|
||||
// against the dir-only patterns as well.
|
||||
"(?:^|/)(?:%3)/)"
|
||||
"|"
|
||||
"(?P<excluderemove>"
|
||||
"^(?:%4)(?:$|/)|"
|
||||
"(?:^|/)(?:%5)(?:$|/)|"
|
||||
"(?:^|/)(?:%6)/)")
|
||||
.arg(fullFileDirKeep, bnameFileDirKeep, bnameDirKeep, fullFileDirRemove, bnameFileDirRemove, bnameDirRemove));
|
||||
_fullRegexDir[basePath].setPattern(
|
||||
QLatin1String("(?P<exclude>")
|
||||
+ "^(?:" + fullFileDirKeep + "|" + fullDirKeep + ")(?:$|/)" + "|"
|
||||
+ "(?:^|/)(?:" + bnameFileDirKeep + "|" + bnameDirKeep + ")(?:$|/)"
|
||||
+ ")"
|
||||
+ "|"
|
||||
+ "(?P<excluderemove>"
|
||||
+ "^(?:" + fullFileDirRemove + "|" + fullDirRemove + ")(?:$|/)" + "|"
|
||||
+ "(?:^|/)(?:" + bnameFileDirRemove + "|" + bnameDirRemove + ")(?:$|/)"
|
||||
+ ")");
|
||||
QStringLiteral("(?P<exclude>"
|
||||
"^(?:%1|%2)(?:$|/)|"
|
||||
"(?:^|/)(?:%3|%4)(?:$|/))"
|
||||
"|"
|
||||
"(?P<excluderemove>"
|
||||
"^(?:%5|%6)(?:$|/)|"
|
||||
"(?:^|/)(?:%7|%8)(?:$|/))")
|
||||
.arg(fullFileDirKeep, fullDirKeep, bnameFileDirKeep, bnameDirKeep, fullFileDirRemove, fullDirRemove, bnameFileDirRemove, bnameDirRemove));
|
||||
|
||||
QRegularExpression::PatternOptions patternOptions = QRegularExpression::NoPatternOption;
|
||||
if (OCC::Utility::fsCasePreserving())
|
||||
|
||||
@ -185,13 +185,13 @@ private:
|
||||
BasePathString(QString &&other)
|
||||
: QString(std::move(other))
|
||||
{
|
||||
Q_ASSERT(endsWith('/'));
|
||||
Q_ASSERT(endsWith(QLatin1Char('/')));
|
||||
}
|
||||
|
||||
BasePathString(const QString &other)
|
||||
: QString(other)
|
||||
{
|
||||
Q_ASSERT(endsWith('/'));
|
||||
Q_ASSERT(endsWith(QLatin1Char('/')));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ csync_vio_handle_t *csync_vio_local_opendir(const QString &name) {
|
||||
|
||||
auto dirname = QFile::encodeName(name);
|
||||
|
||||
handle->dh = _topendir( dirname );
|
||||
handle->dh = _topendir(dirname.constData());
|
||||
if (!handle->dh) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@ -137,7 +137,7 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h
|
||||
}
|
||||
}
|
||||
auto path = QString::fromWCharArray(handle->ffd.cFileName);
|
||||
if (path == "." || path == "..")
|
||||
if (path == QLatin1String(".") || path == QLatin1String(".."))
|
||||
return csync_vio_local_readdir(handle, vfs);
|
||||
|
||||
file_stat = std::make_unique<csync_file_stat_t>();
|
||||
|
||||
@ -32,56 +32,56 @@ static void check_long_win_path(void **state)
|
||||
(void) state; /* unused */
|
||||
|
||||
{
|
||||
const char *path = "C://DATA/FILES/MUSIC/MY_MUSIC.mp3"; // check a short path
|
||||
const char *exp_path = R"(\\?\C:\\DATA\FILES\MUSIC\MY_MUSIC.mp3)";
|
||||
QByteArray new_short = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(path, strlen(path)));
|
||||
assert_string_equal(new_short, exp_path);
|
||||
const auto path = QStringLiteral("C://DATA/FILES/MUSIC/MY_MUSIC.mp3"); // check a short path
|
||||
const auto exp_path = QStringLiteral(R"(\\?\C:\\DATA\FILES\MUSIC\MY_MUSIC.mp3)");
|
||||
QString new_short = OCC::FileSystem::pathtoUNC(path);
|
||||
assert_string_equal(new_short.constData(), exp_path.constData());
|
||||
}
|
||||
|
||||
{
|
||||
const char *path = R"(\\foo\bar/MY_MUSIC.mp3)";
|
||||
const char *exp_path = R"(\\foo\bar\MY_MUSIC.mp3)";
|
||||
QByteArray new_short = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(path, strlen(path)));
|
||||
assert_string_equal(new_short, exp_path);
|
||||
const auto path = QStringLiteral(R"(\\foo\bar/MY_MUSIC.mp3)");
|
||||
const auto exp_path = QStringLiteral(R"(\\foo\bar\MY_MUSIC.mp3)");
|
||||
QString new_short = OCC::FileSystem::pathtoUNC(path);
|
||||
assert_string_equal(new_short.constData(), exp_path.constData());
|
||||
}
|
||||
|
||||
{
|
||||
const char *path = R"(//foo\bar/MY_MUSIC.mp3)";
|
||||
const char *exp_path = R"(\\foo\bar\MY_MUSIC.mp3)";
|
||||
QByteArray new_short = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(path, strlen(path)));
|
||||
assert_string_equal(new_short, exp_path);
|
||||
const auto path = QStringLiteral(R"(//foo\bar/MY_MUSIC.mp3)");
|
||||
const auto exp_path = QStringLiteral(R"(\\foo\bar\MY_MUSIC.mp3)");
|
||||
QString new_short = OCC::FileSystem::pathtoUNC(path);
|
||||
assert_string_equal(new_short.constData(), exp_path.constData());
|
||||
}
|
||||
|
||||
{
|
||||
const char *path = "\\foo\\bar";
|
||||
const char *exp_path = R"(\\?\foo\bar)";
|
||||
QByteArray new_short = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(path, strlen(path)));
|
||||
assert_string_equal(new_short, exp_path);
|
||||
const auto path = QStringLiteral(R"(\foo\bar)");
|
||||
const auto exp_path = QStringLiteral(R"(\\?\foo\bar)");
|
||||
QString new_short = OCC::FileSystem::pathtoUNC(path);
|
||||
assert_string_equal(new_short.constData(), exp_path.constData());
|
||||
}
|
||||
|
||||
{
|
||||
const char *path = "/foo/bar";
|
||||
const char *exp_path = R"(\\?\foo\bar)";
|
||||
QByteArray new_short = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(path, strlen(path)));
|
||||
assert_string_equal(new_short, exp_path);
|
||||
const auto path = QStringLiteral("/foo/bar");
|
||||
const auto exp_path = QStringLiteral(R"(\\?\foo\bar)");
|
||||
QString new_short = OCC::FileSystem::pathtoUNC(path);
|
||||
assert_string_equal(new_short.constData(), exp_path.constData());
|
||||
}
|
||||
|
||||
const char *longPath = "D://alonglonglonglong/blonglonglonglong/clonglonglonglong/dlonglonglonglong/"
|
||||
"elonglonglonglong/flonglonglonglong/glonglonglonglong/hlonglonglonglong/ilonglonglonglong/"
|
||||
"jlonglonglonglong/klonglonglonglong/llonglonglonglong/mlonglonglonglong/nlonglonglonglong/"
|
||||
"olonglonglonglong/file.txt";
|
||||
const char *longPathConv = R"(\\?\D:\\alonglonglonglong\blonglonglonglong\clonglonglonglong\dlonglonglonglong\)"
|
||||
R"(elonglonglonglong\flonglonglonglong\glonglonglonglong\hlonglonglonglong\ilonglonglonglong\)"
|
||||
R"(jlonglonglonglong\klonglonglonglong\llonglonglonglong\mlonglonglonglong\nlonglonglonglong\)"
|
||||
R"(olonglonglonglong\file.txt)";
|
||||
const auto longPath = QStringLiteral("D://alonglonglonglong/blonglonglonglong/clonglonglonglong/dlonglonglonglong/"
|
||||
"elonglonglonglong/flonglonglonglong/glonglonglonglong/hlonglonglonglong/ilonglonglonglong/"
|
||||
"jlonglonglonglong/klonglonglonglong/llonglonglonglong/mlonglonglonglong/nlonglonglonglong/"
|
||||
"olonglonglonglong/file.txt");
|
||||
const auto longPathConv = QStringLiteral(R"(\\?\D:\\alonglonglonglong\blonglonglonglong\clonglonglonglong\dlonglonglonglong\)"
|
||||
R"(elonglonglonglong\flonglonglonglong\glonglonglonglong\hlonglonglonglong\ilonglonglonglong\)"
|
||||
R"(jlonglonglonglong\klonglonglonglong\llonglonglonglong\mlonglonglonglong\nlonglonglonglong\)"
|
||||
R"(olonglonglonglong\file.txt)");
|
||||
|
||||
QByteArray new_long = OCC::FileSystem::pathtoUNC(QByteArray::fromRawData(longPath, strlen(longPath)));
|
||||
// printf("XXXXXXXXXXXX %s %d\n", new_long, mem_reserved);
|
||||
QString new_long = OCC::FileSystem::pathtoUNC(longPath);
|
||||
// printf( "XXXXXXXXXXXX %s %d\n", new_long, mem_reserved);
|
||||
|
||||
assert_string_equal(new_long, longPathConv);
|
||||
assert_string_equal(new_long.constData(), longPathConv.constData());
|
||||
|
||||
// printf("YYYYYYYYYYYY %ld\n", strlen(new_long));
|
||||
assert_int_equal(strlen(new_long), 286);
|
||||
// printf( "YYYYYYYYYYYY %ld\n", strlen(new_long));
|
||||
assert_int_equal(new_long.length(), 286);
|
||||
}
|
||||
|
||||
int torture_run_tests(void)
|
||||
|
||||
@ -111,7 +111,7 @@ static int teardown(void **state) {
|
||||
static void create_dirs( const char *path )
|
||||
{
|
||||
int rc;
|
||||
auto _mypath = QStringLiteral("%1/%2").arg(CSYNC_TEST_DIR, path).toUtf8();
|
||||
auto _mypath = QStringLiteral("%1/%2").arg(CSYNC_TEST_DIR, QString::fromUtf8(path)).toUtf8();
|
||||
char *mypath = _mypath.data();
|
||||
|
||||
char *p = mypath + CSYNC_TEST_DIR.size() + 1; /* start behind the offset */
|
||||
@ -188,9 +188,9 @@ static void traverse_dir(void **state, const QString &dir, int *cnt)
|
||||
} else {
|
||||
*cnt = *cnt +1;
|
||||
}
|
||||
output(subdir_out);
|
||||
output(subdir_out.constData());
|
||||
if( is_dir ) {
|
||||
traverse_dir( state, subdir, cnt);
|
||||
traverse_dir(state, QString::fromUtf8(subdir), cnt);
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,9 +201,9 @@ static void traverse_dir(void **state, const QString &dir, int *cnt)
|
||||
|
||||
static void create_file( const char *path, const char *name, const char *content)
|
||||
{
|
||||
QFile file(QStringLiteral("%1/%2%3").arg(CSYNC_TEST_DIR, path, name));
|
||||
assert_int_equal(1, file.open(QIODevice::WriteOnly | QIODevice::NewOnly));
|
||||
file.write(content);
|
||||
QFile file(QStringLiteral("%1/%2%3").arg(CSYNC_TEST_DIR, QString::fromUtf8(path), QString::fromUtf8(name)));
|
||||
assert_int_equal(1, file.open(QIODevice::WriteOnly | QIODevice::NewOnly));
|
||||
file.write(content);
|
||||
}
|
||||
|
||||
static void check_readdir_shorttree(void **state)
|
||||
@ -216,12 +216,15 @@ static void check_readdir_shorttree(void **state)
|
||||
|
||||
traverse_dir(state, CSYNC_TEST_DIR, &files_cnt);
|
||||
|
||||
assert_string_equal( sv->result,
|
||||
QString::fromUtf8("<DIR> %1/alibaba"
|
||||
"<DIR> %1/alibaba/und"
|
||||
"<DIR> %1/alibaba/und/die"
|
||||
"<DIR> %1/alibaba/und/die/vierzig"
|
||||
"<DIR> %1/alibaba/und/die/vierzig/räuber").arg(CSYNC_TEST_DIR).toUtf8().constData() );
|
||||
assert_string_equal(sv->result.constData(),
|
||||
QString::fromUtf8("<DIR> %1/alibaba"
|
||||
"<DIR> %1/alibaba/und"
|
||||
"<DIR> %1/alibaba/und/die"
|
||||
"<DIR> %1/alibaba/und/die/vierzig"
|
||||
"<DIR> %1/alibaba/und/die/vierzig/räuber")
|
||||
.arg(CSYNC_TEST_DIR)
|
||||
.toUtf8()
|
||||
.constData());
|
||||
assert_int_equal(files_cnt, 0);
|
||||
}
|
||||
|
||||
@ -239,11 +242,14 @@ static void check_readdir_with_content(void **state)
|
||||
|
||||
traverse_dir(state, CSYNC_TEST_DIR, &files_cnt);
|
||||
|
||||
assert_string_equal( sv->result,
|
||||
QString::fromUtf8("<DIR> %1/warum"
|
||||
"<DIR> %1/warum/nur"
|
||||
"<DIR> %1/warum/nur/40"
|
||||
"<DIR> %1/warum/nur/40/Räuber").arg(CSYNC_TEST_DIR).toUtf8().constData());
|
||||
assert_string_equal(sv->result.constData(),
|
||||
QString::fromUtf8("<DIR> %1/warum"
|
||||
"<DIR> %1/warum/nur"
|
||||
"<DIR> %1/warum/nur/40"
|
||||
"<DIR> %1/warum/nur/40/Räuber")
|
||||
.arg(CSYNC_TEST_DIR)
|
||||
.toUtf8()
|
||||
.constData());
|
||||
/* " %1/warum/nur/40/Räuber/Räuber Max.txt"
|
||||
" %1/warum/nur/40/Räuber/пя́тница.txt"; */
|
||||
assert_int_equal(files_cnt, 2); /* Two files in the sub dir */
|
||||
@ -315,9 +321,7 @@ static void check_readdir_longtree(void **state)
|
||||
traverse_dir(state, CSYNC_TEST_DIR, &files_cnt);
|
||||
assert_int_equal(files_cnt, 0);
|
||||
/* and compare. */
|
||||
assert_string_equal( sv->result, result);
|
||||
|
||||
|
||||
assert_string_equal(sv->result.constData(), result.constData());
|
||||
}
|
||||
|
||||
// https://github.com/owncloud/client/issues/3128 https://github.com/owncloud/client/issues/2777
|
||||
@ -329,11 +333,11 @@ static void check_readdir_bigunicode(void **state)
|
||||
// 3: ? ASCII: 191 - BF
|
||||
// 4: ASCII: 32 - 20
|
||||
|
||||
QString p = QStringLiteral("%1/%2").arg(CSYNC_TEST_DIR, "goodone/" );
|
||||
QString p = QStringLiteral("%1/%2").arg(CSYNC_TEST_DIR, QStringLiteral("goodone/"));
|
||||
int rc = oc_mkdir(p);
|
||||
assert_int_equal(rc, 0);
|
||||
|
||||
p = QStringLiteral("%1/%2").arg(CSYNC_TEST_DIR, "goodone/ugly\xEF\xBB\xBF\x32" ".txt" ); // file with encoding error
|
||||
p = QStringLiteral("%1/goodone/ugly\xEF\xBB\xBF\x32.txt").arg(CSYNC_TEST_DIR); // file with encoding error
|
||||
|
||||
rc = oc_mkdir(p);
|
||||
|
||||
@ -341,10 +345,10 @@ static void check_readdir_bigunicode(void **state)
|
||||
|
||||
int files_cnt = 0;
|
||||
traverse_dir(state, CSYNC_TEST_DIR, &files_cnt);
|
||||
const auto expected_result = QString::fromUtf8("<DIR> %1/goodone"
|
||||
"<DIR> %1/goodone/ugly\xEF\xBB\xBF\x32" ".txt").arg(CSYNC_TEST_DIR)
|
||||
;
|
||||
assert_string_equal( sv->result, expected_result.toUtf8().constData());
|
||||
const auto expected_result = QStringLiteral("<DIR> %1/goodone"
|
||||
"<DIR> %1/goodone/ugly\xEF\xBB\xBF\x32.txt")
|
||||
.arg(CSYNC_TEST_DIR);
|
||||
assert_string_equal(sv->result.constData(), expected_result.toUtf8().constData());
|
||||
|
||||
assert_int_equal(files_cnt, 0);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user