phoneengine/PhoneCntFinder/ContactService/src/cphcntcontactdataselectionimpl.cpp
changeset 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/PhoneCntFinder/ContactService/src/cphcntcontactdataselectionimpl.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 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:  Service to show dialogs for user to select contact data.
+*
+*/
+
+
+#include "cphcntcontactdataselectionimpl.h"
+#include "mphcntservicerequestparamfactory.h"
+#include "mphcntservicerequestparam.h"
+#include "MPhCntContactStores.h"
+#include "CPhCntContact.h"
+#include "cphcntcontactid.h"
+
+CPhCntSelectedDataImpl* CPhCntSelectedDataImpl::NewL( 
+    CPhCntContact& aContact )
+    {
+    CPhCntSelectedDataImpl* self = new( ELeave )CPhCntSelectedDataImpl();
+    CleanupStack::PushL( self );
+    self->ConstructL( aContact );
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+CPhCntSelectedDataImpl::~CPhCntSelectedDataImpl()
+    {
+    delete iSelectedData;
+    delete iFieldLink;
+    }
+    
+CPhCntSelectedDataImpl::CPhCntSelectedDataImpl()
+    {
+    }
+    
+void CPhCntSelectedDataImpl::ConstructL( CPhCntContact& aContact )
+    {
+    iSelectedData = aContact.Number().AllocL();
+    iFieldLink = aContact.ContactId()->PackLC();
+    iNumberType = aContact.NumberType();
+    CleanupStack::Pop( iFieldLink );
+    }
+    
+const TDesC& CPhCntSelectedDataImpl::Data() const
+    {
+    return *iSelectedData;
+    }
+    
+const TDesC8& CPhCntSelectedDataImpl::FieldLink() const
+    {
+    return *iFieldLink;
+    }
+
+MPhCntMatch::TNumberType CPhCntSelectedDataImpl::NumberType() const
+    {
+    return iNumberType;
+    }
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactDataSelectionImpl::CPhCntContactDataSelectionImpl(
+    MPhCntAiwService* aService,
+    MPhCntServiceRequestParamFactory* aParamFactory,
+    MPhCntContactStores* aContactStores ) : 
+    iService( aService ),
+    iParamFactory( aParamFactory ),
+    iServiceResult( iFieldLink ),
+    iContactStores( aContactStores )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor
+// ---------------------------------------------------------------------------
+//
+void CPhCntContactDataSelectionImpl::ConstructL()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// static constructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactDataSelectionImpl* CPhCntContactDataSelectionImpl::NewL(
+    MPhCntAiwService* aService,
+    MPhCntServiceRequestParamFactory* aParamFactory,
+    MPhCntContactStores* aContactStores )
+    {
+    CPhCntContactDataSelectionImpl* self = new( ELeave ) 
+        CPhCntContactDataSelectionImpl(
+            aService, aParamFactory, aContactStores );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPhCntContactDataSelectionImpl::~CPhCntContactDataSelectionImpl()
+    {
+    if( iService )
+        {
+        iService->Cancel();
+        }
+    delete iService;
+    delete iParamFactory;
+    delete iServiceParameter;
+    delete iFieldLink;
+    if( iContactStores )
+        {
+        iContactStores->CancelRequest();
+        }
+    delete iContactStores;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CPhCntContactDataSelection
+// Determines if there is active request pending.
+// ---------------------------------------------------------------------------
+//
+TBool CPhCntContactDataSelectionImpl::IsActive() const
+    {
+    return iService->IsRequestActive() | iContactStores->IsRequestActive();
+    }
+    
+// ---------------------------------------------------------------------------
+// From class CPhCntContactDataSelection
+// ?implementation_description
+// ---------------------------------------------------------------------------
+//    
+void CPhCntContactDataSelectionImpl::Cancel()
+    {
+    iService->Cancel();
+    iContactStores->CancelRequest();
+    iObserver = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CPhCntContactDataSelection
+// Starts phone number selection.
+// ---------------------------------------------------------------------------
+//   
+void CPhCntContactDataSelectionImpl::SelectPhoneNumberForCallL(
+    const TDesC8& aContactLink,
+    const TCallType& aCallType,
+    MPhCntSelectionObserver& aObserver )
+    {
+    if( IsActive() ) 
+        {
+        User::Leave( KErrInUse );
+        }
+    iObserver = &aObserver;
+    delete iServiceParameter;
+    iServiceParameter = NULL;
+    iServiceParameter = iParamFactory->CreateGetPhoneNumberFromContactParamL( 
+        aContactLink,
+        static_cast<CPhCntSingleItemFetch::TCallType>(aCallType ) );
+    iService->ExecuteRequestL( *iServiceParameter, iServiceResult, *this );
+    }
+    
+// ---------------------------------------------------------------------------
+// From class MPhCntServiceObserver
+// Indication from Aiw service that request has completed.
+// ---------------------------------------------------------------------------
+//  
+void CPhCntContactDataSelectionImpl::RequestComplete( TInt aError )
+    {
+    if( !aError )
+        {
+        TRAPD( err, iContactStores->FetchFirstContactL( *iFieldLink, *this ) );
+        if( iObserver && err )
+            {
+            iObserver->SelectionDone( NULL, err );
+            }
+        }
+    else
+        {
+        if( iObserver )
+            {
+            iObserver->SelectionDone( NULL, aError );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// From class MPhCntContactFetchObserver
+// Indication from contact stores that contact is now received.
+// ---------------------------------------------------------------------------
+//  
+void CPhCntContactDataSelectionImpl::ContactReceived( 
+    CPhCntContact* aContact, TInt aError )
+    {
+    if( !aError )
+        {
+        CPhCntSelectedDataImpl* selectedData = NULL;
+        TRAPD( err, 
+            selectedData = CPhCntSelectedDataImpl::NewL( *aContact ) );
+        iObserver->SelectionDone( selectedData, err );
+        delete selectedData;
+        }
+    else
+        {
+        iObserver->SelectionDone( NULL, aError );
+        }
+    delete aContact;
+    }