phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherlpadmodel.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccacommlauncherplugin/src/ccappcommlauncherlpadmodel.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1490 @@
+/*
+* Copyright (c) 2008 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:  Class for handlind the launchpad related data
+*
+*/
+
+
+#include "ccappcommlauncherheaders.h"
+#include <phonebook2ece.mbg>
+
+#include <CPbk2ApplicationServices.h>
+#include <CPbk2ServiceManager.h>
+
+#include <aknlayoutscalable_avkon.cdl.h>
+//SpSettings
+#include <spsettings.h>
+#include <spentry.h>
+#include <mnproviderfinder.h>
+#include <StringLoader.h>
+
+#include <spproperty.h>
+#include <spnotifychange.h>
+
+//Bitmap
+#include <bitdev.h> 
+#include <cbsbitmap.h>
+#include <AknIconUtils.h>
+
+
+namespace {
+
+#define KOneVOIPServiceAvailable    1
+#define KVOIPButtonImageSet         0x1
+#define KVOIPButtonTextSet          0x2
+const TText KCCASpaceChar = ' ';
+
+/**
+ * Compares entry service name to scheme.
+ *
+ * @param aEntry entry to be analyzed
+ * @param aScheme to be compared with
+ */
+TBool CompareService(CSPEntry& aEntry, const TDesC& aScheme)
+    {
+    const TDesC& name = aEntry.GetServiceName();
+    if (name.CompareF(aScheme) == KErrNone)
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+TPtrC ParseService(const TDesC& aData)
+    {
+    TPtrC result = KNullDesC();
+    TInt index = aData.Locate(':');
+    if (index > 0)
+        {
+        result.Set(aData.Left(index));
+        }
+    return result;
+    }
+
+/**
+ * Returns index of a first IM field.
+ */
+TInt SelectIMIndexL(const CCmsContactField& aContactField)
+    {
+    TInt result = 0; // by default returns 0
+    CSPSettings* settings = CSPSettings::NewLC();
+    RIdArray idArray;
+    TBool found = EFalse;
+    CleanupClosePushL(idArray);
+
+    TInt error = settings->FindServiceIdsL(idArray);
+    if (error == KErrNone)
+        {
+        for (TInt i = 0; !found && i < idArray.Count(); ++i)
+            {
+            CSPEntry* entry = CSPEntry::NewLC();
+            settings->FindEntryL(idArray[i], *entry);
+
+            const CSPProperty* prop = NULL;
+            if (entry->GetProperty(prop, ESubPropertyIMLaunchUid) == KErrNone)
+                {
+                for (TInt i = 0; i < aContactField.ItemCount(); ++i)
+                    {
+                    const CCmsContactFieldItem& item = aContactField.ItemL(i);
+                    TPtrC data = item.Data();
+                    TPtrC scheme = ParseService(data);
+                    if (CompareService(*entry, scheme))
+                        {
+                        result = i;
+                        found = ETrue;
+                        break;
+                        }
+                    }
+                }
+            CleanupStack::PopAndDestroy(); // entry
+            }
+        }
+
+    CleanupStack::PopAndDestroy(2); // idArray, settings
+    return result;
+    }
+/**
+ * Clones the Bitmap
+ * This is better than Duplicating the bitmap
+ */
+CFbsBitmap* CloneBitmapLC(TSize aSize, CFbsBitmap* aBitmap)
+    {
+    CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
+    CleanupStack::PushL( bitmap );
+    bitmap->Create( aSize, aBitmap->DisplayMode() );
+    CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL( bitmap );
+    CleanupStack::PushL( bitmapDevice );
+    CFbsBitGc* graphicsContext = NULL; 
+    User::LeaveIfError( bitmapDevice->CreateContext( graphicsContext ) ); 
+    CleanupStack::PushL( graphicsContext );
+    graphicsContext->BitBlt( TPoint(0, 0), aBitmap );            
+    CleanupStack::PopAndDestroy( 2 );//graphicsContext,bitmapDevice
+    return bitmap;
+    }
+           
+
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::CCCAppCommLauncherLPadModel
+// ---------------------------------------------------------------------------
+//
+CCCAppCommLauncherLPadModel::CCCAppCommLauncherLPadModel(
+    CCCAppCommLauncherContainer& aContainer, 
+    CEikListBox& aListBox,
+    CCCAppCommLauncherPlugin& aPlugin )
+    :
+    iContainer ( aContainer ),
+    iPerfLauncherCalled(EFalse),
+    iCoeEnv(*CCoeEnv::Static()),
+    iListBox(aListBox),
+    iPlugin(aPlugin)
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L("CCCAppCommLauncherLPadModel::CCCAppCommLauncherLPadModel"));
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::~CCCAppCommLauncherLPadModel
+// ---------------------------------------------------------------------------
+//
+CCCAppCommLauncherLPadModel::~CCCAppCommLauncherLPadModel()
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L("->CCCAppCommLauncherLPadModel::~CCCAppCommLauncherLPadModel"));
+    
+    if(iSPNotifyChange)
+        {
+        iSPNotifyChange->NotifyChangeCancel();
+        }
+    
+    delete iSPNotifyChange;    
+    delete iSettings;
+        
+    delete iPbkCmd;
+    
+    iButtonDataArray.Reset();
+    delete iTempText;
+    iAddressFields.Close();
+    
+    
+    delete iTextBuf;
+    
+    CCA_DP( KCommLauncherLogFile, CCA_L("<-CCCAppCommLauncherLPadModel::~CCCAppCommLauncherLPadModel"));
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::NewL
+// ---------------------------------------------------------------------------
+//
+CCCAppCommLauncherLPadModel* CCCAppCommLauncherLPadModel::NewL(
+    CCCAppCommLauncherContainer& aContainer, CEikListBox& aListBox, CCCAppCommLauncherPlugin& aPlugin )
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L("->CCCAppCommLauncherLPadModel::NewL"));
+    CCCAppCommLauncherLPadModel* self =
+        new( ELeave ) CCCAppCommLauncherLPadModel( aContainer, aListBox, aPlugin );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    CCA_DP( KCommLauncherLogFile, CCA_L("<-CCCAppCommLauncherLPadModel::NewL"));
+    return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::ConstructL()
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L("CCCAppCommLauncherLPadModel::ConstructL"));
+    iTempText = HBufC::NewL( KCCAppCommLauncherMaxButtonDataTextLength );
+    iTextBuf = HBufC::NewL( KCCAppCommLauncherMaxButtonDataTextLength );
+    iAddressFields.Close();
+    iButtonIconArray = new (ELeave) CAknIconArray( 2 );
+    iAddressesValidated = EFalse;
+    iPbkCmd = CCCAppCommLauncherPbkCmd::NewL( iPlugin );
+    iSettings = CSPSettings::NewL();    
+    iSPNotifyChange = CSPNotifyChange::NewL(*this);
+    RIdArray idArray;
+    CleanupClosePushL(idArray);    
+    User::LeaveIfError( iSettings->FindServiceIdsL(idArray) );    
+    //Listen for any changes to these settings
+    iSPNotifyChange->NotifyChangeL( idArray );    
+    CleanupStack::PopAndDestroy(); //idArray 
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::MdcaCount
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppCommLauncherLPadModel::MdcaCount() const
+    {
+    return iButtonDataArray.Count();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::MdcaPoint
+// ---------------------------------------------------------------------------
+//
+TPtrC CCCAppCommLauncherLPadModel::MdcaPoint( TInt aIndex ) const
+    {
+    TPtr tempText = iTempText->Des();
+    tempText.Zero();
+
+    if ( iButtonDataArray.Count() > aIndex )
+        {
+        TPtr textPtr(iTextBuf->Des());
+        textPtr.Zero();
+        textPtr.Copy(iButtonDataArray[ aIndex ].iPopupText);
+        if ( iButtonDataArray[ aIndex ].iClipFromBegining )
+        	{
+        	// Clip for second row text
+        	ClipFromBeginning( textPtr, aIndex, 2 );
+        	}
+        
+        tempText.AppendNum( MapCommMethodToIcon(
+            iButtonDataArray[ aIndex ].iContactAction ));
+        tempText.Append( KColumnListSeparator );
+        tempText.Append( iButtonDataArray[ aIndex ].iText );      
+        tempText.Append( KColumnListSeparator );  
+        tempText.Append( textPtr );
+        tempText.Append( KColumnListSeparator ); 
+        
+        // Check if show multi icon at the right end of second row
+        if ( IfShowMultiIcon( aIndex ) )
+        	{
+        	tempText.AppendNum( EMultiIconIndex );
+        	tempText.Append( KColumnListSeparator );  
+        	}  
+        }
+
+    return tempText;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::MapCommMethodToIcon
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppCommLauncherLPadModel::MapCommMethodToIcon(
+    VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction ) const
+    {
+    TInt iconIndex = KErrNotFound;
+
+    switch( aContactAction )
+        {
+        case VPbkFieldTypeSelectorFactory::EVoiceCallSelector:
+           iconIndex = ECallIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EUniEditorSelector:
+           iconIndex = EMsgIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EEmailEditorSelector:
+           iconIndex = EEmailIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+           iconIndex = EVoipIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EInstantMessagingSelector:
+           iconIndex = EInstMsgIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EURLSelector:
+           iconIndex = EUrlIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EVideoCallSelector:
+           iconIndex = EVideocallIconIndex;
+           break;
+        case VPbkFieldTypeSelectorFactory::EFindOnMapSelector:        
+           if ( iAddressesValidated )
+               {
+               iconIndex = EAddressValIconIndex;
+               }
+           else
+               {
+               iconIndex = EAddressNotValIconIndex;
+               }
+           break;
+        default:
+        break;
+        }
+
+    return iconIndex;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::FillButtonArrayL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::FillButtonArrayL()
+    {
+    RArray<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>&
+        preferredCommMethods = iContainer.Plugin().PreferredCommMethods();//not owned
+    const TInt buttonCount = preferredCommMethods.Count();
+
+    for ( TInt i = 0; i < buttonCount; i++ )
+        {
+        const TInt numberOfAddresses =
+            iContainer.Plugin().ContactHandler().AddressAmount(
+                preferredCommMethods[i] );
+
+        if ( numberOfAddresses )
+            {
+            TBool isServiceAvailable =
+                iContainer.Plugin().ContactHandler().IsServiceAvailable(
+                    preferredCommMethods[i] );
+            if (isServiceAvailable)
+                {
+                if ( preferredCommMethods[i] ==
+                        VPbkFieldTypeSelectorFactory::EFindOnMapSelector )
+                	{
+
+                	AddressButtonL( numberOfAddresses, i );
+
+                	}
+                else
+                	{
+                    TCommLauncherButtonData buttonData = 
+                        TCommLauncherButtonData( preferredCommMethods[i] );
+                    ButtonTextL(preferredCommMethods[i], buttonData.iText);
+                    buttonData.iNumberOfAddresses = numberOfAddresses;
+                    iButtonDataArray.AppendL( buttonData );
+                	}
+                }
+            }
+        }    
+       
+    LoadIconArrayL();                
+    
+    //Load Specialised Voip Icons if only one voip service is available
+    //CCA spec will be updated with this necessary change
+    
+    //Usecase : If we have only one voip service, the voip(Internet Call)
+    //button should have the Branded Icon of that Service and the label
+    //must be "ServiceName" appended with "Call". 
+    //eg : If we have a service named SKYPE installed in the Phone
+    //and if SKYPE supports VOIP, then the VOIP Button Icon should be
+    //the Branded Icon of SKYPE and the Button Label should be 
+    //"SKYPE CALL". 
+    //If we have more than one voip service, then the VOIP button should
+    //show the default voip button EMbmPhonebook2eceQgn_prop_pb_comm_voip 
+    //(Globe with Phone) and the Button label should be r_qtn_cca_voip_call 
+    //as defined in the rss    
+    LoadVoipButtonInfoL();
+
+    // Update CBA with MSK "Select" if there are communication methods available.
+    TBool communicationMethodsAvailable = ( iButtonDataArray.Count() > 0 );
+    iContainer.Plugin().UpdateMSKinCbaL( communicationMethodsAvailable );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ButtonTextL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::ButtonTextL(
+    VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction,
+    TDes& aText)
+    {
+    TInt resId = KErrNotFound;
+    switch( aContactAction )
+        {
+        case VPbkFieldTypeSelectorFactory::EVoiceCallSelector:
+            resId = R_QTN_CCA_CALL;
+            break;
+        case VPbkFieldTypeSelectorFactory::EUniEditorSelector:
+            resId = R_QTN_CCA_MESSAGE;
+            break;
+        case VPbkFieldTypeSelectorFactory::EEmailEditorSelector:
+            resId = R_QTN_CCA_EMAIL;
+            break;
+        case VPbkFieldTypeSelectorFactory::EInstantMessagingSelector:
+            resId = R_QTN_CCA_CHAT;
+            break;
+        case VPbkFieldTypeSelectorFactory::EVOIPCallSelector:
+            resId = R_QTN_CCA_VOIP_CALL;
+            break;
+        case VPbkFieldTypeSelectorFactory::EURLSelector:
+            resId = R_QTN_CCA_URL;
+            break;
+        case VPbkFieldTypeSelectorFactory::EVideoCallSelector:
+            resId = R_QTN_CCA_VIDEO_CALL;
+            break;
+        case VPbkFieldTypeSelectorFactory::EFindOnMapSelector:        
+        	if ( iAddressesValidated )
+        		{
+        	    resId = R_QTN_PHOB_COMLAUNCHER_SHOW_ON_MAP;
+        		}
+        	else
+        		{
+                resId = R_QTN_PHOB_COMLAUNCHER_FIND_ON_MAP;
+        		}
+            break;
+        default:
+            break;
+        }
+
+    if ( KErrNotFound != resId )
+        {
+        aText.Copy( StringLoader::LoadLC( resId, &iCoeEnv )
+            ->Left( KCCAppCommLauncherMaxButtonDataTextLength ));
+        CleanupStack::PopAndDestroy();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ContactFieldFetchedNotifyL()
+// -----------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::ContactFieldFetchedNotifyL(
+    const CCmsContactField& aContactField )
+    {
+    const TInt count = iButtonDataArray.Count();
+    CCmsContactFieldItem::TCmsContactField dataType = aContactField.Type();
+    CCCAppCommLauncherContactHandler& contactHandler =
+        iContainer.Plugin().ContactHandler();//not owned
+
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EVoiceCallSelector ))
+        {// voice call
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EVoiceCallSelector, aContactField );
+            }
+
+        //PERFORMANCE LOGGING: 11. Phonenumber data received & consumed
+        WriteToPerfLog();
+
+        RunLaunchLogger();
+
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EUniEditorSelector ))
+        {// unieditor
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EUniEditorSelector, aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EEmailEditorSelector ))
+        {// email
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EEmailEditorSelector, aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EVOIPCallSelector ))
+        {// voip
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EVOIPCallSelector, aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EInstantMessagingSelector ))
+        {// im
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EInstantMessagingSelector, aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EURLSelector ))
+        {// url
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EURLSelector, aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EFindOnMapSelector ))
+        {// address
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL( i,
+            		VPbkFieldTypeSelectorFactory::EFindOnMapSelector,
+            		aContactField );
+            }
+        }
+    if ( contactHandler.ContactFieldTypeAndContactActionMatch( dataType,
+            VPbkFieldTypeSelectorFactory::EVideoCallSelector ))
+            {// video call
+        for ( TInt i = 0; i < count; i++ )
+            {
+            CheckPopupTextL(
+                i, VPbkFieldTypeSelectorFactory::EVideoCallSelector, aContactField );
+            }
+        }
+
+    // Presence data
+    if (dataType == CCmsContactFieldItem::ECmsPresenceData)
+        {// Presence is one of the most complex data types and
+        // not always working. TRAPping this is just a precaution
+        // to ensure that other fields are updated correctly to
+        // to the screen..
+        TRAP_IGNORE( ContactPresenceChangedL( aContactField ));
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::CheckPopupTextL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::CheckPopupTextL(
+    const TInt aButtonIndex,
+    const VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction,
+    const CCmsContactField& aContactField )
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L("CCCAppCommLauncherLPadModel::CheckPopupTextL"));
+    TCommLauncherButtonData& buttonData = iButtonDataArray[ aButtonIndex ];
+
+    if ( aContactAction == buttonData.iContactAction )
+        {
+        CCA_DP( KCommLauncherLogFile, CCA_L("buttonData.iContactAction: %d"), buttonData.iContactAction);
+
+        CCCAppCommLauncherContactHandler& contactHandler =
+            iContainer.Plugin().ContactHandler();//not owned
+        buttonData.iNumberOfAddresses =
+            contactHandler.AddressAmount( buttonData.iContactAction );
+
+        CCA_DP( KCommLauncherLogFile, CCA_L("buttonData.iNumberOfAddresses: %d"), buttonData.iNumberOfAddresses);
+
+        const CCmsContactFieldItem::TCmsDefaultAttributeTypes cmsDefault =
+            contactHandler.MapContactorTypeToCMSDefaultType( buttonData.iContactAction );
+
+
+        if ( contactHandler.ContactFieldTypeAndContactActionMatch(
+                    aContactField.Type(),
+                    VPbkFieldTypeSelectorFactory::EFindOnMapSelector ) )
+            {// addresses case is handled here
+            CheckAddressesPopupTextL(
+            		aButtonIndex, aContactAction, aContactField );
+            return;
+            }
+        
+        // has default, multiple entries
+        if ( aContactField.HasDefaultAttribute( cmsDefault ) && 1 < buttonData.iNumberOfAddresses )
+            {// has default, multiple entries
+            CCA_DP( KCommLauncherLogFile, CCA_L("aContactField.HasDefaultAttribute(): true"));
+
+            const CCmsContactFieldItem& item = aContactField.ItemL( cmsDefault );//not own
+            buttonData.iPopupText.Zero();
+            buttonData.iFlags |= TCommLauncherButtonData::EDefaultSet;
+            buttonData.iPopupText.Append(item.Data().Left(
+                KCCAppCommLauncherMaxButtonDataTextLength ));
+             
+            SetTextClipDirection(aContactAction, aButtonIndex);
+            }
+        
+        // no default, multiple entries
+        else if ( 1 < buttonData.iNumberOfAddresses
+                && !( buttonData.iFlags & TCommLauncherButtonData::EDefaultSet ))
+            {
+            CCA_DP( KCommLauncherLogFile, CCA_L("no default, multiple numbers"));
+
+            buttonData.iPopupText.Zero();
+				if ( contactHandler.IsItNumberAddress( aContactAction ))
+					{
+					if ( aContactAction == VPbkFieldTypeSelectorFactory::EUniEditorSelector )
+						{
+						// x numbers/addresses
+						buttonData.iPopupText.Append(*StringLoader::LoadLC(
+							R_QTN_CCA_MULTIPLE_NUMBERS_ADDRESSES, 
+							buttonData.iNumberOfAddresses,
+							&iCoeEnv));
+						}
+					else
+						{
+						// x numbers
+						buttonData.iPopupText.Append(*StringLoader::LoadLC(
+							R_QTN_CCA_MULTIPLE_NUMBERS,
+							buttonData.iNumberOfAddresses,
+							&iCoeEnv));
+						}
+					}
+				else if ( aContactAction == VPbkFieldTypeSelectorFactory::EInstantMessagingSelector )
+					{
+					buttonData.iPopupText.Append(*StringLoader::LoadLC(
+						R_QTN_CCA_MULTIPLE_ACCOUNTS,
+						buttonData.iNumberOfAddresses,
+						&iCoeEnv));
+					}
+				else
+					{
+					buttonData.iPopupText.Append(*StringLoader::LoadLC(
+						R_QTN_CCA_MULTIPLE_ADDRESSES,
+						buttonData.iNumberOfAddresses,
+						&iCoeEnv));
+					}
+				CleanupStack::PopAndDestroy();
+            }
+        
+        // one entry
+        else if ( 1 == buttonData.iNumberOfAddresses )
+            {
+            CCA_DP( KCommLauncherLogFile, CCA_L("one address"));
+            
+            SetTextClipDirection(aContactAction, aButtonIndex);
+
+                       
+            TInt index = 0; // by default select first
+            if ( aContactAction == VPbkFieldTypeSelectorFactory::EInstantMessagingSelector )
+                {
+                // in IM case IMPP field might contain voip and im service
+                // fields. Need to filter out voip fields in case of IM
+                // commmunication type             
+                index = SelectIMIndexL(aContactField);
+                }
+            
+            if ( aContactAction == VPbkFieldTypeSelectorFactory::EUniEditorSelector 
+                && buttonData.iPopupText.Length() > 0 
+                && aContactField.Type() != CCmsContactFieldItem::ECmsMobilePhoneGeneric
+                && aContactField.Type() != CCmsContactFieldItem::ECmsMobilePhoneHome
+                && aContactField.Type() != CCmsContactFieldItem::ECmsMobilePhoneWork )
+                {
+                // Already has a number
+                }
+            else
+                {
+                buttonData.iPopupText.Zero();
+                buttonData.iPopupText.Append(
+                    aContactField.ItemL( index ).Data().Left(
+                        KCCAppCommLauncherMaxButtonDataTextLength ));
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::LoadIconArrayL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::LoadIconArrayL()
+    {
+    // todo; currently icons are just temporary/hardcoded, but they
+    // could be loaded directly from resources (or dynamically based on
+    // what icons are needed).
+
+    // ECallIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_call,
+            EMbmPhonebook2eceQgn_prop_pb_comm_call_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EMsgIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_message,
+            EMbmPhonebook2eceQgn_prop_pb_comm_message_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EEmailIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+           EMbmPhonebook2eceQgn_prop_pb_comm_email,
+           EMbmPhonebook2eceQgn_prop_pb_comm_email_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EVoipIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_voip,
+            EMbmPhonebook2eceQgn_prop_pb_comm_voip_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EIMIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_chat,
+            EMbmPhonebook2eceQgn_prop_pb_comm_chat_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EUrlIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_url,
+            EMbmPhonebook2eceQgn_prop_pb_comm_url_mask ));
+    CleanupStack::Pop(); // icon
+
+    // EVideocallIconIndex
+    iButtonIconArray->AppendL( LoadIconLC(
+            EMbmPhonebook2eceQgn_prop_pb_comm_vcall,
+            EMbmPhonebook2eceQgn_prop_pb_comm_vcall_mask ));
+    CleanupStack::Pop(); // icon
+    
+    // EAddressValIconIndex
+	iButtonIconArray->AppendL( LoadIconLC(
+	        EMbmPhonebook2eceQgn_prop_pb_comm_valid_lm,
+	        EMbmPhonebook2eceQgn_prop_pb_comm_valid_lm_mask ));
+	CleanupStack::Pop(); // icon
+        
+	// EAddressNotValIconIndex
+	iButtonIconArray->AppendL( LoadIconLC(
+	        EMbmPhonebook2eceQgn_prop_pb_comm_no_valid_lm,
+	        EMbmPhonebook2eceQgn_prop_pb_comm_no_valid_lm_mask ));
+	CleanupStack::Pop(); // icon
+	
+	// EMultiIconIndex
+	iButtonIconArray->AppendL( LoadIconLC(
+			EMbmPhonebook2eceQgn_indi_many_items_add,
+			EMbmPhonebook2eceQgn_indi_many_items_add_mask ));
+	CleanupStack::Pop(); // icon
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::LoadIconLC
+// ---------------------------------------------------------------------------
+//
+CGulIcon* CCCAppCommLauncherLPadModel::LoadIconLC( TInt aBmpId, TInt aMaskId )
+    {
+    CFbsBitmap* bmp = NULL;
+    CFbsBitmap* mask = NULL;
+    CGulIcon* icon = CGulIcon::NewLC();
+
+    AknIconUtils::CreateIconLC(
+        bmp, mask, KPbk2ECEIconFileName, aBmpId, aMaskId );
+
+    icon->SetBitmap( bmp );
+    icon->SetMask( mask );
+    CleanupStack::Pop( 2 ); // bmp, mask
+
+    return icon;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::IconArray
+// ---------------------------------------------------------------------------
+//
+CAknIconArray* CCCAppCommLauncherLPadModel::IconArray()
+    {
+    return iButtonIconArray;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ButtonData
+// ---------------------------------------------------------------------------
+//
+TCommLauncherButtonData& CCCAppCommLauncherLPadModel::ButtonData( TInt aIndex )
+    {
+    return iButtonDataArray[ aIndex ];
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::TextForPopUpL
+// ---------------------------------------------------------------------------
+//
+TPtrC CCCAppCommLauncherLPadModel::TextForPopUpL( TInt aButtonIndex )
+    {
+    TPtr tempText = iTempText->Des();
+    tempText.Zero();
+    if ( iButtonDataArray[ aButtonIndex ].iContactAction
+    		== VPbkFieldTypeSelectorFactory::EFindOnMapSelector
+    		&& iButtonDataArray[ aButtonIndex ].iNumberOfAddresses == 1 )
+    	{
+    	return AddressTextForPopUpL();
+    	}
+    else
+    	{
+        tempText.Append( iButtonDataArray[ aButtonIndex ].iPopupText );
+    	}
+           
+    return *iTempText;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::Reset
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::Reset()
+    {
+    iButtonDataArray.Reset();
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ReplaceWithDefaultIconL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::ReplaceWithDefaultIconL(
+    CFbsBitmap*& aBitmap,
+    CFbsBitmap*& aMask,
+    const TUint32 aServiceType )
+    {
+    delete aBitmap;
+    delete aMask;
+    CGulIcon* icon = NULL;
+
+    switch ( aServiceType )
+        {
+        /* The VOIP Button doesnt show presence CCA UI Spec will be
+         * updated with this info.
+         * Thats why this part of code is commeneted
+        case CCmsContactFieldItem::ECmsPresenceVoIPNotification:
+            icon = LoadIconLC(
+                    EMbmPhonebook2eceQgn_prop_nrtyp_voip,
+                    EMbmPhonebook2eceQgn_prop_nrtyp_voip_mask  );
+            break;*/
+        case CCmsContactFieldItem::ECmsPresenceChatNotification:
+            icon = LoadIconLC(
+                    EMbmPhonebook2eceQgn_prop_nrtyp_chat,
+                    EMbmPhonebook2eceQgn_prop_nrtyp_chat_mask );
+            break;
+        default:
+            // Only ECmsPresenceVoIPNotification and
+            // ECmsPresenceChatNotification supported
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    aBitmap = icon->Bitmap();
+    aMask = icon->Mask();
+    icon->SetBitmapsOwnedExternally( ETrue );
+    CleanupStack::PopAndDestroy( icon );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ContactPresenceChangedL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::ContactPresenceChangedL(
+    const CCmsContactField& aContactField )
+    {
+    //Get the size of icon for Voip presence
+    TRect mainPane = iPlugin.ClientRect();
+    TAknLayoutRect listLayoutRect;
+        listLayoutRect.LayoutRect(
+            mainPane,
+            AknLayoutScalable_Avkon::list_single_large_graphic_pane_g1(0).LayoutLine() );
+    TSize size(listLayoutRect.Rect().Size());
+    
+    const TInt count = aContactField.ItemCount();
+    for (TUint i=0; i < count; i++)
+        {
+        CCmsPresenceData& presData = ( CCmsPresenceData& )aContactField.ItemL( i );
+        presData.PreparePresenceDataL( size );
+        TUint32 serviceType = presData.ServiceType();
+        TInt iconInd = KErrNotFound;
+        switch (serviceType)
+            {
+            /* The VOIP Button doesnt show presence CCA UI Spec will be
+             * updated with this info.
+             * Thats why this part of code is commeneted
+            case CCmsContactFieldItem::ECmsPresenceVoIPNotification:
+                iconInd = MapCommMethodToIcon(
+                    VPbkFieldTypeSelectorFactory::EVOIPCallSelector );
+                break;*/
+            case CCmsContactFieldItem::ECmsPresenceChatNotification:
+                iconInd = MapCommMethodToIcon(
+                    VPbkFieldTypeSelectorFactory::EInstantMessagingSelector );
+                break;
+            }
+        if (iconInd > 0 && iconInd < iButtonIconArray->Count())
+            {
+            CFbsBitmap* mask = presData.Mask();
+            CFbsBitmap* bitmap = presData.Bitmap();
+
+            if ( bitmap && NULL == bitmap->Handle() )
+                {
+                // There should not be a case with empty bitmaps, so
+                // replace with the default icons.
+                ReplaceWithDefaultIconL( bitmap, mask, serviceType );
+                }
+
+            if ( bitmap || mask )
+                {
+                iButtonIconArray->At(iconInd)->SetBitmap(bitmap);
+                iButtonIconArray->At(iconInd)->SetMask(mask);
+                }
+            }
+        else
+            {
+            delete presData.Bitmap();
+            delete presData.Mask();
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::AddressButtonL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::AddressButtonL(
+		const TInt aNumberOfAddresses, const TInt aIndex )
+    {
+    RArray<VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector>& 
+        preferredCommMethods = iContainer.Plugin().PreferredCommMethods();//not owned
+
+    RPointerArray<CMnProvider> providers;
+    CleanupClosePushL( providers );
+    MnProviderFinder::FindProvidersL( providers,
+        CMnProvider::EServiceMapView );
+    if (providers.Count() > 0)
+        {
+        TCommLauncherButtonData buttonData = 
+            TCommLauncherButtonData( preferredCommMethods[aIndex] );
+        ButtonTextL(preferredCommMethods[aIndex], buttonData.iText);
+        buttonData.iNumberOfAddresses = aNumberOfAddresses;
+        iButtonDataArray.AppendL( buttonData );
+        }
+    providers.ResetAndDestroy();
+    CleanupStack::PopAndDestroy( &providers );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::UpdateAddressesValidationL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::UpdateAddressesValidationL(
+		const CCmsContactFieldInfo& aContactFieldInfo )
+    {
+    TInt count = aContactFieldInfo.Fields().Count();
+    if ( count )
+    	{
+    	TBool generalAddress = EFalse;
+    	TBool homeAddress = EFalse;
+    	TBool workAddress = EFalse;
+    	TBool generalGeo = EFalse;
+    	TBool homeGeo = EFalse;
+    	TBool workGeo = EFalse;
+    	for ( TInt i = 0; i < count; i++ )
+    		{
+    		switch ( aContactFieldInfo.Fields().operator []( i ) )
+    			{
+    		    case CCmsContactFieldItem::ECmsAddrPOGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrExtGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrStreetGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrLocalGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrRegionGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrPostcodeGeneric:
+    		    case CCmsContactFieldItem::ECmsAddrCountryGeneric:
+    		    	{
+    		    	generalAddress = ETrue;
+    		    	break;
+    		    	}
+    		    case CCmsContactFieldItem::ECmsAddrPOHome:
+    		    case CCmsContactFieldItem::ECmsAddrExtHome:
+    		    case CCmsContactFieldItem::ECmsAddrStreetHome:
+    		    case CCmsContactFieldItem::ECmsAddrLocalHome:
+    		    case CCmsContactFieldItem::ECmsAddrRegionHome:
+    		    case CCmsContactFieldItem::ECmsAddrPostcodeHome:
+    		    case CCmsContactFieldItem::ECmsAddrCountryHome:
+    		        {
+    		        homeAddress = ETrue;
+    		        break;
+    		        }
+    		    case CCmsContactFieldItem::ECmsAddrPOWork:
+    		    case CCmsContactFieldItem::ECmsAddrExtWork:
+    		    case CCmsContactFieldItem::ECmsAddrStreetWork:
+    		    case CCmsContactFieldItem::ECmsAddrLocalWork:
+    		    case CCmsContactFieldItem::ECmsAddrRegionWork:
+    		    case CCmsContactFieldItem::ECmsAddrPostcodeWork:
+    		    case CCmsContactFieldItem::ECmsAddrCountryWork:
+    		        {
+    		        workAddress = ETrue;
+    		        break;
+    		        }
+    		    case CCmsContactFieldItem::ECmsAddrGeoGeneric:
+    		        {
+    		        generalGeo = ETrue;
+    		        break;
+    		        }
+    		    case CCmsContactFieldItem::ECmsAddrGeoHome:
+    		        {
+    		        homeGeo = ETrue;
+    		        break;
+    		        }
+    		    case CCmsContactFieldItem::ECmsAddrGeoWork:
+    		        {
+    		        workGeo = ETrue;
+    		        break;
+    		        }
+    		    default:
+    		    	{
+    		    	// do nothing
+    		    	break;
+    		    	}
+    			}
+    		}
+    	if ( ( generalAddress && !generalGeo )
+    			|| ( homeAddress && !homeGeo )
+    			|| ( workAddress && !workGeo ) )
+    		{
+    		iAddressesValidated = EFalse;
+    		}
+    	else
+    		{
+    		iAddressesValidated = ETrue;
+    		}
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::CheckAddressesPopupTextL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::CheckAddressesPopupTextL(
+    const TInt aButtonIndex,
+    const VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector
+            aContactAction,
+    const CCmsContactField& aContactField )
+    {
+    CCA_DP( KCommLauncherLogFile, CCA_L(
+    		"CCCAppCommLauncherLPadModel::CheckAddressesPopupTextL" ) );
+    TCommLauncherButtonData& buttonData = iButtonDataArray[ aButtonIndex ];
+ 
+    if ( aContactAction == buttonData.iContactAction )
+        {
+        CCCAppCommLauncherContactHandler& contactHandler =
+                iContainer.Plugin().ContactHandler();//not owned
+        buttonData.iNumberOfAddresses =
+                contactHandler.AddressAmount( buttonData.iContactAction );
+
+        if ( contactHandler.ContactFieldTypeAndContactActionMatch(
+        		aContactField.Type(),
+        		VPbkFieldTypeSelectorFactory::EFindOnMapSelector ) )
+        	{
+        	if ( buttonData.iNumberOfAddresses == 1 )
+        		{// one address case handled here
+        		TInt index = 0; // by default select first
+
+        		switch ( aContactField.Type() )
+        	        {
+        	        case CCmsContactFieldItem::ECmsAddrPOGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrPOHome:
+        	        case CCmsContactFieldItem::ECmsAddrPOWork:
+        	    	    {
+        	    	    iAddressFields.InsertL( EAddressPO,
+        	    	    	aContactField.ItemL( index ).Data().Left(
+        	    	    	KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	    	    break;
+        	    	    }
+        	        case CCmsContactFieldItem::ECmsAddrExtGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrExtHome:
+        	        case CCmsContactFieldItem::ECmsAddrExtWork:
+        	    	    {
+        	    	    iAddressFields.InsertL( EAddressExt,
+        	    	        aContactField.ItemL( index ).Data().Left(
+        	    	        KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	    	    break;
+        	    	    }
+        	        case CCmsContactFieldItem::ECmsAddrStreetGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrStreetHome:
+        	        case CCmsContactFieldItem::ECmsAddrStreetWork:
+        	            {
+        	            iAddressFields.InsertL( EAddressStreet,
+        	                aContactField.ItemL( index ).Data().Left(
+        	                KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	            break;
+        	            }
+        	        case CCmsContactFieldItem::ECmsAddrLocalGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrLocalHome:
+        	        case CCmsContactFieldItem::ECmsAddrLocalWork:
+        	            {
+        	            iAddressFields.InsertL( EAddressLocal,
+        	                aContactField.ItemL( index ).Data().Left(
+        	                KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	            break;
+        	            }
+        	        case CCmsContactFieldItem::ECmsAddrRegionGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrRegionHome:
+        	        case CCmsContactFieldItem::ECmsAddrRegionWork:
+        	            {
+        	            iAddressFields.InsertL( EAddressRegion,
+        	                aContactField.ItemL( index ).Data().Left(
+        	                KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	            break;
+        	            }
+        	        case CCmsContactFieldItem::ECmsAddrPostcodeGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrPostcodeHome:
+        	        case CCmsContactFieldItem::ECmsAddrPostcodeWork:
+        	            {
+        	            iAddressFields.InsertL( EAddressPostcode,
+        	                aContactField.ItemL( index ).Data().Left(
+        	                KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	            break;
+        	            }
+        	        case CCmsContactFieldItem::ECmsAddrCountryGeneric:
+        	        case CCmsContactFieldItem::ECmsAddrCountryHome:
+        	        case CCmsContactFieldItem::ECmsAddrCountryWork:
+        	            {
+        	            iAddressFields.InsertL( EAddressCountry,
+        	                aContactField.ItemL( index ).Data().Left(
+        	                KCCAppCommLauncherMaxButtonDataTextLength ) );
+        	            break;
+        	            }
+        	        default:
+        	    	    {
+        	    	    // nothing to do
+        	    	    return;
+        	    	    }
+        	        }
+        	    }
+        	else
+        		{// multiple addresses case handled here
+            	buttonData.iPopupText.Zero();
+                buttonData.iPopupText.Append(*StringLoader::LoadLC(
+                    R_QTN_CCA_MULTIPLE_ADDRESSES,
+                    buttonData.iNumberOfAddresses));
+                CleanupStack::PopAndDestroy();
+            	}
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::AddressTextForPopUpL
+// ---------------------------------------------------------------------------
+//   
+TPtrC CCCAppCommLauncherLPadModel::AddressTextForPopUpL()
+    {
+    const TInt KGranularity = 4; 
+    CDesCArrayFlat* fields = new ( ELeave ) CDesCArrayFlat( KGranularity );
+    CleanupStack::PushL( fields );
+
+    TPtr tempText = iTempText->Des();
+    tempText.Zero();
+
+    HBufC* formattedText = NULL;
+    TBool street = EFalse;
+    TBool local = EFalse;
+
+    TPtrC* text = iAddressFields.Find( EAddressStreet );
+    if ( text )
+    	{
+        fields->AppendL( *text );
+        street = ETrue;
+    	}
+    text = iAddressFields.Find( EAddressLocal );
+    if ( text )
+    	{
+    	fields->AppendL( *text );
+    	local = ETrue;
+    	}
+
+    if ( street && local )
+    	{
+        formattedText = StringLoader::LoadLC(
+    	        R_QTN_PHOB_COMMLAUNCHER_ONELINEPREVIEW, *fields );
+    	}
+    else
+        {
+        formattedText = StringLoader::LoadLC(
+    	   		R_QTN_PHOB_POPUP_INCOMPLETE_ADDRESS );
+    	}
+
+    tempText.Append( *formattedText );
+    CleanupStack::PopAndDestroy( formattedText );
+    CleanupStack::PopAndDestroy( fields );
+           
+    return *iTempText;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::LoadVoipButtonInfoL
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppCommLauncherLPadModel::LoadVoipButtonInfoL()
+    {    
+    TInt returnVal (0);
+    TServiceId serviceId; //Stores the last found Service Id of VOIP Service
+    TInt availableVoipServices = GetSupportedVOIPServicesL( serviceId ); 
+    
+    if ( KOneVOIPServiceAvailable == availableVoipServices )
+        {
+        HBufC* serviceName = NULL;
+        CFbsBitmap* bitmap(NULL);
+        CFbsBitmap* mask(NULL);
+        //Now we have only 1 service which supports VOIP
+        //hence load the VOIP Button Icon & corresponding label              
+        LoadVoipButtonInfoFromPbkL( serviceId, bitmap, mask, serviceName );
+        
+        CleanupStack::PushL( serviceName );
+        
+        //Replace the default icons with the branded icon
+        if ( bitmap || mask )
+            {   
+            TInt iconInd = MapCommMethodToIcon(
+                                VPbkFieldTypeSelectorFactory::EVOIPCallSelector );
+            //we have found the branded icon for voip button        
+            iButtonIconArray->At(iconInd)->SetBitmap(bitmap);
+            iButtonIconArray->At(iconInd)->SetMask(mask);
+                   
+            returnVal |= KVOIPButtonImageSet;
+            }
+        
+        //Replace the default button text with the branded servicename
+        for ( TInt i = 0; i < iButtonDataArray.Count() && serviceName ; i++ )
+            {
+            TCommLauncherButtonData& buttonData ( iButtonDataArray[i] );
+            
+            if ( VPbkFieldTypeSelectorFactory::EVOIPCallSelector == 
+                            iButtonDataArray[i].iContactAction )
+                {
+                HBufC* str = StringLoader::LoadLC( R_QTN_CCA_VOIP_CALL_WITH_SERVICENAME, 
+                        *serviceName,             
+                        &iCoeEnv );
+                
+                buttonData.iText.Copy( str->Left( KCCAppCommLauncherMaxButtonDataTextLength ) );        
+                CleanupStack::PopAndDestroy(); //str
+                //Button Text has been set
+                returnVal |= KVOIPButtonTextSet;
+                break;
+                }            
+            }
+        
+        CleanupStack::PopAndDestroy(); //serviceName
+        }
+    
+    return returnVal;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::GetSupportedVOIPServicesL
+// ---------------------------------------------------------------------------
+//
+TInt CCCAppCommLauncherLPadModel::GetSupportedVOIPServicesL( TServiceId& aServiceId )
+    {  
+    //Find all services which are voip enabled 
+    TInt availableVoipService (0);    
+    RIdArray idArray;
+    CleanupClosePushL(idArray);
+    
+    User::LeaveIfError( iSettings->FindServiceIdsL(idArray) );
+    
+    for (TInt i = 0; i < idArray.Count(); ++i)
+        {
+        TBool supported( EFalse );
+        CSPEntry* entry = CSPEntry::NewLC();
+        TServiceId id = idArray[i];
+        User::LeaveIfError( iSettings->FindEntryL(id, *entry) );
+        const CSPProperty* property = NULL;
+        
+        if (entry->GetProperty(property, EPropertyServiceAttributeMask) == KErrNone)
+            {
+            TInt value = 0;
+            property->GetValue(value);
+            supported = value & ESupportsInternetCall; 
+            }
+        
+        if ( supported )
+            {
+            availableVoipService++;            
+            aServiceId = id;
+            }
+        CleanupStack::PopAndDestroy(); // entry
+        }
+    CleanupStack::PopAndDestroy(); //idArray    
+    
+    return availableVoipService;
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::LoadVoipButtonInfoFromPbkL
+// ---------------------------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::LoadVoipButtonInfoFromPbkL( 
+            TServiceId aServiceId,
+            CFbsBitmap*& aBitmap, CFbsBitmap*& aMask, HBufC*& aLocalisedServiceName )
+    {
+    // get the XSP ServiceName 
+    // CPbk2ServiceManager stores all the brandinfo
+    // related to the services configured to the phone
+    // use this to show uniform icon & name throughout PhoneBook    
+    CPbk2ApplicationServices& appServices = iPbkCmd->ApplicationServices();
+    CPbk2ServiceManager& servMan = appServices.ServiceManager();
+    const CPbk2ServiceManager::RServicesArray& services = servMan.Services();    
+    for ( TInt i = 0; i < services.Count(); i++ )
+        {
+        const CPbk2ServiceManager::TService& service = services[i];
+        //Found the appropriate service info
+        if ( service.iServiceId == aServiceId )
+            {
+            //Calculate the Size of the Bitmap for Comm Launcher
+            TRect mainPane = iPlugin.ClientRect();                            
+            TAknLayoutRect listLayoutRect;
+                listLayoutRect.LayoutRect(
+                    mainPane,
+                    AknLayoutScalable_Avkon::list_single_large_graphic_pane_g1(0).LayoutLine() );
+            TSize size(listLayoutRect.Rect().Size());
+                        
+            //Set the size of this bitmap.
+            //without this Cloning of bitmap will not happen            
+            AknIconUtils::SetSize( service.iBitmap, size );
+            AknIconUtils::SetSize( service.iMask, size );
+               
+            //Trickiest Bitmap cloning
+            //No direct way of cloning a bitmap
+            aBitmap = CloneBitmapLC(size, service.iBitmap);
+            aMask = CloneBitmapLC(size, service.iMask);
+            
+            //Calculate preferred size for xsp service icons
+            AknLayoutUtils::LayoutMetricsRect(
+                AknLayoutUtils::EMainPane, mainPane );            
+            listLayoutRect.LayoutRect(
+                mainPane,
+                AknLayoutScalable_Avkon::list_single_graphic_pane_g2(0).LayoutLine() );
+            TSize xspIconSize(listLayoutRect.Rect().Size()); 
+            AknIconUtils::SetSize( service.iBitmap, xspIconSize );
+            AknIconUtils::SetSize( service.iMask, xspIconSize );
+            
+            aLocalisedServiceName = service.iDisplayName.AllocL(); 
+            
+            CleanupStack::Pop( 2 ); //aBitmap, aMask
+            break;
+            }
+        }            
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::HandleNotifyChange
+// ---------------------------------------------------------------------------
+//
+// from MSPNotifyChangeObserver
+void CCCAppCommLauncherLPadModel::HandleNotifyChange( TUint /*aServiceId*/ )
+    {
+    TRAP_IGNORE ( DoHandleNotifyChangeL() );
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::DoHandleNotifyChangeL
+// ---------------------------------------------------------------------------
+// 
+void CCCAppCommLauncherLPadModel::DoHandleNotifyChangeL()
+    {
+    TInt buttonInfoSet = LoadVoipButtonInfoL();
+    
+    if (!( buttonInfoSet && KVOIPButtonImageSet ))
+        {
+        //VOIP Button Image has not been set
+        //reason could be Branding ServerIssue or something else
+        //replace with default icon if this is the case
+        TInt iconInd = MapCommMethodToIcon(
+                          VPbkFieldTypeSelectorFactory::EVOIPCallSelector );  
+        CGulIcon* icon = LoadIconLC(
+                        EMbmPhonebook2eceQgn_prop_nrtyp_voip,
+                        EMbmPhonebook2eceQgn_prop_nrtyp_voip_mask  );
+        
+        icon->SetBitmapsOwnedExternally( ETrue );       
+        
+        iButtonIconArray->At(iconInd)->SetBitmap(icon->Bitmap());
+        iButtonIconArray->At(iconInd)->SetMask(icon->Mask());
+        
+        CleanupStack::PopAndDestroy( icon );        
+        }
+    
+    if (!( buttonInfoSet && KVOIPButtonTextSet ))
+        {
+        //VOIP Button Text has not been set
+        //reason could be Branding ServerIssue or something else
+        //replace with default Text if this is the case
+        
+        //Replace the default button text with the branded servicename
+        for ( TInt i = 0; i < iButtonDataArray.Count(); i++ )
+            {
+            TCommLauncherButtonData& buttonData ( iButtonDataArray[i] );
+            
+            if ( VPbkFieldTypeSelectorFactory::EVOIPCallSelector == 
+                            iButtonDataArray[i].iContactAction )
+                {
+                HBufC* str = StringLoader::LoadLC( R_QTN_CCA_VOIP_CALL, 
+                        &iCoeEnv );
+                
+                buttonData.iText.Copy( str->Left( KCCAppCommLauncherMaxButtonDataTextLength ) );        
+                CleanupStack::PopAndDestroy(); //str     
+                break;
+                }            
+            }
+        }
+        
+    iContainer.DrawDeferred();
+    }    
+
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::HandleError
+// ---------------------------------------------------------------------------
+//
+// from MSPNotifyChangeObserver
+void CCCAppCommLauncherLPadModel::HandleError( TInt /*aError*/ )
+    {    
+    }
+
+// ---------------------------------------------------------------------------
+// CCCAppCommLauncherLPadModel::IfShowMultiIcon
+// ---------------------------------------------------------------------------
+//
+TBool CCCAppCommLauncherLPadModel::IfShowMultiIcon(TInt aButtonIndex) const
+	{
+	TBool result = EFalse; 
+	if ( iButtonDataArray[ aButtonIndex ].iNumberOfAddresses > 1 )
+		{
+		result = ETrue;
+		}
+	return result;
+	}
+
+
+// ----------------------------------------------------------
+// CCCAppCommLauncherLPadModel::SetTextClipDirection
+// 
+// ----------------------------------------------------------
+//
+void CCCAppCommLauncherLPadModel::SetTextClipDirection( VPbkFieldTypeSelectorFactory::TVPbkContactActionTypeSelector aContactAction,
+		TInt aButtonIndex
+		/*CCmsContactFieldItem::TCmsContactField aCmsFieldType*/ )
+	{
+	TCommLauncherButtonData& buttonData = iButtonDataArray[ aButtonIndex ];
+	
+	// Phone number, email address, and sip address, clip from begining
+	if ( VPbkFieldTypeSelectorFactory::EVoiceCallSelector == aContactAction
+	        || VPbkFieldTypeSelectorFactory::EUniEditorSelector == aContactAction
+	        || VPbkFieldTypeSelectorFactory::EVOIPCallSelector == aContactAction
+	        || VPbkFieldTypeSelectorFactory::EVideoCallSelector == aContactAction
+	        || VPbkFieldTypeSelectorFactory::EEmailEditorSelector == aContactAction
+	        || VPbkFieldTypeSelectorFactory::EInstantMessagingSelector == aContactAction )
+	     {
+	     buttonData.iClipFromBegining = ETrue;
+	     }
+	else 
+		{
+		buttonData.iClipFromBegining = EFalse;
+		}
+	}
+
+// ----------------------------------------------------------
+// CCCAppCommLauncherLPadModel::ClipFromBeginning
+// 
+// ----------------------------------------------------------
+//
+TBool CCCAppCommLauncherLPadModel::ClipFromBeginning(
+    TDes& aBuffer,
+    TInt aItemIndex,
+    TInt aSubCellNumber) const
+{
+    CAknDoubleLargeStyleListBox* listbox =
+        static_cast<CAknDoubleLargeStyleListBox*>(&iListBox);
+
+    return AknTextUtils::ClipToFit(
+        aBuffer,
+        AknTextUtils::EClipFromBeginning,
+        listbox,
+        aItemIndex,
+        aSubCellNumber);
+}
+
+
+// End of File