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 ...
Internal Pimpl structure of class FileIo.
Definition basicio.cpp:69
Provides binary file IO by implementing the BasicIo interface.
Definition basicio.hpp:284
FileIo(const FileIo &)=delete
Copy constructor.
FileIo & operator=(const FileIo &)=delete
Assignment operator.
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
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
Utility class containing a character array. All it does is to take care of memory allocation and dele...
Definition types.hpp:124