diff --git a/src/libs/utils/ssh/sftpchannel.cpp b/src/libs/utils/ssh/sftpchannel.cpp index 636ba1651bf..bde85b9ccc1 100644 --- a/src/libs/utils/ssh/sftpchannel.cpp +++ b/src/libs/utils/ssh/sftpchannel.cpp @@ -162,6 +162,12 @@ SftpJobId SftpChannel::renameFileOrDirectory(const QString &oldPath, new Internal::SftpRename(++d->m_nextJobId, oldPath, newPath))); } +SftpJobId SftpChannel::createLink(const QString &filePath, const QString &target) +{ + return d->createJob(Internal::SftpCreateLink::Ptr( + new Internal::SftpCreateLink(++d->m_nextJobId, filePath, target))); +} + SftpJobId SftpChannel::createFile(const QString &path, SftpOverwriteMode mode) { return d->createJob(Internal::SftpCreateFile::Ptr( @@ -451,6 +457,7 @@ void SftpChannelPrivate::handleStatus() case AbstractSftpOperation::Rm: case AbstractSftpOperation::Rename: case AbstractSftpOperation::CreateFile: + case AbstractSftpOperation::CreateLink: handleStatusGeneric(it, response); break; } diff --git a/src/libs/utils/ssh/sftpchannel.h b/src/libs/utils/ssh/sftpchannel.h index 5dff1f1ee93..dc2ec16c626 100644 --- a/src/libs/utils/ssh/sftpchannel.h +++ b/src/libs/utils/ssh/sftpchannel.h @@ -73,6 +73,7 @@ public: SftpJobId renameFileOrDirectory(const QString &oldPath, const QString &newPath); SftpJobId createFile(const QString &filePath, SftpOverwriteMode mode); + SftpJobId createLink(const QString &filePath, const QString &target); SftpJobId uploadFile(const QString &localFilePath, const QString &remoteFilePath, SftpOverwriteMode mode); SftpJobId downloadFile(const QString &remoteFilePath, diff --git a/src/libs/utils/ssh/sftpoperation.cpp b/src/libs/utils/ssh/sftpoperation.cpp index 6688e964cc2..c68e03d7025 100644 --- a/src/libs/utils/ssh/sftpoperation.cpp +++ b/src/libs/utils/ssh/sftpoperation.cpp @@ -90,6 +90,17 @@ SftpOutgoingPacket &SftpRename::initialPacket(SftpOutgoingPacket &packet) } +SftpCreateLink::SftpCreateLink(SftpJobId jobId, const QString &filePath, const QString &target) + : AbstractSftpOperation(jobId), filePath(filePath), target(target) +{ +} + +SftpOutgoingPacket &SftpCreateLink::initialPacket(SftpOutgoingPacket &packet) +{ + return packet.generateCreateLink(filePath, target, jobId); +} + + AbstractSftpOperationWithHandle::AbstractSftpOperationWithHandle(SftpJobId jobId, const QString &remotePath) : AbstractSftpOperation(jobId), diff --git a/src/libs/utils/ssh/sftpoperation_p.h b/src/libs/utils/ssh/sftpoperation_p.h index 0ad66a7daa1..a99ffdd5c26 100644 --- a/src/libs/utils/ssh/sftpoperation_p.h +++ b/src/libs/utils/ssh/sftpoperation_p.h @@ -53,7 +53,7 @@ struct AbstractSftpOperation { typedef QSharedPointer Ptr; enum Type { - ListDir, MakeDir, RmDir, Rm, Rename, CreateFile, Download, UploadFile + ListDir, MakeDir, RmDir, Rm, Rename, CreateLink, CreateFile, Download, UploadFile }; AbstractSftpOperation(SftpJobId jobId); @@ -117,6 +117,18 @@ struct SftpRename : public AbstractSftpOperation const QString newPath; }; +struct SftpCreateLink : public AbstractSftpOperation +{ + typedef QSharedPointer Ptr; + + SftpCreateLink(SftpJobId jobId, const QString &filePath, const QString &target); + virtual Type type() const { return CreateLink; } + virtual SftpOutgoingPacket &initialPacket(SftpOutgoingPacket &packet); + + const QString filePath; + const QString target; +}; + struct AbstractSftpOperationWithHandle : public AbstractSftpOperation { diff --git a/src/libs/utils/ssh/sftpoutgoingpacket.cpp b/src/libs/utils/ssh/sftpoutgoingpacket.cpp index 732ca78b6d9..da65fad3fd1 100644 --- a/src/libs/utils/ssh/sftpoutgoingpacket.cpp +++ b/src/libs/utils/ssh/sftpoutgoingpacket.cpp @@ -143,6 +143,12 @@ SftpOutgoingPacket &SftpOutgoingPacket::generateWriteFile(const QByteArray &hand .appendInt64(offset).appendString(data).finalize(); } +SftpOutgoingPacket &SftpOutgoingPacket::generateCreateLink(const QString &filePath, + const QString &target, quint32 requestId) +{ + return init(SSH_FXP_SYMLINK, requestId).appendString(filePath).appendString(target).finalize(); +} + SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFile(const QString &path, OpenType openType, SftpOverwriteMode mode, const QList &attributes, quint32 requestId) { diff --git a/src/libs/utils/ssh/sftpoutgoingpacket_p.h b/src/libs/utils/ssh/sftpoutgoingpacket_p.h index 3522b38e366..da76aaee945 100644 --- a/src/libs/utils/ssh/sftpoutgoingpacket_p.h +++ b/src/libs/utils/ssh/sftpoutgoingpacket_p.h @@ -64,6 +64,8 @@ public: quint32 requestId); SftpOutgoingPacket &generateWriteFile(const QByteArray &handle, quint64 offset, const QByteArray &data, quint32 requestId); + SftpOutgoingPacket &generateCreateLink(const QString &filePath, const QString &target, + quint32 requestId); static const quint32 DefaultPermissions;