diff -r 000000000000 -r e686773b3f54 ccservices/cmsservices/cmsengine/Client/src/cmscontactnotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ccservices/cmsservices/cmsengine/Client/src/cmscontactnotifier.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,308 @@ +/* +* 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: +* +*/ + + +#include +#include "cmscontact.h" +#include "cmssession.h" +#include "cmscontactfield.h" +#include "cmscontactfielditem.h" +#include "cmsnotificationhandlerapi.h" +#include "cmscontactnotifier.h" +#include "cmscommondefines.h" + + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CCmsContactNotifier::CCmsContactNotifier +// ---------------------------------------------------------- +// +CCmsContactNotifier::CCmsContactNotifier( + RCmsContact& aContact, + MCmsNotificationHandlerAPI& aObserver, + CCmsContactFieldItem::TCmsContactNotification aType ) + : CActive( CActive::EPriorityStandard), + iContact( aContact ), + iStreamDesc( ( TText* )"", 0, 0 ), + iObserver( aObserver ), + iPresenceStarted( EFalse ), + iPhonebookStarted( EFalse ), + iDestroyedPtr( NULL ), + iType( aType ), + iContactField( NULL ) + { + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::~CCmsContactNotifier +// ---------------------------------------------------------- +// +CCmsContactNotifier::~CCmsContactNotifier() + { + Cancel(); + delete iStreamBuffer; + delete iContactField; + if ( iDestroyedPtr ) + { + // We are called inside callback + *iDestroyedPtr = ETrue; + iDestroyedPtr = NULL; + } + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::NewL +// ---------------------------------------------------------- +// +CCmsContactNotifier* CCmsContactNotifier::NewL( + RCmsContact& aContact, + MCmsNotificationHandlerAPI& aObs, + CCmsContactFieldItem::TCmsContactNotification aType ) + { + CCmsContactNotifier* self = new (ELeave) CCmsContactNotifier( aContact, aObs, aType ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCmsContactNotifier::ConstructL +// --------------------------------------------------------------------------- +// +void CCmsContactNotifier::ConstructL( ) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CCmsContactNotifier::StartOrderL +// --------------------------------------------------------------------------- +// +void CCmsContactNotifier::StartOrderL( TBool aAskMore ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::StartOrderL() - Ask more: %d" ), aAskMore ); + #endif + + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + else + { + } + + if ( iType & CCmsContactFieldItem::ECmsPresenceAllNotification ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( " Presence notification ordered type=%d" ), iType ); + #endif + StartPresenceNotifyL( aAskMore ); + } + else if ( iType & CCmsContactFieldItem::ECmsPhonebookNotification ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( " Phonebook notification ordered" ) ); + #endif + StartPhoneboookNotifyL( aAskMore ); + } + else + { + User::Leave( KErrNotSupported ); + } + } + +// --------------------------------------------------------------------------- +// CCmsContactNotifier::StartPhoneboookNotifyL +// +// --------------------------------------------------------------------------- +// +void CCmsContactNotifier::StartPhoneboookNotifyL( TBool aAskMore ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::StartPhoneboookNotifyL()" ) ); + #endif + if( !iPhonebookStarted ) + { + delete iStreamBuffer; + iStreamBuffer = NULL; + iStreamBuffer = HBufC::NewL( 5 ); + iStreamDesc.Set( iStreamBuffer->Des() ); + TIpcArgs arguments( iType, &iStreamDesc ); + if( !aAskMore ) + { + iContact.SendMessage( ECmsOrderNotification, arguments, iStatus ); + } + else + { + iContact.SendMessage( ECmsOrderNextNotification, arguments, iStatus ); + } + iPhonebookStarted = ETrue; + SetActive(); + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( " Notification started" ) ); + #endif + } + else + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( " Notification already started => ignore" ) ); + #endif + } + } + +// --------------------------------------------------------------------------- +// CCmsContactNotifier::StartPresenceNotifyL +// +// --------------------------------------------------------------------------- +// +void CCmsContactNotifier::StartPresenceNotifyL( TBool aAskMore ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::StartPresenceNotifyL()" ) ); + #endif + delete iContactField; + iContactField = NULL; + iContactField = CCmsContactField::NewL( iContact, iStatus, + CCmsContactFieldItem::ECmsPresenceData ); + TIpcArgs arguments( iType, iContactField->StreamDesc8() ); + if( !aAskMore ) + { + iContact.SendMessage( ECmsOrderNotification, arguments, iContactField->Activate() ); + } + else + { + iContact.SendMessage( ECmsOrderNextNotification, arguments, iContactField->Activate() ); + } + SetActive(); + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::RunL +// ---------------------------------------------------------- +// +void CCmsContactNotifier::RunL() + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::RunL() - Status: %d" ), iStatus.Int() ); + #endif + TInt pbEvent = KErrGeneral; + TInt status = iStatus.Int(); + if( status ) + { + RunError( status ); + } + else + { + // Set the member to point to stack variable + TBool destroyed( EFalse ); + iDestroyedPtr = &destroyed; + if ( CCmsContactFieldItem::ECmsPresenceAllNotification & Type() ) + { + TRAP_IGNORE( iObserver.HandlePresenceNotificationL( iContactField ) ); + } + else if( CCmsContactFieldItem::ECmsPhonebookNotification == Type() ) + { + TLex lex( iStreamDesc ); + TInt event = KErrNotFound; + lex.Val( event ); + iPhonebookStarted = EFalse; + TRAP_IGNORE( iObserver.HandlePhonebookNotificationL( ( TCmsPhonebookEvent )event ) ); + pbEvent = event; + } + else + { + RunError( KErrNotSupported ); + } + if ( !destroyed ) + { + iDestroyedPtr = NULL; + } + CheckRestartL( destroyed, ( TCmsPhonebookEvent )pbEvent ); + } + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::CheckRestartL +// +// ---------------------------------------------------------- +// +void CCmsContactNotifier::CheckRestartL( TBool aDestroyed, TCmsPhonebookEvent aEvent ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::CheckRestartL()" ) ); + #endif + //If the object has been deleted inside the callback or + //if the contact handle has been deleted in the server, + //notifications must not be re-ordered + if( !aDestroyed && ECmsContactDeleted != aEvent ) + { + // Ownership is transferred + iContactField = NULL; + StartOrderL( ETrue ); + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( " Notification renewed" ) ); + #endif + } + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::RunError +// ---------------------------------------------------------- +// +TInt CCmsContactNotifier::RunError( TInt aError ) + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::RunError() - Error: %d" ), aError ); + #endif + // Save this since we ask to delete ourself and members cannot be used anymore. + MCmsNotificationHandlerAPI& observer = iObserver; + CCmsContactFieldItem::TCmsContactNotification myType = Type(); + iContact.DeleteNotifier( myType ); + observer.CmsNotificationTerminatedL( aError, myType ); + return KErrNone; + } + +// ---------------------------------------------------------- +// CCmsContactNotifier::DoCancel +// ---------------------------------------------------------- +// +void CCmsContactNotifier::DoCancel() + { + #ifdef _DEBUG + RCmsSession::WriteToLog( _L8( "CCmsContactNotifier::DoCancel()" ) ); + #endif + TIpcArgs arguments( iType ); + iContact.SendMessage( ECmsCancelNotification, arguments ); + if ( CCmsContactFieldItem::ECmsPresenceAllNotification & Type() ) + { + iContactField->Cancel(); + } + } + +// ---------------------------------------------------------- +// +CCmsContactFieldItem::TCmsContactNotification CCmsContactNotifier::Type() + { + return iType; + } + + +