Exiv2
basicio.hpp
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #ifndef BASICIO_HPP_
4 #define BASICIO_HPP_
5 
6 // *****************************************************************************
7 #include "exiv2lib_export.h"
8 
9 // included header files
10 #include "error.hpp"
11 #include "types.hpp"
12 
13 // + standard includes
14 #include <memory>
15 
16 // The way to handle data from stdin or data uri path. If EXV_XPATH_MEMIO = 1,
17 // it uses MemIo. Otherwises, it uses FileIo.
18 #ifndef EXV_XPATH_MEMIO
19 #define EXV_XPATH_MEMIO 0
20 #endif
21 
22 // *****************************************************************************
23 // namespace extensions
24 namespace Exiv2 {
25 // *****************************************************************************
26 // class definitions
27 
35 class EXIV2API BasicIo {
36  public:
38  using UniquePtr = std::unique_ptr<BasicIo>;
39 
41  enum Position { beg, cur, end };
42 
44 
45  virtual ~BasicIo() = default;
48 
50 
51 
63  virtual int open() = 0;
64 
72  virtual int close() = 0;
82  virtual size_t write(const byte* data, size_t wcount) = 0;
92  virtual size_t write(BasicIo& src) = 0;
100  virtual int putb(byte data) = 0;
111  virtual DataBuf read(size_t rcount) = 0;
124  virtual size_t read(byte* buf, size_t rcount) = 0;
135  void readOrThrow(byte* buf, size_t rcount, ErrorCode err = ErrorCode::kerCorruptedMetadata);
142  virtual int getb() = 0;
156  virtual void transfer(BasicIo& src) = 0;
165  virtual int seek(int64_t offset, Position pos) = 0;
166 
175  void seekOrThrow(int64_t offset, Position pos, ErrorCode err);
176 
186  virtual byte* mmap(bool isWriteable = false) = 0;
193  virtual int munmap() = 0;
194 
196 
198 
199 
203  [[nodiscard]] virtual size_t tell() const = 0;
209  [[nodiscard]] virtual size_t size() const = 0;
211  [[nodiscard]] virtual bool isopen() const = 0;
213  [[nodiscard]] virtual int error() const = 0;
215  [[nodiscard]] virtual bool eof() const = 0;
221  [[nodiscard]] virtual const std::string& path() const noexcept = 0;
222 
230  virtual void populateFakeData() = 0;
231 
235  byte* bigBlock_{};
236 
238 }; // class BasicIo
239 
246 class EXIV2API IoCloser {
247  public:
249 
250  explicit IoCloser(BasicIo& bio) : bio_(bio) {
252  }
254  virtual ~IoCloser() {
255  close();
256  }
258 
260 
261  void close() {
263  if (bio_.isopen())
264  bio_.close();
265  }
267 
268  // DATA
271 
272  // Not implemented
274  IoCloser(const IoCloser&) = delete;
276  IoCloser& operator=(const IoCloser&) = delete;
277 }; // class IoCloser
278 
279 #ifdef EXV_ENABLE_FILESYSTEM
280 
284 class EXIV2API FileIo : public BasicIo {
285  public:
287 
288 
294  explicit FileIo(const std::string& path);
295 
297  ~FileIo() override;
299 
301 
302 
315  int open(const std::string& mode);
323  int open() override;
330  int close() override;
340  size_t write(const byte* data, size_t wcount) override;
350  size_t write(BasicIo& src) override;
358  int putb(byte data) override;
369  DataBuf read(size_t rcount) override;
382  size_t read(byte* buf, size_t rcount) override;
389  int getb() override;
408  void transfer(BasicIo& src) override;
409 
410  int seek(int64_t offset, Position pos) override;
411 
423  byte* mmap(bool isWriteable = false) override;
431  int munmap() override;
435  virtual void setPath(const std::string& path);
436 
438 
440 
444  [[nodiscard]] size_t tell() const override;
451  [[nodiscard]] size_t size() const override;
453  [[nodiscard]] bool isopen() const override;
455  [[nodiscard]] int error() const override;
457  [[nodiscard]] bool eof() const override;
459  [[nodiscard]] const std::string& path() const noexcept override;
460 
468  void populateFakeData() override;
470 
471  // NOT IMPLEMENTED
473  FileIo(const FileIo&) = delete;
475  FileIo& operator=(const FileIo&) = delete;
476 
477  private:
478  // Pimpl idiom
479  class Impl;
480  std::unique_ptr<Impl> p_;
481 
482 }; // class FileIo
483 #endif
484 
497 class EXIV2API MemIo : public BasicIo {
498  public:
500 
501  MemIo();
510  MemIo(const byte* data, size_t size);
512  ~MemIo() override;
514 
516 
517 
523  int open() override;
528  int close() override;
539  size_t write(const byte* data, size_t wcount) override;
550  size_t write(BasicIo& src) override;
558  int putb(byte data) override;
569  DataBuf read(size_t rcount) override;
582  size_t read(byte* buf, size_t rcount) override;
589  int getb() override;
605  void transfer(BasicIo& src) override;
606 
607  int seek(int64_t offset, Position pos) override;
608 
617  byte* mmap(bool /*isWriteable*/ = false) override;
618  int munmap() override;
620 
622 
623 
627  [[nodiscard]] size_t tell() const override;
633  [[nodiscard]] size_t size() const override;
635  [[nodiscard]] bool isopen() const override;
637  [[nodiscard]] int error() const override;
639  [[nodiscard]] bool eof() const override;
641  [[nodiscard]] const std::string& path() const noexcept override;
642 
650  void populateFakeData() override;
651 
653 
654  // NOT IMPLEMENTED
656  MemIo(const MemIo&) = delete;
658  MemIo& operator=(const MemIo&) = delete;
659 
660  private:
661  // Pimpl idiom
662  class Impl;
663  std::unique_ptr<Impl> p_;
664 
665 }; // class MemIo
666 
670 #if EXV_XPATH_MEMIO
671 class EXIV2API XPathIo : public MemIo {
672  public:
674 
675  XPathIo(const std::string& path);
678  private:
683  void ReadStdin();
689  void ReadDataUri(const std::string& path);
690 }; // class XPathIo
691 #elif defined(EXV_ENABLE_FILESYSTEM)
692 class EXIV2API XPathIo : public FileIo {
693  public:
698  static constexpr auto TEMP_FILE_EXT = ".exiv2_temp";
703  static constexpr auto GEN_FILE_EXT = ".exiv2";
704 
706 
707  explicit XPathIo(const std::string& orgPath);
709 
711  ~XPathIo() override;
713 
714  XPathIo(const XPathIo&) = delete;
715  XPathIo& operator=(const XPathIo&) = delete;
716 
718 
719 
723  void transfer(BasicIo& src) override;
724 
726 
728 
729 
735  static std::string writeDataToFile(const std::string& orgPath);
737 
738  private:
739  // True if the file is a temporary file and it should be deleted in destructor.
740  bool isTemp_{true};
741  std::string tempFilePath_;
742 }; // class XPathIo
743 #endif
744 
750 class EXIV2API RemoteIo : public BasicIo {
751  public:
753  RemoteIo();
754  ~RemoteIo() override;
756 
757  RemoteIo(const RemoteIo&) = delete;
758  RemoteIo& operator=(const RemoteIo&) = delete;
759 
761 
762 
771  int open() override;
772 
778  int close() override;
783  size_t write(const byte* data, size_t wcount) override;
798  size_t write(BasicIo& src) override;
799 
804  int putb(byte data) override;
817  DataBuf read(size_t rcount) override;
832  size_t read(byte* buf, size_t rcount) override;
841  int getb() override;
856  void transfer(BasicIo& src) override;
857 
858  int seek(int64_t offset, Position pos) override;
859 
864  byte* mmap(bool /*isWriteable*/ = false) override;
869  int munmap() override;
871 
873 
877  [[nodiscard]] size_t tell() const override;
883  [[nodiscard]] size_t size() const override;
885  [[nodiscard]] bool isopen() const override;
887  [[nodiscard]] int error() const override;
889  [[nodiscard]] bool eof() const override;
891  [[nodiscard]] const std::string& path() const noexcept override;
892 
900  void populateFakeData() override;
901 
903 
904  protected:
905  // Pimpl idiom
906  class Impl;
908  std::unique_ptr<Impl> p_;
909 }; // class RemoteIo
910 
914 class EXIV2API HttpIo : public RemoteIo {
915  public:
917 
918 
927  explicit HttpIo(const std::string& url, size_t blockSize = 1024);
928 
929  private:
930  // Pimpl idiom
931  class HttpImpl;
932 };
933 
934 #ifdef EXV_USE_CURL
935 
939 class EXIV2API CurlIo : public RemoteIo {
940  public:
942 
943 
952  explicit CurlIo(const std::string& url, size_t blockSize = 0);
953 
959  size_t write(const byte* data, size_t wcount) override;
965  size_t write(BasicIo& src) override;
966 
967  protected:
968  // Pimpl idiom
969  class CurlImpl;
970 };
971 #endif
972 
973 // *****************************************************************************
974 // template, inline and free functions
975 
981 EXIV2API DataBuf readFile(const std::string& path);
987 EXIV2API size_t writeFile(const DataBuf& buf, const std::string& path);
988 #ifdef EXV_USE_CURL
989 
992 EXIV2API size_t curlWriter(char* data, size_t size, size_t nmemb, std::string* writerData);
993 #endif
994 } // namespace Exiv2
995 #endif // #ifndef BASICIO_HPP_
An interface for simple binary IO.
Definition: basicio.hpp:35
EXIV2API DataBuf readFile(const std::string &path)
Read file path into a DataBuf, which is returned.
Provides binary IO for the data from stdin and data uri path.
Definition: basicio.hpp:750
Internal Pimpl abstract structure of class RemoteIo.
Definition: basicio.cpp:1001
uint8_t byte
1 byte unsigned integer type.
Definition: types.hpp:26
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124
Provides the http read/write access for the RemoteIo.
Definition: basicio.hpp:914
Position
Seek starting positions.
Definition: basicio.hpp:41
Internal Pimpl structure of class MemIo.
Definition: basicio.cpp:563
Provides binary IO on blocks of memory by implementing the BasicIo interface. A copy-on-write impleme...
Definition: basicio.hpp:497
std::unique_ptr< BasicIo > UniquePtr
BasicIo auto_ptr type.
Definition: basicio.hpp:38
BasicIo & bio_
The BasicIo reference.
Definition: basicio.hpp:270
Error class for exceptions, log message class.
Class CrwImage to access Canon CRW images. References: The Canon RAW (CRW) File Format by Phil Harv...
Definition: asfvideo.hpp:15
Utility class that closes a BasicIo instance upon destruction. Meant to be used as a stack variable i...
Definition: basicio.hpp:246
EXIV2API size_t writeFile(const DataBuf &buf, const std::string &path)
Write DataBuf buf to file path.
virtual ~IoCloser()
Destructor, closes the BasicIo reference.
Definition: basicio.hpp:254
std::unique_ptr< Impl > p_
Pointer to implementation.
Definition: basicio.hpp:906
ErrorCode
Complete list of all Exiv2 error codes.
Definition: error.hpp:162