messagingappbase/msgavkon/muiu_internal/servicesinternal/src/MuiuContactService.cpp
--- /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
+