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