/* * build.h * * This file is a part of NSIS. * * Copyright (C) 1999-2007 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. */ #ifndef _BUILD_H_ #define _BUILD_H_ #include "strlist.h" #include "lineparse.h" #include "lang.h" #include "ResourceEditor.h" #include "ResourceVersionInfo.h" #include "uservars.h" #include "ShConstants.h" #include "mmap.h" #include "manifest.h" #include "exehead/fileform.h" #include "exehead/config.h" #include #include #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES // Added by Sunil Kamath 11 June 2003 # include # include #endif #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT // Changed by Amir Szekely 31st July 2002 #include "compressor.h" #include "czlib.h" #include "cbzip2.h" #include "clzma.h" #endif//NSIS_CONFIG_COMPRESSION_SUPPORT #ifdef NSIS_CONFIG_PLUGIN_SUPPORT # include "Plugins.h" #endif //NSIS_CONFIG_PLUGIN_SUPPORT #define PS_OK 0 #define PS_EOF 1 #define PS_ERROR 50 #define PS_WARNING 100 // token placement #define TP_SEC 1 #define TP_FUNC 2 #define TP_CODE (TP_SEC | TP_FUNC) #define TP_GLOBAL 4 #define TP_PAGEEX 8 #define TP_PG (TP_GLOBAL | TP_PAGEEX) #define TP_ALL (TP_CODE | TP_PG) enum notify_e { MAKENSIS_NOTIFY_SCRIPT, MAKENSIS_NOTIFY_WARNING, MAKENSIS_NOTIFY_ERROR, MAKENSIS_NOTIFY_OUTPUT }; #define PAGE_CUSTOM 0 #define PAGE_LICENSE 1 #define PAGE_COMPONENTS 2 #define PAGE_DIRECTORY 3 #define PAGE_INSTFILES 4 #define PAGE_UNINSTCONFIRM 5 #define PAGE_COMPLETED 6 class CEXEBuild { public: CEXEBuild(); void initialize(const char *makensis_path); ~CEXEBuild(); // to add a warning to the compiler's warning list. void warning(const char *s, ...); // warning with file name and line count void warning_fl(const char *s, ...); // to add a defined thing. void define(const char *p, const char *v=""); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // Added by Ximon Eighteen 5th August 2002 void build_plugin_table(void); int plugins_processed; #endif //NSIS_CONFIG_PLUGIN_SUPPORT // process a script (you can process as many scripts as you want, // it is as if they are concatenated) int process_script(FILE *fp, char *curfilename); int process_oneline(char *line, char *curfilename, int lineptr); // you only get to call write_output once, so use it wisely. int write_output(void); void print_help(char *commandname=NULL); DefineList definedlist; int display_errors; int display_script; int display_warnings; int display_info; int linecnt; char *curfilename; FILE *fp; #ifdef _WIN32 HWND notify_hwnd; void notify(notify_e code, const char *data) const; #else void notify(notify_e code, const char *data) const { } #endif private: int check_write_output_errors() const; int prepare_uninstaller(); int pack_exe_header(); int set_compressor(const std::string& compressor, const bool solid); int update_exehead(const std::string& file, size_t *size=NULL); void update_exehead(const unsigned char *new_exehead, size_t new_size); // tokens.cpp bool is_valid_token(char *s); int get_commandtoken(char *s, int *np, int *op, int *pos); int GetCurrentTokenPlace(); int IsTokenPlacedRight(int pos, char *tok); // script.cpp #ifdef NSIS_SUPPORT_STANDARD_PREDEFINES // Added by Sunil Kamath 11 June 2003 char* set_file_predefine(char *); void restore_file_predefine(char *); char* set_timestamp_predefine(char *); void restore_timestamp_predefine(char *); char* set_line_predefine(int, BOOL); void restore_line_predefine(char *); void set_date_time_predefines(); void del_date_time_predefines(); #endif int parseScript(); int includeScript(char *f); int MacroExists(const char *macroname); #ifdef NSIS_FIX_DEFINES_IN_STRINGS void ps_addtoline(const char *str, GrowBuf &linedata, StringList &hist, bool bIgnoreDefines = false); #else void ps_addtoline(const char *str, GrowBuf &linedata, StringList &hist); #endif int doParse(const char *str); int doCommand(int which_token, LineParser &line); int do_add_file(const char *lgss, int attrib, int recurse, int *total_files, const char *name_override=0, int generatecode=1, int *data_handle=0, const std::set& excluded=std::set(), const std::string& basedir=std::string(""), bool dir_created=false); int add_file(const std::string& dir, const std::string& file, int attrib, const char *name_override, int generatecode, int *data_handle); int do_add_file_create_dir(const std::string& local_dir, const std::string& dir, int attrib=0); GrowBuf m_linebuild; // used for concatenating lines // used by doParse to do preprocessing struct ifblock { int hasexeced; int elseused; int ignore; int inherited_ignore; } *cur_ifblock; TinyGrowBuf build_preprocessor_data; void start_ifblock(); void end_ifblock(); int num_ifblock(); int last_line_had_slash; bool inside_comment; int multiple_entries_instruction; void ERROR_MSG(const char *s, ...) const; void SCRIPT_MSG(const char *s, ...) const; void INFO_MSG(const char *s, ...) const; #ifdef NSIS_CONFIG_PLUGIN_SUPPORT int add_plugins_dir_initializer(void); #endif //NSIS_CONFIG_PLUGIN_SUPPORT // build.cpp functions used mostly by script.cpp void set_code_type_predefines(const char *value = NULL); int getcurdbsize(); int add_section(const char *secname, const char *defname, int expand=0); int section_end(); int add_function(const char *funname); int function_end(); void section_add_size_kb(int kb); int section_add_flags(int flags); int section_add_install_type(int inst_type); int add_page(int type); int page_end(); int add_label(const char *name); int add_entry(const entry *ent); int add_entry_direct(int which, int o0=0, int o1=0, int o2=0, int o3=0, int o4=0, int o5=0); int add_db_data(IMMap *map); // returns offset int add_db_data(const char *data, int length); // returns offset int add_data(const char *data, int length, IGrowBuf *dblock); // returns offset int add_string(const char *string, int process=1, WORD codepage=CP_ACP); // returns offset (in string table) int add_intstring(const int i); // returns offset in stringblock int preprocess_string(char *out, const char *in, WORD codepage=CP_ACP); #ifdef NSIS_CONFIG_PLUGIN_SUPPORT // Added by Ximon Eighteen 5th August 2002 Plugins m_plugins; bool plugin_used; bool uninst_plugin_used; int build_plugin_unload; #endif //NSIS_CONFIG_PLUGIN_SUPPORT // build.cpp functions used mostly within build.cpp int datablock_optimize(int start_offset, int first_int); void printline(int l); int process_jump(LineParser &line, int wt, int *offs); int AddVersionInfo(); int ProcessPages(); void PrepareInstTypes(); void AddStandardStrings(); void PrepareHeaders(IGrowBuf *hdrbuf); int SetVarsSection(); int SetManifest(); int resolve_jump_int(const char *fn, int *a, int offs, int start, int end); int resolve_call_int(const char *fn, const char *str, int fptr, int *ofs); int resolve_instruction(const char *fn, const char *str, entry *w, int offs, int start, int end); int resolve_coderefs(const char *str); void print_warnings(); int uninstall_generate(); void set_uninstall_mode(int un); // lang.cpp functions and variables void InitLangTables(); LanguageTable *GetLangTable(LANGID &lang, bool create = true); char *GetLangNameAndCP(LANGID lang, unsigned int *codepage = NULL); int DefineLangString(char *name, int process=-1); int DefineInnerLangString(int id, int process=-1); int SetLangString(char *name, LANGID lang, char *string); int SetInnerString(int id, char *string); int GenerateLangTables(); void FillLanguageTable(LanguageTable *table); int HasUserDefined(int id) { const char *us = UserInnerStrings.get(id); return us && *us; }; LanguageTable *LoadLangFile(char *filename); void DeleteLangTable(LanguageTable *table); NLFRef NLFRefs[NLF_STRINGS]; bool keep_ref; StringsArray UserInnerStrings; bool defcodepage_set; GrowBuf lang_tables; LANGID last_used_lang; LangStringList build_langstrings; int build_langstring_num, ubuild_langstring_num; char build_font[1024]; int build_font_size; unsigned int uDefCodePage; // pages stuff int license_res_id; page *cur_page; int cur_page_type; int enable_last_page_cancel, uenable_last_page_cancel; int disable_window_icon; // User variables stuff int GetUserVarIndex(LineParser &line, int token); // Added by ramon 3 jun 2003 UserVarsStringList m_UserVarNames; int m_iBaseVarsNum; int DeclaredUserVar(const char *VarName); void VerifyDeclaredUserVarRefs(UserVarsStringList *pVarsStringList); ConstantsStringList m_ShellConstants; // a whole bunch O data. std::string stubs_dir; #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT ICompressor *compressor; CZlib zlib_compressor; CBzip2 bzip2_compressor; CLZMA lzma_compressor; #endif bool build_compressor_set; bool build_compressor_final; bool build_compress_whole; int build_compress; int build_compress_level; int build_compress_dict_size; bool no_space_texts; bool has_called_write_output; char build_packname[1024], build_packcmd[1024]; int build_overwrite, build_last_overwrite, build_crcchk, build_datesave, build_optimize_datablock, build_allowskipfiles; // Added by ramon 23 May 2003 header build_header, build_uninst, *cur_header; int uninstall_mode; int uninstall_size,uninstall_size_full; int uninstaller_writes_used; char build_output_filename[1024]; int build_include_depth; // Added by ramon 6 jun 2003 #ifdef NSIS_SUPPORT_VERSION_INFO CResourceVersionInfo rVersionInfo; char version_product_v[1024]; #endif int sectiongroup_open_cnt; FastStringList m_warnings; GrowBuf m_macros; StringList m_macro_entry; int db_opt_save, db_comp_save, db_full_size, db_opt_save_u, db_comp_save_u, db_full_size_u; FastStringList include_dirs; StringList ns_func; // function namespace StringList ns_label; // label namespace int build_cursection_isfunc; section *build_cursection; TinyGrowBuf build_sections, ubuild_sections, *cur_sections; GrowBuf build_entries,ubuild_entries, *cur_entries; GrowBuf build_instruction_entry_map,ubuild_instruction_entry_map, *cur_instruction_entry_map; TinyGrowBuf build_functions, ubuild_functions, *cur_functions; TinyGrowBuf build_labels, ubuild_labels, *cur_labels; StringList build_strlist, ubuild_strlist, *cur_strlist; GrowBuf build_langtables, ubuild_langtables, *cur_langtables; TinyGrowBuf build_pages, ubuild_pages, *cur_pages; TinyGrowBuf build_ctlcolors, ubuild_ctlcolors, *cur_ctlcolors; // don't forget to update the cache after updating the datablock // see datablock_optimize for an example MMapBuf build_datablock, ubuild_datablock; TinyGrowBuf build_datablock_cache, ubuild_datablock_cache; IGrowBuf *cur_datablock, *cur_datablock_cache; struct cached_db_size { int first_int; // size | (compressed ? 0x80000000 : 0) int start_offset; }; int build_filebuflen; TinyGrowBuf verbose_stack; unsigned char *m_exehead; size_t m_exehead_size; size_t m_exehead_original_size; bool branding_image_found; WORD branding_image_id; unsigned char *m_unicon_data; size_t m_unicon_size; #ifdef NSIS_SUPPORT_BGBG LOGFONT bg_font; LOGFONT bg_default_font; #endif #ifdef NSIS_CONFIG_COMPRESSION_SUPPORT int deflateToFile(FILE *fp, char *buf, int len); // len==0 to flush #endif manifest::comctl manifest_comctl; manifest::exec_level manifest_exec_level; CResourceEditor *res_editor; void init_res_editor(); void close_res_editor(); }; #endif //_BUILD_H_