--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/vcommandmanager/src/vcxmlparser.h Thu Dec 17 08:46:30 2009 +0200
@@ -0,0 +1,537 @@
+/*
+* Copyright (c) 2005-2007 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: Parser class for Voice Commands XML
+*
+*/
+
+
+#ifndef VCXMLPARSER_H
+#define VCXMLPARSER_H
+
+// INCLUDES
+#include <e32base.h>
+#include <contenthandler.h>
+#include <parser.h>
+
+// DATA TYPES
+
+// Enumeration that is used when saving information
+// of last found xml tag
+enum TVcXmlTagNesting
+ {
+ EXmlStarted = 0,
+ EXmlDocument,
+ EXmlFolder,
+ EXmlVCommand,
+ EXmlSpoken,
+ EXmlWritten,
+ EXmlExecutes,
+ EXmlCmdlineparams,
+ EXmlIcon,
+ EXmlTooltip
+ };
+
+// FORWARD DECLARATIONS
+class CVcResource;
+
+// CLASS DECLARATION
+
+/**
+* Observer mixin class for Voice Commands XML parser
+*
+* @lib nssvcommandmanager.exe
+*
+*/
+NONSHARABLE_CLASS( MVcXmlParserObserver )
+ {
+ public: // New functions
+
+ /**
+ * Callback when voice command data has been completely resolved.
+ *
+ * @param aWrittenText Voice Command text in written form
+ * @param aSpokenText Voice Command text in spoken form
+ * @param aTooltipText Tooltip text
+ * @param aFolder Folder where Voice Command should be placed
+ * in the UI
+ * @param aFolderTitle String which is used in folder title pane
+ * @param aParameters Command line parameters for the application
+ * which is started
+ * @param aIcon Icon which is used when showing the voice command
+ * @param aAppId UID of the application which will be started
+ * @param aAppName Name of the application which will be started
+ * @param aStartImmediately ETrue if no TTS verification is needed when
+ * command has been recognized
+ * @param aUserCanModify ETrue if user can modify the command
+ * @param aFolderIconFile Full path to the MBM file where to get the folder icon from
+ * or KNullDesC if not defined
+ * @param aFolderIconIndex Index of the folder icon in the aFolderIconFile.
+ * or -1 if not defined
+ */
+ virtual void MvcxpoVoiceCommandFound( const TDesC& aWrittenText,
+ const TDesC& aSpokenText,
+ const TDesC& aTooltipText,
+ const TDesC& aFolder,
+ const TDesC& aFolderTitle,
+ const TDesC& aParameters,
+ TUid aIcon,
+ TUid aAppId,
+ const TDesC& aAppName,
+ TBool aStartImmediately,
+ TBool aUserCanModify,
+ const TDesC& aFolderIconFile,
+ TInt aFolderIconIndex
+ ) = 0;
+
+ };
+
+
+/**
+* Parser class for Voice Commands XML
+*
+* @lib nssvcommandmanager.exe
+*
+*/
+NONSHARABLE_CLASS( CVcXmlParser ) : public CBase, public Xml::MContentHandler
+ {
+ public: // Constructors and destructor
+
+ /**
+ * Two-phased constructor.
+ */
+ static CVcXmlParser* NewL( RFs& aRFs, MVcXmlParserObserver& aObserver );
+
+ /**
+ * Destructor.
+ */
+ virtual ~CVcXmlParser();
+
+ public: // New functions
+
+ /**
+ * Parses one XML file
+ *
+ * @param aFileName XML file name
+ */
+ void ParseFileL( const TFileName& aFileName );
+
+
+
+ public: // From Xml::MContentHandler
+
+ /**
+ This method is a callback to indicate the start of the document.
+ @param aDocParam Specifies the various parameters of the document.
+ @param aDocParam.iCharacterSetName The character encoding of the document.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartDocumentL( const Xml::RDocumentParameters& aDocParam,
+ TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate the end of the document.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndDocumentL( TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate an element has been parsed.
+ @param aElement is a handle to the element's details.
+ @param aAttributes contains the attributes for the element.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartElementL( const Xml::RTagInfo& aElement,
+ const Xml::RAttributeArray& aAttributes,
+ TInt aErrorCode );
+
+ /**
+ This method is a callback to indicate the end of the element has been reached.
+ @param aElement is a handle to the element's details.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndElementL( const Xml::RTagInfo& aElement, TInt aErrorCode );
+
+ /**
+ This method is a callback that sends the content of the element.
+ Not all the content may be returned in one go. The data may be sent in chunks.
+ When an OnEndElementL is received this means there is no more content to be sent.
+ @param aBytes is the raw content data for the element.
+ The client is responsible for converting the data to the
+ required character set if necessary.
+ In some instances the content may be binary and must not be converted.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnContentL( const TDesC8& aBytes, TInt aErrorCode );
+
+ /**
+ This method is a notification of the beginning of the scope of a prefix-URI Namespace mapping.
+ This method is always called before the corresponding OnStartElementL method.
+ @param aPrefix is the Namespace prefix being declared.
+ @param aUri is the Namespace URI the prefix is mapped to.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnStartPrefixMappingL( const RString& aPrefix,
+ const RString& aUri,
+ TInt aErrorCode );
+
+ /**
+ This method is a notification of the end of the scope of a prefix-URI mapping.
+ This method is called after the corresponding DoEndElementL method.
+ @param aPrefix is the Namespace prefix that was mapped.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnEndPrefixMappingL( const RString& aPrefix, TInt aErrorCode );
+
+ /**
+ This method is a notification of ignorable whitespace in element content.
+ @param aBytes are the ignored bytes from the document being parsed.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, TInt aErrorCode );
+
+ /**
+ This method is a notification of a skipped entity. If the parser encounters an
+ external entity it does not need to expand it - it can return the entity as aName
+ for the client to deal with.
+ @param aName is the name of the skipped entity.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnSkippedEntityL( const RString& aName, TInt aErrorCode );
+
+ /**
+ This method is a receive notification of a processing instruction.
+ @param aTarget is the processing instruction target.
+ @param aData is the processing instruction data. If empty none was supplied.
+ @param aErrorCode is the error code.
+ If this is not KErrNone then special action may be required.
+ */
+ void OnProcessingInstructionL( const TDesC8& aTarget,
+ const TDesC8& aData,
+ TInt aErrorCode );
+
+ /**
+ This method indicates an error has occurred.
+ @param aError is the error code
+ */
+ void OnError( TInt aErrorCode );
+
+ /**
+ This method obtains the interface matching the specified uid.
+ @return 0 if no interface matching the uid is found.
+ Otherwise, the this pointer cast to that interface.
+ @param aUid the uid identifying the required interface.
+ */
+ TAny* GetExtendedInterface( const TInt32 aUid );
+
+
+ private:
+
+ /**
+ * C++ default constructor.
+ */
+ CVcXmlParser( RFs& aRFs, MVcXmlParserObserver& aObserver );
+
+ /**
+ * By default Symbian 2nd phase constructor is private.
+ */
+ void ConstructL();
+
+ /**
+ * Checks if attribute value equals to the expected. If no value is given, just
+ * checks that the attribute exists.
+ *
+ * @param aAttributes List of attributes
+ * @param aAttribute Name of the attribute which is searched
+ * @param aValue Needed value.
+ * @return ETrue if attribute was found, EFalse otherwise
+ */
+ TBool CheckAttributeL( const Xml::RAttributeArray& aAttributes,
+ const TDesC8& aAttribute, const TDesC8& aValue = KNullDesC8 );
+
+
+ /**
+ * Resolves content of <nssvcommands> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if document tag was resolved
+ */
+ TBool ResolveDocumentTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <vcommandfolder> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if folder tag was resolved
+ */
+ TBool ResolveFolderTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <vcommand> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if vcommand tag was resolved
+ */
+ TBool ResolveVCommandTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <spoken> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if spoken tag was resolved
+ */
+ TBool ResolveSpokenTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <written> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if written tag was resolved
+ */
+ TBool ResolveWrittenTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <tooltip> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return Error code
+ */
+ TBool ResolveTooltipTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <executes> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return Error code
+ */
+ TBool ResolveExecutesTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <cmdlineparams> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if commandline parameters were found correctly
+ */
+ TBool ResolveCmdlineparamsTag( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Resolves content of <icon> element.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return ETrue if icon element was found
+ */
+ TBool ResolveIconTagL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Destroys the data of one voice command folder.
+ */
+ void ResetVCommandFolder();
+
+ /**
+ * Destroys the data of one voice command.
+ */
+ void ResetVCommandInfo();
+
+ /**
+ * Checks that all mandatory data is found for one voice command.
+ */
+ void CheckVoiceCommmandData();
+
+ /**
+ * Reads localized string from loc file based on locindex attribute
+ *
+ * @param aAttributes Attribute list
+ * @param aAttributeName Name of the loc index attribute
+ * @return Error code
+ */
+ TBool GetLocalizedStringL( const Xml::RAttributeArray& aAttributes,
+ const TDesC8& aAttributeName );
+
+ /**
+ * Reads uid attribute and constructs TUid
+ *
+ * @params aAttributes List of XML attributes
+ * @return Parsed UID
+ */
+ TUid ResolveUidL( const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Reads exe attribute and constructs exe file name
+ *
+ * @params aAttributes List of XML attributes
+ * @return Error code
+ */
+ TBool ResolveExeL( const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Reads the iconfile attribute and constructs the file name or
+ * sets it to NULL
+ *
+ * @params aAttributes List of XML attributes
+ * @return ETrue if resolved successfully, EFalse otherwise
+ */
+ TBool ResolveFolderIconFileL( const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Reads the iconindex attribute and stores the index or sets it to 0
+ *
+ * @params aAttributes List of XML attributes
+ * @return parsed index if any. -1 if there is no icon index
+ */
+ TInt ResolveFolderIconIndexL( const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Common function to resolve content of all elements which contain localized data.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @param aExpectedName Expected element name
+ * @param aTagEnum Enum value equal to tag name
+ * @param aAttributeName name of the attribute which contains loc index
+ * @return Error code
+ */
+ TBool ResolveLocalizedTagL( const TDesC8& aName, const Xml::RAttributeArray& aAttributes,
+ const TDesC8& aExpectedName, TVcXmlTagNesting aTagEnum );
+
+
+
+ /**
+ * Tries to find matching element name from the attribute list.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return Found attribute as a 16-bit descriptor
+ */
+ const TDesC& Find16ValueL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Tries to find matching element name from the attribute list.
+ *
+ * @param aName Element name
+ * @param aAttributes Attribute list
+ * @return Found attribute as a 8-bit descriptor
+ */
+ const TDesC8& Find8ValueL( const TDesC8& aName,
+ const Xml::RAttributeArray& aAttributes );
+
+ /**
+ * Converts given string to lowercase
+ *
+ * @param aString String to convert
+ * @return Converted string
+ */
+ HBufC8* ToLowercaseLC( const TDesC8& aString );
+
+ /**
+ * Pops the last element from XML stack if aTagName and aExpectedTag are equal
+ *
+ * @param aTagName Tag name which was found in XML file
+ * @param aExpectedTag Tag which was expected
+ */
+ void PopFromStackIfFoundL( const TDesC8& aTagName, const TDesC8& aExpectedTag );
+
+ private: // Data
+
+ // Callback observer
+ MVcXmlParserObserver& iObserver;
+
+ // Currently open localization resource file
+ CVcResource* iResource;
+
+ // String read from localization resource file
+ HBufC* iCurrentLocalizedString;
+
+ // Stack of XML elements
+ RArray<TVcXmlTagNesting> iXmlNesting;
+
+ // Data for one Voice Command
+ // Text shown on screen
+ HBufC* iWrittenText;
+
+ // Text which will be trained, if KNullDesC then iWrittenText will be trained
+ HBufC* iSpokenText;
+
+ // Icon
+ TUid iIcon;
+
+ // Text of the tooltip
+ HBufC* iTooltipText;
+
+ // Folder name, if it does not exist, then it will be created
+ // If NULL then "root" will be used
+ HBufC* iFolder;
+
+ // Title pane text for folder
+ HBufC* iFolderTitle;
+
+ HBufC* iFolderIconFile;
+
+ TInt iFolderIconIndex;
+
+ // UID of the application which will be started when this voice command has been recognized
+ TUid iAppId;
+
+ // Name of the application which will be started when this voice command has been recognized
+ HBufC* iAppName;
+
+ // Command line parameters for the application which will be started
+ HBufC* iParameters;
+ HBufC8* iParameters8;
+
+ // TTS feedback & adaptation of the recognition result on/off
+ TBool iStartImmediately;
+
+ // Can user modify?
+ TBool iUserCanModify;
+
+ // Value for attribute
+ HBufC* iAttributeValue;
+
+ // XML Parser
+ Xml::CParser* iParser;
+
+ // File system handle
+ RFs& iRFs;
+ };
+
+#endif // VCXMLPARSER_H
+
+// End of File