phonebookui/Phonebook2/Commands/src/CPbk2CallCmd.cpp
changeset 0 e686773b3f54
child 23 5586b4d2ec3e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/Commands/src/CPbk2CallCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,429 @@
+/*
+* 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 call command object.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbk2CallCmd.h"
+
+// Phonebook 2
+#include "CPbk2CallTypeSelector.h"
+#include <Pbk2Commands.hrh>
+#include <MPbk2ContactNameFormatter.h>
+#include <MPbk2ContactUiControl.h>
+#include <MPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+#include <CPbk2ApplicationServices.h>
+
+// Virtual Phonebook
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactField.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactLink.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactStore.h>
+#include <MVPbkContactStoreProperties.h>
+#include <Pbk2UIControls.rsg>
+#include <MVPbkContactFieldUriData.h>
+
+// System includes
+#include <coemain.h>
+#include <AiwServiceHandler.h>
+#include <AiwCommon.hrh>
+#include <aiwdialdataext.h>
+#include <spsettingsvoiputils.h>
+
+// Debugging headers
+#include <Pbk2Debug.h>
+
+/// Unnamed namespace for local definitions
+namespace {
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_ExecuteLD = 1
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbk2CallCmd");
+    User::Panic(KPanicText,aReason);
+    }
+#endif // _DEBUG
+
+/**
+ * Field type matcher.
+ *
+ * @param aFieldTypeList    List of field types.
+ * @param aFieldType        Field type to search for.
+ * @param aResourceId       Field type selector resources.
+ * @return  ETrue if match was found.
+ */
+TBool MatchesFieldTypeL
+        ( const MVPbkFieldTypeList& aFieldTypeList,
+          const MVPbkFieldType& aFieldType,
+          TInt aResourceId )
+    {
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, aResourceId );
+
+    CVPbkFieldTypeSelector* selector = CVPbkFieldTypeSelector::NewL
+        ( reader, aFieldTypeList );
+
+    // Check if the field type is the one needed
+    TBool ret = selector->IsFieldTypeIncluded(aFieldType);
+    CleanupStack::PopAndDestroy(); // resource buffer
+    delete selector;
+    return ret;
+    }
+
+/**
+ * Sets a phone number to AIW dial data.
+ *
+ * @param aDialData     Dial data to modify.
+ * @param aContact      Contact containing the number.
+ */
+void SetDialDataNumberL
+        ( CAiwDialDataExt& aDialData, const MVPbkStoreContact& aContact )
+    {
+    const MVPbkFieldTypeList& fieldTypeList =
+            aContact.ParentStore().StoreProperties().SupportedFields();
+    const MVPbkStoreContactFieldCollection& fieldCollection  =
+        aContact.Fields();
+    TInt fieldCount( fieldCollection.FieldCount() );
+    for ( TInt i = 0; i < fieldCount; ++i )
+        {
+        const MVPbkStoreContactField& field = fieldCollection.FieldAt( i );
+        const MVPbkFieldType* fieldType = field.BestMatchingFieldType();
+        if( MatchesFieldTypeL( fieldTypeList, *fieldType,
+            R_PHONEBOOK2_PHONENUMBER_SELECTOR ) )
+            {
+            const MVPbkContactFieldTextData* textData =
+                &MVPbkContactFieldTextData::Cast
+                    ( field.FieldData() );
+            const TDesC& phoneNumber( textData->Text().Left
+                ( AIWDialData::KMaximumPhoneNumberLength ) );
+            aDialData.SetPhoneNumberL( phoneNumber );
+            }
+        }
+    }
+
+/**
+ * Sets a phone number to AIW dial data.
+ *
+ * @param aDialData     Dial data to modify.
+ * @param aField        Contact field containing the number.
+ */
+void SetDialDataNumberL
+        ( CAiwDialDataExt& aDialData, const MVPbkStoreContactField& aField )
+    {
+    TVPbkFieldStorageType dataType = aField.FieldData().DataType();
+    
+    if ( dataType == EVPbkFieldStorageTypeText )
+        {
+        const MVPbkContactFieldTextData* textData =
+            &MVPbkContactFieldTextData::Cast( aField.FieldData() );
+        const TDesC& phoneNumber( textData->Text().Left
+            ( AIWDialData::KMaximumPhoneNumberLength ) );
+        aDialData.SetPhoneNumberL( phoneNumber );
+        }
+    
+    if ( dataType == EVPbkFieldStorageTypeUri )
+        {
+        const MVPbkContactFieldUriData* textData =
+            &MVPbkContactFieldUriData::Cast( aField.FieldData() );
+        const TDesC& phoneNumber( textData->Text().Left
+            ( AIWDialData::KMaximumPhoneNumberLength ) );
+        aDialData.SetPhoneNumberL( phoneNumber );
+        }
+    }
+} /// namespace
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::CPbk2CallCmd
+// --------------------------------------------------------------------------
+//
+CPbk2CallCmd::CPbk2CallCmd( MVPbkStoreContact*& aContact,
+        MVPbkStoreContactField* aSelectedField,
+        MPbk2ContactUiControl& aControl,
+        const TInt aCommandId, CAiwServiceHandler& aServiceHandler,
+        CPbk2CallTypeSelector& aSelector,
+        VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionSelector ) :
+            iContact( aContact ),
+            iSelectedField( aSelectedField ),
+            iControl( &aControl ),
+            iCommandId( aCommandId ),
+            iServiceHandler( aServiceHandler ),
+            iSelector( aSelector ),
+            iActionSelector( aActionSelector )
+            
+    {
+    PBK2_DEBUG_PRINT
+        (PBK2_DEBUG_STRING("CPbk2CallCmd::CPbk2CallCmd(0x%x)"), this);
+
+    iControl->RegisterCommand( this );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::~CPbk2CallCmd
+// --------------------------------------------------------------------------
+//
+CPbk2CallCmd::~CPbk2CallCmd()
+    {
+    PBK2_DEBUG_PRINT
+        (PBK2_DEBUG_STRING("CPbk2CallCmd::~CPbk2CallCmd(0x%x)"), this);
+
+    delete iSelectedField;
+    if( iControl )
+        {
+        iControl->RegisterCommand( NULL );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2CallCmd* CPbk2CallCmd::NewL( MVPbkStoreContact*& aContact,
+        MVPbkStoreContactField* aSelectedField,
+        MPbk2ContactUiControl& aControl,
+        const TInt aCommandId, CAiwServiceHandler& aServiceHandler,
+        CPbk2CallTypeSelector& aSelector )
+    {
+    CPbk2CallCmd* self = new (ELeave ) CPbk2CallCmd
+        ( aContact, aSelectedField, aControl, aCommandId,
+          aServiceHandler, aSelector, VPbkFieldTypeSelectorFactory::EEmptySelector );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2CallCmd* CPbk2CallCmd::NewL( MVPbkStoreContact*& aContact,
+        MVPbkStoreContactField* aSelectedField,
+        MPbk2ContactUiControl& aControl,
+        const TInt aCommandId, CAiwServiceHandler& aServiceHandler,
+        CPbk2CallTypeSelector& aSelector,
+        VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aActionSelector )
+    {
+    CPbk2CallCmd* self = new (ELeave ) CPbk2CallCmd
+        ( aContact, aSelectedField, aControl, aCommandId,
+          aServiceHandler, aSelector, aActionSelector );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::ExecuteLD
+// --------------------------------------------------------------------------
+//
+void CPbk2CallCmd::ExecuteLD()
+    {
+    PBK2_DEBUG_PRINT
+        (PBK2_DEBUG_STRING("CPbk2CallCmd::ExecuteLD(0x%x)"), this);
+
+    CleanupStack::PushL( this );
+
+    // Setup dial data
+    CAiwDialDataExt* dialData = CAiwDialDataExt::NewLC();
+    dialData->SetWindowGroup
+        ( CCoeEnv::Static()->RootWin().Identifier() );
+    
+    // If there is a default service, use the service 
+    TUint serviceId;
+    CSPSettingsVoIPUtils* sPSettings = CSPSettingsVoIPUtils::NewLC();
+    if ( !sPSettings->GetPreferredService( serviceId ) )
+        {
+        dialData->SetServiceId( serviceId );
+        }
+    CleanupStack::PopAndDestroy( sPSettings );
+    
+    MVPbkContactLink* contactLink = NULL;
+
+    if ( iCommandId == EPbk2CmdCall )
+        {
+        // Call was launched with send key, which means
+        // Phonebook has performed address select by itself
+        // and there is selected field instance
+        __ASSERT_DEBUG( iSelectedField &&
+            ( iSelectedField->FieldData().DataType() ==
+                EVPbkFieldStorageTypeText || 
+                iSelectedField->FieldData().DataType() ==
+                    EVPbkFieldStorageTypeUri ),
+                        Panic( EPanicPreCond_ExecuteLD ) );
+
+        // Create field link
+        contactLink = iSelectedField->CreateLinkLC();
+
+        // Set number
+        SetDialDataNumberL( *dialData, *iSelectedField );
+
+        // We also have select call type by ourselves
+        SetCallTypeL( *dialData );
+        }
+    else
+        {
+        if ( iSelectedField )
+            {
+            // If selected field is set create field link from it.
+            contactLink = iSelectedField->CreateLinkLC();
+            }
+        else
+            {
+            // Otherwise use contact
+            contactLink = iContact->CreateLinkLC();
+            }
+
+        if ( !contactLink )
+            {
+            // Temporary contact, set number here
+            SetDialDataNumberL( *dialData, *iContact );
+            }
+        }
+
+    if ( contactLink )
+        {
+        HBufC8* linkBuffer = contactLink->PackLC();
+        dialData->SetContactLinkL( *linkBuffer );
+        }
+    else
+        {
+        CPbk2ApplicationServices* appServices = CPbk2ApplicationServices::InstanceLC();
+        MPbk2ContactNameFormatter& nameFormatter =
+            appServices->NameFormatter();
+        const MVPbkStoreContactFieldCollection& fieldCollection  =
+            iContact->Fields();
+        HBufC* title = nameFormatter.GetContactTitleOrNullL(
+                        fieldCollection,
+                        MPbk2ContactNameFormatter::EPreserveLeadingSpaces );
+        CleanupStack::PopAndDestroy();
+        CleanupStack::PushL( title );
+            
+        if ( title )
+            {
+            dialData->SetNameL( *title );
+            }
+        }
+
+    // Get an empty in param list..
+    CAiwGenericParamList& inParamList = iServiceHandler.InParamListL();
+    // ..and pass it to dial data in order for it to fill it
+    dialData->FillInParamListL( inParamList );
+
+    if ( contactLink )
+        {
+        CleanupStack::PopAndDestroy( 3 ); // linkBuffer, contactLink, dialData
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( 2 ); // title, dialData
+        }
+
+
+    // If the command id is EPbk2CmdCall it means the call was launched
+    // with send key and we therefore must use different AIW command
+    // than when the call was selected from the menu
+   if ( iCommandId == EPbk2CmdCall )
+       {
+        iServiceHandler.ExecuteServiceCmdL(
+            KAiwCmdCall,
+            inParamList,
+            iServiceHandler.OutParamListL(),
+            0,      // No options used.
+            NULL);  // No need for callback
+       }
+   else // the call was launched from menu
+       {
+        // Relay the command to AIW for handling
+        iServiceHandler.ExecuteMenuCmdL(
+            iCommandId,
+            inParamList,
+            iServiceHandler.OutParamListL(),
+            0,      // No options used.
+            NULL);  // No need for callback
+       }
+
+    // Update UI control
+    if( iControl )
+        {
+        TInt fieldIndex = iControl->FocusedFieldIndex();
+        iControl->ResetFindL();
+        if( iContact )
+            {
+            iControl->SetFocusedContactL( *iContact );
+            }
+        iControl->SetFocusedFieldIndex( fieldIndex );
+        }
+
+    // Destroy itself as promised
+    CleanupStack::PopAndDestroy(); // this
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::ResetUiControl
+// --------------------------------------------------------------------------
+//
+void CPbk2CallCmd::ResetUiControl( MPbk2ContactUiControl& aUiControl )
+    {
+    if( iControl == &aUiControl )
+        {
+        iControl = NULL;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::AddObserver
+// --------------------------------------------------------------------------
+//
+void CPbk2CallCmd::AddObserver( MPbk2CommandObserver& /*aObserver*/ )
+    {
+    // Do nothing
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2CallCmd::SetCallTypeL
+// --------------------------------------------------------------------------
+//
+void CPbk2CallCmd::SetCallTypeL( CAiwDialDataExt& dialData )
+    { 
+    switch( iActionSelector )
+        {
+        CAiwDialData::TCallType callType;
+        case VPbkFieldTypeSelectorFactory::EEmptySelector:
+            callType = iSelector.SelectCallTypeL
+                ( iCommandId, *iContact, iControl->FocusedField(), *iSelectedField );
+            dialData.SetCallType( callType );
+            break;
+        case VPbkFieldTypeSelectorFactory::EVoiceCallSelector:
+            dialData.SetCallType( CAiwDialData::EAIWForcedCS );
+            break;
+        case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+            callType = iSelector.SelectVoipCallTypeL( iSelectedField );
+            dialData.SetCallType( callType );
+            break;
+        case VPbkFieldTypeSelectorFactory::EVideoCallSelector:
+            dialData.SetCallType( CAiwDialData::EAIWForcedVideo );
+            break;
+        default:
+            dialData.SetCallType ( CAiwDialData::EAIWForcedCS);
+            break;
+        }
+    }
+
+// End of File