Krita Source Code Documentation
Loading...
Searching...
No Matches
KisExiv2IODevice Class Reference

#include <KisExiv2IODevice.h>

+ Inheritance diagram for KisExiv2IODevice:

Public Types

using ptr_type = Exiv2::BasicIo::AutoPtr
 

Public Member Functions

int close () override
 
bool eof () const override
 
int error () const override
 
int getb () override
 
bool isopen () const override
 
 KisExiv2IODevice (QString path)
 
Exiv2::byte * mmap (bool isWriteable=false) override
 
int munmap () override
 
int open () override
 
std::string path () const override
 
int putb (Exiv2::byte data) override
 
long read (Exiv2::byte *buf, long rcount) override
 
Exiv2::DataBuf read (long rcount) override
 
int seek (long offset, Position pos) override
 
size_t size () const override
 
long tell () const override
 
void transfer (BasicIo &src) override
 
long write (const Exiv2::byte *data, long wcount) override
 
long write (Exiv2::BasicIo &src) override
 
 ~KisExiv2IODevice () override
 

Private Member Functions

QString filePathQString () const
 
bool open (QFile::OpenMode mode)
 
bool renameToCurrent (const QString srcPath)
 

Private Attributes

QFile m_file
 
Exiv2::byte * m_mappedArea
 

Detailed Description

Definition at line 18 of file KisExiv2IODevice.h.

Member Typedef Documentation

◆ ptr_type

using KisExiv2IODevice::ptr_type = Exiv2::BasicIo::AutoPtr

Definition at line 24 of file KisExiv2IODevice.h.

Constructor & Destructor Documentation

◆ KisExiv2IODevice()

KisExiv2IODevice::KisExiv2IODevice ( QString path)

Definition at line 12 of file KisExiv2IODevice.cpp.

13 : m_file(path)
14 , m_mappedArea(nullptr)
15{
16}
Exiv2::byte * m_mappedArea

◆ ~KisExiv2IODevice()

KisExiv2IODevice::~KisExiv2IODevice ( )
override

Definition at line 18 of file KisExiv2IODevice.cpp.

19{
20 m_file.close();
21}

References m_file.

Member Function Documentation

◆ close()

int KisExiv2IODevice::close ( )
override

Definition at line 33 of file KisExiv2IODevice.cpp.

34{
35 if (munmap() != 0) {
36 return 1;
37 }
38 m_file.close();
39 return 0;
40}
int munmap() override

References m_file, and munmap().

◆ eof()

bool KisExiv2IODevice::eof ( ) const
override

Definition at line 261 of file KisExiv2IODevice.cpp.

262{
263 return m_file.atEnd();
264}

References m_file.

◆ error()

int KisExiv2IODevice::error ( ) const
override

Definition at line 255 of file KisExiv2IODevice.cpp.

256{
257 // zero if no error
258 return m_file.error() != QFileDevice::NoError;
259}

References m_file.

◆ filePathQString()

QString KisExiv2IODevice::filePathQString ( ) const
private

Definition at line 297 of file KisExiv2IODevice.cpp.

298{
299 return QFileInfo(m_file).absoluteFilePath();
300}

References m_file.

◆ getb()

int KisExiv2IODevice::getb ( )
override

Definition at line 132 of file KisExiv2IODevice.cpp.

133{
134 char c;
135 if (m_file.getChar(&c)) {
136 return c;
137 } else {
138 return EOF;
139 }
140}

References m_file.

◆ isopen()

bool KisExiv2IODevice::isopen ( ) const
override

Definition at line 250 of file KisExiv2IODevice.cpp.

251{
252 return m_file.isOpen();
253}

References m_file.

◆ mmap()

Exiv2::byte * KisExiv2IODevice::mmap ( bool isWriteable = false)
override

Definition at line 199 of file KisExiv2IODevice.cpp.

