diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpdevicetagcontenthandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpdevicetagcontenthandler.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,318 @@ +/** @file +* Copyright (c) 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: Implements the CUpnpDeviceTagContentHandler class + * +*/ + + +#include "upnpdevicetagcontenthandler.h" +#include "upnpcontenthandlerscontroller.h" +#include "upnpiconlistcontenthandler.h" +#include "upnpdevicelistcontenthandler.h" +#include "upnpservicelistcontenthandler.h" +#include "upnpdevice.h" +#include "upnpdescriptionproperty.h" +#include "upnpdeviceliterals.h" + +//const TUint16 KReqiuredTagsBoundary(31) //first five bits +const TUint16 KReqiuredTagsBoundary(3); //we take first two bits as reqired +enum TFlagsPositions + { + EDeviceTypePos = 0, + EUDNPos, + EFriendlyNamePos, + EManufacturerPos, + EModelNamePos, + EManufacturerURLPos, //optional + EModelDescriptionPos, //optional + EModelNumberPos, //optional + EModelURLPos, //optional + ESerialNumberPos, //optional + EUPCPos, //optional + EIconListPos, //optional + EServiceListPos, //optional + EDeviceListPos, //optional + EPresentationURLPos //optional + }; + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::NewL +// Two-phased constructor +// ----------------------------------------------------------------------------- +// +CUpnpDeviceTagContentHandler* CUpnpDeviceTagContentHandler::NewL( + CUpnpContentHandlersController& aController, CUpnpDevice& aResultDevice, + TParseType aParseType ) + { + CUpnpDeviceTagContentHandler* deviceTagContentHandler = + CUpnpDeviceTagContentHandler::NewLC( aController, aResultDevice, + aParseType ); + CleanupStack::Pop( deviceTagContentHandler ); + return deviceTagContentHandler; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::NewLC +// Two-phased constructor. Leaves teh object on the CleanupStack +// ----------------------------------------------------------------------------- +// +CUpnpDeviceTagContentHandler* CUpnpDeviceTagContentHandler::NewLC( + CUpnpContentHandlersController& aController, CUpnpDevice& aResultDevice, + TParseType aParseType ) + { + CUpnpDeviceTagContentHandler* deviceTagContentHandler = + new (ELeave) CUpnpDeviceTagContentHandler( aController, aResultDevice, + aParseType ); + CleanupStack::PushL( deviceTagContentHandler ); + return deviceTagContentHandler; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::~CUpnpDeviceTagContentHandler +// Destructor of CUpnpDeviceTagContentHandler class +// ----------------------------------------------------------------------------- +// +CUpnpDeviceTagContentHandler::~CUpnpDeviceTagContentHandler() + { + delete iNameWithPrefix; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::CUpnpDeviceTagContentHandler +// Constructor +// ----------------------------------------------------------------------------- +// +CUpnpDeviceTagContentHandler::CUpnpDeviceTagContentHandler( + CUpnpContentHandlersController& aController, CUpnpDevice& aResultDevice, + TParseType aParseType ) : + CUpnpContentHandler( aController ), iResultDevice( aResultDevice ), + iCurrentState( EInitial ), iParseType( aParseType ) + { + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::ProcessDevicePropertyL +// Helper function that do necessary operation when device property is found. +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceTagContentHandler::ProcessDevicePropertyL( + TInt aFlagPosition, const TDesC8& aPropertyName ) + { + if ( IsTagRepeated( aFlagPosition, iFoundTags ) ) + { + SetIgnoreHandlerL(); + } + else + { + iCurrentState = EDeviceProperty; + iCurrentDevicePropertyName.Set( aPropertyName ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::OnStartElementL +// This method is a callback to indicate an element has been parsed. +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceTagContentHandler::OnStartElementL( const RTagInfo& aElement, + const RAttributeArray& /*aAttributes*/) + { + if ( EInitial == iCurrentState ) + { + const TDesC8& elementName( aElement.LocalName().DesC() ); + if ( elementName.Compare( KUpnpDeviceType ) == 0 ) + { + if ( IsTagRepeated( EDeviceTypePos, iFoundTags ) ) + { + SetIgnoreHandlerL(); + } + else + { + iCurrentState = EDeviceType; + } + } + else if ( elementName.Compare( KUpnpFriendlyName ) == 0 ) + { + ProcessDevicePropertyL( EFriendlyNamePos, KUpnpFriendlyName ); + } + else if ( elementName.Compare( KUpnpManufacturer ) == 0 ) + { + ProcessDevicePropertyL( EManufacturerPos, KUpnpManufacturer ); + } + else if ( elementName.Compare( KUpnpManufacturerURL ) == 0 ) + { + ProcessDevicePropertyL( EManufacturerURLPos, KUpnpManufacturerURL ); + } + else if ( elementName.Compare( KUpnpModelDescription ) == 0 ) + { + ProcessDevicePropertyL( EModelDescriptionPos, KUpnpModelDescription ); + } + else if ( elementName.Compare( KUpnpModelName ) == 0 ) + { + ProcessDevicePropertyL( EModelNamePos, KUpnpModelName ); + } + else if ( elementName.Compare( KUpnpModelNumber ) == 0 ) + { + ProcessDevicePropertyL( EModelNumberPos, KUpnpModelNumber ); + } + else if ( elementName.Compare( KUpnpModelURL ) == 0 ) + { + ProcessDevicePropertyL( EModelURLPos, KUpnpModelURL ); + } + else if ( elementName.Compare( KUpnpSerialNumber ) == 0 ) + { + ProcessDevicePropertyL( ESerialNumberPos, KUpnpSerialNumber ); + } + else if ( elementName.Compare( KUpnpUDN ) == 0 ) + { + RepeatedTagCheckL( EUDNPos, iFoundTags ); + iCurrentState = EUDN; + } + else if ( elementName.Compare( KUpnpUPC ) == 0 ) + { + ProcessDevicePropertyL( EUPCPos, KUpnpUPC ); + } + else if ( elementName.Compare( KUpnpPresentationURL ) == 0 ) + { + ProcessDevicePropertyL( EPresentationURLPos, KUpnpPresentationURL ); + } + else if ( elementName.Compare( KUpnpIconList ) == 0 ) + { + if ( IsTagRepeated( EIconListPos, iFoundTags ) ) + { + SetIgnoreHandlerL(); + } + else + { + iController.SetCurrentContentHandlerL( + CUpnpIconListContentHandler::NewL( iController, iResultDevice ) ); + } + } + else if ( elementName.Compare( KUpnpServiceList ) == 0 ) + { + if ( IsTagRepeated( EServiceListPos, iFoundTags ) ) + { + SetIgnoreHandlerL(); + } + else + { + iController.SetCurrentContentHandlerL( + CUpnpServiceListContentHandler::NewL( iController, iResultDevice ) ); + } + } + else if ( elementName.Compare( KUpnpDeviceList ) == 0 ) + { + if ( IsTagRepeated( EDeviceListPos, iFoundTags ) ) + { + SetIgnoreHandlerL(); + } + else + { + iController.SetCurrentContentHandlerL( + CUpnpDeviceListContentHandler::NewL( iController, iResultDevice, + iParseType ) ); + } + } + else + { + _LIT8(KColon, ":"); + iCurrentState = EDeviceProperty; //for f.e. dlna:tags + delete iNameWithPrefix; + iNameWithPrefix = NULL; + iNameWithPrefix = HBufC8::NewL( aElement.Prefix().DesC().Length() + + KColon().Length() + + aElement.LocalName().DesC().Length() ); + iNameWithPrefix->Des().Copy( aElement.Prefix().DesC() ); + iNameWithPrefix->Des().Append( KColon ); + iNameWithPrefix->Des().Append( aElement.LocalName().DesC() ); + iCurrentDevicePropertyName.Set( *iNameWithPrefix ); + } + } + else + { + SetIgnoreHandlerL(); + //User::Leave( KErrArgument ) //content="textOnly" + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::OnEndElementL +// This method is a callback to indicate the end of the element has been reached. +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceTagContentHandler::OnEndElementL( const RTagInfo& aElement ) + { + switch ( iCurrentState ) + { + case EInitial: + ASSERT( aElement.LocalName().DesC().Compare(KUpnpDevice)==0 ); + if ( (iFoundTags.iFlags & KReqiuredTagsBoundary) + == KReqiuredTagsBoundary ) + { + iController.SetPreviousContentHandler(); + } + else + { + User::Leave( KErrArgument ); //required tag not found + } + break; + default: + iCurrentState = EInitial; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceTagContentHandler::OnContentL +// This method is a callback that sends the content of the element. +// aErrorCode must be KErrNone, and that aBytes should contains complete +// content (one chunk). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceTagContentHandler::OnContentL( const TDesC8& aBytes ) + { + switch ( iCurrentState ) + { + case EDeviceProperty: + iResultDevice.AddDevicePropertyL( CUpnpDescriptionProperty::NewL( + iCurrentDevicePropertyName, aBytes ) ); + break; + case EDeviceType: + iResultDevice.SetTypeL( aBytes ); + break; + case EUDN: + { + _LIT8( KUUID, "uuid:" ); + if ( aBytes.Find( KUUID() ) == 0 ) //starts with uuid: + { + iResultDevice.SetUuidL( aBytes.Mid( KUUID().Length() ) ); + } + else + { + iResultDevice.SetUuidL( aBytes ); + //User::Leave( KErrArgument ) + } + break; + } + default: + //User::Leave( KErrArgument ) + break; + } + } + +TBool CUpnpDeviceTagContentHandler::InterestedInAllNamespaces() + { + return ETrue; + } + +// End of File