File: cl_sftp.h

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (210 lines) | stat: -rw-r--r-- 6,137 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//
// copyright            : (C) 2013 by Eran Ifrah
// file name            : cl_sftp.h
//
// -------------------------------------------------------------------------
// A
//              _____           _      _     _ _
//             /  __ \         | |    | |   (_) |
//             | /  \/ ___   __| | ___| |    _| |_ ___
//             | |    / _ \ / _  |/ _ \ |   | | __/ _ )
//             | \__/\ (_) | (_| |  __/ |___| | ||  __/
//              \____/\___/ \__,_|\___\_____/_|\__\___|
//
//                                                  F i l e
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation; either version 2 of the License, or
//    (at your option) any later version.
//
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////

#ifndef CLSCP_H
#define CLSCP_H

#if USE_SFTP

#include "cl_exception.h"
#include "cl_sftp_attribute.h"
#include "cl_ssh.h"
#include "codelite_exports.h"
#include "ssh_account_info.h"
#include <memory>
#include <wx/buffer.h>
#include <wx/filename.h>

// We do it this way to avoid exposing the include to <libssh/sftp.h> to files including this header
struct sftp_session_struct;
typedef struct sftp_session_struct* SFTPSession_t;

class WXDLLIMPEXP_CL clSFTP
{
    clSSH::Ptr_t m_ssh;
    SFTPSession_t m_sftp;
    bool m_connected;
    wxString m_currentFolder;
    wxString m_account;

public:
    typedef std::shared_ptr<clSFTP> Ptr_t;
    enum {
        SFTP_BROWSE_FILES = 0x00000001,
        SFTP_BROWSE_FOLDERS = 0x00000002,
    };

protected:
    wxString GetErrorString() const;
    wxString ExecuteCommand(const wxString& command);

public:
    clSFTP(clSSH::Ptr_t ssh);
    virtual ~clSFTP();

    /**
     * @brief return the default download folder
     */
    static wxString GetDefaultDownloadFolder(const SSHAccountInfo& accountInfo);

    /**
     * @brief given a remote file path, return the path to the local
     * file used by SFTP
     */
    static wxFileName GetLocalFileName(const SSHAccountInfo& accountInfo, const wxString& remotePath,
                                       bool mkdirRecrusive = false);

    /**
     * @brief return the underlying ssh session
     */
    clSSH::Ptr_t GetSsh() const { return m_ssh; }

    bool IsConnected() const { return m_connected; }

    void SetAccount(const wxString& account) { this->m_account = account; }
    const wxString& GetAccount() const { return m_account; }
    /**
     * @brief intialize the scp over ssh
     */
    void Initialize();

    /**
     * @brief close the scp channel
     */
    void Close();

    /**
     * @brief return checksum of a remote file
     * @throws clException
     */
    bool GetChecksum(const wxString& remoteFile, size_t* checksum);

    /**
     * @brief write the content of local file into a remote file
     * @param localFile the local file
     * @param remotePath the remote path (abs path)
     */
    void Write(const wxFileName& localFile, const wxString& remotePath);

    /**
     * @brief write the content of 'fileContent' into the remote file represented by remotePath
     */
    void Write(const wxMemoryBuffer& fileContent, const wxString& remotePath);

    /**
     * @brief create an empty remote file
     */
    void CreateEmptyFile(const wxString& remotePath);

    /**
     * @brief read remote file and return its content
     * @return the file content + the file attributes
     */
    SFTPAttribute::Ptr_t Read(const wxString& remotePath, wxMemoryBuffer& buffer);

    /**
     * @brief list the content of a folder
     * @param folder
     * @param foldersOnly
     * @param filter filter out files that do not match the filter
     * @throw clException incase an error occurred
     */
    SFTPAttribute::List_t List(const wxString& folder, size_t flags, const wxString& filter = "");

    /**
     * @brief create a directory
     * @param dirname
     */
    void CreateDir(const wxString& dirname);

    /**
     * @brief create a file. This function also creates the path to the file (by calling internally to Mkpath)
     */
    void CreateRemoteFile(const wxString& remoteFullPath, const wxString& content);

    /**
     * @brief this version create a copy of the local file on the remote server. Similar to the previous
     * version, it also creates the path to the file if needed
     */
    void CreateRemoteFile(const wxString& remoteFullPath, const wxFileName& localFile);

    /**
     * @brief create path . If the directory does not exist, create it (all sub paths if needed)
     */
    void Mkpath(const wxString& remoteDirFullpath);

    /**
     * @brief Remove a directoy.
     * @param dirname
     */
    void RemoveDir(const wxString& dirname);

    /**
     * @brief Unlink (delete) a file.
     * @param dirname
     */
    void UnlinkFile(const wxString& path);

    /**
     * @brief Rename or move a file or directory
     * @param oldpath
     * @param newpath
     */
    void Rename(const wxString& oldpath, const wxString& newpath);
    /**
     * @brief cd up and list the content of the directory
     * @return
     */
    SFTPAttribute::List_t CdUp(size_t flags, const wxString& filter);

    /**
     * @brief stat the path
     */
    SFTPAttribute::Ptr_t Stat(const wxString& path);

    /**
     * @brief change remote file permissions
     */
    void Chmod(const wxString& remotePath, size_t permissions);

    /**
     * @brief change remote directory
     * @param remotePath
     */
    SFTPAttribute::List_t Chdir(const wxString& remotePath);

    /**
     * @brief return the current folder
     */
    const wxString& GetCurrentFolder() const { return m_currentFolder; }

    /**
     * @brief send keep alive message
     */
    void SendKeepAlive();
};

#endif // USE_SFTP
#endif // CLSCP_H