--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/languageinterworkingfw/servicehandler/src/liwxmlhandler.cpp Mon Mar 30 12:51:20 2009 +0300
@@ -0,0 +1,273 @@
+/*
+* Copyright (c) 2003-2005 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: Wrapper to XML parser interface. Loads the inline and external XML metadata
+* and populates the service provider metadata information. This class
+* uses Symbian SAX parser to load the metadata information.
+*
+*/
+
+
+
+
+
+
+
+#include "LiwXmlHandler.h"
+#include <f32file.h>
+#include "data_caging_path_literals.hrh"
+#include <e32capability.h>
+
+#include "LiwServiceData.h"
+#include <LiwVariant.h>
+
+_LIT8(KMetaDataName, "meta");
+
+
+/*
+ * Creates and returns an instance of \c CLiwXmlHandler
+ */
+CLiwXmlHandler* CLiwXmlHandler::NewL()
+{
+ CLiwXmlHandler* ptrToThis = CLiwXmlHandler::NewLC();
+ CleanupStack::Pop(ptrToThis);
+
+ return ptrToThis;
+}
+
+/*
+ * Creates and returns an instance of \c CLiwXmlHandler
+ * Leaves the created instance in the cleanupstack.
+ *
+ * @return an instance of \c CLiwXmlHandler
+ */
+CLiwXmlHandler* CLiwXmlHandler::NewLC()
+{
+ CLiwXmlHandler* ptrToThis = new (ELeave) CLiwXmlHandler();
+ CleanupStack::PushL(ptrToThis);
+
+ ptrToThis->ConstructL();
+
+ return ptrToThis;
+}
+
+
+/*
+ * Destructor. Deletes the handler to XML parser
+ */
+CLiwXmlHandler::~CLiwXmlHandler()
+{
+ if(iXmlHandler)
+ delete iXmlHandler;
+
+ if(iBuffer)
+ delete iBuffer;
+}
+
+/*
+ * Default constructor.
+ */
+CLiwXmlHandler::CLiwXmlHandler()
+{
+
+}
+
+/*
+ * Instantiates the SAX parser instance and registers itself
+ * as the callback to handle SAX events.
+ */
+void CLiwXmlHandler::ConstructL()
+{
+ TInt parserFeature = EErrorOnUnrecognisedTags | EXmlVersion_1_1;
+ iXmlHandler = CSenXmlReader::NewL(parserFeature);
+ iXmlHandler->SetContentHandler(*this);
+}
+
+/*
+ * Parses the inline XML content passed in the buffer. The parser
+ * is kick started to recevie SAX events. This method also accepts the
+ * reference to \c CLiwServiceData to store the parsed metadata name-value
+ * pairs.
+ */
+TInt CLiwXmlHandler::LoadServiceData(const TDesC8& aXmlBuffer,CLiwServiceData* aServiceData)
+{
+ iServiceData = aServiceData;
+
+ TRAPD(err,iXmlHandler->ParseL(aXmlBuffer));
+
+ TInt retVal = ESrvDataLoadFailed;
+
+ if(!err)
+ {
+ retVal = ESrvDataLoadSuccess;
+ }
+
+ return retVal;
+}
+
+/*
+ * Parses the XML content present in an external file. The parser
+ * is kick started to recevie SAX events. This method also accepts the
+ * reference to \c CLiwServiceData to store the parsed metadata name-value
+ * pairs.
+ */
+ #include <bautils.h>
+TInt CLiwXmlHandler::LoadServiceData(const TDesC& aFileToParse,CLiwServiceData* aServiceData)
+{
+ TInt retVal = ESrvDataLoadFailed;
+
+ iServiceData = aServiceData;
+
+ RFs fsSession;
+ User::LeaveIfError( fsSession.Connect() );
+
+ TFileName resFile;
+ resFile.Append(aFileToParse);
+
+ if(!BaflUtils::FileExists(fsSession,resFile))
+ {
+ fsSession.Close();
+ return ESrvDataFileNotFnd;
+ }
+
+
+ TRAPD(err,iXmlHandler->ParseL(fsSession,resFile));
+
+ fsSession.Close();
+ if(!err)
+ {
+ retVal = ESrvDataLoadSuccess;
+ }
+
+ return retVal;
+}
+
+/**
+* Receive notification of the beginning of a document.
+* @return KErrNone or some of the system-wide Symbian error codes.
+*/
+TInt CLiwXmlHandler::StartDocument()
+{
+ return KErrNone;
+}
+
+/**
+* Receive notification of the end of a document.
+* @return KErrNone or some of the system-wide Symbian error codes.
+*/
+TInt CLiwXmlHandler::EndDocument()
+{
+ return KErrNone;
+}
+
+/**
+* The important parsed elements are <metadata/> and its sub-element
+* <capability/>.
+* The other sub-elements (other than <capability/>) are considered
+* as service provider specific metadata name-value pairs.
+*
+* @return KErrNone or some of the system-wide Symbian error codes.
+*/
+TInt CLiwXmlHandler::StartElement( const TDesC8& /*aURI*/,
+ const TDesC8& aLocalName,
+ const TDesC8& /*aName*/,
+ const RAttributeArray& /* apAttrs */)
+{
+ if(iBuffer)
+ {
+ delete iBuffer;
+ iBuffer=NULL;
+ }
+
+ startBuf = aLocalName;
+ return KErrNone;
+}
+
+
+/**
+* The end of the elements such as <metadata/> and its sub-element
+* <capability/> are processed. The flags set for the processing of
+* <metadata> and it sub-elements like <capability/> are toggled off.
+*
+* @return KErrNone or some of the system-wide Symbian error codes.
+*/
+TInt CLiwXmlHandler::EndElement( const TDesC8& /*aURI*/,
+ const TDesC8& aLocalName,
+ const TDesC8& /*aName*/)
+{
+ if(0!=aLocalName.CompareF(KMetaDataName) && 0==aLocalName.CompareF(startBuf))
+ iServiceData->AddMetaDataL(aLocalName,*iBuffer);
+
+ delete iBuffer;
+ iBuffer = NULL;
+
+ return KErrNone;
+}
+
+/**
+* The metadata can be defined in the following XML format:
+*
+*
+* <metadata>
+* <metadata_keyname1>metadata_keyvalue1</metadata_keyname1>
+* <metadata_keyname2>metadata_keyvalue2</metadata_keyname2>
+* </metadata>
+*
+* A realistic example below
+*
+*
+* <metadata>
+* <capability>CapabilityReadDeviceData</capability>
+* <capability>CapabilityWriteDeviceData</capability>
+* <capability>CapabilityLocation</capability>
+* </metadata>
+*
+* This function obtains the character data defined within the
+* child elements of <metadata>. The child element name under <metadata>
+* is taken as metadata key and the character data under it as metadata
+* value and added to the internal metadata key-value pair entries.
+*
+* There could be multiple metadata keys having different values as
+* shown above
+*
+* Right now it supports only capability metadata information
+*
+*/
+TInt CLiwXmlHandler::Characters(const TDesC8& aBuf,
+ const TInt /* aStart */,
+ const TInt /* aLength */)
+{
+ if(iBuffer)
+ {
+ delete iBuffer;
+ iBuffer=NULL;
+ }
+
+
+ iBuffer = aBuf.Alloc();
+
+ return KErrNone;
+}
+
+/**
+* In case of parsing errors due to non-well formed XML content,
+* file not being present etc are handled here. In case of XML content
+* error, the metadata stored so far will be cleaned up.
+*
+* @return KErrNone or some of the system-wide Symbian error codes.
+*/
+
+TInt CLiwXmlHandler::Error(TInt /*aErrorCode*/)
+{
+ return ESrvDataLoadFailed;
+}