Blame src/makernote_int.hpp

Packit Service 21b5d1
// ***************************************************************** -*- C++ -*-
Packit Service 21b5d1
/*
Packit Service 21b5d1
 * Copyright (C) 2004-2018 Exiv2 authors
Packit Service 21b5d1
 * This program is part of the Exiv2 distribution.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * This program is free software; you can redistribute it and/or
Packit Service 21b5d1
 * modify it under the terms of the GNU General Public License
Packit Service 21b5d1
 * as published by the Free Software Foundation; either version 2
Packit Service 21b5d1
 * of the License, or (at your option) any later version.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * This program is distributed in the hope that it will be useful,
Packit Service 21b5d1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 21b5d1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 21b5d1
 * GNU General Public License for more details.
Packit Service 21b5d1
 *
Packit Service 21b5d1
 * You should have received a copy of the GNU General Public License
Packit Service 21b5d1
 * along with this program; if not, write to the Free Software
Packit Service 21b5d1
 * Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
Packit Service 21b5d1
 */
Packit Service 21b5d1
/*!
Packit Service 21b5d1
  @file    makernote_int.hpp
Packit Service 21b5d1
  @brief   Makernote factory and registry, IFD makernote header, and camera
Packit Service 21b5d1
           vendor specific makernote implementations.
References:
Packit Service 21b5d1
  [1] ExifTool by Phil Harvey
Packit Service 21b5d1
  [2] Decoding raw digital photos in Linux by Dave Coffin
Packit Service 21b5d1
  @author  Andreas Huggel (ahu)
Packit Service 21b5d1
           ahuggel@gmx.net
Packit Service 21b5d1
  @date    11-Apr-06, ahu: created
Packit Service 21b5d1
 */
