IMPSengine/datautils/src/impstdataaccessor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 11:50:09 +0200
changeset 2 7b3b89e6be20
parent 0 094583676ce7
permissions -rw-r--r--
Revision: 201001 Kit: 201004

/*
* Copyright (c) 2002-2004 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 accessor class for imps fields. 
*
*/

// INCLUDE FILES
#include    <e32std.h>
#include    "impsfields.h"
#include    "impsconst.h"
#include    "impskey.h"
#include    "impserrors.h"
#include    "impsutils.h"
#include    "impstdataaccessor.h"
#include    "impsdatautils.h"

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// TImpsDataAccessor::TImpsDataAccessor
// ---------------------------------------------------------
//
EXPORT_C TImpsDataAccessor::TImpsDataAccessor()
    {
    iImpsFields = NULL;
    }
// ---------------------------------------------------------
// TImpsDataAccessor::TImpsDataAccessor
// ---------------------------------------------------------
//
EXPORT_C TImpsDataAccessor::TImpsDataAccessor(CImpsFields* aImpsFields)
    {
    iImpsFields = aImpsFields;
    }
// ---------------------------------------------------------
// TImpsDataAccessor::SetImpsFields
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::SetImpsFields( CImpsFields* aImpsFields )
    {
    iImpsFields = aImpsFields;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::GetImpsFields
// ---------------------------------------------------------
//
EXPORT_C CImpsFields* TImpsDataAccessor::GetImpsFields( ) const
    {
    return iImpsFields;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::~TImpsDataAccessor()
// ---------------------------------------------------------
//
EXPORT_C TImpsDataAccessor::~TImpsDataAccessor()
    {
    }

// ---------------------------------------------------------
// TImpsDataAccessor::NewKeyL
// ---------------------------------------------------------
//
EXPORT_C MImpsKey* TImpsDataAccessor::NewKeyL()
    {
    CImpsKey* key = CImpsKey::NewL();
    return key;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::StoreDescL
// mutator for symbian descriptor value
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreDescL( MImpsKey* aKey, TPtrC aValue )
    {
    iData.iType = EStringType;
    iData.iValue.Set( aValue );

    DoStoreL( static_cast<CImpsKey*>( aKey ) );
    }

// ---------------------------------------------------------
// TImpsDataAccessor::StoreDescL8
// mutator for symbian 8-bit descriptor value
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreDesc8L( MImpsKey* aKey, TPtrC8 aValue)
    {
    iData.iType = EString8Type;
    iData.iValue8.Set( aValue );

    DoStoreL( static_cast<CImpsKey*>( aKey ) );
    }

// ---------------------------------------------------------
// TImpsDataAccessor::StoreInteger
// mutator for symbian integer value
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreIntegerL( MImpsKey* aKey, TInt aValue )
    {
    iData.iType = EIntegerType;
    iData.iValueInt = aValue;

    DoStoreL( static_cast<CImpsKey*>( aKey ) );
    }

// ---------------------------------------------------------
// TImpsDataAccessor::StoreBooleanL
// mutator for symbian boolean value
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreBooleanL( MImpsKey* aKey, TBool aValue )
    {
    iData.iType = EBooleanType;
    iData.iValueBool = aValue;

    DoStoreL( static_cast<CImpsKey*>( aKey ) );
    }

// ---------------------------------------------------------
// TImpsDataAccessor::StoreEmptyL
// mutator for symbian empty value
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreEmptyL( MImpsKey* aKey)
    {
    iData.iType = EEmptyType;

    DoStoreL( static_cast<CImpsKey*>( aKey ) );
    }
// ---------------------------------------------------------
// TImpsDataAccessor::StoreExtL
// mutator for extension attribute
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::StoreExtL( MImpsKey* /*aKey*/, 
                                            TPtrC8 /*aName*/, 
                                            TPtrC8 /*aValue*/)
    {
    }
//----------------------------------------------------------
// TImpsDataAccessor::RestoreDescL
// accessor for symbian descriptor value
// ---------------------------------------------------------
//

EXPORT_C TBool TImpsDataAccessor::RestoreDescL( MImpsKey* aKey, TDesC*& aDes)
    {
    iData.iType = EStringType;

    TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
    if( ret )
        {
        if( iData.iValuePointer )
            {
            aDes = iData.iValuePointer;
            }
        else
            {
            aDes = (TDesC*)&KNullDesC;
            }

        }
    return ret;
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreDesc8L
// accessor for symbian 8-bit descriptor value
// ---------------------------------------------------------
//

EXPORT_C TBool TImpsDataAccessor::RestoreDesc8L( MImpsKey* aKey, 
                                                 TDesC8*& aDes )
    {
    iData.iType = EString8Type;

    TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
    if( ret )
        {
        if( iData.iValuePointer8 )
            {
            aDes = iData.iValuePointer8;
            }
        else
            {
            aDes = (TDesC8*)&KNullDesC8;
            }

        }
    return ret;
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreIntegerL
// accessor for integer value
// (covers also boolean and enum types
// ---------------------------------------------------------
//

EXPORT_C TBool TImpsDataAccessor::RestoreIntegerL( MImpsKey* aKey, TInt& aInt )
    {
    iData.iType = EIntegerType;

    TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
    if( ret )
        aInt = iData.iValueInt;
    return ret;
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreBooleanL
// accessor for integer value
// (covers also boolean and enum types
// ---------------------------------------------------------
//

EXPORT_C TBool TImpsDataAccessor::RestoreBooleanL( MImpsKey* aKey, 
                                                   TBool& aBool )
    {
    iData.iType = EBooleanType;

    TBool ret = DoRestoreL( static_cast<CImpsKey*>( aKey ) );
    if( ret )
        aBool = iData.iValueBool;
    return ret;
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreEmptyL
// accessor for integer value
// (covers also boolean and enum types
// ---------------------------------------------------------
//
EXPORT_C TBool TImpsDataAccessor::RestoreEmptyL( MImpsKey* aKey )
    {
    iData.iType = EEmptyType;

    return DoRestoreL( static_cast<CImpsKey*>( aKey ) );
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreDesc8L
// accessor for symbian 8-bit descriptor value
// ---------------------------------------------------------
//
EXPORT_C TBool TImpsDataAccessor::RestoreExtL( MImpsKey* /* aKey */,  
                                               TDesC8*& /*aName*/, 
                                               TDesC8*& /*aValue*/)
    {
    return EFalse;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::KeyTypeL
// method returns type of related to given key
// ---------------------------------------------------------
//
EXPORT_C TImpsDataType TImpsDataAccessor::KeyTypeL( MImpsKey* aKey )
    {

    // Just search the last element type ( or ask from data storage?)

    TInt eCount = aKey->Count();
    if ( !eCount )
        {
        User::Leave( KErrArgument );
        }

    TImpsDataType dataType(EImpsDataTypeNotSupported);
    TImpsKeyType keyType;
    TInt myVal = aKey->GetElementL( eCount - 1, keyType );
    TInt myElem = GET_ENUM( myVal );
    if( keyType == EImpsKeyTypePre )
        {
        switch ( myElem )
            {
            case EImpsKeyPRPresenceSubList:
            case EImpsKeyPRPresenceValue:
            case EImpsKeyContentType:
            // CSP 1.2
            case EImpsKeyPRText:

                dataType = EImpsDataTypeDesc;
                break;

            // added
            case EImpsKeyPRDevManufacturer:
            case EImpsKeyPRClientProducer:
            case EImpsKeyPRModel:
            case EImpsKeyPRClientVersion:
            case EImpsKeyPRLanguage:
            case EImpsKeyPRZone:
            case EImpsKeyPRLongitude:
            case EImpsKeyPRLatitude:
            case EImpsKeyPRCountry:  //ENUM
            case EImpsKeyPRCity:
            case EImpsKeyPRStreet:
            case EImpsKeyPRCrossing1:
            case EImpsKeyPRCrossing2:
            case EImpsKeyPRBuilding:
            case EImpsKeyPRNamedArea:
            case EImpsKeyPRContact:
            case EImpsKeyPRNote:
            case EImpsKeyPRPrefC: //enum
            case EImpsKeyPRCaddr:// enum
            case EImpsKeyPRCstatus: //enum
            case EImpsKeyPRCname:
            case EImpsKeyPRDirectContent:
            case EImpsKeyPRReferredContent:
            case EImpsKeyPRContainedvCard:
            case EImpsKeyPRReferredvCard:
            //CSP 1.2
            case EImpsKeyPRLink:
                dataType = EImpsDataTypeDesc8;
                break;

            case EImpsKeyPRStatus:
            case EImpsKeyPRCap:
                //added
            case EImpsKeyPRClientType:
            case EImpsKeyPRAltitude:
            case EImpsKeyPRAccuracy:
            case EImpsKeyPRCpriority:
                dataType = EImpsDataTypeInt;
                break;

            case EImpsKeyPRQualifier:
                dataType = EImpsDataTypeBoolean;
                break;

            case EImpsKeyPROnlineStatus:
            case EImpsKeyPRUserAvailability:
            case EImpsKeyPRCommCap:
            case EImpsKeyPRCommC:
            // added
            case EImpsKeyPRRegistration:
            case EImpsKeyPRFreeTextLocation:
            case EImpsKeyPRPLMN:
            case EImpsKeyPRPreferredLanguage:
            case EImpsKeyPRStatusText:
            case EImpsKeyPRStatusMood:
            case EImpsKeyPRAlias:
            case EImpsKeyPRClientInfo:
            case EImpsKeyPRTimeZone:
            case EImpsKeyPRGeoLocation:
            case EImpsKeyPRAddress:
            case EImpsKeyPRPreferredContacts:
            case EImpsKeyPRAddrPref:
            case EImpsKeyPRStatusContent:
            case EImpsKeyPRContactInfo:
            case EImpsKeyPRInf_link:
            case EImpsKeyPRInfoLink:

                dataType = EImpsDataTypeNone;
                break;

            case EImpsKeyPRExt:
                dataType = EImpsDataTypeExt;
            default:
                dataType = EImpsDataTypeNotSupported;
                break;
            };
        return dataType;
        }
    // TImpsContent
    switch ( myElem )
        {
        // The following ones are enums
        case EImpsKeySessionType:    // cannot contain non-ASCII characters
        case EImpsKeyTransactionMode:
        case EImpsKeyDigestSchema:
        case EImpsKeyClientType:
        case EImpsKeyInitialDeliveryMethod:
        case EImpsKeySupportedBearer:
        case EImpsKeySupportedCIRMethod:
        case EImpsKeySearchElement:
        case EImpsKeyInviteType:
        case EImpsKeyDeliveryMethod:
        case EImpsKeySubscribeType:
        case EImpsKeyContentEncoding:
        case EImpsKeyAcceptedTransferEncoding:
        // new in CSP 1.2
        case EImpsKeyReactiveAuthState:
        case EImpsKeyWatcherStatus:
        // Integer values, these are pure integer values
        case EImpsKeyContentSize:
        case EImpsKeyAcceptedCharSet:
        case EImpsKeyAcceptedContentLength:
        case EImpsKeyMultiTrans:
        case EImpsKeyParserSize:
        case EImpsKeyUDPPort:
        case EImpsKeyTCPPort:
        case EImpsKeyServerPollMin:
        case EImpsKeyCode:
        case EImpsKeySearchLimit:
        case EImpsKeySearchID:
        case EImpsKeySearchIndex:
        case EImpsKeySearchFindings:
        case EImpsKeyKeepAliveTime:
        case EImpsKeyTimeToLive:
        case EImpsKeyValidity:
        case EImpsKeyMessageCount:
        // new in CSP 1.2
        case EImpsKeyHistoryPeriod:
        case EImpsKeyMaxWatcherList:
            dataType = EImpsDataTypeInt;
            break;

        // 16-bit unicode
        case EImpsKeySessionID:
        case EImpsKeySessionCookie:
        case EImpsKeyUserID:
        case EImpsKeyTransactionID:
        case EImpsKeyTransactionContent:
        case EImpsKeyDeliveryTime:
        case EImpsKeyPassword:
        case EImpsKeyAcceptedContentType:
        case EImpsKeyTCPAddress:
        case EImpsKeyDescription:
        case EImpsKeyGroupID:
        case EImpsKeyMessageID:
        case EImpsKeyMessageURI:
        case EImpsKeyURL:
        case EImpsKeyMSISDN:
        case EImpsKeyContactList:
        case EImpsKeyDefaultContactList:
        case EImpsKeySearchString:
        case EImpsKeyInviteID:
        case EImpsKeyInviteNote:
        case EImpsKeyResponseNote:
        case EImpsKeyPresenceSubList:
        case EImpsKeySName:
        case EImpsKeyName:
        case EImpsKeyValue:
        case EImpsKeyDateTime:
        case EImpsKeyContentType:
        case EImpsKeyDefaultLanguage:
        // new in CSP 1.2
        case EImpsKeyExtendedData:
        case EImpsKeyAPIClient:
            dataType = EImpsDataTypeDesc;
            break;

        // 8-bit data. 
        case EImpsKeyPureData:
        case EImpsKeyNonce:
        case EImpsKeyDigestBytes:
        // new in CSP 1.2
        case EImpsKeyPresenceAttributeNSName:
        case EImpsKeySessionNSName:
        case EImpsKeyTransactionNSName:
        case EImpsKeyDomain:
            dataType = EImpsDataTypeDesc8;
            break;

        // Boolean data types
        case EImpsKeyPoll:
        case EImpsKeyCompletionFlag:
        case EImpsKeyJoinGroup:
        case EImpsKeySubscribeNotification:
        case EImpsKeyCapabilityRequest:
        case EImpsKeyAnyContent:
        case EImpsKeyDefaultList:
        case EImpsKeyAcceptance:
        case EImpsKeyDeliveryReport:
        case EImpsKeyInUse:
        case EImpsKeyJoinedRequest:
        case EImpsKeyAllFunctionsRequest:
        // new in CSP 1.2
        case EImpsKeyReceiveList:
        case EImpsKeyAuto_Subscribe:
        case EImpsKeyCIR:
            dataType = EImpsDataTypeBoolean;
            break;
        // special case    
        case EImpsKeyContentData:
            dataType = EImpsDataTypeContentData;
            break;
              
        // Elements not having value
        case EImpsKeySession:
        case EImpsKeySessionDescriptor:
        case EImpsKeyTransaction:
        case EImpsKeyTransactionDescriptor:
        case EImpsKeyStatus:
        case EImpsKeyPolling_Request:
        case EImpsKeyLogin_Request:
        case EImpsKeyLogin_Response:
        case EImpsKeyService_Request:
        case EImpsKeyService_Response:
        case EImpsKeyClientCapability_Request:
        case EImpsKeyClientCapability_Response:
        case EImpsKeyLogout_Request:
        case EImpsKeyDisconnect:
        case EImpsKeyKeepAlive_Request:
        case EImpsKeyKeepAlive_Response:
        case EImpsKeyGetSPInfo_Request:
        case EImpsKeyGetSPInfo_Response:
        case EImpsKeySearch_Request:
        case EImpsKeyStopSearch_Request:
        case EImpsKeySearch_Response:
        case EImpsKeyInvite_Request:
        case EImpsKeyInvite_Response:
        case EImpsKeyInviteUser_Request:
        case EImpsKeyInviteUser_Response:
        case EImpsKeyCancelInvite_Request:
        case EImpsKeyCancelInviteUser_Request:
        case EImpsKeySubscribePresence_Request:
        case EImpsKeyUnsubscribePresence_Request:
        case EImpsKeyPresenceNotification_Request:
        case EImpsKeyGetWatcherList_Request:
        case EImpsKeyGetWatcherList_Response:
        case EImpsKeyGetPresence_Request:
        case EImpsKeyGetPresence_Response:
        case EImpsKeyPresenceAuth_Request:
        case EImpsKeyPresenceAuth_User:
        case EImpsKeyCancelAuth_Request:
        case EImpsKeyUpdatePresence_Request:
        case EImpsKeyGetList_Request:
        case EImpsKeyGetList_Response:
        case EImpsKeyCreateList_Request:
        case EImpsKeyDeleteList_Request:
        case EImpsKeyListManage_Request:
        case EImpsKeyListManage_Response:
        case EImpsKeyCreateAttributeList_Request:
        case EImpsKeyDeleteAttributeList_Request:
        case EImpsKeyGetAttributeList_Request:
        case EImpsKeyGetAttributeList_Response:
        case EImpsKeySendMessage_Request:
        case EImpsKeySendMessage_Response:
        case EImpsKeySetDeliveryMethod_Request:
        case EImpsKeyGetMessageList_Request:
        case EImpsKeyGetMessageList_Response:
        case EImpsKeyRejectMessage_Request:
        case EImpsKeyMessageNotification:
        case EImpsKeyGetMessage_Request:
        case EImpsKeyGetMessage_Response:
        case EImpsKeyNewMessage:
        case EImpsKeyMessageDelivered:
        case EImpsKeyDeliveryReport_Request:
        case EImpsKeyForwardMessage_Request:
        case EImpsKeyGetBlockedList_Request:
        case EImpsKeyGetBlockedList_Response:
        case EImpsKeyBlockEntity_Request:
        case EImpsKeyCreateGroup_Request:
        case EImpsKeyDeleteGroup_Request:
        case EImpsKeyJoinGroup_Request:
        case EImpsKeyJoinGroup_Response:
        case EImpsKeyLeaveGroup_Request:
        case EImpsKeyLeaveGroup_Response:
        case EImpsKeyGetGroupMembers_Request:
        case EImpsKeyGetGroupMembers_Response:
        case EImpsKeyAddGroupMembers_Request:
        case EImpsKeyRemoveGroupMembers_Request:
        case EImpsKeyMemberAccess_Request:
        case EImpsKeyGetGroupProps_Request:
        case EImpsKeyGetGroupProps_Response:
        case EImpsKeySetGroupProps_Request:
        case EImpsKeyRejectList_Request:
        case EImpsKeyRejectList_Response:
        case EImpsKeySubscribeGroupNotice_Request:
        case EImpsKeySubscribeGroupNotice_Response:
        case EImpsKeyGroupChangeNotice:
        case EImpsKeyCapabilityList:
        case EImpsKeyResult:
        case EImpsKeyDetailedResult:
        case EImpsKeySender:
        case EImpsKeyRecipient:
        case EImpsKeyUser:
        case EImpsKeyGroup:
        case EImpsKeyClientID:
        case EImpsKeyScreenName:
        case EImpsKeyNickName:
        case EImpsKeyURLList:
        case EImpsKeyGroupList:
        case EImpsKeyUserList:
        case EImpsKeyNickList:
        case EImpsKeyAddNickList:
        case EImpsKeyRemoveNickList:
        case EImpsKeySearchPairList:
        case EImpsKeySearchResult:
        case EImpsKeyDefaultAttributeList:
        case EImpsKeyPresence:
        case EImpsKeyMessageInfo:
        case EImpsKeyBlockList:
        case EImpsKeyGrantList:
        case EImpsKeyEntityList:
        case EImpsKeyAddList:
        case EImpsKeyRemoveList:
        case EImpsKeyContactListProperties:
        case EImpsKeyGroupProperties:
        case EImpsKeyOwnProperties:
        case EImpsKeyProperty:
        case EImpsKeyWelcomeNote:
        case EImpsKeyAdmin:
        case EImpsKeyMod:
        case EImpsKeyUsers:
        case EImpsKeyJoined:
        case EImpsKeyLeft:
        case EImpsKeyLogo:
        case EImpsKeyAllFunctions:
        case EImpsKeyFunctions:
        case EImpsKeyWVCSPFeat:
        case EImpsKeyFundamentalFeat:
        case EImpsKeyPresenceFeat:
        case EImpsKeyIMFeat:
        case EImpsKeyGroupFeat:
        case EImpsKeyServiceFunc:
        case EImpsKeySearchFunc:
        case EImpsKeyInviteFunc:
        case EImpsKeyContListFunc:
        case EImpsKeyPresenceAuthFunc:
        case EImpsKeyPresenceDeliverFunc:
        case EImpsKeyAttListFunc:
        case EImpsKeyIMSendFunc:
        case EImpsKeyIMReceiveFunc:
        case EImpsKeyIMAuthFunc:
        case EImpsKeyGroupMgmtFunc:
        case EImpsKeyGroupUseFunc:
        case EImpsKeyGroupAuthFunc:
        // new in CSP 1.2
        case EImpsKeyExtBlock:
        case EImpsKeyAgreedCapabilityList:
        case EImpsKeyExtended_Request:
        case EImpsKeyExtended_Response:
        case EImpsKeyOtherServer:
        case EImpsKeyVerifyID_Request:
        case EImpsKeyGetReactiveAuthStatus_Request:
        case EImpsKeyGetReactiveAuthStatus_Response:
        case EImpsKeyAdminMapList:
        case EImpsKeyAdminMapping:
        case EImpsKeyGetJoinedUsers_Request:
        case EImpsKeyGetJoinedUsers_Respone:
        case EImpsKeyMapping:
        case EImpsKeyUserMapList:
        case EImpsKeyUserMapping:
        case EImpsKeyVerifyIDFunc:
        case EImpsKeyIDList:
        case EImpsKeyReactiveAuthStatus:
        case EImpsKeyReactiveAuthStatusList:
        case EImpsKeyWatcher:
        case EImpsKeyVersionList:
             dataType = EImpsDataTypeNone;
             break;

        case EImpsKeyGETSPI:
        case EImpsKeySRCH:
        case EImpsKeySTSRC:
        case EImpsKeyINVIT:
        case EImpsKeyCAINV:
        case EImpsKeyGCLI:
        case EImpsKeyCCLI:
        case EImpsKeyDCLI:
        case EImpsKeyMCLS:
        case EImpsKeyGETWL:
        case EImpsKeyREACT:
        case EImpsKeyCAAUT:
        case EImpsKeyGETPR:
        case EImpsKeyUPDPR:
        case EImpsKeyCALI:
        case EImpsKeyDALI:
        case EImpsKeyGALS:
        case EImpsKeyMDELIV:
        case EImpsKeyFWMSG:
        case EImpsKeySETD:
        case EImpsKeyGETLM:
        case EImpsKeyGETM:
        case EImpsKeyREJCM:
        case EImpsKeyNOTIF:
        case EImpsKeyNEWM:
        case EImpsKeyGLBLU:
        case EImpsKeyBLENT:
        case EImpsKeyCREAG:
        case EImpsKeyDELGR:
        case EImpsKeyGETGP:
        case EImpsKeySETGP:
        case EImpsKeySUBGCN:
        case EImpsKeyGRCHN:
        case EImpsKeyGETGM:
        case EImpsKeyADDGM:
        case EImpsKeyRMVGM:
        case EImpsKeyMBRAC:
        case EImpsKeyREJEC:
        // new in CSP 1.2
        case EImpsKeyMF:
        case EImpsKeyMG:
        case EImpsKeyMM:
        case EImpsKeyGETAUT:
        case EImpsKeyGETJU:
        case EImpsKeyMP:
        case EImpsKeyVRID:
            
            dataType = EImpsDataTypeNone;
            break;

        default:
            User::Leave( KErrArgument );

        };
    return dataType;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::RestoreAlternativeL
// ---------------------------------------------------------
//
EXPORT_C TBool TImpsDataAccessor::RestoreAlternativeL( const MImpsKey* aKey, 
                                                    TInt& aEnum, 
                                                    TInt& aIndex, 
                                                    TImpsKeyType& aType ) const
    {
    const CImpsKey* keyIn = static_cast<const CImpsKey*>( aKey );
    const CImpsData* data = iImpsFields->Data( );
    aEnum = 0;
    aIndex = 0;
    aType = EImpsKeyTypeIM;

    const CImpsKey* foundkey = data->CheckKey( keyIn, EPartialKeyLonger );
    if( foundkey )
        {
        // The found key can be longer than the search key
        // Since the beginning of the aKey and foundKey are the same 
        // we want the first different element from the key
        // If the lengths are the same then there is no alternative
        TInt len1 = foundkey->Count( );
        TInt len2 = aKey->Count( );
        if( len1 == len2 )
            return EFalse;
        TInt elem = foundkey->GetElementL( len2, aType );
        aIndex = GET_INDEX( elem );
        aEnum = GET_ENUM( elem );
        return ETrue;
        }
    return EFalse;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::CheckBranchExistenceL
// ---------------------------------------------------------
//
EXPORT_C TBool TImpsDataAccessor::CheckBranchExistenceL( 
                                            const MImpsKey* aKey ) const
    {
    const CImpsKey* keyIn = static_cast<const CImpsKey*>( aKey );
    const CImpsData* data = iImpsFields->Data( );

    const CImpsKey* foundkey = data->CheckKey( keyIn, EPartialKey );
    if( foundkey )
        {
        return ETrue;
        }
    return EFalse;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::NbrOfTransactionsL
// ---------------------------------------------------------
//
EXPORT_C TInt TImpsDataAccessor::NbrOfTransactionsL( ) const
    {
    TInt ret = 0;
    CImpsKey* myKey = CImpsKey::NewLC();
    myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
    myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0) );

    while( CheckBranchExistenceL( myKey ) )
        {
        ++ret;
        myKey->ReplaceLastL( CREATEKEY( EImpsKeyTransaction, ret ) );
        }
    CleanupStack::PopAndDestroy(1);
    return ret;
    }

// ---------------------------------------------------------
// TImpsDataAccessor::GetTransactionL
// ---------------------------------------------------------
//
EXPORT_C TBool TImpsDataAccessor::GetTransactionL( 
    TInt aIndex, CImpsFields* aFields ) const
    {
    if( !iImpsFields )
        return EFalse;
    if( aFields )
        {
        TBool ret = EFalse;
        CImpsData* dataDes = aFields->Data( );
        CImpsData* dataSrc = iImpsFields->Data( );

        CImpsKey* myKey = CImpsKey::NewLC();
        myKey->AddL( CREATEKEY( EImpsKeySession, 0) );
        myKey->AddL( CREATEKEY( EImpsKeyTransaction, aIndex) );

        if( CheckBranchExistenceL( myKey ) )
            {
            // Copy first transaction
            dataDes->CopyL( myKey,dataSrc );

            // Now we have to reset the new transaction id to 0
            dataDes->SetKeyIndex( myKey, 0 );

            // Copy SessionDescriptor stuff
            myKey->ReplaceLastL( CREATEKEY( EImpsKeySessionDescriptor, 0) );
            dataDes->CopyL( myKey,dataSrc );

            aFields->SetStatus( iImpsFields->Status( ) );

            CImpsDataAccessor* myAc = CImpsDataAccessor::NewLC( aFields );
            aFields->SetMessageType( TImpsDataUtils::GetMessageTypeL( myAc ) );
            CleanupStack::PopAndDestroy(1 );     // myAc
            ret = ETrue;
            }
        CleanupStack::PopAndDestroy(1);  // myKey
        return ret;
        }
    else
        {
        CImpsDataAccessor* myAc = CImpsDataAccessor::NewLC( iImpsFields );
        iImpsFields->SetMessageType( TImpsDataUtils::GetMessageTypeL( myAc ) );
        CleanupStack::PopAndDestroy( 1 );     // myAc
        return ETrue;
        }
    }

// ---------------------------------------------------------
// TImpsDataAccessor::CopyDataL
// ---------------------------------------------------------
//
EXPORT_C void TImpsDataAccessor::CopyDataL( 
            MImpsDataAccessor& aSource,
            MImpsKey* aKey )
    {
    TImpsDataAccessor& iSource = static_cast<TImpsDataAccessor&>(aSource);
    CImpsKey* iKey = static_cast<CImpsKey*>( aKey );
    // source data
    CImpsData* sp  = iSource.iImpsFields->Data();

    // destination data
    CImpsData* dp  = iImpsFields->Data();

    // Copy data
    dp->CopyL( iKey, sp );
    }

// ---------------------------------------------------------
// TImpsDataAccessor::DoStoreL
// Main storing function
// ---------------------------------------------------------
//
void TImpsDataAccessor::DoStoreL( const CImpsKey* aKey )
    {
    StoreHeadersL( aKey );
    }

//----------------------------------------------------------
// TImpsDataAccessor::DoRestoreL
// Main restoring function
// ---------------------------------------------------------
//
TBool TImpsDataAccessor::DoRestoreL( const CImpsKey* aKey )
    {
    return RestoreHeadersL( aKey );
    }

//----------------------------------------------------------
// TImpsDataAccessor::StoreHeadersL
// ---------------------------------------------------------
//
void TImpsDataAccessor::StoreHeadersL( const CImpsKey* aKey )
    {
    CImpsData* data = iImpsFields->Data( );
    if( iData.iType == EStringType )
        {
        data->StoreStringL( aKey, iData.iValue );
        return;
        }
    if( iData.iType == EString8Type )
        {
        data->StoreString8L( aKey, iData.iValue8 );
        return;
        }
    if( iData.iType == EIntegerType )
        {
        data->StoreIntL( aKey, iData.iValueInt );
        return;
        }
    if( iData.iType == EBooleanType )
        {
        data->StoreBooleanL( aKey, iData.iValueBool );
        return;
        }
    if( iData.iType == EEmptyType )
        {
        data->StoreEmptyL( aKey );
        return;
        }
    User::Leave( KErrArgument );
    }

//----------------------------------------------------------
// TImpsDataAccessor::RestoreHeadersL
// ---------------------------------------------------------
//
TBool TImpsDataAccessor::RestoreHeadersL( const CImpsKey* aKey )
    {
    TBool ret = EFalse;
    CImpsData* data = iImpsFields->Data( );
    if( iData.iType == EStringType )
        {
        TDesC *val;
        ret = data->RestoreString( aKey, val );
        if( ret )
            iData.iValuePointer = val;
        }
    if( iData.iType == EString8Type )
        {
        TDesC8 *val;
        ret = data->RestoreString8( aKey, val );
        if( ret )
            iData.iValuePointer8 = val;
        }
    if( iData.iType == EIntegerType )
        {
        ret = data->RestoreInt( aKey, iData.iValueInt );
        }
    if( iData.iType == EBooleanType )
        {
        ret = data->RestoreBoolean( aKey, iData.iValueBool );
        }
    if( iData.iType == EEmptyType )
        {
        ret = data->RestoreEmpty( aKey );
        }
    return ret;
    }

#ifdef _DEBUG
//----------------------------------------------------------
// TImpsDataAccessor::DumpToFileL
// ---------------------------------------------------------
//
void TImpsDataAccessor::DumpToFileL(RFs& aFs, const TDesC& aFilename)
	{
	iImpsFields->DumpToFileL(aFs, aFilename);
	}

#endif
//  End of File