diff -r 000000000000 -r 094583676ce7 IMPSengine/datautils/src/impskey.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/datautils/src/impskey.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,411 @@ +/* +* 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: +* class for imps key. +* +*/ + + +// INCLUDE FILES +#include +#include "impskey.h" +#include "impserrors.h" +#include "impsconst.h" + +#ifdef _DEBUG +#include +#endif + +// CONSTANTS +const TInt KDefaultKeySize = 20; +const TInt KAddRoom = 20; + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CImpsKey::CImpsKey() : +iBuffer(NULL), +iCount(0) + { + } + +// Symbian OS default constructor can leave. +void CImpsKey::ConstructL( ) + { + iBuffer = HBufC16::NewL( KDefaultKeySize ); // Insert room for the elements + } + +// Two-phased constructor. +EXPORT_C CImpsKey* CImpsKey::NewL( ) + { + CImpsKey* self = new (ELeave) CImpsKey; + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( ); + return self; + } + +// Two-phased constructor. +EXPORT_C CImpsKey* CImpsKey::NewLC( ) + { + CImpsKey* self = new (ELeave) CImpsKey; + CleanupStack::PushL( self ); + self->ConstructL( ); + return self; + } + + +// Destructor +EXPORT_C CImpsKey::~CImpsKey() + { + delete iBuffer; + } + + +// --------------------------------------------------------- +// CImpsKey::AddL +// Adds new element value the key +// --------------------------------------------------------- +// +void CImpsKey::AddL( + const TInt aElemvalue , + enum TImpsKeyType aKeyType) + { + if( iBuffer->Length( ) + 2 > iBuffer->Des().MaxLength() ) + { + iBuffer = iBuffer->ReAllocL( iBuffer->Length( ) + KAddRoom ); // Insert room + } + TPtr16 buffer = iBuffer->Des(); + buffer.AppendFill( 0,2 ); + TUint16 val = STATIC_CAST(TUint16,GET_INDEX(aElemvalue)); + if(aKeyType == EImpsKeyTypeIM) + val &= 0x7FFF; // High bit is zero + else + val |= 0x8000; // High bit is one + buffer[iCount*2] = val; // Index value + buffer[iCount*2+1] = STATIC_CAST(TUint16,GET_ENUM(aElemvalue)); // Enum value + iCount++; + } + +// --------------------------------------------------------- +// CImpsKey::PopL +// Remove the last item from the key +// --------------------------------------------------------- +// +void CImpsKey::PopL( TInt aCount ) + { + if( iCount - aCount < 0 ) + User::Leave( KImpsErrorKeyEmpty ); + TPtr16 buffer = iBuffer->Des( ); + TInt size = buffer.Length( ); + buffer.SetLength( size - 2*aCount ); + iCount -= aCount; + } + +// --------------------------------------------------------- +// CImpsKey::GetElementL +// Remove the last item from the key +// --------------------------------------------------------- +// +TInt CImpsKey::GetElementL( + const TInt aIndex, TImpsKeyType& aKeyType ) const + { + if( aIndex < 0 ) + User::Leave( KImpsErrorKeyIndexInvalid ); + if( iCount == 0 ) + User::Leave( KImpsErrorKeyEmpty ); + if( aIndex>=iCount ) + User::Leave( KImpsErrorKeyIndexTooLarge ); + TInt highval = (*iBuffer)[aIndex*2]; + if( IS_PRESENCE( highval*0x10000 ) ) + aKeyType = EImpsKeyTypePre; + else + aKeyType = EImpsKeyTypeIM; + highval &= 0x7FFF; // Leave out the high bit + TInt ret = STATIC_CAST( TInt, highval * 0x10000 + (*iBuffer)[aIndex*2+1] ); + return ret; + } + +// --------------------------------------------------------- +// CImpsKey::ReplaceLastL +// Replace last with new key +// --------------------------------------------------------- +// +void CImpsKey::ReplaceLastL( + const TInt aElemvalue, + enum TImpsKeyType aKeyType ) + { + PopL( ); + AddL( aElemvalue, aKeyType ); + } + +// --------------------------------------------------------- +// CImpsKey::Reset +// Reset to empty key +// --------------------------------------------------------- +// +void CImpsKey::Reset() + { + TPtr16 buffer = iBuffer->Des( ); + buffer.SetLength( 0 ); + iCount = 0; + } + +// --------------------------------------------------------- +// CImpsKey::Compare +// --------------------------------------------------------- +// +TInt CImpsKey::Compare( MImpsKey& aKey ) + { + CImpsKey& alien = (CImpsKey&)aKey; + return (*this==alien); + } + +// --------------------------------------------------------- +// CImpsKey::Copy +// Copy the key +// --------------------------------------------------------- +// +CImpsKey* CImpsKey::CopyL( ) const + { + CImpsKey* newKey = new (ELeave) CImpsKey; + CleanupStack::PushL( newKey ); + HBufC16* newString = iBuffer->AllocL( ); + newKey->iBuffer = newString; + newKey->iCount = iCount; + CleanupStack::Pop( ); + return newKey; + } + +// --------------------------------------------------------- +// CImpsKey::CheckKey +// --------------------------------------------------------- +// +TBool CImpsKey::CheckKey( + const CImpsKey *aKey, + TImpsKeyOptions aOptions ) const + { + // Find the string from the buffer + // if the string is not found return EFalse + TInt index = iBuffer->Find( aKey->iBuffer->Des() ); + if(index == KErrNotFound ) + return EFalse; + + // If aOptions is PARTIALKEY and index is 0 we know that the + // key matched to the start of the key. + // If aOptionms is PARTIALKEYLONGER we want the key to little bit more + // than just the plain key. The key is not wholekey + // If aOptions is EWholeKey and the index is 0 and also the + // lengths must be the same then we have macthed whole key + switch ( aOptions ) + { + case EPartialKey: + if( index==0 ) + return ETrue; + break; + case EPartialKeyLonger: + if( index==0 && aKey->Count( ) < Count( )) + return ETrue; + break; + + case EWholeKey: + if( index == 0 && aKey->Count( ) == Count( ) ) + return ETrue; + break; + default: + break; + } + return EFalse; + } + +// --------------------------------------------------------- +// CImpsKey::Size +// Size of the key +// --------------------------------------------------------- +// +TInt CImpsKey::Size( ) const + { + TInt size = sizeof (TInt); // iCount + size += iBuffer->Size( ); + return size; + } + +// --------------------------------------------------------- +// CImpsKey::Pack +// Pack the key +// --------------------------------------------------------- +// +TInt CImpsKey::Pack( + const TUint8*& aPtrStart ) const + { + Mem::Copy( (void*)aPtrStart, &iCount, sizeof( iCount ) ); + aPtrStart = aPtrStart + sizeof( iCount ); + + if( iCount ) + { +// TInt32 tempSize = 0; +/* + tempSize = iBuffer->Size(); + Mem::Copy( (void*)aPtrStart, &tempSize, sizeof( tempSize) ); + aPtrStart = aPtrStart + sizeof( tempSize ); + if ( iCount ) + { + Mem::Copy( (void*)aPtrStart, iBuffer->Ptr(), tempSize); + aPtrStart = aPtrStart + tempSize ; + } +*/ + // tempSize = iBuffer->Size(); + // Mem::Copy( (void*)aPtrStart, &tempSize, sizeof( tempSize) ); + // aPtrStart = aPtrStart + sizeof( tempSize ); + if ( iCount ) + { + Mem::Copy( (void*)aPtrStart, iBuffer->Ptr(), iCount*4); + aPtrStart = aPtrStart + iCount*4 ; + } + } + return KErrNone; + } + +// --------------------------------------------------------- +// CImpsKey::UnPackL +// Pack the key +// --------------------------------------------------------- +// +void CImpsKey::UnPackL( + TUint8*& aPtr ) + { + Mem::Copy( &iCount, aPtr, sizeof( iCount ) ); + aPtr += sizeof( iCount ); + if( iCount ) + { + const TUint8* textPtr = aPtr; +// TInt32 tempSize = 0; + +/* + Mem::Copy( &tempSize, textPtr, sizeof( tempSize) ); + textPtr = textPtr + sizeof( tempSize ); + if ( iCount > 0 ) + { + delete iBuffer; + iBuffer = NULL; + iBuffer = HBufC16::NewL( tempSize ); + Mem::Copy( (void*)iBuffer->Ptr(), textPtr, tempSize ); + iBuffer->Des().SetLength( tempSize ); + textPtr = textPtr + tempSize; +*/ + // Mem::Copy( &tempSize, textPtr, sizeof( tempSize) ); + // textPtr = textPtr + sizeof( tempSize ); + if ( iCount > 0 ) + { + delete iBuffer; + iBuffer = NULL; + iBuffer = HBufC16::NewL( iCount*2 ); + Mem::Copy( (void*)iBuffer->Ptr(), textPtr, iCount*4 ); + iBuffer->Des().SetLength( iCount*2 ); + textPtr = textPtr + iCount*4; + } + if ( iCount < 0 ) + { + User::Leave( KErrCorrupt ); + } + aPtr = (TUint8*) textPtr; + } + } + + +// --------------------------------------------------------- +// CImpsKey::Destroy +// Destroy the key +// --------------------------------------------------------- +// +void CImpsKey::Destroy() + { + delete this; + } + +#ifdef _DEBUG + +// --------------------------------------------------------- +// CImpsKey::DumpToFileL +// --------------------------------------------------------- +// +void CImpsKey::DumpToFileL( RFile& aFile ) const + { + _LIT8( KImpsKeyDumpBegin, " ImpsKey dump begin\r\n"); + aFile.Write( KImpsKeyDumpBegin ); + + TInt count = iCount; + TBuf8<256> message; + _LIT8(KCount," Impskey number of elements = %d\r\n"); + _LIT8(KElement," Impskey element %d\r\n"); + _LIT8(KElementIndex," Impskey element index %d\r\n"); + _LIT8(KElementEnum," Impskey element enum %x\r\n"); + + message.Format( KCount, count ); + aFile.Write( message ); + + + for( TInt k = 0; k< count; k++ ) + { + TImpsKeyType keyType; + TInt elem = GetElementL( k, keyType ); + message.Format( KElement, k ); + aFile.Write( message ); + if( keyType == EImpsKeyTypeIM ) + { + _LIT8( KImpsKeyTypeIM, " ImpsKey type = EImpsKeyTypeIM\r\n"); + aFile.Write( KImpsKeyTypeIM ); + } + else + { + _LIT8( KImpsKeyTypePresence, " ImpsKey type = EImpsKeyTypePre\r\n"); + aFile.Write( KImpsKeyTypePresence ); + } + message.Format( KElementIndex, GET_INDEX(elem) ); + aFile.Write( message ); + message.Format( KElementEnum, GET_ENUM(elem) ); + aFile.Write( message ); + } + + _LIT8( KImpsKeyDumpEnd, " ImpsKey dump end\r\n"); + aFile.Write( KImpsKeyDumpEnd ); + } +#endif + +// --------------------------------------------------------- +// CImpsKey::SetElementIndex +// --------------------------------------------------------- +// +void CImpsKey::SetElementIndex( TInt aCount, TInt aNewIndex ) + { + if( iCount == 0 ) + return; + if( aCount < 0 ) + return; + if( aCount >= iCount ) + return; + TInt highval = (*iBuffer)[aCount*2]; + TUint16 val = STATIC_CAST(TUint16,aNewIndex ); + if( IS_PRESENCE( highval*0x10000 ) ) + val |= 0x8000; + else + val &= 0x7FFF; + TPtr16 buffer = iBuffer->Des(); + buffer[aCount*2] = val; // Index value + } + +// End of File +