diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/CommonUI/src/CPbk2ViewState.cpp --- /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 + +// Phonebook 2 +#include +#include +#include + +// Virtual Phonebook +#include +#include + +// System includes +#include + + +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