--- /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