200{
201 Q_UNUSED(isWriteable);
202
203 if (munmap() != 0) {
204 qWarning() << "KisExiv2IODevice::mmap: Couldn't unmap the mapped file";
205 return nullptr;
206 }
207
208 m_mappedArea = m_file.map(0, size(), QFile::NoOptions);
209 if (!m_mappedArea) {
210 // We show a warning, but originally we should be throwing an exception.
211 qWarning() << "KisExiv2IODevice::mmap: Couldn't map the file" << m_file.fileName();
212 }
213 return m_mappedArea;
214}
size_t size() const override

References m_file, m_mappedArea, munmap(), and size().

◆ munmap()

int KisExiv2IODevice::munmap ( )
override

Definition at line 216 of file KisExiv2IODevice.cpp.

217{
218 if (m_mappedArea) {
219 bool successful = m_file.unmap(m_mappedArea);
220 m_mappedArea = nullptr;
221 return !successful;
222 }
223 return 0;
224}

References m_file, and m_mappedArea.

◆ open() [1/2]

int KisExiv2IODevice::open ( )
override

Definition at line 23 of file KisExiv2IODevice.cpp.

24{
25 if (m_file.isOpen()) {
26 m_file.close();
27 }
28
29 // return zero if successful
30 return !m_file.open(QFile::ReadWrite);
31}

References m_file.

◆ open() [2/2]

bool KisExiv2IODevice::open ( QFile::OpenMode mode)
private

Definition at line 275 of file KisExiv2IODevice.cpp.

276{
277 if (m_file.isOpen()) {
278 m_file.close();
279 }
280 return m_file.open(mode);
281}

References m_file.

◆ path()

std::string KisExiv2IODevice::path ( ) const
override

Definition at line 269 of file KisExiv2IODevice.cpp.

271{
272 return filePathQString().toStdString();
273}
QString filePathQString() const

◆ putb()

int KisExiv2IODevice::putb ( Exiv2::byte data)
override

Definition at line 86 of file KisExiv2IODevice.cpp.

87{
88 if (!m_file.isWritable()) {
89 qWarning() << "KisExiv2IODevice: File not open for writing.";
90 return 0;
91 }
92 if (m_file.putChar(data)) {
93 return data;
94 } else {
95 return EOF;
96 }
97}

References m_file.

◆ read() [1/2]

long KisExiv2IODevice::read ( Exiv2::byte * buf,
long rcount )
override

Definition at line 119 of file KisExiv2IODevice.cpp.

121{
122 const qint64 bytesRead = m_file.read(reinterpret_cast<char *>(buf), rcount);
123 if (bytesRead > 0) {
124 return bytesRead;
125 } else {
126 qWarning() << "KisExiv2IODevice: Couldn't read file:" << m_file.errorString();
127 // some error or EOF
128 return 0;
129 }
130}

◆ read() [2/2]

Exiv2::DataBuf KisExiv2IODevice::read ( long rcount)
override

Definition at line 102 of file KisExiv2IODevice.cpp.

104{
105 Exiv2::DataBuf buf(rcount);
106#if EXIV2_TEST_VERSION(0,28,0)
107 const size_t readCount = read(buf.data(), buf.size());
108 buf.resize(readCount);
109#else
110 const long readCount = read(buf.pData_, buf.size_);
111 buf.size_ = readCount;
112#endif
113 return buf;
114}
Exiv2::DataBuf read(long rcount) override

◆ renameToCurrent()

bool KisExiv2IODevice::renameToCurrent ( const QString srcPath)
private

Definition at line 283 of file KisExiv2IODevice.cpp.

284{
285 QFile::Permissions permissions = QFile::permissions(filePathQString());
286 if (QFile::exists(filePathQString())) {
287 QFile::remove(filePathQString());
288 }
289
290 if (!QFile(srcPath).rename(filePathQString())) {
291 qWarning() << "KisExiv2IODevice:renameToCurrent Couldn't copy file from" << srcPath << "to" << filePathQString();
292 return false;
293 }
294 return QFile(filePathQString()).setPermissions(permissions);
295}

References filePathQString().

◆ seek()

int KisExiv2IODevice::seek ( long offset,
Position pos )
override

Definition at line 181 of file KisExiv2IODevice.cpp.