Packit Service 21b5d1
#ifndef MAKERNOTE_INT_HPP_
Packit Service 21b5d1
#define MAKERNOTE_INT_HPP_
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// included header files
Packit Service 21b5d1
#include "tifffwd_int.hpp"
Packit Service 21b5d1
#include "tags_int.hpp"
Packit Service 21b5d1
#include "ini.hpp"
Packit Service 21b5d1
#include "types.hpp"
Packit Service 21b5d1
Packit Service 21b5d1
// + standard includes
Packit Service 21b5d1
#include <string>
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// namespace extensions
Packit Service 21b5d1
namespace Exiv2 {
Packit Service 21b5d1
    namespace Internal {
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// function prototypes
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Determine the path to the Exiv2 configuration file
Packit Service 21b5d1
         */
Packit Service 21b5d1
        std::string getExiv2ConfigPath();
Packit Service 21b5d1
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Read value from Exiv2 configuration file
Packit Service 21b5d1
         */
Packit Service 21b5d1
        std::string readExiv2Config(const std::string& section,const std::string& value,const std::string& def);
Packit Service 21b5d1
Packit Service 21b5d1
Packit Service 21b5d1
// *****************************************************************************
Packit Service 21b5d1
// class definitions
Packit Service 21b5d1
Packit Service 21b5d1
    //! Type for a pointer to a function creating a makernote (image)
Packit Service 21b5d1
    typedef TiffComponent* (*NewMnFct)(uint16_t    tag,
Packit Service 21b5d1
                                       IfdId       group,
Packit Service 21b5d1
                                       IfdId       mnGroup,
Packit Service 21b5d1
                                       const byte* pData,
Packit Service 21b5d1
                                       uint32_t    size,
Packit Service 21b5d1
                                       ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Type for a pointer to a function creating a makernote (group)
Packit Service 21b5d1
    typedef TiffComponent* (*NewMnFct2)(uint16_t   tag,
Packit Service 21b5d1
                                        IfdId      group,
Packit Service 21b5d1
                                        IfdId      mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Makernote registry structure
Packit Service 21b5d1
    struct TiffMnRegistry {
Packit Service 21b5d1
        struct MakeKey;
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Compare a TiffMnRegistry structure with a key being the make
Packit Service 21b5d1
                 string from the image. The two are equal if
Packit Service 21b5d1
                 TiffMnRegistry::make_ equals a substring of the key of the
Packit Service 21b5d1
                 same size. E.g., registry = "OLYMPUS",
Packit Service 21b5d1
                 key = "OLYMPUS OPTICAL CO.,LTD" (found in the image) match.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        bool operator==(const std::string& key) const;
Packit Service 21b5d1
Packit Service 21b5d1
        //! Compare a TiffMnRegistry structure with a makernote group
Packit Service 21b5d1
        bool operator==(IfdId key) const;
Packit Service 21b5d1
Packit Service 21b5d1
        // DATA
Packit Service 21b5d1
        const char* make_;                      //!< Camera make
Packit Service 21b5d1
        IfdId       mnGroup_;                   //!< Group identifier
Packit Service 21b5d1
        NewMnFct    newMnFct_;                  //!< Makernote create function (image)
Packit Service 21b5d1
        NewMnFct2   newMnFct2_;                 //!< Makernote create function (group)
Packit Service 21b5d1
    };
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief TIFF makernote factory for concrete TIFF makernotes.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    class TiffMnCreator {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Create the Makernote for camera \em make and details from
Packit Service 21b5d1
                 the makernote entry itself if needed. Return a pointer to
Packit Service 21b5d1
                 the newly created TIFF component. Set tag and group of the
Packit Service 21b5d1
                 new component to \em tag and \em group. This method is used
Packit Service 21b5d1
                 when a makernote is parsed from the Exif block.
Packit Service 21b5d1
          @note  Ownership for the component is transferred to the caller,
Packit Service 21b5d1
                 who is responsible to delete the component. No smart pointer
Packit Service 21b5d1
                 is used to indicate this transfer here in order to reduce
Packit Service 21b5d1
                 file dependencies.
Packit Service 21b5d1
        */
Packit Service 21b5d1
        static TiffComponent* create(uint16_t           tag,
Packit Service 21b5d1
                                     IfdId              group,
Packit Service 21b5d1
                                     const std::string& make,
Packit Service 21b5d1
                                     const byte*        pData,
Packit Service 21b5d1
                                     uint32_t           size,
Packit Service 21b5d1
                                     ByteOrder          byteOrder);
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Create the Makernote for a given group. This method is used
Packit Service 21b5d1
                 when a makernote is written back from Exif tags.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        static TiffComponent* create(uint16_t           tag,
Packit Service 21b5d1
                                     IfdId              group,
Packit Service 21b5d1
                                     IfdId              mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    protected:
Packit Service 21b5d1
        //! Prevent destruction (needed if used as a policy class)
Packit Service 21b5d1
        ~TiffMnCreator() {}
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        static const TiffMnRegistry registry_[]; //
Packit Service 21b5d1
    }; // class TiffMnCreator
Packit Service 21b5d1
Packit Service 21b5d1
    //! Makernote header interface. This class is used with TIFF makernotes.
Packit Service 21b5d1
    class MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~MnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Read the header from a data buffer, return true if ok
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder) =0;
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Set the byte order for the makernote.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        virtual void setByteOrder(ByteOrder byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Return the size of the header (in bytes).
Packit Service 21b5d1
        virtual uint32_t size() const =0;
Packit Service 21b5d1
        //! Write the header to a data buffer, return the number of bytes written.
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper,
Packit Service 21b5d1
                               ByteOrder  byteOrder) const =0;
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Return the offset to the start of the Makernote IFD from
Packit Service 21b5d1
                 the start of the Makernote (= the start of the header).
Packit Service 21b5d1
         */
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Return the byte order for the makernote. If the return value is
Packit Service 21b5d1
                 invalidByteOrder, this means that the byte order of the the
Packit Service 21b5d1
                 image should be used for the makernote.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        virtual ByteOrder byteOrder() const;
Packit Service 21b5d1
        /*!
Packit Service 21b5d1
          @brief Return the base offset for the makernote IFD entries relative
Packit Service 21b5d1
                 to the start of the TIFF header. \em mnOffset is the offset
Packit Service 21b5d1
                 to the makernote from the start of the TIFF header.
Packit Service 21b5d1
         */
Packit Service 21b5d1
        virtual uint32_t baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class MnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of an Olympus Makernote
Packit Service 21b5d1
    class OlympusMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        OlympusMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~OlympusMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf header_;                //!< Data buffer for the makernote header
Packit Service 21b5d1
        static const byte signature_[]; //!< Olympus makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class OlympusMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of an Olympus II Makernote
Packit Service 21b5d1
    class Olympus2MnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        Olympus2MnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~Olympus2MnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        virtual uint32_t baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf header_;                //!< Data buffer for the makernote header
Packit Service 21b5d1
        static const byte signature_[]; //!< Olympus makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class Olympus2MnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Fujifilm Makernote
Packit Service 21b5d1
    class FujiMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        FujiMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~FujiMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        // setByteOrder not implemented
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t  size() const;
Packit Service 21b5d1
        virtual uint32_t  write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t  ifdOffset() const;
Packit Service 21b5d1
        virtual ByteOrder byteOrder() const;
Packit Service 21b5d1
        virtual uint32_t  baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf header_;                //!< Data buffer for the makernote header
Packit Service 21b5d1
        static const byte signature_[]; //!< Fujifilm makernote header signature
Packit Service 21b5d1
        static const ByteOrder byteOrder_; //!< Byteorder for makernote (always II)
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class FujiMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Nikon 2 Makernote
Packit Service 21b5d1
    class Nikon2MnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        Nikon2MnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~Nikon2MnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                   //!< Raw header data
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature_[]; //!< Nikon 2 makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class Nikon2MnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Nikon 3 Makernote
Packit Service 21b5d1
    class Nikon3MnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        Nikon3MnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~Nikon3MnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        virtual void setByteOrder(ByteOrder byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t  size()      const;
Packit Service 21b5d1
        virtual uint32_t  write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t  ifdOffset() const;
Packit Service 21b5d1
        virtual ByteOrder byteOrder() const;
Packit Service 21b5d1
        virtual uint32_t  baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                   //!< Raw header data
Packit Service 21b5d1
        ByteOrder byteOrder_;           //!< Byteorder for makernote
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature_[]; //!< Nikon 3 makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class Nikon3MnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Panasonic Makernote
Packit Service 21b5d1
    class PanasonicMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        PanasonicMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~PanasonicMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                   //!< Raw header data
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature_[]; //!< Panasonic makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class PanasonicMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of an Pentax DNG Makernote
Packit Service 21b5d1
    class PentaxDngMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        PentaxDngMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~PentaxDngMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        virtual uint32_t baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf header_;                //!< Data buffer for the makernote header
Packit Service 21b5d1
        static const byte signature_[]; //!< Pentax DNG makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class PentaxDngMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of an Pentax Makernote
Packit Service 21b5d1
    class PentaxMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        PentaxMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~PentaxMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf header_;                //!< Data buffer for the makernote header
Packit Service 21b5d1
        static const byte signature_[]; //!< Pentax makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class PentaxMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Samsung Makernote, only used for the relative offset
Packit Service 21b5d1
    class SamsungMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        SamsungMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t baseOffset(uint32_t mnOffset) const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class SamsungMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Sigma Makernote
Packit Service 21b5d1
    class SigmaMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        SigmaMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~SigmaMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                    //!< Raw header data
Packit Service 21b5d1
        uint32_t start_;                 //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature1_[]; //!< Sigma makernote header signature 1
Packit Service 21b5d1
        static const byte signature2_[]; //!< Sigma makernote header signature 2
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class SigmaMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Sony Makernote
Packit Service 21b5d1
    class SonyMnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        SonyMnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~SonyMnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                   //!< Raw header data
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature_[]; //!< Sony makernote header signature
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class SonyMnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    //! Header of a Casio2 Makernote
Packit Service 21b5d1
    class Casio2MnHeader : public MnHeader {
Packit Service 21b5d1
    public:
Packit Service 21b5d1
        //! @name Creators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        //! Default constructor
Packit Service 21b5d1
        Casio2MnHeader();
Packit Service 21b5d1
        //! Virtual destructor.
Packit Service 21b5d1
        virtual ~Casio2MnHeader();
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Manipulators
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual bool read(const byte* pData,
Packit Service 21b5d1
                          uint32_t    size,
Packit Service 21b5d1
                          ByteOrder   byteOrder);
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! @name Accessors
Packit Service 21b5d1
        //@{
Packit Service 21b5d1
        virtual uint32_t size() const;
Packit Service 21b5d1
        virtual uint32_t write(IoWrapper& ioWrapper, ByteOrder byteOrder) const;
Packit Service 21b5d1
        virtual uint32_t ifdOffset() const;
Packit Service 21b5d1
        virtual ByteOrder byteOrder() const;
Packit Service 21b5d1
        //@}
Packit Service 21b5d1
        //! Return the size of the makernote header signature
Packit Service 21b5d1
        static uint32_t sizeOfSignature();
Packit Service 21b5d1
Packit Service 21b5d1
    private:
Packit Service 21b5d1
        DataBuf buf_;                   //!< Raw header data
Packit Service 21b5d1
        uint32_t start_;                //!< Start of the mn IFD rel. to mn start
Packit Service 21b5d1
        static const byte signature_[]; //!< Casio makernote header signature
Packit Service 21b5d1
        static const ByteOrder byteOrder_; //!< Byteorder for makernote (always big endian)
Packit Service 21b5d1
Packit Service 21b5d1
    }; // class Casio2MnHeader
Packit Service 21b5d1
Packit Service 21b5d1
    // *****************************************************************************
Packit Service 21b5d1
// template, inline and free functions
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a simple IFD makernote (Canon, Minolta, Nikon1)
Packit Service 21b5d1
    TiffComponent* newIfdMn(uint16_t    tag,
Packit Service 21b5d1
                            IfdId       group,
Packit Service 21b5d1
                            IfdId       mnGroup,
Packit Service 21b5d1
                            const byte* pData,
Packit Service 21b5d1
                            uint32_t    size,
Packit Service 21b5d1
                            ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a simple IFD makernote (Canon, Minolta, Nikon1)
Packit Service 21b5d1
    TiffComponent* newIfdMn2(uint16_t tag,
Packit Service 21b5d1
                             IfdId    group,
Packit Service 21b5d1
                             IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Olympus makernote
Packit Service 21b5d1
    TiffComponent* newOlympusMn(uint16_t    tag,
Packit Service 21b5d1
                                IfdId       group,
Packit Service 21b5d1
                                IfdId       mnGroup,
Packit Service 21b5d1
                                const byte* pData,
Packit Service 21b5d1
                                uint32_t    size,
Packit Service 21b5d1
                                ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Olympus makernote
Packit Service 21b5d1
    TiffComponent* newOlympusMn2(uint16_t tag,
Packit Service 21b5d1
                                 IfdId    group,
Packit Service 21b5d1
                                 IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Olympus II makernote
Packit Service 21b5d1
    TiffComponent* newOlympus2Mn2(uint16_t tag,
Packit Service 21b5d1
                                 IfdId     group,
Packit Service 21b5d1
                                 IfdId     mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Fujifilm makernote
Packit Service 21b5d1
    TiffComponent* newFujiMn(uint16_t    tag,
Packit Service 21b5d1
                             IfdId       group,
Packit Service 21b5d1
                             IfdId       mnGroup,
Packit Service 21b5d1
                             const byte* pData,
Packit Service 21b5d1
                             uint32_t    size,
Packit Service 21b5d1
                             ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Fujifilm makernote
Packit Service 21b5d1
    TiffComponent* newFujiMn2(uint16_t tag,
Packit Service 21b5d1
                              IfdId    group,
Packit Service 21b5d1
                              IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Function to create a Nikon makernote. This will create the
Packit Service 21b5d1
             appropriate Nikon 1, 2 or 3 makernote, based on the arguments.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    TiffComponent* newNikonMn(uint16_t    tag,
Packit Service 21b5d1
                              IfdId       group,
Packit Service 21b5d1
                              IfdId       mnGroup,
Packit Service 21b5d1
                              const byte* pData,
Packit Service 21b5d1
                              uint32_t    size,
Packit Service 21b5d1
                              ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Nikon2 makernote
Packit Service 21b5d1
    TiffComponent* newNikon2Mn2(uint16_t tag,
Packit Service 21b5d1
                                IfdId    group,
Packit Service 21b5d1
                                IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Nikon3 makernote
Packit Service 21b5d1
    TiffComponent* newNikon3Mn2(uint16_t tag,
Packit Service 21b5d1
                                IfdId    group,
Packit Service 21b5d1
                                IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Panasonic makernote
Packit Service 21b5d1
    TiffComponent* newPanasonicMn(uint16_t    tag,
Packit Service 21b5d1
                                  IfdId       group,
Packit Service 21b5d1
                                  IfdId       mnGroup,
Packit Service 21b5d1
                                  const byte* pData,
Packit Service 21b5d1
                                  uint32_t    size,
Packit Service 21b5d1
                                  ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Panasonic makernote
Packit Service 21b5d1
    TiffComponent* newPanasonicMn2(uint16_t tag,
Packit Service 21b5d1
                                   IfdId    group,
Packit Service 21b5d1
                                   IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Pentax makernote
Packit Service 21b5d1
    TiffComponent* newPentaxMn(uint16_t    tag,
Packit Service 21b5d1
                               IfdId       group,
Packit Service 21b5d1
                               IfdId       mnGroup,
Packit Service 21b5d1
                               const byte* pData,
Packit Service 21b5d1
                               uint32_t    size,
Packit Service 21b5d1
                               ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Pentax makernote
Packit Service 21b5d1
    TiffComponent* newPentaxMn2(uint16_t tag,
Packit Service 21b5d1
                                IfdId    group,
Packit Service 21b5d1
                                IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create an Pentax DNG makernote
Packit Service 21b5d1
    TiffComponent* newPentaxDngMn2(uint16_t tag,
Packit Service 21b5d1
                                IfdId    group,
Packit Service 21b5d1
                                IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Samsung makernote
Packit Service 21b5d1
    TiffComponent* newSamsungMn(uint16_t    tag,
Packit Service 21b5d1
                                IfdId       group,
Packit Service 21b5d1
                                IfdId       mnGroup,
Packit Service 21b5d1
                                const byte* pData,
Packit Service 21b5d1
                                uint32_t    size,
Packit Service 21b5d1
                                ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Samsung makernote
Packit Service 21b5d1
    TiffComponent* newSamsungMn2(uint16_t tag,
Packit Service 21b5d1
                                 IfdId    group,
Packit Service 21b5d1
                                 IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Sigma makernote
Packit Service 21b5d1
    TiffComponent* newSigmaMn(uint16_t    tag,
Packit Service 21b5d1
                              IfdId       group,
Packit Service 21b5d1
                              IfdId       mnGroup,
Packit Service 21b5d1
                              const byte* pData,
Packit Service 21b5d1
                              uint32_t    size,
Packit Service 21b5d1
                              ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Sigma makernote
Packit Service 21b5d1
    TiffComponent* newSigmaMn2(uint16_t tag,
Packit Service 21b5d1
                               IfdId    group,
Packit Service 21b5d1
                               IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Sony makernote
Packit Service 21b5d1
    TiffComponent* newSonyMn(uint16_t    tag,
Packit Service 21b5d1
                             IfdId       group,
Packit Service 21b5d1
                             IfdId       mnGroup,
Packit Service 21b5d1
                             const byte* pData,
Packit Service 21b5d1
                             uint32_t    size,
Packit Service 21b5d1
                             ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Sony1 makernote
Packit Service 21b5d1
    TiffComponent* newSony1Mn2(uint16_t tag,
Packit Service 21b5d1
                               IfdId    group,
Packit Service 21b5d1
                               IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Sony2 makernote
Packit Service 21b5d1
    TiffComponent* newSony2Mn2(uint16_t tag,
Packit Service 21b5d1
                               IfdId    group,
Packit Service 21b5d1
                               IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Casio2 makernote
Packit Service 21b5d1
    TiffComponent* newCasioMn(uint16_t    tag,
Packit Service 21b5d1
                             IfdId       group,
Packit Service 21b5d1
                             IfdId       mnGroup,
Packit Service 21b5d1
                             const byte* pData,
Packit Service 21b5d1
                             uint32_t    size,
Packit Service 21b5d1
                             ByteOrder   byteOrder);
Packit Service 21b5d1
Packit Service 21b5d1
    //! Function to create a Casio2 makernote
Packit Service 21b5d1
    TiffComponent* newCasio2Mn2(uint16_t tag,
Packit Service 21b5d1
                               IfdId    group,
Packit Service 21b5d1
                               IfdId    mnGroup);
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Function to select cfg + def of the Sony Camera Settings complex binary array.
Packit Service 21b5d1
Packit Service 21b5d1
      @param tag Tag number of the binary array
Packit Service 21b5d1
      @param pData Pointer to the raw array data.
Packit Service 21b5d1
      @param size Size of the array data.
Packit Service 21b5d1
      @param pRoot Pointer to the root component of the TIFF tree.
Packit Service 21b5d1
      @return An index into the array set, -1 if no match was found.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    int sonyCsSelector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Function to select cfg + def of a Nikon complex binary array.
Packit Service 21b5d1
Packit Service 21b5d1
      @param tag Tag number of the binary array
Packit Service 21b5d1
      @param pData Pointer to the raw array data.
Packit Service 21b5d1
      @param size Size of the array data.
Packit Service 21b5d1
      @param pRoot Pointer to the root component of the TIFF tree.
Packit Service 21b5d1
      @return An index into the array set, -1 if no match was found.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    int nikonSelector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Function to select cfg + def of a Nikon complex binary array.
Packit Service 21b5d1
Packit Service 21b5d1
      @param tag Tag number of the binary array
Packit Service 21b5d1
      @param pData Pointer to the raw array data.
Packit Service 21b5d1
      @param size Size of the array data.
Packit Service 21b5d1
      @param pRoot Pointer to the root component of the TIFF tree.
Packit Service 21b5d1
      @return An index into the array set, -1 if no match was found.
Packit Service 21b5d1
     */
Packit Service 21b5d1
     int nikonAf2Selector(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
Packit Service 21b5d1
Packit Service 21b5d1
    /*!
Packit Service 21b5d1
      @brief Encrypt and decrypt Nikon data.
Packit Service 21b5d1
Packit Service 21b5d1
      Checks the version of the Nikon data array and en/decrypts (portions of) it as
Packit Service 21b5d1
      needed. (The Nikon encryption algorithm is symmetric.)
Packit Service 21b5d1
Packit Service 21b5d1
      @note This function requires access to other components of the composite, it
Packit Service 21b5d1
            should only be called after all other components are read.
Packit Service 21b5d1
Packit Service 21b5d1
      @param tag Tag number of the binary array
Packit Service 21b5d1
      @param pData Pointer to the start of the data to en/decrypt.
Packit Service 21b5d1
      @param size Size of the data buffer.
Packit Service 21b5d1
      @param pRoot Pointer to the root element of the composite.
Packit Service 21b5d1
      @return En/decrypted data. Ownership of the memory is passed to the caller.
Packit Service 21b5d1
              The buffer may be empty in case no decryption was needed.
Packit Service 21b5d1
     */
Packit Service 21b5d1
    DataBuf nikonCrypt(uint16_t tag, const byte* pData, uint32_t size, TiffComponent* const pRoot);
Packit Service 21b5d1
Packit Service 21b5d1
}}                                      // namespace Internal, Exiv2
Packit Service 21b5d1
Packit Service 21b5d1
#endif                                  // #ifndef MAKERNOTE_INT_HPP_