logsui/logsserviceextension/src/clogsextservicehandler.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/logsserviceextension/src/clogsextservicehandler.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,415 @@
+/*
+* 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:  Fetches the presence status,the corresponding presence icon 
+                 and its bitmask.
+*
+*/
+
+// INCLUDE FILES
+
+//for block list
+#include <presenceblockinfo.h>
+
+// presence cache
+#include <presencecachereader2.h>
+#include <mpresencebuddyinfo2.h>
+
+#include "clogsextservicehandler.h"
+#include "clogsextensioncchhandler.h"
+#include "tlogsextutil.h"
+#include "logsextconsts.h"
+#include "clogsextpresentitydata.h"
+#include "mlogsextservicehandlerobserver.h"
+
+#include "simpledebug.h"
+
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CLogsExtServiceHandler* CLogsExtServiceHandler::NewL(
+    const TUint32 aServiceId,
+    MLogsExtServiceHandlerObserver& aObserver )
+    {
+    _LOGP("CLogsExtServiceHandler::NewL(): begin %d", aServiceId)
+    CLogsExtServiceHandler* self = 
+        CLogsExtServiceHandler::NewLC( aServiceId, aObserver );
+    CleanupStack::Pop( self );
+    _LOG("CLogsExtServiceHandler::NewL(): end" )
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CLogsExtServiceHandler* CLogsExtServiceHandler::NewLC(    
+    const TUint32 aServiceId,
+    MLogsExtServiceHandlerObserver& aObserver )
+    {
+    _LOG("CLogsExtServiceHandler::NewLC(): begin" )
+    CLogsExtServiceHandler* self = 
+        new( ELeave ) CLogsExtServiceHandler( aServiceId, aObserver );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    _LOG("CLogsExtServiceHandler::NewLC(): end" )
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ~CLogsExtServiceHandler
+// ---------------------------------------------------------------------------
+//
+CLogsExtServiceHandler::~CLogsExtServiceHandler()
+    {
+    _LOG("CLogsExtServiceHandler::~CLogsExtServiceHandler(): begin" )
+    // Trap is easiest approach for this, deletion can occur any time
+    // ( user initiated )
+    TRAP_IGNORE( UnSubscribePresenceInfosL() );
+    
+    delete iCacheReader;
+            
+    iPresentityDataArray.ResetAndDestroy();
+    
+    _LOG("CLogsExtServiceHandler::~CLogsExtServiceHandler(): end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// CLogsExtServiceHandler
+// ---------------------------------------------------------------------------
+//
+CLogsExtServiceHandler::CLogsExtServiceHandler(
+    const TUint32 aServiceId,
+    MLogsExtServiceHandlerObserver& aObserver) : 
+        iServiceId( aServiceId ),        
+        iPresentityDataArray( KPresenceFetcherArrayGranularity ),
+        iObserver( &aObserver )
+    {
+    _LOG("CLogsExtServiceHandler::CLogsExtServiceHandler(): begin" )
+    
+    _LOG("CLogsExtServiceHandler::CLogsExtServiceHandler(): end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::ConstructL()
+    {
+    _LOG("CLogsExtServiceHandler::ConstructL(): begin" )
+    
+    iCacheReader = MPresenceCacheReader2::CreateReaderL();
+    iCacheReader->SetObserverForSubscribedNotifications(this);
+    
+    _LOG("CLogsExtServiceHandler::ConstructL(): end" )  
+    }
+
+
+// ---------------------------------------------------------------------------
+// ServiceId
+// ---------------------------------------------------------------------------
+//
+TUint32 CLogsExtServiceHandler::ServiceId()
+    {
+    _LOG("CLogsExtServiceHandler::ServiceId(): start" )
+    _LOGP("CLogsExtServiceHandler::iServiceId = %d",iServiceId )
+    _LOG("CLogsExtServiceHandler::ServiceId(): finish" )
+    return iServiceId;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Tests whether presentity data object exists or not.
+// ---------------------------------------------------------------------------
+//
+TBool CLogsExtServiceHandler::PresentityDataExists( 
+    const TDesC16& aPresentityId )
+    {
+    TBool fetcherFound( EFalse );    
+    _LOG("CLogsExtServiceHandler::PresentityDataExists begin" )
+    
+    // check if there is already a presentity data object for the 
+    // speciifed presentityid
+    CLogsExtPresentityData* presData = NULL;    
+    
+    if ( KErrNone == GetPresentityData( aPresentityId, presData ) )
+        {            
+        fetcherFound = ETrue;    
+        }       
+
+    _LOGP("CLogsExtServiceHandler::PresentityDataExists %d", fetcherFound );
+    
+    _LOG("CLogsExtServiceHandler::PresentityDataExists end" )
+    return fetcherFound;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Gets presentity data object of a certain presentity.
+// ---------------------------------------------------------------------------
+//
+TInt CLogsExtServiceHandler::GetPresentityData(
+        const TDesC& aPresentityId,
+        CLogsExtPresentityData*& aPresentityData )
+    {
+    _LOG("CLogsExtServiceHandler::GetPresentityData begin" )
+    
+    TInt error( KErrNotFound );
+    TBool dataFound( EFalse );
+         
+    // check if there is already a fetcher for the brand
+    CLogsExtPresentityData* presData = NULL;
+    
+    for ( TInt i = 0 ; i < iPresentityDataArray.Count() && !dataFound; i++ )
+        {
+        presData = iPresentityDataArray[i];
+        if ( presData && aPresentityId == presData->PresentityId() )
+            {
+            dataFound = ETrue;
+            aPresentityData = presData;
+            }
+        }
+
+    error = dataFound ? KErrNone : KErrNotFound;
+    _LOGP("CLogsExtServiceHandler::GetPresentityData() error=%d",error )
+
+    _LOG("CLogsExtServiceHandler::GetPresentityData end" )
+    return error;
+    }
+
+
+//---------------------------------------------------------------------------
+// Adds the specified presentity to this service handler and starts to 
+// handle subscription/event handling etc. for this presentity.
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::AddPresentityL( const TDesC& aPresentityId )
+    {
+    _LOG("CLogsExtServiceHandler::HandlePresentityL begin" )
+    
+    //add presentityData if it not already exists,
+    //and start handling the presentity (make subscription if
+    //needed and so on)
+    DoPresentityDataCreationL( aPresentityId );
+    
+    _LOG("CLogsExtServiceHandler::HandlePresentityL end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// CLogsExtServiceHandler::HandlePresenceReadL()
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::HandlePresenceReadL(TInt /*aErrorCode*/,
+        RPointerArray<MPresenceBuddyInfo2>&  /*aPresenceBuddyInfoList*/)
+    {
+    //intentionally not implemented
+    }
+    
+	
+// ---------------------------------------------------------------------------
+// CLogsExtServiceHandler::HandlePresenceNotificationL()
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::HandlePresenceNotificationL( TInt aErrorCode,
+    MPresenceBuddyInfo2* aPresenceBuddyInfo )
+    {
+    if( aErrorCode == KErrNone && aPresenceBuddyInfo )
+        {
+        CleanupDeletePushL( aPresenceBuddyInfo );
+        TBool showStatus = EFalse;
+        TInt index = KErrNotFound;
+        MPresenceBuddyInfo2::TAvailabilityValues value = aPresenceBuddyInfo->Availability();
+        TPtrC presTextValue = aPresenceBuddyInfo->AvailabilityText();
+        TPtrC buddyId = aPresenceBuddyInfo->BuddyId();
+        
+        // Presence Cache gives only buddy id and in shown presenties array
+        // is only presentity id... so find index of that presentity which
+        // buddy id is in buddyinfo object for checking shown presentity
+        // from shown presentities array.
+        for ( TInt j = 0 ; j < iPresentityDataArray.Count(); j++ )
+                { 
+                CLogsExtPresentityData* presData = iPresentityDataArray[j];
+                if ( buddyId == presData->PresentityId() )
+                    {
+                    index = j;
+                    break;
+                    }
+                }
+        
+        if( index != KErrNotFound )
+            {
+            showStatus = ETrue;
+
+            if( value == MPresenceBuddyInfo2::EAvailable )
+                {
+                _LIT( KConvAvailable, "available" );
+                presTextValue.Set( KConvAvailable );    
+                }
+            
+            else if ( value == MPresenceBuddyInfo2::ENotAvailable /*presTextValue == KConvUnavailable*/ )
+                {
+                // Presence offline value is modified to match branding
+                _LIT( KConvOffline, "offline" );
+                presTextValue.Set( KConvOffline );
+                }
+
+            iObserver->HandlePresentityPresenceStatusL(
+                                                iServiceId,
+                                                iPresentityDataArray[index]->PresentityId(),                                            
+                                                presTextValue,
+                                                showStatus );
+            }
+
+        CleanupStack::PopAndDestroy( aPresenceBuddyInfo );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Create presentity data object for a presentity.
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::DoPresentityDataCreationL( 
+        const TDesC& aPresentityId )
+    {
+    _LOG("CLogsExtServiceHandler::DoPresentityDataCreationL begin" )
+    
+    if ( !PresentityDataExists( aPresentityId ) )
+        {
+        CLogsExtPresentityData* presData = 
+            CLogsExtPresentityData::NewLC( aPresentityId, *this );
+        iPresentityDataArray.AppendL( presData );
+        CleanupStack::Pop( presData );
+        // check the current state, make subscriptions if necessary, etc.
+        CheckServiceHandler();
+        }    
+    
+    _LOG("CLogsExtServiceHandler::DoPresentityDataCreationL end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// Subscribe presentity presence
+// ---------------------------------------------------------------------------
+//    
+void CLogsExtServiceHandler::DoPresentitySubscriptionL( 
+        CLogsExtPresentityData& aPresentityData )
+    {
+    _LOG("CLogsExtServiceHandler::DoPresentitySubscriptionL(): begin" )    
+
+    const TDesC& presentityId = aPresentityData.PresentityId();
+    
+    // Watch for changes
+    TInt err = iCacheReader->SubscribePresenceBuddyChangeL( presentityId );
+    
+    // Synch check
+    MPresenceBuddyInfo2* buddy = iCacheReader->PresenceInfoLC( presentityId );
+    aPresentityData.SetStatus( CLogsExtPresentityData::ESubscribed );
+    if ( buddy )
+        {
+        // Ownership is transferred
+        CleanupStack::Pop(); // buddy
+        HandlePresenceNotificationL( KErrNone, buddy );
+        }
+    
+    _LOG("CLogsExtServiceHandler::DoPresentitySubscriptionL(): end")         
+    }
+
+
+// ---------------------------------------------------------------------------
+// CLogsExtServiceHandler::UnSubscribePresenceInfosL
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::UnSubscribePresenceInfosL()
+    {
+    TInt contactsCount = iPresentityDataArray.Count();
+    TPtrC subUri(KNullDesC);
+    // go through the array of presentityData objects 
+    CLogsExtPresentityData* presData = NULL;
+        
+    for(TInt i=0;i<contactsCount;i++)
+        {
+        presData = iPresentityDataArray[i];
+            if ( presData )
+                {
+                iCacheReader->UnSubscribePresenceBuddyChangeL( presData->PresentityId() );
+                }
+         }  
+    }
+
+// ---------------------------------------------------------------------------
+// Determines whether the service handler has to make subscriptions
+// and also initiates those. It also informs the service handler 
+// oberver in case the status of a presentity should not be displayed
+// (e.g. because the presentity is not found from the subscribed buddy
+// list anymore)
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::CheckServiceHandler()
+    {
+    _LOG("CLogsExtServiceHandler::CheckServiceHandler() begin" )
+    
+    _LOG("CLogsExtServiceHandler::CheckServiceHandler() make check!" )
+    TRAPD( error , DoCheckServiceHandlerL(); );
+    if ( KErrNone != error )
+        {
+        _LOGP("CLogsExtServiceHandler::CheckServiceHandler()ERROR! = %d",
+            error )
+        }     
+    
+    _LOG("CLogsExtServiceHandler::CheckServiceHandler() end" )
+    }
+
+
+// ---------------------------------------------------------------------------
+// DoCheckServiceHandlerL
+// ---------------------------------------------------------------------------
+//
+void CLogsExtServiceHandler::DoCheckServiceHandlerL()
+    {
+    _LOG("CLogsExtServiceHandler::DoCheckServiceHandlerL() begin" )
+    
+    // go through the array of presentityData objects 
+    CLogsExtPresentityData* presData = NULL;
+    for ( TInt i(0); i < iPresentityDataArray.Count(); i++ )
+        {        
+        presData = iPresentityDataArray[i];
+        if ( presData )
+            {
+            TInt state = presData->Status(); 
+            
+            _LOGP("CLogsExtServiceHandler::DoCheckServiceHandlerL():state=%d",
+                state )
+
+            // subscribe those presentities which are:
+            // 1) not subcribed
+            if ( state == CLogsExtPresentityData::EUnsubscribed )
+                {
+                _LOG("CLogsExtServiceHandler::DoCheckServiceHandlerL()...")
+                _LOG("...DoPresentitySubscriptionL( *presData )" )
+                DoPresentitySubscriptionL( *presData );
+                }                  
+            }        
+        }           
+    
+    _LOG("CLogsExtServiceHandler::DoCheckServiceHandlerL() end" )
+    }
+
+//End of file