--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/servicewidget/servicewidgetdatapublisher/src/cservicewidgetmessagehandler.cpp Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,249 @@
+/*
+* 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: message handler notification
+ *
+ *
+*/
+
+
+#include "cservicewidgetmessagehandler.h"
+#include "mservicewidgetobservers.h"
+#include "swpdebugtrace.h"
+//im cache
+#include <cimcachefactory.h>
+#include <mimcacheaccessor.h>
+#include <apgtask.h>
+#include <coemain.h>
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::CServiceWidgetMessageHandler
+// ---------------------------------------------------------------------------
+//
+CServiceWidgetMessageHandler::CServiceWidgetMessageHandler(
+ MServiceWidgetNewMessageObserver& aMessageObserver )
+ :iMessageObserver( aMessageObserver )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::CServiceWidgetMessageHandler") );
+ }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CServiceWidgetMessageHandler* CServiceWidgetMessageHandler::NewL(
+ MServiceWidgetNewMessageObserver& aMessageObserver,
+ TInt aServiceId,
+ const TDesC& aOwnUserId )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::NewL() start") );
+ CServiceWidgetMessageHandler* self = NewLC(aMessageObserver,
+ aServiceId,
+ aOwnUserId);
+ CleanupStack::Pop(self);
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::NewL() end") );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CServiceWidgetMessageHandler* CServiceWidgetMessageHandler::NewLC(
+ MServiceWidgetNewMessageObserver& aMessageObserver,
+ TInt aServiceId,
+ const TDesC& aOwnUserId )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::NewLC() start") );
+ CServiceWidgetMessageHandler* self =
+ new (ELeave) CServiceWidgetMessageHandler(aMessageObserver );
+ CleanupStack::PushL(self);
+ self->ConstructL( aOwnUserId ,aServiceId );
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::NewLC() end") );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CServiceWidgetMessageHandler::ConstructL( const TDesC& aOwnUserId, TInt aServiceId )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::ConstructL() start") );
+ iIMCacheFactory = CIMCacheFactory::InstanceL();
+ iAccessor = iIMCacheFactory->CreateAccessorL( aServiceId, aOwnUserId );
+ iAccessor->RegisterObserverL(*this);
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::ConstructL() end") );
+ }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::~CServiceWidgetMessageHandler
+// ---------------------------------------------------------------------------
+//
+CServiceWidgetMessageHandler::~CServiceWidgetMessageHandler()
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::~CServiceWidgetMessageHandler() start") );
+ if( iIMCacheFactory )
+ {
+ if( iAccessor )
+ {
+ iAccessor->UnRegisterObserver(*this);
+ }
+ CIMCacheFactory::Release();
+ }
+ iSendersArray.ResetAndDestroy();
+
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::~CServiceWidgetMessageHandler() end") );
+ }
+
+// -----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::GetUnreadMessageCountL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CServiceWidgetMessageHandler::GetUnreadMessageCountL()
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::GetUnreadMessageCountL()") );
+ return iAccessor->GetAllUnreadMessageCountL() ;
+ }
+//-----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::HandleIMCacheEventL
+// ( Other items commented in header )
+//-----------------------------------------------------------------------------
+
+void CServiceWidgetMessageHandler::HandleIMCacheEventL(TIMCacheEventType aEventType, TAny* aChatMessage )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::HandleIMCacheEventL() start") );
+ switch( aEventType )
+ {
+ case EIMCacheUnreadMessage :
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::HandleIMCacheEventL() EIMCacheUnreadMessage ") );
+ if (!aChatMessage)
+ {
+ return;
+ }
+ SIMCacheMessageData* chatData = static_cast<SIMCacheMessageData*>( aChatMessage ) ;
+ // check that buddy id exists
+ if ( chatData->iBuddyId )
+ {
+ TPtrC buddyId = chatData->iBuddyId->Des();
+ TPtrC messageText = chatData->iText->Des();
+ if( !IsExistInSendersArrayL( buddyId ) ) // append only if not exist
+ {
+ HBufC* sender = buddyId.AllocLC();
+ if( sender )
+ {
+ iSendersArray.InsertL( sender ,0 ); // ownership to array
+ CleanupStack::Pop(sender); //
+ }
+ }
+ iMessageObserver.HandleNewMessageL( buddyId, messageText );
+ }
+ break;
+ }
+ case EIMCacheUnreadChange :
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::HandleIMCacheEventL() EIMCacheUnreadChange ") );
+ SynchronizeSendersArrayL();
+ iMessageObserver.HandleCountChangedL();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::HandleIMCacheEventL() end ") );
+ }
+
+// -----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::GetUnreadSenderId
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+const TDesC& CServiceWidgetMessageHandler::GetUnreadSenderId()
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::GetUnreadSenderId() start") );
+ if( iSendersArray.Count() )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::GetUnreadSenderId() end") );
+ return *( iSendersArray[ 0 ] ); // latest sender always on top
+ }
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::GetUnreadSenderId() end") );
+ return KNullDesC;
+ }
+
+// -----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::IsSingleMessageSender
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CServiceWidgetMessageHandler::IsSingleMessageSender()
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::IsSingleMessageSender()") );
+ return ( iSendersArray.Count() == 1 );
+ }
+
+// -----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::IsExistInSendersArrayL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CServiceWidgetMessageHandler::IsExistInSendersArrayL( const TDesC& aNewSenderId )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::IsExistInSendersArrayL() start") );
+ TInt count = iSendersArray.Count();
+ for( TInt i=0; i<count; i++ )
+ {
+ HBufC* senderId = iSendersArray[i];
+ if( senderId && aNewSenderId.Compare( *senderId ) == 0 )
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::IsExistInSendersArrayL() end") );
+ return ETrue;
+ }
+ }
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::IsExistInSendersArrayL() end") );
+ return EFalse;
+ }
+// -----------------------------------------------------------------------------
+// CServiceWidgetMessageHandler::SynchronizeSendersArrayL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CServiceWidgetMessageHandler::SynchronizeSendersArrayL()
+ {
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::SynchronizeSendersArrayL() start") );
+ TInt count = iSendersArray.Count();
+ for( TInt i=0; i < count; i++ )
+ {
+ HBufC* senderId = iSendersArray[i];
+ if( senderId )
+ {
+ TInt unreadCount = iAccessor->GetUnreadMessageCountL(*senderId ) ;
+ if( !unreadCount )
+ {
+ iSendersArray.Remove( i );
+ delete senderId;
+ senderId = NULL;
+ iSendersArray.Compress();
+ break;
+ }
+ }
+ }
+ TRACE_SWP(TXT("CServiceWidgetMessageHandler::SynchronizeSendersArrayL() end") );
+ }
+
+// end of file
+
+