Added advance arg to isThisType()

v0.27.3
Andreas Huggel 22 years ago
parent f520a571a6
commit 3b60f986a0

@ -20,14 +20,14 @@
*/ */
/* /*
File: image.cpp File: image.cpp
Version: $Name: $ $Revision: 1.6 $ Version: $Name: $ $Revision: 1.7 $
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net> Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
History: 26-Jan-04, ahu: created History: 26-Jan-04, ahu: created
11-Feb-04, ahu: isolated as a component 11-Feb-04, ahu: isolated as a component
*/ */
// ***************************************************************************** // *****************************************************************************
#include "rcsid.hpp" #include "rcsid.hpp"
EXIV2_RCSID("@(#) $Name: $ $Revision: 1.6 $ $RCSfile: image.cpp,v $") EXIV2_RCSID("@(#) $Name: $ $Revision: 1.7 $ $RCSfile: image.cpp,v $")
// ***************************************************************************** // *****************************************************************************
// included header files // included header files
@ -149,12 +149,10 @@ namespace Exif {
int JpegImage::readExifData(std::istream& is) int JpegImage::readExifData(std::istream& is)
{ {
// Check if this is a JPEG image in the first place // Check if this is a JPEG image in the first place
if (!isThisType(is)) { if (!isThisType(is, true)) {
if (!is.good()) return 1; if (!is.good()) return 1;
return 2; return 2;
} }
// isThisType does not advance the stream, so do this now
is.seekg(2, std::ios::cur);
// Read and check section marker and size // Read and check section marker and size
char tmpbuf[10]; char tmpbuf[10];
@ -213,12 +211,10 @@ namespace Exif {
int JpegImage::writeExifData(std::ostream& os, std::istream& is) const int JpegImage::writeExifData(std::ostream& os, std::istream& is) const
{ {
// Check if this is a JPEG image in the first place // Check if this is a JPEG image in the first place
if (!isThisType(is)) { if (!isThisType(is, true)) {
if (!is.good()) return 1; if (!is.good()) return 1;
return 2; return 2;
} }
// isThisType does not advance the stream, so do this now
is.seekg(2, std::ios::cur);
// Read and check section marker and size // Read and check section marker and size
char tmpbuf[12]; char tmpbuf[12];
@ -263,7 +259,7 @@ namespace Exif {
return new JpegImage(*this); return new JpegImage(*this);
} }
bool JpegImage::isThisType(std::istream& is) const bool JpegImage::isThisType(std::istream& is, bool advance) const
{ {
char c; char c;
is.get(c); is.get(c);
@ -278,7 +274,7 @@ namespace Exif {
is.seekg(-2, std::ios::cur); is.seekg(-2, std::ios::cur);
return false; return false;
} }
is.seekg(-2, std::ios::cur); if (advance == false) is.seekg(-2, std::ios::cur);
return true; return true;
} }

@ -21,7 +21,7 @@
/*! /*!
@file image.hpp @file image.hpp
@brief Class JpegImage to access JPEG images @brief Class JpegImage to access JPEG images
@version $Name: $ $Revision: 1.6 $ @version $Name: $ $Revision: 1.7 $
@author Andreas Huggel (ahu) @author Andreas Huggel (ahu)
<a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a> <a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a>
@date 09-Jan-04, ahu: created @date 09-Jan-04, ahu: created
@ -93,10 +93,24 @@ namespace Exif {
/*! /*!
@brief Determine if the content of the stream is an image of the type @brief Determine if the content of the stream is an image of the type
of this class. of this class.
The advance flag determines if the read position in the stream is
moved (see below). This applies only if the image type matches and the
function returns true. If the image type does not match, the stream
position is not changed. However, if reading from the stream fails,
the stream position is undefined. Consult the stream state to obtain
more information in this case.
@param is Input stream with the image.
@param advance Flag indicating whether the read position in the stream
should be advanced by the number of characters read to
analyse the image stream (true) or left at its original
position (false). This applies only if the image type
matches.
@return true if the type of the image matches that of this;<BR> @return true if the type of the image matches that of this;<BR>
false if the type of the image does not match. false if the type of the image does not match.
*/ */
virtual bool isThisType(std::istream& is) const =0; virtual bool isThisType(std::istream& is, bool advance =false) const =0;
/*! /*!
@brief Write the %Exif data to file path. @brief Write the %Exif data to file path.
@param path Path to the file. @param path Path to the file.
@ -281,7 +295,7 @@ namespace Exif {
the stream may or may not have been advanced by 1 or 2 the stream may or may not have been advanced by 1 or 2
characters. characters.
*/ */
bool isThisType(std::istream& is) const; bool isThisType(std::istream& is, bool advance) const;
/*! /*!
@brief Write the %Exif data to file path, which must contain a JPEG @brief Write the %Exif data to file path, which must contain a JPEG
image. If an %Exif APP1 section exists in the file, it is image. If an %Exif APP1 section exists in the file, it is

Loading…
Cancel
Save