diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/cfservices/cfcontextsourcecommandimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/src/cfservices/cfcontextsourcecommandimpl.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,449 @@ +/* +* Copyright (c) 2008-2008 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: CCFContextSourceCommandImpl class implementation. + * +*/ + + +// SYSTEM INCLUDES +#include + +// USER INCLUDES +#include "cfcontextsourcecommandimpl.h" +#include "cftrace.h" + +// CONSTANTS +_LIT( KUidAttribute, "uid" ); + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +CCFContextSourceCommandImpl::CCFContextSourceCommandImpl() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor. +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::ConstructL() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// Symbian two phased constructor. +// --------------------------------------------------------------------------- +// +CCFContextSourceCommandImpl* CCFContextSourceCommandImpl::NewL() + { + FUNC_LOG; + + CCFContextSourceCommandImpl* self = CCFContextSourceCommandImpl::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Symbian two phased constructor. +// Leaves pointer in the cleanup stack. +// --------------------------------------------------------------------------- +// +CCFContextSourceCommandImpl* CCFContextSourceCommandImpl::NewLC() + { + FUNC_LOG; + + CCFContextSourceCommandImpl* self + = new( ELeave ) CCFContextSourceCommandImpl; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// C++ destructor. +// --------------------------------------------------------------------------- +// +CCFContextSourceCommandImpl::~CCFContextSourceCommandImpl() + { + FUNC_LOG; + + iParameters.ResetAndDestroy(); + iAttributes.ResetAndDestroy(); + delete iName; + } + + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::Sender +// --------------------------------------------------------------------------- +// +const TCFSourceCommandSenderId& CCFContextSourceCommandImpl::Sender() const + { + FUNC_LOG; + + return iSender; + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::SetSender +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::SetSender( + const TCFSourceCommandSenderId& aSender ) + { + FUNC_LOG; + + iSender = aSender; + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::Name +// --------------------------------------------------------------------------- +// +const TDesC& CCFContextSourceCommandImpl::Name() const + { + FUNC_LOG; + + if ( iName ) + { + return *iName; + } + else + { + return KNullDesC; + } + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::SetNameL +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::SetNameL( const TDesC& aName ) + { + FUNC_LOG; + + delete iName; + iName = NULL; + iName = aName.AllocL(); + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::SourceUid +// --------------------------------------------------------------------------- +// +TUid CCFContextSourceCommandImpl::SourceUid() const + { + FUNC_LOG; + + TUid sourceUid = KNullUid; + + for ( TInt i = 0; i < iAttributes.Count(); ++i ) + { + CCFKeyValuePair* keyValue = iAttributes[ i ]; + if ( keyValue->Key().CompareF( KUidAttribute ) == 0 ) + { + TPtrC uidString( keyValue->Value() ); + TLex lex( uidString ); + + // Get rid of '0x'. + const TInt skip = 2; + lex.Inc( skip ); + + TUint32 uid = 0; + const TUint KLimit = 0xFFFFFFFF; + TInt err = lex.BoundedVal( uid, EHex, KLimit ); + if( err == KErrNone ) + { + sourceUid = TUid::Uid( uid ); + } + else + { + ERROR_1( err, "CCFContextSourceCommandImpl::SourceUid - Converting source uid from [%S] failed.", &uidString ); + } + + break; + } + } + + return sourceUid; + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::Attributes +// --------------------------------------------------------------------------- +// +const RKeyValueArray& CCFContextSourceCommandImpl::Attributes() const + { + FUNC_LOG; + + return iAttributes; + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::AddAttributeL +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::AddAttributeL( + CCFKeyValuePair* aAttribute ) + { + FUNC_LOG; + + iAttributes.AppendL( aAttribute ); + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::AddAttributesL +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::AddAttributesL( RKeyValueArray& aAttributes ) + { + FUNC_LOG; + + TInt insertPos = iAttributes.Count(); + for ( TInt i = aAttributes.Count() - 1; i >= 0; --i ) + { + CCFKeyValuePair* attribute = aAttributes[ i ]; + aAttributes.Remove( i ); + CleanupStack::PushL( attribute ); // CLEANUP<< attribute + iAttributes.Insert( attribute, insertPos ); + CleanupStack::Pop( attribute ); // CLEANUP>> attribute + } + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::Parameters +// --------------------------------------------------------------------------- +// +const RSourceCommandParameterArray& +CCFContextSourceCommandImpl::Parameters() const + { + FUNC_LOG; + + return iParameters; + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::AddParameterL +// --------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::AddParameterL( + CCFContextSourceCommandParameter* aParameter ) + { + FUNC_LOG; + + iParameters.AppendL( aParameter ); + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::Size +// --------------------------------------------------------------------------- +// +TInt CCFContextSourceCommandImpl::Size() const + { + FUNC_LOG; + + TInt size = 0; + + // Sender identity + size += sizeof( TCFSourceCommandSenderId ); + + // Name: length and size of iName + size += sizeof( TInt32 ); + size += iName->Size(); + + // Attributes: array count & data + size += sizeof( TInt32 ); + TInt count = iAttributes.Count(); + for ( TInt i = 0; i < count; ++i ) + { + // Key length & data + size += sizeof( TInt32 ); + size += iAttributes[ i ]->Key().Size(); + + // Value length & data + size += sizeof( TInt32 ); + size += iAttributes[ i ]->Value().Size(); + } + + // Parameters: array count & data + size += sizeof( TInt32 ); + count = iParameters.Count(); + for ( TInt i = 0; i < count; ++i ) + { + size += iParameters[ i ]->Size(); + } + + return size; + } + +//----------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::ExternalizeL +//----------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::ExternalizeL( RWriteStream& aStream ) const + { + FUNC_LOG; + + // Sender identity + const TUint8* senderId = reinterpret_cast< const TUint8* >( &iSender ); + aStream.WriteL( senderId, sizeof( TCFSourceCommandSenderId ) ); + + // Name + aStream.WriteInt32L( iName->Length() ); + aStream.WriteL( *iName ); + + // Attributes + TInt count = iAttributes.Count(); + aStream.WriteInt32L( count ); + for ( TInt i = 0; i < count; ++i ) + { + TPtrC buf( KNullDesC ); + + // Key length & data + buf.Set( iAttributes[ i ]->Key() ); + aStream.WriteInt32L( buf.Length() ); + aStream.WriteL( buf, buf.Length() ); + + // Value length & data + buf.Set( iAttributes[ i ]->Value() ); + aStream.WriteInt32L( buf.Length() ); + aStream.WriteL( buf, buf.Length() ); + } + + // Parameters + count = iParameters.Count(); + aStream.WriteInt32L( count ); + for ( TInt i = 0; i < count; ++i ) + { + iParameters[ i ]->ExternalizeL( aStream ); + } + + // Commit stream + aStream.CommitL(); + } + +//----------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::InternalizeL +//----------------------------------------------------------------------------- +// +void CCFContextSourceCommandImpl::InternalizeL( RReadStream& aStream ) + { + FUNC_LOG; + + // Clean up just in case + delete iName; + iName = NULL; + iAttributes.ResetAndDestroy(); + iParameters.ResetAndDestroy(); + + // Sender identity + TUint8* senderId = reinterpret_cast< TUint8* >( &iSender ); + aStream.ReadL( senderId, sizeof( TCFSourceCommandSenderId ) ); + + // Name + TInt len = aStream.ReadInt32L(); + iName = HBufC::NewL( len ); + TPtr namePtr = iName->Des(); + aStream.ReadL( namePtr, len ); + + // Attributes + TInt count = aStream.ReadInt32L(); + for ( TInt i = 0; i < count; ++i ) + { + // Key length & data + len = aStream.ReadInt32L(); + HBufC* key = HBufC::NewLC( len ); // CLEANUP<< key + TPtr keyPtr = key->Des(); + aStream.ReadL( keyPtr, len ); + + // Value length & data + len = aStream.ReadInt32L(); + HBufC* value = HBufC::NewLC( len ); // CLEANUP<< value + TPtr valuePtr = value->Des(); + aStream.ReadL( valuePtr, len ); + + // Create & append key value pair + CCFKeyValuePair* keyValuePair = CCFKeyValuePair::NewL( key, value ); + CleanupStack::Pop( value ); // CLEANUP>> value + CleanupStack::Pop( key ); // CLEANUP>> key + + CleanupStack::PushL( keyValuePair ); // CLEANUP<< keyValuePair + iAttributes.AppendL( keyValuePair ); + CleanupStack::Pop( keyValuePair ); // CLEANUP>> keyValuePair + } + + // Parameters + count = aStream.ReadInt32L(); + for ( TInt i = 0; i < count; ++i ) + { + // below // CLEANUP<< param + CCFContextSourceCommandParameter* param + = CCFContextSourceCommandParameter::NewLC(); + param->InternalizeL( aStream ); + iParameters.AppendL( param ); + CleanupStack::Pop( param ); // CLEANUP>> param + } + } + +// --------------------------------------------------------------------------- +// CCFContextSourceCommandImpl::CloneL +// --------------------------------------------------------------------------- +// +CCFContextSourceCommand* CCFContextSourceCommandImpl::CloneL() const + { + FUNC_LOG; + + // below // CLEANUP<< cmd + CCFContextSourceCommandImpl* cmd = CCFContextSourceCommandImpl::NewLC(); + + // Copy command sender identity. + cmd->iSender = iSender; + + // Copy name. + if ( iName ) + { + cmd->iName = iName->AllocL(); + } + + // Copy attributes. + for ( TInt i = 0; i < iAttributes.Count(); ++i ) + { + CCFKeyValuePair* keyValue = iAttributes[ i ]; + // below // CLEANUP<< attribute + CCFKeyValuePair* attribute = CCFKeyValuePair::NewLC( keyValue->Key(), + keyValue->Value() ); + cmd->iAttributes.AppendL( attribute ); + CleanupStack::Pop( attribute ); // CLEANUP>> attribute + } + + // Copy parameters. + for ( TInt i = 0; i < iParameters.Count(); ++i ) + { + CCFContextSourceCommandParameter* cmdParam = iParameters[ i ]; + // below // CLEANUP<< param + CCFContextSourceCommandParameter* param = cmdParam->CloneLC(); + cmd->iParameters.AppendL( param ); + CleanupStack::Pop( param ); // CLEANUP>> param + } + + CleanupStack::Pop( cmd ); // CLEANUP>> cmd + return cmd; + } + +// End of file