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 <stdint.h>
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 
104  {
105  std::string name;
106  std::string fullPath;
107  };
108 
109  } //namespace aux
110 
111  typedef std::shared_ptr<ftplib> implPtrType;
112  class FtpStorage;
113  // At construction phase we synchronise remote file with local one.
114  // During destruction synchronisation attempt is repeated.
115  // All intermediate actions (read/write/seek) are made with the local copy.
117  : public IODevice,
118  private aux::NonCopyable,
119  private aux::PluginRefCounter<FtpIODevice>
120  {
121  friend class aux::PluginRefCounter<FtpIODevice>;
122  public:
123  FtpIODevice(
124  const char *uri,
125  int mode,
126  const std::string &storageUrl,
127  const std::string &uname,
128  const std::string &upasswd
129  );
130 
131  virtual uint32_t STORAGE_METHOD_CALL write(
132  const void* src,
133  const uint32_t size,
134  int* ecode
135  ) override;
136 
137  virtual uint32_t STORAGE_METHOD_CALL read(
138  void* dst,
139  const uint32_t size,
140  int* ecode
141  ) const override;
142 
143  virtual int STORAGE_METHOD_CALL seek(
144  uint64_t pos,
145  int* ecode
146  ) override;
147 
148  virtual int STORAGE_METHOD_CALL getMode() const override;
149  virtual uint32_t STORAGE_METHOD_CALL size(int* ecode) const override;
150 
151  public: // plugin interface implementation
152  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
153 
154  virtual int addRef() const override;
155  virtual int releaseRef() const override;
156 
157  private:
158  // synchronize localfile with remote one
159  void flush();
160  // delete only via releaseRef()
161  ~FtpIODevice();
162 
163  private:
164  int m_mode;
165  mutable int64_t m_pos;
166  std::string m_uri; //file URI
167  implPtrType m_impl;
168  aux::FileNameAndPath m_localfile;
169  bool m_altered;
170  long long m_localsize;
171  mutable
172  std::mutex m_mutex;
173  std::string m_implurl;
174  std::string m_user;
175  std::string m_passwd;
176  }; // class FtpIODevice
177 
178  // Fileinfo list is obtained from the server at construction phase.
179  // After this phase there are no real interactions with FTP server.
181  : public FileInfoIterator,
182  private aux::NonCopyable,
183  private aux::PluginRefCounter<FtpFileInfoIterator>
184  {
186 
187  typedef std::vector<std::string> FileListType;
188  typedef FileListType::const_iterator FileListIteratorType;
189  public:
191  ftplib &impl,
192  FileListType &&fileList, // caller doesn't really need this list after Iterator is constructed
193  const std::string &baseDir
194  );
195 
196  virtual FileInfo* STORAGE_METHOD_CALL next(int* ecode) const override;
197 
198  public: // plugin interface implementation
199  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
200 
201  virtual int addRef() const override;
202  virtual int releaseRef() const override;
203 
204  private:
205  // In response to MLSD request list of structured file dsecription lines is returned.
206  // In this function we try to parse this line and get information we need.
207  int fileInfoFromMLSDString(
208  const char *mlsd, // In. Null-terminated.
209  FileInfo *fi, // Out
210  char *urlBuf // Out. Should be preallocated.
211  ) const;
212  // delete only with releaseRef()
214 
215  private:
216  mutable std::vector<char> m_urlData;
217  mutable FileInfo m_fileInfo;
218  ftplib& m_impl;
219  FileListType m_fileList;
220  mutable
221  FileListIteratorType m_curFile;
222  int m_basedirsize;
223  }; // class FtpFileListIterator
224 
226  : public Storage,
227  private aux::NonCopyable,
228  private aux::PluginRefCounter<FtpStorage>
229  {
230  friend class aux::PluginRefCounter<FtpStorage>;
231  // we need pointer because 'ftplib' default constructor can throw
232  // and we want to handle it explicitely.
233  public: // ctors, helper functions
234  FtpStorage(const std::string& url);
235  int getAvail() const {return m_available;}
236 
237  public: // Storage interface implementation
238  virtual int STORAGE_METHOD_CALL isAvailable() const override;
239 
240  virtual IODevice* STORAGE_METHOD_CALL open(
241  const char* uri,
242  int flags,
243  int* ecode
244  ) const override;
245 
246  virtual uint64_t STORAGE_METHOD_CALL getFreeSpace(int* ecode) const;
247  virtual uint64_t STORAGE_METHOD_CALL getTotalSpace(int* ecode) const;
248  virtual int STORAGE_METHOD_CALL getCapabilities() const;
249 
250  virtual void STORAGE_METHOD_CALL removeFile(
251  const char* url,
252  int* ecode
253  ) override;
254 
255  virtual void STORAGE_METHOD_CALL removeDir(
256  const char* url,
257  int* ecode
258  ) override;
259 
260  virtual void STORAGE_METHOD_CALL renameFile(
261  const char* oldUrl,
262  const char* newUrl,
263  int* ecode
264  ) override;
265 
266  virtual FileInfoIterator* STORAGE_METHOD_CALL getFileIterator(
267  const char* dirUrl,
268  int* ecode
269  ) const override;
270 
271  virtual int STORAGE_METHOD_CALL fileExists(
272  const char* url,
273  int* ecode
274  ) const override;
275 
276  virtual int STORAGE_METHOD_CALL dirExists(
277  const char* url,
278  int* ecode
279  ) const override;
280 
281  virtual uint64_t STORAGE_METHOD_CALL fileSize(
282  const char* url,
283  int* ecode
284  ) const override;
285 
286  public: // plugin interface implementation
287  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
288 
289  virtual int addRef() const override;
290  virtual int releaseRef() const override;
291 
292  private:
293  // destroy only via releaseRef()
294  ~FtpStorage();
295 
296  private:
297  implPtrType m_impl;
298  std::string m_implurl;
299  std::string m_user;
300  std::string m_passwd;
301  mutable std::mutex m_mutex;
302  mutable int m_available;
303  }; // class Ftpstorage
304 
306  : public StorageFactory,
307  private aux::NonCopyable,
308  private aux::PluginRefCounter<FtpStorageFactory>
309  {
311  public:
313  // currently unimplemented
314  virtual const char** STORAGE_METHOD_CALL findAvailable() const override;
315 
316  virtual Storage* STORAGE_METHOD_CALL createStorage(
317  const char* url,
318  int* ecode
319  ) override;
320 
321  virtual const char* STORAGE_METHOD_CALL storageType() const override;
322  virtual const char* lastErrorMessage(int ecode) const override;
323 
324  public: // plugin interface implementation
325  virtual void* queryInterface(const nxpl::NX_GUID& interfaceID) override;
326 
327  virtual int addRef() const override;
328  virtual int releaseRef() const override;
329  }; // class FtpStorageFactory
330 } // namespace Qn
331 
332 #endif // __FTP_THIRD_PARTY_LIBRARY_H__
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:1364
Definition: ftp_library.h:66
Definition: ftp_library.h:180
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:998
virtual void STORAGE_METHOD_CALL renameFile(const char *oldUrl, const char *newUrl, int *ecode) override
Definition: ftp_library.cpp:820
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:807
Definition: ftp_library.h:305
Definition: ftp_library.h:116
Storage factory abstraction.
Definition: third_party_storage.h:273
virtual int STORAGE_METHOD_CALL isAvailable() const override
Definition: ftp_library.cpp:712
virtual IODevice *STORAGE_METHOD_CALL open(const char *uri, int flags, int *ecode) const override
Definition: ftp_library.cpp:937
virtual const char **STORAGE_METHOD_CALL findAvailable() const override
Definition: ftp_library.cpp:1044
virtual const char * lastErrorMessage(int ecode) const override
Definition: ftp_library.cpp:1100
virtual int STORAGE_METHOD_CALL seek(uint64_t pos, int *ecode) override
Definition: ftp_library.cpp:1300
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:1050
Storage plugin namespace.
Definition: ftp_library.cpp:28
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:668
Definition: ftplib.h:105
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:1039
virtual int STORAGE_METHOD_CALL dirExists(const char *url, int *ecode) const override
Definition: ftp_library.cpp:899
Definition: ftp_library.h:225
GUID of plugin interface.
Definition: plugin_api.h:26
Definition: ftp_library.h:103
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:1015
Storage abstraction.
Definition: third_party_storage.h:155
virtual uint64_t STORAGE_METHOD_CALL getTotalSpace(int *ecode) const
Definition: ftp_library.cpp:742
virtual uint64_t STORAGE_METHOD_CALL getFreeSpace(int *ecode) const
Definition: ftp_library.cpp:731
virtual int STORAGE_METHOD_CALL fileExists(const char *url, int *ecode) const override
Definition: ftp_library.cpp:876
virtual FileInfo *STORAGE_METHOD_CALL next(int *ecode) const override
Definition: ftp_library.cpp:629
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:1340
virtual FileInfoIterator *STORAGE_METHOD_CALL getFileIterator(const char *dirUrl, int *ecode) const override
Definition: ftp_library.cpp:834
virtual const char *STORAGE_METHOD_CALL storageType() const override
Definition: ftp_library.cpp:1082
virtual uint32_t STORAGE_METHOD_CALL size(int *ecode) const override
Definition: ftp_library.cpp:1324
Definition: ftp_library.h:87
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:1034
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:979
virtual uint64_t STORAGE_METHOD_CALL fileSize(const char *url, int *ecode) const override
Definition: ftp_library.cpp:917
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:1003
virtual void STORAGE_METHOD_CALL removeFile(const char *url, int *ecode) override
Definition: ftp_library.cpp:795
virtual int STORAGE_METHOD_CALL getMode() const override
Definition: ftp_library.cpp:1319
virtual int STORAGE_METHOD_CALL getCapabilities() const
Definition: ftp_library.cpp:753
virtual uint32_t STORAGE_METHOD_CALL read(void *dst, const uint32_t size, int *ecode) const override
Definition: ftp_library.cpp:1262
virtual uint32_t STORAGE_METHOD_CALL write(const void *src, const uint32_t size, int *ecode) override
Definition: ftp_library.cpp:1225
virtual int releaseRef() const override
Decrement reference counter.
Definition: ftp_library.cpp:673
virtual void * queryInterface(const nxpl::NX_GUID &interfaceID) override
Cast to type, specified by interfaceID.
Definition: ftp_library.cpp:649
virtual int addRef() const override
Increment reference counter.
Definition: ftp_library.cpp:1359
IO device abstraction.
Definition: third_party_storage.h:73