diff -r 6a20128ce557 -r ebfee66fde93 messagingapp/msgappfw/client/src/ccsnotificationhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgappfw/client/src/ccsnotificationhandler.cpp Fri Jun 04 10:25:39 2010 +0100 @@ -0,0 +1,302 @@ +/* +* 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: This class handles asynchronous notifications (e.g. new messages) +* from server to client. +* +*/ + +// SYSTEM INCLUDES +#include +#include +#include +#include + +// USER INCLUDES +#include "ccsdebug.h" + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CCsNotificationHandler* CCsNotificationHandler:: +NewL(CCSRequestHandler* aRequestHandler) + { + PRINT ( _L("Enter CCsNotificationHandler::NewL") ); + + CCsNotificationHandler* self = new ( ELeave ) CCsNotificationHandler(); + CleanupStack::PushL( self ); + self->ConstructL(aRequestHandler); + CleanupStack::Pop(); + + PRINT ( _L("End CCsNotificationHandler::NewL") ); + + return( self ) ; + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::CCsNotificationHandler() +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +CCsNotificationHandler::CCsNotificationHandler() +: CActive( EPriorityStandard ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::~CCsNotificationHandler() +// Destructor. +// ----------------------------------------------------------------------------- +CCsNotificationHandler::~CCsNotificationHandler() + { + // Unsubscribe + TRAP_IGNORE(RemoveChangeEventL()); + + Cancel(); + + iSession.Close(); + + if ( iNotificationBuffer ) + { + delete iNotificationBuffer; + iNotificationBuffer = NULL; + } + + if ( iNextReqIDBuffer ) + { + delete iNextReqIDBuffer; + iNextReqIDBuffer = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::ConstructL(CCSRequestHandler* aRequestHandler) + { + iRequestHandler = aRequestHandler; + iLastReqID = -1; + iNextReqIDBuffer = NULL; + iNotificationBuffer = NULL; + + User::LeaveIfError( iSession.Connect() ); + + // Subscribe + RequestChangeEventL(); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RunL() +// Invoked to handle responses from the server. +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RunL() + { + TInt currentReqID = 0; + if ( iNextReqIDBuffer ) + { + TLex8 lex(iNextReqIDBuffer->Des()); + lex.Val(currentReqID); + + delete iNextReqIDBuffer; + iNextReqIDBuffer = NULL; + } + + switch ( iStatus.Int() ) + { + case EAddConversationListEvent: + iRequestHandler->HandleAddConversationList(iNotificationBuffer); + break; + + case EDeleteConversationListEvent: + iRequestHandler->HandleDeleteConversationList(iNotificationBuffer); + break; + + case EModifyConversationListEvent: + iRequestHandler->HandleModifyConversationList(iNotificationBuffer); + break; + + case EAddConversationEvent: + iRequestHandler->HandleAddConversation(iNotificationBuffer); + break; + + case EDeleteConversationEvent: + iRequestHandler->HandleDeleteConversation(iNotificationBuffer); + break; + + case EModifyConversationEvent: + iRequestHandler->HandleModifyConversation(iNotificationBuffer); + break; + + case ECachingStartedEvent: + iRequestHandler->HandleCachingStarted(iNotificationBuffer); + break; + + case ECachingCompletedEvent: + iRequestHandler->HandleCachingCompleted(iNotificationBuffer); + break; + + case ECachingErrorEvent: + iRequestHandler->HandleCachingError(iNotificationBuffer); + break; + + case ERefreshConversationListEvent: + iRequestHandler->HandleRefreshConversationList(iNotificationBuffer); + break; + + case ERefreshConversationEvent: + iRequestHandler->HandleRefreshConversation(iNotificationBuffer); + break; + } + + iLastReqID = currentReqID; + RequestChangeEventL(); // re-subscribe + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::DoCancel() +// Cancels any outstanding operation. +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::DoCancel() + { + // Do nothing + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RequestChangeEventL +// Request server for any change events +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RequestChangeEventL() + { + // Create a buffer to store the search results. + if ( iNotificationBuffer ) + { + delete iNotificationBuffer; + iNotificationBuffer = NULL; + } + iNotificationBuffer = HBufC8::NewL(KBufferMaxLen); + + if ( iNextReqIDBuffer ) + { + delete iNextReqIDBuffer; + iNextReqIDBuffer = NULL; + } + iNextReqIDBuffer = HBufC8::NewL(4); + + iSession.RequestChangeEventL(iLastReqID, + iNextReqIDBuffer->Des(), + iNotificationBuffer->Des(), + iStatus ); + + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RemoveChangeEventL +// Remove for any change events +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RemoveChangeEventL() + { + iSession.RemoveChangeEventL(); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RequestConversationListChangeEventL +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RequestConversationListChangeEventL() + { + iSession.SetConversationListChangeObserverL(); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RemoveConversationListChangeEventL +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RemoveConversationListChangeEventL() + { + iSession.ResetConversationListChangeObserverL(); + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RequestConversationChangeEventL +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RequestConversationChangeEventL +(CCsClientConversation* aClientConversation) + { + // Set ConversationChangeObserver for aClientConversation in server + // Tmp buffer + CBufFlat* dataBuf = CBufFlat::NewL(KBufferMaxLen); + CleanupStack::PushL(dataBuf); + + // Stream over the temp buffer + RBufWriteStream dataStream(*dataBuf); + dataStream.PushL(); + + // Write the Client Conversation in the stream + aClientConversation->ExternalizeL(dataStream); + dataStream.CommitL(); + + //------------------Input Buffer-------------------------- + + // Create a HBufC8 for IPC + iRequestBuffer = HBufC8::NewL(dataBuf->Size()); + TPtr8 dataPtr(iRequestBuffer->Des()); + dataBuf->Read(0, dataPtr, dataBuf->Size()); + + CleanupStack::PopAndDestroy(2, dataBuf); + + // Send the request + iSession.SetConversationChangeObserverL(iRequestBuffer->Des()); + + // Cleanup + delete iRequestBuffer; + iRequestBuffer = NULL; + } + +// ----------------------------------------------------------------------------- +// CCsNotificationHandler::RemoveConversationChangeEventL +// ----------------------------------------------------------------------------- +void CCsNotificationHandler::RemoveConversationChangeEventL +(CCsClientConversation* aClientConversation) + { + // Set ConversationChangeObserver for aClientConversation in server + // Tmp buffer + CBufFlat* dataBuf = CBufFlat::NewL(KBufferMaxLen); + CleanupStack::PushL(dataBuf); + + // Stream over the temp buffer + RBufWriteStream dataStream(*dataBuf); + dataStream.PushL(); + + // Write the Client Conversation in the stream + aClientConversation->ExternalizeL(dataStream); + dataStream.CommitL(); + + //------------------Input Buffer-------------------------- + + // Create a HBufC8 for IPC + iRequestBuffer = HBufC8::NewL(dataBuf->Size()); + TPtr8 dataPtr(iRequestBuffer->Des()); + dataBuf->Read(0, dataPtr, dataBuf->Size()); + + CleanupStack::PopAndDestroy(2, dataBuf); + + // Send the request + iSession.ResetConversationChangeObserverL(iRequestBuffer->Des()); + + // Cleanup + delete iRequestBuffer; + iRequestBuffer = NULL; + } + +// EOF