Removed helper functions binaryToString() and stringFormat() from the API and from class Image and made them internal helpers. Renamed type printStructureOption_e to PrintStructureOption to conform with the common naming convention.

v0.27.3
Andreas Huggel 10 years ago
parent bfddfcbc17
commit 006625e116

@ -72,9 +72,9 @@ namespace Exiv2 {
typedef std::vector<NativePreview> NativePreviewList;
/*!
@brief options for printStructure
@brief Options for printStructure
*/
typedef enum { kpsNone, kpsBasic, kpsXMP } printStructureOption_e ;
typedef enum { kpsNone, kpsBasic, kpsXMP } PrintStructureOption;
/*!
@brief Abstract base class defining the interface for an image. This is
@ -113,7 +113,7 @@ namespace Exiv2 {
not valid (does not look like data of the specific image type).
@caution This function is not thread safe and intended for exiv2 -pS for debugging.
*/
virtual void printStructure(std::ostream& out,printStructureOption_e option=kpsNone);
virtual void printStructure(std::ostream& out, PrintStructureOption option =kpsNone);
/*!
@brief Read all metadata supported by a specific image format from the
image. Before this method is called, the image metadata will be
@ -412,16 +412,6 @@ namespace Exiv2 {
bool writeXmpFromPacket() const;
//! Return list of native previews. This is meant to be used only by the PreviewManager.
const NativePreviewList& nativePreviews() const;
/*!
@brief format a string in the pattern of \em sprintf \em .
*/
std::string stringFormat(const char* format, ...) const;
/*!
@brief format binary for display in \em printStructure() \em .
*/
std::string binaryToString(DataBuf& buf,size_t size,size_t start=0) const;
//@}
protected:

@ -159,7 +159,7 @@ namespace Exiv2 {
not valid (does not look like data of the specific image type).
@caution This function is not thread safe and intended for exiv2 -pS for debugging.
*/
void printStructure(std::ostream& out,Exiv2::printStructureOption_e option);
void printStructure(std::ostream& out, PrintStructureOption option);
//@}
protected:

@ -93,7 +93,7 @@ namespace Exiv2
not valid (does not look like data of the specific image type).
@caution This function is not thread safe and intended for exiv2 -pS for debugging.
*/
void printStructure(std::ostream& out,Exiv2::printStructureOption_e option);
void printStructure(std::ostream& out, PrintStructureOption option);
//@}
//! @name Accessors

@ -93,7 +93,7 @@ namespace Exiv2 {
not valid (does not look like data of the specific image type).
@caution This function is not thread safe and intended for exiv2 -pS for debugging.
*/
void printStructure(std::ostream& out,Exiv2::printStructureOption_e option);
void printStructure(std::ostream& out, PrintStructureOption option);
/*!
@brief Not supported. TIFF format does not contain a comment.

@ -252,7 +252,7 @@ namespace Action {
return 1;
} // Print::run
int Print::printStructure(std::ostream& out,Exiv2::printStructureOption_e option)
int Print::printStructure(std::ostream& out, Exiv2::PrintStructureOption option)
{
if (!Exiv2::fileExists(path_, true)) {
std::cerr << path_ << ": "

@ -36,6 +36,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "config.h"
#include "image.hpp"
#include "image_int.hpp"
#include "error.hpp"
#include "futils.hpp"
@ -167,7 +168,8 @@ namespace Exiv2 {
Image::~Image()
{
}
void Image::printStructure(std::ostream&, printStructureOption_e)
void Image::printStructure(std::ostream&, PrintStructureOption)
{
throw Error(13, io_->path());
}
@ -356,50 +358,6 @@ namespace Exiv2 {
return ImageFactory::checkMode(imageType_, metadataId);
}
std::string Image::stringFormat(const char* format, ...) const
{
std::string result;
int need = (int) std::strlen(format)*2; // initial guess
char* buffer = NULL;
int again = 4;
int rc = -1;
while (rc < 0 && again--) {
if ( buffer ) delete[] buffer;
need *= 2 ;
buffer = new char[need];
if ( buffer ) {
va_list args; // variable arg list
va_start(args, format); // args start after format
rc=vsnprintf(buffer,(unsigned int)need, format, args);
va_end(args); // free the args
}
}
if ( rc > 0 ) result = std::string(buffer) ;
if ( buffer ) delete[] buffer; // free buffer
return result;
}
std::string Image::binaryToString(DataBuf& buf,size_t size,size_t start /* = 0 */) const
{
std::string result = "";
byte* buff = buf.pData_;
size += start;
while (start < size) {
int c = (int) buff[start++] ;
bool bTrailingNull = c == 0 && start == size;
if ( !bTrailingNull ) {
if (c < ' ' || c > 127) c = '.' ;
result += (char) c ;
}
}
return result;
}
AccessMode ImageFactory::checkMode(int type, MetadataId metadataId)
{
const Registry* r = find(registry, type);
@ -619,3 +577,52 @@ namespace Exiv2 {
} // append
} // namespace Exiv2
namespace Exiv2 {
namespace Internal {
std::string stringFormat(const char* format, ...)
{
std::string result;
int need = (int) std::strlen(format)*2; // initial guess
char* buffer = NULL;
int again = 4;
int rc = -1;
while (rc < 0 && again--) {
if ( buffer ) delete[] buffer;
need *= 2 ;
buffer = new char[need];
if ( buffer ) {
va_list args; // variable arg list
va_start(args, format); // args start after format
rc=vsnprintf(buffer,(unsigned int)need, format, args);
va_end(args); // free the args
}
}
if ( rc > 0 ) result = std::string(buffer) ;
if ( buffer ) delete[] buffer; // free buffer
return result;
}
std::string binaryToString(DataBuf& buf, size_t size, size_t start /*=0*/)
{
std::string result = "";
byte* buff = buf.pData_;
size += start;
while (start < size) {
int c = (int) buff[start++] ;
bool bTrailingNull = c == 0 && start == size;
if ( !bTrailingNull ) {
if (c < ' ' || c > 127) c = '.' ;
result += (char) c ;
}
}
return result;
}
}} // namespace Internal, Exiv2

@ -0,0 +1,59 @@
// ***************************************************************** -*- C++ -*-
/*
* Copyright (C) 2004-2015 Andreas Huggel <ahuggel@gmx.net>
*
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
*/
/*!
@file image_int.hpp
@brief Internal image helpers
@version $Rev: 3777 $
@author Andreas Huggel (ahu)
<a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a>
@date 10-May-15, ahu: created
*/
#ifndef IMAGE_INT_HPP_
#define IMAGE_INT_HPP_
// *****************************************************************************
// included header files
#include "types.hpp"
// + standard includes
#include <string>
// *****************************************************************************
// namespace extensions
namespace Exiv2 {
namespace Internal {
// *****************************************************************************
// class definitions
/*!
@brief format a string in the pattern of \em sprintf \em .
*/
std::string stringFormat(const char* format, ...);
/*!
@brief format binary for display in \em printStructure() \em .
*/
std::string binaryToString(DataBuf& buf, size_t size, size_t start =0);
}} // namespace Internal, Exiv2
#endif // #ifndef IMAGE_INT_HPP_

@ -35,6 +35,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "config.h"
#include "jpgimage.hpp"
#include "image_int.hpp"
#include "error.hpp"
#include "futils.hpp"
@ -515,9 +516,9 @@ namespace Exiv2 {
return true ;
}
#define REPORT_MARKER if ( option == kpsBasic ) out << stringFormat("%8ld | %#02x %-5s",io_->tell(), marker,nm[marker].c_str())
#define REPORT_MARKER if ( option == kpsBasic ) out << Internal::stringFormat("%8ld | %#02x %-5s",io_->tell(), marker,nm[marker].c_str())
void JpegBase::printStructure(std::ostream& out,printStructureOption_e option)
void JpegBase::printStructure(std::ostream& out, PrintStructureOption option)
{
if (io_->open() != 0) throw Error(9, io_->path(), strError());
// Ensure that this is the correct image type
@ -589,7 +590,7 @@ namespace Exiv2 {
){
size = getUShort(buf.pData_, bigEndian);
}
if ( option == kpsBasic ) out << stringFormat(" | %7d ", size);
if ( option == kpsBasic ) out << Internal::stringFormat(" | %7d ", size);
// only print the signature for appn
if (marker >= app0_ && marker <= (app0_ | 0x0F)) {
@ -624,7 +625,7 @@ namespace Exiv2 {
bufRead = size;
}
} else if ( option == kpsBasic ) {
out << "| " << binaryToString(buf,32,size>0?2:0);
out << "| " << Internal::binaryToString(buf,32,size>0?2:0);
}
}

@ -37,6 +37,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "pngimage.hpp"
#include "jpgimage.hpp"
#include "image.hpp"
#include "image_int.hpp"
#include "basicio.hpp"
#include "error.hpp"
#include "futils.hpp"
@ -91,7 +92,7 @@ namespace Exiv2 {
return "image/png";
}
void PngImage::printStructure(std::ostream& out,printStructureOption_e option)
void PngImage::printStructure(std::ostream& out, PrintStructureOption option)
{
if (io_->open() != 0) {
throw Error(9, io_->path(), strError());
@ -145,10 +146,10 @@ namespace Exiv2 {
DataBuf buff(blen+1);
io_->read(buff.pData_,blen);
dataOffset -= blen ;
dataString = binaryToString(buff,blen);
dataString = Internal::binaryToString(buff, blen);
}
if ( option == kpsBasic ) out << stringFormat("%8d | %5d | %10s |%8d | ",(uint32_t)address, index++,chType,dOff) << dataString << std::endl;
if ( option == kpsBasic ) out << Internal::stringFormat("%8d | %5d | %10s |%8d | ",(uint32_t)address, index++,chType,dOff) << dataString << std::endl;
// for XMP, back up and read the whole block
const char* key = "XML:com.adobe.xmp" ;
size_t start = ::strlen(key);

@ -38,6 +38,7 @@ EXIV2_RCSID("@(#) $Id$")
#include "tiffvisitor_int.hpp"
#include "makernote_int.hpp"
#include "image.hpp"
#include "image_int.hpp"
#include "error.hpp"
#include "futils.hpp"
#include "types.hpp"
@ -438,14 +439,14 @@ namespace Exiv2 {
|| isRationalType(type)
;
}
static bool isPrintXMP(uint16_t type,Exiv2::printStructureOption_e option)
static bool isPrintXMP(uint16_t type, Exiv2::PrintStructureOption option)
{
return type == 700 && option == kpsXMP;
}
#define MIN(a,b) ((a)<(b))?(b):(a)
void TiffImage::printStructure(std::ostream& out,Exiv2::printStructureOption_e option)
void TiffImage::printStructure(std::ostream& out, Exiv2::PrintStructureOption option)
{
if (io_->open() != 0) throw Error(9, io_->path(), strError());
// Ensure that this is the correct image type
@ -468,13 +469,13 @@ namespace Exiv2 {
;
if ( option == kpsBasic ) {
out << stringFormat("STRUCTURE OF TIFF FILE (%c%c): ",c,c) << io_->path() << std::endl;
out << Internal::stringFormat("STRUCTURE OF TIFF FILE (%c%c): ",c,c) << io_->path() << std::endl;
out << " address | tag | type | count | offset | value\n";
}
uint32_t start = byteSwap4(dir,4,bSwap);
while ( start ) {
// if ( option == kpsBasic ) out << stringFormat("bSwap, start = %d %u\n",bSwap,offset);
// if ( option == kpsBasic ) out << Internal::stringFormat("bSwap, start = %d %u\n",bSwap,offset);
// Read top of directory
io_->seek(start,BasicIo::beg);
@ -516,7 +517,7 @@ namespace Exiv2 {
if ( option == kpsBasic ) {
uint32_t address = start + 2 + i*12 ;
out << stringFormat("%8u | %#06x %-25s |%10s |%9u |%9u | ",address,tag,tagName(tag,25),typeName(type),count,offset);
out << Internal::stringFormat("%8u | %#06x %-25s |%10s |%9u |%9u | ",address,tag,tagName(tag,25),typeName(type),count,offset);
if ( isShortType(type) ){
for ( uint16_t k = 0 ; k < kount ; k++ ) {
@ -542,7 +543,7 @@ namespace Exiv2 {
sp = " ";
}
} else if ( isStringType(type) ) {
out << sp << binaryToString(buf,kount);
out << sp << Internal::binaryToString(buf, kount);
}
sp = kount == count ? "" : " ...";
out << sp << std::endl;

Loading…
Cancel
Save