From 09c734fbcd98b3ae880a90d669569c95242f477e Mon Sep 17 00:00:00 2001 From: Robin Mills Date: Thu, 17 Mar 2016 23:45:58 +0000 Subject: [PATCH] #1108. Refactored the IPTC printStructure code from png/jpeg/tiff into iptc.cpp --- include/exiv2/iptc.hpp | 4 ++++ src/iptc.cpp | 29 +++++++++++++++++++++++++++++ src/jpgimage.cpp | 19 +------------------ src/pngimage.cpp | 17 +---------------- src/tiffimage.cpp | 17 ++--------------- 5 files changed, 37 insertions(+), 49 deletions(-) diff --git a/include/exiv2/iptc.hpp b/include/exiv2/iptc.hpp index 97b3a53e..f5e0b388 100644 --- a/include/exiv2/iptc.hpp +++ b/include/exiv2/iptc.hpp @@ -273,6 +273,10 @@ namespace Exiv2 { @brief Return the metadata charset name or 0 */ const char *detectCharset() const; + /*! + @brief dump iptc formatted binary data (used by printStructure kpsRecursive) + */ + static void printStructure(std::ostream& out, const byte* bytes,const size_t size,uint32_t depth); //@} private: diff --git a/src/iptc.cpp b/src/iptc.cpp index ac6a5eef..facee46a 100644 --- a/src/iptc.cpp +++ b/src/iptc.cpp @@ -36,6 +36,7 @@ EXIV2_RCSID("@(#) $Id$") #include "value.hpp" #include "datasets.hpp" #include "jpgimage.hpp" +#include "image_int.hpp" // + standard includes #include @@ -352,6 +353,34 @@ namespace Exiv2 { return iptcMetadata_.erase(pos); } + static std::string indent(int d) + { + std::string result ; + if ( d > 0 ) + while ( d--) + result += " "; + return result; + } + + void IptcData::printStructure(std::ostream& out, const byte* bytes,const size_t size,uint32_t depth) + { + uint32_t i = 0 ; + while ( i < size-3 && bytes[i] != 0x1c ) i++; + depth++; + out << indent(depth) << "Record | DataSet | Name | Length | Data" << std::endl; + while ( bytes[i] == 0x1c && i < size-3 ) { + char buff[100]; + uint16_t record = bytes[i+1]; + uint16_t dataset = bytes[i+2]; + uint16_t len = getUShort(bytes+i+3,bigEndian); + sprintf(buff," %6d | %7d | %-24s | %6d | ",record,dataset, Exiv2::IptcDataSets::dataSetName(dataset,record).c_str(), len); + + out << buff << Internal::binaryToString(bytes,(len>40?40:len),i+5) << (len>40?"...":"") << std::endl; + i += 5 + len; + } + depth--; + } + const char *IptcData::detectCharset() const { const_iterator pos = findKey(IptcKey("Iptc.Envelope.CharacterSet")); diff --git a/src/jpgimage.cpp b/src/jpgimage.cpp index 1f800a90..90a45646 100644 --- a/src/jpgimage.cpp +++ b/src/jpgimage.cpp @@ -719,25 +719,8 @@ namespace Exiv2 { } if ( bPS ) { - uint32_t i = 0 ; - byte* bytes = exif; - DataBuf dataBuf(bytes,size); - while ( i < size-3 && exif[i] != 0x1c ) i++; - depth++; - out << " Record | DataSet | Name | Length | Data" << std::endl; - while ( bytes[i] == 0x1c && i < size-3 ) { - char buff[100]; - uint16_t record = bytes[i+1]; - uint16_t dataset = bytes[i+2]; - uint16_t len = getUShort(bytes+i+3,bigEndian); - sprintf(buff," %6d | %7d | %-24s | %6d | ",record,dataset, Exiv2::IptcDataSets::dataSetName(dataset,record).c_str(), len); - - out << buff << Internal::binaryToString(dataBuf,len,i+5) << std::endl; - i += 5 + len; - } - depth--; + IptcData::printStructure(out,exif,size,depth); } else { - // create a copy on write memio object with the data, then print the structure BasicIo::AutoPtr p = BasicIo::AutoPtr(new MemIo(exif+start,size-start)); if ( start < max ) TiffImage::printTiffStructure(*p,out,option,depth); diff --git a/src/pngimage.cpp b/src/pngimage.cpp index 74caee12..55a80816 100644 --- a/src/pngimage.cpp +++ b/src/pngimage.cpp @@ -311,22 +311,7 @@ namespace Exiv2 { } if ( bIptc ) { - const byte* bytes = dataBuf.pData_; - uint32_t l = (uint32_t) dataBuf.size_ ; // std::strlen(bytes)+2; - uint32_t i = 0 ; - depth++; - out << indent(depth) << "Record | DataSet | Name | Length | Data" << std::endl; - while ( bytes[i] == 0x1c && i < l-3 ) { - char buff[100]; - uint16_t record = bytes[i+1]; - uint16_t dataset = bytes[i+2]; - uint16_t len = getUShort(bytes+i+3,bigEndian); - sprintf(buff,"%6d | %7d | %-24s | %6d | ",record,dataset, Exiv2::IptcDataSets::dataSetName(dataset,record).c_str(), len); - - out << indent(depth) << buff << Internal::binaryToString(dataBuf,len,i+5) << std::endl; - i += 5 + len; - } - depth--; + IptcData::printStructure(out,dataBuf.pData_,dataBuf.size_,depth); } } delete [] data; diff --git a/src/tiffimage.cpp b/src/tiffimage.cpp index 8efcb74b..831bce1c 100644 --- a/src/tiffimage.cpp +++ b/src/tiffimage.cpp @@ -584,21 +584,8 @@ namespace Exiv2 { byte* bytes=new byte[count] ; // allocate memory io.read(bytes,count) ; // read io.seek(restore,BasicIo::beg); // restore - - uint32_t i = 0 ; - while ( i < count-3 && bytes[i] != 0x1c ) i++; - out << " Record | DataSet | Name | Length | Data" << std::endl; - while ( bytes[i] == 0x1c && i < size-3 ) { - char buff[100]; - uint16_t record = bytes[i+1]; - uint16_t dataset = bytes[i+2]; - uint16_t len = getUShort(bytes+i+3,bigEndian); - sprintf(buff," %6d | %7d | %-24s | %6d | ",record,dataset, Exiv2::IptcDataSets::dataSetName(dataset,record).c_str(), len); - - out << buff << Internal::binaryToString(bytes,(len>40?40:len),i+5) << (len>40?"...":"") << std::endl; - i += 5 + len; - } - delete[] bytes; + IptcData::printStructure(out,bytes,count,depth); + delete[] bytes; // free } }