IMPSengine/datautils/src/impsdatautils.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/datautils/src/impsdatautils.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,762 @@
+/*
+* Copyright (c) 2002 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: Util classes for imps data accessor
+* 
+*/
+
+
+// INCLUDE FILES
+#include    <e32base.h>
+#include    <centralrepository.h>
+#include    <imcvcodc.h>
+#include	<miutconv.h>
+#include    "impskey.h"
+#include    "impsdatautils.h"
+#include    "impsdataaccessor.h"
+#include    "impsliterals.h"
+#include    "wvengineinternalcrkeys.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::TImpsDataUtils(
+// -----------------------------------------------------------------------------
+EXPORT_C TImpsDataUtils::TImpsDataUtils()
+    {
+    }
+   
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetSenderL
+// -----------------------------------------------------------------------------
+EXPORT_C void TImpsDataUtils::GetSenderL(
+            MImpsKey* aKey, 
+            MImpsDataAccessor* aAc,
+            TPtrC& aSender,      // Sender(User(UserID) or ScreenName if a GroupID
+            TPtrC& aGroup)       // Sender(ScreenName(SName, GroupID))
+    {
+
+    aKey->AddL( CREATEKEY( EImpsKeySender, 0 ) );
+
+    // Get User:UserID
+    TDesC* myPtr;
+    aKey->AddL( CREATEKEY( EImpsKeyUser, 0 ) );
+    aKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) );
+    if ( aAc->RestoreDescL( aKey, myPtr ) )
+        {
+        aSender.Set( *myPtr );
+        aGroup.Set( KNullDesC );
+        aKey->PopL( 2 );       // UserID, User
+        }
+    else
+        {
+        aKey->PopL( 2 );       // UserID, User
+        aKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) );
+        aKey->AddL( CREATEKEY( EImpsKeyScreenName, 0 ) );    
+        aKey->AddL( CREATEKEY( EImpsKeySName, 0 ) ); 
+        if ( aAc->RestoreDescL( aKey, myPtr ) )        
+            {
+			if( myPtr )
+                aSender.Set( *myPtr );
+            else
+                aSender.Set( KNullDesC );
+            aKey->ReplaceLastL( CREATEKEY( EImpsKeyGroupID, 0 ) ); 
+            aAc->RestoreDescL( aKey, myPtr );
+            if( myPtr )
+                aGroup.Set( *myPtr );
+            else
+                aGroup.Set( KNullDesC );
+            }
+        aKey->PopL( 3 );
+        }
+
+    aKey->PopL();   // Sender
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetSenderL
+// -----------------------------------------------------------------------------
+EXPORT_C void TImpsDataUtils::SetSenderL(
+            MImpsKey* aKey,
+            MImpsDataAccessor* aAc,
+            const TDesC* aSender,
+            const TDesC* aGroupId )
+    {
+    aKey->AddL( CREATEKEY( EImpsKeySender, 0 ) );
+
+    if ( aSender && !aGroupId )
+        {
+        // Pure UserID
+        aKey->AddL( CREATEKEY( EImpsKeyUser, 0 ) );
+        aKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) );
+        aAc->StoreDescL( aKey, *aSender );
+        aKey->PopL( 2 );
+        }
+    else if ( aSender && aGroupId )
+        {
+        // Screen Name
+        aKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) );
+        aKey->AddL( CREATEKEY( EImpsKeyScreenName, 0 ) );
+        aKey->AddL( CREATEKEY( EImpsKeySName, 0 ) );
+        aAc->StoreDescL( aKey, *aSender );
+        aKey->ReplaceLastL( CREATEKEY( EImpsKeyGroupID, 0 ) );
+        aAc->StoreDescL( aKey, *aGroupId );
+        aKey->PopL( 3 );
+        }
+    else if ( !aSender && aGroupId )
+        {
+        // Sender is Group, well ... maybe it is possible in principle
+        aKey->AddL( CREATEKEY( EImpsKeyGroup, 0 ) );
+        aKey->AddL( CREATEKEY( EImpsKeyGroupID, 0 ) );
+        aAc->StoreDescL( aKey, *aGroupId );
+        aKey->PopL( 2 );
+        }
+
+    aKey->PopL();
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetContentDataL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetContentDataL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    const TDesC& aContent )
+    {
+	if ( aContent.Length() > 0 )
+		{		
+    aKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) );
+	    aAc->StoreDescL( aKey, aContent );
+    aKey->PopL();
+		}
+	else
+		{
+		TPtrC p;
+		p.Set( KNullDesC );
+	    aKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) );
+    	aAc->StoreDescL( aKey, p );
+    	aKey->PopL();
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetContentDataL
+// version for 16-bit
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::GetContentDataL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    TPtrC& aContent )
+    {
+    TDesC* myPtr;
+    aKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) );
+    if ( aAc->RestoreDescL( aKey, myPtr ) )
+        {
+        aContent.Set( *myPtr );
+        }
+    else
+        {
+        aContent.Set( KNullDesC );
+        }
+    aKey->PopL();
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetResultStatusL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetResultStatusL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    TInt aCode )
+    {
+    aKey->Reset();  // OPa
+
+    TImpsDataUtils::AddValuesFromArrayL( 
+        aKey, 
+        KSetResultCodeElements, 
+        sizeof( KSetResultCodeElements ) /
+        sizeof( KSetResultCodeElements[0] ) );
+    aAc->StoreIntegerL( aKey, aCode );
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetResultStatusL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool TImpsDataUtils::GetResultStatusL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    TInt& aCode )
+    {
+
+    aKey->Reset();  // OPa
+
+    TImpsDataUtils::AddValuesFromArrayL( 
+        aKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+
+    TBool ret(EFalse);
+    TInt enumi(0);
+    TInt index(0);
+    TImpsKeyType type;
+    if( aAc->RestoreAlternativeL( aKey, enumi, index, type ) )
+        {
+        switch ( enumi )
+            {
+            case EImpsKeyStatus:
+            case EImpsKeyLogin_Response:
+            case EImpsKeyDisconnect:
+            case EImpsKeyKeepAlive_Response:
+            case EImpsKeyGetPresence_Response:
+            case EImpsKeyListManage_Response:
+            case EImpsKeyGetAttributeList_Response:
+            case EImpsKeySendMessage_Response:
+            case EImpsKeyDeliveryReport_Request:
+            case EImpsKeyLeaveGroup_Response:
+                aKey->AddL( enumi, type );
+                aKey->AddL( EImpsKeyResult );
+                aKey->AddL( EImpsKeyCode );
+                if( aAc->RestoreIntegerL( aKey, aCode ) )
+                    ret = ETrue;
+                break;
+            default:
+              break;
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetNewMessageIdL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool TImpsDataUtils::GetNewMessageIdL( 
+            MImpsKey* aKey,
+            MImpsDataAccessor* aAc,
+            TPtrC& aId )
+    {
+
+    aKey->Reset();
+
+    TImpsDataUtils::AddValuesFromArrayL( 
+        aKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+
+    aKey->AddL( CREATEKEY( EImpsKeyNewMessage, 0 ) );
+    aKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) );
+    aKey->AddL( CREATEKEY( EImpsKeyMessageID, 0 ) );
+
+    TDesC* myPtr;
+    if ( aAc->RestoreDescL( aKey, myPtr ) )
+        {
+        aId.Set( *myPtr );
+        return ETrue;
+        }
+    else
+        {
+        aId.Set( KNullDesC );
+        }
+
+    return EFalse;
+
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::CreateClientIdL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::CreateClientIdL( 
+            MImpsKey* aKey,
+            MImpsDataAccessor* aAc,
+            const TDesC& aClientId )
+    {
+    aKey->AddL( CREATEKEY( EImpsKeyClientID, 0 ) );
+    // '+' prefix or all numbers means MSISDN, other is URL
+
+    TInt len = aClientId.Length( );
+    TInt i(0);
+    TBool isMSISDN( ETrue );
+    for( i = 0; i < len; i++)
+        {
+        TChar cha = aClientId[i];
+        if( !i && !( cha == '+' || cha.IsDigit( ) ) )
+            {
+            isMSISDN = EFalse;
+            break;
+            }
+        if( i && !cha.IsDigit( ) )
+            {
+            isMSISDN = EFalse;
+            break;
+            }
+        }
+    if ( isMSISDN )
+        {
+        aKey->AddL( CREATEKEY( EImpsKeyMSISDN, 0 ) );
+        }
+    else
+        {
+        aKey->AddL( CREATEKEY( EImpsKeyURL, 0 ) );
+        }
+    aAc->StoreDescL( aKey, aClientId );
+    aKey->PopL( 2 );
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetMessageTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt TImpsDataUtils::GetMessageTypeL( MImpsDataAccessor* aAc )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionContent, 0 ) );
+    TInt enumi( 0 );
+    TInt index( 0 );
+    TImpsKeyType type( EImpsKeyTypeIM );
+    if( aAc->RestoreAlternativeL( myKey, enumi, index, type ) )
+        {
+        CleanupStack::PopAndDestroy( );  //myKey
+        return enumi;
+        }
+
+    CleanupStack::PopAndDestroy( );  //myKey
+    return EImpsMessageNone;
+
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetTransactionIDL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::GetTransactionIDL( 
+    MImpsDataAccessor* aAc, TPtrC& aID  )
+    {
+    TDesC* myPtr;
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionID, 0 ) );
+    if( aAc->RestoreDescL( myKey, myPtr ) )
+        aID.Set( *myPtr );
+    else
+        aID.Set( KNullDesC );
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetTransactionIDL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetTransactionIDL( 
+    MImpsDataAccessor* aAc, const TDesC& aID  )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionID, 0 ) );
+    aAc->StoreDescL( myKey, aID );
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetSessionIDL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::GetSessionIDL( MImpsDataAccessor* aAc, TPtrC& aID  )
+    {
+    TDesC* myPtr;
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionID, 0 ) );
+    if( aAc->RestoreDescL( myKey, myPtr ) )
+        aID.Set( *myPtr );
+    else
+        aID.Set( KNullDesC );
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetSessionIDL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetSessionIDL( MImpsDataAccessor* aAc, const TDesC& aID  )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionID, 0 ) );
+    aAc->StoreDescL( myKey, aID );
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetSessionTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::GetSessionTypeL( 
+    MImpsDataAccessor* aAc, TImpsSessionType& aID  )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionType, 0 ) );
+    TInt id;
+    if( aAc->RestoreIntegerL( myKey, id ) )
+        aID = ( TImpsSessionType ) id;
+    else
+        aID = EImpsUndefSes;
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetSessionTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetSessionTypeL( 
+    MImpsDataAccessor* aAc, const TImpsSessionType aType )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC();
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionDescriptor, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeySessionType, 0 ) );
+    aAc->StoreIntegerL( myKey, aType );
+    CleanupStack::PopAndDestroy( );  //myKey
+    }
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetPollL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool TImpsDataUtils::GetPollL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    TBool& aBool )
+    {
+    CImpsFields* fields = aAc->GetImpsFields();
+    if ( fields->CspVersion() == EImpsCspVersion11 )
+        {
+        TImpsDataUtils::AddValuesFromArrayL( 
+        aKey, 
+        KGetPollElements, 
+        sizeof( KGetPollElements ) /
+        sizeof( KGetPollElements[0] ) );
+        }
+    else
+        {
+        TImpsDataUtils::AddValuesFromArrayL( 
+            aKey, 
+            KGet12PollElements, 
+            sizeof( KGet12PollElements ) /
+            sizeof( KGet12PollElements[0] ) );
+        }
+    if( aAc->RestoreBooleanL( aKey, aBool ))
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::AddValuesFromArrayL
+// Add values to a key straight from an array
+// -----------------------------------------------------------------------------
+//											    
+EXPORT_C void TImpsDataUtils::AddValuesFromArrayL( 
+    MImpsKey* aImpsKey, const TImpsContent* aElementArray, TInt aSize )
+    {
+    for( TInt i = 0; i < aSize; i++ )
+        {
+        aImpsKey->AddL( CREATEKEY( aElementArray[i], 0 ) );
+        }
+    }
+
+// ---------------------------------------------------------
+// TImpsDataUtils::CopyNewUsersL
+// ---------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::CopyNewUsersL( 
+            MImpsDataAccessor& aSource,
+            MImpsDataAccessor& aDestination)
+    {
+    CImpsKey* myKey = CImpsKey::NewLC(); // << myKey
+    TImpsDataUtils::AddValuesFromArrayL( 
+        myKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+   
+    myKey->AddL( CREATEKEY( EImpsKeyGroupChangeNotice, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyJoined, 0 ) );
+        
+    // copy joined users
+    aDestination.CopyDataL(aSource, myKey);
+
+    CleanupStack::PopAndDestroy( );           // >> myKey
+    }
+// ---------------------------------------------------------
+// TImpsDataUtils::CopyLeftUsersL
+// ---------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::CopyLeftUsersL( 
+            MImpsDataAccessor& aSource,
+            MImpsDataAccessor& aDestination)
+    {
+    CImpsKey* myKey = CImpsKey::NewLC(); // << myKey
+    TImpsDataUtils::AddValuesFromArrayL( 
+        myKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+   
+    myKey->AddL( CREATEKEY( EImpsKeyGroupChangeNotice, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyLeft, 0 ) );
+        
+    // copy left users
+    aDestination.CopyDataL(aSource, myKey);
+
+    CleanupStack::PopAndDestroy( );           // >> myKey
+    }
+    
+// ---------------------------------------------------------
+// TImpsDataUtils::CopyGroupPropertiesL
+// ---------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::CopyGroupPropertiesL( 
+            MImpsDataAccessor& aSource,
+            MImpsDataAccessor& aDestination)
+    {
+    CImpsKey* myKey = STATIC_CAST (CImpsKey*, aSource.NewKeyL()); 
+    CleanupStack::PushL(myKey);         // << myKey
+
+    TImpsDataUtils::AddValuesFromArrayL( 
+        myKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+
+    TInt primitive(0);
+    TInt index(0);
+    TImpsKeyType type;
+    if( aSource.RestoreAlternativeL( myKey, primitive, index, type ) )
+        {
+        myKey->AddL( CREATEKEY( primitive, 0 ) );
+        myKey->AddL( CREATEKEY( EImpsKeyGroupProperties, 0 ) );
+        
+        // copy left users
+        aDestination.CopyDataL(aSource, myKey);
+
+        CleanupStack::PopAndDestroy( );           // >> myKey
+        }
+    }
+    
+// ---------------------------------------------------------
+// TImpsDataUtils::CopyOwnPropertiesL
+// ---------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::CopyOwnPropertiesL( 
+            MImpsDataAccessor& aSource,
+            MImpsDataAccessor& aDestination)
+    {
+    CImpsKey* myKey = STATIC_CAST (CImpsKey*, aSource.NewKeyL()); 
+    CleanupStack::PushL(myKey);         // << myKey
+
+    TImpsDataUtils::AddValuesFromArrayL( 
+        myKey, 
+        KTransContentElements, 
+        sizeof( KTransContentElements ) /
+        sizeof( KTransContentElements[0] ) );
+
+    TInt primitive(0);
+    TInt index(0);
+    TImpsKeyType type;
+    if( aSource.RestoreAlternativeL( myKey, primitive, index, type ) )
+        {
+        myKey->AddL( CREATEKEY( primitive, 0 ) );
+        myKey->AddL( CREATEKEY( EImpsKeyOwnProperties, 0 ) );
+        
+        // copy left users
+        aDestination.CopyDataL(aSource, myKey);
+
+        CleanupStack::PopAndDestroy( );           // >> myKey
+        }
+    }
+
+// ---------------------------------------------------------
+// TImpsDataUtils::GetCenRepIntValueL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt TImpsDataUtils::GetCenRepIntValueL( 
+                TUid aRepositoryUid,
+                TUint32 aId )
+    {
+    TInt value( 0 );
+    CRepository* repository = CRepository::NewLC( aRepositoryUid ); // << repository    
+    User::LeaveIfError( repository->Get( aId, value ) );    
+    CleanupStack::PopAndDestroy(); // >> repository
+    return value;
+    }
+    
+// ---------------------------------------------------------
+// TImpsDataUtils::GetCenRepRealValueL
+// ---------------------------------------------------------
+//
+EXPORT_C TReal TImpsDataUtils::GetCenRepRealValueL( 
+                TUid aRepositoryUid,
+                TUint32 aId )
+    {
+    TReal value( 0 );
+    CRepository* repository = CRepository::NewLC( aRepositoryUid ); // << repository    
+    User::LeaveIfError( repository->Get( aId, value ) );    
+    CleanupStack::PopAndDestroy(); // >> repository
+    return value;
+    }
+    
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::SetBinaryContentDataL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::SetBinaryContentDataL( 
+    MImpsKey* aKey,
+    MImpsDataAccessor* aAc,
+    const TDesC8& aContent )
+    {
+    // first set the content encoding
+    aKey->AddL( CREATEKEY( EImpsKeyContentEncoding, 0 ) );
+    aAc->StoreIntegerL( aKey, EImpsBASE64 );
+    aKey->PopL( 2 );
+    // then manipulate the data    
+    aKey->AddL( CREATEKEY( EImpsKeyContentData, 0 ) );
+    if( aContent.Length() != 0 )
+        {
+        // BASE64 encoding
+        TImCodecB64 codec;
+        codec.Initialise();
+        // Encoder doesn't itself cope with buffer overflows, 
+        // so allocate twice big buffer to be sure that there is enough 
+        // space for B64 data
+        HBufC8* base64Buf = HBufC8::NewLC( aContent.Size() * 2 ); // << base64Buf
+        TPtr8 base64Data( base64Buf->Des() );
+        codec.Encode( aContent, base64Data );
+        // finally, store the data
+        aAc->StoreDesc8L( aKey, base64Data );
+        CleanupStack::PopAndDestroy(1); // >> base64Buf
+        }
+    else
+        { 
+        TPtrC8 content( KNullDesC8 );
+        aAc->StoreDesc8L( aKey, content );
+        }
+    aKey->PopL();
+    }
+
+    
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetContentTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void TImpsDataUtils::GetContentTypeL( 
+    MImpsDataAccessor* aAc,
+    TPtrC& aContentType )
+    {
+    CImpsKey* myKey = CImpsKey::NewLC(); // << myKey
+    TImpsDataUtils::AddValuesFromArrayL( 
+        myKey, 
+        KNewMessageElements, 
+        sizeof( KNewMessageElements ) /
+        sizeof( KNewMessageElements[0] ) );
+        
+    myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) );
+    myKey->AddL( CREATEKEY( EImpsKeyContentType, 0 ) );
+    
+    TDesC* myPtr;
+    if ( aAc->RestoreDescL( myKey, myPtr ) )
+        {
+        aContentType.Set( *myPtr );
+        }
+    else
+        {
+        aContentType.Set( KNullDesC );
+        }
+    CleanupStack::PopAndDestroy(); //  >>> myKey
+    }  
+    
+    
+// -----------------------------------------------------------------------------
+// TImpsDataUtils::GetContentDataTypeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TImpsDataType TImpsDataUtils::GetContentDataTypeL( 
+            MImpsDataAccessor* aAc, TInt aIndex )
+    {
+    TImpsDataType dataType ( EImpsDataTypeDesc );
+    
+    CImpsKey* myKey = CImpsKey::NewLC(); // << myKey
+    myKey->AddL( CREATEKEY( EImpsKeySession, 0 ) );
+    // find the right transaction
+    myKey->AddL( CREATEKEY( EImpsKeyTransaction, aIndex ) );
+    myKey->AddL( CREATEKEY( EImpsKeyTransactionContent, 0 ) );
+
+    // find the primitive
+    TInt primitive(0);
+    TInt index(0);
+    TImpsKeyType keyType;
+    if( aAc->RestoreAlternativeL( myKey, primitive, index, keyType ) )
+        {
+        switch ( primitive )
+            {
+            case EImpsKeyNewMessage:
+                myKey->AddL( CREATEKEY( EImpsKeyNewMessage, 0 ) );
+            break;
+            case EImpsKeySendMessage_Request:
+                myKey->AddL( CREATEKEY( EImpsKeySendMessage_Request, 0 ) );
+            break;
+            default:
+            break;
+            }
+        
+        myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) );
+        myKey->AddL( CREATEKEY( EImpsKeyContentType, 0 ) );
+    
+        TDesC* myPtr;
+        if ( aAc->RestoreDescL( myKey, myPtr ) )
+            {
+            if ( !myPtr->Left(KImpsContentType().Length()).CompareF( KImpsContentType ) || myPtr->Length() == 0 )
+                {
+                dataType = EImpsDataTypeDesc;
+                }
+            else
+                {    
+                dataType = EImpsDataTypeDesc8;         
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy(); //  >>> myKey
+    return dataType;
+    }
+            
+            
+               
+//  End of File