phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSingleReadCmd.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CSingleReadCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,319 @@
+/*
+* 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:  A class that reads one contact at a time using ETel
+*                RMobilePhoneStore Read
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CSingleReadCmd.h"
+
+#include "CStoreBase.h"
+#include "CVPbkSimContact.h"
+#include "CVPbkSimCntField.h"
+#include "CContactArray.h"
+#include "VPbkSimStoreImplError.h"
+
+// From VPbkEng
+#include "VPbkDebug.h"
+
+namespace VPbkSimStoreImpl {
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::CSingleReadBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+CSingleReadBase<ETelContact>::CSingleReadBase( 
+    CStoreBase& aStore, TInt aIndexToRead )
+    :   CActive( EPriorityStandard ),
+        iStore( aStore ),
+        iETelContactPckg( iETelContact ),
+        iCurrentIndex( aIndexToRead ),
+        iLastIndexToRead( aIndexToRead ),
+        iSimIndexRef( KVPbkSimStoreInvalidETelIndex )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::CSingleReadBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+CSingleReadBase<ETelContact>::CSingleReadBase( CStoreBase& aStore )
+    :   CActive( EPriorityStandard ),
+        iStore( aStore ),
+        iETelContactPckg( iETelContact ),
+        iCurrentIndex( KVPbkSimStoreFirstETelIndex ),
+        iLastIndexToRead( KVPbkSimStoreInvalidETelIndex ),
+        iSimIndexRef( KVPbkSimStoreInvalidETelIndex )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::CSingleReadBase
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+CSingleReadBase<ETelContact>::CSingleReadBase( 
+        TInt& aIndexToReadRef, CStoreBase& aStore )
+    :   CActive( EPriorityStandard ),
+        iStore( aStore ),
+        iETelContactPckg( iETelContact ),
+        iCurrentIndex( KVPbkSimStoreInvalidETelIndex ),
+        iLastIndexToRead( KVPbkSimStoreInvalidETelIndex ),
+        iSimIndexRef( aIndexToReadRef )
+    {
+    CActiveScheduler::Add( this );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSingleReadBase::Execute
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+void CSingleReadBase<ETelContact>::Execute()
+    {
+    __ASSERT_DEBUG( iObserver,
+        VPbkSimStoreImpl::Panic( EPreCondCSingleReadBaseExecute ) );
+        
+    if ( iSimIndexRef != KVPbkSimStoreInvalidETelIndex )
+        {
+        iCurrentIndex = iSimIndexRef;
+        iLastIndexToRead = iSimIndexRef;
+        }
+    else if ( iLastIndexToRead == KVPbkSimStoreInvalidETelIndex )
+        {
+        iLastIndexToRead = iStore.ETelStoreInfo().iTotalEntries;
+        }
+
+    // If noting to read then make a dummy request to complete command
+    // asynchronously
+    if ( !ReadNext() )
+        {
+        TRequestStatus* status = &iStatus;
+        User::RequestComplete( status, KErrNone );
+        SetActive();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::AddObserverL
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+void CSingleReadBase<ETelContact>::AddObserverL( 
+        MVPbkSimCommandObserver& aObserver )
+    {
+    __ASSERT_DEBUG( !iObserver,
+        VPbkSimStoreImpl::Panic( EPreCondCSingleReadBaseAddObserverL ) );
+    iObserver = &aObserver;
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::CancelCmd
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+void CSingleReadBase<ETelContact>::CancelCmd()
+    {
+    CActive::Cancel();
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::RunL
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+void CSingleReadBase<ETelContact>::RunL()
+    {
+    TInt result = iStatus.Int();
+
+    VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+        "VPbkSimStoreImpl: RMobilePhoneStore::Read h%d complete %d, index %d"),
+        iStore.ETelStoreBase().SubSessionHandle(),result, 
+        iETelContact.iIndex);
+        
+    HandleRunL();
+    TBool readNext = ETrue;
+    switch ( result )
+        {
+        case KErrNone: // FALLTHROUGH
+        case KErrNotFound:
+            {
+            readNext = ReadNext();
+            break;
+            }
+        default:
+            {
+            iObserver->CommandError( *this, result );
+            break;
+            }
+        }
+
+    if ( !readNext )
+        {
+        iObserver->CommandDone( *this );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::DoCancel
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+void CSingleReadBase<ETelContact>::DoCancel()
+    {
+    iStore.ETelStoreBase().CancelAsyncRequest( EMobilePhoneStoreRead );
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleReadBase::RunError
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+TInt CSingleReadBase<ETelContact>::RunError( TInt aError )
+    {
+    iObserver->CommandError( *this, aError );
+    return KErrNone;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSingleReadBase::ReadNext
+// -----------------------------------------------------------------------------
+//
+template<class ETelContact>
+TBool CSingleReadBase<ETelContact>::ReadNext()
+    {
+    if ( iCurrentIndex <= iLastIndexToRead )
+        {
+        VPBK_DEBUG_PRINT(VPBK_DEBUG_STRING(
+            "VPbkSimStoreImpl: RMobilePhoneStore::Read h%d index %d"),
+            iStore.ETelStoreBase().SubSessionHandle(),iCurrentIndex);
+        iETelContact.iIndex = iCurrentIndex;
+        iStore.ETelStoreBase().Read( iStatus, iETelContactPckg );
+        ++iCurrentIndex;
+        SetActive();
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSingleONReadCmd::CSingleONReadCmd
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSingleONReadCmd::CSingleONReadCmd( CStoreBase& aStoreBase, 
+        TInt aIndexToRead )
+        :   CSingleReadBase<RMobileONStore::TMobileONEntryV1>(
+                aStoreBase, aIndexToRead )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleONReadCmd::CSingleONReadCmd
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSingleONReadCmd::CSingleONReadCmd( CStoreBase& aStoreBase )
+        :   CSingleReadBase<RMobileONStore::TMobileONEntryV1>( aStoreBase )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleONReadCmd::CSingleONReadCmd
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSingleONReadCmd::CSingleONReadCmd( TInt& aIndexToReadRef, 
+        CStoreBase& aStoreBase )
+        :   CSingleReadBase<RMobileONStore::TMobileONEntryV1>(
+                aIndexToReadRef, aStoreBase)
+    {
+    }
+
+// Destructor
+CSingleONReadCmd::~CSingleONReadCmd()
+    {
+    CancelCmd();
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleONReadCmd::HandleRunL
+// -----------------------------------------------------------------------------
+//
+void CSingleONReadCmd::HandleRunL()
+    {
+    TInt result = iStatus.Int();
+    if ( result == KErrNone )
+        {
+        AddContactL();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSingleONReadCmd::AddContactL
+// -----------------------------------------------------------------------------
+//
+void CSingleONReadCmd::AddContactL()
+    {
+    CVPbkSimContact* cnt = CVPbkSimContact::NewLC( iStore );
+    cnt->SetSimIndex( iETelContact.iIndex );
+
+    if ( iETelContact.iText.Length() > 0 )
+        {
+        CVPbkSimCntField* field = cnt->CreateFieldLC( EVPbkSimName );
+        field->SetDataL( iETelContact.iText );
+        cnt->AddFieldL( field );
+        CleanupStack::Pop( field );
+        }
+
+    if ( iETelContact.iNumber.iTelNumber.Length() > 0 )
+        {
+        CVPbkSimCntField* field = cnt->CreateFieldLC( EVPbkSimGsmNumber );
+        field->SetDataL( iETelContact.iNumber.iTelNumber );
+        cnt->AddFieldL( field );
+        CleanupStack::Pop( field );
+        }
+
+    if ( cnt->FieldArray().Count() > 0 )
+        {
+        iStore.Contacts().AddOrReplaceL( cnt );
+        CleanupStack::Pop( cnt );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( cnt );
+        }
+    }
+} // namespace VPbkSimStoreImpl
+//  End of File