contextframework/cfw/src/cfservices/cfcontextsourcecommandimpl.cpp
changeset 0 2e3d3ce01487
--- /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 <s32strm.h>
+
+// 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