183{
184 qint64 pos = 0;
185 switch (position) {
186 case Exiv2::BasicIo::beg:
187 pos = offset;
188 break;
189 case Exiv2::BasicIo::cur:
190 pos = tell() + offset;
191 break;
192 case Exiv2::BasicIo::end:
193 pos = size() + offset;
194 break;
195 }
196 return m_file.seek(pos);
197}
long tell() const override

◆ size()

size_t KisExiv2IODevice::size ( ) const
override

Definition at line 242 of file KisExiv2IODevice.cpp.

243{
244 if (m_file.isWritable()) {
245 m_file.flush();
246 }
247 return m_file.size();
248}

References m_file.

◆ tell()

long KisExiv2IODevice::tell ( ) const
override

Definition at line 236 of file KisExiv2IODevice.cpp.

238{
239 return m_file.pos();
240}

◆ transfer()

void KisExiv2IODevice::transfer ( BasicIo & src)
override

Definition at line 142 of file KisExiv2IODevice.cpp.

143{
144 bool isFileBased = (dynamic_cast<Exiv2::FileIo *>(&src) || dynamic_cast<KisExiv2IODevice *>(&src));
145 bool useFallback = false;
146
147 if (isFileBased) {
148 const QString srcPath = QString::fromStdString(src.path());
149 // use fallback if copying failed (e.g on Android :( )
150 useFallback = !renameToCurrent(srcPath);
151 }
152
153 if (!isFileBased || useFallback) {
154 const bool wasOpen = isopen();
155 const QIODevice::OpenMode oldMode = m_file.openMode();
156
157 // this sets file positioner to the beginning.
158 if (src.open() != 0) {
159 qWarning() << "KisExiv2IODevice::transfer: Couldn't open src file" << QString::fromStdString(src.path());
160 return;
161 }
162
163 if (!open(QIODevice::ReadWrite | QIODevice::Truncate)) {
164 qWarning() << "KisExiv2IODevice::transfer: Couldn't open dest file" << filePathQString();
165 return;
166 }
167 write(src);
168 src.close();
169
170 if (wasOpen) {
171 open(oldMode);
172 } else {
173 close();
174 }
175 }
176}
long write(const Exiv2::byte *data, long wcount) override
int close() override
bool isopen() const override
bool renameToCurrent(const QString srcPath)
int open() override

References close(), filePathQString(), isopen(), m_file, open(), renameToCurrent(), and write().

◆ write() [1/2]

long KisExiv2IODevice::write ( const Exiv2::byte * data,
long wcount )
override

Definition at line 45 of file KisExiv2IODevice.cpp.

47{
48 if (!m_file.isWritable()) {
49 qWarning() << "KisExiv2IODevice: File not open for writing.";
50 return 0;
51 }
52 const qint64 writeCount = m_file.write(reinterpret_cast<const char *>(data), wcount);
53 if (writeCount > 0) {
54 return writeCount;
55 }
56
57 return 0;
58}

◆ write() [2/2]

long KisExiv2IODevice::write ( Exiv2::BasicIo & src)
override

Definition at line 63 of file KisExiv2IODevice.cpp.

65{
66 if (static_cast<BasicIo *>(this) == &src) {
67 return 0;
68 }
69 if (!src.isopen()) {
70 return 0;
71 }
72 if (!m_file.isWritable()) {
73 qWarning() << "KisExiv2IODevice: File not open for writing.";
74 return 0;
75 }
76 Exiv2::byte buffer[4096];
77 long readCount = 0;
78 long totalWriteCount = 0;
79 while ((readCount = src.read(buffer, sizeof(buffer))) != 0) {
80 totalWriteCount += write(buffer, readCount);
81 }
82
83 return totalWriteCount;
84}

Member Data Documentation

◆ m_file

QFile KisExiv2IODevice::m_file
mutableprivate

Definition at line 78 of file KisExiv2IODevice.h.

◆ m_mappedArea

Exiv2::byte* KisExiv2IODevice::m_mappedArea
private

Definition at line 80 of file KisExiv2IODevice.h.


The documentation for this class was generated from the following files: