secureswitools/swisistools/source/makesislib/packageparser.h
changeset 0 ba25891c3a9e
child 24 5cc91383ab1e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/makesislib/packageparser.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,305 @@
+/*
+* Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+* handles parsing of PKG file
+*
+*/
+
+
+/**
+ @file
+ @publishedPartner
+ @released
+*/
+
+#ifndef __PACKAGE_PARSER_H_
+#define __PACKAGE_PARSER_H_
+
+// ===========================================================================
+// INCLUDES
+// ===========================================================================
+#include <iostream>
+#include <string>
+#include <map>
+
+#include "utils.h"
+#include "utility_interface.h"
+#include "sisexpression.h"
+#include "sisinstallblock.h"
+#include "basetype.h"
+#include "siswrite.h"
+#include "sislanguage.h"
+
+// ===========================================================================
+// CONSTANTS
+// ===========================================================================
+
+// maximum length of strings used in condition expressions
+#define MAX_STRING 255
+
+#define MAX_FUNC_ARGS 2
+
+// Error codes for possible parser failures
+enum TParseException
+	{
+	ErrUnknownLine,
+	ErrHeaderAlreadyDefined,
+	ErrLanguagesAlreadyDefined,
+	ErrLanguagesNotDefined,
+	ErrUnknownLanguagesId,
+	ErrHeaderNotDefined,
+	ErrNoMainDependency,
+	ErrFileNotFound,
+	ErrPackageNotASISFile,
+	ErrBadCondFormat,
+	ErrReadFailed,
+	ErrBadOption,
+	ErrBadString,
+	ErrUnexpectedToken,
+	ErrInvalidEscape,
+	ErrNumberOutOfRange,
+	ErrUnknownVariable,
+	ErrUninstallNeedsWaitEnd,
+	ErrUIDMismatch,
+	ErrCannotGetFullPath,
+	ErrBadDestinationPath,
+	ErrDuplicateUID,
+	ErrExceedVersionNumber,
+	ErrUnBalancedParenthesis,
+	ErrHeaderRejectPreInstalledNonRemovable,
+	ErrInvalidInstallFlagOption,
+	ErrVersionInvalidRelationalOperator,
+	ErrVersionWildcardsNotSupported,
+	ErrVersionNegativesNotSupported,
+	ErrBadIntegerToStringConversion
+	};
+
+/**
+ * Error codes for possible interpret SIS failures.
+ */
+enum TInterpretSisException
+	{
+	ErrInvalidAppType,
+	ErrEmbeddedSisNotSupported,
+	ErrInvalidInstallOptions,
+	ErrUserOptionsNotSupported,
+	ErrHalValuesNotSupported
+	};
+
+typedef int TOKEN;
+
+// ===========================================================================
+// INTERNAL DATA STRUCTURES CONSTRUCTED WHEN PARSING PKG FILE
+// ===========================================================================
+/**
+ * @internalComponent
+ * @released
+ */
+union VARIANTVAL
+// a variant, i.e. either a number or string value
+	{
+	LONG dwNumber;					// numeric value, e.g. 100
+	WCHAR pszString[MAX_STRING];	// string value, e.g. "crystal"
+	};
+
+#define MAXOPTLEN 20
+
+struct SParseOpt
+	{
+	wchar_t pszOpt[MAXOPTLEN];
+	DWORD dwOpt;
+	};
+
+// ===========================================================================
+// CLASS DEFINITIONS
+// ===========================================================================
+
+class MParserObserver
+// Callback mixin - allows disemination of progress data
+	{
+public:
+	/**
+	 * Output message
+	 * @param aText Message to display
+	 */
+	virtual void DoMsg(const wchar_t* aText) const = 0;
+	/**
+	 * Output 'verbose' messages
+	 * @param Message to display
+	 */
+	virtual void DoVerbage(const wchar_t* aText) const = 0;
+	/**
+	 * Output error messages
+	 * @param Message to display
+	 */
+	virtual void DoErrMsg(const wchar_t* aText) const = 0;
+	/**
+	 * Is verbose output required?
+	 * @return true if verbose output required else false.
+	 */
+	virtual bool Verbose() const = 0;
+	/**
+	 * Reset the verbosity status
+	 * @param aVerbose true to which on verbose or else false. 
+	 */
+	virtual bool SetVerbose(bool aVerbose) = 0;
+	/**
+	 * Set the Line number which is being processed
+	 * @param aLineNumber new line number
+	 */
+	virtual void SetLineNumber(int aLineNumber) = 0;
+	/**
+	 * Add error message for use later on
+	 * @param aError Error code
+	 */
+	virtual void AddInterpretSisError(TInterpretSisException aError) = 0; 
+	};
+
+class CInterpretSisHelper;
+
+class CSISFileDescription;
+typedef std::map<const std::wstring, CSISFileDescription> TDuplicates;
+typedef TDuplicates::const_iterator TDuplicatesConstIter;
+
+class CPackageParser
+	{
+public:
+	/**
+	 * Constructor
+	 * @param aObserver - observer to parsing messages. UI implementor needs
+	 * 			to implement this to get the parsing details.
+	 */
+	CPackageParser(MParserObserver& aObserver);
+	/**
+	 * The function parses the package file and creates a sis file.
+	 * In case of invalid package file the function throws exception. 
+	 * See TParseException for details.
+	 * If aReportInterpretSisError variable it true then this function 
+	 * will Report whether the interpretsis would not be able to provision 
+	 * this file. For details about errors refer TInterpretSisException.
+	 * 
+	 * @param aPkgFileName pkg file name
+	 * @param aSisFileName output sis file name
+	 * @param aMakeStub boolean which tells whether to create stub or not.
+	 * @param aReportInterpretSisError whether to report interpretsis failure or not.
+	 */
+	void MakeSis(const wchar_t* aPkgFileName, const wchar_t* aSisFileName, bool aMakeStub, bool aReportInterpretSisError);
+	
+	/**
+	 * This function will parse the package file. In case of any error it will
+	 * throw exception (TParseException).
+	 */
+	void ParseL (const wchar_t* aPkgFileName);
+	/**
+	 * Set the directory to search for files. The package file and all the files referenced
+	 * by the package is searched in this path.
+	 */
+	void SetSearchDirectory(const wchar_t* aPath);
+	/**
+	 * Create a hex dump of the created sis file.
+	 */
+	inline void Dump(std::ostream& aStream);
+
+private:
+	HANDLE OpenPackageFile(const wchar_t* aPkgFileName);
+	void ParseEmbeddedBlockL (CSISInstallBlock& aInstall);
+	void ParseLanguagesL();
+	void ParseHeaderL();
+	void ParseVendorNameL ();
+	void ParseLogoL ();
+	void ParseFileL (CSISInstallBlock& aInstall);
+	void ParsePackageL (CSISInstallBlock& aInstall);
+	void ParseOptionsBlockL ();
+	void ParseLanguageBlockL (CSISInstallBlock& aInstall);
+	void ParseIfBlockL (CSISInstallBlock& aInstall);
+	void ParseDependencyL();
+	void ParseTargetDeviceL();
+	void ParseSignatureL();
+	void ParsePropertyL ();
+	void ParseCommentL ();
+	void ParseVendorUniqueNameL ();
+	void ParseLogicalOp (CSISExpression& aExpression);
+	void ParseRelation(CSISExpression& aExpression);
+	void ParseUnary(CSISExpression& aExpression);
+	void ParseFactor(CSISExpression& aExpression);
+	std::wstring ParseVersionArgs();
+
+	DWORD ParseOption(const SParseOpt* options, DWORD dwNumOptions, DWORD* pdwOptions);
+	TVersion CPackageParser::ParseVersion();
+	std::wstring ConvertToString(const TInt32 aValue, std::ios_base& (*aBase)(std::ios_base&));
+	
+	//Function added for supporting supported language option
+	// in package file format.
+	std::wstring ParseSupportedLangArgs();
+	
+	void ExpectToken(TOKEN aToken);
+	void GetNextToken(const TBool aDisablePkgKeywordCheck = 0);
+	bool GetStringToken();
+	WORD ParseEscapeChars();
+	void GetAlphaNumericToken();
+	void GetNumericToken();
+	bool IsNumericToken();
+	void GetNextChar();
+
+	// validate the major , minor and build version.
+	void ValidateVersion(TInt32& aMajor, TInt32& aMinor, TInt32& aBuild);
+
+	const _TCHAR* GetTokenText(TOKEN aToken);
+	
+	// changed wstring to wchar_t for suite to prepend the path before filename.
+	static TUint32 Find(wchar_t *aWhat, CSISFileDescription& aFileDesciption);
+	static void Set(std::wstring& aWhat, CSISFileDescription& aData);
+
+	inline bool InterpretSis() const;
+
+	bool DoesExist(LPWSTR pszFile, DWORD *pdwSize);	 // Does the component file exist, how big is it
+	bool DoesFileExist (std::wstring& aFileName, TUint64& aSize);
+	
+	void ReportInterpretSisError(TInterpretSisException aException);
+	
+	void ComputeAndSetHash(CSISFileDescription& aFileDesc);
+
+private: // Private Member variables
+	bool				iValidSISFile;
+	bool 				iMakeStub;
+	bool 				iReportInterpretSisError;
+	bool 				iEnoughForStub;
+	bool 				iIsHeaderDefined;
+	bool 				iUniqueVendorName;
+	bool 				iLocalisedVendorNames;
+	wchar_t 			iPkgChar;
+	int					iLineNo;					// The line we are currently on
+	int 				iCurrentLang;				// If we are in a lang/lang file block - which lang are we processing
+	TOKEN 				iToken;
+	HANDLE 				iFileHandle;
+	MParserObserver&	iObserver;					 // The obseverer object
+	CSISXWriter 		iSISXWriter;		// Stuff all our intermediate data in here
+	VARIANTVAL 			iTokenValue;
+	wchar_t 			iSearchDir[PATHMAX];				 // Directory to search for component files
+
+	static TDuplicates 	iSrcFiles;
+	};
+
+// Inline member functions
+inline bool CPackageParser::InterpretSis() const
+	{
+	return iReportInterpretSisError; 
+	}
+
+inline void CPackageParser::Dump(std::ostream& aStream)
+	{
+	iSISXWriter.Dump(aStream);
+	}
+#endif // __PACKAGE_PARSER_H_
+