nx_storage_sdk  1.0
Storage SDK
ftp_library.h
1 // Copyright 2018-present Network Optix, Inc. Licensed under MPL 2.0: www.mozilla.org/MPL/2.0/
2 
3 #ifndef __FTP_THIRD_PARTY_LIBRARY_H__
4 #define __FTP_THIRD_PARTY_LIBRARY_H__
5 
6 #include <vector>
7 #include <string>
8 #include <memory>
9 #include <stdexcept>
10 #include <cstdint>
11 #include <mutex>
12 #include "storage/third_party_storage.h"
13 #include "ftplib/ftplib.h"
14 
61 namespace nx_spl
62 {
63  namespace aux
64  { // Generic reference counter Mix-In. Private inherit it.
65  template <typename P>
67  {
68  public:
70  : m_count(1)
71  {}
72 
73  int p_addRef() const { return ++m_count; }
74 
75  int p_releaseRef() const
76  {
77  int new_count = --m_count;
78  if (new_count <= 0) {
79  delete static_cast<const P*>(this);
80  }
81  return new_count;
82  }
83  private:
84  mutable std::atomic<int> m_count;
85  }; // class PluginRefCounter
86 
88  {
89  public:
90  NonCopyable() {}
91  NonCopyable(const NonCopyable&);
92  NonCopyable& operator =(const NonCopyable&);
93 
95  NonCopyable& operator =(NonCopyable&&);
96  }; // class NonCopyable
97  } //namespace aux
98 
99  typedef std::shared_ptr<ftplib> implPtrType;
100  class FtpStorage;
101  // At construction phase we synchronise remote file with local one.
102  // During destruction synchronisation attempt is repeated.
103  // All intermediate actions (read/write/seek) are made with the local copy.
105  : public IODevice,
106  private aux::NonCopyable,
107  private aux::PluginRefCounter<FtpIODevice>
108  {
109  friend class aux::PluginRefCounter<FtpIODevice>;
110  public:
111  FtpIODevice(
112  const char *uri,
113  int mode,
114  const std::string &storageUrl,
115  const std::string &uname,
116  const std::string &upasswd
117  );
118 
119  virtual uint32_t STORAGE_METHOD_CALL write(
120  const void* src,
121  const uint32_t size,
122  int* ecode
123  ) override;
124 
125  virtual uint32_t STORAGE_METHOD_CALL read(
126  void* dst,
127  const uint32_t size,
128  int* ecode
129  ) const override;
130 
131  virtual int STORAGE_METHOD_CALL seek(
132  uint64_t pos,
133  int* ecode
134  ) override;
135 
136  virtual int STORAGE_METHOD_CALL getMode() const override;
137  virtual uint32_t STORAGE_METHOD_CALL size(int* ecode) const override;
138 
139  public: // plugin interface implementation
140  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
141 
142  virtual int addRef() const override;
143  virtual int releaseRef() const override;
144 
145  private:
146  // synchronize localfile with remote one
147  void flush();
148  // delete only via releaseRef()
149  ~FtpIODevice();
150 
151  private:
152  int m_mode;
153  mutable int64_t m_pos;
154  std::string m_uri; //file URI
155  implPtrType m_impl;
156  std::string m_localfile;
157  bool m_altered;
158  long long m_localsize;
159  mutable
160  std::mutex m_mutex;
161  std::string m_implurl;
162  std::string m_user;
163  std::string m_passwd;
164  }; // class FtpIODevice
165 
166  // Fileinfo list is obtained from the server at construction phase.
167  // After this phase there are no real interactions with FTP server.
169  : public FileInfoIterator,
170  private aux::NonCopyable,
171  private aux::PluginRefCounter<FtpFileInfoIterator>
172  {
174 
175  typedef std::vector<std::string> FileListType;
176  typedef FileListType::const_iterator FileListIteratorType;
177  public:
179  ftplib &impl,
180  FileListType &&fileList, // caller doesn't really need this list after Iterator is constructed
181  const std::string &baseDir
182  );
183 
184  virtual FileInfo* STORAGE_METHOD_CALL next(int* ecode) const override;
185 
186  public: // plugin interface implementation
187  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
188 
189  virtual int addRef() const override;
190  virtual int releaseRef() const override;
191 
192  private:
193  // In response to MLSD request list of structured file dsecription lines is returned.
194  // In this function we try to parse this line and get information we need.
195  int fileInfoFromMLSDString(
196  const char *mlsd, // In. Null-terminated.
197  FileInfo *fi, // Out
198  char *urlBuf // Out. Should be preallocated.
199  ) const;
200  // delete only with releaseRef()
202 
203  private:
204  mutable std::vector<char> m_urlData;
205  mutable FileInfo m_fileInfo;
206  ftplib& m_impl;
207  FileListType m_fileList;
208  mutable
209  FileListIteratorType m_curFile;
210  int m_basedirsize;
211  }; // class FtpFileListIterator
212 
214  : public Storage,
215  private aux::NonCopyable,
216  private aux::PluginRefCounter<FtpStorage>
217  {
218  friend class aux::PluginRefCounter<FtpStorage>;
219  // we need pointer because 'ftplib' default constructor can throw
220  // and we want to handle it explicitely.
221  public: // ctors, helper functions
222  FtpStorage(const std::string& url);
223  int getAvail() const {return m_available;}
224 
225  public: // Storage interface implementation
226  virtual int STORAGE_METHOD_CALL isAvailable() const override;
227 
228  virtual IODevice* STORAGE_METHOD_CALL open(
229  const char* uri,
230  int flags,
231  int* ecode
232  ) const override;
233 
234  virtual uint64_t STORAGE_METHOD_CALL getFreeSpace(int* ecode) const;
235  virtual uint64_t STORAGE_METHOD_CALL getTotalSpace(int* ecode) const;
236  virtual int STORAGE_METHOD_CALL getCapabilities() const;
237 
238  virtual void STORAGE_METHOD_CALL removeFile(
239  const char* url,
240  int* ecode
241  ) override;
242 
243  virtual void STORAGE_METHOD_CALL removeDir(
244  const char* url,
245  int* ecode
246  ) override;
247 
248  virtual void STORAGE_METHOD_CALL renameFile(
249  const char* oldUrl,
250  const char* newUrl,
251  int* ecode
252  ) override;
253 
254  virtual FileInfoIterator* STORAGE_METHOD_CALL getFileIterator(
255  const char* dirUrl,
256  int* ecode
257  ) const override;
258 
259  virtual int STORAGE_METHOD_CALL fileExists(
260  const char* url,
261  int* ecode
262  ) const override;
263 
264  virtual int STORAGE_METHOD_CALL dirExists(
265  const char* url,
266  int* ecode
267  ) const override;
268 
269  virtual uint64_t STORAGE_METHOD_CALL fileSize(
270  const char* url,
271  int* ecode
272  ) const override;
273 
274  public: // plugin interface implementation
275  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
276 
277  virtual int addRef() const override;
278  virtual int releaseRef() const override;
279 
280  private:
281  // destroy only via releaseRef()
282  ~FtpStorage();
283 
284  private:
285  implPtrType m_impl;
286  std::string m_implurl;
287  std::string m_user;
288  std::string m_passwd;
289  mutable std::mutex m_mutex;
290  mutable int m_available;
291  }; // class Ftpstorage
292 
294  : public StorageFactory,
295  private aux::NonCopyable,
296  private aux::PluginRefCounter<FtpStorageFactory>
297  {
299  public:
301  // currently unimplemented
302  virtual const char** STORAGE_METHOD_CALL findAvailable() const override;
303 
304  virtual Storage* STORAGE_METHOD_CALL createStorage(
305  const char* url,
306  int* ecode
307  ) override;
308 
309  virtual const char* STORAGE_METHOD_CALL storageType() const override;
310  virtual const char* lastErrorMessage(int ecode) const override;
311 
312  public: // plugin interface implementation
313  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
314 
315  virtual int addRef() const override;
316  virtual int releaseRef() const override;
317  }; // class FtpStorageFactory
318 } // namespace Qn
319 
320 #endif // __FTP_THIRD_PARTY_LIBRARY_H__
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:1331
Definition: ftp_library.h:66
Definition: ftp_library.h:168
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:965
virtual void STORAGE_METHOD_CALL renameFile(const char *oldUrl, const char *newUrl, int *ecode) override
Definition: ftp_library.cpp:787
File information iterator abstraction.
Definition: third_party_storage.h:138
virtual void STORAGE_METHOD_CALL removeDir(const char *url, int *ecode) override
Definition: ftp_library.cpp:774
Definition: ftp_library.h:293
Definition: ftp_library.h:104
Storage factory abstraction.
Definition: third_party_storage.h:273
virtual int STORAGE_METHOD_CALL isAvailable() const override
Definition: ftp_library.cpp:678
virtual IODevice *STORAGE_METHOD_CALL open(const char *uri, int flags, int *ecode) const override
Definition: ftp_library.cpp:904
virtual const char **STORAGE_METHOD_CALL findAvailable() const override
Definition: ftp_library.cpp:1011
virtual const char * lastErrorMessage(int ecode) const override
Definition: ftp_library.cpp:1067
virtual int STORAGE_METHOD_CALL seek(uint64_t pos, int *ecode) override
Definition: ftp_library.cpp:1267
Common file information.
Definition: third_party_storage.h:126
virtual Storage *STORAGE_METHOD_CALL createStorage(const char *url, int *ecode) override
Definition: ftp_library.cpp:1017
Storage plugin namespace.
Definition: ftp_library.cpp:27
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:634
Definition: ftplib.h:105
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:1006
virtual int STORAGE_METHOD_CALL dirExists(const char *url, int *ecode) const override
Definition: ftp_library.cpp:866
Definition: ftp_library.h:213
GUID of plugin interface.
Definition: plugin_api.h:26
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:982
Storage abstraction.
Definition: third_party_storage.h:155
virtual uint64_t STORAGE_METHOD_CALL getTotalSpace(int *ecode) const
Definition: ftp_library.cpp:706
virtual uint64_t STORAGE_METHOD_CALL getFreeSpace(int *ecode) const
Definition: ftp_library.cpp:695
virtual int STORAGE_METHOD_CALL fileExists(const char *url, int *ecode) const override
Definition: ftp_library.cpp:843
virtual FileInfo *STORAGE_METHOD_CALL next(int *ecode) const override
Definition: ftp_library.cpp:595
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:1307
virtual FileInfoIterator *STORAGE_METHOD_CALL getFileIterator(const char *dirUrl, int *ecode) const override
Definition: ftp_library.cpp:801
virtual const char *STORAGE_METHOD_CALL storageType() const override
Definition: ftp_library.cpp:1049
virtual uint32_t STORAGE_METHOD_CALL size(int *ecode) const override
Definition: ftp_library.cpp:1291
Definition: ftp_library.h:87
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:1001
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:946
virtual uint64_t STORAGE_METHOD_CALL fileSize(const char *url, int *ecode) const override
Definition: ftp_library.cpp:884
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:970
virtual void STORAGE_METHOD_CALL removeFile(const char *url, int *ecode) override
Definition: ftp_library.cpp:762
virtual int STORAGE_METHOD_CALL getMode() const override
Definition: ftp_library.cpp:1286
virtual int STORAGE_METHOD_CALL getCapabilities() const
Definition: ftp_library.cpp:717
virtual uint32_t STORAGE_METHOD_CALL read(void *dst, const uint32_t size, int *ecode) const override
Definition: ftp_library.cpp:1229
virtual uint32_t STORAGE_METHOD_CALL write(const void *src, const uint32_t size, int *ecode) override
Definition: ftp_library.cpp:1192
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:639
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:615
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:1326
IO device abstraction.
Definition: third_party_storage.h:73