diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ include(FeatureSummary) -set(QT_MIN_VERSION "5.8.0") +set(QT_MIN_VERSION "5.10.0") set(KF5_MIN_VERSION "5.48.0") find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS DBus Network Widgets Svg) @@ -161,8 +161,7 @@ endif() add_subdirectory( thumbnail ) add_subdirectory( docfilter ) -if (libssh_FOUND AND HAVE_UTIME_H) - # does not compile on Windows: kio_sftp.cpp(28): fatal error C1083: Cannot open include file: 'utime.h': No such file or directory +if (libssh_FOUND) add_subdirectory(sftp) endif () add_subdirectory(settings) diff --git a/sftp/kio_sftp.cpp b/sftp/kio_sftp.cpp --- a/sftp/kio_sftp.cpp +++ b/sftp/kio_sftp.cpp @@ -26,14 +26,14 @@ #include "kio_sftp_trace_debug.h" #include #include -#include #include #include #include #include #include #include +#include #include #include @@ -51,6 +51,10 @@ #define KSFTP_ISDIR(sb) (sb->type == SSH_FILEXFER_TYPE_DIRECTORY) using namespace KIO; +#ifdef Q_OS_WIN +#include // for permissions +using namespace std::experimental::filesystem; +#endif extern "C" { int Q_DECL_EXPORT kdemain( int argc, char **argv ) @@ -379,7 +383,11 @@ if (isBrokenLink) { // It is a link pointing to nowhere fileType = S_IFMT - 1; +#ifdef Q_OS_WIN + access = (mode_t)perms::owner_all | (mode_t)perms::group_all | (mode_t)perms::others_all; +#else access = S_IRWXU | S_IRWXG | S_IRWXO; +#endif size = 0LL; } else { switch (sb->type) { @@ -390,7 +398,11 @@ fileType = S_IFDIR; break; case SSH_FILEXFER_TYPE_SYMLINK: +#ifdef Q_OS_WIN + // TODO ADD CODE FOR HANDLING FILETYPE - SYMLINK IN WIN +#else fileType = S_IFLNK; +#endif break; case SSH_FILEXFER_TYPE_SPECIAL: case SSH_FILEXFER_TYPE_UNKNOWN: @@ -1751,7 +1763,11 @@ mode_t initialMode; if (permissions != -1) { +#ifdef Q_OS_WIN + initialMode = permissions | (mode_t)perms::owner_write | (mode_t)perms::owner_read ; +#else initialMode = permissions | S_IWUSR | S_IRUSR; +#endif } else { initialMode = 0644; } @@ -1924,9 +1940,9 @@ // check if destination is ok ... QT_STATBUF buff; const bool bDestExists = (QT_STAT(QFile::encodeName(sCopyFile), &buff) != -1); - + QFileInfo info(sCopyFile); if(bDestExists) { - if(S_ISDIR(buff.st_mode)) { + if(info.isDir()) { errorCode = ERR_IS_DIRECTORY; return sftpProtocol::ClientError; } @@ -1944,7 +1960,7 @@ const QString dest = (bMarkPartial ? sPart : sCopyFile); if (bMarkPartial && bPartExists && buff.st_size > 0) { - if (S_ISDIR(buff.st_mode)) { + if(info.isDir()) { errorCode = ERR_DIR_ALREADY_EXIST; return sftpProtocol::ClientError; // client side error } @@ -1958,7 +1974,11 @@ // otherwise we can be in for a surprise on NFS. mode_t initialMode; if (permissions != -1) +#ifdef Q_OS_WIN + initialMode = permissions | (mode_t)perms::owner_write; +#else initialMode = permissions | S_IWUSR; +#endif else initialMode = 0666; @@ -2015,10 +2035,18 @@ if (!mtimeStr.isEmpty()) { QDateTime dt = QDateTime::fromString(mtimeStr, Qt::ISODate); if (dt.isValid()) { - struct utimbuf utbuf; - utbuf.actime = buff.st_atime; // access time, unchanged - utbuf.modtime = dt.toTime_t(); // modification time - utime(QFile::encodeName(sCopyFile), &utbuf); + QFile receivedFile(sCopyFile); + if (!receivedFile.exists()) { + if (!receivedFile.open(QIODevice::ReadWrite | QIODevice::Text)) { + QString error_msg = receivedFile.errorString(); + } + else { + receivedFile.open(QIODevice::ReadWrite | QIODevice::Text); + receivedFile.setFileTime(QDateTime::fromTime_t(buff.st_atime), + QFileDevice::FileTime(QFileDevice::FileAccessTime)); + receivedFile.setFileTime(dt, QFileDevice::FileTime(QFileDevice::FileModificationTime)); + } + } } } @@ -2032,9 +2060,9 @@ // check if source is ok ... QT_STATBUF buff; bool bSrcExists = (QT_STAT(QFile::encodeName(sCopyFile), &buff) != -1); - + QFileInfo info(sCopyFile); if (bSrcExists) { - if (S_ISDIR(buff.st_mode)) { + if(info.isDir()) { errorCode = ERR_IS_DIRECTORY; return sftpProtocol::ClientError; } @@ -2210,7 +2238,11 @@ if (isBrokenLink) { // It is a link pointing to nowhere fileType = S_IFMT - 1; +#ifdef Q_OS_WIN + access = (mode_t)perms::owner_all | (mode_t)perms::group_all | (mode_t)perms::others_all; +#else access = S_IRWXU | S_IRWXG | S_IRWXO; +#endif size = 0LL; } else { switch (dirent->type) { @@ -2221,7 +2253,11 @@ fileType = S_IFDIR; break; case SSH_FILEXFER_TYPE_SYMLINK: +#ifdef Q_OS_WIN + // TODO ADD CODE FOR HANDLING FILETYPE - SYMLINK IN WIN +#else fileType = S_IFLNK; +#endif break; case SSH_FILEXFER_TYPE_SPECIAL: case SSH_FILEXFER_TYPE_UNKNOWN: