--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/engine/src/catalogsclientserverallocutils.cpp Thu Dec 17 08:51:10 2009 +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.
+// <incomplete message's handle><KCatalogsTooSmallDescMsgElementDivider><new length>
+// ---------------------------------------------------------------------------
+//
+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.
+// <incomplete message's handle><KCatalogsTooSmallDescMsgElementDivider><new length>
+// ---------------------------------------------------------------------------
+//
+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;
+ }