--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/emailcontacts/contactactionservice/src/cfscactionutils.cpp Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,1326 @@
+/*
+* Copyright (c) 2008 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: Implementation of the class CFscActionUtils.
+ *
+*/
+
+
+// INCLUDES
+#include "emailtrace.h"
+#include <e32std.h>
+#include <e32property.h>
+#include <StringLoader.h>
+#include <commonphoneparser.h>
+#include <featmgr.h>
+#include <aknnotewrappers.h>
+#include <AknsSkinInstance.h>
+#include <AknsUtils.h>
+#include <eikapp.h>
+#include <apgcli.h>
+#include <centralrepository.h>
+#include <CoreApplicationUIsSDKCRKeys.h>
+#include <settingsinternalcrkeys.h>
+//<cmail> Header neither in Cmail nor in the platform
+#include <crcseprofileregistry.h>
+//</cmail>
+#include <NetworkHandlingDomainPSKeys.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkStoreContactFieldCollection.h>
+#include <MVPbkStoreContactField.h>
+#include <MVPbkFieldType.h>
+#include <TVPbkFieldVersitProperty.h>
+#include <MVPbkContactFieldData.h>
+#include <MVPbkContactFieldTextData.h>
+//<cmail>
+#include "fscactionplugincrkeys.h"
+#include "fsccontactactionservicedefines.h"
+//</cmail>
+#include <FscActionUtils.rsg>
+#include <barsread.h>
+#include <Pbk2ContactNameFormatterFactory.h>
+#include <MPbk2ContactNameFormatter.h>
+#include <CPbk2SortOrderManager.h>
+#include <CVPbkContactManager.h>
+#include <MPbk2FieldProperty.h>
+#include <CVPbkFieldTypeSelector.h>
+#include <CVPbkFieldFilter.h>
+#include <commonphoneparser.h>
+#include <bautils.h> // Fix for EMZG-7M23KX
+//<cmail> hardcoded paths removal
+#include <data_caging_path_literals.hrh>
+//</cmail>
+
+#include "cfscactionutils.h"
+#include "cfsccontactaction.h"
+#include "mfscreasoncallback.h"
+#include <VPbkFieldType.hrh>
+#include "FscPresentationUtils.h"
+#include "CFscFieldPropertyArray.h"
+#include "TFscAddressSelectParams.h"
+#include "CFscAddressSelect.h"
+
+
+// CONSTANTS DECLARATIONS
+const TUid KPoCOmaServerUid =
+ {
+ 0x102071C4
+ };
+
+// Unnamed namespace
+namespace {
+// These values come from cfsccallpluginimpl.cpp
+const TInt KMaxConfIdLen = 32;
+const TInt KMaxConfPinLen = 32;
+}
+
+const TUint32 KPoCDefaultSettings = 0x199;
+
+const TInt KMaxLengthOfNumber = 100;
+
+//Fix for: ECWG-7QYAVS
+const TInt KMaxLengthOfName = 100;
+//end for fix
+
+_LIT( KSpace, " " );
+//<cmail> hard coded path removed
+_LIT( KFscRscFileName, "fscactionutils.rsc" );
+//</cmail>
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::NewL
+// ---------------------------------------------------------------------------
+//
+CFscActionUtils* CFscActionUtils::NewL( CVPbkContactManager& aContactManager )
+ {
+ FUNC_LOG;
+ CFscActionUtils* self = CFscActionUtils::NewLC( aContactManager );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::NewLC
+// ---------------------------------------------------------------------------
+//
+CFscActionUtils* CFscActionUtils::NewLC(
+ CVPbkContactManager& aContactManager )
+ {
+ FUNC_LOG;
+ CFscActionUtils* self = new ( ELeave ) CFscActionUtils( aContactManager );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::~CFscActionUtils
+// ---------------------------------------------------------------------------
+//
+CFscActionUtils::~CFscActionUtils()
+ {
+ FUNC_LOG;
+ delete iRep;
+ if ( iRCSEProfileRegistry != NULL )
+ {
+ //<cmail>
+ delete iRCSEProfileRegistry;
+ //</cmail>
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ContactManager
+// ---------------------------------------------------------------------------
+//
+CVPbkContactManager& CFscActionUtils::ContactManager()
+ {
+ FUNC_LOG;
+ return iContactManager;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ShowInfoNoteL
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::ShowInfoNoteL( TInt aNote, const HBufC* aContactName )
+ {
+ FUNC_LOG;
+ HBufC* noteText = NULL;
+
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ if ( aContactName )
+ {
+ noteText = StringLoader::LoadL( aNote, *aContactName );
+ }
+ else
+ {
+ noteText = StringLoader::LoadL( aNote );
+ }
+
+ CleanupStack::PushL( noteText );
+ CAknInformationNote* infoNote =
+ new ( ELeave ) CAknInformationNote( ETrue );
+ infoNote->ExecuteLD( *noteText );
+ CleanupStack::PopAndDestroy( noteText );
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ShowInfoNoteL
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::ShowInfoNoteL( TInt aNote, TInt aCounter )
+ {
+ FUNC_LOG;
+ HBufC* noteText = NULL;
+
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ noteText = StringLoader::LoadL( aNote, aCounter );
+
+ CleanupStack::PushL( noteText );
+ CAknInformationNote* infoNote =
+ new ( ELeave ) CAknInformationNote( ETrue );
+ infoNote->ExecuteLD( *noteText );
+ CleanupStack::PopAndDestroy( noteText );
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ShowCnfNoteL
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::ShowCnfNoteL( TInt aNote, const HBufC* aName )
+ {
+ FUNC_LOG;
+
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ HBufC* noteText = NULL;
+
+ if ( aName )
+ {
+ noteText = StringLoader::LoadL( aNote, *aName );
+ }
+ else
+ {
+ noteText = StringLoader::LoadL( aNote );
+ }
+
+ CleanupStack::PushL( noteText );
+ CAknConfirmationNote* cnfNote =
+ new ( ELeave ) CAknConfirmationNote( ETrue );
+ cnfNote->ExecuteLD( *noteText );
+ CleanupStack::PopAndDestroy( noteText );
+
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ShowNumberMissingDialogL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::ShowNumberMissingNoteL( TInt aMissingCount,
+ TInt aTotalCount, TInt aNote, TInt aDialog )
+ {
+ FUNC_LOG;
+
+ // Add two numbers aMissingCount and aTotalCount to queryText
+ CArrayFix<TInt>* numbers = new( ELeave ) CArrayFixFlat<TInt>( 2 );
+ CleanupStack::PushL( numbers );
+ numbers->AppendL( aMissingCount );
+ numbers->AppendL( aTotalCount );
+
+ HBufC* queryText = StringLoader::LoadLC( aNote, *numbers );
+
+ CAknQueryDialog *queryDlg = new ( ELeave ) CAknQueryDialog();
+ CleanupStack::PushL( queryDlg );
+ queryDlg->SetPromptL( *queryText );
+ CleanupStack::Pop( queryDlg );
+ CleanupStack::PopAndDestroy( queryText );
+ CleanupStack::PopAndDestroy( numbers );
+
+ TInt ret = queryDlg->ExecuteLD( aDialog );
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetContactNameL
+// ---------------------------------------------------------------------------
+HBufC* CFscActionUtils::GetContactNameL( MVPbkStoreContact& aStoreContact )
+ {
+ FUNC_LOG;
+ HBufC* contactName = HBufC::NewLC( KMaxLengthOfName + 1 ); // one ' ' char
+
+ // Search for the contact name
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ TResourceReader selectorReader;
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_FIRST_NAME_SELECTOR );
+
+ CVPbkFieldTypeSelector* fieldTypeSelector = CVPbkFieldTypeSelector::NewL(
+ selectorReader, iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy(); // selectorReader
+
+ CVPbkFieldFilter::TConfig config(
+ const_cast<MVPbkStoreContactFieldCollection&> (
+ aStoreContact.Fields() ), fieldTypeSelector, NULL );
+
+ CVPbkFieldFilter* fieldFilter = CVPbkFieldFilter::NewL( config );
+ TInt fieldCount = fieldFilter->FieldCount();
+ const MVPbkStoreContactField* field = NULL;
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ contactName->Des().Append(
+ MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text() );
+ CleanupStack::PopAndDestroy();//field
+ }
+
+ delete fieldFilter;
+ delete fieldTypeSelector;
+
+ // Search for the contact second name
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_LAST_NAME_SELECTOR );
+ fieldTypeSelector = CVPbkFieldTypeSelector::NewL( selectorReader,
+ iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy();//selectorReader
+ config.iFieldSelector = fieldTypeSelector;
+
+ fieldFilter = CVPbkFieldFilter::NewL( config );
+ fieldCount = fieldFilter->FieldCount();
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ if ( contactName->Des().Length() > 0 )
+ {
+ contactName->Des().Append( KSpace );
+ }
+ contactName->Des().Append(
+ MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text() );
+ CleanupStack::PopAndDestroy();//field
+ }
+
+ // If first or second name hasn't been found -> find company name
+ if ( contactName->Des().Length() <= 0 )
+ {
+ delete fieldFilter;
+ delete fieldTypeSelector;
+
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_COMPANY_NAME_SELECTOR );
+ fieldTypeSelector = CVPbkFieldTypeSelector::NewL( selectorReader,
+ iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy();//selectorReader
+ config.iFieldSelector = fieldTypeSelector;
+
+ fieldFilter = CVPbkFieldFilter::NewL( config );
+ fieldCount = fieldFilter->FieldCount();
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ contactName->Des().Append(
+ MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text() );
+ CleanupStack::PopAndDestroy();//field
+ }
+ }
+ // no first or second name, nor company name -> return "unnamed" string
+ if ( contactName->Des().Length() <= 0 )
+ {
+ //append (Unnamed)
+ HBufC* unnamed = StringLoader::LoadL( R_QTN_FS_UNNAMED );
+ contactName->Des().Append( *unnamed );
+ delete unnamed;
+ }
+
+ delete fieldFilter;
+ delete fieldTypeSelector;
+ CleanupStack::Pop( contactName );
+
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+
+ return contactName;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::OpenSelectDialogL
+// ---------------------------------------------------------------------------
+//
+MVPbkStoreContactField* CFscActionUtils::OpenSelectDialogL( TInt aResourceId,
+ MVPbkStoreContact& aStoreContact )
+ {
+ FUNC_LOG;
+ // Create sort order manager
+ CPbk2SortOrderManager* sortOrderManager =
+ CPbk2SortOrderManager::NewL( iContactManager.FieldTypes() );
+ CleanupStack::PushL( sortOrderManager );
+
+ // Create name formatter
+ MPbk2ContactNameFormatter* nameFormatter =
+ Pbk2ContactNameFormatterFactory::CreateL(
+ iContactManager.FieldTypes(), *sortOrderManager );
+
+ CFscFieldPropertyArray* fieldProperties =
+ CFscFieldPropertyArray::NewL( iContactManager.FieldTypes() );
+
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ // Create resource reader for new resource
+ TResourceReader resReader;
+
+ CCoeEnv::Static()->CreateResourceReaderLC( resReader,
+ aResourceId );
+
+ TFscAddressSelectParams params( aStoreContact, iContactManager,
+ *nameFormatter, *fieldProperties, resReader );
+
+ RVPbkContactFieldDefaultPriorities defaultPrioritiesArray;
+
+ switch ( aResourceId )
+ {
+ case R_FSC_PHONE_NUMBER_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypePhoneNumber );
+ // Launch call directly using default values.
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ case R_FSC_VIDEO_NUMBER_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypeVideoNumber );
+ // Launch call directly using default values.
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ case R_FSC_VOIP_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypeVoIP );
+ // Launch call directly using default values.
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ case R_FSC_PTT_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypePOC );
+ // Launch call directly using default values.
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ case R_FSC_MSG_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypeSms );
+ defaultPrioritiesArray.Append( EVPbkDefaultTypeMms );
+ // Fix for ELWG-7SPH5H
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ case R_FSC_EMAIL_SELECT:
+ {
+ defaultPrioritiesArray.Append( EVPbkDefaultTypeEmail );
+ params.SetUseDefaultDirectly( ETrue );
+ break;
+ }
+
+ default:
+ {
+ User::Leave( KErrArgument );
+ break;
+ }
+ }
+
+ params.SetDefaultPriorities( defaultPrioritiesArray );
+
+ // Create select dialog
+ delete iAddressSelect;
+ iAddressSelect = NULL;
+ iAddressSelect = CFscAddressSelect::NewL( params );
+ // Run select dialog
+ MVPbkStoreContactField* selectedField = iAddressSelect->ExecuteLD();
+ iAddressSelect = NULL;
+
+ defaultPrioritiesArray.Close();
+ CleanupStack::PopAndDestroy(); //resReader
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+ delete fieldProperties;
+ delete nameFormatter;
+ CleanupStack::PopAndDestroy( sortOrderManager );
+
+ return selectedField;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetVoiceCallNumberL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetVoiceCallNumberL( MVPbkStoreContact& aStoreContact,
+ TDes& aNumber )
+ {
+ FUNC_LOG;
+ aNumber.Zero();
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeVoiceCallNumber ) )
+ {
+ return KErrNotFound;
+ }
+
+ TInt ret = KErrNone;
+
+ // open select dialog for voice call number
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_PHONE_NUMBER_SELECT, aStoreContact );
+
+ // If select number dialog was cancelled, we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Else, copy phone number to the aNubmer argument
+ TPtrC phoneNumberFieldData = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ // Copy number from selected field
+ if ( phoneNumberFieldData.Length() )
+ {
+ aNumber.Copy( phoneNumberFieldData );
+ }
+
+ // Format phone number
+ //Fix for: MHOA-7SQF6T
+ CommonPhoneParser::ParsePhoneNumber( aNumber,
+ CommonPhoneParser::EPlainPhoneNumber );
+ //end for fix
+ }
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetVideoCallNumberL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetVideoCallNumberL( MVPbkStoreContact& aStoreContact,
+ TDes& aNumber )
+ {
+ FUNC_LOG;
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeVideoCallNumber ) )
+ {
+ return KErrNotFound;
+ }
+
+ aNumber.Zero();
+ TInt ret = KErrNone;
+
+ // open select dialog for video call number
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_VIDEO_NUMBER_SELECT, aStoreContact );
+
+ // If select number dialog was cancelled, we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Else, copy phone number to the aNubmer argument
+ TPtrC phoneNumberFieldData = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ // Copy number from selected field
+ if ( phoneNumberFieldData.Length() )
+ {
+ aNumber.Copy( phoneNumberFieldData );
+ }
+
+ // Format phone number
+ //Fix for: MHOA-7SQF6T
+ CommonPhoneParser::ParsePhoneNumber( aNumber,
+ CommonPhoneParser::EPlainPhoneNumber );
+ //end for fix
+ }
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetVoipAddressL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetVoipAddressL( MVPbkStoreContact& aStoreContact,
+ TDes& aVoipAddress )
+ {
+ FUNC_LOG;
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeInternetTel ) )
+ {
+ return KErrNotFound;
+ }
+
+ aVoipAddress.Zero();
+ TInt ret = KErrNone;
+
+ // open select dialog for voip address
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_VOIP_SELECT, aStoreContact );
+
+ // If select VOIP address dialog was cancelled, we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Copy VOIP address from selected field
+ TPtrC voipAddress = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ if ( voipAddress.Length() )
+ {
+ aVoipAddress.Copy( voipAddress );
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+ }
+
+ // Format phone number
+ //Fix for: MHOA-7SQF6T
+ CommonPhoneParser::ParsePhoneNumber( aVoipAddress,
+ CommonPhoneParser::EPlainPhoneNumber );
+ //end for fix
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetConfInfoL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetConfInfoL( MVPbkStoreContact& aStoreContact,
+ TDes& aConfNum, TDes& aConfId, TDes& aConfPin )
+ {
+ FUNC_LOG;
+ aConfNum.Zero();
+ aConfId.Zero();
+ aConfPin.Zero();
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeConfNumber ) )
+ {
+ return KErrNotFound;
+ }
+
+ TInt ret = KErrNone;
+
+ // Search for conference number
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+ TResourceReader selectorReader;
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_CONF_NUMBER_SELECTOR );
+
+ CVPbkFieldTypeSelector* fieldTypeSelector = CVPbkFieldTypeSelector::NewL(
+ selectorReader, iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy(); // selectorReader
+
+ CVPbkFieldFilter::TConfig config(
+ const_cast<MVPbkStoreContactFieldCollection&> (
+ aStoreContact.Fields() ), fieldTypeSelector, NULL );
+
+ CVPbkFieldFilter* fieldFilter = CVPbkFieldFilter::NewL( config );
+ TInt fieldCount = fieldFilter->FieldCount();
+ const MVPbkStoreContactField* field = NULL;
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ aConfNum.Append( MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text() );
+ CleanupStack::PopAndDestroy();//field
+ }
+
+ delete fieldFilter;
+ fieldFilter = NULL;
+ delete fieldTypeSelector;
+ fieldTypeSelector = NULL;
+
+ // if conference number field exists but no number set
+ if ( !( CommonPhoneParser::IsValidPhoneNumber( aConfNum,
+ CommonPhoneParser::EContactCardNumber ) ) )
+ {
+ return KErrNotFound;
+ }
+
+ // Search for conference id
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_CONF_ID_SELECTOR );
+
+ fieldTypeSelector = CVPbkFieldTypeSelector::NewL(
+ selectorReader, iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy(); // selectorReader
+ config.iFieldSelector = fieldTypeSelector;
+
+ fieldFilter = CVPbkFieldFilter::NewL( config );
+ fieldCount = fieldFilter->FieldCount();
+ field = NULL;
+
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ const TDesC& confIdData = MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text();
+ if ( confIdData.Length() <= KMaxConfIdLen )
+ {
+ aConfId.Append( confIdData );
+ }
+ else
+ {
+ aConfId = KNullDesC;
+ }
+ CleanupStack::PopAndDestroy();//field
+ if ( !( CommonPhoneParser::IsValidPhoneNumber( aConfId,
+ CommonPhoneParser::EContactCardNumber ) ) )
+ {
+ aConfId = KNullDesC;
+ }
+ }
+
+ delete fieldFilter;
+ fieldFilter = NULL;
+ delete fieldTypeSelector;
+ fieldTypeSelector = NULL;
+
+ // Search for conference id
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader,
+ R_FSC_CONF_PIN_SELECTOR );
+
+ fieldTypeSelector = CVPbkFieldTypeSelector::NewL(
+ selectorReader, iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy(); // selectorReader
+ config.iFieldSelector = fieldTypeSelector;
+
+ fieldFilter = CVPbkFieldFilter::NewL( config );
+ fieldCount = fieldFilter->FieldCount();
+ field = NULL;
+ if ( fieldCount == 1 )
+ {
+ field = fieldFilter->FieldAtLC(0);
+ const TDesC& confPinData = MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text();
+ if ( confPinData.Length() <= KMaxConfPinLen )
+ {
+ aConfPin.Append( confPinData );
+ }
+ else
+ {
+ aConfPin = KNullDesC;
+ }
+ CleanupStack::PopAndDestroy();//field
+ if ( !( CommonPhoneParser::IsValidPhoneNumber( aConfPin,
+ CommonPhoneParser::EContactCardNumber ) ) )
+ {
+ aConfPin = KNullDesC;
+ }
+ }
+
+ delete fieldFilter;
+ fieldFilter = NULL;
+ delete fieldTypeSelector;
+ fieldTypeSelector = NULL;
+
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetPocAddressL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetPocAddressL( MVPbkStoreContact& aStoreContact,
+ TDes& aPocAddress )
+ {
+ FUNC_LOG;
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypePttNumber ) )
+ {
+ return KErrNotFound;
+ }
+
+ aPocAddress.Zero();
+ TInt ret = KErrNone;
+
+ // open select dialog for poc address
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_PTT_SELECT, aStoreContact );
+
+ // If select POC address dialog was cancelled, we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Else, copy POC address to the aPocAddress argument
+ TPtrC pocAddress = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ // Copy POC address from selected field
+ if ( pocAddress.Length() )
+ {
+ aPocAddress.Copy( pocAddress );
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+ }
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetEmailAddressL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetMessageAddressL( MVPbkStoreContact& aStoreContact,
+ TDes& aMsgAddress )
+ {
+ FUNC_LOG;
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeMsgAddress ) )
+ {
+ return KErrNotFound;
+ }
+
+ aMsgAddress.Zero();
+
+ TInt ret = KErrNone;
+
+ // open select dialog for message address
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_MSG_SELECT, aStoreContact );
+
+ // If select message address dialog was cancelled,
+ // we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Copy message address from selected field
+ TPtrC msgAddress = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ if ( msgAddress.Length() )
+ {
+ aMsgAddress.Copy( msgAddress );
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+ }
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetEmailAddressL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::GetEmailAddressL( MVPbkStoreContact& aStoreContact,
+ TDes& aEmailAddress )
+ {
+ FUNC_LOG;
+
+ if( !IsContactNumberAvailableL( aStoreContact, ETypeEmailAddress ) )
+ {
+ return KErrNotFound;
+ }
+
+ aEmailAddress.Zero();
+
+ TInt ret = KErrNone;
+
+ // open select dialog for email address
+ MVPbkStoreContactField* selectedField = OpenSelectDialogL(
+ R_FSC_EMAIL_SELECT, aStoreContact );
+
+ // If select email address dialog was cancelled, we will return KErrCancel
+ if ( !selectedField )
+ {
+ ret = KErrCancel;
+ }
+ else
+ {
+ // Copy email address from selected field
+ TPtrC emailAddress = MVPbkContactFieldTextData::Cast(
+ selectedField->FieldData() ).Text();
+
+ if ( emailAddress.Length() )
+ {
+ aEmailAddress.Copy( emailAddress );
+ }
+ else
+ {
+ ret = KErrNotFound;
+ }
+ }
+
+ // Destroy objects
+ delete selectedField;
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::RemoveInvalidChar
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::RemoveInvalidChar( const TDesC& aNumber,
+ const TDesC& aValidChars, TDes& aOutNumber )
+ {
+ FUNC_LOG;
+ for ( TInt ii = 0; ii < aNumber.Length(); ++ii )
+ {
+ TChar ch = aNumber[ ii ];
+ if ( aValidChars.Locate( ch ) != KErrNotFound )
+ {
+ aOutNumber.Append( ch );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::IsContactNumberAvailableL
+// ---------------------------------------------------------------------------
+//
+TBool CFscActionUtils::IsContactNumberAvailableL(
+ MVPbkStoreContact& aStoreContact, TContactNumberType aContactNumberType )
+ {
+ FUNC_LOG;
+
+ TBool available( EFalse );
+
+ // Search for the contact name
+ // Fix for EMZG-7M23KX
+ TInt offset = FindAndAddResourceFileL();
+
+ TResourceReader selectorReader;
+ CVPbkFieldTypeSelector* fieldTypeSelector = NULL;
+ CVPbkFieldFilter* fieldFilter = NULL;
+ TInt fieldCount = 0;
+ TInt selector = 0;
+
+ switch ( aContactNumberType )
+ {
+ case ETypeVoiceCallNumber:
+ {
+ selector = R_FSC_PHONENUMBER_SELECTOR;
+ }
+ break;
+
+ case ETypeVideoCallNumber:
+ {
+ selector = R_FSC_VIDEO_SELECTOR;
+ }
+ break;
+
+ case ETypeConfNumber:
+ {
+ selector = R_FSC_CONF_NUMBER_SELECTOR;
+ }
+ break;
+
+ case ETypeInternetTel:
+ {
+ selector = R_FSC_VOIP_SELECTOR;
+ }
+ break;
+
+ case ETypePttNumber:
+ {
+ selector = R_FSC_PTT_SELECTOR;
+ }
+ break;
+
+ case ETypeMsgAddress:
+ {
+ selector = R_FSC_MSG_SELECTOR;
+ }
+ break;
+
+ case ETypeAudioAddress:
+ {
+ selector = R_FSC_MSG_SELECTOR;
+ }
+ break;
+
+ case ETypeEmailAddress:
+ {
+ selector = R_FSC_EMAIL_SELECTOR;
+ }
+ break;
+
+ default:
+ {
+ break;
+ }
+ }
+
+ if ( selector )
+ {
+ CCoeEnv::Static()->CreateResourceReaderLC( selectorReader, selector );
+
+ fieldTypeSelector = CVPbkFieldTypeSelector::NewL( selectorReader,
+ iContactManager.FieldTypes() );
+ CleanupStack::PopAndDestroy(); // selectorReader
+
+ CVPbkFieldFilter::TConfig config(
+ const_cast<MVPbkStoreContactFieldCollection&> (
+ aStoreContact.Fields() ), fieldTypeSelector, NULL);
+
+ fieldFilter = CVPbkFieldFilter::NewL( config );
+ fieldCount = fieldFilter->FieldCount();
+
+ if ( fieldCount )
+ {
+ if ( selector == R_FSC_CONF_NUMBER_SELECTOR )
+ {
+ TBuf<KMaxLengthOfNumber> confNum;
+ const MVPbkStoreContactField* field = NULL;
+ field = fieldFilter->FieldAtLC(0);
+ confNum.Append( MVPbkContactFieldTextData::Cast(
+ field->FieldData() ).Text() );
+ CleanupStack::PopAndDestroy();//field
+
+ if ( CommonPhoneParser::IsValidPhoneNumber( confNum,
+ CommonPhoneParser::EContactCardNumber ) )
+ {
+ available = ETrue;
+ }
+ }
+ else
+ {
+ available = ETrue;
+ }
+ }
+
+ delete fieldFilter;
+ delete fieldTypeSelector;
+ }
+
+ CCoeEnv::Static()->DeleteResourceFile( offset );
+
+ return available;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::Is3GNetworkAvailable
+// ---------------------------------------------------------------------------
+//
+TBool CFscActionUtils::Is3GNetworkAvailable()
+ {
+ FUNC_LOG;
+ TInt err = KErrNone;
+ TBool available( EFalse );
+
+ TInt networkMode = ENWNetworkModeGsm;
+ err = RProperty::Get( KPSUidNetworkInfo, KNWTelephonyNetworkMode,
+ networkMode );
+
+ if ( err == KErrNone && networkMode == ENWNetworkModeWcdma )
+ {
+ available = FeatureManager::FeatureSupported(
+ KFeatureIdProtocolWcdma );
+ }
+
+ return available;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::IsOfflineModeL
+// ---------------------------------------------------------------------------
+//
+TBool CFscActionUtils::IsOfflineModeL()
+ {
+ FUNC_LOG;
+ TBool mode( EFalse );
+ TInt status = ECoreAppUIsNetworkConnectionAllowed;
+
+ CRepository* cenRep = CRepository::NewL( KCRUidCoreApplicationUIs );
+ if ( cenRep )
+ {
+ cenRep->Get( KCoreAppUIsNetworkConnectionAllowed, status );
+ }
+ delete cenRep;
+
+ if ( status == ECoreAppUIsNetworkConnectionNotAllowed )
+ {
+ mode = ETrue;
+ }
+
+ return mode;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::IsPttConfiguredL
+// ---------------------------------------------------------------------------
+//
+TBool CFscActionUtils::IsPttConfiguredL()
+ {
+ FUNC_LOG;
+
+ TBool result = EFalse;
+
+ // Check configuration status from cenrep.
+ // If configuration status can not be found EFalse is returned.
+ CRepository* cenRep= NULL;
+ TRAPD( err, cenRep = CRepository::NewL( KPoCOmaServerUid ) ) ;
+ if ( err == KErrNone )
+ {
+ TInt settingsId;
+ TInt err = cenRep->Get( KPoCDefaultSettings, settingsId );
+ if ( err == KErrNone )
+ {
+ result = (settingsId != KErrNotFound );
+ }
+ delete cenRep;
+ }
+
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::IsVoipConfiguredL
+// ---------------------------------------------------------------------------
+//
+TBool CFscActionUtils::IsVoipConfiguredL()
+ {
+ FUNC_LOG;
+
+ TBool configured = EFalse;
+ if ( iRCSEProfileRegistry != NULL )
+ {
+ RArray<TUint32> ids;
+ CleanupClosePushL( ids );
+ //<cmail>
+ iRCSEProfileRegistry->GetAllIdsL( ids );
+ //</cmail>
+ configured = ids.Count() > 0;
+ CleanupStack::PopAndDestroy( &ids );
+ }
+
+ return configured;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::SkinIconL
+// ---------------------------------------------------------------------------
+//
+CGulIcon* CFscActionUtils::SkinIconL( TAknsItemID aItemId,
+ const TDesC& aFilename, TInt aFileBitmapId, TInt aFileMaskId )
+ {
+ FUNC_LOG;
+ CGulIcon* returnIcon( NULL );
+ CFbsBitmap* bitmap( NULL );
+ CFbsBitmap* mask( NULL );
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ AknsUtils::CreateIconL( skin, aItemId, bitmap, mask, aFilename,
+ aFileBitmapId, aFileMaskId );
+
+ CleanupStack::PushL( mask );
+ CleanupStack::PushL( bitmap );
+ returnIcon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( bitmap );
+ CleanupStack::Pop( mask );
+
+ return returnIcon;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ActionPriority
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::ActionPriority( TUint32 aActionPriorityCrKey,
+ TInt aDefaultPriority )
+ {
+ FUNC_LOG;
+ TInt result( 0 ); // some value to escape warning
+ TInt error = KErrNotFound;
+
+ if ( iRep != NULL )
+ {
+ // Get() returns KErrNone if successful
+ error = iRep->Get( aActionPriorityCrKey, result );
+ }
+
+ if ( error )
+ {
+ result = aDefaultPriority;
+ }
+
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::CreateActionL
+// ---------------------------------------------------------------------------
+//
+CFscContactAction* CFscActionUtils::CreateActionL(
+ MFscReasonCallback& aReasonCallback, TUid aContactActionUid,
+ TUint64 aActionType, TInt aActionMenuTextResourceId, CGulIcon* aIcon )
+ {
+ FUNC_LOG;
+ CFscContactAction* contactAction = CFscContactAction::NewL(
+ aReasonCallback, aContactActionUid, aActionType,
+ aActionMenuTextResourceId, aIcon );
+
+ return contactAction;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::CFscActionUtils
+// ---------------------------------------------------------------------------
+//
+CFscActionUtils::CFscActionUtils( CVPbkContactManager& aContactManager ) :
+ iContactManager( aContactManager )
+ {
+ FUNC_LOG;
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::ConstructL()
+ {
+ FUNC_LOG;
+ TRAP_IGNORE( iRep = CRepository::NewL( KCRUidFsContactActionService ) );
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) )
+ {
+ //<cmail>
+ TRAP_IGNORE( iRCSEProfileRegistry = CRCSEProfileRegistry::NewL() );
+ //</cmail>
+ }
+
+ //<cmail>
+ //iRCSEProfileRegistry = NULL;
+ //</cmail>
+
+ }
+
+// ---------------------------------------------------------------------------
+// CFscActionUtils::GetFileDir
+// ---------------------------------------------------------------------------
+//
+TPtrC CFscActionUtils::GetFileDirL( const TDesC& aFilePath )
+ {
+ FUNC_LOG;
+ if ( iLetterDrive.Size() == 0 )
+ {
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ const TUid applUid = eikonEnv->EikAppUi()->Application()->AppDllUid();
+ RApaLsSession ls;
+ TApaAppInfo appInfo;
+ User::LeaveIfError( ls.Connect() );
+ User::LeaveIfError( ls.GetAppInfo( appInfo, applUid ) );
+ // Extract application drive, path, name and extension
+ const TFileName appFullName = appInfo.iFullName;
+ ls.Close();
+ TParse appNameParse;
+ User::LeaveIfError( appNameParse.Set( appFullName, NULL, NULL ) );
+ iLetterDrive = appNameParse.Drive();
+ }
+ TFileName fileName;
+ fileName.Append( iLetterDrive );
+ fileName.Append( aFilePath );
+
+ return fileName;
+ }
+
+// Fix for EMZG-7M23KX
+// ---------------------------------------------------------------------------
+// CFscActionUtils::FindAndAddResourceFileL
+// ---------------------------------------------------------------------------
+//
+TInt CFscActionUtils::FindAndAddResourceFileL()
+ {
+ FUNC_LOG;
+ //<cmail> hardcoded removed
+ TFileName resourceFileName( KDC_RESOURCE_FILES_DIR );
+ resourceFileName.Append(KFscRscFileName);
+ //</cmail>
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), resourceFileName );
+ TInt offset = CCoeEnv::Static()->AddResourceFileL( resourceFileName );
+
+ return offset;
+ }
+// ---------------------------------------------------------------------------
+// CFscActionUtils::CloseSelectDialogL
+// ---------------------------------------------------------------------------
+//
+void CFscActionUtils::CloseSelectDialogL()
+ {
+ FUNC_LOG;
+ if ( iAddressSelect )
+ {
+ iAddressSelect->AttemptExitL( EFalse );
+ }
+ }
+
+
+// ======== GLOBAL FUNCTIONS ========
+