diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/msgui/appengine/src/conversationlistchangehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/appengine/src/conversationlistchangehandler.cpp Fri Apr 16 14:56:15 2010 +0300 @@ -0,0 +1,216 @@ +/* + * 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: This Class handles Add, Delete & Modify conversation list client events. + * + */ + +#include "conversationlistchangehandler.h" + +// SYSTEM INCLUDES +#include +#include +// USER INCLUDE +#include "conversationsengine_p.h" +#include "conversationsengine.h" +#include "conversationssummarymodel.h" + +TInt ListWindowSize = 7; +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +ConversationsListChangeHandler::ConversationsListChangeHandler( + ConversationsEnginePrivate* convEnginePrivate, + ConversationsSummaryModel* conversationsSummaryModel) : + CActive(EPriorityStandard), + mCurrentState(EInit), + mFirstWindowCached(EFalse), + mCurrentIndex(-1), + mConvSummaryModel(conversationsSummaryModel), + mConvEnginePrivate(convEnginePrivate) +{ + CActiveScheduler::Add(this); +} + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +ConversationsListChangeHandler::~ConversationsListChangeHandler() +{ + mClientConversationList.ResetAndDestroy(); + // Cancel the active object + Cancel(); +} + +//----------------------------------------------------------------------- +// From CActive class. +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::RunL() +{ + if (iStatus != KErrNone) + { + // Reading events has failed + return; + } + else + { + switch (mCurrentState) + { + case EInitialCache: + { + HandleConversationListL(); + break; + } + } + } +} + +//----------------------------------------------------------------------- +// From CActive class. +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::DoCancel() +{ + mCurrentState = EListenToEvents; +} + +//----------------------------------------------------------------------- +// From CActive class. +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::ConversationListL(RPointerArray< + CCsClientConversation>& aClientConversationList) +{ + mClientConversationList.ResetAndDestroy(); + + for (TInt i = 0; i < aClientConversationList.Count(); ++i) + { + CCsClientConversation *entry = aClientConversationList[i]->CloneL(); + mClientConversationList.AppendL(entry); + } + + if (aClientConversationList.Count() > 0) + { + mCurrentIndex = 0; + mFirstWindowCached = EFalse; + mCurrentState = EInitialCache; + IssueRequest(); + } + else + { + mConvEnginePrivate->registerForConversationListUpdatesL(); + mCurrentState = EListenToEvents; + } +} + +//----------------------------------------------------------------------- +// This is for handling new conversation event asynchronusly from the server +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::AddConversationList( + const CCsClientConversation& aClientConversation) +{ + mConvSummaryModel->addRow(aClientConversation); +} + +//----------------------------------------------------------------------- +// This is for handling delete conversation event asynchronusly from the server +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::DeleteConversationList( + const CCsClientConversation& aClientConversation) +{ + mConvSummaryModel->deleteRow(aClientConversation.GetConversationEntryId()); +} + +//----------------------------------------------------------------------- +// This is for handling modify conversation event asynchronusly from the server +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::ModifyConversationList( + const CCsClientConversation& aClientConversation) +{ + mConvSummaryModel->addRow(aClientConversation); +} + +//----------------------------------------------------------------------- +// This is for handling refresh conversation event asynchronusly from the server +//----------------------------------------------------------------------- +// +void ConversationsListChangeHandler::RefreshConversationList() +{ +} + +// --------------------------------------------------------------------------- +// Make the active object alive. +// --------------------------------------------------------------------------- +// +void ConversationsListChangeHandler::IssueRequest() +{ + if (!IsActive()) + { + iStatus = KRequestPending; + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete(status, KErrNone); + } +} + +// --------------------------------------------------------------------------- +// Handles Conversation List received from server and updates into model +// --------------------------------------------------------------------------- +// +void ConversationsListChangeHandler::HandleConversationListL() +{ + for (int i = 0; i < ListWindowSize; ++i) + { + if (mCurrentIndex < mClientConversationList.Count()) + { + mConvSummaryModel->addRow( + * (mClientConversationList[mCurrentIndex])); + mCurrentIndex++; + } + else + { + break; + } + } + if (mCurrentIndex < mClientConversationList.Count()) + { + if (!mFirstWindowCached) + { + ConversationsEngine::instance()-> + emitConversationListModelPopulated(); + mFirstWindowCached = ETrue; + } + IssueRequest(); + } + else + { + if (!mFirstWindowCached) + { + ConversationsEngine::instance()-> + emitConversationListModelPopulated(); + mFirstWindowCached = ETrue; + } + mClientConversationList.ResetAndDestroy(); + mConvEnginePrivate->registerForConversationListUpdatesL(); + mCurrentState = EListenToEvents; + } + +} + +// EOF