--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/IMPSengine/messageencoder/wbxml/src/impsxmlutils.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,1063 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: rovides the methods for pureData handling.
+*
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <miutconv.h>
+#include "impsxmlutils.h"
+#include "impsdataaccessorapi.h"
+#include "impsliterals.h"
+#include "impscommonenums.h"
+#include "impserrors.h"
+#include "impspresence.h"
+#include "impsfundamental.h"
+#include "impsutils.h"
+
+// CONSTANTS
+const TInt KImpsMaxStringSize100 = 100;
+const TInt KImpsBaseIndex = 0;
+const TInt KImpsExtraSpace = 30;
+const TInt KIntegerBufSize = 10;
+
+const TInt KInitBufSize = 1000;
+const TInt KExpandBufSize = 500;
+
+const TInt KTrConStartLen = 19;
+const TInt KTagLen = 1;
+const TInt KEndTagLen = 2;
+
+_LIT8( KTrConStart, "<TransactionContent");
+_LIT8( KTrConEnd, "</TransactionContent>");
+
+
+// ================= MEMBER FUNCTIONS =======================
+// ---------------------------------------------------------
+// CImpsXmlUtils::CImpsXmlUtils()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------
+CImpsXmlUtils::CImpsXmlUtils():
+iPosition( 0 ),
+iBufSize( KImpsMaxStringSize100 ),
+iEncodeBufferSize( KInitBufSize )
+ {
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ConstructL()
+// EPOC default constructor can leave.
+// ---------------------------------------------------------
+void CImpsXmlUtils::ConstructL()
+ {
+ iElementValue = HBufC8::NewL( iBufSize );
+ iElementData = HBufC::NewL( iBufSize );
+ iIntegerValue = HBufC8::NewL( KIntegerBufSize );
+ iEncodeBuffer = CBufFlat::NewL( 50 );
+ iEncodeBuffer->ResizeL( iEncodeBufferSize );
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ResetL()
+// ---------------------------------------------------------
+void CImpsXmlUtils::ResetL()
+ {
+ iPosition = 0;
+ if ( iElementValue == NULL )
+ {
+ iBufSize = KImpsMaxStringSize100;
+ iElementValue = HBufC8::NewL( iBufSize );
+ }
+ if ( iElementData == NULL )
+ {
+ iBufSize = KImpsMaxStringSize100;
+ iElementData = HBufC::NewL( iBufSize );
+ }
+ if ( iIntegerValue == NULL )
+ {
+ iIntegerValue = HBufC8::NewL( KIntegerBufSize );
+ }
+ if ( iEncodeBuffer == NULL )
+ {
+ iEncodeBuffer = CBufFlat::NewL( 50 );
+ iEncodeBufferSize = KInitBufSize;
+ iEncodeBuffer->ResizeL( iEncodeBufferSize );
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------
+CImpsXmlUtils* CImpsXmlUtils::NewL()
+ {
+ CImpsXmlUtils* self = new ( ELeave ) CImpsXmlUtils;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::~CImpsXmlUtils()
+// Destructor
+// ---------------------------------------------------------
+CImpsXmlUtils::~CImpsXmlUtils()
+ {
+ delete iElementValue;
+ delete iIntegerValue;
+ delete iElementData;
+ delete iEncodeBuffer;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::TransactionContentToXmlL
+// ---------------------------------------------------------
+void CImpsXmlUtils::TransactionContentToXmlL( MImpsDataAccessor& /*aImpsData*/ )
+ {
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::StorePureDataL
+// ---------------------------------------------------------
+void CImpsXmlUtils::StorePureDataL( MImpsDataAccessor& aImpsData, TInt aIndex, TInt aMessageType )
+ {
+// if ( iAccessKey )
+// {
+// iAccessKey->Destroy();
+// }
+
+ iEncodeBufferSize = iPosition;
+ iEncodeBuffer->ResizeL( iPosition );
+
+ iAccessKey = aImpsData.NewKeyL();
+ iAccessKey->AddL( CREATEKEY( EImpsKeySession, KImpsBaseIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyTransaction, aIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyTransactionContent, KImpsBaseIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyPureData, KImpsBaseIndex ) );
+ aImpsData.StoreDesc8L( iAccessKey, iEncodeBuffer->Ptr(0 ) );
+ // store the actual message type
+ iAccessKey->AddL( CREATEKEY( aMessageType, KImpsBaseIndex ) );
+ aImpsData.StoreEmptyL( iAccessKey );
+
+ if ( iEncodeBufferSize > KInitBufSize )
+ {
+ iEncodeBufferSize = KInitBufSize;
+ iEncodeBuffer->ResizeL( iEncodeBufferSize );
+ iEncodeBuffer->Compress();
+ }
+ iAccessKey->Destroy();
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::Convert16To8L
+// ---------------------------------------------------------
+//TPtrC8 CImpsXmlUtils::Convert16To8L( TDesC* aDes )
+// {
+// TPtr8 ptr8 = iElementValue->Des();
+// ptr8.Zero();
+// if ( aDes != NULL )
+// {
+// TInt size = aDes->Length();
+// if ( size <= 0 )
+// return ptr8;
+// if ( size > iBufSize )
+// {
+// delete iElementValue;
+// iElementValue = NULL;
+// iElementValue = HBufC8::NewL( size + KImpsExtraSpace );
+// iBufSize = size + KImpsExtraSpace;
+// TPtr8 ptr = iElementValue->Des();
+// TInt rcode = CnvUtfConverter::ConvertFromUnicodeToUtf8( ptr, *aDes );
+// iBufSize = size;
+// if ( rcode != KErrNone )
+// {
+// User::Leave( KImpsErrorDecode );
+// }
+// return EscapeXmlL( );
+// }
+// TInt rcode = CnvUtfConverter::ConvertFromUnicodeToUtf8( ptr8, *aDes );
+// if ( rcode != KErrNone )
+// {
+// User::Leave( KImpsErrorDecode );
+// }
+// }
+// return EscapeXmlL( );
+// }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ConvertBooleanToChar
+// ---------------------------------------------------------
+//TPtrC8 CImpsXmlUtils::ConvertBooleanToChar( TBool aBool )
+// {
+// if ( aBool )
+// return TPtrC8( KTrue );
+// else
+// return TPtrC8( KFalse );
+// }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ConvertIntToPtr
+// ---------------------------------------------------------
+//TPtrC8 CImpsXmlUtils::ConvertIntToPtr( TInt aInteger )
+// {
+// TPtr8 ptr = iIntegerValue->Des();
+// ptr.Zero();
+// ptr.AppendNum( aInteger );
+// return ptr;
+// }
+// ---------------------------------------------------------
+// CImpsXmlUtils::WriteToBufferL
+// ---------------------------------------------------------
+void CImpsXmlUtils::WriteToBufferL( const TDesC8& aData )
+ {
+
+ if ( (iPosition + aData.Length() ) > iEncodeBufferSize )
+ {
+ iEncodeBufferSize += ( KExpandBufSize + aData.Length() );
+ iEncodeBuffer->ResizeL( iEncodeBufferSize );
+ }
+
+ iEncodeBuffer->Write( iPosition, aData );
+ iPosition += aData.Length();
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::StartElementL
+// ---------------------------------------------------------
+void CImpsXmlUtils::StartElementL( const TDesC8& aTag, const TDesC8& aAttribute )
+ {
+ WriteToBufferL( TPtrC8( KStartOfTag ) );
+ WriteToBufferL( aTag );
+ WriteToBufferL( aAttribute );
+ WriteToBufferL( TPtrC8( KEndOfTag ) );
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::EndElementL
+// ---------------------------------------------------------
+void CImpsXmlUtils::EndElementL( const TDesC8& aTag )
+ {
+ WriteToBufferL( TPtrC8( KElementTerminator ) );
+ WriteToBufferL( aTag );
+ WriteToBufferL( TPtrC8( KEndOfTag ) );
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::WriteEmptyElementL
+// ---------------------------------------------------------
+void CImpsXmlUtils::WriteEmptyElementL( const TDesC8& aTag )
+ {
+ WriteToBufferL( TPtrC8( KStartOfTag ) );
+ WriteToBufferL( aTag );
+ WriteToBufferL( TPtrC8( KEndTag ) );
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::EncodeIntegerL
+// ---------------------------------------------------------
+//void CImpsXmlUtils::EncodeIntegerL( TInt aKey,
+// TPtrC8 aElementName,
+// TImpsKeyType aKeyType )
+// {
+// iAccessKey->AddL( CREATEKEY(aKey, KImpsBaseIndex ), aKeyType );
+// TInt value;
+// if ( iImpsData->RestoreIntegerL( iAccessKey, value ) )
+// {
+// StartElementL( aElementName, KNullDesC8 );
+// TPtrC8 data = ConvertIntToPtr ( value );
+// WriteToBufferL( data );
+// EndElementL( aElementName );
+// }
+// iAccessKey->PopL();
+// }
+// ---------------------------------------------------------
+// CImpsXmlUtils::NameToKeyPresenceElements
+// ---------------------------------------------------------
+TImpsPresenceContent CImpsXmlUtils::NameToKeyPresenceElements ( TDesC8* aName )
+ {
+ if ( aName->CompareF( KQualifier ) == 0 ) { return EImpsKeyPRQualifier; }
+ else if ( aName->CompareF( KPresenceValue ) == 0 ) { return EImpsKeyPRPresenceValue; }
+ else if ( aName->CompareF( KOnlineStatus ) == 0 ) { return EImpsKeyPROnlineStatus; }
+ else if ( aName->CompareF( KRegistration ) == 0 ) { return EImpsKeyPRRegistration; }
+ else if ( aName->CompareF( KFreeTextLocation ) == 0 ) { return EImpsKeyPRFreeTextLocation; }
+ else if ( aName->CompareF( KPLMN ) == 0 ) { return EImpsKeyPRPLMN; }
+ else if ( aName->CompareF( KUserAvailability ) == 0 ) { return EImpsKeyPRUserAvailability; }
+ else if ( aName->CompareF( KPreferredLanguage ) == 0 ) { return EImpsKeyPRPreferredLanguage; }
+ else if ( aName->CompareF( KStatusText ) == 0 ) { return EImpsKeyPRStatusText; }
+ else if ( aName->CompareF( KStatusMood ) == 0 ) { return EImpsKeyPRStatusMood; }
+ else if ( aName->CompareF( KAlias ) == 0 ) { return EImpsKeyPRAlias; }
+ else if ( aName->CompareF( KClientInfo ) == 0 ) { return EImpsKeyPRClientInfo; }
+ else if ( aName->CompareF( KClientType ) == 0 ) { return EImpsKeyPRClientType; }
+ else if ( aName->CompareF( KDevManufacturer ) == 0 ) { return EImpsKeyPRDevManufacturer; }
+ else if ( aName->CompareF( KClientProducer ) == 0 ) { return EImpsKeyPRClientProducer; }
+ else if ( aName->CompareF( KModel ) == 0 ) { return EImpsKeyPRModel; }
+ else if ( aName->CompareF( KClientVersion ) == 0 ) { return EImpsKeyPRClientVersion; }
+ else if ( aName->CompareF( KLanguage ) == 0 ) { return EImpsKeyPRLanguage; }
+ else if ( aName->CompareF( KTimeZone ) == 0 ) { return EImpsKeyPRTimeZone; }
+ else if ( aName->CompareF( KZone ) == 0 ) { return EImpsKeyPRZone; }
+ else if ( aName->CompareF( KGeoLocation ) == 0 ) { return EImpsKeyPRGeoLocation; }
+ else if ( aName->CompareF( KLongitude ) == 0 ) { return EImpsKeyPRLongitude; }
+ else if ( aName->CompareF( KLatitude ) == 0 ) { return EImpsKeyPRLatitude; }
+ else if ( aName->CompareF( KAltitude ) == 0 ) { return EImpsKeyPRAltitude; }
+ else if ( aName->CompareF( KAccuracy ) == 0 ) { return EImpsKeyPRAccuracy; }
+ else if ( aName->CompareF( KAddress ) == 0 ) { return EImpsKeyPRAddress; }
+ else if ( aName->CompareF( KCountry ) == 0 ) { return EImpsKeyPRCountry; }
+ else if ( aName->CompareF( KCity ) == 0 ) { return EImpsKeyPRCity; }
+ else if ( aName->CompareF( KStreet ) == 0 ) { return EImpsKeyPRStreet; }
+ else if ( aName->CompareF( KCrossing1 ) == 0 ) { return EImpsKeyPRCrossing1; }
+ else if ( aName->CompareF( KCrossing2 ) == 0 ) { return EImpsKeyPRCrossing2; }
+ else if ( aName->CompareF( KBuilding ) == 0 ) { return EImpsKeyPRBuilding; }
+ else if ( aName->CompareF( KNamedArea ) == 0 ) { return EImpsKeyPRNamedArea; }
+ else if ( aName->CompareF( KCommCap ) == 0 ) { return EImpsKeyPRCommCap; }
+ else if ( aName->CompareF( KCommC ) == 0 ) { return EImpsKeyPRCommC; }
+ else if ( aName->CompareF( KCap ) == 0 ) { return EImpsKeyPRCap; }
+ else if ( aName->CompareF( KStatus ) == 0 ) { return EImpsKeyPRStatus; }
+ else if ( aName->CompareF( KContact ) == 0 ) { return EImpsKeyPRContact; }
+ else if ( aName->CompareF( KNote ) == 0 ) { return EImpsKeyPRNote; }
+ else if ( aName->CompareF( KPreferredContacts ) == 0 ) { return EImpsKeyPRPreferredContacts; }
+ else if ( aName->CompareF( KAddrPref ) == 0 ) { return EImpsKeyPRAddrPref; }
+ else if ( aName->CompareF( KPrefC ) == 0 ) { return EImpsKeyPRPrefC; }
+ else if ( aName->CompareF( KCaddr ) == 0 ) { return EImpsKeyPRCaddr; }
+ else if ( aName->CompareF( KCstatus ) == 0 ) { return EImpsKeyPRCstatus; }
+ else if ( aName->CompareF( KCname ) == 0 ) { return EImpsKeyPRCname; }
+ else if ( aName->CompareF( KCpriority ) == 0 ) { return EImpsKeyPRCpriority; }
+ else if ( aName->CompareF( KStatusContent ) == 0 ) { return EImpsKeyPRStatusContent; }
+ else if ( aName->CompareF( KDirectContent ) == 0 ) { return EImpsKeyPRDirectContent; }
+ else if ( aName->CompareF( KReferredContent ) == 0 ) { return EImpsKeyPRReferredContent; }
+ else if ( aName->CompareF( KContactInfo ) == 0 ) { return EImpsKeyPRContactInfo; }
+ else if ( aName->CompareF( KContainedvCard ) == 0 ) { return EImpsKeyPRContainedvCard; }
+ else if ( aName->CompareF( KReferredvCard ) == 0 ) { return EImpsKeyPRReferredvCard; }
+ else if ( aName->CompareF( KInf_link ) == 0 ) { return EImpsKeyPRInf_link; }
+ else if ( aName->CompareF( KInfoLink ) == 0 ) { return EImpsKeyPRInfoLink; }
+ else if ( aName->CompareF( KLink ) == 0 ) { return EImpsKeyPRLink; }
+ else if ( aName->CompareF( KStatusText ) == 0 ) { return EImpsKeyPRText; }
+ else
+ return EImpsKeyPREND;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::NameToKeyPresencePrimitives
+// ---------------------------------------------------------
+TImpsContent CImpsXmlUtils::NameToKeyPresencePrimitives ( TDesC8* aName )
+ {
+ if ( aName->CompareF( KSubscribePresenceRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeySubscribePresence_Request;
+ return EImpsKeySubscribePresence_Request;
+ }
+ else if ( aName->CompareF( KUnsubscribePresenceRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyUnsubscribePresence_Request;
+ return EImpsKeyUnsubscribePresence_Request;
+ }
+ else if ( aName->CompareF( KGetPresenceRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyGetPresence_Request;
+ return EImpsKeyGetPresence_Request;
+ }
+ else if ( aName->CompareF( KUpdatePresenceRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyUpdatePresence_Request;
+ return EImpsKeyUpdatePresence_Request;
+ }
+ else if ( aName->CompareF( KGetAttributeListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyGetAttributeList_Request;
+ return EImpsKeyGetAttributeList_Request;
+ }
+ else if ( aName->CompareF( KDeleteAttributeListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyDeleteAttributeList_Request;
+ return EImpsKeyDeleteAttributeList_Request;
+ }
+ else if ( aName->CompareF( KCreateAttributeListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyCreateAttributeList_Request;
+ return EImpsKeyCreateAttributeList_Request;
+ }
+ else if ( aName->CompareF( KCancelAuthRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyCancelAuth_Request;
+ return EImpsKeyCancelAuth_Request;
+ }
+ else if ( aName->CompareF( KPresenceAuthUser) == 0 )
+ {
+ iPrimitive = EImpsKeyPresenceAuth_User;
+ return EImpsKeyPresenceAuth_User;
+ }
+ else if ( aName->CompareF( KGetWatcherListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyGetWatcherList_Request;
+ return EImpsKeyGetWatcherList_Request;
+ }
+ else if ( aName->CompareF( KGetListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyGetList_Request;
+ return EImpsKeyGetList_Request;
+ }
+ else if ( aName->CompareF( KCreateListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyCreateList_Request;
+ return EImpsKeyCreateList_Request;
+ }
+ else if ( aName->CompareF( KDeleteListRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyDeleteList_Request;
+ return EImpsKeyDeleteList_Request;
+ }
+ else if ( aName->CompareF( KListManageRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyListManage_Request;
+ return EImpsKeyListManage_Request;
+ }
+
+ else if ( aName->CompareF( KGetReactiveAuthStatusRequest ) == 0 )
+ {
+ iPrimitive = EImpsKeyGetReactiveAuthStatus_Request;
+ return EImpsKeyGetReactiveAuthStatus_Request;
+ }
+
+ else if ( aName->CompareF( KStatus ) == 0 )
+ {
+ if ( iPrimitive == KErrNotFound )
+ {
+ iPrimitive = EImpsKeyStatus;
+ return EImpsKeyStatus;
+ }
+ return EImpsKeyEND;
+ }
+ else if ( aName->CompareF( KTransactionContent ) == 0 ) { return EImpsKeyTransactionContent; }
+ else if ( aName->FindF( KPresenceSubList ) != KErrNotFound)
+ {
+ return EImpsKeyPresenceSubList;
+ }
+ // These are here because they are not in PA namespace
+ else if ( aName->CompareF( KUser ) == 0 ) { return EImpsKeyUser; }
+ else if ( aName->CompareF( KUserID ) == 0 ) { return EImpsKeyUserID; }
+ else if ( aName->CompareF( KAcceptance ) == 0 ) { return EImpsKeyAcceptance; }
+ else if ( aName->CompareF( KCode ) == 0 ) { return EImpsKeyCode; }
+ else if ( aName->CompareF( KContactList ) == 0 ) { return EImpsKeyContactList; }
+ else if ( aName->CompareF( KDetailedResult ) == 0 ) { return EImpsKeyDetailedResult; }
+ else if ( aName->CompareF( KPresence ) == 0 ) { return EImpsKeyPresence; }
+ else if ( aName->CompareF( KUser ) == 0 ) { return EImpsKeyUser; }
+ else if ( aName->CompareF( KURL ) == 0 ) { return EImpsKeyURL; }
+ else if ( aName->CompareF( KScreenName ) == 0 ) { return EImpsKeyScreenName; }
+ else if ( aName->CompareF( KDefaultContactList ) == 0 ) { return EImpsKeyDefaultContactList; }
+ else if ( aName->CompareF( KDefaultList ) == 0 ) { return EImpsKeyDefaultList; }
+ else if ( aName->CompareF( KClientID ) == 0 ) { return EImpsKeyClientID; }
+ else if ( aName->CompareF( KGroupID ) == 0 ) { return EImpsKeyGroupID; }
+ else if ( aName->CompareF( KMessageID ) == 0 ) { return EImpsKeyMessageID; }
+ else if ( aName->CompareF( KNickList ) == 0 ) { return EImpsKeyNickList; }
+ else if ( aName->CompareF( KName ) == 0 ) { return EImpsKeyName; }
+ else if ( aName->CompareF( KNickName ) == 0 ) { return EImpsKeyNickName; }
+ else if ( aName->CompareF( KDefaultAttributeList ) == 0 ) { return EImpsKeyDefaultAttributeList; }
+ else if ( aName->CompareF( KResult ) == 0 ) { return EImpsKeyResult; }
+ else if ( aName->CompareF( KProperty ) == 0 ) { return EImpsKeyProperty; }
+ else if ( aName->CompareF( KValue ) == 0 ) { return EImpsKeyValue; }
+ else if ( aName->CompareF( KContactListProperties ) == 0 ){ return EImpsKeyContactListProperties; }
+ else if ( aName->CompareF( KAddNickList ) == 0 ) { return EImpsKeyAddNickList; }
+ else if ( aName->CompareF( KRemoveNickList ) == 0 ) { return EImpsKeyRemoveNickList; }
+ else if ( aName->CompareF( KResult ) == 0 ) { return EImpsKeyResult; }
+ else if ( aName->CompareF( KDescription ) == 0 ) { return EImpsKeyDescription; }
+ else if ( aName->CompareF( KContentType ) == 0 ) { return EImpsKeyContentType; }
+ else if ( aName->CompareF( KReceiveList ) == 0 ) { return EImpsKeyReceiveList; }
+ else if ( aName->CompareF( KAutoSubscribe ) == 0 ) { return EImpsKeyAuto_Subscribe; }
+ else
+ return EImpsKeyEND;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::DoParseL
+// ---------------------------------------------------------
+void CImpsXmlUtils::DoParseL( )
+ {
+ iAccessKey->AddL( CREATEKEY( EImpsKeySession, KImpsBaseIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyTransaction, KImpsBaseIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyTransactionContent, KImpsBaseIndex ) );
+ iAccessKey->AddL( CREATEKEY( EImpsKeyPureData, KImpsBaseIndex ) );
+
+ iPosition = 0;
+ TDesC8* pureData;
+ if ( iImpsData->RestoreDesc8L( iAccessKey, pureData ) )
+ {
+ // remove pureData from key
+ iAccessKey->PopL();
+
+ TInt end = pureData->Find( KTrConEnd );
+ if ( end == KErrNotFound )
+ {
+ User::Leave( KImpsErrorValidate );
+ }
+ // handle trCon start
+ iData.Set( pureData->Mid( iPosition ) );
+ if ( iData.Find( KTrConStart ) == KErrNotFound )
+ {
+ User::Leave( KImpsErrorValidate );
+ }
+ TInt trcon = iData.Find( KEndOfTag);
+ TPtrC8 data = iData.Mid( KTrConStartLen, ( trcon - KTrConStartLen ) );
+
+ SaveDataL( &data, EImpsKeyTransactionContent );
+ UpdatePosition( trcon + KTagLen );
+ UpdatePosition( iData.Mid( iPosition ).Find( KStartOfTag ) );
+
+ ParseElementsL();
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::XmlToTransactionContentL
+// ---------------------------------------------------------
+TInt CImpsXmlUtils::XmlToTransactionContentL( MImpsDataAccessor& aImpsData )
+ {
+ TInt error( KErrNone );
+ iPrimitive = KErrNotFound;
+ iImpsData = &aImpsData;
+ iAccessKey = aImpsData.NewKeyL();
+
+ TRAP ( error, DoParseL() )
+
+ iAccessKey->Destroy();
+
+ if ( error != KErrNone )
+ {
+ User::Leave( error );
+ }
+ return iPrimitive;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::UpdatePosition
+// ---------------------------------------------------------
+void CImpsXmlUtils::UpdatePosition ( TInt aLength )
+ {
+ iPosition += aLength;
+ if ( iPosition >= iData.Size() )
+ {
+ iContinue = EFalse;
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::FindNextTag
+// ---------------------------------------------------------
+TInt CImpsXmlUtils::FindNextTag ( )
+ {
+ TPtrC8 next = iData.Mid( iPosition );
+ return next.Find ( KStartOfTag );
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::CreateKeyL
+// ---------------------------------------------------------
+TInt CImpsXmlUtils::CreateKeyL( TInt aLength )
+ {
+ TPtrC8 elementName = iData.Mid( iPosition, aLength );
+
+ TImpsKeyType keyType ( EImpsKeyTypeIM );
+ TInt key = NameToKeyPresencePrimitives ( &elementName );
+ if ( key == EImpsKeyEND )
+ {
+ key = NameToKeyPresenceElements( &elementName );
+ if ( key != EImpsKeyPREND )
+ {
+ keyType = EImpsKeyTypePre;
+ }
+ }
+ if ( key != EImpsKeyEND && key != EImpsKeyPREND )
+ {
+ TBool found ( ETrue );
+ TInt index ( 0 );
+ while( found )
+ {
+ iAccessKey->AddL( CREATEKEY( key, index ), keyType );
+ if ( iImpsData->CheckBranchExistenceL( iAccessKey ) )
+ {
+ iAccessKey->PopL();
+ index++;
+ }
+ else
+ found = EFalse;
+ }
+ }
+ return key;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ParseElementsL
+// ---------------------------------------------------------
+void CImpsXmlUtils::ParseElementsL( )
+ {
+ iContinue = ETrue;
+ while ( iContinue )
+ {
+ TPtrC8 ptr = iData.Mid( iPosition ); // <
+
+ TInt tagEnd = ptr.Find( KEndOfTag ); // >
+ TInt emptyTag = ptr.Find( KEndTag ); // />
+ TInt elementEnd = ptr.Find( KElementTerminator ); // </
+
+ TImpsParseState state ( EImpsUndefined );
+
+ if ( elementEnd == 0 )
+ {
+ state = EImpsEndElement;
+ }
+ else if ( tagEnd != KErrNotFound && emptyTag != KErrNotFound )
+ {
+ if ( tagEnd < emptyTag )
+ state = EImpsStartElement;
+ else
+ state = EImpsEmptyElement;
+ }
+ else if ( tagEnd != KErrNotFound )
+ {
+ state = EImpsStartElement;
+ }
+ else if ( emptyTag != KErrNotFound )
+ {
+ state = EImpsEmptyElement;
+ }
+ else
+ {
+ iContinue = EFalse;
+ }
+
+ switch ( state )
+ {
+ case EImpsStartElement:
+ {
+ TInt length = tagEnd - KTagLen;
+ UpdatePosition( KTagLen);
+ TInt key = CreateKeyL( length );
+ UpdatePosition( length + KTagLen );
+
+ TInt next = FindNextTag();
+ TPtrC8 data = iData.Mid( iPosition, next );
+
+ UpdatePosition( data.Size( ) );
+ SaveDataL( &data, key );
+ }
+ break;
+ case EImpsEmptyElement:
+ {
+ TInt length = emptyTag - KTagLen;
+ UpdatePosition( KTagLen );
+ TInt key = CreateKeyL( length );
+ UpdatePosition( length + KEndTagLen );
+
+ TInt next = FindNextTag();
+ TPtrC8 data;
+ if (next != KErrNotFound )
+ {
+ data.Set( iData.Mid( iPosition, 0 ) );
+ UpdatePosition( next );
+ SaveDataL( &data, key );
+ }
+ iAccessKey->PopL();
+ }
+ break;
+ case EImpsEndElement:
+ {
+ iAccessKey->PopL();
+ UpdatePosition( elementEnd + KTagLen );
+
+ TInt next = FindNextTag();
+ if ( next != KErrNotFound )
+ {
+ UpdatePosition( next );
+ }
+ else
+ {
+ // the end
+ TInt end = iData.Mid( iPosition ).Find ( KEndOfTag );
+ if ( end != KErrNotFound )
+ {
+ UpdatePosition( end + KEndTagLen );
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::SaveDataL
+// ---------------------------------------------------------
+void CImpsXmlUtils::SaveDataL( TDesC8* aData, TInt aKey )
+ {
+ TImpsDataType dataType = iImpsData->KeyTypeL( iAccessKey );
+
+ switch ( dataType )
+ {
+ case EImpsDataTypeInt:
+ if ( aData->Length() > 0 )
+ {
+ iImpsData->StoreIntegerL( iAccessKey, ConvertToIntL( aData, aKey ) );
+ }
+ break;
+ case EImpsDataTypeDesc:
+ {
+ iElementValue->Des().Zero();
+ TInt size = aData->Length();
+ if ( size > iBufSize )
+ {
+ delete iElementValue;
+ iElementValue = NULL;
+ iElementValue = HBufC8::NewL( size + KImpsExtraSpace );
+ iBufSize = size + KImpsExtraSpace;
+ }
+ TPtr8 ptr = iElementValue->Des();
+ ptr.Copy(*aData);
+ UnescapeL();
+
+ TPtr dataPtr = iElementData->Des();
+ dataPtr.Zero();
+ TInt rcode = CnvUtfConverter::ConvertToUnicodeFromUtf8( dataPtr, *iElementValue );
+ if ( rcode != KErrNone )
+ {
+ // should we leave here or not?
+ }
+ iImpsData->StoreDescL( iAccessKey, *iElementData );
+ }
+ break;
+ case EImpsDataTypeDesc8:
+ {
+ iElementValue->Des().Zero();
+ TInt size = aData->Length();
+ if ( size > iBufSize )
+ {
+ delete iElementValue;
+ iElementValue = NULL;
+ iElementValue = HBufC8::NewL( size + KImpsExtraSpace );
+ iBufSize = size + KImpsExtraSpace;
+ }
+ TPtr8 ptr = iElementValue->Des();
+ ptr.Copy(*aData);
+ UnescapeL();
+ iImpsData->StoreDesc8L( iAccessKey, *iElementValue );
+ }
+ break;
+ case EImpsDataTypeBoolean:
+ if ( aData->Length() > 0 )
+ {
+ iImpsData->StoreBooleanL( iAccessKey, ConvertToBoolean ( aData ) );
+ }
+ break;
+ case EImpsDataTypeNone:
+ iImpsData->StoreEmptyL( iAccessKey );
+ break;
+ case EImpsDataTypeNotSupported:
+ break;
+ default:
+ break;
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ConvertToIntL
+// ---------------------------------------------------------
+TInt CImpsXmlUtils::ConvertToIntL( TDesC8* aData, TInt aKey )
+ {
+ if ( aData->CompareF( KInband ) == 0 )
+ return EImpsInband;
+ else if ( aData->CompareF( KOutband ) == 0 )
+ return EImpsOutband;
+ else if ( aData->CompareF( KRequest ) == 0 )
+ return EImpsRequest;
+ else if ( aData->CompareF( KResponse ) == 0 )
+ return EImpsResponse;
+ else if ( aData->CompareF( KURL ) == 0 )
+ return EImpsCliURL;
+ else if ( aData->CompareF( KMSISDN ) == 0 )
+ return EImpsCliMSISDN;
+ else if ( aData->CompareF( KPWD ) == 0 )
+ return EImpsPWD;
+ else if ( aData->CompareF( KSHA ) == 0 )
+ return EImpsSHA;
+ else if ( aData->CompareF( KMD4 ) == 0 )
+ return EImpsMD4;
+ else if ( aData->CompareF( KMD5 ) == 0 )
+ return EImpsMD5;
+ else if ( aData->CompareF( KMD6 ) == 0 )
+ return EImpsMD6;
+ else if ( aData->CompareF( KMOBILE_PHONE ) == 0 )
+ return EImpsMOBILE_PHONE;
+ else if ( aData->CompareF( KCOMPUTER ) == 0 )
+ return EImpsCOMPUTER;
+ else if ( aData->CompareF( KPDA ) == 0 )
+ return EImpsPDA;
+ else if ( aData->CompareF( KCLI ) == 0 )
+ return EImpsCLI;
+ else if ( aData->CompareF( KOTHER ) == 0 )
+ return EImpsOTHER;
+ else if ( aData->CompareF( KNotify ) == 0 )
+ return EImpsN;
+ else if ( aData->CompareF( KPush ) == 0 )
+ return EImpsP;
+ else if ( aData->CompareF( KSMS ) == 0 )
+ {
+ if ( aKey == EImpsKeySupportedBearer )
+ return EImpsSMS;
+ else
+ return EImpsCapSMS;
+ }
+ else if ( aData->CompareF( KWSP ) == 0 )
+ return EImpsWSP;
+ else if ( aData->CompareF( KHTTP ) == 0 )
+ return EImpsHTTP;
+ else if ( aData->CompareF( KHTTPS ) == 0 )
+ return EImpsHTTPS;
+ else if ( aData->CompareF( KWAPSMS ) == 0 )
+ return EImpsWAPSMS;
+ else if ( aData->CompareF( KWAPUDP ) == 0 )
+ return EImpsWAPUDP;
+ else if ( aData->CompareF( KSUDP ) == 0 )
+ return EImpsSUDP;
+ else if ( aData->CompareF( KSTCP ) == 0 )
+ return EImpsSTCP;
+ else if ( aData->CompareF( KUSER_ID ) == 0 )
+ return EImpsUserID;
+ else if ( aData->CompareF( KUSER_FIRST_NAME ) == 0 )
+ return EImpsUserFirstName;
+ else if ( aData->CompareF( KUSER_LAST_NAME ) == 0 )
+ return EImpsUserLastName;
+ else if ( aData->CompareF( KUSER_EMAIL_ADDRESS ) == 0 )
+ return EImpsUserEmailAddress;
+ else if ( aData->CompareF( KUSER_ALIAS ) == 0 )
+ return EImpsUserAlias;
+ else if ( aData->CompareF( KUSER_ONLINE_STATUS ) == 0 )
+ return EImpsUserOnlineStatus;
+ else if ( aData->CompareF( KUSER_MOBILE_NUMBER ) == 0 )
+ return EImpsUserMobileNumber;
+ else if ( aData->CompareF( KGROUP_ID ) == 0 )
+ return EImpsGroupID;
+ else if ( aData->CompareF( KGROUP_NAME ) == 0 )
+ return EImpsGroupName;
+ else if ( aData->CompareF( KGROUP_TOPIC ) == 0 )
+ return EImpsGroupTopic;
+ else if ( aData->CompareF( KGROUP_USER_ID_JOINED ) == 0 )
+ return EImpsGroupUserIDJoined;
+ else if ( aData->CompareF( KGROUP_USER_ID_OWNER ) == 0 )
+ return EImpsGroupUserIDOwner;
+ else if ( aData->CompareF( KGR ) == 0 )
+ return EImpsGR;
+ else if ( aData->CompareF( KIM ) == 0 )
+ return EImpsIM;
+ else if ( aData->CompareF( KPR ) == 0 )
+ return EImpsPR;
+ else if ( aData->CompareF( KSC ) == 0 )
+ return EImpsSC;
+ else if ( aData->CompareF( KGet ) == 0 )
+ return EImpsG;
+ else if ( aData->CompareF( KSet ) == 0 )
+ return EImpsS;
+ else if ( aData->CompareF( KUnset ) == 0 )
+ return EImpsU;
+ else if ( aData->CompareF( KNone ) == 0 )
+ return EImpsNone;
+ else if ( aData->CompareF( KBASE64 ) == 0 )
+ return EImpsBASE64;
+ else if ( aData->CompareF( KIM ) == 0 )
+ return EImpsCapIM;
+ else if ( aData->CompareF( KCALL ) == 0 )
+ return EImpsCapCALL;
+ else if ( aData->CompareF( KSMS ) == 0 )
+ return EImpsCapSMS;
+ else if ( aData->CompareF( KMMS ) == 0 )
+ return EImpsCapMMS;
+ else if ( aData->CompareF( KEMAIL ) == 0 )
+ return EImpsCapEMAIL;
+ else if ( aData->CompareF( KAVAILABLE ) == 0 )
+ return EImpsAvailable;
+ else if ( aData->CompareF( KNOT_AVAILABLE ) == 0 )
+ return EImpsNotAvailable;
+ else if ( aData->CompareF( KDISCREET ) == 0 )
+ return EImpsDiscreet;
+ else if ( aData->CompareF( KOPEN ) == 0 )
+ return 1;
+ else if ( aData->CompareF( KCLOSED ) == 0 )
+ return 2;
+ else
+ {
+ TLex8 lex( *aData );
+ TInt converted;
+ if ( KErrNone == lex.Val( converted ) )
+ {
+ return converted;
+ }
+ else
+ {
+ User::Leave( KImpsErrorDecode );
+ }
+ // this is just for the compiler
+ return KImpsErrorDecode;
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ConvertToBoolean
+// ---------------------------------------------------------
+TBool CImpsXmlUtils::ConvertToBoolean ( TDesC8* aData )
+ {
+ if ( aData->CompareF( KTrue ) == 0 )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::EscapeXmlL
+// ---------------------------------------------------------
+TPtrC8 CImpsXmlUtils::EscapeXmlL ( const TDesC8& aDes )
+ {
+
+ if ( iElementValue )
+ {
+ delete iElementValue;
+ iElementValue = NULL;
+ }
+
+ iElementValue = aDes.AllocL();
+ iBufSize = aDes.Length();
+
+ TPtr8 ptr8a = iElementValue->Des();
+ TBool rep ( EFalse );
+ TInt found ( 0 );
+ // count escaped characters
+ for ( TInt i = 0; i < iElementValue->Length(); ++i )
+ {
+ TUint ch = ptr8a[ i ];
+ TPtrC8 p ( iElementValue->Mid( i, 1) );
+ if ( ch == '&'
+ || ch == '<'
+ || ch == '>'
+ || ch == '"'
+ || !p.Compare( KApos8 ) ) // '
+ {
+ ++found;
+ }
+ }
+ // check the buffer size
+ TInt len = iElementValue->Length() + found * 5;
+ if ( len > iBufSize )
+ {
+ iElementValue = iElementValue->ReAllocL( len );
+ iBufSize = len;
+ }
+ TPtr8 ptr8 = iElementValue->Des();
+
+ // escape &
+ // this is special case because the
+ // escaping literal contains '&'
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Locate('&');
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 1, KReplace );
+ rep = ETrue;
+ }
+ }
+ found = 0;
+ if ( rep )
+ {
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Find( KReplace );
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 5, KAndRep8 );
+ }
+ }
+ }
+ // escape <
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Locate('<');
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 1, KltRep8 );
+ }
+ }
+ // escape >
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Locate('>');
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 1, KgtRep8 );
+ }
+ }
+ // escape "
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Locate('"');
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 1, KQuotRep8 );
+ }
+ }
+ // escape '
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr8.Find( KApos8);
+ if ( found != KErrNotFound )
+ {
+ ptr8.Replace( found, 1, KAposRep8 );
+ }
+ }
+ return ptr8;
+ }
+// ---------------------------------------------------------
+// CImpsXmlUtils::ReplaceXmlSpecialCharacters ()
+// ---------------------------------------------------------
+void CImpsXmlUtils::UnescapeL()
+ {
+ TPtr8 ptr = iElementValue->Des();
+ // &
+ TInt found ( 0 );
+ while ( found != KErrNotFound )
+ {
+ found = ptr.Find( KAndRep8 );
+ if ( found != KErrNotFound )
+ ptr.Replace( found, 5, KAnd8 );
+ }
+ // <
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr.Find( KltRep8 );
+ if ( found != KErrNotFound )
+ ptr.Replace( found, 4, Klt8 );
+ }
+ // >
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr.Find( KgtRep8 );
+ if ( found != KErrNotFound )
+ ptr.Replace( found, 4, Kgt8 );
+ }
+ // "
+ found = 0;
+ while ( found != KErrNotFound )
+ {
+ found = ptr.Find( KQuotRep8 );
+ if ( found != KErrNotFound )
+ ptr.Replace( found, 6, KQuot8 );
+ }
+ // '
+ found = 0;
+ while ( found != KErrNotFound)
+ {
+ found = ptr.Find(KAposRep8);
+ if ( found != KErrNotFound )
+ ptr.Replace( found, 4, KApos8 );
+ }
+ }
+