--- /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 <iostream>
+#include <new>
+#include <fstream>
+
+
+#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),<versionrange>,{\"DEPENDaa\", ... \"DEPENDzz\"}" << std::endl;
+ std::wcout << L" Define a dependency on another component version" << std::endl;
+ std::wcout << L"[UID],<versionrange>,{\"DEPENDaa\", ... \"DEPENDzz\"}" << std::endl;
+ std::wcout << L" Define a dependency on target hardware" << std::endl;
+ std::wcout << L"Where <versionrange> 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( <Package Uid> , <Operator> , <vMajor> , <vMinor> , <vBuild> )" << std::endl << std::endl;
+ std::wcout << L"<Package Uid> : UID of the installed package which is being queried in Hexadecimal" << std::endl;
+ std::wcout << L"<Operator> : Relational comparison operator ( = <> > >= < <= )" << std::endl;
+ std::wcout << L"<vMajor> : Major component of the version (Range 0 - 127)" << std::endl;
+ std::wcout << L"<vMinor> : Minor component of the version (Range 0 - 99)" << std::endl;
+ std::wcout << L"<vBuild> : 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;
+ }
+