diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/makesis/makesis.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/swisistools/source/makesis/makesis.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,606 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0"" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// makesis main function +// INCLUDES +// +// + +/** + @file + @internalComponent + @released +*/ +#include +#include +#include + + +#include "utils.h" +#include "utility_interface.h" +#include "openssllicense.h" +#include "makesis.h" + +// =========================================================================== +// CONSTANTS +// =========================================================================== + +#ifndef _UNICODE +#error _UNICODE expected +#endif // _UNICODE + +// =========================================================================== +// CMakeSIS +// The main application object. Controls the SIS file generation process +// =========================================================================== + +void CMakeSIS::ShowBanner() +// Displays the copyright... + { + std::wcout << std::endl << L"MAKESIS " << L" Version 5.3.0.0" << std::endl; + std::wcout << L"A utility for creating Software Installation (SIS) files" << std::endl; + std::wcout << L"Copyright (c) Symbian Software Ltd. 2000-2008 All rights reserved. " << std::endl; +#ifdef _DEBUG + std::wcout << std::endl << L"Development Version" << std::endl; +#endif + std::wcout << std::endl; + } + + +void CMakeSIS::DoMsg(const wchar_t* aText1, const wchar_t* aText2) const +// Purpose : Displays 'verbose' output text - if appropriate +// Inputs : pszText - The text to display + { + if(iLineNo > 0) + { + char fileName[PATHMAX] = "\0"; + ConvertWideCharToMultiByte(iCmdOptions.SourceFile() , -1 , fileName , PATHMAX); + unsigned long bytesWritten; + void *hndl = GetStdHandle(STD_OUTPUT_HANDLE); + WriteConsole(hndl,iCmdOptions.SourceFile(),wcslen(iCmdOptions.SourceFile()),&bytesWritten,0); + std::wcout << L"(" << iLineNo << L")" << L" : "; + } + + std::wcout << aText1 << aText2 << std::endl; + } + +void CMakeSIS::DoMsg(const wchar_t* aText) const + { + std::wcout << aText << std::endl; + } + +void CMakeSIS::DoErrMsg(const wchar_t* aText) const + { + DoMsg(L"error: ", aText); + } + +void CMakeSIS::DoVerbage(const wchar_t* aText) const +// Purpose : Displays 'verbose' output text - if appropriate +// Inputs : pszText - The text to display + { + if(Verbose()) + DoMsg(L"", aText); + } + +void CMakeSIS::ShowUtilsError(TUtilsException aError) +// Purpose : Write message for any error which occured whilst parsing the input pkg file +// Inputs : err - the error ID + { + switch(aError) + { + case ErrNotEnoughMemory: + DoErrMsg(L"not enough memory"); + break; + case ErrCannotOpenFile: + DoErrMsg(L"cannot open file, check filename and access rights"); + break; + case ErrCannotReadFile: + DoErrMsg(L"cannot read file, check access rights"); + break; + case ErrCannotWriteFile: + DoErrMsg(L"cannot write file, check disk space"); + break; + case ErrCannotConvertFile: + DoErrMsg(L"cannot convert file to unicode"); + DoErrMsg(L"make sure .PKG and .TXT files are either UTF8 or UNICODE"); + break; + case ErrCertFileKeyFileMismatch: + DoErrMsg(L"key file does not match certificate(s) given"); + DoErrMsg(L"make sure key and certificate(s) specified correspond"); + break; + } + } + +void CMakeSIS::AddErrMsg(const wchar_t* aText) + { + iInterpretSisReport.push_back(InterpretSisError(aText, iLineNo)); + } + +void CMakeSIS::AddInterpretSisError(TInterpretSisException aError) +// Purpose : Write message for any error which occured whilst parsing the input pkg file +// Inputs : err - the error ID + { + switch(aError) + { + case ErrInvalidAppType: + AddErrMsg(L"Invalid Application Type. Package type PP not supported"); + break; + case ErrEmbeddedSisNotSupported: + AddErrMsg(L"Embedded SIS file will not be installed by InterpretSis"); + break; + case ErrUserOptionsNotSupported: + AddErrMsg(L"User options are not supported"); + break; + default: + AddErrMsg(L"General error"); + break; + } + } + + +void CMakeSIS::ShowParseError(TParseException aError) +// Purpose : Write message for any error which occured whilst parsing the input pkg file +// Inputs : err - the error ID + { + switch(aError) + { + case ErrUnknownLine: + DoErrMsg(L"unknown line"); + break; + case ErrHeaderAlreadyDefined: + DoErrMsg(L"installation header already found"); + break; + case ErrUnknownLanguagesId: + DoErrMsg(L"unknown language specified"); + std::wcout << L" Usage : &aa[(dddd)],bb,...zz" << std::endl; + std::wcout << L" AF - Afrikaans, SQ - Albanian, AH - Amharic" << std::endl; + std::wcout << L" AR - Arabic, HY - Armenian, AU - Australian" << std::endl; + std::wcout << L" AS - Austrian, BA - Basque, BE - Belarussian, BN - Bengali"<< std::endl; + std::wcout << L" BG - Bulgarian, MY - Burmese, CA - Catalan" << std::endl; + std::wcout << L" TC - Taiwan Chinese, HK - Hong Kong Chinese"<< std::endl; + std::wcout << L" ZH - PRC Chinese"<< std::endl; + std::wcout << L" HR - Croatian, CS - Czech, DA - Danish, DU - Dutch" << std::endl; + std::wcout << L" EN - English, AM - American English, CE - Canadian English"<< std::endl; + std::wcout << L" IE - International English, SA - SOUTh African English" << std::endl; + std::wcout << L" ET - Estonian, FA - Farsi, FI - Finnish, BL - Belgian Flemish" << std::endl; + std::wcout << L" FR - French, BF - Belgian French, CF - Canadian French"<< std::endl; + std::wcout << L" IF - International French, SF - Swiss French"<< std::endl; + std::wcout << L" GD - Scots Gaelic, GL - Galician, KA - Georgian, GE - German" << std::endl; + std::wcout << L" SG - Swiss German, EL - Greek, GU - Gujarati"<< std::endl; + std::wcout << L" HE - Hebrew, HI - Hindi, HU - Hungarian" << std::endl; + std::wcout << L" IC - Icelandic, IN - Indonesian, GA - Irish"<< std::endl; + std::wcout << L" IT - Italian, SZ - Swiss Italian, JA - Japanese, " << std::endl; + std::wcout << L" KN - Kannada, KK - Kazakh, KM - Khmer"<< std::endl; + std::wcout << L" KO - Korean, LO - Laothian, LV - Latvian" << std::endl; + std::wcout << L" LT - Lithuanian, MK - Macedonian, MS - Malay" << std::endl; + std::wcout << L" ML - Malayalam, MR - Marathi, MO - Moldovian" << std::endl; + std::wcout << L" MN - Mongolian, NZ - New Zealand, NO - Norwegian" << std::endl; + std::wcout << L" NN - Norwegian Nynorsk, PL - Polish, PO - Portuguese"<< std::endl; + std::wcout << L" BP - Brazilian Portuguese, PA - Punjabi, RO - Romanian" << std::endl; + std::wcout << L" RU - Russian, SR - Serbian, SI - Sinhalese" << std::endl; + std::wcout << L" SK - Slovak, SL - Slovenian, SO - Somali"<< std::endl; + std::wcout << L" SP - Spanish, OS - International Spanish" << std::endl; + std::wcout << L" LS - Latin American Spanish"<< std::endl; + std::wcout << L" SH - Swahili, SW - Swedish, FS - Finland Swedish" << std::endl; + std::wcout << L" TL - Tagalog, TA - Tamil, TE - Telugu, TH - Thai" << std::endl; + std::wcout << L" BO - Tibetan, TI - Tigrinya, TU - Turkish"<< std::endl; + std::wcout << L" CT - Cyprus Turkish, TK - Turkmen, UK - Ukrainian" << std::endl; + std::wcout << L" UR - Urdu" << std::endl; + //Put reserved here + std::wcout << L" VI - Vietnamese, CY - Welsh, ZU - Zulu" << std::endl; + std::wcout << std::endl + << L" (dddd) - optional dialect ID" << std::endl; + break; + case ErrLanguagesAlreadyDefined: + DoErrMsg(L"the languages have already been defined"); + break; + case ErrLanguagesNotDefined: + DoErrMsg(L"languages have not been defined yet"); + break; + case ErrHeaderNotDefined: + DoErrMsg(L"the installation header has not been defined"); + break; + case ErrNoMainDependency: + DoErrMsg(L"missing main component dependency"); + std::wcout << L"the header UID should equal the UID of the main component and dependency" << std::endl; + break; + case ErrFileNotFound: + DoErrMsg(L"file not found"); + break; + case ErrPackageNotASISFile: + DoErrMsg(L"component is not a SIS file"); + break; + case ErrBadCondFormat: + DoErrMsg(L"incorrect condition format"); + std::wcout << L" Usage : IF condition" << std::endl; + std::wcout << L" ELSEIF condition" << std::endl; + std::wcout << L" ELSE" << std::endl; + std::wcout << L" ENDIF" << std::endl << std::endl; + std::wcout << L" condition : var op \"string\"" << std::endl; + std::wcout << L" var op number" << std::endl; + std::wcout << L" EXISTS \"filename\"" << std::endl; + std::wcout << L" (condition)AND(condition)" << std::endl; + std::wcout << L" (condition)OR(condition)" << std::endl; + std::wcout << L" NOT(condition)" << std::endl << std::endl; + std::wcout << L" op : = <> > < >= <=" << std::endl; + break; + case ErrReadFailed: + DoErrMsg(L"failed to read file"); + break; + case ErrBadOption: + DoErrMsg(L"invalid option"); + break; + case ErrBadString: + DoErrMsg(L"invalid string"); + break; + case ErrUnexpectedToken: + DoErrMsg(L"unexpected text"); + break; + case ErrInvalidEscape: + DoErrMsg(L"invalid UNICODE character value"); + break; + case ErrNumberOutOfRange: + DoErrMsg(L"number std::wcout of range"); + break; + case ErrUnknownVariable: + DoErrMsg(L"unknown variable name"); + std::wcout << L" Known variables :" << std::endl; + std::wcout << L" Manufacturer, ManufacturerHardwareRev, ManufacturerSoftwareRev," << std::endl; + std::wcout << L" ManufacturerSoftwareBuild" << std::endl; + std::wcout << L" Model" << std::endl; + std::wcout << L" MachineUid" << std::endl; + std::wcout << L" DeviceFamily, DeviceFamilyRev" << std::endl; + std::wcout << L" CPU, CPUArch, CPUABI, CPUSpeed" << std::endl; + std::wcout << L" SystemTickPeriod" << std::endl; + std::wcout << L" MemoryRAM, MemoryRAMFree, MemoryROM, MemoryPageSize" << std::endl; + std::wcout << L" PowerBackup" << std::endl; + std::wcout << L" Keyboard, KeyboardDeviceKeys, KeyboardAppKeys, KeyboardClick," << std::endl; + std::wcout << L" KeyboardClickVolumeMax" << std::endl; + std::wcout << L" DisplayXPixels, DisplayYPixels, DisplayXTwips, DisplayYTwips," << std::endl; + std::wcout << L" DisplayColors, DisplayContrastMax" << std::endl; + std::wcout << L" Backlight" << std::endl; + std::wcout << L" Pen, PenX, PenY, PenDisplayOn, PenClick, PenClickVolumeMax" << std::endl; + std::wcout << L" Mouse, MouseX, MouseY, MouseButtons" << std::endl; + std::wcout << L" CaseSwitch" << std::endl; + std::wcout << L" LEDs" << std::endl; + std::wcout << L" IntegratedPhone" << std::endl; + std::wcout << L" NumHalAttributes" << std::endl; + std::wcout << L" Language" << std::endl; + std::wcout << L" RemoteInstall" << std::endl; + break; + case ErrUninstallNeedsWaitEnd: + DoErrMsg(L"RW/RUNWAITEND option required with RR/RUNREMOVE or RB/RUNBOTH options"); + break; + case ErrUIDMismatch: + DoErrMsg(L"UID in the embedded SIS file is not the same as the UID given in the package file."); + break; + case ErrCannotGetFullPath: + DoErrMsg(L"Cannot get full path of embedded SIS file."); + break; + case ErrBadDestinationPath: + DoErrMsg(L"Bad destination path for file."); + break; + case ErrDuplicateUID: + DoErrMsg(L"UID in the embedded SIS file is the same as the UID of the main component."); + break; + case ErrExceedVersionNumber: + DoErrMsg(L"The version numbers cannot be more than 32767."); + break; + case ErrUnBalancedParenthesis: + DoErrMsg(L"parenthesis are not balanced"); + break; + case ErrHeaderRejectPreInstalledNonRemovable: + DoErrMsg(L"Pre-installed packages can not be marked as non-removable."); + break; + case ErrInvalidInstallFlagOption: + DoErrMsg(L"Install flag option is not supported with the given install type."); + break; + case ErrVersionInvalidRelationalOperator: + DoErrMsg(L"Invalid Relational Operator within VERSION() condition"); + ShowVersionFunctionSyntax(); + break; + case ErrVersionWildcardsNotSupported: + DoErrMsg(L"Wildcards are not supported within VERSION() conditions"); + ShowVersionFunctionSyntax(); + break; + case ErrVersionNegativesNotSupported: + DoErrMsg(L"Negative version components are not supported within VERSION() conditions"); + ShowVersionFunctionSyntax(); + break; + case ErrBadIntegerToStringConversion: + DoErrMsg(L"Failed to successfully convert integer value to string"); + break; + default: + DoErrMsg(L"syntax error"); + break; + } + } +void CMakeSIS::ShowCommandLineError(TCommandLineException aError) +// Purpose : Write message for any error which occured whilst processing the command line (to +// STDOUT ) +// Inputs : err - the error ID + { + switch(aError) + { + case ErrInsufficientArgs: + DoErrMsg(L"wrong number of arguments"); + break; + case ErrBadCommandFlag: + DoErrMsg(L"unknown flag"); + break; + case ErrBadSourceFile: + DoErrMsg(L"invalid source file"); + break; + case ErrNoSourceFile: + DoErrMsg(L"no source file specified"); + break; + case ErrCannotOpenSourceFile: + DoErrMsg(L"cannot open source file"); + break; + case ErrBadTargetFile: + DoErrMsg(L"invalid destination file"); + break; + default: + DoErrMsg(L"bad command line argumants"); + break; + } + } + +void CMakeSIS::ShowUsage() + { + std::wcout << L"Usage : MakeSIS [-h] [-i] [-s] [-v] [-c] [-d directory] pkgfile [sisfile]" << std::endl << std::endl; + std::wcout << L" Options : [-h] Show help page and PKG file format" << std::endl; + std::wcout << L" Options : [-i] Show Open SSL licence" << std::endl; + std::wcout << L" Options : [-s] Generate a ROM Stub" << std::endl; + std::wcout << L" Options : [-v] Verbose output to screen" << std::endl; + std::wcout << L" Options : [-c] Reports errors where the SIS file being generated will not be installable by InterpretSis" << std::endl; + std::wcout << L" Options : [-d directory] Directory path to search" << std::endl; + std::wcout << L" Options : [pkgfile] Name of the PKG file" << std::endl; + std::wcout << L" Options : [sisfile] Output SIS filename. If not specified, the filename will be derived from the name of the PKG file" << std::endl; + } + +void CMakeSIS::ShowSSL() + { + for (int index = 0; index < (sizeof(openSSLLicenseString)/sizeof(openSSLLicenseString[0])); index++) + std::cout << openSSLLicenseString [index] << std::endl; + } + +void CMakeSIS::ShowSyntax() +// Writes a PKG syntax summary to STDOUT + { + // Show the title + ShowBanner(); + std::wcout << L"MakeSIS PKG File format help" << std::endl; + std::wcout << L"============================" << std::endl << std::endl; + std::wcout << L"&aa[(dddd)],bb,...,zz Define languages used in installation. Choose from:-" << std::endl; + std::wcout << L" AF - Afrikaans, SQ - Albanian, AH - Amharic" << std::endl; + std::wcout << L" AR - Arabic, HY - Armenian, AU - Australian" << std::endl; + std::wcout << L" AS - Austrian, BA - Basque, BE - Belarussian, BN - Bengali"<< std::endl; + std::wcout << L" BG - Bulgarian, MY - Burmese, CA - Catalan" << std::endl; + std::wcout << L" TC - Taiwan Chinese, HK - Hong Kong Chinese"<< std::endl; + std::wcout << L" ZH - PRC Chinese"<< std::endl; + std::wcout << L" HR - Croatian, CS - Czech, DA - Danish, DU - Dutch" << std::endl; + std::wcout << L" EN - English, AM - American English, CE - Canadian English"<< std::endl; + std::wcout << L" IE - International English, SA - South African English" << std::endl; + std::wcout << L" ET - Estonian, FA - Farsi, FI - Finnish, BL - Belgian Flemish" << std::endl; + std::wcout << L" FR - French, BF - Belgian French, CF - Canadian French"<< std::endl; + std::wcout << L" IF - International French, SF - Swiss French"<< std::endl; + std::wcout << L" GD - Scots Gaelic, GL - Galician, KA - Georgian, GE - German" << std::endl; + std::wcout << L" SG - Swiss German, EL - Greek, GU - Gujarati"<< std::endl; + std::wcout << L" HE - Hebrew, HI - Hindi, HU - Hungarian" << std::endl; + std::wcout << L" IC - Icelandic, IN - Indonesian, GA - Irish"<< std::endl; + std::wcout << L" IT - Italian, SZ - Swiss Italian, JA - Japanese, " << std::endl; + std::wcout << L" KN - Kannada, KK - Kazakh, KM - Khmer"<< std::endl; + std::wcout << L" KO - Korean, LO - Laothian, LV - Latvian" << std::endl; + std::wcout << L" LT - Lithuanian, MK - Macedonian, MS - Malay" << std::endl; + std::wcout << L" ML - Malayalam, MR - Marathi, MO - Moldovian" << std::endl; + std::wcout << L" MN - Mongolian, NZ - New Zealand, NO - Norwegian" << std::endl; + std::wcout << L" NN - Norwegian Nynorsk, PL - Polish, PO - Portuguese"<< std::endl; + std::wcout << L" BP - Brazilian Portuguese, PA - Punjabi, RO - Romanian" << std::endl; + std::wcout << L" RU - Russian, SR - Serbian, SI - Sinhalese" << std::endl; + std::wcout << L" SK - Slovak, SL - Slovenian, SO - Somali"<< std::endl; + std::wcout << L" SP - Spanish, OS - International Spanish" << std::endl; + std::wcout << L" LS - Latin American Spanish"<< std::endl; + std::wcout << L" SH - Swahili, SW - Swedish, FS - Finland Swedish" << std::endl; + std::wcout << L" TL - Tagalog, TA - Tamil, TE - Telugu, TH - Thai" << std::endl; + std::wcout << L" BO - Tibetan, TI - Tigrinya, TU - Turkish"<< std::endl; + std::wcout << L" CT - Cyprus Turkish, TK - Turkmen, UK - Ukrainian" << std::endl; + std::wcout << L" UR - Urdu" << std::endl; + //Put reserved here + std::wcout << L" VI - Vietnamese, CY - Welsh, ZU - Zulu" << std::endl; + std::wcout << std::endl + << L" (dddd) - optional dialect ID" << std::endl << std::endl; + std::wcout << L"#{\"NAMEaa\", ... \"NAMEzz\"},(UID), Major, Minor, Build, Options" << std::endl; + std::wcout << L" Define file header, including name, uid and version" << std::endl; + std::wcout << L"%{\"Vendor-EN\", ... \"Vendor-FR\"}" << std::endl; + std::wcout << L" Localised vendor names" << std::endl; + std::wcout << L":\"Symbian Software Ltd\"" << std::endl; + std::wcout << L" The non-localised vendor name" << std::endl; + std::wcout << L"=\"logo.jpg\",\"image/jpeg\",\"target.jpg\"" << std::endl; + std::wcout << L" Define the logo using file, mimetype, and optional target" << std::endl; + std::wcout << L"\"Source\"-\"Destination\",Options" << std::endl; + std::wcout << L" File to be installed/viewed" << std::endl; + std::wcout << L"@\"Component\",(UID)" << std::endl; + std::wcout << L" Sub-component with UID to be installed" << std::endl; + std::wcout << L"(UID),,{\"DEPENDaa\", ... \"DEPENDzz\"}" << std::endl; + std::wcout << L" Define a dependency on another component version" << std::endl; + std::wcout << L"[UID],,{\"DEPENDaa\", ... \"DEPENDzz\"}" << std::endl; + std::wcout << L" Define a dependency on target hardware" << std::endl; + std::wcout << L"Where is defined as:" << std::endl; + std::wcout << L" Minimally, a single version of the form number major,minor,build" << std::endl; + std::wcout << L" optionally, you may specify a range of versions in the form" << std::endl; + std::wcout << L" major,minor,build~major,minor,build" << std::endl; + std::wcout << L" Versions may include the wildcard '*' or -1" << std::endl; + std::wcout << L"{ Start of a language block" << std::endl; + std::wcout << L"\"Source\" A file to install within a language block" << std::endl; + std::wcout << L"@\"Component\" A component to install within a language block" << std::endl; + std::wcout << L"}-\"Destination\", Options" << std::endl; + std::wcout << L" End a language block containing files" << std::endl; + std::wcout << L"},(UID) End a language block containing components" << std::endl; + std::wcout << L"IF condition Start of block which is installed if condition evaluates" << std::endl; + std::wcout << L" to TRUE at install time. Condition format is of the form:-" << std::endl; + std::wcout << L" condition : variable op number" << std::endl; + std::wcout << L" EXISTS \"filename\"" << std::endl; + std::wcout << L" (condition)AND(condition)" << std::endl; + std::wcout << L" (condition)OR(condition)" << std::endl; + std::wcout << L" NOT(condition)" << std::endl; + std::wcout << L" op : = <> > < >= <=" << std::endl; + std::wcout << L"ELSEIF condition Block which is installed if a previous condition block" << std::endl; + std::wcout << L" was not evaluated and condition is TRUE" << std::endl; + std::wcout << L"ELSE Block which is installed if no previous condition blocks" << std::endl; + std::wcout << L" were evaluated" << std::endl; + std::wcout << L"ENDIF Marks end of condition block(s)" << std::endl; + } + + + +void CMakeSIS::DisplayInterpretSisReport() const + { + char fileName[PATHMAX] = "\0"; + ConvertWideCharToMultiByte(iCmdOptions.SourceFile() , -1 , fileName , PATHMAX); + unsigned long bytesWritten; + void *hndl = GetStdHandle(STD_OUTPUT_HANDLE); + for (InterpretSisErrors::const_iterator curr = iInterpretSisReport.begin() ; + curr != iInterpretSisReport.end(); + ++curr) + { + WriteConsole(hndl,iCmdOptions.SourceFile(),wcslen(iCmdOptions.SourceFile()),&bytesWritten,0); + std::wcout << L"(" << curr->second << L")" << L" : " << curr->first << std::endl; + } + } + +void CMakeSIS::ShowVersionFunctionSyntax() const +// Writes the correct usage of the VERSION() condition syntax to the command line + { + std::wcout << std::endl; + std::wcout << L"Usage : VERSION( , , , , )" << std::endl << std::endl; + std::wcout << L" : UID of the installed package which is being queried in Hexadecimal" << std::endl; + std::wcout << L" : Relational comparison operator ( = <> > >= < <= )" << std::endl; + std::wcout << L" : Major component of the version (Range 0 - 127)" << std::endl; + std::wcout << L" : Minor component of the version (Range 0 - 99)" << std::endl; + std::wcout << L" : Build component of the version (Range 0 - 32767)" << std::endl; + } + + +CMakeSIS::CMakeSIS() : + iLineNo(0), + iDump(false), + iVerbose(false) + {} + +int CMakeSIS::Run(int argc, wchar_t* argv[]) +// Inputs : argc, argv, envp - The command line passed to the process + { + int err=1; + + try + { + iCmdOptions.ParseCommandLine(argc, argv); + bool bAbort = false; + if(iCmdOptions.ShowSSL ()) + { + ShowSSL (); + bAbort = true; + } + if(iCmdOptions.ShowSyntax ()) + { + ShowSyntax(); + bAbort = true; + } + if (bAbort) + { + return 0; + } + // We now have valid parameters + iVerbose = iCmdOptions.Flags() & CParseCmd::EOptVerbose; + iDump = (iCmdOptions.Flags() & CParseCmd::EOptDump) != 0; + + if (iCmdOptions.Flags() & CParseCmd::EOptPassword) + { + std::wcout << L"Warning: MakeSIS no longer signs. Use SignSIS." << std::endl; + } + + std::wcout << L"Processing " << iCmdOptions.SourceFile() << L"..." << std::endl; + + SISLogger::SetStream(std::wcout); + CPackageParser pkgParser(*this); + + if(iCmdOptions.Flags() & CParseCmd::EOptDirectory) + { + pkgParser.SetSearchDirectory(iCmdOptions.SearchPath()); + } + + + bool isStubFile= (iCmdOptions.Flags() & CParseCmd::EOptMakeStub) != 0; + pkgParser.MakeSis(iCmdOptions.SourceFile(), iCmdOptions.TargetFile(), isStubFile, iCmdOptions.InterpretSisReport()); + err = 0; + + if (iCmdOptions.InterpretSisReport()) + { + if ( iInterpretSisReport.empty() ) + { + std::wcout << L"*** SIS installation file VALID for InterpretSis ***" << std::endl; + } + else + { + std::wcout << L"*** SIS installation file INVALID for InterpretSis ***" << std::endl; + DisplayInterpretSisReport(); + err = 1; + } + } +#if defined (_DEBUG) + if (Dump ()) + pkgParser.Dump (std::cout); +#endif // _DEBUG + + std::wcout << L"Created " << iCmdOptions.TargetFile() << L"."; + } + catch(TCommandLineException err) + { + // Show the title + ShowBanner(); + ShowCommandLineError(err); + ShowUsage(); + } + catch(CSISException oops) + { + DoErrMsg (oops.widewhat ()); + err = 1; + } + catch(TParseException x) + { + ShowParseError(x); + } + catch(TUtilsException err) + { + ShowUtilsError(err); + } + return err; + + } + +// main function - constructs a CMakeSIS object and calls it's run method +int main(int argc, char *argv[]) + { +/* +MinGW doesn't support wide main() and wide character stuff also +But CommandLineArgs works as a wide main for MinGW and STLPort +is used for wide characters stuff. +*/ + wchar_t **argv1 = CommandLineArgs(argc,argv); + CMakeSIS app; + int reply = app.Run(argc, argv1); + cleanup(argc,argv1); + return reply; + } +