diff -r 5f0182e07bfb -r 5456b4e8b3a8 idlehomescreen/xmluicontroller/src/databuffertransactionelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/xmluicontroller/src/databuffertransactionelement.cpp Wed Sep 01 12:32:46 2010 +0100 @@ -0,0 +1,223 @@ +/* +* 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: Data buffer transaction element +* +*/ + + +#include "databuffertransactionelement.h" +#include "aixmluiutils.h" + +#include "xncomponent.h" +#include "xntype.h" +#include "xntext.h" +#include "xnnewsticker.h" +#include "xnmenuadapter.h" +#include "mxncomponentinterface.h" +#include "xnvolumecontrol.h" +#include "xnnodeappif.h" +#include "xnuiengineappif.h" +#include "xnproperty.h" +#include "xndompropertyvalue.h" +#include "aistrcnv.h" +#include "aixmluiconstants.h" + +// ============================ MEMBER FUNCTIONS =============================== + +using namespace AiXmlUiController; +using namespace XnTextInterface; + +CDataBufferTransactionElement::CDataBufferTransactionElement(AiUtility::CContentPriorityMap& aContentPriorityMap) + : CTransactionElement(aContentPriorityMap) + { + } + +CDataBufferTransactionElement* CDataBufferTransactionElement::NewL(AiUtility::CContentPriorityMap& aContentPriorityMap) + { + CDataBufferTransactionElement* self = new( ELeave ) CDataBufferTransactionElement(aContentPriorityMap); + + return self; + } + +CDataBufferTransactionElement::~CDataBufferTransactionElement() + { + delete iNewData; + delete iCid; + } + +void CDataBufferTransactionElement::InitializeL( CXnNodeAppIf& aTarget, const TDesC8& aData ) + { + CheckTypeL( aTarget ); + SetTarget( aTarget ); + + delete iNewData; + iNewData = NULL; + + iNewData = aData.AllocL(); + } + +void CDataBufferTransactionElement::InitializeL( CXnNodeAppIf& aTarget, const TDesC8& aData, + const TDesC& aCid, TInt aIndex ) + { + InitializeL( aTarget, aData ); + + iIndex = aIndex; + + delete iCid; + iCid = NULL; + + iCid = aCid.AllocL(); + } + +void CDataBufferTransactionElement::UpdateDataL() + { + // Set new text + SetDataL(); + + // Update content priority + UpdateContentPriorityL(); + } + +void CDataBufferTransactionElement::Reset() + { + CTransactionElement::Reset(); + + delete iNewData; + iNewData = NULL; + + delete iCid; + iCid = NULL; + + iIndex = KErrNotFound; + } + +TBool CDataBufferTransactionElement::IsSupported( CXnNodeAppIf& aTarget, + const TDesC8& aContentType ) + { + // Get target type info + CXnType* typeInfo = aTarget.Type(); + + if ( !typeInfo ) + { + return EFalse; + } + + const TDesC8& type = typeInfo->Type(); + + if ( aContentType == KContentTypeText ) // Text + { + // Text element and menu item supports + return ( type == XnTextInterface::MXnTextInterface::Type() || + type == KXnMenuItem || + type == KXnMenu || + type == XnPropertyNames::softkey::KNodeName || + type == XnPropertyNames::volumecontrol::KSlider ); + } + else if ( aContentType == KContentTypeImageSvg ) // SVG image + { + // Newsticker support + return ( type == XnNewstickerInterface::MXnNewstickerInterface::Type() ); + } + else if ( aContentType == KContentTypeData ) + { + return ( type == AiUiDef::xml::element::KData() ); + } + + return EFalse; + } + +void CDataBufferTransactionElement::CheckTypeL( CXnNodeAppIf& aTarget ) + { + // Get type info + const TDesC8& type = LeaveIfNull( aTarget.Type(), KErrNotSupported )->Type(); + + // Text element, menu item, data and newsticker supported + if ( type != XnTextInterface::MXnTextInterface::Type() && + type != KXnMenuItem && + type != KXnMenu && + type != XnPropertyNames::softkey::KNodeName && + type != XnPropertyNames::volumecontrol::KSlider && + type != XnNewstickerInterface::MXnNewstickerInterface::Type() && + type != AiUiDef::xml::element::KData() ) + { + User::Leave( KErrNotSupported ); + } + } + +void CDataBufferTransactionElement::SetDataL() + { + // Get type info + const TDesC8& type = LeaveIfNull( Target().Type(), KErrNotSupported )->Type(); + + if ( type == XnTextInterface::MXnTextInterface::Type() ) // Text element + { + // Set character data directly to target + Target().SetPCDataL( iNewData ? *iNewData : KNullDesC8() ); + } + else if ( type == XnPropertyNames::softkey::KNodeName || + type == KXnMenuItem || + type == KXnMenu ) // menu item + { + // Update label attribute value. + + // + CXnNodeAppIf& target = Target(); + + // Create new new label attribute value + CXnDomPropertyValue* propertyValue = + CXnDomPropertyValue::NewL( &target.UiEngineL()->StringPool() ); + + CleanupStack::PushL( propertyValue ); + + propertyValue->SetStringValueL( CXnDomPropertyValue::EString, + iNewData ? *iNewData : KNullDesC8() ); + + CXnProperty* newProperty = CXnProperty::NewL( XnPropertyNames::menu::KLabel, + propertyValue, + target.UiEngineL()->StringPool() ); + CleanupStack::Pop( propertyValue ); + + CleanupStack::PushL( newProperty ); + + // Set label attribute + target.SetPropertyL( newProperty ); + + CleanupStack::Pop( newProperty ); + + // Refresh menu + target.UiEngineL()->RefreshMenuL(); + } + else if ( type == XnPropertyNames::volumecontrol::KSlider ) // slider + { + // Get volume control interface + XnVolumeControlInterface::MXnVolumeControlInterface* volumeControl = NULL; + XnComponentInterface::MakeInterfaceL( volumeControl, Target() ); + LeaveIfNull( volumeControl, KErrNotSupported ); + + TInt32 volume = 0; + User::LeaveIfError( AiUtility::ParseInt( volume, iNewData ? *iNewData : KNullDesC8() ) ); + volumeControl->SetValue( volume ); + } + else if ( type == AiUiDef::xml::element::KData() ) + { + CXnComponent& component( Target().ParentL()->Component() ); + component.SetDataL( iNewData ? *iNewData : KNullDesC8(), iCid ? *iCid : KNullDesC(), iIndex ); + } + else + { + User::Leave( KErrNotSupported ); + } + } + +// End of File