
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5917 212acab6-be3b-0410-9dea-997c60f758d6
194 lines
5.6 KiB
C++
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);
|
|
}
|
|
}
|