Blame src/lib/WPGHeader.cpp

Packit a7402c
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
Packit a7402c
/* libwpg
Packit a7402c
 * Version: MPL 2.0 / LGPLv2.1+
Packit a7402c
 *
Packit a7402c
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit a7402c
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit a7402c
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit a7402c
 *
Packit a7402c
 * Major Contributor(s):
Packit a7402c
 * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
Packit a7402c
 * Copyright (C) 2004 Marc Oude Kotte (marc@solcon.nl)
Packit a7402c
 *
Packit a7402c
 * For minor contributions see the git repository.
Packit a7402c
 *
Packit a7402c
 * Alternatively, the contents of this file may be used under the terms
Packit a7402c
 * of the GNU Lesser General Public License Version 2.1 or later
Packit a7402c
 * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are
Packit a7402c
 * applicable instead of those above.
Packit a7402c
 *
Packit a7402c
 * For further information visit http://libwpg.sourceforge.net
Packit a7402c
 */
Packit a7402c
Packit a7402c
/* "This product is not manufactured, approved, or supported by
Packit a7402c
 * Corel Corporation or Corel Corporation Limited."
Packit a7402c
 */
Packit a7402c
Packit a7402c
#include "WPGHeader.h"
Packit a7402c
#include "libwpg_utils.h"
Packit a7402c
Packit a7402c
namespace
Packit a7402c
{
Packit a7402c
static inline unsigned short readU16(const void *p)
Packit a7402c
{
Packit a7402c
	const unsigned char *ptr = (const unsigned char *) p;
Packit a7402c
	return (unsigned short)(ptr[0]+(ptr[1]<<8));
Packit a7402c
}
Packit a7402c
Packit a7402c
static inline unsigned long readU32(const void *p)
Packit a7402c
{
Packit a7402c
	const unsigned char *ptr = (const unsigned char *) p;
Packit a7402c
	return (unsigned long)(unsigned)(ptr[0]+(ptr[1]<<8)+(ptr[2]<<16)+(ptr[3]<<24));
Packit a7402c
}
Packit a7402c
}
Packit a7402c
Packit a7402c
WPGHeader::WPGHeader() :
Packit a7402c
	m_identifier(),
Packit a7402c
	m_startOfDocument(0L),
Packit a7402c
	m_productType(0x01),
Packit a7402c
	m_fileType(0x16),
Packit a7402c
	m_majorVersion(0x02),
Packit a7402c
	m_minorVersion(0x00),
Packit a7402c
	m_encryptionKey(0x00),
Packit a7402c
	m_startOfPacketData(0)
Packit a7402c
{
Packit a7402c
	m_identifier[0] = 0xff;
Packit a7402c
	m_identifier[1] = 'W';
Packit a7402c
	m_identifier[2] = 'P';
Packit a7402c
	m_identifier[3] = 'C';
Packit a7402c
}
Packit a7402c
Packit a7402c
bool WPGHeader::load(librevenge::RVNGInputStream *input)
Packit a7402c
{
Packit a7402c
//	input->seek(0, librevenge::RVNG_SEEK_SET);
Packit a7402c
Packit a7402c
	unsigned long n = 0;
Packit a7402c
	unsigned char const *prefix = input->read(26, n);
Packit a7402c
	if (n < 26)
Packit a7402c
		return false;
Packit a7402c
Packit a7402c
	m_identifier[0] = prefix[0];
Packit a7402c
	m_identifier[1] = prefix[1];
Packit a7402c
	m_identifier[2] = prefix[2];
Packit a7402c
	m_identifier[3] = prefix[3];
Packit a7402c
	m_startOfDocument = readU32(prefix+4);
Packit a7402c
	m_productType = prefix[8];
Packit a7402c
	m_fileType = prefix[9];
Packit a7402c
	m_majorVersion = prefix[10];
Packit a7402c
	m_minorVersion = prefix[11];
Packit a7402c
	m_encryptionKey = readU16(prefix+12);
Packit a7402c
	m_startOfPacketData = readU16(prefix+14);
Packit a7402c
Packit a7402c
	WPG_DEBUG_MSG(("Header Identifier  = %c%c%c\n", m_identifier[1],
Packit a7402c
	               m_identifier[2], m_identifier[3]));
Packit a7402c
	WPG_DEBUG_MSG(("Product type       = 0x%x\n",  m_productType));
Packit a7402c
	WPG_DEBUG_MSG(("File type          = 0x%x\n",  m_fileType));
Packit a7402c
	WPG_DEBUG_MSG(("Major version      = 0x%x\n",  m_majorVersion));
Packit a7402c
	WPG_DEBUG_MSG(("Minor version      = 0x%x\n",  m_minorVersion));
Packit a7402c
	WPG_DEBUG_MSG(("Encryption key     = 0x%x\n",  m_encryptionKey));
Packit a7402c
Packit a7402c
	return true;
Packit a7402c
}
Packit a7402c
Packit a7402c
bool WPGHeader::isSupported() const
Packit a7402c
{
Packit a7402c
	return (
Packit a7402c
	           (m_identifier[0] == 0xFF) &&
Packit a7402c
	           (m_identifier[1] == 'W') &&
Packit a7402c
	           (m_identifier[2] == 'P') &&
Packit a7402c
	           (m_identifier[3] == 'C') &&
Packit a7402c
	           (m_productType == 0x01) &&
Packit a7402c
	           (m_fileType == 0x16) &&
Packit a7402c
	           (m_encryptionKey == 0x00) &&     // we don't support encryption
Packit a7402c
	           ((m_majorVersion == 0x02) || (m_majorVersion == 0x01)) &&
Packit a7402c
	           (m_minorVersion == 0x00)
Packit a7402c
	       );
Packit a7402c
}
Packit a7402c
Packit a7402c
unsigned long WPGHeader::startOfDocument() const
Packit a7402c
{
Packit a7402c
	return m_startOfDocument;
Packit a7402c
}
Packit a7402c
Packit a7402c
int WPGHeader::majorVersion() const
Packit a7402c
{
Packit a7402c
	return m_majorVersion;
Packit a7402c
}
Packit a7402c
/* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */