diff -r 3104fc151679 -r 9a48e301e94b imstutils/imconversationview/imcvuiengine/src/cimcvenginecontextobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imstutils/imconversationview/imcvuiengine/src/cimcvenginecontextobserver.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,298 @@ +/* +* Copyright (c) 2007-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: single context observer implementation +* +*/ + +#include "cimcvenginecontextobserver.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "imcvuiliterals.h" +#include "mimcvenginenewmessagehandler.h" +#include "imcvlogger.h" +#include +// ============================ MEMBER FUNCTIONS ============================== + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::NewL +// two phase construction +// --------------------------------------------------------- +CIMCVEngineContextObserver* CIMCVEngineContextObserver::NewL() + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::NewL() start") ); + CIMCVEngineContextObserver* self = + CIMCVEngineContextObserver::NewLC(); + CleanupStack::Pop( self ); + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::NewL() end") ); + return self; + } + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::NewLC +// two phase construction +// --------------------------------------------------------- +CIMCVEngineContextObserver* CIMCVEngineContextObserver::NewLC() + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::NewLC() start") ); + CIMCVEngineContextObserver* self = new + (ELeave) CIMCVEngineContextObserver(); + CleanupStack::PushL( self ); + self->ConstructL(); + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::NewLC() end") ); + return self; + } + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::ConstructL +// two phase construction +// --------------------------------------------------------- +void CIMCVEngineContextObserver::ConstructL() + { + } + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::~CIMCVEngineContextObserver +// destructor +// --------------------------------------------------------- +CIMCVEngineContextObserver::~CIMCVEngineContextObserver() + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::~CIMCVEngineContextObserver() start") ); + if(iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::~CIMCVEngineContextObserver() end") ); + } + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::CIMCVEngineContextObserver +// --------------------------------------------------------- +CIMCVEngineContextObserver::CIMCVEngineContextObserver() : +iCurrentReqType(EReqUnknown) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::CIMCVEngineContextObserver() start") ); + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::CIMCVEngineContextObserver() end") ); + } + +// =========================================================================== +// FROM MPRFWximpCONTEXTOBSERVER +// =========================================================================== +// +// --------------------------------------------------------- +// CIMCVEngineContextObserver::HandleximpContextEvent +// --------------------------------------------------------- +void CIMCVEngineContextObserver::HandlePresenceContextEvent( + const MXIMPContext& /*aContext*/, + const MXIMPBase& aEvent ) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::HandlePresenceContextEvent() start") ); + const TInt32 eventType = aEvent.GetInterfaceId(); + + switch( eventType ) + { + case MXIMPRequestCompleteEvent::KInterfaceId: + { + const MXIMPRequestCompleteEvent* event = + TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( aEvent, MXIMPBase::EPanicIfUnknown ); + + TXIMPRequestId reqId = event->RequestId(); + + const MXIMPStatus& status = event->CompletionResult(); + + TInt err = status.ResultCode(); + //Login request has been issued + if ((iCurrentXIMPReq == reqId) && (ELoginReq == iCurrentReqType)) + { + //Login is an synchronous call + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + if(KErrNone == err ) + { + iLoggedIn = ETrue; + } + else + { + iLoggedIn = EFalse; + } + + iCurrentReqType = EReqUnknown; + if(iSessionObserver) + { + TRAP_IGNORE( iSessionObserver->HandleConnectionEventL( ELoggedIn, KErrNone ) ); + } + } + //Logout request has been issued + else if ((iCurrentXIMPReq == reqId) && (ELogoutReq == iCurrentReqType)) + { + //Login is an synchronous call + if ( iWait.IsStarted() ) + { + iWait.AsyncStop(); + } + iLoggedIn = EFalse; + iCurrentReqType = EReqUnknown; + if(iSessionObserver) + { + TRAP_IGNORE( iSessionObserver->HandleConnectionEventL(ELoggedOut, KErrNone ) ); + } + } + //SendMessage request has been issued + else + { + // for message delivery report + if( iSessionObserver && iLoggedIn ) + { + TRAP_IGNORE( iSessionObserver->HandleDeliveryReportL(reqId, status.ResultCode() ) ); + } + } + break; + } + + case MXIMPContextStateEvent::KInterfaceId: + { + // what do we do with context state event + // state of the context can be associated with the + const MXIMPContextStateEvent* ctxtStateEvent = + TXIMPGetInterface< const MXIMPContextStateEvent >::From( aEvent, + MXIMPBase::EPanicIfUnknown ); + const MXIMPStatus* fwStatus = ctxtStateEvent->StateChangeReason(); + const MXIMPContextState& cState = ctxtStateEvent->ContextState(); + MXIMPContextState::TState state = cState.ContextState(); + + if (MXIMPContextState::EInactive == state ) + { + //No request of Login/Logout has been issued by CV + //Hence this might be a server initiated disconnect + //handle properly + if( (iSessionObserver) && (EReqUnknown == iCurrentReqType) ) + { + TRAP_IGNORE( iSessionObserver->HandleConnectionEventL(EForcedLoggedOut, KImErrServiceForceClosedSession ) ); + } + + } + break; + } + default: + { + + break; + } + } + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::HandlePresenceContextEvent() end") ); + } + + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::GetCompletedReqResult +// +// --------------------------------------------------------- +void CIMCVEngineContextObserver::GetConnectedSessionL(MXIMPContext& aContext, TInt aServiceId, TUid aProtocolUid) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::GetConnectedSessionL() start") ); + //TUid protocolUid = TUid::Uid( KProtocolUidTelepathy ); + if ( (!iLoggedIn) && (EReqUnknown == iCurrentReqType) ) + { + //iOngoingOperation = TIMCVStateEnums::EIMCVLogging; + iCurrentXIMPReq = aContext.BindToL( aProtocolUid, aServiceId ) ; + iCurrentReqType = ELoginReq; + + if( !iWait.IsStarted() ) + { + // Code scanner warning "active object called without checking + // whether it is active or cancelling it first" ignored because + // CActiveSchedulerWait is not an active object + iWait.Start(); // CSI: 10 # See above + } + + //iOngoingOperation = TIMCVStateEnums::EIMCVUnknown; + } + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::GetConnectedSessionL() end") ); + + } +// --------------------------------------------------------- +// CIMCVEngineContextObserver::GetCompletedReqResult +// +// --------------------------------------------------------- +void CIMCVEngineContextObserver::ReleaseConnectionL(MXIMPContext& aContext) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::ReleaseConnectionL() start") ); + if ( (iLoggedIn) && (EReqUnknown == iCurrentReqType) ) + { + //iOngoingOperation = TIMCVStateEnums::EIMCVLoggingOut; + iCurrentXIMPReq = aContext.UnbindL() ; + iCurrentReqType = ELogoutReq; + if( !iWait.IsStarted() ) + { + // Code scanner warning "active object called without checking + // whether it is active or cancelling it first" ignored because + // CActiveSchedulerWait is not an active object + iWait.Start(); // CSI: 10 # See above + } + } + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::ReleaseConnectionL() end") ); + + } + +// --------------------------------------------------------- +// CIMCVEngineContextObserver::IsLoggedIn +// +// --------------------------------------------------------- +TBool CIMCVEngineContextObserver::IsLoggedIn() const + { + return iLoggedIn; + } +// --------------------------------------------------------- +// CIMCVEngineContextObserver::RegisterObserver +// +// --------------------------------------------------------- +void CIMCVEngineContextObserver::RegisterObserver(MIMCVEngineServiceSessionHandler* aObserver) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::RegisterObserver() start") ); + iSessionObserver = aObserver; + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::RegisterObserver() end") ); + } +// --------------------------------------------------------- +// CIMCVEngineContextObserver::UnRegisterObserver +// +// --------------------------------------------------------- +void CIMCVEngineContextObserver::UnRegisterObserver(MIMCVEngineServiceSessionHandler* /*aObserver*/) + { + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::UnRegisterObserver() start") ); + // do not call delete + // not owned by this class + iSessionObserver = NULL; + IM_CV_LOGS(TXT("CIMCVEngineContextObserver::UnRegisterObserver() end") ); + } +// --------------------------------------------------------- +// CIMCVEngine::SetLoggedIn() +// --------------------------------------------------------- +// +void CIMCVEngineContextObserver::SetLoggedIn(TBool aState) + { + iLoggedIn = aState; + } + +// end of file +