Blame lib/rafmetacontainer.cpp

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
}