diff -r 000000000000 -r 32704c33136d ncdengine/engine/src/catalogsclientserverallocutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/engine/src/catalogsclientserverallocutils.cpp Tue Jan 26 12:06:03 2010 +0200 @@ -0,0 +1,274 @@ +/* +* Copyright (c) 2006 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: +* +*/ + + +#include "catalogsclientserverallocutils.h" + +#include "catalogsserverdefines.h" + +#include "catalogsutils.h" +#include "catalogsdebug.h" + + +TInt AllocReturnBuf( TInt aExpectedLength, HBufC8*& aAllocatedBuf ) + { + TInt allocationLength = aExpectedLength; + + // Minimum length required for the message to enable internal + // messaging in the case of too small descriptor + if ( allocationLength < KCatalogsMinimumAllocLength ) + { + allocationLength = KCatalogsMinimumAllocLength; + } + + HBufC8* tempReturnBuf( HBufC8::New( allocationLength ) ); + if ( !tempReturnBuf ) + { + return KErrNoMemory; + } + aAllocatedBuf = tempReturnBuf; + return KErrNone; + } + +TInt AllocReturnBuf( TInt aExpectedLength, HBufC16*& aAllocatedBuf ) + { + TInt allocationLength = aExpectedLength; + + // Minimum length required for the message to enable internal + // messaging in the case of too small descriptor + if ( allocationLength < KCatalogsMinimumAllocLength ) + { + allocationLength = KCatalogsMinimumAllocLength; + } + + HBufC16* tempReturnBuf( HBufC16::New( allocationLength ) ); + if ( !tempReturnBuf ) + { + return KErrNoMemory; + } + aAllocatedBuf = tempReturnBuf; + return KErrNone; + } + + + +// --------------------------------------------------------------------------- +// Realloc could be converted to creation of a new buffer and +// deletion of old because the copying of the old contents +// is not needed. +// --------------------------------------------------------------------------- +// +TInt RetrieveNewDescLengthAndReAlloc( HBufC8*& aTempReturnBuf, + TInt& aIncompleteMessageHandle ) + { + TInt incompleteMessageHandle( -1 ); + TInt newDescriptorMaxLength( -1 ); + TInt error( 0 ); + error = InterpretNewAllocInfo( *aTempReturnBuf, + incompleteMessageHandle, + newDescriptorMaxLength ); + DLTRACE(("new maxlength: %d", newDescriptorMaxLength )); + if ( error != KErrNone ) + { + // We should never end up here because it means + // that our internal messaging has done something wrong + + // Cannot delete server side incomplete message because + // handle possible invalid. + aIncompleteMessageHandle = -1; + return error; + } + else if ( newDescriptorMaxLength + <= KCatalogsMinimumAllocLength ) + { + // This should also not be able to happen + aIncompleteMessageHandle = incompleteMessageHandle; + return KErrGeneral; + } + + aIncompleteMessageHandle = incompleteMessageHandle; + + + HBufC8* temp = aTempReturnBuf->ReAlloc( newDescriptorMaxLength ); + + if ( !temp ) + { + return KErrNoMemory; + } + + aTempReturnBuf = temp; + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Realloc could be converted to creation of a new buffer and +// deletion of old because the copying of the old contents +// is not needed. +// --------------------------------------------------------------------------- +// +TInt RetrieveNewDescLengthAndReAlloc( HBufC16*& aTempReturnBuf, + TInt& aIncompleteMessageHandle ) + { + TInt incompleteMessageHandle( -1 ); + TInt newDescriptorMaxLength( -1 ); + TInt error( 0 ); + error = InterpretNewAllocInfo( *aTempReturnBuf, + incompleteMessageHandle, + newDescriptorMaxLength ); + if ( error != KErrNone ) + { + // We should never end up here because it means + // that our internal messaging has done something wrong + + // Cannot delete server side incomplete message because + // handle possible invalid. + aIncompleteMessageHandle = -1; + return error; + } + else if ( newDescriptorMaxLength + <= KCatalogsMinimumAllocLength ) + { + // This should also not be able to happen + aIncompleteMessageHandle = incompleteMessageHandle; + return KErrGeneral; + } + + aIncompleteMessageHandle = incompleteMessageHandle; + + HBufC16* temp = aTempReturnBuf->ReAlloc( newDescriptorMaxLength ); + + if ( !temp ) + { + return KErrNoMemory; + } + + aTempReturnBuf = temp; + + return KErrNone; + } + + + + +// --------------------------------------------------------------------------- +// At the moment this function expects aTempReturnBuf to contain +// elements delimited with KCatalogsTooSmallDescMsgElementDivider. +// +// --------------------------------------------------------------------------- +// +TInt InterpretNewAllocInfo( const HBufC8& aTempReturnBuf, + TInt& aIncompleteMessageHandle, + TInt& aNewDescriptorMaxLength ) + { + + TInt messageLength = aTempReturnBuf.Length(); + if ( messageLength < 3 ) + { + // Too small descriptor to contain valid information for us. + return KErrGeneral; + } + + TInt dividerIndex( aTempReturnBuf.Locate( + KCatalogsTooSmallDescMsgElementDivider ) ); + if ( dividerIndex == KErrNotFound ) + { + return KErrGeneral; + } + + // Message's handle is the string from beginning of the descriptor + // to the previous char before the divider. (length of this is the same + // as index of the divider) + TPtrC8 descHandle = aTempReturnBuf.Left( dividerIndex ); + + TInt intHandle = 0; + TInt error = DesDecToInt( descHandle, intHandle ); + if ( error != KErrNone ) + { + return error; + } + + + TInt lengthFromRight = messageLength - ( dividerIndex + 1 ); + TPtrC8 descNewLength = aTempReturnBuf.Right( lengthFromRight ); + + TInt intNewLength = 0; + error = DesDecToInt( descNewLength, intNewLength ); + if ( error != KErrNone ) + { + return error; + } + + aIncompleteMessageHandle = intHandle; + aNewDescriptorMaxLength = intNewLength; + + return KErrNone; + } + + // --------------------------------------------------------------------------- +// At the moment this function expects aTempReturnBuf to contain +// elements delimited with KCatalogsTooSmallDescMsgElementDivider. +// +// --------------------------------------------------------------------------- +// +TInt InterpretNewAllocInfo( const HBufC16& aTempReturnBuf, + TInt& aIncompleteMessageHandle, + TInt& aNewDescriptorMaxLength ) + { + + TInt messageLength = aTempReturnBuf.Length(); + if ( messageLength < 3 ) + { + // Too small descriptor to contain valid information for us. + return KErrGeneral; + } + + TInt dividerIndex( aTempReturnBuf.Locate( + KCatalogsTooSmallDescMsgElementDivider ) ); + if ( dividerIndex == KErrNotFound ) + { + return KErrGeneral; + } + + // Message's handle is the string from beginning of the descriptor + // to the previous char before the divider. (length of this is the same + // as index of the divider) + TPtrC16 descHandle = aTempReturnBuf.Left( dividerIndex ); + + TInt intHandle = 0; + TInt error = DesDecToInt( descHandle, intHandle ); + if ( error != KErrNone ) + { + return error; + } + + + TInt lengthFromRight = messageLength - ( dividerIndex + 1 ); + TPtrC16 descNewLength = aTempReturnBuf.Right( lengthFromRight ); + + TInt intNewLength = 0; + error = DesDecToInt( descNewLength, intNewLength ); + if ( error != KErrNone ) + { + return error; + } + + aIncompleteMessageHandle = intHandle; + aNewDescriptorMaxLength = intNewLength; + + return KErrNone; + }