phonebookui/Phonebook2/USIMExtension/src/CPsu2OwnNumberListBoxModel.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/USIMExtension/src/CPsu2OwnNumberListBoxModel.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,405 @@
+/*
+* Copyright (c) 2002-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 own numbers list box model.
+*
+*/
+
+
+#include    "CPsu2OwnNumberListBoxModel.h"
+
+// From Virtual Phonebook
+#include    <MVPbkContactViewBase.h>
+#include    <MVPbkViewContact.h>
+#include    <MVPbkBaseContactFieldCollection.h>
+#include    <MVPbkBaseContactField.h>
+#include    <MVPbkContactFieldData.h>
+#include    <MVPbkFieldType.h>
+#include    <TVPbkFieldVersitProperty.h>
+#include    <MVPbkContactFieldTextData.h>
+#include    <MVPbkStoreContact.h>
+
+// System includes
+#include    <coecntrl.h>
+#include    <eikenv.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace 
+    {
+
+const TInt KOOBLimit = -1;
+const TInt KMaxListBoxBufferSize = 128;
+_LIT(KListBoxIconFormat, "%d\t");
+_LIT(KListBoxFieldSeparator, "\t");
+
+/**
+ * Checks from given array is there given field type name in it.
+ * @param aArray    Array of field types.
+ * @param aName     Field type name to look for.
+ * @return  ETrue if name is found, EFalse if it is not.
+ */
+TBool ContainsFieldType(
+        TArray<TVPbkFieldVersitProperty> aArray,
+        TVPbkFieldTypeName aName )
+    {
+    TBool ret = EFalse;
+    const TInt size = aArray.Count();
+    for (TInt i=0; i<size; ++i)
+        {
+        if (aArray[i].Name() == aName)
+            {
+            ret = ETrue;
+            break;
+            }
+        }
+    return ret;        
+    }
+
+/**
+ * Checks from given fields for given field type and prints
+ * it to given descriptor.
+ *
+ * @param aField    Field collection.
+ * @param aPtr      Descriptor.
+ * @param aType     Field type name.
+ */
+void AddDataFormatL( 
+        const MVPbkBaseContactFieldCollection& aFields, 
+        TPtr& aPtr, 
+        TVPbkFieldTypeName aType )
+    {
+    const TInt fieldCount( aFields.FieldCount() );
+    for( TInt i(0); i < fieldCount; ++i )
+        {
+        const MVPbkBaseContactField& field =  aFields.FieldAt( i );
+        const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
+        if ( field.FieldData().DataType() == EVPbkFieldStorageTypeText )
+            {
+            if (fieldType && 
+                ContainsFieldType(fieldType->VersitProperties(), aType))
+                {
+                const MVPbkContactFieldTextData* textData =
+                        &MVPbkContactFieldTextData::Cast( field.FieldData() );
+                aPtr.Append(textData->Text());
+                aPtr.Append(KListBoxFieldSeparator);
+                }
+            }
+        }       
+    }
+        
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_RefreshL = 1
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT( KPanicText, "CPsu2OwnNumberListBoxModel" );
+    User::Panic( KPanicText, aReason );
+    }
+#endif // _DEBUG
+
+} //// namespace
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::CPsu2OwnNumberListBoxModel
+// --------------------------------------------------------------------------
+//
+CPsu2OwnNumberListBoxModel::CPsu2OwnNumberListBoxModel
+    ( MVPbkContactViewBase& aView, CCoeControl& aObserver ):
+        CActive(EPriorityStandard),
+        iView( aView ),
+        iObserver( aObserver )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::~CPsu2OwnNumberListBoxModel
+// --------------------------------------------------------------------------
+//
+CPsu2OwnNumberListBoxModel::~CPsu2OwnNumberListBoxModel()
+    {
+    iView.RemoveObserver( *this );
+    Cancel();
+    if ( iArray )
+        {
+        iArray->Reset();        
+        }
+    delete iArray;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ConstructL
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::ConstructL()
+    {
+    CActiveScheduler::Add( this );
+    iArray = new ( ELeave ) CDesCArraySeg( 1 );
+    iView.AddObserverL( *this );
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::NewL
+// --------------------------------------------------------------------------
+//
+CPsu2OwnNumberListBoxModel* CPsu2OwnNumberListBoxModel::NewL
+        (  MVPbkContactViewBase& aView, CCoeControl& aObserver )
+    {
+    CPsu2OwnNumberListBoxModel* self = 
+        new( ELeave ) CPsu2OwnNumberListBoxModel( aView, aObserver );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::MdcaCount
+// --------------------------------------------------------------------------
+//
+TInt CPsu2OwnNumberListBoxModel::MdcaCount() const
+    {
+    TInt result( 0 );
+    TRAPD( error, result = iView.ContactCountL() );
+    if ( error != KErrNone )
+        {
+        CEikonEnv::Static()->NotifyIdleErrorWhileRedrawing( error );
+        }
+    return result;
+    }
+    
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::MdcaPoint
+// --------------------------------------------------------------------------
+//
+TPtrC16 CPsu2OwnNumberListBoxModel::MdcaPoint(TInt aIndex) const
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+            ("CPsu2OwnNumberListBoxModel(%x)::MdcaPoint() Index=%d "),
+                this, aIndex);
+    if ( aIndex > KOOBLimit && aIndex < iArray->Count())
+        {
+        return (*iArray)[aIndex];
+        }
+    return KNullDesC();
+    }
+    
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::AddToArrayL
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::AddToArrayL( MVPbkStoreContact* aContact )
+    {   
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPsu2OwnNumberListBoxModel(%x)::AddToArrayL() "), this);
+        
+    if ( aContact )
+        {
+        aContact->PushL();
+        HBufC* buffer = HBufC::NewLC(KMaxListBoxBufferSize);
+        TPtr ptr( buffer->Des() );
+                
+        ptr.Format(KListBoxIconFormat, 0 ); 
+        const MVPbkBaseContactFieldCollection& fields = aContact->Fields();
+        AddDataFormatL( fields, ptr, EVPbkVersitNameN );
+        AddDataFormatL( fields, ptr, EVPbkVersitNameTEL );
+        iArray->AppendL(ptr);
+        CleanupStack::PopAndDestroy( buffer );
+        CleanupStack::PopAndDestroy( aContact );
+        }    
+    }
+    
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ReadContactsL
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::ReadContactsL()
+    {
+    iCurrentContact = 0;
+    const MVPbkViewContact& contact = iView.ContactAtL(iCurrentContact);
+    contact.ReadL( *this );    
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::RefreshL
+// --------------------------------------------------------------------------
+//    
+void CPsu2OwnNumberListBoxModel::RefreshL()
+    {
+    __ASSERT_DEBUG( iArray, Panic(EPanicPreCond_RefreshL));
+    
+    // Reset array
+    iArray->Reset();
+
+    if ( iView.ContactCountL() > 0 )
+        {
+        ReadContactsL();
+        }
+    else
+        {
+        iObserver.DrawDeferred();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactOperationCompleted
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::ContactOperationCompleted
+        ( TContactOpResult aResult )
+    {
+    PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING
+        ("CPsu2OwnNumberListBoxModel(%x)::ContactOperationCompleted() "),
+            this);
+        
+    TRAPD( err, AddToArrayL( aResult.iStoreContact ) )
+    ++iCurrentContact;
+    if ( err != KErrNone )
+        {
+        CEikonEnv::Static()->HandleError( err );
+        }
+    else
+        {
+        IssueRequest();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactOperationFailed
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::ContactOperationFailed(
+        TContactOp /*aOpCode*/, 
+        TInt aErrorCode, 
+        TBool /*aErrorNotified*/)
+    {
+    CEikonEnv::Static()->HandleError( aErrorCode );
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::RunL
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::RunL()
+    {    
+    if ( iCurrentContact < iView.ContactCountL() )    
+        {
+        const MVPbkViewContact& contact = iView.ContactAtL(iCurrentContact);
+        contact.ReadL( *this );    
+        }
+    else
+        {        
+        iObserver.DrawDeferred();
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::DoCancel
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::DoCancel()
+    {
+    // Nothing to do
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::RunError
+// --------------------------------------------------------------------------
+//
+TInt CPsu2OwnNumberListBoxModel::RunError(TInt aError)
+    {
+    CCoeEnv::Static()->HandleError(aError);
+    return KErrNone;
+    }
+
+// --------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::IssueRequest
+// --------------------------------------------------------------------------
+//
+void CPsu2OwnNumberListBoxModel::IssueRequest()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete(status, KErrNone);
+    SetActive();
+    }
+    
+// -----------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactViewReady
+// -----------------------------------------------------------------------------
+//     
+void CPsu2OwnNumberListBoxModel::ContactViewReady(
+        MVPbkContactViewBase& aView )
+    {
+    if ( &iView == &aView )
+        {
+        TRAPD( error, RefreshL() );
+        if ( error != KErrNone )
+            {
+            CCoeEnv::Static()->HandleError( error );
+            }
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactViewUnavailable
+// -----------------------------------------------------------------------------
+//                     
+void CPsu2OwnNumberListBoxModel::ContactViewUnavailable(
+        MVPbkContactViewBase& /*aView*/ )
+    {
+    // Do nothing  
+    }
+
+// -----------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactAddedToView
+// -----------------------------------------------------------------------------
+//     
+void CPsu2OwnNumberListBoxModel::ContactAddedToView(
+        MVPbkContactViewBase& /*aView*/, 
+        TInt /*aIndex*/, 
+        const MVPbkContactLink& /*aContactLink*/ )
+    {
+    // Do nothing
+    }
+    
+// -----------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactRemovedFromView
+// -----------------------------------------------------------------------------
+//     
+void CPsu2OwnNumberListBoxModel::ContactRemovedFromView(
+        MVPbkContactViewBase& /*aView*/, 
+        TInt /*aIndex*/, 
+        const MVPbkContactLink& /*aContactLink*/ )
+    {
+    // Do nothing
+    }
+    
+// -----------------------------------------------------------------------------
+// CPsu2OwnNumberListBoxModel::ContactViewError
+// -----------------------------------------------------------------------------
+//     
+void CPsu2OwnNumberListBoxModel::ContactViewError(
+        MVPbkContactViewBase& /*aView*/, 
+        TInt /*aError*/, 
+        TBool /*aErrorNotified*/ )
+    {
+    // Do nothing
+    }
+
+// End of File