diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIControls/src/CPbk2FieldAnalyzer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2FieldAnalyzer.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,338 @@ +/* +* Copyright (c) 2002-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: +* Provides methods for Phonebook 2 field analyzer. +* +*/ + + +// INCLUDE FILES +#include "CPbk2FieldAnalyzer.h" + +// Phonebook 2 +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// System +#include +#include +#include +#include +#include + +namespace // Unnamed namespace. Used to break down the VoipSupportL method +{ +/* +* Check whether there is any voip capable settings in the +* phone's Service Provider Settings +*/ + +void BasicSupportL(TInt& aVoipFlag) + { + TBool supported( EFalse ); + RIdArray idArray; + CleanupClosePushL(idArray); + CSPSettings* settings = CSPSettings::NewLC(); + + User::LeaveIfError( settings->FindServiceIdsL(idArray) ); + for (TInt i = 0; !supported && i < idArray.Count(); ++i) + { + CSPEntry* entry = CSPEntry::NewLC(); + TServiceId id = idArray[i]; + User::LeaveIfError( settings->FindEntryL(id, *entry) ); + const CSPProperty* property = NULL; + if (entry->GetProperty(property, ESubPropertyVoIPSettingsId) == KErrNone) + { + supported = ETrue; + } + + if (entry->GetProperty(property, EPropertyServiceAttributeMask) == KErrNone) + { + TInt value = 0; + property->GetValue(value); + supported = value & ESupportsInternetCall; + } + + CleanupStack::PopAndDestroy(); // entry + } + + if (supported) + { + aVoipFlag |= MPbk2FieldAnalyzer::EVoIPSupportBasic; + } + + if( settings->IsFeatureSupported( ESupportCallOutFeature ) ) + { + aVoipFlag |= MPbk2FieldAnalyzer::EVoIPSupportCallout; + } + + CleanupStack::PopAndDestroy(2); // settings, idArray + } +/* +* Check whether there is any SIP settings in the phone's Service Provider Settings +*/ + +void CleanupResetAndDestroy(TAny* aItem) + { + RPointerArray *pMyArray = (RPointerArray*) aItem; + pMyArray->ResetAndDestroy(); + pMyArray->Close(); + } + +void SipSupportL(TInt& aVoipFlag) + { + TBool found( EFalse ); + RPointerArray entries; + CleanupStack::PushL( TCleanupItem( CleanupResetAndDestroy, &entries ) ); + + CSPSettings* settings = CSPSettings::NewLC(); + RIdArray idArray; + CleanupClosePushL(idArray); + + User::LeaveIfError( settings->FindServiceIdsL(idArray) ); + CRCSEProfileRegistry* profileRegistry = CRCSEProfileRegistry::NewLC(); + // Check if we have atleast one SPSetting entry + // Any entry in this array uses SIP protocol for VoIP + TInt count = idArray.Count(); + for (TInt i = 0; !found && i < count; ++i) + { + profileRegistry->FindByServiceIdL( idArray[i], entries ); + if (entries.Count() > 0) + { + aVoipFlag |= MPbk2FieldAnalyzer::EVoIPSupportSip; + found = ETrue; + } + } + + CleanupStack::PopAndDestroy( 4 ); // entries, idArray, settings, profileRegistry + } +/* +* Check whether the Xsp fields specified in the IMPP field of the contact +* support voip (not necessarily SIP) +*/ + +void XspSupportL(CVPbkContactManager& aContactManager, + const MVPbkBaseContactFieldCollection& aFields, TInt& aVoipFlag) + { + + TBool found( EFalse ); + RIdArray ids; + CleanupClosePushL( ids ); + CSPSettings* settings = CSPSettings::NewLC(); + + CDesCArrayFlat* nameArray = new ( ELeave ) CDesCArrayFlat( 2 ); + CleanupStack::PushL( nameArray ); + + TInt error = settings->FindServiceIdsL( ids ); + User::LeaveIfError( error ); + error = settings->FindServiceNamesL( ids, *nameArray ); + User::LeaveIfError( error ); + const TInt count = nameArray->MdcaCount(); + + const MVPbkFieldType* type = aContactManager.FieldTypes().Find( R_VPBK_FIELD_TYPE_IMPP ); + CVPbkBaseContactFieldTypeIterator* itr = CVPbkBaseContactFieldTypeIterator::NewLC( *type, aFields ); + + while( itr->HasNext() && !found ) + { + const MVPbkBaseContactField* field = itr->Next(); + const MVPbkContactFieldUriData& uri = MVPbkContactFieldUriData::Cast( field->FieldData() ); + TPtrC scheme( uri.Scheme() ); + + for ( TInt i = 0; !found && i < count; i++ ) + { + TPtrC desc = nameArray->MdcaPoint( i ); + if ( !desc.CompareF( scheme ) ) + { + CSPProperty* property = CSPProperty::NewLC(); + error = settings->FindPropertyL( ids[i], EPropertyServiceAttributeMask, *property ); + if ( KErrNone == error ) + { + TInt value = 0; + property->GetValue( value ); + if ( value & ESupportsInternetCall ) + { + found = ETrue; + aVoipFlag |= MPbk2FieldAnalyzer::EVoIPSupportXspId; + } + } + CleanupStack::PopAndDestroy(); //property + break; + } + } + } + CleanupStack::PopAndDestroy( 4 ); //nameArray, settings, ids, itr + } +} + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::CPbk2FieldAnalyzer +// -------------------------------------------------------------------------- +// +CPbk2FieldAnalyzer::CPbk2FieldAnalyzer( + CVPbkContactManager& aContactManager ) : + iContactManager( aContactManager ), + iVoiceTaggedFields (NULL) + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::NewL +// -------------------------------------------------------------------------- +// +CPbk2FieldAnalyzer* CPbk2FieldAnalyzer::NewL( + CVPbkContactManager& aContactManager ) + { + CPbk2FieldAnalyzer* self = new (ELeave) CPbk2FieldAnalyzer( + aContactManager); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::~CPbk2FieldAnalyzer +// -------------------------------------------------------------------------- +// +CPbk2FieldAnalyzer::~CPbk2FieldAnalyzer() + { + delete iVoiceTaggedFields; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::HasSpeedDialL +// -------------------------------------------------------------------------- +// +TBool CPbk2FieldAnalyzer::HasSpeedDialL( + const MVPbkStoreContactField& aField ) const + { + return iContactManager.ContactAttributeManagerL().HasFieldAttributeL + ( CVPbkSpeedDialAttribute::Uid(), aField ); + } + + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::HasVoiceTagL +// -------------------------------------------------------------------------- +// +TBool CPbk2FieldAnalyzer::HasVoiceTagL( + const MVPbkStoreContactField& aField ) const + { + TBool ret = EFalse; + + if (iVoiceTaggedFields) + { + // look into voice tag container to see if this field had a voice tag + const TInt count = iVoiceTaggedFields->FieldCount(); + for ( TInt i = 0; i < count && !ret; ++i ) + { + MVPbkStoreContactField& voiceTagField = iVoiceTaggedFields->FieldAt(i); + if (aField.IsSame(voiceTagField)) + { + ret = ETrue; + } + } + } + return ret; + } + + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::IsHiddenField +// -------------------------------------------------------------------------- +// +TBool CPbk2FieldAnalyzer::IsHiddenField( + const CPbk2PresentationContactField& aField ) const + { + return !aField.IsVisibleInDetailsView(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldAnalyzer::SetVoiceTagFields +// -------------------------------------------------------------------------- +// +void CPbk2FieldAnalyzer::SetVoiceTagFields( + MVPbkStoreContactFieldCollection* aFields) + { + delete iVoiceTaggedFields; + iVoiceTaggedFields = aFields; + } + +const TInt CPbk2FieldAnalyzer::VoipSupportL( const MVPbkBaseContactFieldCollection& aFields ) const + { + TInt supported( 0 ); + + if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip) ) + { + BasicSupportL( supported ); + SipSupportL( supported ); + XspSupportL( iContactManager, aFields, supported ); + } + return supported; + + } + +TBool CPbk2FieldAnalyzer::IsFieldVoipCapable( TInt aVpbkFieldResId, const TInt aVoipFlag ) const + { + TBool ret( EFalse ); + + if ( FeatureManager::FeatureSupported(KFeatureIdCommonVoip) ) + { + if ( EVoIPSupportBasic & aVoipFlag && + ( R_VPBK_FIELD_TYPE_VOIPGEN == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_VOIPHOME == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_VOIPWORK == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_POC == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_SWIS == aVpbkFieldResId ) ) + { + ret = ETrue; + } + if ( EVoIPSupportSip & aVoipFlag && + ( R_VPBK_FIELD_TYPE_SIP == aVpbkFieldResId ) ) + { + ret = ETrue; + } + if ( EVoIPSupportXspId & aVoipFlag && + ( R_VPBK_FIELD_TYPE_IMPP == aVpbkFieldResId ) ) + { + ret = ETrue; + } + if ( EVoIPSupportCallout & aVoipFlag && + ( R_VPBK_FIELD_TYPE_MOBILEPHONEGEN == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_MOBILEPHONEHOME == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_MOBILEPHONEWORK == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_LANDPHONEGEN == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_LANDPHONEHOME == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_LANDPHONEWORK == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_ASSTPHONE == aVpbkFieldResId + || R_VPBK_FIELD_TYPE_CARPHONE == aVpbkFieldResId ) ) + { + ret = ETrue; + } + } + + return ret; + } + + +// End of File