--- /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