Logo Search packages:      
Sourcecode: inkscape version File versions

WPGHeader.cpp

/* libwpg
 * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org)
 * Copyright (C) 2004 Marc Oude Kotte (marc@solcon.nl)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the 
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 
 * Boston, MA  02111-1301 USA
 *
 * For further information visit http://libwpg.sourceforge.net
 */

/* "This product is not manufactured, approved, or supported by
 * Corel Corporation or Corel Corporation Limited."
 */

#include "WPGHeader.h"
#include "libwpg_utils.h"

namespace
{
static inline unsigned short readU16( const void* p )
{
      const unsigned char* ptr = (const unsigned char*) p;
      return ptr[0]+(ptr[1]<<8);
}

static inline unsigned long readU32( const void* p )
{
      const unsigned char* ptr = (const unsigned char*) p;
      return ptr[0]+(ptr[1]<<8)+(ptr[2]<<16)+(ptr[3]<<24);
}
}

using namespace libwpg;

WPGHeader::WPGHeader()
{
            // create a sensible default header
            m_identifier[0] = 0xff;
            m_identifier[1] = 'W'; 
            m_identifier[2] = 'P'; 
            m_identifier[3] = 'C'; 
            m_productType = 0x01;
            m_fileType = 0x16;
            m_encryptionKey = 0x00;
            m_majorVersion = 0x02;
            m_minorVersion = 0x00;
            m_encryptionKey = 0;
            m_startOfPacketData = 0;
            m_entryCount = 0;
            m_resourceComplete = 0;
            m_encryptionBlockOffset = 0;
            m_fileSize = 0;
            m_encryptVersion = 0;
}

bool WPGHeader::load(WPGInputStream *input)
{
      input->seek(0);
      
      unsigned char prefix[26];
      long n = input->read(26, (char*)prefix);
      if(n < 26)
            return false;
      
      m_identifier[0] = prefix[0];  
      m_identifier[1] = prefix[1];  
      m_identifier[2] = prefix[2];  
      m_identifier[3] = prefix[3];  
      m_startOfDocument = readU32(prefix+4);
      m_productType = prefix[8];
      m_fileType = prefix[9];
      m_majorVersion = prefix[10];
      m_minorVersion = prefix[11];
      m_encryptionKey = readU16(prefix+12);
      m_startOfPacketData = readU16(prefix+14);
      
      WPG_DEBUG_MSG(("Header Identifier  = %c%c%c\n", m_identifier[1], 
      m_identifier[2], m_identifier[3]));
      WPG_DEBUG_MSG(("Product type       = 0x%x\n",  m_productType));
      WPG_DEBUG_MSG(("File type          = 0x%x\n",  m_fileType));
      WPG_DEBUG_MSG(("Major version      = 0x%x\n",  m_majorVersion));
      WPG_DEBUG_MSG(("Minor version      = 0x%x\n",  m_minorVersion));
      WPG_DEBUG_MSG(("Encryption key     = 0x%x\n",  m_encryptionKey));
      
      return true;
}

bool WPGHeader::isSupported() const
{
      return (
            (m_identifier[0] == 0xFF) &&
            (m_identifier[1] == 'W') &&
            (m_identifier[2] == 'P') &&
            (m_identifier[3] == 'C') &&
            (m_productType == 0x01) &&
            (m_fileType == 0x16) &&
            (m_encryptionKey == 0x00) &&     // we don't support encryption
            ((m_majorVersion == 0x02) || (m_majorVersion == 0x01)) &&
            (m_minorVersion == 0x00) 
);
}

unsigned long WPGHeader::startOfDocument() const
{
      return m_startOfDocument;
}

int WPGHeader::majorVersion() const
{
      return m_majorVersion;
}

Generated by  Doxygen 1.6.0   Back to index