diff options
author | Hannah von Reth <hannah.vonreth@owncloud.com> | 2021-02-12 15:06:13 +0300 |
---|---|---|
committer | Hannah von Reth <vonreth@kde.org> | 2021-02-12 16:59:06 +0300 |
commit | 483cffffc2416adb3c8443843094855507407ccb (patch) | |
tree | a8b1473725420e03b7dee9754b312245b05d8410 /src | |
parent | abb84cb2d0dd4d6262c1afff991c2baa5d5f13b9 (diff) |
Fix Windows long path issue introduced in dd641fae997d71c8396b77def2fa25ad96fdf47f
Diffstat (limited to 'src')
-rw-r--r-- | src/csync/vio/csync_vio_local_win.cpp | 30 | ||||
-rw-r--r-- | src/libsync/filesystem.cpp | 2 |
2 files changed, 10 insertions, 22 deletions
diff --git a/src/csync/vio/csync_vio_local_win.cpp b/src/csync/vio/csync_vio_local_win.cpp index befb92caf..26825d801 100644 --- a/src/csync/vio/csync_vio_local_win.cpp +++ b/src/csync/vio/csync_vio_local_win.cpp @@ -32,6 +32,7 @@ #include "csync_util.h" #include "vio/csync_vio_local.h" #include "common/filesystembase.h" +#include "common/utility.h" #include <QtCore/QLoggingCategory> @@ -50,8 +51,6 @@ struct csync_vio_handle_t { QString path; // Always ends with '\' }; -static int _csync_vio_local_stat_mb(const mbchar_t *uri, csync_file_stat_t *buf); - csync_vio_handle_t *csync_vio_local_opendir(const QString &name) { QScopedPointer<csync_vio_handle_t> handle(new csync_vio_handle_t{}); @@ -172,12 +171,9 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h file_stat->size = (handle->ffd.nFileSizeHigh * ((int64_t)(MAXDWORD)+1)) + handle->ffd.nFileSizeLow; file_stat->modtime = FileTimeToUnixTime(&handle->ffd.ftLastWriteTime, &rem); - std::wstring fullPath; - fullPath.reserve(handle->path.size() + std::wcslen(handle->ffd.cFileName)); - fullPath += handle->path.toStdWString(); // path always ends with '\', by construction - fullPath += handle->ffd.cFileName; + // path always ends with '\', by construction - if (_csync_vio_local_stat_mb(fullPath.data(), file_stat.get()) < 0) { + if (csync_vio_local_stat(handle->path + QString::fromWCharArray(handle->ffd.cFileName), file_stat.get()) < 0) { // Will get excluded by _csync_detect_update. file_stat->type = ItemTypeSkip; } @@ -185,16 +181,8 @@ std::unique_ptr<csync_file_stat_t> csync_vio_local_readdir(csync_vio_handle_t *h return file_stat; } - int csync_vio_local_stat(const QString &uri, csync_file_stat_t *buf) { - const std::wstring wuri = uri.toStdWString(); - int rc = _csync_vio_local_stat_mb(wuri.data(), buf); - return rc; -} - -static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf) -{ /* Almost nothing to do since csync_vio_local_readdir already filled up most of the information But we still need to fetch the file ID. Possible optimisation: only fetch the file id when we need it (for new files) @@ -204,19 +192,19 @@ static int _csync_vio_local_stat_mb(const mbchar_t *wuri, csync_file_stat_t *buf BY_HANDLE_FILE_INFORMATION fileInfo; ULARGE_INTEGER FileIndex; - h = CreateFileW( wuri, 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, - NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, - NULL ); + h = CreateFileW(reinterpret_cast<const wchar_t *>(OCC::FileSystem::longWinPath(uri).utf16()), 0, FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, + NULL); if( h == INVALID_HANDLE_VALUE ) { - qCCritical(lcCSyncVIOLocal, "CreateFileW failed on %ls", wuri); errno = GetLastError(); + qCCritical(lcCSyncVIOLocal) << "CreateFileW failed on" << uri << OCC::Utility::formatWinError(errno); return -1; } if(!GetFileInformationByHandle( h, &fileInfo ) ) { - qCCritical(lcCSyncVIOLocal, "GetFileInformationByHandle failed on %ls", wuri); errno = GetLastError(); + qCCritical(lcCSyncVIOLocal) << "GetFileInformationByHandle failed on" << uri << OCC::Utility::formatWinError(errno); CloseHandle(h); return -1; } diff --git a/src/libsync/filesystem.cpp b/src/libsync/filesystem.cpp index b9f6b0df3..a1cece063 100644 --- a/src/libsync/filesystem.cpp +++ b/src/libsync/filesystem.cpp @@ -124,7 +124,7 @@ static qint64 getSizeWithCsync(const QString &filename) if (csync_vio_local_stat(filename, &stat) != -1) { result = stat.size; } else { - qCWarning(lcFileSystem) << "Could not get size for" << filename << "with csync"; + qCWarning(lcFileSystem) << "Could not get size for" << filename << "with csync" << Utility::formatWinError(errno); } return result; } |