Exiv2
Loading...
Searching...
No Matches
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
24namespace Exiv2 {
25// *****************************************************************************
26// class definitions
27
35class EXIV2API BasicIo {
36 public:
38 using UniquePtr = std::unique_ptr<BasicIo>;
39
41 enum Position { beg, cur, end };
42
44
45
46 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
246class EXIV2API IoCloser {
247 public:
249
250
251 explicit IoCloser(BasicIo& bio) : bio_(bio) {
252 }
254 virtual ~IoCloser() {
255 close();
256 }
258
260
261
262 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
284class 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
497class EXIV2API MemIo : public BasicIo {
498 public:
500
501
502 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
671class EXIV2API XPathIo : public MemIo {
672 public:
674
675
676 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)
692class 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
708 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
750class 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
914class 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
939class 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
981EXIV2API DataBuf readFile(const std::string& path);
987EXIV2API size_t writeFile(const DataBuf& buf, const std::string& path);
988#ifdef EXV_USE_CURL
992EXIV2API 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 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 ~BasicIo()=default
Destructor.
virtual int seek(int64_t offset, Position pos)=0
Move the current IO position.
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 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 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 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.
const std::string & path() const noexcept override
Returns the path of the file.
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...
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.
byte * mmap(bool isWriteable=false) override
Map the file into the process's address space. The file must be open before mmap() is called....
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...
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.
IoCloser(BasicIo &bio)
Constructor, takes a BasicIo reference.
Definition basicio.hpp:251
virtual ~IoCloser()
Destructor, closes the BasicIo reference.
Definition basicio.hpp:254
void close()
Close the BasicIo if it is open.
Definition basicio.hpp:262
BasicIo & bio_
The BasicIo reference.
Definition basicio.hpp:270
IoCloser(const IoCloser &)=delete
Copy constructor.
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
MemIo & operator=(const MemIo &)=delete
Assignment operator.
MemIo(const MemIo &)=delete
Copy constructor.
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...
XPathIo(const std::string &orgPath)
Default constructor that reads data from stdin/data uri path and writes them to the temp 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