phonebookui/Phonebook/View/src/CPbkViewState.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkViewState.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,520 @@
+/*
+* Copyright (c) 2002 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: 
+*       Provides methods for Generic Phonebook view state.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkViewState.h"
+#include <s32mem.h>
+#include "PbkUID.h"
+#include <CPbkFieldData.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+enum TPanicCode
+    { 
+    EPanicInvalidDataType = 1,
+    EPanicInvalidMarkedContactCount
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkViewState");
+    User::Panic(KPanicText, aReason);
+    }
+} // namespace
+
+// CONSTANTS
+const TUid CPbkViewState::KUid = { KPbkViewStateUid };
+
+
+// MODULE DATA STRUCTURES
+
+/**
+ * Stream buffer which counts number of bytes written to it.
+ */
+NONSHARABLE_CLASS(TCalcLengthStreamBuf) : 
+        public MStreamBuf
+    {
+    public:  // Interface
+		/**
+		 * Constructor.
+		 */
+        inline TCalcLengthStreamBuf()
+            : iBytesWritten(0)
+            {
+            }
+
+		/**
+		 * Returns the number bytes written.
+		 */
+        inline TInt BytesWritten() const
+            {
+            return iBytesWritten;
+            }
+
+		/**
+		 * Resets the bytes written count.
+		 */
+        inline void Reset()
+            {
+            iBytesWritten = 0;
+            }
+
+    private:  // from MStreamBuf
+	    void DoWriteL(const TAny* /*aPtr*/,TInt aLength)
+            {
+            // Just count the bytes
+            iBytesWritten += aLength;
+            }
+
+    private:  // Data
+        /// Ref: count of bytes written to this streambuf
+        TInt iBytesWritten;
+    };
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+EXPORT_C CPbkViewState* CPbkViewState::NewL()
+    {
+    CPbkViewState* self = new(ELeave) CPbkViewState;
+    return self;
+    }
+
+EXPORT_C CPbkViewState* CPbkViewState::NewLC()
+    {
+    CPbkViewState* self = new(ELeave) CPbkViewState;
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+EXPORT_C CPbkViewState* CPbkViewState::NewL(RReadStream& aStream)
+    {
+    CPbkViewState* self = CPbkViewState::NewLC(aStream);
+    CleanupStack::Pop();  // self
+    return self;
+    }
+
+EXPORT_C CPbkViewState* CPbkViewState::NewLC(RReadStream& aStream)
+    {
+    CPbkViewState* self = new(ELeave) CPbkViewState;
+    CleanupStack::PushL(self);
+    self->InternalizeL(aStream);
+    return self;
+    }
+
+EXPORT_C CPbkViewState* CPbkViewState::NewL(const TDesC8& aBuf)
+    {
+    CPbkViewState* self = CPbkViewState::NewLC(aBuf);
+    CleanupStack::Pop();  // self
+    return self;
+    }
+
+EXPORT_C CPbkViewState* CPbkViewState::NewLC(const TDesC8& aBuf)
+    {
+    CPbkViewState* self = new(ELeave) CPbkViewState;
+    CleanupStack::PushL(self);
+    self->UnpackL(aBuf);
+    return self;
+    }
+
+CPbkViewState::~CPbkViewState()
+    {
+    delete iMarkedContactIds;
+    if (iFieldDataArray)
+        {
+        iFieldDataArray->ResetAndDestroy();
+        delete iFieldDataArray;
+        }
+    }
+
+EXPORT_C TUid CPbkViewState::Uid()
+    {
+    return KUid;
+    }
+
+EXPORT_C TContactItemId CPbkViewState::FocusedContactId() const 
+    { 
+    return iFocusedContactId; 
+    }
+
+EXPORT_C TContactItemId CPbkViewState::TopContactId() const 
+    { 
+    return iTopContactId; 
+    }
+
+EXPORT_C const CContactIdArray* CPbkViewState::MarkedContactIds() const 
+    { 
+    return iMarkedContactIds; 
+    }
+
+EXPORT_C CContactIdArray* CPbkViewState::MarkedContactIds() 
+    { 
+    return iMarkedContactIds; 
+    }
+
+EXPORT_C TInt CPbkViewState::FocusedFieldIndex() const 
+    { 
+    return iFocusedFieldIndex; 
+    }
+
+EXPORT_C TInt CPbkViewState::TopFieldIndex() const 
+    { 
+    return iTopFieldIndex; 
+    }
+
+EXPORT_C CPbkFieldDataArray* CPbkViewState::FieldDataArray() const 
+    { 
+    return iFieldDataArray; 
+    }
+
+EXPORT_C TContactItemId CPbkViewState::ParentContactId() const
+    {
+    return iParentContactId;
+    }
+
+EXPORT_C TUint CPbkViewState::Flags() const
+    {
+    return iFlags;
+    }
+
+EXPORT_C void CPbkViewState::SetFocusedContactId(TContactItemId aId) 
+    { 
+    iFocusedContactId=aId; 
+    }
+
+EXPORT_C void CPbkViewState::SetTopContactId(TContactItemId aId) 
+    { 
+    iTopContactId=aId; 
+    }
+
+EXPORT_C void CPbkViewState::SetMarkedContactIds(CContactIdArray* aArray)
+    {
+    delete iMarkedContactIds;
+    iMarkedContactIds = aArray;
+    }
+
+EXPORT_C void CPbkViewState::SetFocusedFieldIndex(TInt aIndex) 
+    { 
+    iFocusedFieldIndex=aIndex; 
+    }
+
+EXPORT_C void CPbkViewState::SetTopFieldIndex(TInt aIndex) 
+    { 
+    iTopFieldIndex=aIndex; 
+    }
+
+EXPORT_C void CPbkViewState::SetFieldDataArray
+        (CPbkFieldDataArray* aFieldDataArray)
+    {
+    if (iFieldDataArray)
+        {
+        iFieldDataArray->ResetAndDestroy();
+        delete iFieldDataArray;
+        }
+    iFieldDataArray = aFieldDataArray;
+    }
+
+EXPORT_C void CPbkViewState::Reset()
+    {
+    iFocusedContactId = KNullContactId;
+    iTopContactId = KNullContactId;
+    iFocusedFieldIndex = -1;
+    iTopFieldIndex = -1;
+    delete iMarkedContactIds;
+    iMarkedContactIds = NULL;
+    if (iFieldDataArray)
+        {
+        iFieldDataArray->ResetAndDestroy();
+        delete iFieldDataArray;
+        iFieldDataArray = NULL;
+        }
+    iParentContactId = KNullContactId;
+    }
+
+EXPORT_C void CPbkViewState::SetParentContactId
+        (TContactItemId aParentContactId)
+    {
+    iParentContactId = aParentContactId;
+    }
+
+EXPORT_C void CPbkViewState::SetFlags
+        (TUint aFlags)
+    {
+    iFlags = aFlags;
+    }
+
+/*EXPORT_C*/ void CPbkViewState::MergeViewState(CPbkViewState& aOtherState)
+    {
+    if (aOtherState.iFocusedContactId != KNullContactId)
+        {
+        iFocusedContactId = aOtherState.iFocusedContactId;
+        }
+    if (aOtherState.iTopContactId != KNullContactId)
+        {
+        iTopContactId = aOtherState.iTopContactId;
+        }
+    if (aOtherState.iFocusedFieldIndex >= 0)
+        {
+        iFocusedFieldIndex = aOtherState.iFocusedFieldIndex;
+        }
+    if (aOtherState.iTopFieldIndex >= 0)
+        {
+        iTopFieldIndex = aOtherState.iTopFieldIndex;
+        }
+    if (aOtherState.iMarkedContactIds && aOtherState.iMarkedContactIds->Count() > 0)
+        {
+        delete iMarkedContactIds;
+        iMarkedContactIds = aOtherState.iMarkedContactIds;
+        aOtherState.iMarkedContactIds = NULL;
+        }
+    if (aOtherState.iFieldDataArray && aOtherState.iFieldDataArray->Count() > 0)
+        {
+        delete iFieldDataArray;
+        iFieldDataArray = aOtherState.iFieldDataArray;
+        aOtherState.iFieldDataArray = NULL;
+        }
+    if (aOtherState.iParentContactId != KNullContactId)
+        {
+        iParentContactId = aOtherState.iParentContactId;
+        }
+    }
+
+EXPORT_C HBufC8* CPbkViewState::PackL() const
+    {
+    HBufC8* buf = PackLC();
+    CleanupStack::Pop();  // buf
+    return buf;
+    }
+
+EXPORT_C HBufC8* CPbkViewState::PackLC() const
+    {
+    // Calculate needed buffer size using TCalcLengthStreamBuf
+    TCalcLengthStreamBuf countBuf;
+        {
+        RWriteStream countStream(&countBuf);
+        // this can't leave because we are using TCalcLengthStreamBuf
+        ExternalizeL(countStream); 
+        }
+
+    // Allocate a buffer and a stream
+    HBufC8* buf = HBufC8::NewLC(countBuf.BytesWritten());
+    TPtr8 bufPtr = buf->Des();
+    RDesWriteStream stream(bufPtr);
+    stream.PushL();
+
+    // Write this object to buf through stream
+    ExternalizeL(stream);
+
+    stream.CommitL();
+    CleanupStack::PopAndDestroy();  // stream
+    return buf;
+    }
+
+EXPORT_C void CPbkViewState::UnpackL(const TDesC8& aPack)
+    {
+    RDesReadStream stream(aPack);
+    stream.PushL();
+    InternalizeL(stream);
+    CleanupStack::PopAndDestroy();  // stream
+    }
+
+EXPORT_C void CPbkViewState::ExternalizeL(RWriteStream& aStream) const
+    {
+    if (iFocusedContactId != KNullContactId)
+        {
+        aStream.WriteInt8L(EFocusedContactId);
+        aStream.WriteInt32L(iFocusedContactId);
+        }
+
+    if (iTopContactId != KNullContactId)
+        {
+        aStream.WriteInt8L(ETopContactId);
+        aStream.WriteInt32L(iTopContactId);
+        }
+
+    const TInt count = iMarkedContactIds ? iMarkedContactIds->Count() : 0;
+    if (count > 0)
+        {
+        aStream.WriteInt8L(EMarkedContactIds);
+        aStream.WriteInt32L(count);
+        for (TInt i=0; i < count; ++i)
+            {
+            aStream.WriteInt32L((*iMarkedContactIds)[i]);
+            }
+        }
+
+    if (iFocusedFieldIndex >= 0)
+        {
+        aStream.WriteInt8L(EFocusedFieldIndex);
+        aStream.WriteInt32L(iFocusedFieldIndex);
+        }
+
+    if (iTopFieldIndex >= 0)
+        {
+        aStream.WriteInt8L(ETopFieldIndex);
+        aStream.WriteInt32L(iTopFieldIndex);
+        }
+
+    if (iFieldDataArray && iFieldDataArray->Count() > 0)
+        {
+        aStream.WriteInt8L(EFieldDataArray);
+        iFieldDataArray->ExternalizeL(aStream);
+        }
+
+    if (iParentContactId != KNullContactId)
+        {
+        aStream.WriteInt8L(EParentContactId);
+        aStream.WriteInt32L(iParentContactId);
+        }
+
+    if (iFlags != ENullFlags)
+        {
+        aStream.WriteInt8L(EFlags);
+        aStream.WriteUint32L(iFlags);
+        }
+
+    aStream.WriteInt8L(EEnd);
+    }
+
+EXPORT_C void CPbkViewState::InternalizeL(RReadStream& aStream)
+    {
+    Reset();
+
+    TBool eof = EFalse;
+    while (!eof)
+        {
+        TInt type = EEnd;
+        TRAPD(err, type = aStream.ReadInt8L());
+        switch (err)
+            {
+            case KErrEof:
+				{
+                // End of stream, exit loop like EEnd opcode was read.
+                type = EEnd;
+                break;
+				}
+            case KErrNone:
+				{
+                break;
+				}
+            default:
+				{
+                // Some other error than EOF occured.
+                User::Leave(err);
+                break;
+				}
+            }
+
+        switch (type)
+            {
+            case EFocusedContactId:
+				{
+                iFocusedContactId = aStream.ReadInt32L();
+                break;
+				}
+
+            case ETopContactId:
+				{
+                iTopContactId = aStream.ReadInt32L();
+                break;
+				}
+
+            case EMarkedContactIds:
+                {
+                TInt count = aStream.ReadInt32L();
+                __ASSERT_ALWAYS(count > 0, Panic(EPanicInvalidMarkedContactCount));
+                iMarkedContactIds = CContactIdArray::NewL();
+                while (count-- > 0)
+                    {
+                    iMarkedContactIds->AddL(aStream.ReadInt32L());
+                    }
+                break;
+                }
+
+            case EFocusedFieldIndex:
+				{
+                iFocusedFieldIndex = aStream.ReadInt32L();
+                break;
+				}
+
+            case ETopFieldIndex:
+				{
+                iTopFieldIndex = aStream.ReadInt32L();
+                break;
+				}
+
+            case EFieldDataArray:
+				{
+                iFieldDataArray = CPbkFieldDataArray::NewL(aStream);
+                break;
+				}
+            case EParentContactId:
+                {
+                iParentContactId = aStream.ReadInt32L();
+                break;
+                }
+
+            case EFlags:
+                {
+                iFlags = aStream.ReadUint32L();
+                break;
+                }
+
+            case EEnd:
+				{
+                eof = ETrue;
+                break;
+				}
+
+            default:
+				{
+                Panic(EPanicInvalidDataType);
+                break;
+				}
+            }
+        }
+    }
+
+EXPORT_C TBool CPbkViewState::operator==(const CPbkViewState& aRhs) const
+    {
+    return iFocusedContactId == aRhs.iFocusedContactId &&
+            iTopContactId == aRhs.iTopContactId &&
+            iFocusedFieldIndex == aRhs.iFocusedFieldIndex &&
+            iTopFieldIndex == aRhs.iTopFieldIndex &&
+            iParentContactId == aRhs.iParentContactId; 
+    }
+
+/**
+ * C++ default constructor.
+ */
+CPbkViewState::CPbkViewState() :
+    iFocusedContactId(KNullContactId),
+    iTopContactId(KNullContactId),
+    iFocusedFieldIndex(-1),
+    iTopFieldIndex(-1),
+    iMarkedContactIds(NULL),
+    iFieldDataArray(NULL),
+    iParentContactId(KNullContactId)
+    {
+    }
+
+
+//  End of File