mmsharing/mmshui/src/musuicontactutil.cpp
branchRCL_3
changeset 23 bc78a40cd63c
parent 0 f0cf47e981f9
--- /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