diff -r 000000000000 -r 094583676ce7 IMPSengine/datautils/src/impstdataaccessor.cpp --- /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 +#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( 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( 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( 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( aKey ) ); + } + +// --------------------------------------------------------- +// TImpsDataAccessor::StoreEmptyL +// mutator for symbian empty value +// --------------------------------------------------------- +// +EXPORT_C void TImpsDataAccessor::StoreEmptyL( MImpsKey* aKey) + { + iData.iType = EEmptyType; + + DoStoreL( static_cast( 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( 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( 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( 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( 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( 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( 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( 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(aSource); + CImpsKey* iKey = static_cast( 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