phonebookui/Phonebook2/spbcontentprovider/src/spbstatusprovider.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/spbcontentprovider/src/spbstatusprovider.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,169 @@
+/*
+* Copyright (c) 2009 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: Status provider
+*
+*/
+
+
+#include "spbstatusprovider.h"
+#include "spbcontent.h"
+
+#include <presencecachereader2.h>
+#include <mpresencebuddyinfo2.h>
+#include <presencecachebuddyidcreator.h>
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::NewL
+// ---------------------------------------------------------------------------
+//
+CSpbStatusProvider* CSpbStatusProvider::NewL(
+    RPointerArray<CSpbContent>& aContentCache)
+    {
+    CSpbStatusProvider* self = new (ELeave) CSpbStatusProvider(aContentCache);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::CSpbStatusProvider
+// ---------------------------------------------------------------------------
+//
+inline CSpbStatusProvider::CSpbStatusProvider(
+    RPointerArray<CSpbContent>& aContentCache ) :
+    iContentCache(aContentCache) 
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::ConstructL
+// ---------------------------------------------------------------------------
+//
+inline void CSpbStatusProvider::ConstructL()
+    {	
+    iPresenceCache = MPresenceCacheReader2::CreateReaderL();
+    iPresenceCache->SetObserverForSubscribedNotifications( this );
+    iBuddyIdCreator = CPresenceCacheBuddyIdCreator::NewL( );
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::~CSpbStatusProvider
+// ---------------------------------------------------------------------------
+//
+CSpbStatusProvider::~CSpbStatusProvider()
+    {
+    delete iBuddyIdCreator;
+    delete iPresenceCache;
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::FindContentByBuddyId
+// ---------------------------------------------------------------------------
+//
+CSpbContent* CSpbStatusProvider::FindContentByBuddyId(
+    const TDesC& aBuddyId)
+    {
+    const TInt count(iContentCache.Count());
+    for( TInt i = 0 ; i < count ; ++i )
+        {
+        CSpbContent* content = iContentCache[i];
+        if(content->Match(aBuddyId))
+            {
+            return content;
+            }
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::NotifyChangeEventL
+// ---------------------------------------------------------------------------
+//
+void CSpbStatusProvider::NotifyChangeEventL(
+    MPresenceBuddyInfo2& aBuddyInfo,
+    CSpbContent& aContent)
+    {
+    // Check status text
+    TPtrC statusMessage(aBuddyInfo.StatusMessage());
+    // Check service icon
+    TPtrC8 brandingID( 
+        aBuddyInfo.GetAnyField( NPresenceCacheFieldName::KServiceIconBrand));
+    TPtrC8 iconEntry( 
+        aBuddyInfo.GetAnyField( NPresenceCacheFieldName::KServiceIconId));
+    aContent.StatusDataUpdatedL(statusMessage, brandingID, iconEntry);
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::FetchStatusDataL
+// ---------------------------------------------------------------------------
+//
+void CSpbStatusProvider::FetchStatusDataL( CSpbContent& aContent )
+    {
+    HBufC8* linkbuf = aContent.Link().PackLC();
+    HBufC* buddyId = iBuddyIdCreator->CreateBuddyIdLC( *linkbuf );
+    aContent.SetBuddyId( buddyId ); // takes ownership
+    CleanupStack::Pop( buddyId );
+    CleanupStack::PopAndDestroy( linkbuf );
+    
+    iPresenceCache->SubscribePresenceBuddyChangeL(*buddyId);
+
+    MPresenceBuddyInfo2* buddyInfo = iPresenceCache->PresenceInfoLC(*buddyId);
+    if(buddyInfo)
+        {
+        NotifyChangeEventL(*buddyInfo,aContent);
+        CleanupStack::PopAndDestroy(); // buddyInfo
+        }
+    else
+        {
+        aContent.StatusDataUpdatedL(KNullDesC, KNullDesC8, KNullDesC8);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::HandlePresenceReadL
+// ---------------------------------------------------------------------------
+//
+void CSpbStatusProvider::HandlePresenceReadL(
+    TInt /*aErrorCode*/,
+    RPointerArray<MPresenceBuddyInfo2>& /*aPresenceBuddyInfoList*/ )
+    {
+    // Not used
+    }
+
+// ---------------------------------------------------------------------------
+// CSpbStatusProvider::HandlePresenceNotificationL
+// ---------------------------------------------------------------------------
+//
+void CSpbStatusProvider::HandlePresenceNotificationL( 
+    TInt aErrorCode,
+    MPresenceBuddyInfo2* aPresenceBuddyInfo )
+    {
+    CleanupDeletePushL( aPresenceBuddyInfo );
+    
+    if( KErrNone == aErrorCode && aPresenceBuddyInfo )
+        {
+        CSpbContent* content = 
+            FindContentByBuddyId( aPresenceBuddyInfo->BuddyId() );
+        if( content )
+            {
+            NotifyChangeEventL( *aPresenceBuddyInfo,*content );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy(); // aPresenceBuddyInfo
+    }
+
+
+// end of file