[SCM] exiv2 packaging branch, master, updated. debian/0.25-3.1-3734-gdcbc29a
Maximiliano Curia
maxy at moszumanska.debian.org
Thu Jul 13 17:37:06 UTC 2017
Gitweb-URL: http://git.debian.org/?p=pkg-kde/kde-extras/exiv2.git;a=commitdiff;h=1b41ce9
The following commit has been merged in the master branch:
commit 1b41ce9931b88c321de7b5d76d7b810d50d3cd3a
Author: Andreas Huggel <ahuggel at gmx.net>
Date: Fri Apr 22 15:07:12 2005 +0000
Close files before calling FileIo::size() (which uses stat). This is necessary on Win32 it seems. Fixes bug #428. Changed default mode of FileIo::open to "rb" and added FileIo::switchMode. Fixes bug #429. Added a hack to make test output of exiv2-test.sh more readable on MinGW.
---
src/basicio.cpp | 91 ++++++++++++++++++++++++++++++++++--------------------
src/basicio.hpp | 16 ++++++++--
src/iotest.cpp | 19 ++++++++++--
test/exiv2-test.sh | 6 ++++
4 files changed, 93 insertions(+), 39 deletions(-)
diff --git a/src/basicio.cpp b/src/basicio.cpp
index b09ec60..2b56d24 100644
--- a/src/basicio.cpp
+++ b/src/basicio.cpp
@@ -45,6 +45,7 @@ EXIV2_RCSID("@(#) $Id$");
#include "error.hpp"
// + standard includes
+#include <string>
#include <cassert>
#include <cstdio> // for remove()
#include <sys/types.h> // for stat()
@@ -94,33 +95,65 @@ namespace Exiv2 {
return basicIo;
}
- long FileIo::write(const byte* data, long wcount )
+ int FileIo::switchMode(OpMode opMode)
{
assert(fp_ != 0);
+ if (opMode_ == opMode) return 0;
+
+ bool reopen = true;
+ std::string mode = "r+b";
+
+ switch(opMode) {
+ case opRead:
+ // Flush if current mode allows reading, else reopen (in mode "r+b"
+ // as in this case we know that we can write to the file)
+ if ( openMode_[0] == 'r'
+ || openMode_.substr(0, 2) == "w+"
+ || openMode_.substr(0, 2) == "a+") reopen = false;
+ break;
+ case opWrite:
+ // Flush if current mode allows writing, else reopen
+ if ( openMode_.substr(0, 2) == "r+"
+ || openMode_[0] == 'w'
+ || openMode_[0] == 'a') reopen = false;
+ break;
+ case opSeek:
+ reopen = false;
+ break;
+ }
+
+ if (!reopen) {
+ // Don't do anything when switching _from_ opSeek mode; we
+ // flush when switching _to_ opSeek.
+ if (opMode_ == opSeek) return 0;
- // ANSI C requires a flush or seek when switching
- // between read and write modes.
- if (opMode_ == opRead) {
- // on msvcrt fflush does not do the job
+ // Flush. On msvcrt fflush does not do the job
fseek(fp_, 0, SEEK_CUR);
+ opMode_ = opMode;
+ return 0;
}
- opMode_ = opWrite;
+
+ // Reopen the file
+ long offset = ftell(fp_);
+ if (offset == -1) return -1;
+ if (open(mode) != 0) return 1;
+ opMode_ = opMode;
+ return fseek(fp_, offset, SEEK_SET);
+ }
+
+ long FileIo::write(const byte* data, long wcount)
+ {
+ assert(fp_ != 0);
+ if (switchMode(opWrite) != 0) return 0;
return (long)fwrite(data, 1, wcount, fp_);
}
long FileIo::write(BasicIo& src)
{
assert(fp_ != 0);
- if (static_cast<BasicIo*>(this)==&src) return 0;
+ if (static_cast<BasicIo*>(this) == &src) return 0;
if (!src.isopen()) return 0;
-
- // ANSI C requires a flush or seek when switching
- // between read and write modes.
- if (opMode_ == opRead) {
- // on msvcrt fflush does not do the job
- fseek(fp_, 0, SEEK_CUR);
- }
- opMode_ = opWrite;
+ if (switchMode(opWrite) != 0) return 0;
byte buf[4096];
long readCount = 0;
@@ -182,11 +215,7 @@ namespace Exiv2 {
int FileIo::putb(byte data)
{
assert(fp_ != 0);
- if (opMode_ == opRead) {
- // on msvcrt fflush does not do the job
- fseek(fp_, 0, SEEK_CUR);
- }
- opMode_ = opWrite;
+ if (switchMode(opWrite) != 0) return EOF;
return putc(data, fp_);
}
@@ -218,6 +247,10 @@ namespace Exiv2 {
long FileIo::size() const
{
+#if defined WIN32 && !defined __CYGWIN__
+ // On msvcrt stat only works if the file is not open, or so it seems
+ assert(fp_ == 0);
+#endif
if (fp_ != 0) {
fflush(fp_);
}
@@ -230,8 +263,8 @@ namespace Exiv2 {
int FileIo::open()
{
- // Default open is in read-write binary mode
- return open("r+b");
+ // Default open is in read-only binary mode
+ return open("rb");
}
int FileIo::open(const std::string& mode)
@@ -273,24 +306,14 @@ namespace Exiv2 {
long FileIo::read(byte* buf, long rcount)
{
assert(fp_ != 0);
-
- if (opMode_ == opWrite) {
- // on msvcrt fflush does not do the job
- fseek(fp_, 0, SEEK_CUR);
- }
- opMode_ = opRead;
+ if (switchMode(opRead) != 0) return 0;
return (long)fread(buf, 1, rcount, fp_);
}
int FileIo::getb()
{
assert(fp_ != 0);
-
- if (opMode_ == opWrite) {
- // on msvcrt fflush does not do the job
- fseek(fp_, 0, SEEK_CUR);
- }
- opMode_ = opRead;
+ if (switchMode(opRead) != 0) return EOF;
return getc(fp_);
}
diff --git a/src/basicio.hpp b/src/basicio.hpp
index 24636c8..a651fb4 100644
--- a/src/basicio.hpp
+++ b/src/basicio.hpp
@@ -295,7 +295,7 @@ namespace Exiv2 {
*/
int open(const std::string& mode);
/*!
- @brief Open the file using using the default access mode of "r+b".
+ @brief Open the file using using the default access mode of "rb".
This method can also be used to "reopen" a file which will flush
any unwritten data and reset the IO position to the start.
@return 0 if successful;<BR>
@@ -406,6 +406,8 @@ namespace Exiv2 {
/*!
@brief Flush any buffered writes and get the current file size
in bytes.
+ @note On Win32 systems the file must be closed prior to calling this
+ function.
@return Size of the file in bytes;<BR>
-1 if failure;
*/
@@ -445,6 +447,16 @@ namespace Exiv2 {
std::string openMode_;
FILE *fp_;
OpMode opMode_;
+
+ // METHODS
+ /*!
+ @brief Switch to a new access mode, reopening the file if needed.
+ Optimized to only reopen the file when it is really necessary.
+ @param opMode The mode to switch to.
+ @return 0 if successful
+ */
+ int switchMode(OpMode opMode);
+
}; // class FileIo
/*!
@@ -622,7 +634,7 @@ namespace Exiv2 {
ByteVector data_;
ByteVector::size_type idx_;
- //METHODS
+ // METHODS
void checkSize(long wcount);
}; // class MemIo
} // namespace Exiv2
diff --git a/src/iotest.cpp b/src/iotest.cpp
index ac82a60..441c593 100644
--- a/src/iotest.cpp
+++ b/src/iotest.cpp
@@ -73,6 +73,11 @@ try {
memIo1.seek(0, BasicIo::beg);
fileOut1.write(memIo1);
+ // On Win32 files must be closed before stat
+ memIo1.close();
+ fileIn.close();
+ fileOut1.close();
+
// Make sure they are all the same size
if(fileIn.size() != memIo1.size() || memIo1.size() != fileOut1.size()) {
std::cerr << argv[0] <<
@@ -97,7 +102,10 @@ try {
if (rc != 0) return rc;
// Another test of reading and writing
- fileOut1.seek(0, BasicIo::beg);
+ if (fileOut1.open() != 0) {
+ throw Error(9, fileOut1.path(), strError());
+ }
+
memIo2.seek(0, BasicIo::beg);
FileIo fileOut2(argv[3]);
if (fileOut2.open("w+b") != 0) {
@@ -146,13 +154,18 @@ int WriteReadSeek(BasicIo &io)
std::cerr << ": WRS initial write failed
";
return 2;
}
-
+
+ // On Win32 files must be closed before stat
+ io.close();
+
if (io.size() != len1) {
std::cerr << ": WRS size is not " << len1 << "
";
return 2;
}
- io.seek(-len1, BasicIo::cur);
+ if (io.open() != 0) {
+ throw Error(9, io.path(), strError());
+ }
int c = EOF;
memset(buf, -1, sizeof(buf));
diff --git a/test/exiv2-test.sh b/test/exiv2-test.sh
index a5923ee..6cbb3b3 100755
--- a/test/exiv2-test.sh
+++ b/test/exiv2-test.sh
@@ -93,6 +93,12 @@ diff iii kkk
) > $results 2>&1
+if [ `../config/config.guess` = "i686-pc-mingw32" ] ; then
+ sed 's,\,/,g' $results > ${results}-new
+ mv -f ${results}-new $results
+ unix2dos -q $results
+fi
+
diff -q -w $diffargs $results $good
rc=$?
if [ $rc -eq 0 ] ; then
--
exiv2 packaging
More information about the pkg-kde-commits
mailing list