/*
* 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;
}