diff -r 000000000000 -r 094583676ce7 IMPSengine/engsrv/src/impssdatautils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/engsrv/src/impssdatautils.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,735 @@ +/* +* Copyright (c) 2003 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: Utils for IM data. +* +* +*/ + + +// INCLUDE FILES +#include +#include "impskey.h" +#include "impssdatautils.h" +#include "impsdataaccessor.h" +#include "impsdigestbytes.h" +#include "impserrors.h" +#include "impsliterals.h" +#include "ImpsVariantAPI.h" +#include "impssrvutils.h" +#include "impsipcirwatcherapi.h" + +// CONSTANTS + +// UTF-8 MIB enum +const TInt KImpsMIBeUTF8 = 106; + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +TImpsSDataUtils::TImpsSDataUtils() + { + } + + + + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::SubGroupNoticeResponseL +// ----------------------------------------------------------------------------- +// +TBool TImpsSDataUtils::SubGroupNoticeResponseL( + MImpsKey* aKey, + MImpsDataAccessor* aAc ) + { + TDesC* myPtr; + TImpsSDataUtils::AddValuesFromArrayL( + aKey, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + aKey->AddL( CREATEKEY( EImpsKeySubscribeGroupNotice_Response, 0 ) ); + aKey->AddL( CREATEKEY( EImpsKeyValue, 0 ) ); + if ( aAc->RestoreDescL( aKey, myPtr ) ) + { + if ( myPtr->Compare( KImpsTrue ) == 0 ) + { + return ETrue; + } + } + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::SetMessageDeliveredIdL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::SetMessageDeliveredIdL( + MImpsKey* aKey, + MImpsDataAccessor* aAc, + const TDesC& aId ) + { + + aKey->Reset(); + + TImpsSDataUtils::AddValuesFromArrayL( + aKey, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + + aKey->AddL( CREATEKEY( EImpsKeyMessageDelivered, 0 ) ); + aKey->AddL( CREATEKEY( EImpsKeyMessageID, 0 ) ); + aAc->StoreDescL( aKey, aId ); + + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::CreateLoginReqL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::CreateLoginReqL( + MImpsKey* aKey, + MImpsDataAccessor* aAc, + const TDesC& aUserId, + const TDesC& aClientId, + const TDesC& aPwd, + const TDesC& aCookie, + TInt aTime ) + { + aKey->Reset(); + + TImpsSDataUtils::AddValuesFromArrayL( + aKey, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + + aKey->AddL( CREATEKEY( EImpsKeyLogin_Request, 0 ) ); + aKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) ); + aAc->StoreDescL( aKey, aUserId ); + + aKey->PopL( ); + TImpsSDataUtils::CreateClientIdL( aKey, aAc, aClientId ); + + aKey->AddL( CREATEKEY( EImpsKeyPassword, 0 ) ); + aAc->StoreDescL( aKey, aPwd ); + + aKey->ReplaceLastL( CREATEKEY( EImpsKeySessionCookie, 0 ) ); + aAc->StoreDescL( aKey, aCookie ); + + aKey->ReplaceLastL( CREATEKEY( EImpsKeyTimeToLive, 0 ) ); + aAc->StoreIntegerL( aKey, aTime ); + + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::CreateLoginReqPhaseOneL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::CreateLoginReqPhaseOneL( + MImpsKey* aKey, + MImpsDataAccessor* aAc, + const TDesC& aUserId, + const TDesC& aClientId, + const TImpsDigestSchema aSchema, + const TDesC& aCookie, + TInt aTime ) + { + if ( aUserId.Length() == 0 /*|| aClientId.Length() == 0 */ + || aCookie.Length() == 0 ) + { + User::Leave( KImpsErrorValidate ); + } + + aKey->Reset(); + + TImpsSDataUtils::AddValuesFromArrayL( + aKey, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + + aKey->AddL( CREATEKEY( EImpsKeyLogin_Request, 0 ) ); + aKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) ); + aAc->StoreDescL( aKey, aUserId ); + + aKey->PopL( ); + TImpsSDataUtils::CreateClientIdL( aKey, aAc, aClientId ); + + aKey->AddL( CREATEKEY( EImpsKeyDigestSchema, 0 ) ); + aAc->StoreIntegerL( aKey, aSchema ); + + aKey->ReplaceLastL( CREATEKEY( EImpsKeySessionCookie, 0 ) ); + aAc->StoreDescL( aKey, aCookie ); + + aKey->ReplaceLastL( CREATEKEY( EImpsKeyTimeToLive, 0 ) ); + aAc->StoreIntegerL( aKey, aTime ); + + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::CreateLoginReqPhaseTwoL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::CreateLoginReqPhaseTwoL( + TBool aSendPwd, + MImpsDataAccessor* aAc, + const TDesC& /* aCSPSessionId */, + const TDesC& aTid, + const TDesC& aUserId, + const TDesC& aClientId, + const TDesC& aPwd, + const TDesC8* aNonce, + const TDesC& aCookie, + TInt aTime, + HBufC* aKey1, + HBufC* aKey2 ) + { + if ( aTid.Length() == 0 || + aUserId.Length() == 0 || + aPwd.Length() == 0 || !aNonce || aNonce->Length() == 0 || + aCookie.Length() == 0 ) + { + User::Leave( KImpsErrorValidate ); + } + + CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey + myKey->AddL( CREATEKEY( EImpsKeySession, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeySessionDescriptor, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeySessionType, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsOutband ); + myKey->PopL( 2 ); + + myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionDescriptor, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionMode, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsRequest ); + myKey->PopL( 1 ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionID, 0 ) ); + aAc->StoreDescL( myKey, aTid ); + // poll missing + myKey->PopL( 2 ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionContent, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeyLogin_Request, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->AddL( CREATEKEY( EImpsKeyUserID, 0 ) ); + aAc->StoreDescL( myKey, aUserId ); + myKey->PopL( ); + + TImpsSDataUtils::CreateClientIdL( myKey, aAc, aClientId ); + + TImpsDigestSchema aSchema = EImpsMD5; + TImpsDigestBytes db; //lint !e1502 no nonstatic members there + if ( aKey1 != NULL && aKey2 != NULL ) + { + db.CreateAolDigestBytesL ( aAc, aSchema, aPwd, *aNonce, aClientId, aKey1, aKey2 ); + } + else if ( aSendPwd ) + { + myKey->AddL( CREATEKEY( EImpsKeyPassword, 0 ) ); + aAc->StoreDescL( myKey, aPwd ); + myKey->PopL( ); + } + else + { + db.CreateDigestBytesL ( aAc, aSchema, aPwd, *aNonce ); + } + + myKey->AddL( CREATEKEY( EImpsKeySessionCookie, 0 ) ); + aAc->StoreDescL( myKey, aCookie ); + + myKey->ReplaceLastL( CREATEKEY( EImpsKeyTimeToLive, 0 ) ); + aAc->StoreIntegerL( myKey, aTime ); + + CleanupStack::PopAndDestroy( 1 ); // >>> myKey + + } + + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::CreateServiceRequestL +// Notice: the granularity of details is in feature level now. +// This means that function and capability level details are hard coded now. +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::CreateServiceRequestL( + MImpsDataAccessor* aAc, + TImpsServices& aServices, + const TDesC& aSID, + const TDesC& aTID, + const TDesC& aCID, + TBool aReactive ) + { + TImpsSDataUtils::SetSessionIDL( aAc, aSID ); + TImpsSDataUtils::SetTransactionIDL( aAc, aTID ); + + CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey + + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + KClientServiceReqElements, + sizeof( KClientServiceReqElements ) / + sizeof( KClientServiceReqElements[0] ) ); + + // Client id + // WV 1.2 missing ClientId + CImpsFields* f = aAc->GetImpsFields(); + if ( f->CspVersion() == EImpsCspVersion11 ) + { + TImpsSDataUtils::CreateClientIdL( + myKey, + aAc, + aCID ); + } + + // Do not ask AllFunctionsRequest + myKey->AddL( CREATEKEY( EImpsKeyAllFunctionsRequest, 0 ) ); + aAc->StoreBooleanL( myKey, EFalse ); + + // Functions and details are hard coded now. + // Notice: update this if new features are available + // This section must be in line with ReadConfig(). + + myKey->ReplaceLastL( CREATEKEY( EImpsKeyFunctions, 0 ) ); + // WVCSPFeat + myKey->AddL( CREATEKEY( EImpsKeyWVCSPFeat, 0 ) ); + // Check IM + TImpsFeature* myFeat = aServices.Feature( EIMFeat ); + if ( myFeat->IsSupported() ) + { + myKey->AddL( CREATEKEY( EImpsKeyIMFeat, 0 ) ); + aAc->StoreEmptyL( myKey ); + if ( myFeat->Function( EIMReceiveFunc ) ) + { + myKey->AddL( CREATEKEY( EImpsKeyIMReceiveFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + if ( myFeat->Capability( KImpsServiceNEWM ) ) + { + myKey->AddL( CREATEKEY( EImpsKeyNEWM, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->PopL(); + } + myKey->ReplaceLastL( CREATEKEY( EImpsKeyIMAuthFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + } + } + + // Group features + myFeat = aServices.Feature( EGroupFeat ); + if ( myFeat->IsSupported() ) + { + myKey->Reset(); + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + KClientServiceReqElements, + sizeof( KClientServiceReqElements ) / + sizeof( KClientServiceReqElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyFunctions, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyWVCSPFeat, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyGroupFeat, 0 ) ); + aAc->StoreEmptyL( myKey ); + } + + // Presence features + myFeat = aServices.Feature( EPresenceFeat ); + if ( myFeat->IsSupported() ) + { + myKey->Reset(); + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + KClientServiceReqElements, + sizeof( KClientServiceReqElements ) / + sizeof( KClientServiceReqElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyFunctions, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyWVCSPFeat, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyPresenceFeat, 0 ) ); + + // If reactive authentication then the entire presence + // is supported + if ( !aReactive ) + { + // These PRESENCE functions are supported if + // not reactive authentication + // PresenceDeliveryFunc + myKey->AddL( CREATEKEY( EImpsKeyPresenceDeliverFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + // AttListFunc supported + myKey->ReplaceLastL( CREATEKEY( EImpsKeyAttListFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + // Contact Lists + myKey->ReplaceLastL( CREATEKEY( EImpsKeyContListFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + // Presence authentication + myKey->ReplaceLastL( CREATEKEY( EImpsKeyPresenceAuthFunc, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyGETWL, 0 ) ); + } + // Add last presence element, either EImpsKeyPresenceFeat + // or EImpsKeyGETWL + aAc->StoreEmptyL( myKey ); + } + + // Fundamental features + myFeat = aServices.Feature( EFundamentalFeat ); + if ( myFeat->IsSupported() ) + { + myKey->Reset(); + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + KClientServiceReqElements, + sizeof( KClientServiceReqElements ) / + sizeof( KClientServiceReqElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyFunctions, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyWVCSPFeat, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyFundamentalFeat, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeySearchFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + myKey->ReplaceLastL( CREATEKEY( EImpsKeyInviteFunc, 0 ) ); + aAc->StoreEmptyL( myKey ); + } + + // Add TImpsTransactionMode now + myKey->Reset(); + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + KTransModeElements, + sizeof( KTransModeElements ) / + sizeof( KTransModeElements[0] ) ); + aAc->StoreIntegerL( myKey, EImpsRequest ); + + CleanupStack::PopAndDestroy( 1 ); // >>> myKey + + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::CreateClientCapabilityReqL +// Notice: Many details are hard coded now. +// Param aSettings cannot be null. +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::CreateClientCapabilityReqL( + MImpsDataAccessor* aAc, + const TDesC& aSID, + const TDesC& aTID, + const TDesC& aCID, + TInt aMultiTrans, + TInt aPollTime, + TImpsSrvSettings& aSettings ) + { + TImpsSDataUtils::SetSessionIDL( aAc, aSID ); + TImpsSDataUtils::SetTransactionIDL( aAc, aTID ); + CImpsKey* myKey = CImpsKey::NewLC(); // <<< myKey + + const TImpsContent* myContent = KClientCapabilityReqElements; + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + myContent, + sizeof( KClientCapabilityReqElements ) / + sizeof( KClientCapabilityReqElements[0] ) ); + + // Client id + // WV 1.2 missing ClientId + CImpsFields* f = aAc->GetImpsFields(); + if ( f->CspVersion() == EImpsCspVersion11 ) + { + TImpsSDataUtils::CreateClientIdL( + myKey, + aAc, + aCID ); + } + + // capabilitylist + myKey->AddL( CREATEKEY( EImpsKeyCapabilityList, 0 ) ); + + // client type + myKey->AddL( CREATEKEY( EImpsKeyClientType, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsMOBILE_PHONE ); + myKey->PopL(); + + // Initial delivery method + myKey->AddL( CREATEKEY( EImpsKeyInitialDeliveryMethod, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsP ); + myKey->PopL(); + + // Content types + myKey->AddL( CREATEKEY( EImpsKeyAnyContent, 0 ) ); + aAc->StoreBooleanL( myKey, ETrue ); + myKey->ReplaceLastL( CREATEKEY( EImpsKeyAcceptedCharSet, 0 ) ); + aAc->StoreIntegerL( myKey, KImpsMIBeUTF8 ); + myKey->PopL(); + + // accepted content length + myKey->AddL( CREATEKEY( EImpsKeyAcceptedContentLength, 0 ) ); + aAc->StoreIntegerL( myKey, aSettings.MaximumMessageSize() ); + myKey->PopL(); + + // accepted transfer encoding + myKey->AddL( CREATEKEY( EImpsKeyAcceptedTransferEncoding, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsBASE64 ); + myKey->PopL(); + + // SupportedBearer + myKey->AddL( CREATEKEY( EImpsKeySupportedBearer, 0 ) ); + aAc->StoreIntegerL( myKey, EImpsHTTP ); + myKey->PopL(); + + // SupportedCIRMethods + CImpsVariant* myVariant = CImpsVariant::NewLC( ); + TInt index( 0 ); + myKey->AddL( CREATEKEY( EImpsKeySupportedCIRMethod, index ) ); + // WAP SMS CIR + if ( aSettings.SMSWAPCIR() ) + { + index++; + aAc->StoreIntegerL( myKey, EImpsWAPSMS ); + } + // WAP UDP CIR + if ( myVariant->IsFeatureSupportedL( EWAPUDP ) && aSettings.UDPWAPCIR() ) + { + myKey->ReplaceLastL( CREATEKEY( EImpsKeySupportedCIRMethod, index++ ) ); + aAc->StoreIntegerL( myKey, EImpsWAPUDP ); + } + // TCP standalone CIR + if ( myVariant->IsFeatureSupportedL( EIpCirStandalone ) && aSettings.TCPSCIR() ) + { + myKey->ReplaceLastL( CREATEKEY( EImpsKeySupportedCIRMethod, index++ ) ); + aAc->StoreIntegerL( myKey, EImpsSTCP ); + } + // UDP standalone CIR + if ( myVariant->IsFeatureSupportedL( EIpCirStandalone ) && aSettings.UDPSCIR() ) + { + myKey->ReplaceLastL( CREATEKEY( EImpsKeySupportedCIRMethod, index++ ) ); + aAc->StoreIntegerL( myKey, EImpsSUDP ); + // Default KDefaultUDPPortNumber in the message due to CCAPAB-10 + myKey->ReplaceLastL( CREATEKEY( EImpsKeyUDPPort, 0 ) ); + aAc->StoreIntegerL( myKey, KDefaultUDPPortNumber ); + } + CleanupStack::PopAndDestroy( ); // << myVariant + myKey->PopL(); + + // Multitrans + myKey->AddL( CREATEKEY( EImpsKeyMultiTrans, 0 ) ); + aAc->StoreIntegerL( myKey, aMultiTrans ); + myKey->PopL(); + + // Parser size + myKey->AddL( CREATEKEY( EImpsKeyParserSize, 0 ) ); + aAc->StoreIntegerL( myKey, aSettings.MaximumParserSize() ); + myKey->PopL(); + + // Poll min initial EImpsKeyServerPollMin + myKey->AddL( CREATEKEY( EImpsKeyServerPollMin, 0 ) ); + aAc->StoreIntegerL( myKey, aPollTime ); + + // Add TImpsTransactionMode now + myKey->Reset(); + myContent = KTransModeElements; + TImpsSDataUtils::AddValuesFromArrayL( + myKey, + myContent, + sizeof( KTransModeElements ) / + sizeof( KTransModeElements[0] ) ); + aAc->StoreIntegerL( myKey, EImpsRequest ); + + CleanupStack::PopAndDestroy( 1 ); // >>> mKey + + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::GetKeepAliveL +// ----------------------------------------------------------------------------- +// +TBool TImpsSDataUtils::GetKeepAliveL( + MImpsDataAccessor* aAc, + TInt& aTime ) + { + TInt time( 0 ); + CImpsKey* myk = CImpsKey::NewLC(); // <<< myk + TImpsSDataUtils::AddValuesFromArrayL( + myk, + KTransContentElements, + sizeof( KTransContentElements ) / + sizeof( KTransContentElements[0] ) ); + myk->AddL( CREATEKEY( EImpsKeyKeepAlive_Response, 0 ) ); + // Check if this is KeepAliveResponse + if ( aAc->CheckBranchExistenceL( myk ) ) + { + myk->AddL( CREATEKEY( EImpsKeyKeepAliveTime, 0 ) ); + } + else + { + // It should be LoginResponse + myk->ReplaceLastL( CREATEKEY( EImpsKeyLogin_Response, 0 ) ); + myk->AddL( CREATEKEY( EImpsKeyKeepAliveTime, 0 ) ); + } + if ( aAc->RestoreIntegerL( myk, time ) ) + { + aTime = time; + } + CleanupStack::PopAndDestroy( 1 ); // >>> myk + return ( aTime ? ETrue : EFalse ); + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::GetLoginSessionIDL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::GetLoginSessionIDL( MImpsDataAccessor* aAc, TPtrC& aID ) + { + TDesC* myPtr; + CImpsKey* myKey = CImpsKey::NewLC(); + myKey->AddL( CREATEKEY( EImpsKeySession, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionContent, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyLogin_Response, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeySessionID, 0 ) ); + if ( aAc->RestoreDescL( myKey, myPtr ) ) + { + aID.Set( *myPtr ); + } + else + { + aID.Set( KNullDesC ); + } + CleanupStack::PopAndDestroy( ); //myKey + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::ContentDataTypeL +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::ContentDataTypeL( + MImpsDataAccessor* aAc, + TPtrC& aContent ) + { + TInt msgType = GetMessageTypeL( aAc ); + TDesC* myPtr; + CImpsKey* myKey = CImpsKey::NewLC(); + aContent.Set( KNullDesC ); + + switch ( msgType ) + { + case EImpsNewMessage: + { + TImpsDataUtils::AddValuesFromArrayL( + myKey, + KNewMessageElements, + sizeof( KNewMessageElements ) / + sizeof( KNewMessageElements[0] ) ); + myKey->AddL( CREATEKEY( EImpsKeyMessageInfo, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyContentType, 0 ) ); + if ( aAc->RestoreDescL( myKey, myPtr ) ) + { + aContent.Set( *myPtr ); + } + break; + } + // Notice: Presence is not checked here + default: + break; + }; + + CleanupStack::PopAndDestroy( ); //myKey + } + + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::GetClientIDL +// Only new message is supported now! +// ----------------------------------------------------------------------------- +// +void TImpsSDataUtils::GetApplicationIDL( MImpsDataAccessor* aAc, TPtrC& aID ) + { + TDesC* myPtr; + CImpsKey* myKey = CImpsKey::NewLC(); + myKey->AddL( CREATEKEY( EImpsKeySession, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyExtBlock, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyAPIClient, 0 ) ); + if ( aAc->RestoreDescL( myKey, myPtr ) ) + { + aID.Set( *myPtr ); + } + else + { + aID.Set( KNullDesC ); + } + CleanupStack::PopAndDestroy( ); //myKey + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::GetCIRL +// CIR error element exists in WV 1.2 and higher only +// ----------------------------------------------------------------------------- +// +TBool TImpsSDataUtils::GetCIRL( MImpsDataAccessor* aAc ) + { + TBool ret( EFalse ); + // first check that not WV 1.1 message + CImpsFields* f = aAc->GetImpsFields(); + if ( f->CspVersion() == EImpsCspVersion11 ) + { + return ret; + } + + CImpsKey* myKey = CImpsKey::NewLC(); + TImpsDataUtils::AddValuesFromArrayL( + myKey, KGetCIRElements, + sizeof( KGetCIRElements ) / sizeof( KGetCIRElements[0] ) ); + aAc->RestoreBooleanL( myKey, ret ); + + CleanupStack::PopAndDestroy( ); //myKey + return ret; + } + +// ----------------------------------------------------------------------------- +// TImpsSDataUtils::GetPureMessageTypeL +// ----------------------------------------------------------------------------- +// +TInt TImpsSDataUtils::GetPureMessageTypeL( MImpsDataAccessor* aAc ) + { + CImpsKey* myKey = CImpsKey::NewLC(); + myKey->AddL( CREATEKEY( EImpsKeySession, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyTransaction, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyTransactionContent, 0 ) ); + myKey->AddL( CREATEKEY( EImpsKeyPureData, 0 ) ); + TInt enumi( 0 ); + TInt index( 0 ); + TImpsKeyType type( EImpsKeyTypeIM ); + // try to get the original message type + if ( aAc->RestoreAlternativeL( myKey, enumi, index, type ) ) + { + CleanupStack::PopAndDestroy( ); //myKey + // if the message type is not stored correctly, + // the default value is EImpsMessageNone + if ( enumi == EImpsMessageNone ) + { + return EImpsPureData; + } + return enumi; + } + + CleanupStack::PopAndDestroy( ); //myKey + return EImpsPureData; + + } +// End of File +