NSIS/Source/fileform.cpp
kichik 0aed504f4a happy new year!
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5917 212acab6-be3b-0410-9dea-997c60f758d6
2009-02-01 14:44:30 +00:00

194 lines
5.6 KiB
C++

/*
* fileform.cpp
*
* This file is a part of NSIS.
*
* Copyright (C) 1999-2009 Nullsoft and Contributors
*
* Licensed under the zlib/libpng license (the "License");
* you may not use this file except in compliance with the License.
*
* Licence details can be found in the file COPYING.
*
* This software is provided 'as-is', without any express or implied
* warranty.
*/
#include "fileform.h"
#include "exehead/config.h"
#include "Platform.h"
#include <cassert>
// these functions MUST be synchronized with the structures in Source/exehead/fileform.h !
// data must be written in the same order it's defined in Source/exehead/fileform.h
// in the future, i hope to get one of the two automtaically generated from the other
void firstheader_writer::write(const firstheader *data)
{
m_sink->write_int(data->flags);
m_sink->write_int(data->siginfo);
m_sink->write_int_array(data->nsinst, 3);
m_sink->write_int(data->length_of_header);
m_sink->write_int(data->length_of_all_following_data);
}
void block_header_writer::write(const block_header *data)
{
m_sink->write_int(data->offset);
m_sink->write_int(data->num);
}
void header_writer::write(const header *data)
{
m_sink->write_int(data->flags);
block_header_writer bw(writer::m_sink);
for (int i = 0; i < BLOCKS_NUM; i++)
{
bw.write(&data->blocks[i]);
}
m_sink->write_int(data->install_reg_rootkey);
m_sink->write_int(data->install_reg_key_ptr);
m_sink->write_int(data->install_reg_value_ptr);
#ifdef NSIS_SUPPORT_BGBG
m_sink->write_int(data->bg_color1);
m_sink->write_int(data->bg_color2);
m_sink->write_int(data->bg_textcolor);
#endif
#ifdef NSIS_CONFIG_VISIBLE_SUPPORT
m_sink->write_int(data->lb_bg);
m_sink->write_int(data->lb_fg);
#endif
m_sink->write_int(data->langtable_size);
#ifdef NSIS_CONFIG_LICENSEPAGE
m_sink->write_int(data->license_bg);
#endif//NSIS_CONFIG_LICENSEPAGE
#ifdef NSIS_SUPPORT_CODECALLBACKS
m_sink->write_int(data->code_onInit);
m_sink->write_int(data->code_onInstSuccess);
m_sink->write_int(data->code_onInstFailed);
m_sink->write_int(data->code_onUserAbort);
#ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT
m_sink->write_int(data->code_onGUIInit);
m_sink->write_int(data->code_onGUIEnd);
m_sink->write_int(data->code_onMouseOverSection);
#endif//NSIS_CONFIG_ENHANCEDUI_SUPPORT
m_sink->write_int(data->code_onVerifyInstDir);
#ifdef NSIS_CONFIG_COMPONENTPAGE
m_sink->write_int(data->code_onSelChange);
#endif//NSIS_CONFIG_COMPONENTPAGE
#ifdef NSIS_SUPPORT_REBOOT
m_sink->write_int(data->code_onRebootFailed);
#endif//NSIS_SUPPORT_REBOOT
#endif//NSIS_SUPPORT_CODECALLBACKS
#ifdef NSIS_CONFIG_COMPONENTPAGE
m_sink->write_int_array(data->install_types, NSIS_MAX_INST_TYPES + 1);
#endif
m_sink->write_int(data->install_directory_ptr);
m_sink->write_int(data->install_directory_auto_append);
#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
m_sink->write_int(data->str_uninstchild);
m_sink->write_int(data->str_uninstcmd);
#endif//NSIS_CONFIG_UNINSTALL_SUPPORT
#ifdef NSIS_SUPPORT_MOVEONREBOOT
m_sink->write_int(data->str_wininit);
#endif//NSIS_SUPPORT_MOVEONREBOOT
}
void section_writer::write(const section *data)
{
m_sink->write_int(data->name_ptr);
m_sink->write_int(data->install_types);
m_sink->write_int(data->flags);
m_sink->write_int(data->code);
m_sink->write_int(data->code_size);
m_sink->write_int(data->size_kb);
m_sink->write_string(data->name, NSIS_MAX_STRLEN);
}
void entry_writer::write(const entry *data)
{
m_sink->write_int(data->which);
m_sink->write_int_array(data->offsets, MAX_ENTRY_OFFSETS);
}
void page_writer::write(const page *data)
{
m_sink->write_int(data->dlg_id);
m_sink->write_int(data->wndproc_id);
#ifdef NSIS_SUPPORT_CODECALLBACKS
m_sink->write_int(data->prefunc);
m_sink->write_int(data->showfunc);
m_sink->write_int(data->leavefunc);
#endif //NSIS_SUPPORT_CODECALLBACKS
m_sink->write_int(data->flags);
m_sink->write_int(data->caption);
m_sink->write_int(data->back);
m_sink->write_int(data->next);
m_sink->write_int(data->clicknext);
m_sink->write_int(data->cancel);
m_sink->write_int_array(data->parms, 5);
}
void ctlcolors_writer::write(const ctlcolors *data)
{
m_sink->write_int(data->text);
m_sink->write_int(data->bkc);
m_sink->write_int(data->lbStyle);
m_sink->write_int((int) data->bkb);
m_sink->write_int(data->bkmode);
m_sink->write_int(data->flags);
}
void LOGFONT_writer::write(const LOGFONT *data)
{
m_sink->write_int(data->lfHeight);
m_sink->write_int(data->lfWidth);
m_sink->write_int(data->lfEscapement);
m_sink->write_int(data->lfOrientation);
m_sink->write_int(data->lfWeight);
m_sink->write_byte(data->lfItalic);
m_sink->write_byte(data->lfUnderline);
m_sink->write_byte(data->lfStrikeOut);
m_sink->write_byte(data->lfCharSet);
m_sink->write_byte(data->lfOutPrecision);
m_sink->write_byte(data->lfClipPrecision);
m_sink->write_byte(data->lfQuality);
m_sink->write_byte(data->lfPitchAndFamily);
m_sink->write_string(data->lfFaceName, LF_FACESIZE);
}
void lang_table_writer::write(const unsigned char *data)
{
assert(sizeof(LANGID) == sizeof(short));
m_sink->write_short(* (short *) data);
data += sizeof(short);
m_sink->write_int_array((int *) data, m_lang_strings + 2);
}
void lang_table_writer::write_block(IGrowBuf *buf, writer_sink *sink, const size_t table_size)
{
unsigned char *tables = (unsigned char *) buf->get();
size_t lang_strings = ( table_size - 2 * sizeof(int) - sizeof(LANGID) ) / sizeof(int);
size_t l = buf->getlen() / table_size;
lang_table_writer writer(sink, lang_strings);
for (size_t i = 0; i < l; i++)
{
writer.write(tables + i * table_size);
}
}