messagingappbase/msgavkon/muiu_internal/servicesinternal/src/MuiuContactService.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingappbase/msgavkon/muiu_internal/servicesinternal/src/MuiuContactService.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2006 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:   Calls voice call or VoIP call to either of addresses provided. 
+*
+*/
+
+
+
+#include <eikenv.h>
+#include <coemain.h>
+#include <ItemFinder.h>
+#include <msgvoipextension.h>
+#include <commonphoneparser.h>      // Common phone number validity checker
+
+#include "MuiuContactService.h"
+#include "MuiuContactAddressMatcher.h"
+    
+// ---------------------------------------------------------
+// CMuiuContactService::NewL
+// ---------------------------------------------------------
+EXPORT_C CMuiuContactService* CMuiuContactService::NewL( 
+        CEikonEnv&          aEnv,
+        CMsgVoIPExtension*  aVoipExtension ) 
+    {
+    CMuiuContactService* self =
+        new( ELeave ) CMuiuContactService( aEnv, aVoipExtension );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------
+// CMuiuContactService::CMuiuContactService
+// ---------------------------------------------------------
+CMuiuContactService::CMuiuContactService(   CEikonEnv&          aEnv,
+                                            CMsgVoIPExtension*  aVoipExtension ):
+    iEikEnv( aEnv ),
+    iVoipExtension( aVoipExtension )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CMuiuContactService::ConstructL
+// ---------------------------------------------------------
+void CMuiuContactService::ConstructL()
+    {
+    if ( !iVoipExtension )
+        {
+        iVoipExtension = CMsgVoIPExtension::NewL( );
+        }
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::~CMuiuContactService
+// ---------------------------------------------------------
+EXPORT_C CMuiuContactService::~CMuiuContactService()
+    {
+    delete iVoipExtension;
+    delete iContactAddressMatcher;
+    delete iMatchAddress;
+    delete iMatchName;
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::PreferredCallTypeL
+// ---------------------------------------------------------
+EXPORT_C CMuiuContactService::TMuiuPreferredCallType CMuiuContactService::PreferredCallTypeL() const
+    {
+    CMuiuContactService::TMuiuPreferredCallType preferredCallType( EMuiuCallTypeVoice );
+    if (    iVoipExtension
+        &&  iVoipExtension->IsPreferredTelephonyVoIP( )
+        &&  iVoipExtension->VoIPProfilesExistL() )
+        {
+        preferredCallType = EMuiuCallTypeVoip;
+        }
+    return preferredCallType;
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::SetAddress
+// ---------------------------------------------------------
+EXPORT_C void CMuiuContactService::SetAddress( const TDesC& aAddress )
+    {
+    if ( iWait.IsStarted( ) )
+        {
+        // if searching, changes are not allowed, which may affect call handling
+        // iPrimaryAddress may be used after search completes
+        return;
+        }
+
+    iPrimaryAddress.Set( aAddress );
+    delete iMatchAddress;
+    iMatchAddress = NULL;
+    delete iMatchName;
+    iMatchName = NULL;
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::SetName
+// ---------------------------------------------------------
+EXPORT_C void CMuiuContactService::SetName( const TDesC& aName )
+    {
+    if ( iWait.IsStarted( ) )
+        {
+        // if searching, changes are not allowed, which may affect call handling
+        // iPrimaryName may be used after search completes
+        return;
+        }
+    iPrimaryName.Set( aName );
+    delete iMatchAddress;
+    iMatchAddress = NULL;
+    delete iMatchName;
+    iMatchName = NULL;
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::CallL
+// ---------------------------------------------------------
+EXPORT_C TBool CMuiuContactService::CallL( )
+    {
+    return CallL( KNullDesC );
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::CallL
+// ---------------------------------------------------------
+EXPORT_C TBool CMuiuContactService::CallL( const TDesC& aSecondaryAddress )
+    {
+    if ( iWait.IsStarted( ) )
+        {
+        // if searching, changes are not allowed, which may affect call handling
+        User::Leave( KErrNotSupported );
+        }
+
+    TBool ret = EFalse;
+    // Primary address data
+    TPtrC primaryAddress( KNullDesC );
+    TPtrC primaryName( KNullDesC );
+    TMuiuAddressType primaryAddressType = MsvUiServiceUtilitiesInternal::ResolveAddressTypeL( 
+              iPrimaryAddress ); 
+    
+    // resolve type of secondary (find item) address
+    iSecondaryAddress.Set( aSecondaryAddress );
+    TMuiuAddressType secondaryAddressType = MsvUiServiceUtilitiesInternal::ResolveAddressTypeL( 
+        iSecondaryAddress ); 
+
+    // Get preferred call type    
+    CMuiuContactService::TMuiuPreferredCallType preferredCallType = PreferredCallTypeL( );
+    if ( preferredCallType == EMuiuCallTypeVoice ) 
+        {
+        TMuiuAddressType foundAddressType = MsvUiServiceUtilitiesInternal::ResolveAddressTypeL( 
+              FoundContactAddressL() ); 
+
+        if (    primaryAddressType == EMuiuAddressTypeEmail
+            &&  foundAddressType !=  EMuiuAddressTypePhoneNumber )
+            {
+            // Search to phonebook must be done, if sender's address is email and
+            // found address is not phone number
+            ret = ETrue;
+            if ( !iContactAddressMatcher )
+                {
+                iContactAddressMatcher = CMuiuContactAddressMatcher::NewL( iEikEnv ); 
+                }
+            iContactAddressMatcher->FindContactL(   iPrimaryAddress,
+                                                    TCallBack( MatchDone, this) );
+            iWait.Start( );
+
+            // get results
+            delete iMatchAddress;
+            iMatchAddress = NULL;
+            delete iMatchName;
+            iMatchName = NULL;
+
+            iMatchAddress = iContactAddressMatcher->GetAddressL();    
+            iMatchName = iContactAddressMatcher->GetNameL(); 
+            if (    iMatchAddress
+                &&  iMatchAddress->Length() )
+                {
+                // Use found address 
+                primaryAddress.Set( FoundContactAddressL() );
+                primaryAddressType = 
+                    MsvUiServiceUtilitiesInternal::ResolveAddressTypeL( primaryAddress );
+                
+                // Use 'remote' alias, if it is visible on the UI
+                if ( iPrimaryName.Length() == 0 )
+                    {
+                    primaryName.Set( FoundContactNameL() );
+                    }
+                }
+            else 
+                {
+                // If found contact had not address, use primary address whatever it was. 
+                // Ignore also found name
+                primaryAddress.Set( iPrimaryAddress );
+                primaryName.Set( iPrimaryName );
+                }
+                
+            }
+        else if ( foundAddressType == EMuiuAddressTypePhoneNumber )
+            {                        
+            // Use search results
+            primaryAddress.Set( FoundContactAddressL() );
+            primaryAddressType = 
+                MsvUiServiceUtilitiesInternal::ResolveAddressTypeL( primaryAddress );
+                            
+            // Use 'remote' alias, if it is visible on the UI
+            if ( iPrimaryName.Length() == 0 )
+                {
+                primaryName.Set( FoundContactNameL() );
+                }
+            }
+        else if ( primaryAddressType == EMuiuAddressTypePhoneNumber )
+            {
+            //  Use original address  
+            primaryAddress.Set( iPrimaryAddress );
+            primaryName.Set( iPrimaryName );              
+            }
+        else
+            {
+            primaryAddressType = EMuiuAddressTypeNone;
+            }
+        }
+    else if ( preferredCallType != EMuiuCallTypeVoip )
+        {
+        return EFalse;
+        }
+    else // preferredCallType == EMuiuCallTypeVoip. Use original address information
+        {
+        primaryAddress.Set( iPrimaryAddress );
+        primaryName.Set( iPrimaryName );
+        }
+
+    MsvUiServiceUtilitiesInternal::InternetOrVoiceCallServiceL( 
+        iEikEnv,
+        *iVoipExtension,
+        primaryAddress,
+        primaryName,
+        primaryAddressType,
+        iSecondaryAddress,
+        secondaryAddressType,
+        EFalse );
+    return ret;
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::CallL
+// ---------------------------------------------------------
+EXPORT_C TBool CMuiuContactService::CallL( CItemFinder* aSecondaryItem )
+    {
+    TPtrC focusedAddr = KNullDesC( );
+    if ( aSecondaryItem )
+        {
+        CItemFinder::CFindItemExt& item =
+            aSecondaryItem->CurrentItemExt();
+        if (    item.iItemDescriptor
+            &&  (   item.iItemType == CItemFinder::EPhoneNumber
+                ||  item.iItemType == CItemFinder::EEmailAddress ) )
+            {
+            focusedAddr.Set( *(item.iItemDescriptor) );
+            }
+        }
+    return CallL( focusedAddr );
+    }
+
+// ---------------------------------------------------------
+// CMuiuContactService::IsContactFound
+// ---------------------------------------------------------
+EXPORT_C TBool CMuiuContactService::IsContactFound() const
+    {
+    if ( iMatchAddress )
+        {
+        return iMatchAddress->Length();
+        }
+    return EFalse;
+    }
+    
+// ---------------------------------------------------------
+// CMuiuContactService::FoundContactAddressL
+// ---------------------------------------------------------
+EXPORT_C TPtrC CMuiuContactService::FoundContactAddressL() const
+    {
+    if ( iMatchAddress )
+        {
+        return *iMatchAddress;
+        }
+    return KNullDesC();
+    }
+    
+// ---------------------------------------------------------
+// CMuiuContactService::FoundContactNameL
+// ---------------------------------------------------------
+EXPORT_C TPtrC CMuiuContactService::FoundContactNameL() const
+    {
+    if ( iMatchName )
+        {
+        return *iMatchName;
+        }
+    return KNullDesC();
+    }
+    
+// ---------------------------------------------------------
+// CMuiuContactService::IsVoipSupported
+// ---------------------------------------------------------
+EXPORT_C TBool CMuiuContactService::IsVoipSupported() const
+    {        
+    if (    iVoipExtension
+        &&  iVoipExtension->IsVoIPSupported( ) )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+    
+// ---------------------------------------------------------
+// CMuiuContactService::MatchDone
+// ---------------------------------------------------------
+TInt CMuiuContactService::MatchDone( TAny* aCallService )
+    {
+    CMuiuContactService* caller =
+        static_cast<CMuiuContactService*>( aCallService );
+    caller->iWait.AsyncStop( );
+    return KErrNone;
+    }
+
+                                  
+// End of File
+