--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/makesislib/packageparser.h Tue Jan 26 12:06:03 2010 +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_
+