logsui/logsserviceextension/src/clogsuicontrolextension.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/logsserviceextension/src/clogsuicontrolextension.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,1291 @@
+/*
+* Copyright (c) 2007 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:  Provides additional functionality to the Logs UI application
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <gulicon.h>
+#include <aknnotewrappers.h> 
+#include <aknlists.h>
+
+#include "clogsuicontrolextension.h"
+
+#include "clogspresencetablemanager.h"
+#include "clogseventinfomanager.h"
+#include "clogsextbrandfetcher.h"
+#include "clogsextpresentityidfetcher.h"
+#include "tlogseventinfo.h"
+#include "clogsiconfileprovider.h"
+#include "clogsextservicehandler.h"
+
+#include "LogsConstants.hrh"    // for KLogsBuff128
+#include "LogsConsts.h"         // for KMaxNbrOfRecentTrailIcons, KTab                        
+#include "logsextconsts.h"
+#include "tlogsextutil.h"
+
+#include "simpledebug.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CLogsUiControlExtension* CLogsUiControlExtension::NewL()
+    {
+    _LOG("CLogsUiControlExtension::NewL()" )
+    CLogsUiControlExtension* self = CLogsUiControlExtension::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CLogsUiControlExtension* CLogsUiControlExtension::NewLC()
+    {
+    _LOG("CLogsUiControlExtension::NewLC()" )
+    CLogsUiControlExtension* self = new( ELeave ) CLogsUiControlExtension;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::ConstructL()
+    {
+    _LOG("CLogsUiControlExtension::ConstructL() begin" )
+    iLogEntryInfoManager = CLogsEventInfoManager::NewL();
+    iPresenceTableManager = CLogsPresenceTableManager::NewL();
+    _LOG("CLogsUiControlExtension::ConstructL() end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CLogsUiControlExtension::CLogsUiControlExtension():    
+    iListBox( NULL ),
+    iLogsExtObserver( NULL ),
+    iBrandFetcherArray( KBrandFetcherArrayGranularity ),    
+    iPresentityIdFetcherArray( KPresentityIdFetcherArrayGranularity ),
+    iServiceHandlerArray( KPresentityIdFetcherArrayGranularity ),
+    iBitmap( NULL ),
+    iBitmask( NULL )    
+    {
+    _LOG("CLogsUiControlExtension::CLogsUiControlExtension()" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CLogsUiControlExtension::~CLogsUiControlExtension()
+    {
+    _LOG("CLogsUiControlExtension::~CLogsUiControlExtension() begin" )
+    delete iLogEntryInfoManager;        
+    delete iPresenceTableManager;
+    iBrandFetcherArray.ResetAndDestroy();           
+    iPresentityIdFetcherArray.ResetAndDestroy();
+        
+    delete iBitmap;
+    delete iBitmask;
+    
+    _LOG("CLogsUiControlExtension::~CLogsUiControlExtension()..." )
+    _LOG("...iServiceHandlerArray.ResetAndDestroy")
+    iServiceHandlerArray.ResetAndDestroy();
+    
+    _LOG("CLogsUiControlExtension::~CLogsUiControlExtension() end" )
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Delete member data.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::DoRelease()
+    {
+    _LOG("CLogsUiControlExtension::DoRelease() begin" )    
+    delete this;
+    _LOG("CLogsUiControlExtension::DoRelease() end" )
+    }
+
+// ---------------------------------------------------------------------------
+// functionality not supported by this dll - function does nothing
+// ---------------------------------------------------------------------------
+//    
+void CLogsUiControlExtension::AppendIconsL( CAknIconArray* /*aArray*/ )
+    {
+    _LOG("CLogsUiControlExtension::AppendIconsL begin" )
+    // Reset brand fetcher array. Brand fetchers and icons are reconstructed
+    // again when when HandleAdditionalData() gets called. We cannot load
+    // icons here because we don't know yet which icons to load.
+    iBrandFetcherArray.ResetAndDestroy();
+    iPresenceTableManager->ResetState();
+    iServiceHandlerArray.ResetAndDestroy();
+    _LOG("CLogsUiControlExtension::AppendIconsL end" )
+    }
+
+// ---------------------------------------------------------------------------
+// functionality not supported by this dll - function does nothing
+// ---------------------------------------------------------------------------
+//
+TBool CLogsUiControlExtension::GetIconIndexL( TContactItemId /*aContactId*/,
+                                              TInt& /*aIndex*/ )
+    {
+    _LOG("CLogsUiControlExtension::GetIconIndexL begin" )
+    _LOG("CLogsUiControlExtension::GetIconIndexL end" )
+    return EFalse;
+    }
+    
+// ---------------------------------------------------------------------------
+// Sets the observer of the extension (probably a CLogsRecentListView object)
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::SetObserver( MLogsExtObserver& aObserver )
+    {
+    _LOG("CLogsUiControlExtension::SetObserver begin" )
+    iLogsExtObserver = &aObserver;
+    _LOG("CLogsUiControlExtension::SetObserver end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// Starts the additional data handling.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::HandleAdditionalData( 
+    MLogsModel& aModel, 
+    CAknDoubleGraphicStyleListBox& aListBox )
+    {
+    _LOG("CLogsUiControlExtension::HandleAdditionalDataL begin" )
+    iListBox = &aListBox;    
+        
+    ResetPresentityIdFetcherArray();    
+    
+    TRAP_IGNORE( DoAdditionalDataHandlingL( aModel ) );    
+    
+    _LOG("CLogsUiControlExtension::HandleAdditionalDataL end" )        
+    }
+    
+// ---------------------------------------------------------------------------
+// Creates and starts all the icon fetching processes.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::DoAdditionalDataHandlingL( MLogsModel& aModel )
+    {
+    _LOG("CLogsUiControlExtension::DoAdditionalDataHandlingL begin" )
+    
+    CreateAndStartBrandFetchersL( aModel );    
+    CreateAndStartPresentityIdFetchersL( aModel );           
+    
+    _LOG("CLogsUiControlExtension::DoAdditionalDataHandlingL end" )        
+    }    
+
+// ---------------------------------------------------------------------------
+// Creates a service handler for a certain service if it not already 
+// exists and issues the binding request.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::CreateAndBindServiceHandlerL( TUint32 aServiceId )
+    {
+    _LOG("CLogsUiControlExtension::CreateAndBindServiceHandlerL: begin" )
+        
+    if ( aServiceId && !ServiceHandlerExists( aServiceId ) )
+        {            
+        // create and bind the service handler
+        _LOG("CLogsUiControlExtension::CreateAndBindServiceHandlerL:..." )
+        _LOG("... !ServiceHandlerExists")
+        
+        
+        CLogsExtServiceHandler* serviceHandler = 
+            CLogsExtServiceHandler::NewLC( aServiceId, *this );                
+        
+        _LOG("CLogsUiControlExtension::CreateAndBindServiceHandlerL:..." )
+        _LOG("...iServiceHandlerArray.AppendL( serviceHandler )")
+        
+        iServiceHandlerArray.AppendL( serviceHandler );
+        
+        CleanupStack::Pop( serviceHandler );        
+        }
+    
+    _LOG("CLogsUiControlExtension::CreateAndBindServiceHandlerL: end" )
+    }
+
+// ---------------------------------------------------------------------------
+// Creates and starts all the brand icon fetching processes.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::CreateAndStartBrandFetchersL( 
+        MLogsModel& aModel )
+    {
+            
+    for ( TInt i = 0 ; i < aModel.Count() ; i++ )
+        {        
+        // Here we go through the list of events an check whether the events
+        // contain a service id or not.Then a brand fetcher is created for 
+        // each service id.
+        
+        // PC-lint errors: #1013, #1055, #64
+        // Explanation: error message occurs because the 'DataField' function
+        // is flagged by __VOIP and RD_VOIP_REL_2_2 flags; as long as the 
+        // entire logsserviceextension is flagged by __VOIP and 
+        // RD_VOIP_REL_2_2 as well this does not cause any problems
+                
+        // get the serviceId
+        TUint32 serviceId ( aModel.At(i)->LogsEventData()->ServiceId() );
+        
+        if ( serviceId && !BrandFetcherExists( serviceId ) )
+            {
+            // the manager adds a eventInfo object only if it does not
+            // contain an eventinfo object with the given service id
+            // --> this acts as a duplicate-elimination
+            TRAP_IGNORE( iLogEntryInfoManager->AddEventEntryL( serviceId ) );
+            
+            // create and start the fetcher
+            CLogsExtBrandFetcher* brandFetcher = 
+                CLogsExtBrandFetcher::NewLC( serviceId, *this );
+                
+            iBrandFetcherArray.AppendL( brandFetcher );
+            CleanupStack::Pop( brandFetcher );
+                
+            brandFetcher->Fetch();            
+            }        
+        }    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Creates and starts all the presence icon fetching processes.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::CreateAndStartPresentityIdFetchersL( 
+        MLogsModel& aModel )
+    {    
+    _LOG("CLogsUiControlExtension::CreateAndStartPresentityIdFetchersL begin " ) 
+    // go through all the log events and create the status entries 
+    // (iPresenceTableManager takes care for duplication elimination and returns
+    //  KErrAlreadyExists if one tries to add an entry that already exists)
+    // create one presence fetcher for each status table entry and start them.
+    // note: entries to the index table will only be added after the callback 
+    // from the presencefw
+    
+    // the presence table manager decides which mappings are not needed
+    // anymore by comparing the log ids of the current view to the 
+    // log ids in the array of mappings; mappings which contain a log id
+    // that cannot be found from 'aModel' will be deleted.
+    iPresenceTableManager->RemoveUnneededMappings( aModel );
+      
+    for ( TInt i = 0 ; i < aModel.Count() ; i++ )
+        {
+
+        // PC-lint errors: #1013, #1055
+        // Explanation: error message occurs because the 'DataField' function
+        // is flagged by __VOIP and RD_VOIP_REL_2_2 flags; as long as the 
+        // entire logsserviceextension is flagged by __VOIP and RD_VOIP_REL_2_2
+        // as well this does not cause any problems
+        
+        TUint32 serviceId( aModel.At(i)->LogsEventData()->ServiceId() );
+        TPtrC8 contactLink;
+        TBool contactLinkRetrievalSuccess( EFalse );
+        if ( KErrNone == aModel.At(i)->
+                            LogsEventData()->GetContactLink( contactLink ) )
+            {
+            contactLinkRetrievalSuccess = ETrue;
+            }
+
+        if ( serviceId && contactLinkRetrievalSuccess )
+            {
+            //create the presentity id fetcher
+            DoPresentityIdFetcherCreationL( serviceId, 
+                                            contactLink, 
+                                            aModel.At(i)->LogId() );
+            }
+        
+        }        
+    _LOG("CLogsUiControlExtension::CreateAndStartPresentityIdFetchersL end " )
+    }
+
+// ---------------------------------------------------------------------------
+// Modifies the given icon string.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::ModifyIconString ( 
+        TDes& aDes, 
+        const MLogsEventGetter& aLogsEventGetter )
+    {
+    _LOGP("CLogsUiControlExtension::ModifyIconString begin originalstring=%S",
+        &aDes)    
+    
+    // only make changes to log entries that contain a service id and
+    // dont start looking for fetching results before the fetching
+    // process has been started. (Fetching is initiated through 
+    // HandleAdditionalDataL function call)
+    
+    TInt result( KErrNone );
+    TRAP( result, DoIconStringModificationL( aDes, aLogsEventGetter ) );
+        
+    _LOGP("CLogsUiControlExtension::ModifyIconString resulting string=%S",
+    	&aDes )
+    
+    _LOG("CLogsUiControlExtension::ModifyIconString end" )
+    }   
+    
+// ---------------------------------------------------------------------------
+// Makes the actual modifications to the string.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::DoIconStringModificationL(  
+    TDes& aDes, 
+    const MLogsEventGetter& aLogsEventGetter )
+    {   
+    _LOG("CLogsUiControlExtension::DoIconStringModificationL begin" )
+    
+    // use the parser to extract e.g. the service id from the data field of a
+    // log event. the information should be tagged like this -> "SI=5", 
+    // whereas "SI" is the identifier for a service id and "5" is its value
+
+    // PC-lint errors: #1013
+    // Explanation: error message occurs because the 'DataField' function
+    // is flagged by __VOIP and RD_VOIP_REL_2_2 flags; as long as the 
+    // entire logsserviceextension is flagged by __VOIP and RD_VOIP_REL_2_2
+    // as well this does not cause any problems       
+    
+    TUint32 serviceId( aLogsEventGetter.LogsEventData()->ServiceId() );
+    if ( serviceId <= 0 )
+        {
+        // without service id we cannont proceed any further...
+        User::Leave( KErrNotFound );
+        }
+    
+    TBool brandIconIndexAvailable( 
+        iLogEntryInfoManager->BrandIconIndexAvailable( serviceId ) );
+    
+    TBool presenceIconIndexAvailable( EFalse );
+
+    const TDesC* presentityId = 
+        presentityId = LookupPresentityId( aLogsEventGetter.LogId() ); 
+    //don't leave here: if the presentity id does not exist it means that
+    //we cannot check the availability of that presentity from the 
+    //presencetablemanager - but we can still try to set the 
+    //brandicon index.
+    
+    if ( presentityId )
+        {        
+        _LOG("CLogsUiControlExtension::DoIconStringModificationL ...")
+        _LOGP("...presentityId=%S", presentityId )
+                
+        if ( iPresenceTableManager )
+            {
+            _LOG("CLogsUiControlExtension::DoIconStringModificationL..." )
+            _LOG("...iPresenceTableManager available")
+            presenceIconIndexAvailable = 
+                iPresenceTableManager->PresenceIconIndexAvailable( 
+                    serviceId, *presentityId );                
+            }
+        }    
+    
+    // only create the HBufC if either brand- or presence index is available
+    if ( brandIconIndexAvailable || presenceIconIndexAvailable )
+        {
+        // e.g. aDes = '0\ttext1\ttext2' whereas '\t' is the delimiter
+        //create an empty local buffer of the same size as aDes
+        HBufC* temp = HBufC::NewLC( KLogsBuff128 );
+        TPtr tempDes( temp->Des() );
+        
+        //create the new icon string:
+        //if no error occurred while creating the local string data->
+        //update aDes with the modified version of the icon string
+        //otherwise the original data will not be modified
+        
+        if ( brandIconIndexAvailable 
+            && AddBrandIconIndex( tempDes, serviceId ) 
+            && AddNonIndexData( aDes, tempDes ) )
+            {
+            aDes.Copy( *temp );
+            }
+        
+        // make a copy of the original string (that might contain  
+        // the modified brandicon index already)
+        tempDes.Copy( aDes );            
+        
+        if ( presenceIconIndexAvailable 
+            && AddPresenceIconIndex( tempDes, serviceId, *presentityId ) )
+            {
+            aDes.Copy( *temp );
+            }
+        
+        //cleanup the local string buffer
+        CleanupStack::PopAndDestroy( temp );
+        temp = NULL;        
+        }
+            
+    _LOG("CLogsUiControlExtension::DoIconStringModificationL end" )           
+    }
+
+
+// ---------------------------------------------------------------------------
+// Adds the branding icon index.
+// ---------------------------------------------------------------------------
+//
+TBool CLogsUiControlExtension::AddBrandIconIndex( TDes& aTempDes, 
+                                                  const TUint32 aServiceId )
+    {
+    _LOG("CLogsUiControlExtension::AddBrandIconIndex begin" )   
+    TBool result( EFalse );        
+    
+    TInt brandIndex( KErrNotFound );
+    // Check if the brand icon for the specified service id can be found
+    if ( iLogEntryInfoManager->GetBrandIconIndex( aServiceId, brandIndex ) )
+        {
+        //Add the brand icon index to the temp string
+        aTempDes.Num( brandIndex );
+        _LOGP("CLogsUiControlExtension::AddBrandIconIndex BrandIndex=%d",
+            brandIndex )
+        // e.g. aTempDes = '7'
+        result = ETrue;
+        }        
+    
+    _LOG("CLogsUiControlExtension::AddBrandIconIndex end" )  
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Copies that part of the global icon string to the local copy which contains
+// the non-icon index related data.
+// ---------------------------------------------------------------------------
+//
+TBool CLogsUiControlExtension::AddNonIndexData( 
+        const TDesC& aDes, 
+        TDes& aTempDes )
+    {
+    _LOG("CLogsUiControlExtension::AddNonIndexData begin" )  
+    TBool result( EFalse );
+    
+    // find the first occurrence of the delimiter in the original
+    // icon string
+    TInt Position( aDes.Find( KTab ) );
+    if ( KErrNotFound != Position )
+        {
+        // position has been found:
+        // now copy 
+        aTempDes.Append( aDes.Mid( Position ) );
+        // e.g. aTempDes = '7\ttext1\ttext2'
+        result = ETrue;
+        }        
+    
+    _LOG("CLogsUiControlExtension::AddNonIndexData end" )  
+    return result;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Appends the trailing delimiters (if they do not already exist) and the 
+// presence icon index.
+// ---------------------------------------------------------------------------
+//
+TBool CLogsUiControlExtension::AddPresenceIconIndex( 
+        TDes& aTempDes, 
+        const TUint32 aServiceId,
+        const TDesC16& aPresentityId )
+    {
+    _LOGP("CLogsUiControlExtension::AddPresenceIconIndex begin %d" , 
+        aServiceId)     
+    TBool result( EFalse );
+    
+    /// determine the number of trailing delimiters and add missing ones
+    //  e.g. Given a) aTempDes = '7\ttext1\ttext2' and 
+    //             b) KMaxNbrOfRecentTrailIcons == 2 
+    //       --> Add two empty trailing icon indices
+    //       Result: aTempDes = '7\ttext1\ttext2\t\t'
+    
+    // determine the number of delimiters
+    TInt numberDelimiters = DetermineNumberDelimiters( aTempDes );
+    
+    if ( numberDelimiters >= KNumberDelimitersUnmodifiedIconStringMin && 
+         numberDelimiters <= KNumberDelimitersUnmodifiedIconStringMax )
+        {
+        //add the trailing delimiters to the end of the string
+        TInt returnValue( 
+            AppendTrailingDelimiters( 
+                aTempDes, 
+                KNumberDelimitersModifiedIconString - numberDelimiters ) );
+        result = ( KErrNone == returnValue ) ? ETrue : EFalse;
+        }
+    else
+        {
+        result = EFalse;        
+        }
+    
+    //if adding the 
+    if ( result ) 
+        {
+        // finally append the presence icon index
+        TInt presenceIndex( KErrNotFound );
+        /// Check, if the presence icon could be retrieved
+        if( KErrNone == iPresenceTableManager->GetIndex( aServiceId, 
+                                                         aPresentityId, 
+                                                         presenceIndex ) )
+            {
+            // Add the presence icon index to the temp string            
+            aTempDes.AppendNum( presenceIndex );       
+            // e.g. aTempDes = '7\ttext1\ttext2\t\t\t8'
+            _LOG("CLogsUiControlExtension::AddPresenceIconIndex ...")
+            _LOGP("...PresenceIndex=%d", presenceIndex )
+            result = ETrue;
+            }
+        else
+            {
+            result = EFalse;
+            }
+        }
+    _LOG("CLogsUiControlExtension::AddPresenceIconIndex end" )     
+    return result;    
+    }
+
+// ---------------------------------------------------------------------------
+// Appends 'aNumber' delimiters to the end of aTempDes.
+// ---------------------------------------------------------------------------
+//
+TInt CLogsUiControlExtension::AppendTrailingDelimiters( TDes& aTempDes, 
+                                                        TInt  aNumber )
+    {
+    _LOG("CLogsUiControlExtension::AppendTrailingDelimiters begin" )     
+    TInt error( KErrNoMemory );
+    
+    //make sure the size of descriptor is big enough, so that appending
+    //won't panic
+    TInt len( aNumber * KTab().Length() );
+    if ( aTempDes.Length() + len <= aTempDes.MaxLength() )
+        {
+        for ( TInt i( 0 ); i < aNumber ; i++ )
+            {
+            aTempDes.Append( KTab );
+            }
+        error = KErrNone;    
+        }
+    else
+        {
+        error = KErrNoMemory;
+        }
+
+    _LOG("CLogsUiControlExtension::AppendTrailingDelimiters end" )
+    return error;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Determines the number of delimiters in the specified string
+// ---------------------------------------------------------------------------
+//
+TInt CLogsUiControlExtension::DetermineNumberDelimiters( 
+        const TDesC& aTempDes )
+    {
+    _LOG("CLogsUiControlExtension::DetermineNumberDelimiters begin" )     
+
+    TInt result( 0 );    
+    TPtrC buffer = aTempDes.Left( aTempDes.Length() );    
+    TInt nextTokenStart( KErrNone );
+    
+    while ( buffer.Length() > 0 && nextTokenStart >= 0 )
+        {            
+        nextTokenStart = buffer.Find( KTab );
+        if ( KErrNotFound != nextTokenStart )
+            {
+            result++;
+            buffer.Set( buffer.Mid( nextTokenStart + 1 ));
+            }
+
+        }    
+
+    _LOG("CLogsUiControlExtension::DetermineNumberDelimiters end" )     
+    return result;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Callback function that is called by the fetcher objects after they have 
+// successfully retrieved the bitmaps of the icon.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::BrandIconFetchDoneL( const TUint32 aServiceId,
+                                                   RFile& aBitmapFile,
+                                                   const TInt aBitmapId,   
+                                                   const TInt aBitmapMaskId )
+    {    
+    _LOGP("CLogsUiControlExtension::BrandIconFetchDoneL begin %d",aServiceId )     
+    
+    // This is the fetcher-callback; handle the fetched data now:
+    //    - take ownership of the file handle
+    //    - create icon
+    //    - add the data to the to the listbox's icon array (in AppIconL)
+    //    - store the icon's index to the event info manager    
+    
+    // take ownership of file handle
+    CleanupClosePushL( aBitmapFile );
+    
+    // File provider duplicates the file handle and close the original.
+    // Duplication is needed because lifetime of image is different than
+    // this plugin's file handle's.
+    CLogsIconFileProvider* ifp = CLogsIconFileProvider::NewL( aBitmapFile );    
+    _LOG("CLogsUiControlExtension::BrandIconFetchDoneL close bitmapfile" );
+    CleanupStack::PopAndDestroy( &aBitmapFile );
+    
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* bitmask = NULL;
+    
+    // create icons            
+    AknIconUtils::CreateIconL ( bitmap,
+                                bitmask,
+                                *ifp,
+                                aBitmapId, 
+                                aBitmapMaskId );                                          
+
+    // in case a new icon is added to the icon array of the listbox
+    // 'indexOfAppendedIcon' will contain the index of the added icon
+    // in the icon array
+    TInt indexOfAppendedIcon( 0 );             
+    
+    // ownership of the bitmaps is transferred to AddIconL
+    TRAPD( err, AddIconL( bitmap, bitmask, indexOfAppendedIcon ) );    
+    bitmap = NULL;                              
+    bitmask = NULL;
+    
+    if ( KErrNone == err && indexOfAppendedIcon >= 0 )
+        {        
+        // store index information into the event info manager
+        err = SetBrandIndex( aServiceId, indexOfAppendedIcon );
+        
+        // if setting the index failed, the last icon that was added to the
+        // icon array must be removed again
+        if ( KErrNone != err )
+            {
+            CArrayPtr<CGulIcon>* iconList = 
+                iListBox->ItemDrawer()->ColumnData()->IconArray();
+            iconList->Delete( indexOfAppendedIcon );
+            iconList->Compress();
+            }        
+        }
+        
+    if ( KErrNone == err )
+        {
+        NotifyObserverL(); // notify the observer (to update the view)
+        }
+    
+    _LOG("CLogsUiControlExtension::BrandIconFetchDoneL end" )     
+   
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Add the fetched icon to the listbox' icon array
+// Returns the index of the appended icon in the icon array.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::AddIconL( CFbsBitmap* aBitmap, 
+                                        CFbsBitmap* aBitmask,
+                                        TInt& aIndex )
+    {
+    _LOG("CLogsUiControlExtension::AddIconL begin" )     
+
+    // delete bitmaps before saving new bitmaps
+    DeleteBitmaps();
+    
+    // take ownership of the bitmaps       
+    iBitmap = aBitmap;      // Ownership here
+    iBitmask = aBitmask;    // Ownership here
+    CArrayPtr<CGulIcon>* iconList = 
+        iListBox->ItemDrawer()->ColumnData()->IconArray();
+    User::LeaveIfNull( iconList );    
+    iBitmap = NULL;     // ownership will be transferred to CGulIcon
+    iBitmask = NULL;    // ownership will be transferred to CGulIcon
+    CGulIcon* icon = CGulIcon::NewL( aBitmap, aBitmask );
+    CleanupStack::PushL( icon );     
+    iconList->AppendL( icon ); // iconList owns icon now
+    CleanupStack::Pop( icon ); 
+    
+    aIndex = iconList->Count() - 1;
+    _LOG("CLogsUiControlExtension::AddIconL end... ")
+    _LOGP("...index of the appended icon in the icon array==%d",
+        ( iconList->Count() - 1 ) )   
+    }
+    
+// ---------------------------------------------------------------------------
+// Sets the index of a brand icon.
+// ---------------------------------------------------------------------------
+//
+TInt CLogsUiControlExtension::SetBrandIndex( const TUint32 aServiceId, 
+                                             const TInt aIndex )
+    {
+    _LOG("CLogsUiControlExtension::SetBrandIndex" )     
+    
+    return iLogEntryInfoManager->SetBrandIndex( aServiceId , aIndex );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Notifies the observer that an icon was added to the listbox's icon array.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::NotifyObserverL()
+    {
+    _LOG("CLogsUiControlExtension::NotifyObserverL begin" )     
+
+    iLogsExtObserver->ExtStateChangedL();
+
+    _LOG("CLogsUiControlExtension::NotifyObserverL end" )     
+    }
+
+
+// ---------------------------------------------------------------------------
+// Sets the index of a presence icon.
+// ---------------------------------------------------------------------------
+//
+TInt CLogsUiControlExtension::SetPresenceIndex( const TUint32 aServiceId, 
+                                                const TDesC& aPresenceStatus,
+                                                const TInt aIndex )
+    {
+    _LOG("CLogsUiControlExtension::SetPresenceIndex" )
+    
+    return iPresenceTableManager->SetIndexInIndexTable( aServiceId, 
+                                                        aPresenceStatus, 
+                                                        aIndex );
+    }
+
+
+   
+// ---------------------------------------------------------------------------
+// Deletes the icon bitmaps.
+// ---------------------------------------------------------------------------
+//   
+void CLogsUiControlExtension::DeleteBitmaps()
+    {
+    _LOG("CLogsUiControlExtension::DeleteBitmaps begin" )     
+    delete iBitmap;
+    delete iBitmask;
+    iBitmap = NULL;
+    iBitmask = NULL;
+    _LOG("CLogsUiControlExtension::DeleteBitmaps end" )         
+    }
+
+// ---------------------------------------------------------------------------
+// Checks if service handler exists already
+// ---------------------------------------------------------------------------
+//  
+TBool CLogsUiControlExtension::ServiceHandlerExists( const TUint32 aServiceId )
+    {
+    TBool handlerFound( EFalse ); 
+    _LOG("CLogsUiControlExtension::ServiceHandlerExists begin" )     
+    
+    // check if there is already a fetcher for the brand    
+    CLogsExtServiceHandler* serviceHandler = NULL;    
+    if ( KErrNone == GetServiceHandler( aServiceId, serviceHandler ) )
+        {
+        handlerFound = ETrue;
+        }
+    
+#ifdef _DEBUG
+    if ( handlerFound )
+        {
+        _LOG("CLogsUiControlExtension::ServiceHandlerExists YES" )
+        }
+    else
+        {
+        _LOG("CLogsUiControlExtension::ServiceHandlerExists NO" )
+        }
+#endif
+
+    _LOG("CLogsUiControlExtension::ServiceHandlerExists end" )         
+    return handlerFound;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Checks if brandfetcher exists already
+// ---------------------------------------------------------------------------
+//  
+TBool CLogsUiControlExtension::BrandFetcherExists( const TUint32 aServiceId )
+    {
+    TBool fetcherFound( EFalse ); 
+    _LOG("CLogsUiControlExtension::BrandFetcherExists begin" )     
+    // check if there is already a fetcher for the brand
+    CLogsExtBrandFetcher* fetcher = NULL;
+    
+    for ( TInt i = 0; i < iBrandFetcherArray.Count() 
+        && fetcherFound == EFalse; i++)
+        {
+        fetcher = iBrandFetcherArray[i];
+        if ( aServiceId == fetcher->ServiceId() )
+            {            
+            fetcherFound = ETrue;    
+            }
+        }
+
+#ifdef _DEBUG
+    if ( fetcherFound )
+        {
+        _LOG("CLogsUiControlExtension::BrandFetcherExists YES" )
+        }
+    else
+        {
+        _LOG("CLogsUiControlExtension::BrandFetcherExists NO" )
+        }
+#endif
+
+    _LOG("CLogsUiControlExtension::BrandFetcherExists end" )         
+    return fetcherFound;    
+    }
+   
+    
+// ---------------------------------------------------------------------------
+// Adds a single presentity to a service handler.
+// ---------------------------------------------------------------------------
+// 
+void CLogsUiControlExtension::AddPresentityToServiceHandlerL( 
+        const TUint32 aServiceId, 
+        const TDesC& aPresentityId )
+    {
+    _LOG("CLogsUiControlExtension::AddPresentityToServiceHandlerL begin" )
+    
+    CLogsExtServiceHandler* serviceHandler = NULL;
+    TInt returnValue( GetServiceHandler( aServiceId, serviceHandler ) );
+        
+    if ( KErrNone == returnValue && serviceHandler )
+            {
+            TInt error( KErrNone );
+            // add status entry to status table
+            error = iPresenceTableManager->AddEntryToStatusTable(
+                aServiceId,
+                aPresentityId,
+                EFalse );
+
+            if ( KErrNone == error )
+                {
+                // adds the presentity to the service handler;
+                // the service handler will start to observe the 
+                // status of this presentity and will inform the
+                // observer in case of status changes of the 
+                // presentity
+                serviceHandler->AddPresentityL( aPresentityId );
+                }
+            }
+        
+    _LOG("CLogsUiControlExtension::AddPresentityToServiceHandlerL end" )
+    }
+ 
+            
+// ---------------------------------------------------------------------------
+// Creates and starts a single presentity id fetcher.
+// ---------------------------------------------------------------------------
+// 
+void CLogsUiControlExtension::DoPresentityIdFetcherCreationL( 
+        const TUint32 aServiceId, 
+        const TDesC8& aCntLink,
+        const TLogId aLogId )
+    {    
+    _LOG("CLogsUiControlExtension::DoPresentityIdFetcherCreationL begin" )
+    
+    if ( aServiceId )
+        {
+        CLogsExtPresentityIdFetcher* presIdFetcher = 
+            CLogsExtPresentityIdFetcher::NewLC( aServiceId, 
+                                                aCntLink, 
+                                                aLogId, 
+                                                *this );
+                                                
+        _LOG("CLogsUiControlExtension::DoPresentityIdFetcherCreationL: ...")
+        _LOGP("...presentity id fetcher created-> serviceid==%d ",aServiceId )
+        iPresentityIdFetcherArray.AppendL( presIdFetcher );
+        _LOG("CLogsUiControlExtension::DoPresentityIdFetcherCreationL:...")
+        _LOGP("... #presIdFetcher=%d",iPresentityIdFetcherArray.Count() )
+        CleanupStack::Pop( presIdFetcher );
+        // start the fetcher
+        presIdFetcher->Fetch();            
+        }
+    
+    _LOG("CLogsUiControlExtension::DoPresentityIdFetcherCreationL end" )
+    }
+                        
+
+
+// ---------------------------------------------------------------------------
+// Callback for the presentity fetchers.
+// ---------------------------------------------------------------------------
+//  
+void CLogsUiControlExtension::PresentityIdFetchDoneL( 
+        const TUint32 aServiceId, 
+        const TDesC& aPresentityId,
+        const TLogId aLogId )
+    {
+    _LOG("CLogsUiControlExtension::PresentityIdFetchDoneL begin" )
+    
+    AddLogIdToPresentityIdMappingL( aLogId, aPresentityId );
+    
+    // create service handler if it not already exists    
+    CreateAndBindServiceHandlerL( aServiceId );
+    
+    // handle the callback from the presentity fetcher:
+    // it only creates a new fetcher if there is not already one fetcher with
+    // the same service id / presentityid    
+    
+    // find the correct service handler and add this presentity
+    AddPresentityToServiceHandlerL( aServiceId, aPresentityId );    
+    
+    _LOG("CLogsUiControlExtension::PresentityIdFetchDoneL end" )    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Adds another mapping to the collection of mappings.
+// ---------------------------------------------------------------------------
+// 
+void CLogsUiControlExtension::AddLogIdToPresentityIdMappingL( 
+        const TLogId aLogId,
+        const TDesC& aPresentityId )
+    {
+    iPresenceTableManager->AddMappingL( aLogId, aPresentityId );
+    NotifyObserverL();
+    }
+
+    
+// ---------------------------------------------------------------------------
+// Retrieves a presentity id using the specified log id.ownership is not 
+// transferred.
+// ---------------------------------------------------------------------------
+// 
+const TDesC* CLogsUiControlExtension::LookupPresentityId( 
+        const TLogId aLogId )
+    {   
+    _LOGP("CLogsUiControlExtension::LookupPresentityId =%d",aLogId )
+    return iPresenceTableManager->RetrievePresentityId( aLogId );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Resets the presentity id fetcher array and also deletes the objects whose
+// pointers are stored in the array. 
+// ---------------------------------------------------------------------------
+// 
+void CLogsUiControlExtension::ResetPresentityIdFetcherArray()
+    {
+    _LOG("CLogsUiControlExtension::ResetPresentityIdFetcherArray begin...") 
+    _LOGP("...beforeDeletion=%d",iPresentityIdFetcherArray.Count() )            
+
+    iPresentityIdFetcherArray.ResetAndDestroy();
+    
+    _LOG("CLogsUiControlExtension::ResetPresentityIdFetcherArray end...")
+    _LOGP("...afterDeletion=%d",iPresentityIdFetcherArray.Count() )            
+    }
+
+// ---------------------------------------------------------------------------
+// Resets the presence status of all entries in the status table. 
+// ---------------------------------------------------------------------------
+// 
+void CLogsUiControlExtension::ResetPresenceStatuses()
+    {
+    _LOG("CLogsUiControlExtension::ResetPresenceStatuses begin" )
+    
+    iPresenceTableManager->ResetStatusTableEntries();
+    
+    _LOG("CLogsUiControlExtension::ResetPresenceStatuses begin" )
+    }
+
+// ---------------------------------------------------------------------------
+// Gets the service handler of the specified service.
+// ---------------------------------------------------------------------------
+//
+TInt CLogsUiControlExtension::GetServiceHandler( 
+        TUint32 aServiceId, 
+        CLogsExtServiceHandler*& aServiceHandler )
+    {
+    _LOGP("CLogsUiControlExtension::GetServiceHandler begin : aServiceId=%d", 
+        aServiceId )
+    
+    TInt error( KErrNotFound );    
+    TBool handlerFound( EFalse );
+         
+    // check if there is already a fetcher for the brand
+    CLogsExtServiceHandler* handler = NULL;
+
+    for ( TInt i = 0 ; i < iServiceHandlerArray.Count() && !handlerFound; i++ )
+        {
+        handler = iServiceHandlerArray[i];
+        if ( handler && aServiceId == handler->ServiceId() )
+            {            
+            handlerFound = ETrue;
+            aServiceHandler = handler;
+            error = KErrNone;
+            }
+        }
+
+    error = handlerFound ? KErrNone : KErrNotFound;    
+    _LOGP("CLogsUiControlExtension::GetServiceHandler() error=%d",error )
+
+    _LOG("CLogsUiControlExtension::GetServiceHandler end" )         
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// Handles the service handler's callback.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::HandlePresentityPresenceStatusL( 
+                                 const TUint32 aServiceId, 
+                                 const TDesC& aPresentityId,
+                                 const TDesC& aPresenceStatus,
+                                 TBool aShowStatus )
+    {
+    _LOG("CLogsUiControlExtension::HandlePresentityPresenceStatusL begin" )
+    
+
+    TInt error( KErrNone );    
+    // 1. find <serviceId,presentityId> entry in the status table and set the 
+    //    status entry (that was retrieved by the presence fetcher earlier)
+    error = 
+        iPresenceTableManager->SetStatusInStatusTable( aServiceId, 
+                                                       aPresentityId, 
+                                                       aPresenceStatus,
+                                                       aShowStatus );
+    if( KErrNone == error )
+        {
+        // 2. check whether the presence icon index for 
+        // <serviceId,PresenceStatus> entry from index table is already
+        // available
+        TInt presenceIndex ( KErrNotFound );        
+        const TInt indexRetrievalErrorCode = 
+            iPresenceTableManager->GetIndexFromIndexTable( aServiceId, 
+                                                           aPresenceStatus,
+                                                           presenceIndex );
+        
+        //case 0: ( KErrNone == indexRetrievalErrorCode ) && 
+        //        ( presenceIndex >= 0 )
+        // -> nothing to do in this case (the icon was added already earlier
+        //    and the index information was already stored to the index table)
+        
+        //case 1: ( KErrNone == indexRetrievalErrorCode && 
+        //          presenceIndex == KErrNotFound )
+        //the index entry was found, but the index value in still unchanged.
+        //needed actions: create icons, add icons to icon list array,determine
+        //index of the added icon in the icon array,update the index entry in
+        //the index table
+    
+        //case 2: ( KErrNone != indexRetrievalErrorCode )
+        //the index entry was NOT found at all.
+        //needed actions: create icons, add icons to icon list array,determine
+        //index of the added icon in the icon array,CREATE an index entry in 
+        // the index table,and update the index entry in the index table
+                        
+        if ( ( KErrNone == indexRetrievalErrorCode && 
+               presenceIndex == KErrNotFound ) ||      // case 1
+             ( KErrNone != indexRetrievalErrorCode ) ) // case 2
+            {
+            //get the filehandle and the bitmapIds
+            RFile bitmapFile;
+            TInt bitmapId;   
+            TInt bitmapMaskId;
+            
+            FetchBitmapsFromBrandingServerL( aServiceId,
+                                             aPresenceStatus,
+                                             bitmapFile,
+                                             bitmapId,
+                                             bitmapMaskId );
+            
+            // take ownership of the filehandle
+            CleanupClosePushL( bitmapFile );
+            _LOG("CLogsUiControlExtension::HandlePresentityPresenceStatusL..")
+            _LOG("...bitmapFile to cleanupstack" )
+            
+            // File provider duplicates the file handle, close the original.
+            // Duplication is needed because lifetime of image is different 
+            // than this plugin's file handle's.
+            CLogsIconFileProvider* ifp = 
+                CLogsIconFileProvider::NewL( bitmapFile );
+            CFbsBitmap* bitmap;
+            bitmap = NULL;
+            CFbsBitmap* bitmask;
+            bitmask = NULL;
+            
+            // create icons            
+            AknIconUtils::CreateIconL ( bitmap,
+                                        bitmask,
+                                        *ifp,
+                                        bitmapId, 
+                                        bitmapMaskId );
+    
+            error = KErrNone;
+            // in case a new icon is added to the icon array of the listbox
+            // 'indexOfAppendedIcon' will contain the index of the added icon
+            // in the icon array
+            TInt indexOfAppendedIcon( 0 );
+            
+            // if AddIconL returns with KErrNone the ownership of the bitmaps
+            // was successfully transferred
+            TRAP( error, AddIconL( bitmap, bitmask, indexOfAppendedIcon ) );
+            bitmap = NULL;
+            bitmask = NULL;
+            _LOGP("CLogsUiControlExtension::AddIconL returns==%d",
+                error )
+            
+            TBool errorAfterIconAddition( EFalse );
+            
+            if ( KErrNone == error && KErrNone != indexRetrievalErrorCode )
+                {
+                // create the missing index entry for case 2
+                error = 
+                    iPresenceTableManager->AddEntryToIndexTable( 
+                        aServiceId, 
+                        aPresenceStatus );
+                errorAfterIconAddition = 
+                    ( KErrNone == error || KErrAlreadyExists == error ) ? 
+                        EFalse : ETrue;
+                }
+            
+            TInt numberIcons ( indexOfAppendedIcon + 1 );
+            // update the index entry
+            if ( KErrNone == error )
+                {                
+                // store index information into the presence table manager
+                error = SetPresenceIndex( aServiceId,
+                                          aPresenceStatus,
+                                          indexOfAppendedIcon );
+                errorAfterIconAddition = ( KErrNone == error ) ? EFalse:ETrue;
+                }
+            
+            // if setting the index failed, the last icon that was added to 
+            // the icon array must be removed again
+            if ( errorAfterIconAddition && numberIcons > 0 )
+                {
+                CArrayPtr<CGulIcon>* iconList = 
+                    iListBox->ItemDrawer()->ColumnData()->IconArray();
+                iconList->Delete( indexOfAppendedIcon );
+                iconList->Compress();
+                }
+                            
+            if ( KErrNone == error )
+                {
+                NotifyObserverL(); // notify the observer (to update the view)
+                }
+
+            _LOG("CLogsUiControlExtension::HandlePresentityPresenceStatusL...")
+            _LOG("...close bitmapfile" )
+            
+            CleanupStack::PopAndDestroy( &bitmapFile );
+            
+            }
+        else if ( ( KErrNone == indexRetrievalErrorCode ) && 
+                  ( presenceIndex >= 0 ) ) // case 0
+            {
+            NotifyObserverL(); // notify the observer (to update the view)
+            }     
+        }
+    
+    _LOG("CLogsUiControlExtension::HandlePresentityPresenceStatusL end" )
+    }
+
+// ---------------------------------------------------------------------------
+// This function is used to notify the observer of a service handler
+// if the presence status of a certain presentity should be displayed
+// or not.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::SetDisplayStatusFlag( 
+        const TUint32 aServiceId, 
+        const TDesC& aPresentityId,
+        TBool aDisplayStatus )
+    {
+    _LOG("CLogsUiControlExtension::SetDisplayStatusFlag begin" )
+    
+    _LOGP("CLogsUiControlExtension::SetDisplayStatusFlag : aServiceId=%d ",
+            aServiceId)
+    
+    _LOGP("CLogsUiControlExtension::SetDisplayStatusFlag : aPresentityId=%S",
+            &aPresentityId )
+    
+    TInt error = 
+        iPresenceTableManager->UpdateStatusTableEntry( aServiceId, 
+                                                      aPresentityId,
+                                                      aDisplayStatus );
+    
+    _LOG("CLogsUiControlExtension::SetDisplayStatusFlag : ...")
+    _LOGP("...UpdateStatusTableEntry error = %d ", error )
+    
+    //refresh the view, to make changes visible
+    if ( KErrNone == error )
+        {
+        TRAP_IGNORE( NotifyObserverL(); );
+        }
+    
+    _LOG("CLogsUiControlExtension::SetDisplayStatusFlag end" )
+    }
+
+// ---------------------------------------------------------------------------
+// Get the icon bitmaps from the branding server.
+// ---------------------------------------------------------------------------
+//
+void CLogsUiControlExtension::FetchBitmapsFromBrandingServerL( 
+        const TUint aServiceId,
+        const TDesC& aPresenceStatus,
+        RFile& aBitmapFile,
+        TInt& aBitmapId,
+        TInt& aBitmapMaskId )
+    {
+    _LOG("CLogsUiControlExtension::FetchBitmapsFromBrandingServerL(): begin" )
+    
+    // create the elementId string; e.g.: "person:offline:image"  
+    HBufC* elementId = HBufC::NewLC( KPersonPresTmpl().Length() + 
+                                     aPresenceStatus.Length() );            
+    TPtr ptr( elementId->Des() );    
+    ptr.AppendFormat( KPersonPresTmpl(), &aPresenceStatus );
+    _LOG( "CLogsUiControlExtension::FetchBitmapsFromBrandingServerL():...")
+    _LOGP("...elementId string=%S", elementId )
+    
+    HBufC8* elementId8 = HBufC8::NewLC( ptr.Length() );
+    TPtr8 elementIdPtr8( elementId8->Des() );
+    elementIdPtr8.Copy( ptr );
+    
+    _LOG("CLogsUiControlExtension::FetchBitmapsFromBrandingServerL(): ...")
+    _LOGP("...elementId=%S", &ptr )
+    
+    CleanupClosePushL( aBitmapFile );        
+    TLogsExtUtil::GetFileHandleL( aServiceId, 
+                                  elementIdPtr8, 
+                                  aBitmapFile, 
+                                  aBitmapId, 
+                                  aBitmapMaskId );    
+    CleanupStack::Pop( &aBitmapFile );
+
+    CleanupStack::PopAndDestroy( elementId8 );
+    elementId8 = NULL;
+    CleanupStack::PopAndDestroy( elementId );
+    elementId = NULL;
+
+    _LOG("CLogsUiControlExtension::FetchBitmapsFromBrandingServerL() end" )
+    }
+
+
+// End of File