/* This file is part of the LibMSWrite Library Copyright (C) 2001-2003 Clarence Dang This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License Version 2 as published by the Free Software Foundation. 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 Version 2 for more details. You should have received a copy of the GNU Library General Public License Version 2 along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. LibMSWrite Project Website: http://sourceforge.net/projects/libmswrite/ */ /* * structures_generated - Internal MS Write file structures * This file was generated by make_structures_generated 0.51pre 2003/07/09. * ALL CHANGES MADE TO THIS FILE "WILL BE LOST IN TIME LIKE TEARS IN RAIN"! */ #include #include #include #include "structures_generated.h" #include "structures_private.h" // for forward references to embedded structures #include "structures.h" // for forward references to embedded structures namespace MSWrite { // -------------------- BEGIN HeaderGenerated -------------------- HeaderGenerated::HeaderGenerated () { // --- set defaults for variables -- m_magic = (Word) (0xBE31/*Write 3.0*/); m_zero = (Word) (0); m_magic2 = (Word) (0xAB00); memset (m_zero2, (Word) (0), 4 * sizeof (Word)); // no default for m_numCharBytesPlus128 // no default for m_pageParaInfo // no default for m_pageFootnoteTable // no default for m_pageSectionProperty // no default for m_pageSectionTable // no default for m_pagePageTable // no default for m_pageFontTable memset (m_zero3, (Word) (0), 33 * sizeof (Word)); // no default for m_numPages } HeaderGenerated::~HeaderGenerated () { } HeaderGenerated &HeaderGenerated::operator= (const HeaderGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_magic = rhs.m_magic; m_zero = rhs.m_zero; m_magic2 = rhs.m_magic2; memcpy (m_zero2, rhs.m_zero2, 4 * sizeof (Word)); m_numCharBytesPlus128 = rhs.m_numCharBytesPlus128; m_pageParaInfo = rhs.m_pageParaInfo; m_pageFootnoteTable = rhs.m_pageFootnoteTable; m_pageSectionProperty = rhs.m_pageSectionProperty; m_pageSectionTable = rhs.m_pageSectionTable; m_pagePageTable = rhs.m_pagePageTable; m_pageFontTable = rhs.m_pageFontTable; memcpy (m_zero3, rhs.m_zero3, 33 * sizeof (Word)); m_numPages = rhs.m_numPages; return *this; } bool HeaderGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_magic == 0xBE31 || m_magic == 0xBE32, DWord (m_magic))) return false; if (!Verify (Error::InvalidFormat, m_zero == 0, DWord (m_zero))) return false; if (!Verify (Error::InvalidFormat, m_magic2 == 0xAB00, DWord (m_magic2))) return false; for (int i = 0; i < 4; i++) { if (!Verify (Error::InvalidFormat, m_zero2 [i] == 0, long (m_zero2))) return false; } if (!Verify (Error::InvalidFormat, m_numCharBytesPlus128 >= 128, DWord (m_numCharBytesPlus128))) return false; // m_pageParaInfo will not be checked // m_pageFootnoteTable will not be checked // m_pageSectionProperty will not be checked // m_pageSectionTable will not be checked // m_pagePageTable will not be checked // m_pageFontTable will not be checked for (int i = 0; i < 33; i++) { if (!Verify (Error::Warn, m_zero3 [i] == 0, long (m_zero3))) return false; } if (!Verify (Error::InvalidFormat, m_numPages > 0, DWord (m_numPages))) return false; return true; } bool HeaderGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read HeaderGenerated data"); ReadWord (m_magic, m_data + 0); ReadWord (m_zero, m_data + 2); ReadWord (m_magic2, m_data + 4); for (int i = 0; i < 4; i++) { ReadWord (m_zero2 [i], m_data + 6 + i * sizeof (Word)); } ReadDWord (m_numCharBytesPlus128, m_data + 14); ReadWord (m_pageParaInfo, m_data + 18); ReadWord (m_pageFootnoteTable, m_data + 20); ReadWord (m_pageSectionProperty, m_data + 22); ReadWord (m_pageSectionTable, m_data + 24); ReadWord (m_pagePageTable, m_data + 26); ReadWord (m_pageFontTable, m_data + 28); for (int i = 0; i < 33; i++) { ReadWord (m_zero3 [i], m_data + 30 + i * sizeof (Word)); } ReadWord (m_numPages, m_data + 96); return verifyVariables (); } bool HeaderGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_magic, m_data + 0); WriteWord (m_zero, m_data + 2); WriteWord (m_magic2, m_data + 4); for (int i = 0; i < 4; i++) { WriteWord (m_zero2 [i], m_data + 6 + i * sizeof (Word)); } WriteDWord (m_numCharBytesPlus128, m_data + 14); WriteWord (m_pageParaInfo, m_data + 18); WriteWord (m_pageFootnoteTable, m_data + 20); WriteWord (m_pageSectionProperty, m_data + 22); WriteWord (m_pageSectionTable, m_data + 24); WriteWord (m_pagePageTable, m_data + 26); WriteWord (m_pageFontTable, m_data + 28); for (int i = 0; i < 33; i++) { WriteWord (m_zero3 [i], m_data + 30 + i * sizeof (Word)); } WriteWord (m_numPages, m_data + 96); return true; } bool HeaderGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write HeaderGenerated data"); return true; } // -------------------- BEGIN PageLayoutGenerated -------------------- PageLayoutGenerated::PageLayoutGenerated () { // --- set defaults for variables -- m_magic102 = (Byte) (102); m_magic512 = (Word) (512); m_pageHeight = (Word) (Inch2Twip (11)); m_pageWidth = (Word) (Inch2Twip (8.5)); m_pageNumberStart = (Word) (1); m_topMargin = (Word) (Inch2Twip (1)); m_textHeight = (Word) (Inch2Twip (9)); m_leftMargin = (Word) (Inch2Twip (1.25)); m_textWidth = (Word) (Inch2Twip (6)); m_magic256 = (Word) (256); m_headerFromTop = (Word) (Inch2Twip (0.75)); m_footerFromTop = (Word) (Inch2Twip (11.0/*m_pageHeight*/ - 0.75)); m_magic720 = (Word) (720); m_zero = (Word) (0); m_magic1080 = (Word) (1080); m_unknown = (Word) (0); m_zero2 = (Word) (0); } PageLayoutGenerated::~PageLayoutGenerated () { } PageLayoutGenerated &PageLayoutGenerated::operator= (const PageLayoutGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_magic102 = rhs.m_magic102; m_magic512 = rhs.m_magic512; m_pageHeight = rhs.m_pageHeight; m_pageWidth = rhs.m_pageWidth; m_pageNumberStart = rhs.m_pageNumberStart; m_topMargin = rhs.m_topMargin; m_textHeight = rhs.m_textHeight; m_leftMargin = rhs.m_leftMargin; m_textWidth = rhs.m_textWidth; m_magic256 = rhs.m_magic256; m_headerFromTop = rhs.m_headerFromTop; m_footerFromTop = rhs.m_footerFromTop; m_magic720 = rhs.m_magic720; m_zero = rhs.m_zero; m_magic1080 = rhs.m_magic1080; m_unknown = rhs.m_unknown; m_zero2 = rhs.m_zero2; return *this; } bool PageLayoutGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::Warn, m_magic102 == 102, DWord (m_magic102))) return false; if (!Verify (Error::Warn, m_magic512 == 512, DWord (m_magic512))) return false; // m_pageHeight will not be checked // m_pageWidth will not be checked // m_pageNumberStart will not be checked // m_topMargin will not be checked // m_textHeight will not be checked // m_leftMargin will not be checked // m_textWidth will not be checked if (!Verify (Error::Warn, m_magic256 == 256, DWord (m_magic256))) return false; // m_headerFromTop will not be checked // m_footerFromTop will not be checked if (!Verify (Error::Warn, m_magic720 == 720, DWord (m_magic720))) return false; if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; if (!Verify (Error::Warn, m_magic1080 == 1080, DWord (m_magic1080))) return false; // m_unknown will not be checked if (!Verify (Error::Warn, m_zero2 == 0, DWord (m_zero2))) return false; return true; } bool PageLayoutGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read PageLayoutGenerated data"); ReadByte (m_magic102, m_data + 0); ReadWord (m_magic512, m_data + 1); ReadWord (m_pageHeight, m_data + 3); ReadWord (m_pageWidth, m_data + 5); ReadWord (m_pageNumberStart, m_data + 7); ReadWord (m_topMargin, m_data + 9); ReadWord (m_textHeight, m_data + 11); ReadWord (m_leftMargin, m_data + 13); ReadWord (m_textWidth, m_data + 15); ReadWord (m_magic256, m_data + 17); ReadWord (m_headerFromTop, m_data + 19); ReadWord (m_footerFromTop, m_data + 21); ReadWord (m_magic720, m_data + 23); ReadWord (m_zero, m_data + 25); ReadWord (m_magic1080, m_data + 27); ReadWord (m_unknown, m_data + 29); ReadWord (m_zero2, m_data + 31); return verifyVariables (); } bool PageLayoutGenerated::writeToArray (void) { CHECK_DEVICE; WriteByte (m_magic102, m_data + 0); WriteWord (m_magic512, m_data + 1); WriteWord (m_pageHeight, m_data + 3); WriteWord (m_pageWidth, m_data + 5); WriteWord (m_pageNumberStart, m_data + 7); WriteWord (m_topMargin, m_data + 9); WriteWord (m_textHeight, m_data + 11); WriteWord (m_leftMargin, m_data + 13); WriteWord (m_textWidth, m_data + 15); WriteWord (m_magic256, m_data + 17); WriteWord (m_headerFromTop, m_data + 19); WriteWord (m_footerFromTop, m_data + 21); WriteWord (m_magic720, m_data + 23); WriteWord (m_zero, m_data + 25); WriteWord (m_magic1080, m_data + 27); WriteWord (m_unknown, m_data + 29); WriteWord (m_zero2, m_data + 31); return true; } bool PageLayoutGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write PageLayoutGenerated data"); return true; } // -------------------- BEGIN SectionDescriptorGenerated -------------------- SectionDescriptorGenerated::SectionDescriptorGenerated () { // --- set defaults for variables -- // no default for m_afterEndCharByte m_undefined = (Word) (0); // no default for m_sectionPropertyLocation } SectionDescriptorGenerated::~SectionDescriptorGenerated () { } SectionDescriptorGenerated &SectionDescriptorGenerated::operator= (const SectionDescriptorGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_afterEndCharByte = rhs.m_afterEndCharByte; m_undefined = rhs.m_undefined; m_sectionPropertyLocation = rhs.m_sectionPropertyLocation; return *this; } bool SectionDescriptorGenerated::verifyVariables (void) { CHECK_DEVICE; // m_afterEndCharByte will not be checked // m_undefined will not be checked // m_sectionPropertyLocation will not be checked return true; } bool SectionDescriptorGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read SectionDescriptorGenerated data"); ReadDWord (m_afterEndCharByte, m_data + 0); ReadWord (m_undefined, m_data + 4); ReadDWord (m_sectionPropertyLocation, m_data + 6); return verifyVariables (); } bool SectionDescriptorGenerated::writeToArray (void) { CHECK_DEVICE; WriteDWord (m_afterEndCharByte, m_data + 0); WriteWord (m_undefined, m_data + 4); WriteDWord (m_sectionPropertyLocation, m_data + 6); return true; } bool SectionDescriptorGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write SectionDescriptorGenerated data"); return true; } // -------------------- BEGIN SectionTableGenerated -------------------- SectionTableGenerated::SectionTableGenerated () { // --- set pointer(s) to NULL (prevent segfault with premature exit) --- for (int i = 0; i < 2; i++) m_sed [i] = NULL; // --- allocate memory for embedded structures --- for (int i = 0; i < 2; i++) { m_sed [i] = new SectionDescriptor; // forward ref to structures*.cpp if (!m_sed [i]) return; } // --- set defaults for variables -- m_numSectionDescriptors = (Word) (2); m_undefined = (Word) (0); // leaving constructor of m_sed to set its own defaults } SectionTableGenerated::~SectionTableGenerated () { for (int i = 0; i < 2; i++) delete m_sed [i]; } SectionTableGenerated &SectionTableGenerated::operator= (const SectionTableGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numSectionDescriptors = rhs.m_numSectionDescriptors; m_undefined = rhs.m_undefined; for (int i = 0; i < 2; i++) *m_sed [i] = *(rhs.m_sed [i]); return *this; } bool SectionTableGenerated::verifyVariables (void) { CHECK_DEVICE; // m_numSectionDescriptors will not be checked // m_undefined will not be checked for (int i = 0; i < 2; i++) { if (!m_sed [i]) { ErrorAndQuit (Error::OutOfMemory, "could not allocate memory for sed in constructor"); } } return true; } bool SectionTableGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read SectionTableGenerated data"); ReadWord (m_numSectionDescriptors, m_data + 0); ReadWord (m_undefined, m_data + 2); for (int i = 0; i < 2; i++) { m_device->setCache (m_data + 4 + i * SectionDescriptorGenerated::s_size); m_sed [i]->setDevice (m_device); if (!m_sed [i]->readFromDevice ()) return false; m_device->setCache (NULL); } return verifyVariables (); } bool SectionTableGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_numSectionDescriptors, m_data + 0); WriteWord (m_undefined, m_data + 2); for (int i = 0; i < 2; i++) { m_device->setCache (m_data + 4 + i * SectionDescriptorGenerated::s_size); m_sed [i]->setDevice (m_device); if (!m_sed [i]->writeToDevice ()) return false; m_device->setCache (NULL); } return true; } bool SectionTableGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write SectionTableGenerated data"); return true; } // -------------------- BEGIN FontGenerated -------------------- FontGenerated::FontGenerated () { // --- set defaults for variables -- m_numDataBytes = (Word) (0); m_family = (Byte) (0); } FontGenerated::~FontGenerated () { } FontGenerated &FontGenerated::operator= (const FontGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numDataBytes = rhs.m_numDataBytes; m_family = rhs.m_family; return *this; } bool FontGenerated::verifyVariables (void) { CHECK_DEVICE; // m_numDataBytes will not be checked // m_family will not be checked return true; } bool FontGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read FontGenerated data"); ReadWord (m_numDataBytes, m_data + 0); ReadByte (m_family, m_data + 2); return verifyVariables (); } bool FontGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_numDataBytes, m_data + 0); WriteByte (m_family, m_data + 2); return true; } bool FontGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write FontGenerated data"); return true; } // -------------------- BEGIN FontTableGenerated -------------------- FontTableGenerated::FontTableGenerated () { // --- set defaults for variables -- m_numFonts = (Word) (0); } FontTableGenerated::~FontTableGenerated () { } FontTableGenerated &FontTableGenerated::operator= (const FontTableGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numFonts = rhs.m_numFonts; return *this; } bool FontTableGenerated::verifyVariables (void) { CHECK_DEVICE; // m_numFonts will not be checked return true; } bool FontTableGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read FontTableGenerated data"); ReadWord (m_numFonts, m_data + 0); return verifyVariables (); } bool FontTableGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_numFonts, m_data + 0); return true; } bool FontTableGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write FontTableGenerated data"); return true; } // -------------------- BEGIN PagePointerGenerated -------------------- PagePointerGenerated::PagePointerGenerated () { // --- set defaults for variables -- // no default for m_pageNumber // no default for m_firstCharByte } PagePointerGenerated::~PagePointerGenerated () { } PagePointerGenerated &PagePointerGenerated::operator= (const PagePointerGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_pageNumber = rhs.m_pageNumber; m_firstCharByte = rhs.m_firstCharByte; return *this; } bool PagePointerGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_pageNumber > 0, DWord (m_pageNumber))) return false; // m_firstCharByte will not be checked return true; } bool PagePointerGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read PagePointerGenerated data"); ReadWord (m_pageNumber, m_data + 0); ReadDWord (m_firstCharByte, m_data + 2); return verifyVariables (); } bool PagePointerGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_pageNumber, m_data + 0); WriteDWord (m_firstCharByte, m_data + 2); return true; } bool PagePointerGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write PagePointerGenerated data"); return true; } // -------------------- BEGIN PageTableGenerated -------------------- PageTableGenerated::PageTableGenerated () { // --- set defaults for variables -- m_numPagePointers = (Word) (0); m_zero = (Word) (0); } PageTableGenerated::~PageTableGenerated () { } PageTableGenerated &PageTableGenerated::operator= (const PageTableGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numPagePointers = rhs.m_numPagePointers; m_zero = rhs.m_zero; return *this; } bool PageTableGenerated::verifyVariables (void) { CHECK_DEVICE; // m_numPagePointers will not be checked if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; return true; } bool PageTableGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read PageTableGenerated data"); ReadWord (m_numPagePointers, m_data + 0); ReadWord (m_zero, m_data + 2); return verifyVariables (); } bool PageTableGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_numPagePointers, m_data + 0); WriteWord (m_zero, m_data + 2); return true; } bool PageTableGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write PageTableGenerated data"); return true; } // -------------------- BEGIN FormatPointerGenerated -------------------- FormatPointerGenerated::FormatPointerGenerated () { // --- set defaults for variables -- // no default for m_afterEndCharBytePlus128 // no default for m_formatPropertyOffset } FormatPointerGenerated::~FormatPointerGenerated () { } FormatPointerGenerated &FormatPointerGenerated::operator= (const FormatPointerGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_afterEndCharBytePlus128 = rhs.m_afterEndCharBytePlus128; m_formatPropertyOffset = rhs.m_formatPropertyOffset; return *this; } bool FormatPointerGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_afterEndCharBytePlus128 >= 128, DWord (m_afterEndCharBytePlus128))) return false; if (!Verify (Error::InvalidFormat, m_formatPropertyOffset == 0xFFFF || m_formatPropertyOffset < 123 - 1/*numDataBytes of either FormatProperty, can't have 0 byte FormatProperty*/, DWord (m_formatPropertyOffset))) return false; return true; } bool FormatPointerGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read FormatPointerGenerated data"); ReadDWord (m_afterEndCharBytePlus128, m_data + 0); ReadWord (m_formatPropertyOffset, m_data + 4); return verifyVariables (); } bool FormatPointerGenerated::writeToArray (void) { CHECK_DEVICE; WriteDWord (m_afterEndCharBytePlus128, m_data + 0); WriteWord (m_formatPropertyOffset, m_data + 4); return true; } bool FormatPointerGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write FormatPointerGenerated data"); return true; } // -------------------- BEGIN FormatCharPropertyGenerated -------------------- FormatCharPropertyGenerated::FormatCharPropertyGenerated () { // --- set defaults in raw array (needed because it's a useThisMuch structure) --- WriteByte ((Byte) (1), m_data + 1);// unknown m_data [2] = 0; // isBold, isItalic, fontCodeLow WriteByte ((Byte) (24), m_data + 3);// fontSize m_data [4] = 0; // isUnderlined, zero, isPageNumber, zero2, fontCodeHigh, zero3, position m_data [5] = 0; m_data [6] = 0; // --- set defaults for variables -- m_numDataBytes = (Byte) (0); m_unknown = (Byte) (1); m_isBold = (unsigned) (0); m_isItalic = (unsigned) (0); m_fontCodeLow = (unsigned) (0); m_fontSize = (Byte) (24); m_isUnderlined = (unsigned) (0); m_zero = (unsigned) (0); m_isPageNumber = (unsigned) (0); m_zero2 = (unsigned) (0); m_fontCodeHigh = (unsigned) (0); m_zero3 = (unsigned) (0); m_position = (Byte) (0); } FormatCharPropertyGenerated::~FormatCharPropertyGenerated () { } FormatCharPropertyGenerated &FormatCharPropertyGenerated::operator= (const FormatCharPropertyGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); UseThisMuch::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numDataBytes = rhs.m_numDataBytes; m_unknown = rhs.m_unknown; m_isBold = rhs.m_isBold; m_isItalic = rhs.m_isItalic; m_fontCodeLow = rhs.m_fontCodeLow; m_fontSize = rhs.m_fontSize; m_isUnderlined = rhs.m_isUnderlined; m_zero = rhs.m_zero; m_isPageNumber = rhs.m_isPageNumber; m_zero2 = rhs.m_zero2; m_fontCodeHigh = rhs.m_fontCodeHigh; m_zero3 = rhs.m_zero3; m_position = rhs.m_position; return *this; } bool FormatCharPropertyGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_numDataBytes >= 1 && m_numDataBytes <= s_size - sizeof (Byte), DWord (m_numDataBytes))) return false; if (!Verify (Error::Warn, m_unknown <= 1, DWord (m_unknown))) return false; // m_isBold will not be checked // m_isItalic will not be checked // m_fontCodeLow will not be checked // m_fontSize will not be checked // m_isUnderlined will not be checked if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; // m_isPageNumber will not be checked if (!Verify (Error::Warn, m_zero2 == 0, DWord (m_zero2))) return false; // m_fontCodeHigh will not be checked if (!Verify (Error::Warn, m_zero3 == 0, DWord (m_zero3))) return false; // m_position will not be checked return true; } bool FormatCharPropertyGenerated::readFromDevice (void) { CHECK_DEVICE; // find out how many bytes to read if (!m_device->readInternal (m_data, 1)) ErrorAndQuit (Error::FileError, "could not read FormatCharPropertyGenerated numDataBytes"); ReadByte (m_numDataBytes, m_data); if (!Verify (Error::InvalidFormat, m_numDataBytes >= 1 && m_numDataBytes <= s_size - sizeof (Byte), DWord (m_numDataBytes))) return false; if (!m_device->readInternal (m_data + 1, m_numDataBytes)) ErrorAndQuit (Error::FileError, "could not read FormatCharPropertyGenerated data"); ReadByte (m_unknown, m_data + 1); signalHaveSetData (m_unknown == Byte (1), 0/*offset*/ + 8/*size*/); ReadBitsFromByte (m_isBold, m_data [2], 0, 1); signalHaveSetData (m_isBold == bool (0), 8/*offset*/ + 1/*size*/); ReadBitsFromByte (m_isItalic, m_data [2], 1, 1); signalHaveSetData (m_isItalic == bool (0), 9/*offset*/ + 1/*size*/); ReadBitsFromByte (m_fontCodeLow, m_data [2], 2, 6); signalHaveSetData (m_fontCodeLow == unsigned (0), 10/*offset*/ + 6/*size*/); ReadByte (m_fontSize, m_data + 3); signalHaveSetData (m_fontSize == Byte (24), 16/*offset*/ + 8/*size*/); ReadBitsFromByte (m_isUnderlined, m_data [4], 0, 1); signalHaveSetData (m_isUnderlined == bool (0), 24/*offset*/ + 1/*size*/); ReadBitsFromByte (m_zero, m_data [4], 1, 5); signalHaveSetData (m_zero == unsigned (0), 25/*offset*/ + 5/*size*/); ReadBitsFromByte (m_isPageNumber, m_data [4], 6, 1); signalHaveSetData (m_isPageNumber == bool (0), 30/*offset*/ + 1/*size*/); ReadBitsFromByte (m_zero2, m_data [4], 7, 1); signalHaveSetData (m_zero2 == bool (0), 31/*offset*/ + 1/*size*/); ReadBitsFromByte (m_fontCodeHigh, m_data [5], 0, 3); signalHaveSetData (m_fontCodeHigh == unsigned (0), 32/*offset*/ + 3/*size*/); ReadBitsFromByte (m_zero3, m_data [5], 3, 5); signalHaveSetData (m_zero3 == unsigned (0), 35/*offset*/ + 5/*size*/); ReadByte (m_position, m_data + 6); signalHaveSetData (m_position == Byte (0), 40/*offset*/ + 8/*size*/); return verifyVariables (); } bool FormatCharPropertyGenerated::writeToArray (void) { CHECK_DEVICE; // set m_data to 0 to avoid problems with bit ops memset (m_data, 0, s_size); WriteByte (m_numDataBytes, m_data + 0); WriteByte (m_unknown, m_data + 1); WriteBitsToByte (m_isBold, m_data [2], 0, 1); WriteBitsToByte (m_isItalic, m_data [2], 1, 1); WriteBitsToByte (m_fontCodeLow, m_data [2], 2, 6); WriteByte (m_fontSize, m_data + 3); WriteBitsToByte (m_isUnderlined, m_data [4], 0, 1); WriteBitsToByte (m_zero, m_data [4], 1, 5); WriteBitsToByte (m_isPageNumber, m_data [4], 6, 1); WriteBitsToByte (m_zero2, m_data [4], 7, 1); WriteBitsToByte (m_fontCodeHigh, m_data [5], 0, 3); WriteBitsToByte (m_zero3, m_data [5], 3, 5); WriteByte (m_position, m_data + 6); return true; } bool FormatCharPropertyGenerated::writeToDevice (void) { CHECK_DEVICE; // sync m_numDataBytes with reality updateNumDataBytes (); // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, 1 /*sizeof (m_numDataBytes)*/ + (m_numDataBytes ? m_numDataBytes : getNeedNumDataBytes ()))) ErrorAndQuit (Error::FileError, "could not write FormatCharPropertyGenerated data"); return true; } // -------------------- BEGIN FormatParaPropertyTabulatorGenerated -------------------- FormatParaPropertyTabulatorGenerated::FormatParaPropertyTabulatorGenerated () { // --- set defaults for variables -- m_indent = (Word) (0); m_type = (Byte) (0); m_zero = (Byte) (0); } FormatParaPropertyTabulatorGenerated::~FormatParaPropertyTabulatorGenerated () { } FormatParaPropertyTabulatorGenerated &FormatParaPropertyTabulatorGenerated::operator= (const FormatParaPropertyTabulatorGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_indent = rhs.m_indent; m_type = rhs.m_type; m_zero = rhs.m_zero; return *this; } bool FormatParaPropertyTabulatorGenerated::verifyVariables (void) { CHECK_DEVICE; // m_indent will not be checked if (!Verify (Error::InvalidFormat, m_type == 0 || m_type == 3, DWord (m_type))) return false; if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; return true; } bool FormatParaPropertyTabulatorGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read FormatParaPropertyTabulatorGenerated data"); ReadWord (m_indent, m_data + 0); ReadByte (m_type, m_data + 2); ReadByte (m_zero, m_data + 3); return verifyVariables (); } bool FormatParaPropertyTabulatorGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_indent, m_data + 0); WriteByte (m_type, m_data + 2); WriteByte (m_zero, m_data + 3); return true; } bool FormatParaPropertyTabulatorGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write FormatParaPropertyTabulatorGenerated data"); return true; } // -------------------- BEGIN FormatParaPropertyGenerated -------------------- FormatParaPropertyGenerated::FormatParaPropertyGenerated () { // --- set pointer(s) to NULL (prevent segfault with premature exit) --- for (int i = 0; i < 14; i++) m_tab [i] = NULL; // --- allocate memory for embedded structures --- for (int i = 0; i < 14; i++) { m_tab [i] = new FormatParaPropertyTabulator; // forward ref to structures*.cpp if (!m_tab [i]) return; } // --- set defaults in raw array (needed because it's a useThisMuch structure) --- WriteByte ((Byte) (60), m_data + 1);// magic0_60_or_61 m_data [2] = 0; // tqalignment WriteWord ((Word) (30), m_data + 3);// magic30 memset (m_data + 5, 0, 6); // rightIndent, leftIndent, leftIndentFirstLine WriteWord ((Word) (240), m_data + 11);// lineSpacing memset (m_data + 13, 0, 10); // zero, headerOrFooter, isNotNormalParagraph, isOnFirstPage, isObject, zero2, zero3 memset (m_data + 23, 0, 56); // HACK: default embedded structures is 0 // --- set defaults for variables -- m_numDataBytes = (Byte) (0); m_magic0_60_or_61 = (Byte) (60); m_tqalignment = (Byte) (0); m_magic30 = (Word) (30); m_rightIndent = (Word) (0); m_leftIndent = (Word) (0); m_leftIndentFirstLine = (Short) (0); m_lineSpacing = (Word) (240); for (int i = 0; i < 2; i++) m_zero [i] = (Word) (0); m_headerOrFooter = (unsigned) (0); m_isNotNormalParagraph = (unsigned) (0); m_isOnFirstPage = (unsigned) (0); m_isObject = (unsigned) (0); m_zero2 = (unsigned) (0); memset (m_zero3, (Byte) (0), 5 * sizeof (Byte)); // leaving constructor of m_tab to set its own defaults } FormatParaPropertyGenerated::~FormatParaPropertyGenerated () { for (int i = 0; i < 14; i++) delete m_tab [i]; } FormatParaPropertyGenerated &FormatParaPropertyGenerated::operator= (const FormatParaPropertyGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); UseThisMuch::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numDataBytes = rhs.m_numDataBytes; m_magic0_60_or_61 = rhs.m_magic0_60_or_61; m_tqalignment = rhs.m_tqalignment; m_magic30 = rhs.m_magic30; m_rightIndent = rhs.m_rightIndent; m_leftIndent = rhs.m_leftIndent; m_leftIndentFirstLine = rhs.m_leftIndentFirstLine; m_lineSpacing = rhs.m_lineSpacing; memcpy (m_zero, rhs.m_zero, 2 * sizeof (Word)); m_headerOrFooter = rhs.m_headerOrFooter; m_isNotNormalParagraph = rhs.m_isNotNormalParagraph; m_isOnFirstPage = rhs.m_isOnFirstPage; m_isObject = rhs.m_isObject; m_zero2 = rhs.m_zero2; memcpy (m_zero3, rhs.m_zero3, 5 * sizeof (Byte)); for (int i = 0; i < 14; i++) *m_tab [i] = *(rhs.m_tab [i]); return *this; } bool FormatParaPropertyGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_numDataBytes >= 1 && m_numDataBytes <= s_size - sizeof (Byte), DWord (m_numDataBytes))) return false; if (!Verify (Error::Warn, m_magic0_60_or_61 == 0 || m_magic0_60_or_61 == 60 || m_magic0_60_or_61 == 61, DWord (m_magic0_60_or_61))) return false; // m_tqalignment will not be checked if (!Verify (Error::Warn, m_magic30 == 30, DWord (m_magic30))) return false; // m_rightIndent will not be checked // m_leftIndent will not be checked // m_leftIndentFirstLine will not be checked // m_lineSpacing will not be checked for (int i = 0; i < 2; i++) { if (!Verify (Error::Warn, m_zero [i] == 0, long (m_zero))) return false; } // m_headerOrFooter will not be checked // m_isNotNormalParagraph will not be checked // m_isOnFirstPage will not be checked // m_isObject will not be checked if (!Verify (Error::Warn, m_zero2 == 0, DWord (m_zero2))) return false; for (int i = 0; i < 5; i++) { if (!Verify (Error::Warn, m_zero3 [i] == 0, long (m_zero3))) return false; } for (int i = 0; i < 14; i++) { if (!m_tab [i]) { ErrorAndQuit (Error::OutOfMemory, "could not allocate memory for tab in constructor"); } } return true; } bool FormatParaPropertyGenerated::readFromDevice (void) { CHECK_DEVICE; // find out how many bytes to read if (!m_device->readInternal (m_data, 1)) ErrorAndQuit (Error::FileError, "could not read FormatParaPropertyGenerated numDataBytes"); ReadByte (m_numDataBytes, m_data); if (!Verify (Error::InvalidFormat, m_numDataBytes >= 1 && m_numDataBytes <= s_size - sizeof (Byte), DWord (m_numDataBytes))) return false; if (!m_device->readInternal (m_data + 1, m_numDataBytes)) ErrorAndQuit (Error::FileError, "could not read FormatParaPropertyGenerated data"); ReadByte (m_magic0_60_or_61, m_data + 1); signalHaveSetData (m_magic0_60_or_61 == Byte (60), 0/*offset*/ + 8/*size*/); ReadByte (m_tqalignment, m_data + 2); signalHaveSetData (m_tqalignment == Byte (0), 8/*offset*/ + 8/*size*/); ReadWord (m_magic30, m_data + 3); signalHaveSetData (m_magic30 == Word (30), 16/*offset*/ + 16/*size*/); ReadWord (m_rightIndent, m_data + 5); signalHaveSetData (m_rightIndent == Word (0), 32/*offset*/ + 16/*size*/); ReadWord (m_leftIndent, m_data + 7); signalHaveSetData (m_leftIndent == Word (0), 48/*offset*/ + 16/*size*/); ReadShort (m_leftIndentFirstLine, m_data + 9); signalHaveSetData (m_leftIndentFirstLine == Short (0), 64/*offset*/ + 16/*size*/); ReadWord (m_lineSpacing, m_data + 11); signalHaveSetData (m_lineSpacing == Word (240), 80/*offset*/ + 16/*size*/); for (int i = 0; i < 2; i++) { ReadWord (m_zero [i], m_data + 13 + i * sizeof (Word)); } ReadBitsFromByte (m_headerOrFooter, m_data [17], 0, 1); signalHaveSetData (m_headerOrFooter == bool (0), 128/*offset*/ + 1/*size*/); ReadBitsFromByte (m_isNotNormalParagraph, m_data [17], 1, 2); signalHaveSetData (m_isNotNormalParagraph == unsigned (0), 129/*offset*/ + 2/*size*/); ReadBitsFromByte (m_isOnFirstPage, m_data [17], 3, 1); signalHaveSetData (m_isOnFirstPage == bool (0), 131/*offset*/ + 1/*size*/); ReadBitsFromByte (m_isObject, m_data [17], 4, 1); signalHaveSetData (m_isObject == bool (0), 132/*offset*/ + 1/*size*/); ReadBitsFromByte (m_zero2, m_data [17], 5, 3); signalHaveSetData (m_zero2 == unsigned (0), 133/*offset*/ + 3/*size*/); memcpy (m_zero3, m_data + 18, 5 * sizeof (Byte)); for (int i = 0; i < 14; i++) { m_device->setCache (m_data + 23 + i * FormatParaPropertyTabulatorGenerated::s_size); m_tab [i]->setDevice (m_device); if (!m_tab [i]->readFromDevice ()) return false; m_device->setCache (NULL); } return verifyVariables (); } bool FormatParaPropertyGenerated::writeToArray (void) { CHECK_DEVICE; // set m_data to 0 to avoid problems with bit ops memset (m_data, 0, s_size); WriteByte (m_numDataBytes, m_data + 0); WriteByte (m_magic0_60_or_61, m_data + 1); WriteByte (m_tqalignment, m_data + 2); WriteWord (m_magic30, m_data + 3); WriteWord (m_rightIndent, m_data + 5); WriteWord (m_leftIndent, m_data + 7); WriteShort (m_leftIndentFirstLine, m_data + 9); WriteWord (m_lineSpacing, m_data + 11); for (int i = 0; i < 2; i++) { WriteWord (m_zero [i], m_data + 13 + i * sizeof (Word)); } WriteBitsToByte (m_headerOrFooter, m_data [17], 0, 1); WriteBitsToByte (m_isNotNormalParagraph, m_data [17], 1, 2); WriteBitsToByte (m_isOnFirstPage, m_data [17], 3, 1); WriteBitsToByte (m_isObject, m_data [17], 4, 1); WriteBitsToByte (m_zero2, m_data [17], 5, 3); memcpy (m_data + 18, m_zero3, 5 * sizeof (Byte)); for (int i = 0; i < 14; i++) { m_device->setCache (m_data + 23 + i * FormatParaPropertyTabulatorGenerated::s_size); m_tab [i]->setDevice (m_device); if (!m_tab [i]->writeToDevice ()) return false; m_device->setCache (NULL); } return true; } bool FormatParaPropertyGenerated::writeToDevice (void) { CHECK_DEVICE; // sync m_numDataBytes with reality updateNumDataBytes (); // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, 1 /*sizeof (m_numDataBytes)*/ + (m_numDataBytes ? m_numDataBytes : getNeedNumDataBytes ()))) ErrorAndQuit (Error::FileError, "could not write FormatParaPropertyGenerated data"); return true; } // -------------------- BEGIN FormatInfoPageGenerated -------------------- FormatInfoPageGenerated::FormatInfoPageGenerated () { // --- set defaults for variables -- // no default for m_firstCharBytePlus128 memset (m_packedStructs, (Byte) (0), 123 * sizeof (Byte)); m_numFormatPointers = (Byte) (0); } FormatInfoPageGenerated::~FormatInfoPageGenerated () { } FormatInfoPageGenerated &FormatInfoPageGenerated::operator= (const FormatInfoPageGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_firstCharBytePlus128 = rhs.m_firstCharBytePlus128; memcpy (m_packedStructs, rhs.m_packedStructs, 123 * sizeof (Byte)); m_numFormatPointers = rhs.m_numFormatPointers; return *this; } bool FormatInfoPageGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_firstCharBytePlus128 >= 128, DWord (m_firstCharBytePlus128))) return false; // m_packedStructs will not be checked // m_numFormatPointers will not be checked return true; } bool FormatInfoPageGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read FormatInfoPageGenerated data"); ReadDWord (m_firstCharBytePlus128, m_data + 0); memcpy (m_packedStructs, m_data + 4, 123 * sizeof (Byte)); ReadByte (m_numFormatPointers, m_data + 127); return verifyVariables (); } bool FormatInfoPageGenerated::writeToArray (void) { CHECK_DEVICE; WriteDWord (m_firstCharBytePlus128, m_data + 0); memcpy (m_data + 4, m_packedStructs, 123 * sizeof (Byte)); WriteByte (m_numFormatPointers, m_data + 127); return true; } bool FormatInfoPageGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write FormatInfoPageGenerated data"); return true; } // -------------------- BEGIN BMP_BitmapFileHeaderGenerated -------------------- BMP_BitmapFileHeaderGenerated::BMP_BitmapFileHeaderGenerated () { // --- set defaults for variables -- m_magic = (Word) (Word ('B') + (Word ('M') << 8)); // no default for m_totalBytes for (int i = 0; i < 2; i++) m_zero [i] = (Word) (0); // no default for m_actualImageOffset } BMP_BitmapFileHeaderGenerated::~BMP_BitmapFileHeaderGenerated () { } BMP_BitmapFileHeaderGenerated &BMP_BitmapFileHeaderGenerated::operator= (const BMP_BitmapFileHeaderGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_magic = rhs.m_magic; m_totalBytes = rhs.m_totalBytes; memcpy (m_zero, rhs.m_zero, 2 * sizeof (Word)); m_actualImageOffset = rhs.m_actualImageOffset; return *this; } bool BMP_BitmapFileHeaderGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_magic == Word ('B') + (Word ('M') << 8), DWord (m_magic))) return false; // m_totalBytes will not be checked for (int i = 0; i < 2; i++) { if (!Verify (Error::Warn, m_zero [i] == 0, long (m_zero))) return false; } // m_actualImageOffset will not be checked return true; } bool BMP_BitmapFileHeaderGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read BMP_BitmapFileHeaderGenerated data"); ReadWord (m_magic, m_data + 0); ReadDWord (m_totalBytes, m_data + 2); for (int i = 0; i < 2; i++) { ReadWord (m_zero [i], m_data + 6 + i * sizeof (Word)); } ReadDWord (m_actualImageOffset, m_data + 10); return verifyVariables (); } bool BMP_BitmapFileHeaderGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_magic, m_data + 0); WriteDWord (m_totalBytes, m_data + 2); for (int i = 0; i < 2; i++) { WriteWord (m_zero [i], m_data + 6 + i * sizeof (Word)); } WriteDWord (m_actualImageOffset, m_data + 10); return true; } bool BMP_BitmapFileHeaderGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write BMP_BitmapFileHeaderGenerated data"); return true; } // -------------------- BEGIN BMP_BitmapInfoHeaderGenerated -------------------- BMP_BitmapInfoHeaderGenerated::BMP_BitmapInfoHeaderGenerated () { // --- set defaults for variables -- m_numHeaderBytes = (DWord) (s_size); // no default for m_width // no default for m_height m_numPlanes = (Word) (1); // no default for m_bitsPerPixel m_compression = (DWord) (0); m_sizeImage = (DWord) (0); m_xPixelsPerMeter = (Long) (0); m_yPixelsPerMeter = (Long) (0); m_coloursUsed = (DWord) (0); // no default for m_coloursImportant } BMP_BitmapInfoHeaderGenerated::~BMP_BitmapInfoHeaderGenerated () { } BMP_BitmapInfoHeaderGenerated &BMP_BitmapInfoHeaderGenerated::operator= (const BMP_BitmapInfoHeaderGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_numHeaderBytes = rhs.m_numHeaderBytes; m_width = rhs.m_width; m_height = rhs.m_height; m_numPlanes = rhs.m_numPlanes; m_bitsPerPixel = rhs.m_bitsPerPixel; m_compression = rhs.m_compression; m_sizeImage = rhs.m_sizeImage; m_xPixelsPerMeter = rhs.m_xPixelsPerMeter; m_yPixelsPerMeter = rhs.m_yPixelsPerMeter; m_coloursUsed = rhs.m_coloursUsed; m_coloursImportant = rhs.m_coloursImportant; return *this; } bool BMP_BitmapInfoHeaderGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_numHeaderBytes == DWord (s_size), DWord (m_numHeaderBytes))) return false; // m_width will not be checked // m_height will not be checked if (!Verify (Error::InvalidFormat, m_numPlanes == 1, DWord (m_numPlanes))) return false; if (!Verify (Error::Warn, m_bitsPerPixel == 1 || m_bitsPerPixel == 4 || m_bitsPerPixel == 8 || m_bitsPerPixel == 24, DWord (m_bitsPerPixel))) return false; // m_compression will not be checked // m_sizeImage will not be checked // m_xPixelsPerMeter will not be checked // m_yPixelsPerMeter will not be checked // m_coloursUsed will not be checked // m_coloursImportant will not be checked return true; } bool BMP_BitmapInfoHeaderGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read BMP_BitmapInfoHeaderGenerated data"); ReadDWord (m_numHeaderBytes, m_data + 0); ReadLong (m_width, m_data + 4); ReadLong (m_height, m_data + 8); ReadWord (m_numPlanes, m_data + 12); ReadWord (m_bitsPerPixel, m_data + 14); ReadDWord (m_compression, m_data + 16); ReadDWord (m_sizeImage, m_data + 20); ReadLong (m_xPixelsPerMeter, m_data + 24); ReadLong (m_yPixelsPerMeter, m_data + 28); ReadDWord (m_coloursUsed, m_data + 32); ReadDWord (m_coloursImportant, m_data + 36); return verifyVariables (); } bool BMP_BitmapInfoHeaderGenerated::writeToArray (void) { CHECK_DEVICE; WriteDWord (m_numHeaderBytes, m_data + 0); WriteLong (m_width, m_data + 4); WriteLong (m_height, m_data + 8); WriteWord (m_numPlanes, m_data + 12); WriteWord (m_bitsPerPixel, m_data + 14); WriteDWord (m_compression, m_data + 16); WriteDWord (m_sizeImage, m_data + 20); WriteLong (m_xPixelsPerMeter, m_data + 24); WriteLong (m_yPixelsPerMeter, m_data + 28); WriteDWord (m_coloursUsed, m_data + 32); WriteDWord (m_coloursImportant, m_data + 36); return true; } bool BMP_BitmapInfoHeaderGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write BMP_BitmapInfoHeaderGenerated data"); return true; } // -------------------- BEGIN BMP_BitmapColourIndexGenerated -------------------- BMP_BitmapColourIndexGenerated::BMP_BitmapColourIndexGenerated () { // --- set defaults for variables -- // no default for m_blue // no default for m_green // no default for m_red m_reserved = (Byte) (0); } BMP_BitmapColourIndexGenerated::~BMP_BitmapColourIndexGenerated () { } BMP_BitmapColourIndexGenerated &BMP_BitmapColourIndexGenerated::operator= (const BMP_BitmapColourIndexGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_blue = rhs.m_blue; m_green = rhs.m_green; m_red = rhs.m_red; m_reserved = rhs.m_reserved; return *this; } bool BMP_BitmapColourIndexGenerated::verifyVariables (void) { CHECK_DEVICE; // m_blue will not be checked // m_green will not be checked // m_red will not be checked // m_reserved will not be checked return true; } bool BMP_BitmapColourIndexGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read BMP_BitmapColourIndexGenerated data"); ReadByte (m_blue, m_data + 0); ReadByte (m_green, m_data + 1); ReadByte (m_red, m_data + 2); ReadByte (m_reserved, m_data + 3); return verifyVariables (); } bool BMP_BitmapColourIndexGenerated::writeToArray (void) { CHECK_DEVICE; WriteByte (m_blue, m_data + 0); WriteByte (m_green, m_data + 1); WriteByte (m_red, m_data + 2); WriteByte (m_reserved, m_data + 3); return true; } bool BMP_BitmapColourIndexGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write BMP_BitmapColourIndexGenerated data"); return true; } // -------------------- BEGIN BitmapHeaderGenerated -------------------- BitmapHeaderGenerated::BitmapHeaderGenerated () { // --- set defaults for variables -- m_zero = (Word) (0); m_width = (Word) (0); m_height = (Word) (0); m_widthBytes = (Word) (0); m_numPlanes = (Byte) (0); m_bitsPerPixel = (Byte) (0); m_zero2 = (DWord) (0); } BitmapHeaderGenerated::~BitmapHeaderGenerated () { } BitmapHeaderGenerated &BitmapHeaderGenerated::operator= (const BitmapHeaderGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_zero = rhs.m_zero; m_width = rhs.m_width; m_height = rhs.m_height; m_widthBytes = rhs.m_widthBytes; m_numPlanes = rhs.m_numPlanes; m_bitsPerPixel = rhs.m_bitsPerPixel; m_zero2 = rhs.m_zero2; return *this; } bool BitmapHeaderGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_zero == 0, DWord (m_zero))) return false; // m_width will not be checked // m_height will not be checked // m_widthBytes will not be checked if (!Verify (Error::InvalidFormat, m_numPlanes == 0 || m_numPlanes == 1, DWord (m_numPlanes))) return false; // m_bitsPerPixel will not be checked if (!Verify (Error::InvalidFormat, m_zero2 == 0, DWord (m_zero2))) return false; return true; } bool BitmapHeaderGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read BitmapHeaderGenerated data"); ReadWord (m_zero, m_data + 0); ReadWord (m_width, m_data + 2); ReadWord (m_height, m_data + 4); ReadWord (m_widthBytes, m_data + 6); ReadByte (m_numPlanes, m_data + 8); ReadByte (m_bitsPerPixel, m_data + 9); ReadDWord (m_zero2, m_data + 10); return verifyVariables (); } bool BitmapHeaderGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_zero, m_data + 0); WriteWord (m_width, m_data + 2); WriteWord (m_height, m_data + 4); WriteWord (m_widthBytes, m_data + 6); WriteByte (m_numPlanes, m_data + 8); WriteByte (m_bitsPerPixel, m_data + 9); WriteDWord (m_zero2, m_data + 10); return true; } bool BitmapHeaderGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write BitmapHeaderGenerated data"); return true; } // -------------------- BEGIN WMFHeaderGenerated -------------------- WMFHeaderGenerated::WMFHeaderGenerated () { // --- set defaults for variables -- m_fieldType = (Word) (1); m_headerSize = (Word) (9); m_winVersion = (Word) (0x0300); // no default for m_fileSize m_numObjects = (Word) (0); // no default for m_maxRecordSize m_zero = (Word) (0); } WMFHeaderGenerated::~WMFHeaderGenerated () { } WMFHeaderGenerated &WMFHeaderGenerated::operator= (const WMFHeaderGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_fieldType = rhs.m_fieldType; m_headerSize = rhs.m_headerSize; m_winVersion = rhs.m_winVersion; m_fileSize = rhs.m_fileSize; m_numObjects = rhs.m_numObjects; m_maxRecordSize = rhs.m_maxRecordSize; m_zero = rhs.m_zero; return *this; } bool WMFHeaderGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_fieldType == 1, DWord (m_fieldType))) return false; if (!Verify (Error::InvalidFormat, m_headerSize == 9, DWord (m_headerSize))) return false; if (!Verify (Error::Warn, m_winVersion <= 0x0300, DWord (m_winVersion))) return false; // m_fileSize will not be checked // m_numObjects will not be checked // m_maxRecordSize will not be checked if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; return true; } bool WMFHeaderGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read WMFHeaderGenerated data"); ReadWord (m_fieldType, m_data + 0); ReadWord (m_headerSize, m_data + 2); ReadWord (m_winVersion, m_data + 4); ReadDWord (m_fileSize, m_data + 6); ReadWord (m_numObjects, m_data + 10); ReadDWord (m_maxRecordSize, m_data + 12); ReadWord (m_zero, m_data + 16); return verifyVariables (); } bool WMFHeaderGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_fieldType, m_data + 0); WriteWord (m_headerSize, m_data + 2); WriteWord (m_winVersion, m_data + 4); WriteDWord (m_fileSize, m_data + 6); WriteWord (m_numObjects, m_data + 10); WriteDWord (m_maxRecordSize, m_data + 12); WriteWord (m_zero, m_data + 16); return true; } bool WMFHeaderGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write WMFHeaderGenerated data"); return true; } // -------------------- BEGIN ImageGenerated -------------------- ImageGenerated::ImageGenerated () { // --- set pointer(s) to NULL (prevent segfault with premature exit) --- m_bmh = NULL; // --- allocate memory for embedded structures --- m_bmh = new BitmapHeader; // forward ref to structures*.cpp if (!m_bmh) return; // --- set defaults for variables -- // no default for m_mappingMode // no default for m_MFP_width // no default for m_MFP_height m_MFP_unknown = (Word) (0); m_indent = (Word) (0); // no default for m_width // no default for m_height m_zero = (Word) (0); // leaving constructor of m_bmh to set its own defaults m_numHeaderBytes = (Word) (s_size); // no default for m_numDataBytes m_horizontalScalingRel1000 = (Word) (1000); m_verticalScalingRel1000 = (Word) (1000); } ImageGenerated::~ImageGenerated () { delete m_bmh; } ImageGenerated &ImageGenerated::operator= (const ImageGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_mappingMode = rhs.m_mappingMode; m_MFP_width = rhs.m_MFP_width; m_MFP_height = rhs.m_MFP_height; m_MFP_unknown = rhs.m_MFP_unknown; m_indent = rhs.m_indent; m_width = rhs.m_width; m_height = rhs.m_height; m_zero = rhs.m_zero; *m_bmh = *(rhs.m_bmh); m_numHeaderBytes = rhs.m_numHeaderBytes; m_numDataBytes = rhs.m_numDataBytes; m_horizontalScalingRel1000 = rhs.m_horizontalScalingRel1000; m_verticalScalingRel1000 = rhs.m_verticalScalingRel1000; return *this; } bool ImageGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_mappingMode != 0xE4, DWord (m_mappingMode))) return false; // m_MFP_width will not be checked // m_MFP_height will not be checked if (!Verify (Error::Warn, m_MFP_unknown==0, DWord (m_MFP_unknown))) return false; // m_indent will not be checked // m_width will not be checked // m_height will not be checked // m_zero will not be checked if (!m_bmh) { ErrorAndQuit (Error::OutOfMemory, "could not allocate memory for bmh in constructor"); } if (!Verify (Error::InvalidFormat, m_numHeaderBytes == s_size, DWord (m_numHeaderBytes))) return false; // m_numDataBytes will not be checked // m_horizontalScalingRel1000 will not be checked // m_verticalScalingRel1000 will not be checked return true; } bool ImageGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read ImageGenerated data"); ReadWord (m_mappingMode, m_data + 0); ReadWord (m_MFP_width, m_data + 2); ReadWord (m_MFP_height, m_data + 4); ReadWord (m_MFP_unknown, m_data + 6); ReadWord (m_indent, m_data + 8); ReadWord (m_width, m_data + 10); ReadWord (m_height, m_data + 12); ReadWord (m_zero, m_data + 14); m_device->setCache (m_data + 16); m_bmh->setDevice (m_device); if (!m_bmh->readFromDevice ()) return false; m_device->setCache (NULL); ReadWord (m_numHeaderBytes, m_data + 30); ReadDWord (m_numDataBytes, m_data + 32); ReadWord (m_horizontalScalingRel1000, m_data + 36); ReadWord (m_verticalScalingRel1000, m_data + 38); return verifyVariables (); } bool ImageGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_mappingMode, m_data + 0); WriteWord (m_MFP_width, m_data + 2); WriteWord (m_MFP_height, m_data + 4); WriteWord (m_MFP_unknown, m_data + 6); WriteWord (m_indent, m_data + 8); WriteWord (m_width, m_data + 10); WriteWord (m_height, m_data + 12); WriteWord (m_zero, m_data + 14); m_device->setCache (m_data + 16); m_bmh->setDevice (m_device); if (!m_bmh->writeToDevice ()) return false; m_device->setCache (NULL); WriteWord (m_numHeaderBytes, m_data + 30); WriteDWord (m_numDataBytes, m_data + 32); WriteWord (m_horizontalScalingRel1000, m_data + 36); WriteWord (m_verticalScalingRel1000, m_data + 38); return true; } bool ImageGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write ImageGenerated data"); return true; } // -------------------- BEGIN OLEGenerated -------------------- OLEGenerated::OLEGenerated () { // --- set defaults for variables -- // no default for m_mappingMode m_zero = (DWord) (0); // no default for m_objectType // no default for m_indent // no default for m_width // no default for m_height m_zero2 = (Word) (0); // no default for m_numDataBytes m_zero3 = (DWord) (0); // no default for m_objectName m_zero4 = (Word) (0); // no default for m_numHeaderBytes m_zero5 = (DWord) (0); // no default for m_widthScaledRel1000 // no default for m_heightScaledRel1000 } OLEGenerated::~OLEGenerated () { } OLEGenerated &OLEGenerated::operator= (const OLEGenerated &rhs) { if (this == &rhs) return *this; NeedsDevice::operator= (rhs); memcpy (m_data, rhs.m_data, s_size); m_mappingMode = rhs.m_mappingMode; m_zero = rhs.m_zero; m_objectType = rhs.m_objectType; m_indent = rhs.m_indent; m_width = rhs.m_width; m_height = rhs.m_height; m_zero2 = rhs.m_zero2; m_numDataBytes = rhs.m_numDataBytes; m_zero3 = rhs.m_zero3; m_objectName = rhs.m_objectName; m_zero4 = rhs.m_zero4; m_numHeaderBytes = rhs.m_numHeaderBytes; m_zero5 = rhs.m_zero5; m_widthScaledRel1000 = rhs.m_widthScaledRel1000; m_heightScaledRel1000 = rhs.m_heightScaledRel1000; return *this; } bool OLEGenerated::verifyVariables (void) { CHECK_DEVICE; if (!Verify (Error::InvalidFormat, m_mappingMode == 0xE4, DWord (m_mappingMode))) return false; if (!Verify (Error::Warn, m_zero == 0, DWord (m_zero))) return false; if (!Verify (Error::InvalidFormat, m_objectType >= 1 && m_objectType <= 3, DWord (m_objectType))) return false; // m_indent will not be checked // m_width will not be checked // m_height will not be checked if (!Verify (Error::Warn, m_zero2 == 0, DWord (m_zero2))) return false; // m_numDataBytes will not be checked if (!Verify (Error::Warn, m_zero3 == 0, DWord (m_zero3))) return false; // m_objectName will not be checked if (!Verify (Error::Warn, m_zero4 == 0, DWord (m_zero4))) return false; if (!Verify (Error::InvalidFormat, m_numHeaderBytes == s_size, DWord (m_numHeaderBytes))) return false; if (!Verify (Error::Warn, m_zero5 == 0, DWord (m_zero5))) return false; // m_widthScaledRel1000 will not be checked // m_heightScaledRel1000 will not be checked return true; } bool OLEGenerated::readFromDevice (void) { CHECK_DEVICE; // read the data straight from the file if (!m_device->readInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not read OLEGenerated data"); ReadWord (m_mappingMode, m_data + 0); ReadDWord (m_zero, m_data + 2); ReadWord (m_objectType, m_data + 6); ReadWord (m_indent, m_data + 8); ReadWord (m_width, m_data + 10); ReadWord (m_height, m_data + 12); ReadWord (m_zero2, m_data + 14); ReadDWord (m_numDataBytes, m_data + 16); ReadDWord (m_zero3, m_data + 20); ReadDWord (m_objectName, m_data + 24); ReadWord (m_zero4, m_data + 28); ReadWord (m_numHeaderBytes, m_data + 30); ReadDWord (m_zero5, m_data + 32); ReadWord (m_widthScaledRel1000, m_data + 36); ReadWord (m_heightScaledRel1000, m_data + 38); return verifyVariables (); } bool OLEGenerated::writeToArray (void) { CHECK_DEVICE; WriteWord (m_mappingMode, m_data + 0); WriteDWord (m_zero, m_data + 2); WriteWord (m_objectType, m_data + 6); WriteWord (m_indent, m_data + 8); WriteWord (m_width, m_data + 10); WriteWord (m_height, m_data + 12); WriteWord (m_zero2, m_data + 14); WriteDWord (m_numDataBytes, m_data + 16); WriteDWord (m_zero3, m_data + 20); WriteDWord (m_objectName, m_data + 24); WriteWord (m_zero4, m_data + 28); WriteWord (m_numHeaderBytes, m_data + 30); WriteDWord (m_zero5, m_data + 32); WriteWord (m_widthScaledRel1000, m_data + 36); WriteWord (m_heightScaledRel1000, m_data + 38); return true; } bool OLEGenerated::writeToDevice (void) { CHECK_DEVICE; // ensure that the variables are in range if (!verifyVariables ()) return false; // write the variables to the array if (!writeToArray ()) return false; // write the data straight to the file if (!m_device->writeInternal (m_data, s_size)) ErrorAndQuit (Error::FileError, "could not write OLEGenerated data"); return true; } } // namespace MSWrite { // end of structures_generated.cpp