diff -r 000000000000 -r 094583676ce7 PECengine/CoreUtilsLib2/Src/CPEngDetailedResultEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/CoreUtilsLib2/Src/CPEngDetailedResultEntry.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,483 @@ +/* +* 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 "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: Detailed entry implementation. +* +*/ + +// INCLUDE FILES +#include +#include +#include "CPEngDetailedResultEntry.h" + +//DATA TYPES + +/** + * Stream content indication. + */ +enum TPEngStreamContent + { + EPEngNullField = -1, //Field isn't defined in stream (it is NULL) + EPEngHasField = 1 //Field is defined in stream + }; + + +// ============================ MEMBER FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngDetailedResultEntry* CPEngDetailedResultEntry::NewLC( TInt aOperationID, + TInt aDetErr, + const TUint32* aAttribID, + const TDesC* aPresID, + const TDesC* aContactListID, + const TDesC* aDescription ) + { + CPEngDetailedResultEntry* self = new ( ELeave ) CPEngDetailedResultEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aOperationID, + aDetErr, + aAttribID, + aPresID, + aContactListID, + aDescription ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngDetailedResultEntry* CPEngDetailedResultEntry::NewLC( RReadStream& aStream ) + { + CPEngDetailedResultEntry* self = new ( ELeave ) CPEngDetailedResultEntry(); + CleanupStack::PushL( self ); + self->InternalizeL( aStream ); + return self; + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::NewLC() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngDetailedResultEntry* CPEngDetailedResultEntry::NewLC( const CPEngDetailedResultEntry& aEntry ) + { + CPEngDetailedResultEntry* self = new ( ELeave ) CPEngDetailedResultEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aEntry ); + return self; + } + + +// Destructor +CPEngDetailedResultEntry::~CPEngDetailedResultEntry() + { + delete iAttribID; + delete iPresID; + delete iContactListID; + delete iDescription; + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::CPEngDetailedResultEntry +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngDetailedResultEntry::CPEngDetailedResultEntry() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::ConstructL( TInt aOperationID, + TInt aDetErr, + const TUint32* aAttribID, + const TDesC* aPresID, + const TDesC* aContactListID, + const TDesC* aDescription ) + { + iOperationID = aOperationID; + iDetErr = aDetErr; + + if ( aAttribID ) + { + iAttribID = new ( ELeave ) TUint32( *aAttribID ); + } + + if ( aPresID ) + { + iPresID = aPresID->AllocL(); + } + + if ( aContactListID ) + { + iContactListID = aContactListID->AllocL(); + } + + if ( aDescription ) + { + iDescription = aDescription->AllocL(); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::ConstructL( const CPEngDetailedResultEntry& aEntry ) + { + iOperationID = aEntry.iOperationID; + iDetErr = aEntry.iDetErr; + + if ( aEntry.iAttribID ) + { + iAttribID = new ( ELeave ) TUint32( *aEntry.iAttribID ); + } + + if ( aEntry.iPresID ) + { + iPresID = aEntry.iPresID->AllocL(); + } + + if ( aEntry.iContactListID ) + { + iContactListID = aEntry.iContactListID->AllocL(); + } + + if ( aEntry.iDescription ) + { + iDescription = aEntry.iDescription->AllocL(); + } + } + + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::Operation() +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::Operation() const + { + return iOperationID; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::Error() +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::Error() const + { + return iDetErr; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::GetDetailedDesc() +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::GetDetailedDesc( TPtrC& aDescriptionText, + TPEngDetailedResultDescriptionText2 aDescriptionID ) const + { + switch ( aDescriptionID ) + { + case EPEngDTPresenceID: + { + return DoReturnBuffer( iPresID, aDescriptionText ); + } + + case EPEngDTContactListID: + { + return DoReturnBuffer( iContactListID, aDescriptionText ); + } + + case EPEngDTErrorDescription: + { + return DoReturnBuffer( iDescription, aDescriptionText ); + } + } + + return DoReturnBuffer( NULL, aDescriptionText ); + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::GetDetailedInt() +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::GetDetailedInt( TUint32& aDescriptionInt, + TPEngDetailedResultDescriptionInteger2 aDescriptionID ) const + { + switch ( aDescriptionID ) + { + case EPEngDIAttributeID: + { + return DoReturnInteger( iAttribID, aDescriptionInt ); + } + } + + return DoReturnInteger( NULL, aDescriptionInt ); + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::EntryExtension() +// ----------------------------------------------------------------------------- +// +MPEngDetailedResultEntryExtension2* CPEngDetailedResultEntry::EntryExtension() + { + return NULL; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::InternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::InternalizeL( RReadStream& aStream ) + { + iOperationID = aStream.ReadInt32L(); + iDetErr = aStream.ReadInt32L(); + + DoInternalizeIntegerOrNullL( iAttribID, aStream ); + DoInternalizeBufferOrNullL( iPresID, aStream ); + DoInternalizeBufferOrNullL( iContactListID, aStream ); + DoInternalizeBufferOrNullL( iDescription, aStream ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::ExternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::ExternalizeL( RWriteStream& aStream ) const + { + aStream.WriteInt32L( iOperationID ); + aStream.WriteInt32L( iDetErr ); + + DoExternalizeIntegerOrNullL( iAttribID, aStream ); + DoExternalizeBufferOrNullL( iPresID, aStream ); + DoExternalizeBufferOrNullL( iContactListID, aStream ); + DoExternalizeBufferOrNullL( iDescription, aStream ); + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::ExternalizeSize() +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::ExternalizeSize() const + { + TInt size = 8; //operation 4 bytes + //error code 4 bytes + + size += DoIntegerExternalizeSizeInBytes( iAttribID ); + size += DoBufferExternalizeSizeInBytes( iPresID ); + size += DoBufferExternalizeSizeInBytes( iContactListID ); + size += DoBufferExternalizeSizeInBytes( iDescription ); + + return size; + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoReturnBuffer() +// Static helper. +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::DoReturnBuffer( const HBufC* const & aPtr, + TPtrC16& aBuffer ) + { + if ( aPtr ) + { + aBuffer.Set( *aPtr ); + return KErrNone; + } + + aBuffer.Set( NULL, 0 ); + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoReturnInteger() +// Static helper. +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::DoReturnInteger( const TUint32* aPtr, + TUint32& aInteger ) + { + if ( aPtr ) + { + aInteger = *aPtr; + return KErrNone; + } + + aInteger = 0; + return KErrNotFound; + } + + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoExternalizeBufferOrNullL() +// Static helper. +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::DoExternalizeBufferOrNullL( const HBufC* aBuffer, + RWriteStream& aStream ) + { + if ( aBuffer ) + { + aStream.WriteInt8L( EPEngHasField ); + aStream << TCardinality( aBuffer->Length() ); //pack the length bits + aStream.WriteL( *aBuffer ); + } + else + { + aStream.WriteInt8L( EPEngNullField ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoExternalizeIntegerOrNullL() +// Static helper. +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::DoExternalizeIntegerOrNullL( TUint32* aInteger, + RWriteStream& aStream ) + { + if ( aInteger ) + { + aStream.WriteInt8L( EPEngHasField ); + aStream.WriteUint32L( *aInteger ); + } + else + { + aStream.WriteInt8L( EPEngNullField ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoInternalizeBufferOrNullL() +// Static helper. +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::DoInternalizeBufferOrNullL( HBufC*& aBuffer, + RReadStream& aStream ) + { + HBufC* buffer = NULL; + + TPEngStreamContent content = static_cast< TPEngStreamContent >( aStream.ReadInt8L() ); + + if ( content == EPEngHasField ) + { + TCardinality c; + aStream >> c; //read the length bits + TInt length = c; + + buffer = HBufC::NewLC( length ); + TPtr ptr( buffer->Des() ); + aStream.ReadL( ptr, length ); + CleanupStack::Pop(); //buffer + } + + delete aBuffer; + aBuffer = buffer; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoInternalizeIntegerOrNullL() +// Static helper. +// ----------------------------------------------------------------------------- +// +void CPEngDetailedResultEntry::DoInternalizeIntegerOrNullL( TUint32*& aInteger, + RReadStream& aStream ) + { + TUint32* integer = NULL; + + TPEngStreamContent content = static_cast< TPEngStreamContent >( aStream.ReadInt8L() ); + + if ( content == EPEngHasField ) + { + TUint32 value = aStream.ReadUint32L(); + integer = new ( ELeave ) TUint32( value ); + } + + delete aInteger; + aInteger = integer; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoBufferExternalizeSizeInBytes() +// Static helper. +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::DoBufferExternalizeSizeInBytes( const HBufC* aBuffer ) + { + TInt size = 1; // 1 byte for content mark + + if ( aBuffer ) + { + size = size + aBuffer->Size() + 4; // max four bytes for buffer length + } + + return size; + } + + +// ----------------------------------------------------------------------------- +// CPEngDetailedResultEntry::DoIntegerExternalizeSizeInBytes() +// Static helper. +// ----------------------------------------------------------------------------- +// +TInt CPEngDetailedResultEntry::DoIntegerExternalizeSizeInBytes( TUint32* aInteger ) + { + TInt size = 1; // 1 byte for content mark + + if ( aInteger ) + { + size = size + 4; // four bytes for integer + } + + return size; + } + + + +// End of File + +