diff -r 000000000000 -r dd21522fd290 browserutilities/feedsengine/FeedsServer/Common/src/Packed.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserutilities/feedsengine/FeedsServer/Common/src/Packed.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: A base class to serialize objects between clients and the server. +* +*/ + + +#include "Logger.h" +#include "Packed.h" +#include "PackedAttributes.h" + + +// ----------------------------------------------------------------------------- +// CPacked::CPacked +// +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPacked::CPacked(TInt aTokenArrayInc, TInt aStringTableInc): + KTokenArrayInc(aTokenArrayInc), KStringTableInc(aStringTableInc) + { + } + + +// ----------------------------------------------------------------------------- +// CPacked::ConstructL +// +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPacked::BaseConstructL() + { + iStringTable = HBufC::NewL(KStringTableInc); + } + + +// ----------------------------------------------------------------------------- +// CPacked::~CPacked +// +// Deconstructor. +// ----------------------------------------------------------------------------- +// +CPacked::~CPacked() + { + delete iTokenArray; + delete iStringTable; + } + + +// ----------------------------------------------------------------------------- +// CPacked::AddAttributeL +// +// Insert an attribute. This attribute is applied to the enclosing entity +// (Feed, Item, Enclosure, folder, etc.). +// ----------------------------------------------------------------------------- +// +void CPacked::AddAttributeL(TInt aAttribute, const TDesC& aValue) + { + TUint offset; + + // Get the offset for the string. + offset = iStringTable->Length(); + + // If need be re-alloc the string table. + if ((iStringTable->Length() + aValue.Length()) >= iStringTable->Des().MaxLength()) + { + TUint delta = KStringTableInc; + + if (aValue.Length() > KStringTableInc) + { + delta = aValue.Length() + KStringTableInc; + } + + iStringTable = iStringTable->ReAllocL(iStringTable->Des().MaxLength() + delta); + } + + // Add the value to the string table. + iStringTable->Des().Append(aValue); + + // Add the attribute token block. + InsertTokenL(EPackedTokenAttribute); + InsertTokenL(aAttribute); + InsertTokenL(offset); + InsertTokenL(aValue.Length()); + } + + +// ----------------------------------------------------------------------------- +// CPacked::AddAttributeL +// +// Insert an attribute. This attribute is applied to the enclosing entity +// (Feed, Item, Enclosure, folder, etc.). +// ----------------------------------------------------------------------------- +// +void CPacked::AddAttributeL(TInt aAttribute, TInt aValue) + { + TBuf<25> buff; + + buff.AppendNum(aValue); + AddAttributeL(aAttribute, buff); + } + + +// ----------------------------------------------------------------------------- +// CPacked::InsertTokenL +// +// Insert a token. +// ----------------------------------------------------------------------------- +// +void CPacked::InsertTokenL(TUint aToken) + { + // If need be re-alloc the token array. + if (iTokenArrayLength == iTokenArrayMaxLength) + { + iTokenArray = static_cast(User::ReAllocL(iTokenArray, sizeof(TUint) * + (iTokenArrayMaxLength + KTokenArrayInc))); + + iTokenArrayMaxLength += KTokenArrayInc; + } + + // Append the token. + iTokenArray[iTokenArrayLength++] = aToken; + } + + +// ----------------------------------------------------------------------------- +// CPacked::AppendTokenChunkL +// +// Append a chunk of "token" values to the feed. +// ----------------------------------------------------------------------------- +// +void CPacked::AppendTokenChunkL(const TDesC8& aChunk) + { + if (aChunk.Length() == 0) + { + return; + } + + TInt tokenLength = aChunk.Size() / sizeof(TUint); + const TUint* tokens = (const TUint*) aChunk.Ptr(); + + // If need be re-alloc the token array. + if ((iTokenArrayLength + tokenLength) >= iTokenArrayMaxLength) + { + TInt inc = tokenLength; + + if (KTokenArrayInc > tokenLength) + { + inc = KTokenArrayInc; + } + + iTokenArray = static_cast(User::ReAllocL(iTokenArray, sizeof(TUint) * + (iTokenArrayMaxLength + inc))); + + iTokenArrayMaxLength += inc; + } + + // Append the tokens. + for (TInt i = 0; i < tokenLength; i++) + { + iTokenArray[iTokenArrayLength++] = tokens[i]; + } + } + + +// ----------------------------------------------------------------------------- +// CPacked::AppendStringTableChunkL +// +// Append a chunk of "string-table" values to the feed. +// ----------------------------------------------------------------------------- +// +void CPacked::AppendStringTableChunkL(const TDesC8& aChunk) + { + if (aChunk.Length() == 0) + { + return; + } + + TPtrC buf((const TUint16 *) aChunk.Ptr(), aChunk.Size() / sizeof(TUint16)); + + // If need be re-alloc the string table. + if ((iStringTable->Length() + buf.Length()) >= iStringTable->Des().MaxLength()) + { + TInt inc = buf.Length(); + + if (KStringTableInc > buf.Length()) + { + inc = KStringTableInc; + } + + iStringTable = iStringTable->ReAllocL(iStringTable->Des().MaxLength() + + inc); + } + + // Add the value to the string table. + iStringTable->Des().Append(buf); + } + + +// ----------------------------------------------------------------------------- +// CPacked::Trim +// +// Removes any temp memory used while appending chunks. +// ----------------------------------------------------------------------------- +// +void CPacked::Trim() + { + // Trim the string table. + if (iStringTable->Length() < iStringTable->Des().MaxLength()) + { + TRAP_IGNORE(iStringTable = iStringTable->ReAllocL(iStringTable->Length())); + } + + // Trim the string table. + if (iTokenArrayLength < iTokenArrayMaxLength) + { + TRAP_IGNORE(iTokenArray = static_cast(User::ReAllocL(iTokenArray, + sizeof(TUint) * iTokenArrayLength))); + } + } + + +// ----------------------------------------------------------------------------- +// CPacked::HasNextToken +// +// Determine if there is a next token. +// ----------------------------------------------------------------------------- +// +TBool CPacked::HasNextToken() const + { + return (iNextToken < iTokenArrayLength); + } + + +// ----------------------------------------------------------------------------- +// CPacked::NextToken +// +// Returns the next token. +// ----------------------------------------------------------------------------- +// +TUint CPacked::NextToken() const + { + // TODO: Panic if iNextToken >= iTokenArrayLength. + + return iTokenArray[const_cast(this)->iNextToken++]; + } + + +// ----------------------------------------------------------------------------- +// CPacked::NextToken +// +// Resets back to the first token. +// ----------------------------------------------------------------------------- +// +void CPacked::Reset() const + { + const_cast(this)->iNextToken = 0; + } + + +// ----------------------------------------------------------------------------- +// CPacked::ExtractAttributeValue +// +// Upon completion aValue wraps the current attribute value. +// This method must only be called when the call to NextToken +// returns EPackedTokenAttribute. +// ----------------------------------------------------------------------------- +// +void CPacked::ExtractAttributeValue(TUint& aAttribute, TPtrC& aValue) const + { + TUint offset; + TUint length; + + // TODO: Panic if iTokenArray[iNextToken] != EPackedTokenAttribute. + + aAttribute = NextToken(); + offset = NextToken(); + length = NextToken(); + + if(iStringTable->Length() >= (length + offset)) + { + aValue.Set(iStringTable->Mid(offset, length)); + } + else + { + aValue.Set(KNullDesC); + } + + }