PECengine/CoreUtilsLib2/Src/CPEngDetailedResultEntry.cpp
changeset 0 094583676ce7
--- /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 <E32Base.h>
+#include <S32Strm.h>
+#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
+
+