diff -r 73a1feb507fb -r bc78a40cd63c mmsharing/mmshui/src/musuicontactutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshui/src/musuicontactutil.cpp Wed Sep 01 12:31:01 2010 +0100 @@ -0,0 +1,388 @@ +/* +* 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: +* +*/ + + +#include "musuicontactutil.h" +#include "musuidefinitions.h" +#include "muslogger.h" +#include "musenguriparser.h" +#include "musuid.hrh" + +#include // Phonebook view resource +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool MusUiContactUtil::ShareViewFieldExistsL( CCoeEnv& aEnv, TInt aContactId ) + { + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::ShareViewFieldExistsL" ); + + TBool ret( EFalse ); + + RPbkViewResourceFile pbkResourceFile( aEnv ); + CleanupClosePushL( pbkResourceFile ); + pbkResourceFile.OpenL(); + CPbkContactEngine* pbkContactEngine = CPbkContactEngine::NewL(); + CleanupStack::PushL( pbkContactEngine ); + CPbkContactItem* contactItem = NULL; + CleanupStack::PushL( contactItem ); + if ( aContactId > 0 ) + { + contactItem = pbkContactEngine->OpenContactL( aContactId ); + if ( contactItem->FindField( EPbkFieldIdShareView ) ) + { + MUS_LOG( "mus: [MUSUI ] EPbkFieldIdShareView found!!" ); + ret = ETrue; + } + else if ( contactItem->FindField( EPbkFieldIdSIPID ) ) + { + MUS_LOG( "mus: [MUSUI ] EPbkFieldIdSIPID found, NOT EPbkFieldIdShareView defined!!!" ); + ret = ETrue; + } + else + { + ret = EFalse; + } + } + else + { + ret = EFalse; + } + CleanupStack::PopAndDestroy( 3 ); // contactItem, pbkContactEngine, &pbkResourceFile + MUS_LOG( "mus: [MUSUI ] <- MusUiContactUtil::ShareViewFieldExistsL" ); + return ret; + + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool MusUiContactUtil::CheckPbContactForVSAddressesL( CCoeEnv& aEnv, + const TDesC& aOriginator, + TInt aContactId) +{ + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::CheckPbContactForVSAddressesL" ); + + TBool sipAddrMatches(EFalse); + TBool shareViewAddrMatches(EFalse); + TBool ret(EFalse); + + if(MatchTextWithPbFieldsL(aEnv, EPbkFieldIdSIPID, aOriginator, aContactId)) + { + sipAddrMatches=ETrue; + } + if(MatchTextWithPbFieldsL(aEnv, EPbkFieldIdShareView, aOriginator, aContactId)) + { + shareViewAddrMatches=ETrue; + } + + if(aOriginator.Find(KMusPrefixSipUri) != KErrNotFound) + { + //pb field without sip:-prefix are checked. + HBufC * withoutPrefix; + withoutPrefix = HBufC::NewLC(aOriginator.Length()); + *withoutPrefix = aOriginator; + TPtr ptr = withoutPrefix->Des(); + ptr.Delete(0,KMusPrefixMaxLength); + + if(MatchTextWithPbFieldsL(aEnv, EPbkFieldIdSIPID, *withoutPrefix, aContactId)) + { + sipAddrMatches=ETrue; + } + if(MatchTextWithPbFieldsL(aEnv, EPbkFieldIdShareView, *withoutPrefix, aContactId)) + { + shareViewAddrMatches=ETrue; + } + + CleanupStack::PopAndDestroy(withoutPrefix); + } + + if(sipAddrMatches||shareViewAddrMatches) + { + ret=ETrue; + } + else + { + ret=EFalse; + } + + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::CheckPbContactForVSAddressesL" ); + return ret; +} +// ----------------------------------------------------------------------------- +// @function MatchTextWithPbFieldsL +// searches all contactId´s fieldIds of same type for a text +// returns ETrue if text is found from at least one of them. +// ----------------------------------------------------------------------------- +// +TBool MusUiContactUtil::MatchTextWithPbFieldsL( CCoeEnv& aEnv, + TPbkFieldId aFieldId, + const TDesC& aText, + TInt aContactId ) +{ + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::MatchTextWithPbFieldsL" ); + + TBool textMatch(EFalse); + + RPbkViewResourceFile pbkResourceFile(aEnv); + CleanupClosePushL( pbkResourceFile ); + pbkResourceFile.OpenL(); + CPbkContactEngine* pbkContactEngine = CPbkContactEngine::NewL(); + CleanupStack::PushL( pbkContactEngine ); + CPbkContactItem* contactItem = NULL; + CleanupStack::PushL( contactItem ); + + if ( aContactId > 0 ) + { + contactItem = pbkContactEngine->OpenContactL( aContactId ); + + TInt index(0); + + while(index!=KErrNotFound) + { + TPbkContactItemField* contactItemField = + contactItem->FindField( aFieldId, index ); + + if( contactItemField ) + { + if( contactItemField->Text() == aText && !textMatch ) + { + textMatch=ETrue; + } + } + + if( index != KErrNotFound ) + { + index++; + } + } + + } + + CleanupStack::PopAndDestroy( 3 ); // contactItem, pbkContactEngine, &pbkResourceFile + + MUS_LOG( "mus: [MUSUI ] <- MusUiContactUtil::MatchTextWithPbFieldsL" ); + return textMatch; + +} +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void MusUiContactUtil::ActivateContactViewL( CCoeEnv& aEnv, + TContactItemId aId, + const TDesC& aTypedAddress, + const TDesC& aMusTelNumberValue ) + { + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::ActivateContactViewL" ); + RPbkViewResourceFile pbkResourceFile( aEnv ); + CleanupClosePushL( pbkResourceFile ); + pbkResourceFile.OpenL(); + CPbkContactEngine* pbkContactEngine = CPbkContactEngine::NewL(); + CleanupStack::PushL( pbkContactEngine ); + + CPbkContactItem* contactItem = NULL; + CleanupStack::PushL( contactItem ); + + if ( aId > 0 ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::ActivateContactViewL\ + TContactItemId > 0 => Opening Existing Contact..." ); + contactItem = pbkContactEngine->OpenContactL( aId ); + EditContactL( *contactItem, + EFalse, + pbkContactEngine, + aTypedAddress, + aMusTelNumberValue, + aId ); + } + else + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::ActivateContactViewL\ + TContactItemId < 1 => Creating new Contact..." ); + contactItem = pbkContactEngine->CreateEmptyContactL(); + EditContactL( *contactItem, + ETrue, + pbkContactEngine, + aTypedAddress, + aMusTelNumberValue, + aId ); + } + + CleanupStack::PopAndDestroy( 3 ); // contactItem, pbkContactEngine, &pbkResourceFile + MUS_LOG( "mus: [MUSUI ] <- MusUiContactUtil::ActivateContactViewL" ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void MusUiContactUtil::EditContactL( CPbkContactItem& aContact, + TBool aNewOne, + CPbkContactEngine* aPbkContactEngine, + const TDesC& aTypedAddress, + const TDesC& aMusTelNumberValue, + TContactItemId aContactId ) + { + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::EditContactL" ); + + TMusEngUriParser parser( aTypedAddress ); + parser.ParseUriL(); + HBufC* uri = NULL; + CleanupStack::PushL( uri ); + + CContactTextField* addressField = NULL; + CleanupStack::PushL( addressField ); + + if ( parser.UriType() == TMusEngUriParser::ESip ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL\ + parser.UriType() == TMusEngUriParser::ESip" ); + addressField = EditableContactFieldL( + aContact, + EPbkFieldIdShareView, + aPbkContactEngine ); + uri = parser.GetUri16L( ETrue ); + } + else if ( parser.UriType() == TMusEngUriParser::ETel ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL\ + parser.UriType() == TMusEngUriParser::ETel" ); + addressField = EditableContactFieldL( + aContact, + EPbkFieldIdPhoneNumberMobile, + aPbkContactEngine ); + uri = parser.GetUri16L( EFalse ); + } + + if ( addressField ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL\ + addressField OK" ); + addressField->SetTextL( *uri ); + } + + if ( ( aMusTelNumberValue.Length() > 0 ) && aContactId == KErrNotFound ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL\ + !iPhoneNumberFieldFound" ); + CContactTextField* phoneNumberField = EditableContactFieldL( + aContact, + EPbkFieldIdPhoneNumberMobile, + aPbkContactEngine ); + if ( phoneNumberField ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL\ + phoneNumberField OK" ); + phoneNumberField->SetTextL( aMusTelNumberValue ); + } + } + + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditContactL: Creating dialog..." ); + + // Bring MuSh UI foreground + RWsSession wsSession; + User::LeaveIfError( wsSession.Connect() ); + CleanupClosePushL( wsSession ); + TApaTaskList taskList( wsSession ); + TUid appUid; + appUid.iUid = KMusUiUid; + TApaTask task = taskList.FindApp( appUid ); + task.BringToForeground(); + CleanupStack::PopAndDestroy( &wsSession ); + + // Launch pbk new entry editor dlg + CPbkContactEditorDlg* editorDlg = CPbkContactEditorDlg::NewL( + *aPbkContactEngine, + aContact, + aNewOne, + -1, // Move focus to the topmost field + ETrue ); + editorDlg->ResetWhenDestroyed( &editorDlg ); + editorDlg->HideExitCommand(); + editorDlg->ExecuteLD(); + + CleanupStack::Pop( 2 ); // uri, addressField + + MUS_LOG( "mus: [MUSUI ] <- MusUiContactUtil::EditContactL" ); + } + + +// ----------------------------------------------------------------------------- +// Get editable contact field. +// ----------------------------------------------------------------------------- +// +CContactTextField* MusUiContactUtil::EditableContactFieldL( + CPbkContactItem& aContact, + TInt aFieldId, + CPbkContactEngine* aPbkContactEngine ) + { + MUS_LOG( "mus: [MUSUI ] -> MusUiContactUtil::EditableContactFieldL" ); + + // Get fields info from pbk engine + const CPbkFieldsInfo& fieldsInfo = aPbkContactEngine->FieldsInfo(); + + // Try to get the SIP URI storage field for this contact + TPbkContactItemField* itemField = aContact.FindField( aFieldId ); + + if ( !itemField ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditableContactFieldL: !itemField" ); + CPbkFieldInfo* fieldInfo = fieldsInfo.Find( aFieldId ); + // Add field to this contact + if ( fieldInfo ) + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditableContactFieldL\ + fieldInfo OK" ); + // Contact takes ownership of the field. + aContact.AddFieldL( *fieldInfo ); + itemField = aContact.FindField( aFieldId ); + return ( itemField ) ? itemField->TextStorage() : NULL; + } + else + { + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditableContactFieldL\ + fieldInfo == NULL" ); + return NULL; + } + } + else + { + // Does not pass ownership. + MUS_LOG( "mus: [MUSUI ] MusUiContactUtil::EditableContactFieldL\ + itemField OK" ); + return itemField->TextStorage(); + } + } + + +// end of file