phonebookui/Phonebook2/CommonUI/src/CPbk2ViewState.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommonUI/src/CPbk2ViewState.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,702 @@
+/*
+* Copyright (c) 2005-2007 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:  Phonebook 2 view state.
+*
+*/
+
+
+// INCLUDE FILES
+#include <CPbk2ViewState.h>
+
+// Phonebook 2
+#include <Pbk2UID.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+
+// Virtual Phonebook
+#include <MVPbkContactLink.h>
+#include <CVPbkContactManager.h>
+
+// System includes
+#include <s32mem.h>
+
+
+const TUid CPbk2ViewState::KUid = { KPbk2ViewStateUid };
+
+/// Unnamed namespace for local definitions
+namespace {
+
+const TUint8 KPbk2ViewStateVersionNumber = 1;
+
+/**
+ * Stream buffer which counts number of bytes written to it.
+ */
+class TCalcLengthStreamBuf : public MStreamBuf
+    {
+    public: // Construction
+
+        /**
+         * Constructor.
+         */
+        inline TCalcLengthStreamBuf() :
+                iBytesWritten( 0 )
+            {
+            }
+
+        /**
+         * Returns the number of bytes written.
+         *
+         * @return  Number of bytes written.
+         */
+        inline TInt BytesWritten() const
+            {
+            return iBytesWritten;
+            }
+
+    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;
+    };
+
+enum TPanicCode
+    {
+    EPanicInvalidVersion = 1,
+    EPanicInvalidDataType,
+    EPanicInvalidMarkedContactCount
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbk2ViewState");
+    User::Panic(KPanicText, aReason);
+    }
+
+} /// namespace
+
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::CPbk2ViewState
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState::CPbk2ViewState() :
+        iFocusedFieldIndex( KErrNotFound ),
+        iTopFieldIndex( KErrNotFound ),
+        iFocusedPropertiesIndex( KErrNotFound ),
+        iTopPropertiesIndex( KErrNotFound )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::~CPbk2ViewState
+// --------------------------------------------------------------------------
+//
+CPbk2ViewState::~CPbk2ViewState()
+    {
+    delete iFocusedContact;
+    delete iTopContact;
+    delete iParentContact;
+    delete iArray;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ViewState* CPbk2ViewState::NewL()
+    {
+    CPbk2ViewState* self = new ( ELeave ) CPbk2ViewState;
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ViewState* CPbk2ViewState::NewLC()
+    {
+    CPbk2ViewState* self = new ( ELeave ) CPbk2ViewState;
+    CleanupStack::PushL( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ViewState* CPbk2ViewState::NewL( const TDesC8& aBuf )
+    {
+    CPbk2ViewState* self = CPbk2ViewState::NewLC( aBuf );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::NewLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C CPbk2ViewState* CPbk2ViewState::NewLC( const TDesC8& aBuf )
+    {
+    CPbk2ViewState* self = new ( ELeave ) CPbk2ViewState;
+    CleanupStack::PushL( self );
+    self->ConstructL( aBuf );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::ConstructL
+// --------------------------------------------------------------------------
+//
+inline void CPbk2ViewState::ConstructL( const TDesC8& aBuf )
+    {
+    UnpackL( aBuf );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::Uid
+// --------------------------------------------------------------------------
+//
+EXPORT_C TUid CPbk2ViewState::Uid()
+    {
+    return KUid;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::FocusedContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C const MVPbkContactLink* CPbk2ViewState::FocusedContact() const
+    {
+    return iFocusedContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TakeFocusedContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactLink* CPbk2ViewState::TakeFocusedContact()
+    {
+    MVPbkContactLink* result = iFocusedContact;
+    iFocusedContact = NULL;
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TopContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C const MVPbkContactLink* CPbk2ViewState::TopContact() const
+    {
+    return iTopContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TakeTopContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactLink* CPbk2ViewState::TakeTopContact()
+    {
+    MVPbkContactLink* result = iTopContact;
+    iTopContact = NULL;
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::ParentContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C const MVPbkContactLink* CPbk2ViewState::ParentContact() const
+    {
+    return iParentContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TakeParentContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactLink* CPbk2ViewState::TakeParentContact()
+    {
+    MVPbkContactLink* result = iParentContact;
+    iParentContact = NULL;
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::MarkedContacts
+// --------------------------------------------------------------------------
+//
+EXPORT_C const MVPbkContactLinkArray* CPbk2ViewState::MarkedContacts() const
+    {
+    return iArray;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TakeMarkedContacts
+// --------------------------------------------------------------------------
+//
+EXPORT_C MVPbkContactLinkArray* CPbk2ViewState::TakeMarkedContacts()
+    {
+    MVPbkContactLinkArray* result = iArray;
+    iArray = NULL;
+    return result;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::FocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CPbk2ViewState::FocusedFieldIndex() const
+    {
+    return iFocusedFieldIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TopFieldIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CPbk2ViewState::TopFieldIndex() const
+    {
+    return iTopFieldIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::FocusedPropertiesIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CPbk2ViewState::FocusedPropertiesIndex() const
+    {
+    return iFocusedPropertiesIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::TopPropertiesIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CPbk2ViewState::TopPropertiesIndex() const
+    {
+    return iTopPropertiesIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::Flags
+// --------------------------------------------------------------------------
+//
+EXPORT_C TUint CPbk2ViewState::Flags() const
+    {
+    return iFlags;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetFocusedContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetFocusedContact
+        ( MVPbkContactLink* aContact )
+    {
+    delete iFocusedContact;
+    iFocusedContact = aContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetTopContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetTopContact( MVPbkContactLink* aTopContact )
+    {
+    delete iTopContact;
+    iTopContact = aTopContact;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetParentContact
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetParentContact
+        ( MVPbkContactLink* aParentContact )
+    {
+    delete iParentContact;
+    iParentContact = aParentContact;
+    }
+
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetMarkedContacts
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetMarkedContacts
+        ( MVPbkContactLinkArray* aArray )
+    {
+    delete iArray;
+    iArray = aArray;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetFocusedFieldIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetFocusedFieldIndex( TInt aIndex )
+    {
+    iFocusedFieldIndex = aIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetTopFieldIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetTopFieldIndex( TInt aIndex )
+    {
+    iTopFieldIndex = aIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetFocusedPropertiesIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetFocusedPropertiesIndex( TInt aIndex )
+    {
+    iFocusedPropertiesIndex = aIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetTopPropertiesIndex
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetTopPropertiesIndex( TInt aIndex )
+    {
+    iTopPropertiesIndex = aIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::Reset
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::Reset()
+    {
+    iFocusedFieldIndex = KErrNotFound;
+    iTopFieldIndex = KErrNotFound;
+    iFocusedPropertiesIndex = KErrNotFound;
+    iTopPropertiesIndex = KErrNotFound;
+    delete iFocusedContact;
+    iFocusedContact = NULL;
+    delete iTopContact;
+    iTopContact = NULL;
+    delete iArray;
+    iArray = NULL;
+    iFlags = 0;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::SetFlags
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::SetFlags( TUint aFlags )
+    {
+    iFlags = aFlags;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::PackL
+// --------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CPbk2ViewState::PackL() const
+    {
+    HBufC8* buf = PackLC();
+    CleanupStack::Pop(); // buf
+    return buf;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::PackLC
+// --------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CPbk2ViewState::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;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::UnpackL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CPbk2ViewState::UnpackL( const TDesC8& aPack )
+    {
+    RDesReadStream stream( aPack );
+    stream.PushL();
+    InternalizeL( stream );
+    CleanupStack::PopAndDestroy(); // stream
+    }
+
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::operator==
+// --------------------------------------------------------------------------
+//
+EXPORT_C TBool CPbk2ViewState::operator==( const CPbk2ViewState& aRhs ) const
+    {
+    return iFocusedFieldIndex == aRhs.iFocusedFieldIndex &&
+           iTopFieldIndex == aRhs.iTopFieldIndex &&
+           iFocusedPropertiesIndex == aRhs.iFocusedPropertiesIndex &&
+           iTopPropertiesIndex == aRhs.iTopPropertiesIndex;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::ExternalizeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewState::ExternalizeL( RWriteStream& aStream ) const
+    {
+    aStream.WriteUint8L( KPbk2ViewStateVersionNumber );
+
+    if (iFocusedContact)
+        {
+        aStream.WriteInt8L(EFocusedContact);
+        HBufC8* buf = iFocusedContact->PackLC();
+        aStream.WriteUint16L(buf->Length());
+        aStream.WriteL(*buf);
+        CleanupStack::PopAndDestroy(); // buf
+        }
+
+    if (iTopContact)
+        {
+        aStream.WriteInt8L(ETopContact);
+        HBufC8* buf = iTopContact->PackLC();
+        aStream.WriteUint16L(buf->Length());
+        aStream.WriteL(*buf);
+        CleanupStack::PopAndDestroy(); // buf
+        }
+
+    if (iParentContact)
+        {
+        aStream.WriteInt8L(EParentContact);
+        HBufC8* buf = iParentContact->PackLC();
+        aStream.WriteUint16L(buf->Length());
+        aStream.WriteL(*buf);
+        CleanupStack::PopAndDestroy(); // buf
+        }
+
+    if (iArray)
+        {
+        aStream.WriteInt8L(EMarkedContacts);
+        HBufC8* buf = iArray->PackLC();
+        aStream.WriteUint16L(buf->Length());
+        aStream.WriteL(*buf);
+        CleanupStack::PopAndDestroy(); // buf
+        }
+
+    if (iFocusedFieldIndex >= 0)
+        {
+        aStream.WriteInt8L(EFocusedFieldIndex);
+        aStream.WriteInt32L(iFocusedFieldIndex);
+        }
+
+    if (iTopFieldIndex >= 0)
+        {
+        aStream.WriteInt8L(ETopFieldIndex);
+        aStream.WriteInt32L(iTopFieldIndex);
+        }
+
+    if (iFocusedPropertiesIndex >= 0)
+        {
+        aStream.WriteInt8L(EFocusedPropertiesIndex);
+        aStream.WriteInt32L(iFocusedPropertiesIndex);
+        }
+
+    if (iTopPropertiesIndex >= 0)
+        {
+        aStream.WriteInt8L(ETopPropertiesIndex);
+        aStream.WriteInt32L(iTopPropertiesIndex);
+        }
+
+    if (iFlags != ENullFlags)
+        {
+        aStream.WriteInt8L(EFlags);
+        aStream.WriteUint32L(iFlags);
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2ViewState::InternalizeL
+// --------------------------------------------------------------------------
+//
+void CPbk2ViewState::InternalizeL( RReadStream& aStream )
+    {
+    Reset();
+
+    const TUint versionNumber = aStream.ReadUint8L();
+    __ASSERT_ALWAYS(versionNumber == KPbk2ViewStateVersionNumber,
+                    Panic(EPanicInvalidVersion));
+
+    CVPbkContactManager* contactManager =
+        &Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager();
+
+    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 EFocusedContact:
+                {
+                TInt length = aStream.ReadUint16L();
+                HBufC8* buf = HBufC8::NewLC(length);
+                TPtr8 bufPtr = buf->Des();
+                aStream.ReadL(bufPtr, length);
+                MVPbkContactLinkArray* links =
+                    contactManager->CreateLinksLC( *buf );
+                if ( links && links->Count() > 0 )
+                    {
+                    iFocusedContact = links->At(0).CloneLC();
+                    CleanupStack::Pop();
+                    }
+                CleanupStack::PopAndDestroy(2); // links, buf
+                break;
+                }
+
+            case ETopContact:
+                {
+                TInt length = aStream.ReadUint16L();
+                HBufC8* buf = HBufC8::NewLC(length);
+                TPtr8 bufPtr = buf->Des();
+                aStream.ReadL(bufPtr, length);
+                MVPbkContactLinkArray* links =
+                    contactManager->CreateLinksLC( *buf );
+                if ( links && links->Count() > 0 )
+                    {
+                    iTopContact = links->At(0).CloneLC();
+                    CleanupStack::Pop();
+                    }
+                CleanupStack::PopAndDestroy(2); // links, buf
+                break;
+                }
+
+            case EParentContact:
+                {
+                TInt length = aStream.ReadUint16L();
+                HBufC8* buf = HBufC8::NewLC(length);
+                TPtr8 bufPtr = buf->Des();
+                aStream.ReadL(bufPtr, length);
+                MVPbkContactLinkArray* links =
+                    contactManager->CreateLinksLC( *buf );
+                if ( links && links->Count() > 0 )
+                    {
+                    iParentContact = links->At(0).CloneLC();
+                    CleanupStack::Pop();
+                    }
+                CleanupStack::PopAndDestroy(2); // links, buf
+                break;
+                }
+
+            case EMarkedContacts:
+                {
+                TInt length = aStream.ReadUint16L();
+                HBufC8* buf = HBufC8::NewLC(length);
+                TPtr8 bufPtr = buf->Des();
+                aStream.ReadL(bufPtr, length);
+                iArray = contactManager->CreateLinksLC( *buf );
+                CleanupStack::Pop();
+                CleanupStack::PopAndDestroy(); // buf
+                break;
+                }
+
+            case EFocusedFieldIndex:
+                {
+                iFocusedFieldIndex = aStream.ReadInt32L();
+                break;
+                }
+
+            case ETopFieldIndex:
+                {
+                iTopFieldIndex = aStream.ReadInt32L();
+                break;
+                }
+            
+            case EFocusedPropertiesIndex:
+                {
+                iFocusedPropertiesIndex = aStream.ReadInt32L();
+                break;
+                }
+
+            case ETopPropertiesIndex:
+                {
+                iTopPropertiesIndex = aStream.ReadInt32L();
+                break;
+                }
+
+            case EFlags:
+                {
+                iFlags = aStream.ReadUint32L();
+                break;
+                }
+
+            case EEnd:
+                {
+                eof = ETrue;
+                break;
+                }
+
+            default:
+                {
+                Panic(EPanicInvalidDataType);
+                break;
+                }
+            }
+        }
+    }
+
+//  End of File