presencecache/presencecacheutils/src/presencecachebuddyinfo.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presencecache/presencecacheutils/src/presencecachebuddyinfo.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,472 @@
+/*
+* Copyright (c) 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:  
+*
+*/
+
+
+#include <bamdesca.h>
+#include <s32strm.h>
+#include "presencecachebuddyinfo.h"
+#include <utf.h>
+
+#define STRCNST(x)  (const_cast<TDesC*>( &x ))
+
+// -----------------------------------------------------------------------------
+CPresenceCacheBuddyInfo::CPresenceCacheBuddyInfo()
+    {
+    // No implementation required
+    }
+
+// -----------------------------------------------------------------------------
+CPresenceCacheBuddyInfo::~CPresenceCacheBuddyInfo()
+    {      
+    iHashMap.Close();  
+    delete iAvailabilityTextBuf;
+    delete iStatusTextBuf;
+    delete iBuddyId;
+    
+    iIds.ResetAndDestroy();
+    iIds.Close();
+    iValues.ResetAndDestroy();
+    iValues.Close();    
+    }
+
+// ---------------------------------------------------------------------------
+// MPresenceBuddyInfo2::NewL()
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MPresenceBuddyInfo2* MPresenceBuddyInfo2::NewL( )
+    {
+    return CPresenceCacheBuddyInfo::NewL( );
+    }
+    
+EXPORT_C MPresenceBuddyInfo2* MPresenceBuddyInfo2::NewLC( )
+    {
+    CPresenceCacheBuddyInfo* info = CPresenceCacheBuddyInfo::NewLC( );
+    CleanupStack::Pop(info);
+    MPresenceBuddyInfo2* minfo = info;  
+    CleanupDeletePushL(minfo);
+    return minfo; 
+    }
+    
+// -----------------------------------------------------------------------------
+CPresenceCacheBuddyInfo* CPresenceCacheBuddyInfo::NewL()
+    {
+    CPresenceCacheBuddyInfo* self = NewLC();
+    CleanupStack::Pop(); // self;    
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+CPresenceCacheBuddyInfo* CPresenceCacheBuddyInfo::NewLC()
+    {
+    CPresenceCacheBuddyInfo* self = new (ELeave)CPresenceCacheBuddyInfo();
+    CleanupStack::PushL(self);
+    self->ConstructL();  
+    return self;
+    }    
+    
+// -----------------------------------------------------------------------------
+static TUint32 StringPtrHash( TDesC* const& aValue )
+    {
+    return DefaultHash::Des16( *aValue );
+    }
+
+// -----------------------------------------------------------------------------
+static TBool StringIdentity( TDesC* const& aA, TDesC* const& aB )
+    {
+    return !aA->CompareF( *aB );
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::ConstructL()
+    {
+    iHashMap.Close();
+    iHashMap = RHashMap<TDesC*, TInt>(    
+        THashFunction32<TDesC*>( StringPtrHash ),
+        TIdentityRelation<TDesC*>( StringIdentity ) );
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetIdentityL( 
+    const TDesC& aBuddyId )
+    {
+    delete iBuddyId;
+    iBuddyId = NULL;
+    iBuddyId = aBuddyId.AllocL( );        
+    }
+    
+// -----------------------------------------------------------------------------
+TPtrC CPresenceCacheBuddyInfo::BuddyId( ) const
+    {
+    return iBuddyId ? iBuddyId->Des() : TPtrC();
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetAvailabilityL( 
+    TAvailabilityValues aAvailability,
+    const TDesC& aAvailabilityText )
+    {  
+    iAvailability = aAvailability;    
+    DoSet16BitValueL( NPresenceCacheFieldName::KAvailability, aAvailabilityText );
+    }
+
+// -----------------------------------------------------------------------------
+MPresenceBuddyInfo2::TAvailabilityValues CPresenceCacheBuddyInfo::Availability( )
+    {
+    return iAvailability;    
+    }
+    
+// -----------------------------------------------------------------------------
+TPtrC CPresenceCacheBuddyInfo::AvailabilityText( )
+    {
+    return DoGet16BitValue( NPresenceCacheFieldName::KAvailability );
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::DoSet16BitValueL( 
+    const TDesC& aKey,    
+    const TDesC& aValue )
+    {   
+      
+    // Remove old values first
+    RemoveField( aKey );
+    
+    //Convert Unicode to Utf-8
+    HBufC8* convertBuffer =  CnvUtfConverter::ConvertFromUnicodeToUtf8L( aValue );
+    CleanupStack::PushL( convertBuffer );
+    HBufC* keyBuffer = aKey.AllocLC();    
+    
+    TInt insertPos = iIds.Find(0);
+    if ( insertPos < 0 )
+        {
+        insertPos = iIds.Count();
+        iIds.Append( keyBuffer );
+        iValues.Append( convertBuffer );
+        }
+    else
+        {
+        iIds[insertPos] = keyBuffer;
+        iValues[insertPos] = convertBuffer;
+        }
+    
+    iHashMap.InsertL( keyBuffer, insertPos  );
+        
+    CleanupStack::Pop( keyBuffer );
+    CleanupStack::Pop( convertBuffer );       
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::RemoveField(const TDesC& aKey )
+    {
+    TInt* pos = iHashMap.Find( STRCNST( aKey ) );    
+    if ( pos )
+        {
+        TInt mypos = *pos;
+        iHashMap.Remove( iIds[mypos ]);
+        
+        delete iIds[mypos];
+        iIds[mypos] = NULL;
+        
+        delete iValues[mypos];
+        iValues[mypos] = NULL;               
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+TPtrC CPresenceCacheBuddyInfo::DoGet16BitValue(const TDesC& aKey )
+    {
+    HBufC8* val = NULL;        
+    TInt* pos = iHashMap.Find( STRCNST( aKey ) );
+    TPtrC result( KNullDesC() );
+    
+    if ( pos )
+        {       
+        val = iValues[*pos];
+        if ( val )
+            {
+            HBufC* temp = NULL;
+            // Convert  Utf-8 to Unicode
+            TRAPD( errx,  temp = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *val ) );
+            if ( !errx && temp )
+                { 
+                // Avalibility text handled here
+                if ( !aKey.CompareF( NPresenceCacheFieldName::KAvailability ) )
+                	{
+                    delete iAvailabilityTextBuf;
+                    iAvailabilityTextBuf = NULL;                 	
+                    iAvailabilityTextBuf = temp; 
+                    result.Set( iAvailabilityTextBuf->Des() );
+                	}
+                // Status message handled here
+                else if( !aKey.CompareF( NPresenceCacheFieldName::KStatusMessage ) )
+                	{
+                    delete iStatusTextBuf;
+                    iStatusTextBuf = NULL;                 	
+                    iStatusTextBuf = temp;  
+                    result.Set( iStatusTextBuf->Des() );
+                	}
+                }
+            }
+        }
+    return result;
+    }
+    
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetAvatarL( 
+    const TDesC8& aAvatar )
+    {
+    SetAnyFieldL( NPresenceCacheFieldName::KAvatar, aAvatar);
+    }
+    
+// -----------------------------------------------------------------------------
+TPtrC8 CPresenceCacheBuddyInfo::Avatar( )
+    {
+    return GetAnyField( NPresenceCacheFieldName::KAvatar ); 
+    }
+    
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetStatusMessageL( 
+    const TDesC& aStatusMessage )
+    {
+    DoSet16BitValueL( NPresenceCacheFieldName::KStatusMessage, aStatusMessage );
+    }
+
+
+// -----------------------------------------------------------------------------
+TPtrC CPresenceCacheBuddyInfo::StatusMessage(  )
+    {
+    return DoGet16BitValue( NPresenceCacheFieldName::KStatusMessage );
+    }
+    
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetAnyFieldL( 
+    const TDesC16& aKey,
+    const TDesC8& aValue )
+    {
+    if( NPresenceCacheFieldName::KExpiry().CompareF( aKey ) == 0 )
+        {
+        TPckg<TInt64> expiryPck( iExpiryTime );
+        expiryPck.Copy( aValue );
+        // write also to key-value map
+        }
+    
+    // Remove old values first
+    RemoveField( aKey );    
+    
+    HBufC8* valueBuffer = aValue.AllocLC();      
+    HBufC* keyBuffer = aKey.AllocLC();  
+    
+    TInt insertPos = iIds.Find(0);
+    if ( insertPos < 0 )
+        {
+        insertPos = iIds.Count();
+        iIds.Append( keyBuffer );
+        iValues.Append( valueBuffer );
+        }
+    else
+        {
+        iIds[insertPos] = keyBuffer;
+        iValues[insertPos] = valueBuffer;
+        }
+    
+    iHashMap.InsertL( keyBuffer, insertPos  ); 
+    
+    CleanupStack::Pop( keyBuffer );
+    CleanupStack::Pop( valueBuffer );    
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::SetAnyFieldPtrL( 
+    HBufC16* aKey,
+    HBufC8* aValue )
+    {  
+    if ( !aKey )
+        {
+        User::Leave( KErrArgument );
+        }
+    // Remove old values first
+    RemoveField( aKey->Des() );
+         
+    TInt insertPos = iIds.Find(0);
+    if ( insertPos < 0 )
+        {
+        insertPos = iIds.Count();
+        iIds.Append( aKey );
+        iValues.Append( aValue );
+        }
+    else
+        {
+        iIds[insertPos] = aKey;
+        iValues[insertPos] = aValue;
+        }
+    iHashMap.InsertL( aKey, insertPos  );       
+    }
+    
+// -----------------------------------------------------------------------------
+TPtrC8 CPresenceCacheBuddyInfo::GetAnyField( 
+    const TDesC16& aKey )
+    {
+    HBufC8* val = NULL;    
+    TInt* pos = iHashMap.Find( STRCNST( aKey ) );
+    if ( pos )
+        {       
+        val = iValues[*pos];        
+        } 
+    return val ? val->Des() : TPtrC8();    
+    }
+    
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::GetFieldKeysL( 
+    CDesCArrayFlat& aKeys )
+    {
+    aKeys.Reset();
+    THashMapIter<TDesC*, TInt> iter(iHashMap);    
+    TDesC* const* nextKey = iter.NextKey();
+    while (nextKey)
+        {
+        aKeys.AppendL( **nextKey );
+        nextKey = iter.NextKey();
+        }    
+    }
+                                                                          
+// -----------------------------------------------------------------------------
+TBool CPresenceCacheBuddyInfo::EqualsIdentity(
+    const MPresenceBuddyInfo2& aOtherInstance ) const
+    {
+    TBool same = ETrue;
+
+    TBool x;
+    x = 0 == BuddyId().CompareF( aOtherInstance.BuddyId() );
+    same &= x;
+
+    return same;
+    }  
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::ExternalizeL( RWriteStream& aStream ) const
+    {
+    aStream.WriteInt32L( iAvailability ); 
+    ExternalizeFieldL( BuddyId(), aStream );
+           
+    // externalize expiry time
+    TUint32 time_high = I64HIGH( iExpiryTime );
+    TUint32 time_low = I64LOW( iExpiryTime );
+    aStream.WriteUint32L(time_high);
+    aStream.WriteUint32L(time_low);
+    
+    TInt count = iIds.Count();
+    aStream.WriteInt32L( count );     
+    for ( TInt i=0; i < count; i++ )
+        {
+        if ( iIds[i] )
+            {
+            TPtrC key = iIds[i]->Des();
+            TPtrC8 value = iValues[i] ? iValues[i]->Des() : TPtrC8();        
+            ExternalizeFieldL( key, aStream );        
+            ExternalizeFieldL( value, aStream );             
+            }
+        else
+            {
+            // nothing to insert, special case if replacement has been failed earlier
+            }
+        }
+    } 
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::InternalizeL( RReadStream& aStream )
+    {
+    iAvailability = (MPresenceBuddyInfo2::TAvailabilityValues)aStream.ReadInt32L( ); 
+    
+    HBufC* temp  = InternalizeFieldL( aStream );
+    iBuddyId = temp;
+       
+    iIds.ResetAndDestroy();
+    iValues.ResetAndDestroy();
+    
+    HBufC* key = NULL;
+    HBufC8* value = NULL;
+
+    // internalize expiry time
+    TUint32 time_high = aStream.ReadUint32L();
+    TUint32 time_low = aStream.ReadUint32L();
+    iExpiryTime = MAKE_TINT64( time_high, time_low );
+    
+    TInt count = aStream.ReadInt32L( );    
+    for ( TInt i=0; i < count; i++ )
+        {
+        key = InternalizeFieldL( aStream ); 
+        
+        CleanupStack::PushL( key );
+        value = InternalizeField8L( aStream );
+        CleanupStack::Pop( key );          
+        // This takes ownership anyway.
+        SetAnyFieldPtrL( key, value );                       
+        }      
+    } 
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::ExternalizeFieldL( const TDesC& aData, RWriteStream& aStream ) const
+    {
+    TInt32 length = aData.Length();    
+    aStream.WriteInt32L( length  );
+    aStream.WriteL( aData, length );
+    }
+
+// -----------------------------------------------------------------------------
+void CPresenceCacheBuddyInfo::ExternalizeFieldL( const TDesC8& aData, RWriteStream& aStream ) const
+    {
+    TInt32 length = aData.Length();    
+    aStream.WriteInt32L( length  );
+    aStream.WriteL( aData, length );
+    }
+
+// -----------------------------------------------------------------------------
+HBufC* CPresenceCacheBuddyInfo::InternalizeFieldL( RReadStream& aStream )
+    {
+    HBufC16* temp = NULL;    
+    TInt32 length = aStream.ReadInt32L();
+    if ( length > 0 )
+        { 
+        temp = HBufC::NewLC( length);
+        TPtr stringPtr = temp->Des(); 
+        aStream.ReadL( stringPtr, length );
+        CleanupStack::Pop( temp );
+        } 
+    else
+        {
+        }
+    return temp;
+    }
+
+// -----------------------------------------------------------------------------
+HBufC8* CPresenceCacheBuddyInfo::InternalizeField8L( RReadStream& aStream )
+    {
+    HBufC8* temp = NULL;    
+    TInt32 length = aStream.ReadInt32L();
+    if ( length > 0 )
+        { 
+        temp = HBufC8::NewLC( length);
+        TPtr8 stringPtr = temp->Des(); 
+        aStream.ReadL( stringPtr, length );
+        CleanupStack::Pop( temp );
+        } 
+    else
+        {
+        }
+    return temp;
+    }
+
+