IMPSengine/datautils/src/impstdataaccessor.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/datautils/src/impstdataaccessor.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,964 @@
+/*
+* 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