|
rpm-build |
d2b433 |
/* -*- tab-width:4; c-basic-offset:4 -*- */
|
|
rpm-build |
d2b433 |
/*
|
|
rpm-build |
d2b433 |
* libopenraw - rafcontainer.cpp
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* Copyright (C) 2011-2017 Hubert Figuière
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* This library is free software: you can redistribute it and/or
|
|
rpm-build |
d2b433 |
* modify it under the terms of the GNU Lesser General Public License
|
|
rpm-build |
d2b433 |
* as published by the Free Software Foundation, either version 3 of
|
|
rpm-build |
d2b433 |
* the License, or (at your option) any later version.
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* This library is distributed in the hope that it will be useful,
|
|
rpm-build |
d2b433 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
rpm-build |
d2b433 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
rpm-build |
d2b433 |
* Lesser General Public License for more details.
|
|
rpm-build |
d2b433 |
*
|
|
rpm-build |
d2b433 |
* You should have received a copy of the GNU Lesser General Public
|
|
rpm-build |
d2b433 |
* License along with this library. If not, see
|
|
rpm-build |
d2b433 |
* <http://www.gnu.org/licenses/>.
|
|
rpm-build |
d2b433 |
*/
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <stdlib.h>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include <cstdint>
|
|
rpm-build |
d2b433 |
#include <string>
|
|
rpm-build |
d2b433 |
#include <utility>
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
#include "trace.hpp"
|
|
rpm-build |
d2b433 |
#include "metavalue.hpp"
|
|
rpm-build |
d2b433 |
#include "rafmetacontainer.hpp"
|
|
rpm-build |
d2b433 |
#include "io/stream.hpp"
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
namespace OpenRaw {
|
|
rpm-build |
d2b433 |
namespace Internals {
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
RafMetaValue::RafMetaValue(uint16_t tag, uint16_t size, const MetaValue & v)
|
|
rpm-build |
d2b433 |
: m_tag(tag)
|
|
rpm-build |
d2b433 |
, m_size(size)
|
|
rpm-build |
d2b433 |
, m_value(v)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
RafMetaValue::~RafMetaValue()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
RafMetaContainer::RafMetaContainer(const IO::Stream::Ptr &_file)
|
|
rpm-build |
d2b433 |
: RawContainer(_file, 0)
|
|
rpm-build |
d2b433 |
, m_count(0)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
setEndian(ENDIAN_BIG);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
uint32_t RafMetaContainer::count()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
if(m_count == 0) {
|
|
rpm-build |
d2b433 |
_read();
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
return m_count;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
RafMetaValue::Ref RafMetaContainer::getValue(uint16_t tag)
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
if(m_tags.empty()) {
|
|
rpm-build |
d2b433 |
_read();
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
std::map<uint16_t, RafMetaValue::Ref>::const_iterator iter = m_tags.find(tag);
|
|
rpm-build |
d2b433 |
if(iter != m_tags.end()) {
|
|
rpm-build |
d2b433 |
return iter->second;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
return RafMetaValue::Ref();
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
void RafMetaContainer::_read()
|
|
rpm-build |
d2b433 |
{
|
|
rpm-build |
d2b433 |
auto result = readUInt32(m_file);
|
|
rpm-build |
d2b433 |
if (result.empty()) {
|
|
rpm-build |
d2b433 |
LOGERR("Couldn't read RAF meta count\n");
|
|
rpm-build |
d2b433 |
return;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
m_count = result.unwrap();
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
for(uint32_t i = 0; i < m_count; i++) {
|
|
rpm-build |
d2b433 |
auto result16 = readUInt16(m_file);
|
|
rpm-build |
d2b433 |
if (result16.empty()) {
|
|
rpm-build |
d2b433 |
return;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
uint16_t tag = result16.unwrap();
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
result16 = readUInt16(m_file);
|
|
rpm-build |
d2b433 |
if (result16.empty()) {
|
|
rpm-build |
d2b433 |
return;
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
uint16_t size = result16.unwrap();
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
MetaValue::value_t v;
|
|
rpm-build |
d2b433 |
if(size == 4) {
|
|
rpm-build |
d2b433 |
auto result32 = readUInt32(m_file);
|
|
rpm-build |
d2b433 |
if(result32.ok()) {
|
|
rpm-build |
d2b433 |
v = MetaValue::value_t(result32.unwrap());
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
else {
|
|
rpm-build |
d2b433 |
char *content;
|
|
rpm-build |
d2b433 |
content = (char*)calloc(1, size + 1);
|
|
rpm-build |
d2b433 |
content[size] = 0;
|
|
rpm-build |
d2b433 |
m_file->read(content, size);
|
|
rpm-build |
d2b433 |
v = MetaValue::value_t(std::string(content));
|
|
rpm-build |
d2b433 |
free(content);
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
RafMetaValue::Ref value = std::make_shared<RafMetaValue>(tag, size, MetaValue(v));
|
|
rpm-build |
d2b433 |
m_tags.insert(std::make_pair(tag, value));
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
|
|
rpm-build |
d2b433 |
}
|
|
rpm-build |
d2b433 |
}
|