--- /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 <RPbkViewResourceFile.h> // Phonebook view resource
+#include <CPbkContactEditorDlg.h>
+#include <CPbkFieldsInfo.h>
+#include <TPbkContactItemField.h>
+
+#include <cntdb.h>
+#include <cntitem.h>
+#include <cntfield.h>
+#include <cntdef.h>
+#include <cntfldst.h>
+#include <CPbkContactEngine.h>
+#include <apgtask.h>
+
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+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