1 /**************************************************************************
3 ** This file is part of Qt Creator
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights. These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
32 **************************************************************************/
34 #include "sftpoutgoingpacket_p.h"
36 #include "sshpacket_p.h"
38 #include <QtCore/QtEndian>
44 const quint32 DefaultAttributes = 0;
45 const quint32 SSH_FXF_READ = 0x00000001;
46 const quint32 SSH_FXF_WRITE = 0x00000002;
47 const quint32 SSH_FXF_APPEND = 0x00000004;
48 const quint32 SSH_FXF_CREAT = 0x00000008;
49 const quint32 SSH_FXF_TRUNC = 0x00000010;
50 const quint32 SSH_FXF_EXCL = 0x00000020;
53 SftpOutgoingPacket::SftpOutgoingPacket()
57 SftpOutgoingPacket &SftpOutgoingPacket::generateInit(quint32 version)
59 return init(SSH_FXP_INIT, 0).appendInt(version).finalize();
62 SftpOutgoingPacket &SftpOutgoingPacket::generateOpenDir(const QString &path,
65 return init(SSH_FXP_OPENDIR, requestId).appendString(path).finalize();
68 SftpOutgoingPacket &SftpOutgoingPacket::generateReadDir(const QByteArray &handle,
71 return init(SSH_FXP_READDIR, requestId).appendString(handle).finalize();
74 SftpOutgoingPacket &SftpOutgoingPacket::generateCloseHandle(const QByteArray &handle,
77 return init(SSH_FXP_CLOSE, requestId).appendString(handle).finalize();
80 SftpOutgoingPacket &SftpOutgoingPacket::generateMkDir(const QString &path,
83 return init(SSH_FXP_MKDIR, requestId).appendString(path)
84 .appendInt(DefaultAttributes).finalize();
87 SftpOutgoingPacket &SftpOutgoingPacket::generateRmDir(const QString &path,
90 return init(SSH_FXP_RMDIR, requestId).appendString(path).finalize();
93 SftpOutgoingPacket &SftpOutgoingPacket::generateRm(const QString &path,
96 return init(SSH_FXP_REMOVE, requestId).appendString(path).finalize();
99 SftpOutgoingPacket &SftpOutgoingPacket::generateRename(const QString &oldPath,
100 const QString &newPath, quint32 requestId)
102 return init(SSH_FXP_RENAME, requestId).appendString(oldPath)
103 .appendString(newPath).finalize();
106 SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForWriting(const QString &path,
107 SftpOverwriteMode mode, quint32 requestId)
109 return generateOpenFile(path, Write, mode, requestId);
112 SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFileForReading(const QString &path,
115 // Note: Overwrite mode is irrelevant and will be ignored.
116 return generateOpenFile(path, Read, SftpSkipExisting, requestId);
119 SftpOutgoingPacket &SftpOutgoingPacket::generateReadFile(const QByteArray &handle,
120 quint64 offset, quint32 length, quint32 requestId)
122 return init(SSH_FXP_READ, requestId).appendString(handle).appendInt64(offset)
123 .appendInt(length).finalize();
126 SftpOutgoingPacket &SftpOutgoingPacket::generateFstat(const QByteArray &handle,
129 return init(SSH_FXP_FSTAT, requestId).appendString(handle).finalize();
132 SftpOutgoingPacket &SftpOutgoingPacket::generateWriteFile(const QByteArray &handle,
133 quint64 offset, const QByteArray &data, quint32 requestId)
135 return init(SSH_FXP_WRITE, requestId).appendString(handle)
136 .appendInt64(offset).appendString(data).finalize();
139 SftpOutgoingPacket &SftpOutgoingPacket::generateOpenFile(const QString &path,
140 OpenType openType, SftpOverwriteMode mode, quint32 requestId)
145 pFlags = SSH_FXF_READ;
148 pFlags = SSH_FXF_WRITE | SSH_FXF_CREAT;
150 case SftpOverwriteExisting: pFlags |= SSH_FXF_TRUNC; break;
151 case SftpAppendToExisting: pFlags |= SSH_FXF_APPEND; break;
152 case SftpSkipExisting: pFlags |= SSH_FXF_EXCL; break;
156 return init(SSH_FXP_OPEN, requestId).appendString(path).appendInt(pFlags)
157 .appendInt(DefaultAttributes).finalize();
160 SftpOutgoingPacket &SftpOutgoingPacket::init(SftpPacketType type,
163 m_data.resize(TypeOffset + 1);
164 m_data[TypeOffset] = type;
165 if (type != SSH_FXP_INIT) {
166 appendInt(requestId);
167 #ifdef CREATOR_SSH_DEBUG
168 qDebug("Generating SFTP packet of type %d with request id %u", type,
175 SftpOutgoingPacket &SftpOutgoingPacket::appendInt(quint32 val)
177 m_data.append(AbstractSshPacket::encodeInt(val));
181 SftpOutgoingPacket &SftpOutgoingPacket::appendInt64(quint64 value)
183 m_data.append(AbstractSshPacket::encodeInt(value));
187 SftpOutgoingPacket &SftpOutgoingPacket::appendString(const QString &string)
189 m_data.append(AbstractSshPacket::encodeString(string.toUtf8()));
193 SftpOutgoingPacket &SftpOutgoingPacket::appendString(const QByteArray &string)
195 m_data += AbstractSshPacket::encodeString(string);
199 SftpOutgoingPacket &SftpOutgoingPacket::finalize()
201 AbstractSshPacket::setLengthField(m_data);
205 } // namespace Internal