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
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:
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
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
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
virtual size_t write(const byte *data, size_t wcount)=0
Write data to the IO source. Current IO position is advanced by the number of bytes written.
virtual bool isopen() const =0
Returns true if the IO source is open, otherwise false.
virtual int open()=0
Open the IO source using the default access mode. The default mode should allow for reading and writi...
Position
Seek starting positions.
Definition: basicio.hpp:41
virtual bool eof() const =0
Returns true if the IO position has reached the end, otherwise false.
virtual const std::string & path() const noexcept=0
Return the path to the IO resource. Often used to form comprehensive error messages where only a Basi...
virtual size_t size() const =0
Get the current size of the IO source in bytes.
virtual int getb()=0
Read one byte from the IO source. Current IO position is advanced by one byte.
virtual int close()=0
Close the IO source. After closing a BasicIo instance can not be read or written. Closing flushes any...
virtual size_t tell() const =0
Get the current IO position.
virtual byte * mmap(bool isWriteable=false)=0
Direct access to the IO data. For files, this is done by mapping the file into the process's address ...
virtual int seek(int64_t offset, Position pos)=0
Move the current IO position.
virtual int munmap()=0
Remove a mapping established with mmap(). If the mapped area is writeable, this ensures that changes ...
virtual size_t write(BasicIo &src)=0
Write data that is read from another BasicIo instance to the IO source. Current IO position is advanc...
std::unique_ptr< BasicIo > UniquePtr
BasicIo auto_ptr type.
Definition: basicio.hpp:38
virtual DataBuf read(size_t rcount)=0
Read data from the IO source. Reading starts at the current IO position and the position is advanced ...
virtual void transfer(BasicIo &src)=0
Remove all data from this object's IO source and then transfer data from the src BasicIo object into ...
virtual int putb(byte data)=0
Write one byte to the IO source. Current IO position is advanced by one byte.
virtual int error() const =0
Returns 0 if the IO source is in a valid state, otherwise nonzero.
virtual size_t read(byte *buf, size_t rcount)=0
Read data from the IO source. Reading starts at the current IO position and the position is advanced ...
Provides binary file IO by implementing the BasicIo interface.
Definition: basicio.hpp:284
int open(const std::string &mode)
Open the file using the specified mode.
DataBuf read(size_t rcount) override
Read data from the file. Reading starts at the current file position and the position is advanced by ...
~FileIo() override
Destructor. Flushes and closes an open file.
bool isopen() const override
Returns true if the file is open, otherwise false.
int open() override
Open the file using the default access mode of "rb". This method can also be used to "reopen" a file ...
int seek(int64_t offset, Position pos) override
Move the current IO position.
size_t write(const byte *data, size_t wcount) override
Write data to the file. The file position is advanced by the number of bytes written.
virtual void setPath(const std::string &path)
close the file source and set a new path.
size_t tell() const override
Get the current file position.
size_t read(byte *buf, size_t rcount) override
Read data from the file. Reading starts at the current file position and the position is advanced by ...
int munmap() override
Remove a mapping established with mmap(). If the mapped area is writeable, this ensures that changes ...
int error() const override
Returns 0 if the file is in a valid state, otherwise nonzero.
bool eof() const override
Returns true if the file position has reached the end, otherwise false.
int close() override
Flush and unwritten data and close the file . It is safe to call close on an already closed instance.
size_t write(BasicIo &src) override
Write data that is read from another BasicIo instance to the file. The file position is advanced by t...
FileIo(const std::string &path)
Constructor that accepts the file path on which IO will be performed. The constructor does not open t...
const std::string & path() const noexcept override
Returns the path of the file.
size_t size() const override
Flush any buffered writes and get the current file size in bytes.
int getb() override
Read one byte from the file. The file position is advanced by one byte.
int putb(byte data) override
Write one byte to the file. The file position is advanced by one byte.
void transfer(BasicIo &src) override
Remove the contents of the file and then transfer data from the src BasicIo object into the empty fil...
byte * mmap(bool isWriteable=false) override
Map the file into the process's address space. The file must be open before mmap() is called....
Provides the http read/write access for the RemoteIo.
Definition: basicio.hpp:914
HttpIo(const std::string &url, size_t blockSize=1024)
Constructor that accepts the http URL on which IO will be performed. The constructor does not open th...
Utility class that closes a BasicIo instance upon destruction. Meant to be used as a stack variable i...
Definition: basicio.hpp:246
IoCloser & operator=(const IoCloser &)=delete
Assignment operator.
virtual ~IoCloser()
Destructor, closes the BasicIo reference.
Definition: basicio.hpp:254
BasicIo & bio_
The BasicIo reference.
Definition: basicio.hpp:270
IoCloser(const IoCloser &)=delete
Copy constructor.
Internal Pimpl structure of class MemIo.
Definition: basicio.cpp:572
Provides binary IO on blocks of memory by implementing the BasicIo interface. A copy-on-write impleme...
Definition: basicio.hpp:497
MemIo(const MemIo &)=delete
Copy constructor.
MemIo & operator=(const MemIo &)=delete
Assignment operator.
Internal Pimpl abstract structure of class RemoteIo.
Definition: basicio.cpp:1001
Provides remote binary file IO by implementing the BasicIo interface. This is an abstract class....
Definition: basicio.hpp:750
RemoteIo()
Destructor. Releases all managed memory.
Provides binary IO for the data from stdin and data uri path.
Definition: basicio.hpp:692
void transfer(BasicIo &src) override
Change the name of the temp file and make it untemporary before calling the method of superclass File...
static std::string writeDataToFile(const std::string &orgPath)
Read the data from stdin/data uri path and write them to the file.
~XPathIo() override
Destructor. Releases all managed memory and removes the temp file.
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
ErrorCode
Complete list of all Exiv2 error codes.
Definition: error.hpp:162
EXIV2API size_t writeFile(const DataBuf &buf, const std::string &path)
Write DataBuf buf to file path.
EXIV2API DataBuf readFile(const std::string &path)
Read file path into a DataBuf, which is returned.
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition: types.hpp:124