diff -r 73a1feb507fb -r bc78a40cd63c mmsharing/mmshavailability/src/musavacontactavailability.cpp --- a/mmsharing/mmshavailability/src/musavacontactavailability.cpp Tue Aug 31 15:12:07 2010 +0300 +++ b/mmsharing/mmshavailability/src/musavacontactavailability.cpp Wed Sep 01 12:31:01 2010 +0100 @@ -16,22 +16,36 @@ */ + #include "musavacontactavailability.h" #include "musavaavailabilityobserver.h" #include "musavasettingsimp.h" #include "musavaobserver.h" #include "muslogger.h" #include "mussettings.h" +#include "musavacalleventmonitor.h" +#include +#include +#include +#include #include #ifdef UNIT_TESTING // if unit testing #include #endif // UNIT_TESTING +const TInt KNumberMatchingDigitsRequired = 7; const TInt KContactsArraySize = 10; + +_LIT( KMusAvaSip, "sip:" ); _LIT( KMusAvaTel, "tel:" ); _LIT( KMusAvaPlus, "+" ); +_LIT( KMusAvaAtSign , "@" ); +_LIT( KMusEmptyStringSymbol, "" ); +_LIT( KMusSpaceSymbol, " " ); +_LIT( KMusAvaTestString, "*#" ); + CMusAvaContactAvailability* CMusAvaContactAvailability::NewL( MMusAvaAvailabilityObserver& aObserver, @@ -73,6 +87,12 @@ ~CMusAvaContactAvailability()" ) delete iContactName; iContactName = NULL; + if ( iPhoneStatus ) + { + iPhoneStatus->Cancel(); + } + delete iPhoneStatus; + iPhoneStatus = NULL; MUS_LOG( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ ~CMusAvaContactAvailability()" ) } @@ -92,6 +112,7 @@ { MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::ConstructL()" ) iOperatorVariant = MultimediaSharingSettings::OperatorVariantSettingL(); + iPhoneStatus = CMusAvaCallEventMonitor::NewL( *this ); MUS_LOG( "mus: [MUSAVA] <- CMusAvaContactAvailability::ConstructL()" ) } @@ -103,12 +124,94 @@ void CMusAvaContactAvailability::DoExecuteL() { MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::DoExecuteL()" ) + iPhoneStatus->StartMonitoringL(); + + CContactIdArray* idArray = NULL; + + #ifdef UNIT_TESTING // if unit testing + EUNIT_DISABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + CPbkContactEngine* pbkContactEngine = CPbkContactEngine::NewL(); + CleanupStack::PushL( pbkContactEngine ); + + // resolve the name order + CContactViewBase& contactView = pbkContactEngine->AllContactsView(); + const RContactViewSortOrder& sortOrder = contactView.SortOrderL(); + #ifdef UNIT_TESTING // if unit testing + EUNIT_ENABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + + iBeginWithFirstName = ETrue; + TBool foundOrder = EFalse; + for( TInt i = 0; i < sortOrder.Count() && !foundOrder; ++i ) + { + if ( sortOrder[i] == KUidContactFieldFamilyName ) + { + iBeginWithFirstName = EFalse; + foundOrder = ETrue; + } + else if ( sortOrder[i] == KUidContactFieldGivenName ) + { + iBeginWithFirstName = ETrue; + foundOrder = ETrue; + } + } CDesCArrayFlat* contactsArray = new ( ELeave ) CDesCArrayFlat( KContactsArraySize ); CleanupStack::PushL( contactsArray ); - ActiveCallL( contactsArray ); + if ( ContactL( idArray, *pbkContactEngine ) ) + { + CleanupStack::PushL( idArray ); + + TInt idArrayCount = idArray->Count(); + MUS_LOG1( "mus: [MUSAVA] idArray->Count %d", idArrayCount ) + CPbkContactItem* pbkItem = NULL; + TPbkFieldId fieldId = ContactIdSearch( *idArray, *pbkContactEngine ); + + for ( TInt i = 0; i < idArrayCount; i++ ) + { + MUS_LOG1( "mus: [MUSAVA] i %d", i ) + TContactItemId itemId( KErrNotFound ); + itemId = ( *idArray )[i]; + + TRAPD( error, pbkItem = pbkContactEngine->ReadContactL( itemId ) ); + + if ( !error ) + { + TBool found = EFalse; + if ( fieldId == EPbkFieldIdShareView ) + { + found = ResolveAddressesL( + *pbkItem, contactsArray, EPbkFieldIdShareView ); + } + else if( fieldId == EPbkFieldIdSIPID) + { + found = ResolveAddressesL( + *pbkItem, contactsArray, EPbkFieldIdSIPID ); + } + + if ( !found ) + { + PhoneResolutionL( *pbkItem, contactsArray ); + } + + // tbd: causes test case to fail + // break; + } + + delete pbkItem; + pbkItem = NULL; + } + + idArray->Reset(); + CleanupStack::PopAndDestroy( idArray ); + } + else + { + ActiveCallL( contactsArray ); + } iSettings.SetSipAddressesL( *contactsArray ); @@ -116,11 +219,55 @@ CleanupStack::PopAndDestroy( contactsArray ); + CleanupStack::PopAndDestroy( pbkContactEngine ); + SetState( MMusAvaObserver::EMusAvaStatusAvailable ); MUS_LOG( "mus: [MUSAVA] <- CMusAvaContactAvailability::DoExecuteL()" ) } +// ------------------------------------------------------------------------- +// This function is called when a cs call is connected. +// ------------------------------------------------------------------------- +// +void CMusAvaContactAvailability::CallConnectedL( const TDesC& aTelNumber ) + { + MUS_LOG( "mus: [MUSAVA] \ + -> CMusAvaContactAvailability::CallConnectedL()" ) + + iSettings.SetTelNumberL(aTelNumber); + DoExecuteL(); + + MUS_LOG( "mus: [MUSAVA] \ + <- CMusAvaContactAvailability::CallConnectedL()" ) + } +void CMusAvaContactAvailability::ConferenceCallL() + { + } + + +// ------------------------------------------------------------------------- +// This function is called when a cs call goes hold +// ------------------------------------------------------------------------- +// +void CMusAvaContactAvailability::CallHoldL( const TDesC& /*aTelNumber*/ ) + { + } + + +// ------------------------------------------------------------------------- +// This function is called when a cs call goes into a state +// that is not connected. +// ------------------------------------------------------------------------- +// +void CMusAvaContactAvailability::NoActiveCallL() + { + } + + +void CMusAvaContactAvailability::ConferenceCallLTerminated () + { + } // ------------------------------------------------------------------------- // @@ -132,8 +279,6 @@ const TDesC& phoneNumber = iSettings.TelNumber(); TInt retval = EFalse; - const MDesCArray& addresses = iSettings.SipAddresses(); - TInt addressesCount = addresses.MdcaCount(); if ( phoneNumber.Length() > 0 && ( iOperatorVariant == MusSettingsKeys::EOperatorSpecific || @@ -154,19 +299,9 @@ CleanupStack::PopAndDestroy( tmpDescriptor ); retval = ETrue; } - else if ( addressesCount > 0 ) - { - MUS_LOG1( "mus: [MUSAVA] addresses.MdcaCount() %d", - addressesCount ) - const TDesC& sipAddress = addresses.MdcaPoint( 0 ); - MUS_LOG_TDESC( "mus: [MUSAVA] SIP Address: ", - sipAddress ) - aContactsArray->AppendL( sipAddress ); - retval = ETrue; - } else { - MUS_LOG( "mus: [MUSAVA] Phone number or SIP URL not found " ) + MUS_LOG( "mus: [MUSAVA] Phone number not found " ) retval = EFalse; } MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ @@ -175,12 +310,575 @@ return retval; } + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::ContactL( + CContactIdArray*& aContactIdArray, + CPbkContactEngine& aPbkContactEngine ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::ContactL()" ) + CPbkContactItem* pbkContactItem = NULL; + + TInt conRes = EFalse; + + TInt err = ContactArrayL( aContactIdArray, aPbkContactEngine ); + if ( !err ) + { + err = ContactItem( *aContactIdArray, pbkContactItem, aPbkContactEngine ); + // NOTE: KErrNotSupported means there is more than one contact id. + if ( err == KErrNotSupported ) + { + iSettings.SetContactId( KErrNotSupported ); + conRes = ETrue; + } + else if( err != KErrNone ) + { + MUS_LOG( "mus: [MUSAVA] No contact item found; contact id = \ + KErrNotFound" ) + conRes = EFalse; + } + else + { + TContactItemId itemId = pbkContactItem->Id(); + MUS_LOG1( "mus: [MUSAVA] Setting contact id to be %d", + itemId ) + CleanupStack::PushL( pbkContactItem ); + iSettings.SetContactId( itemId ); + UpdateContactNameL( pbkContactItem->ContactItem() ); + CleanupStack::Pop( pbkContactItem ); + conRes = ETrue; + } + } + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ContactL return %d", conRes ) + + delete pbkContactItem; + pbkContactItem = NULL; + + return conRes; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +void CMusAvaContactAvailability::UpdateContactNameL( + CContactItem& aContactItem ) + { + MUS_LOG( "mus: [MUSAVA ] -> CMusAvaContactAvailability::\ + UpdateContactName" ) + //TBuf givenName; + //TBuf familyName; + + HBufC* givenName = NULL; + HBufC* familyName = NULL; + + delete iContactName; + iContactName = NULL; + iContactName = HBufC::NewL( 0 ); + + CContactItemFieldSet& fieldSet = aContactItem.CardFields(); + + TInt pos = fieldSet.Find( KUidContactFieldGivenName ); + if ( pos != KErrNotFound ) + { + CContactItemField& itemField = fieldSet[pos]; + //givenName = HBufC::NewL( itemField.TextStorage()->Text().Length() ); + + //givenName.Copy( itemField.TextStorage()->Text().Alloc() ); + givenName = itemField.TextStorage()->Text().AllocLC(); + + } + else + { + //givenName = KMusEmptyStringSymbol; + givenName = KMusEmptyStringSymbol().AllocLC(); + } + + pos = fieldSet.Find( KUidContactFieldFamilyName ); + if ( pos != KErrNotFound ) + { + CContactItemField& itemField = fieldSet[pos]; + //familyName = HBufC::NewL( itemField.TextStorage()->Text().Length() ); + //familyName.Copy( field.TextStorage()->Text() ); + familyName = itemField.TextStorage()->Text().AllocLC(); + } + else + { + familyName = KMusEmptyStringSymbol().AllocLC(); + } + + TInt strLength = NULL; + TBool bothNames = givenName->Length() > 0 && familyName->Length() > 0; + + if ( bothNames ) + { + strLength = givenName->Length() + + KMusSpaceSymbol().Length() + + familyName->Length(); + } + else + { + strLength = givenName->Length() + familyName->Length(); + } + + if ( strLength > iContactName->Length() ) + { + iContactName = iContactName->ReAllocL( strLength ); + } + + if ( strLength > 0 ) + { + TPtr ptr = iContactName->Des(); + if ( iBeginWithFirstName ) + { + if ( bothNames ) + { + ptr.Append( givenName->Des() ); + ptr.Append( KMusSpaceSymbol ); + ptr.Append( familyName->Des() ); + } + else + { + ptr.Append( givenName->Des() ); + ptr.Append( familyName->Des() ); + } + } + else + { + if ( bothNames ) + { + ptr.Append( familyName->Des() ); + ptr.Append( KMusSpaceSymbol ); + ptr.Append( givenName->Des() ); + } + else + { + ptr.Append( familyName->Des() ); + ptr.Append( givenName->Des() ); + } + } + } + + CleanupStack::PopAndDestroy( familyName ); + CleanupStack::PopAndDestroy( givenName ); + + TRAP_IGNORE( iSettings.SetContactNameL( iContactName->Des() ) ) + + MUS_LOG( "mus: [MUSAVA ] <- CMusAvaContactAvailability::\ + UpdateContactName" ) + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TInt CMusAvaContactAvailability::ContactArrayL( + CContactIdArray*& aContactIdArray, + CPbkContactEngine& aPbkContactEngine ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::ContactArrayL()" ) + + const TDesC& phoneNumber = iSettings.TelNumber(); + TInt retval = KErrNotFound; + + if ( phoneNumber.Length() > 0 ) + { + MUS_LOG( "mus: [MUSAVA] Phone number found " ) + // Instantiate a PhonebookContactEngine object, which represents a + // connection to the Phonebook contact database: + #ifdef UNIT_TESTING // if unit testing + EUNIT_DISABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + CContactIdArray* tmpContactIdArray = + aPbkContactEngine.MatchPhoneNumberL( + phoneNumber, + KNumberMatchingDigitsRequired ); + #ifdef UNIT_TESTING // if unit testing + EUNIT_ENABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + if ( tmpContactIdArray->Count() > 0 ) + { + aContactIdArray = tmpContactIdArray; + retval = KErrNone; + } + else + { + tmpContactIdArray->Reset(); + delete tmpContactIdArray; + MUS_LOG( + "mus: [MUSAVA] Phone number not found in CPbkContactEngine" ) + } + } + else + { + MUS_LOG( "mus: [MUSAVA] Phone number not found " ) + } + + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ContactArrayL return %d", retval ) + + return retval; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TInt CMusAvaContactAvailability::ContactItem( + CContactIdArray& aContactIdArray, + CPbkContactItem*& aPbkContactItem, + CPbkContactEngine& aPbkContactEngine ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::ContactItem()" ) + CPbkContactItem* pbkItem = NULL; + TInt retval = KErrNotFound; + TInt contactIdsCount = aContactIdArray.Count(); + + if( contactIdsCount > 1 ) + { + // NOTE: KErrNotSupported means there is more than one contact id. + MUS_LOG( "mus: [MUSAVA] More than one Contact ID found." ) + retval = KErrNotSupported; + } + else if ( contactIdsCount == 1 ) + { + // Contact card whose phone number matches that of the other party + // was found. The ID(s) of the contacts are recorded in iIdArray. + MUS_LOG( "mus: [MUSAVA] Contact ID found." ) + + TContactItemId itemId( KErrNotFound ); + + MUS_LOG1( "mus: [MUSAVA] ID array has <%d> elements", + contactIdsCount ) + // iterate through the contact cards we consider as belonging to + // the other party, that is, those saved in iIdArray: + for ( TInt i = 0; i < contactIdsCount; i++ ) + { + itemId = ( aContactIdArray )[i]; + MUS_LOG2( "mus: [MUSAVA] Current array index == <%d>, \ + contact ID == <%d>", i, itemId ) + TRAPD( pbkFailure, pbkItem = + aPbkContactEngine.ReadContactL( itemId ) ); + + if ( pbkFailure ) + { + // Contact lookup failed. + MUS_LOG1( "mus: [MUSAVA] Leave code <%d> occurred at call \ + of ReadContactL.", pbkFailure ) + } + else + { + aPbkContactItem = pbkItem; + retval = KErrNone; + } + } + } + else + { + MUS_LOG( "mus: [MUSAVA] No contact card whose phone number\ + matches that of the other party" ) + } + + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ContactItem() return %d", retval ) + + return retval; + } + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::PhoneResolutionL( CPbkContactItem& aPbkItem, + CDesCArrayFlat*& aContactsArray ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::PhoneResolutionL()" ) + TInt retval = ETrue; + if ( ResolvePhoneContactL( aPbkItem, aContactsArray ) ) + { + MUS_LOG( "mus: [MUSAVA] Stop Execution" ) + } + else + { + if ( ActiveCallL( aContactsArray ) ) + { + MUS_LOG( "mus: [MUSAVA] Stop Execution" ) + } + else + { + MUS_LOG( "mus: [MUSAVA] Stop Execution" ) + retval = EFalse; + } + } + + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + PhoneResolutionL() return %d", retval ) + return retval; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::ContactId( CPbkContactItem& aPbkItem, + TPbkFieldId aTPbkFieldId ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::ContactId()" ) + + CPbkFieldArray& fieldArray = aPbkItem.CardFields(); + TPbkContactItemField itemField; + TBool returnValue = EFalse; + + // Get the number of detail fields of the phonebook contact item. + const TInt fieldCount( fieldArray.Count() ); + + for ( TInt index = 0; index < fieldCount && returnValue == EFalse; + index++ ) + { + itemField = fieldArray.At( index ); + + if ( itemField.FieldInfo().Match( aTPbkFieldId ) && + itemField.Text().Find( KMusAvaAtSign() ) != KErrNotFound ) + { + returnValue = ETrue; + MUS_LOG( "mus: [MUSAVA] Contact id found" ) + } + } + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ContactId() return %d", returnValue ) + return returnValue; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TPbkFieldId CMusAvaContactAvailability::ContactIdSearch( + CContactIdArray& aContactIdArray, + CPbkContactEngine& aPbkContactEngine ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::\ + ContactIdSearch()" ) + + TInt contactIdsCount = aContactIdArray.Count(); + MUS_LOG1( "mus: [MUSAVA] aContactIdArray.Count %d", \ + contactIdsCount ) + + CPbkContactItem* pbkItem = NULL; + TPbkFieldId retFieldId = EPbkFieldIdNone; + + for ( TInt i = 0; + i < contactIdsCount && retFieldId == EPbkFieldIdNone; + i++ ) + { + MUS_LOG1( "mus: [MUSAVA] i %d", i ) + TContactItemId itemId( KErrNotFound ); + itemId = ( aContactIdArray )[i]; + + #ifdef UNIT_TESTING // if unit testing + EUNIT_DISABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + TRAPD( error, pbkItem = aPbkContactEngine.ReadContactL( itemId ) ) + #ifdef UNIT_TESTING // if unit testing + EUNIT_ENABLE_ALLOC_DECORATOR; + #endif // UNIT_TESTING + if ( error != KErrNone ) + { + return retFieldId; + } + if ( ContactId( *pbkItem, EPbkFieldIdShareView ) ) + { + MUS_LOG( "mus: [MUSAVA] Contact have a prefix = \ + EPbkFieldIdShareView" ) + delete pbkItem; + retFieldId = EPbkFieldIdShareView; + } + else if ( ContactId( *pbkItem, EPbkFieldIdSIPID ) ) + { + MUS_LOG( "mus: [MUSAVA] Contact have a prefix = \ + EPbkFieldIdSIPID" ) + delete pbkItem; + retFieldId = EPbkFieldIdSIPID; + } + else if ( ContactId( *pbkItem, EPbkFieldIdPhoneNumberGeneral ) ) + { + // this part never run!!!! + MUS_LOG( "mus: [MUSAVA] Contact have a prefix = \ + EPbkFieldIdPhoneNumberGeneral" ) + delete pbkItem; + retFieldId = EPbkFieldIdPhoneNumberGeneral; + } + else + { + MUS_LOG( "mus: [MUSAVA] Contact have no prefix " ) + delete pbkItem; + } + } + return retFieldId; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::ResolveAddressesL( CPbkContactItem& aPbkItem, + CDesCArrayFlat*& aContactsArray, + TPbkFieldId aTPbkFieldId ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::\ + ResolveAddressesL()" ) + + CPbkFieldArray& fieldArray = aPbkItem.CardFields(); + TPbkContactItemField itemField; + HBufC* tmpDescriptor( NULL ); + TBool returnValue( EFalse ); + + // Get the number of detail fields of the phonebook contact item. + const TInt fieldCount( fieldArray.Count() ); + + for ( TInt index = 0; index < fieldCount; index++ ) + { + itemField = fieldArray.At( index ); + + if ( itemField.FieldInfo().Match( aTPbkFieldId ) && + itemField.Text().Find( KMusAvaAtSign() ) != KErrNotFound && + ( iOperatorVariant != MusSettingsKeys::EOperatorSpecific || + itemField.Text().Find( KMusAvaTestString() ) != KErrNotFound ) ) + { + returnValue = ETrue; + MUS_LOG( "mus: [MUSAVA] Contact id found" ) + + HBufC* sipAddress; + if ( iOperatorVariant == MusSettingsKeys::EOperatorSpecific ) + { + sipAddress = HBufC::NewLC( itemField.Text().Length() - + KMusAvaTestString().Length() ); + TInt pos = itemField.Text().Find( KMusAvaTestString() ); + sipAddress->Des().Append( itemField.Text().Left( pos ) ); + sipAddress->Des().Append( itemField.Text().Right( + itemField.Text().Length() - + pos - KMusAvaTestString().Length() ) ); + } + else + { + sipAddress = itemField.Text().AllocLC(); + } + + if ( sipAddress->Find( KMusAvaSip() ) == KErrNotFound ) + { + // No, it doesn't, so add the prefix to the new address. + MUS_LOG( "mus: [MUSAVA] Prefix to the new address is added" ) + tmpDescriptor = HBufC::NewLC( KMusAvaSip().Length() + + sipAddress->Length() ); + tmpDescriptor->Des().Append( KMusAvaSip() ); + tmpDescriptor->Des().Append( *sipAddress ); + // if multiple contact have same phone number then + // sip address can be repeated . To avoid this check + // whether sip address exist already in array + // it not exist then add it to array. + if(! IsExistAlready(*aContactsArray,*tmpDescriptor)) + { + aContactsArray->AppendL( *tmpDescriptor ); + } + CleanupStack::PopAndDestroy( tmpDescriptor ); + } + else + { + MUS_LOG( "mus: [MUSAVA] Contact have a prefix" ) + // if multiple contact have same phone number then + // sip address can be repeated . To avoid this check + // whether sip address exist already in array + // it not exist then add it to array. + if(! IsExistAlready(*aContactsArray,*sipAddress)) + { + aContactsArray->AppendL( *sipAddress ); + } + } + + CleanupStack::PopAndDestroy( sipAddress ); + } + } + MUS_LOG1( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ResolveAddressesL() return %d", returnValue ) + return returnValue; + } + + +// ------------------------------------------------------------------------- +// +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::ResolvePhoneContactL( + CPbkContactItem& aPbkItem, + CDesCArrayFlat*& aContactsArray ) + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaContactAvailability::\ + ResolvePhoneContactL()" ) + CPbkFieldArray& fieldArray = aPbkItem.CardFields(); + TPbkContactItemField itemField; + HBufC* tmpDescriptor( NULL ); + TBool returnValue = EFalse; + + // Get the number of detail fields of the phonebook contact item. + const TInt fieldCount( fieldArray.Count() ); + + for ( TInt index = 0; index < fieldCount; index++ ) + { + itemField = fieldArray.At( index ); + + if ( itemField.FieldInfo().IsPhoneNumberField() && + ( iOperatorVariant == MusSettingsKeys::EOperatorSpecific || + itemField.Text().Left(1) == KMusAvaPlus() ) ) + { + MUS_LOG( "mus: [MUSAVA] Contact id found" ) + // No, it doesn't, so add the prefix to the new address. + MUS_LOG( "mus: [MUSAVA] Prefix to the new address is added" ) + tmpDescriptor = HBufC::NewLC( KMusAvaTel().Length() + + itemField.Text().Length() ); + tmpDescriptor->Des().Append( KMusAvaTel() ); + tmpDescriptor->Des().Append( itemField.Text() ); + aContactsArray->AppendL( *tmpDescriptor ); + CleanupStack::PopAndDestroy( tmpDescriptor ); + returnValue = ETrue; + } + } + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaContactAvailability::\ + ResolvePhoneContactL()" ) + return returnValue; + } + + MMusAvaObserver::TAvailabilityName CMusAvaContactAvailability::Name() { return MMusAvaObserver::EMusAvaNameContactStatus; } - - -// End of file +// ------------------------------------------------------------------------- +// Checks that whether aDesItem present in aDesArray. +// Utility function used to avoid dublication. +// ------------------------------------------------------------------------- +// +TBool CMusAvaContactAvailability::IsExistAlready(const MDesCArray& aDesArray, + const TDesC& aDesItem) + { + for ( TInt i=0;i