|
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: */
|