diff -r 1fc85118c3ae -r 870918037e16 eventsui/eventshandlerui/eventshandlerserver/src/evthandlerserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eventsui/eventshandlerui/eventshandlerserver/src/evthandlerserver.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,416 @@ +/* +* 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: server implementation for Events Handler Server +* +*/ + + +#include "evthandlerclientserver.h" +#include "evthandlerserversession.h" +#include "evthandlerserverconsts.h" +#include "evtnotifierhandler.h" +#include "evtmgmtuiengine.h" +#include "evtevent.h" +#include "evtdebug.h" + +#include "evthandlerserver.h" + +#include // CAknGlobalNote +#include +#include +#include +#include +#include + +static const TInt KHandlerAppUid = 0x2001E668; +_LIT(KHandlerEXE, "evthandler.exe"); +_LIT( KDelimiter, ":"); + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::CEvtHandlerServer() +// --------------------------------------------------------------------------- +// +inline CEvtHandlerServer::CEvtHandlerServer() + :CServer2( 0, ESharableSessions ), + iEventsQueue( KEvtItemArrayGranularity ) + {} + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::~CEvtHandlerServer() +// --------------------------------------------------------------------------- +// +CEvtHandlerServer::~CEvtHandlerServer() + { + EVTUIDEBUG( "+ CEvtHandlerServer::~CEvtHandlerServer()" ); + if( iEvtSnoozeHandler ) + { + delete iEvtSnoozeHandler; + } + + if( iEvtNotifierHandler ) + { + delete iEvtNotifierHandler; + } + + iEventsQueue.Close(); + + EVTUIDEBUG( "- CEvtHandlerServer::~CEvtHandlerServer()" ); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::NewLC() +// --------------------------------------------------------------------------- +// +CServer2* CEvtHandlerServer::NewLC() + { + EVTUIDEBUG( "+ CEvtHandlerServer::NewLC()" ); + CEvtHandlerServer* self = new ( ELeave ) CEvtHandlerServer; + CleanupStack::PushL( self ); + self->ConstructL(); + EVTUIDEBUG( "- CEvtHandlerServer::NewLC()" ); + return self; + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::ConstructL() +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::ConstructL() +/* + * 2nd phase construction - ensure the timer and server objects are running + */ + { + EVTUIDEBUG( "+ CEvtHandlerServer::ConstructL()" ); + StartL( KEvtHandlerServerName ); + iShutdownTimer.ConstructL(); + iEvtSnoozeHandler = CEvtSnoozeHandler::NewL( *this ); + EVTUIDEBUG( "- CEvtHandlerServer::ConstructL()" ); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::NewSessionL() +// --------------------------------------------------------------------------- +// +CSession2* CEvtHandlerServer::NewSessionL( const TVersion&, const RMessage2& ) const +/* + * Cretae a new client session. This should really check the version number. + */ + { + EVTUIDEBUG( "+ CEvtHandlerServer::NewSessionL()" ); + return new ( ELeave ) CEvtHandlerServerSession(); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::HandleNewEventL() +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::HandleNewEventL( const TEvtEventId aEventId, const TInt aAccuracy ) + { + EVTUIDEBUG2("+ CEvtHandlerServer::HandleNewEventL() - EventId = %d, Accuracy = %d", aEventId, aAccuracy); + iShutdownTimer.Cancel(); + + // Stop any running request + delete iEvtNotifierHandler; + iEvtNotifierHandler = NULL; + + // Remove if it was present in Snooze Que + TTime time; + time.HomeTime(); + TEvtSnoozeItem snoozeItem( aEventId, static_cast(aAccuracy), time ); + iEvtSnoozeHandler->RemoveIfPresent( snoozeItem ); + + // Create an Event Info structure + TEvtEventInfo evtInfo( aEventId, static_cast(aAccuracy), ETrue, ETrue ); + + TIdentityRelation matcher(TEvtEventInfo::Match); + TInt index = iEventsQueue.Find(evtInfo,matcher); + + // Remove if it was present in Notifier Que + if( index != KErrNotFound ) + { + iEventsQueue.Remove( index ); + } + + // Append this element to the front of queue + iEventsQueue.Insert( evtInfo, 0 ); + + // Restart the request handling process + HandleNextEventL(); + EVTUIDEBUG("- CEvtHandlerServer::HandleNewEventL()"); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::HandleNextEventL() +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::HandleNextEventL() + { + EVTUIDEBUG( "+ CEvtHandlerServer::HandleNextEventL()") + TInt evtCount = iEventsQueue.Count(); + if( evtCount ) + { + EVTUIDEBUG1( "EventId = %d", iEventsQueue[ 0 ].iEventId ); + iEvtNotifierHandler = CEvtNotifierHandler::NewL( *this, iEventsQueue[ 0 ] ); + + // Check if the Event is Launchable - Is it present and Active + if( iEvtNotifierHandler->IsLaunchable() ) + { + iEvtNotifierHandler->StartEvtNotifierL(); + + // Set the tone play to False So that it does not play tone next time. + if( iEventsQueue[ 0 ].iPlayTone ) + iEventsQueue[ 0 ].iPlayTone = EFalse; + } + else + { + delete iEvtNotifierHandler; + iEvtNotifierHandler = NULL; + + iEventsQueue.Remove( 0 ); + evtCount = iEventsQueue.Count(); + } + } + + if( !evtCount ) + { + if( iEvtSnoozeHandler->IsSnoozeQueEmpty() ) + { + EVTUIDEBUG( "Handler Server shutdown") + iShutdownTimer.Start(); + } + } + EVTUIDEBUG( "- CEvtHandlerServer::HandleNextEventL()" ); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::SnoozeCompleteL() +// +// Derived from MEvtSnoozeObserver +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::SnoozeCompleteL( + TEvtSnoozeItem& aSnoozeItem, + TBool aSnoozeAgain ) + { + EVTUIDEBUG2("+ CEvtHandlerServer::SnoozeCompleteL() - EventId = %d, Snooze = %d", + aSnoozeItem.iEventId, aSnoozeAgain); + + // Stop any running request + delete iEvtNotifierHandler; + iEvtNotifierHandler = NULL; + + // Create an Event Info structure + TEvtEventInfo evtInfo( aSnoozeItem.iEventId, aSnoozeItem.iAccuracy, ETrue, aSnoozeAgain ); + + // Append this element to the front of queue + iEventsQueue.Insert( evtInfo, 0 ); + + // Restart the request handling process + HandleNextEventL(); + EVTUIDEBUG("- CEvtHandlerServer::SnoozeCompleteL()"); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::HandlerCompleteL() +// +// Derived from MEvtNotifierObserver +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::HandlerCompleteL( + TEvtInfoNoteResult aResult, + CEvtEvent* aEvent ) + { + EVTUIDEBUG2( "+ CEvtHandlerServer::HandlerCompleteL() - EventId = %d, Notifier Action = %d", iEventsQueue[ 0 ].iEventId, aResult ); + + TEvtEventId evtId = aEvent->EventId(); + TBool repeat = aEvent->Repeat(); + + // Delete the previous running instance of the server + delete iEvtNotifierHandler; + iEvtNotifierHandler = NULL; + + switch( aResult ) + { + case EOpenTrigger: + case EShowDetails: + { + EVTUIDEBUG( "Open Event" ); + + TBuf8< KEvtCommandMessageLength > buffer; + buffer.AppendNum( evtId ); + buffer.Append( KDelimiter ); + buffer.AppendNum( aResult ); + buffer.Append( KDelimiter ); + + // Create a session to Windows server to check the running of + // handler ui + RWsSession ws; + User::LeaveIfError( ws.Connect() ); + CleanupClosePushL( ws ); // pushing to cleanupstack + + // Check if Handler Application is already running. Incase its + // send the command message to the application + TApaTaskList taskList( ws ); + TApaTask task = taskList.FindApp( TUid::Uid( KHandlerAppUid ) ); + if ( task.Exists() ) + { + // Bring the task to the foreground and send a message to it. + task.BringToForeground(); + User::LeaveIfError( task.SendMessage( TUid::Uid( KUidApaMessageSwitchOpenFileValue ), buffer )); + } + else + { + + // Start and instance of the new application + LaunchAppL( TUid::Uid( KHandlerAppUid), buffer ); + } + CleanupStack::PopAndDestroy(); // ws + + // Remove if it was present in Snooze Que + TTime time; + time.HomeTime(); + TEvtSnoozeItem snoozeItem( iEventsQueue[0].iEventId, iEventsQueue[0].iAccuracy, time ); + iEvtSnoozeHandler->RemoveIfPresent( snoozeItem ); + break; + } + case ESnoozeTrigger: + { + EVTUIDEBUG( "Snooze Event" ); + TTime time; + time.HomeTime(); + TEvtSnoozeItem snoozeItem( iEventsQueue[0].iEventId, iEventsQueue[0].iAccuracy, time ); + iEvtSnoozeHandler->Snooze( snoozeItem ); + break; + } + case ECloseInfoNote: + { + EVTUIDEBUG( "Closing Note" ); + + // Update State if needed. + if( !repeat ) + ChangeStateL( evtId ); + + // Remove if it was present in Snooze Que + TTime time; + time.HomeTime(); + TEvtSnoozeItem snoozeItem( iEventsQueue[0].iEventId, iEventsQueue[0].iAccuracy, time ); + iEvtSnoozeHandler->RemoveIfPresent( snoozeItem ); + break; + } + default: + { + // Remove if it was present in Snooze Que + TTime time; + time.HomeTime(); + TEvtSnoozeItem snoozeItem( iEventsQueue[0].iEventId, iEventsQueue[0].iAccuracy, time ); + iEvtSnoozeHandler->RemoveIfPresent( snoozeItem ); + break; + } + } + + // The note has been handled. Remove the note from the queue + iEventsQueue.Remove( 0 ); + + HandleNextEventL(); + EVTUIDEBUG( "- CEvtHandlerServer::HandlerCompleteL()" ); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::ChangeStateL() +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::ChangeStateL( TEvtEventId aEvtId ) + { + EVTUIDEBUG1( "Change State of %d", aEvtId ); + TBuf16< KEvtCommandMessageLength > buffer; + buffer.AppendNum( EEvtActionChangeState ); + buffer.Append( KDelimiter ); + buffer.AppendNum( aEvtId ); + + RProcess proc; + TInt retVal = proc.Create( KHandlerEXE(), buffer); + if(retVal == KErrNone) + { + proc.Resume(); + } + proc.Close(); + } + +// --------------------------------------------------------------------------- +// CEvtHandlerServer::LaunchAppL() +// --------------------------------------------------------------------------- +// +void CEvtHandlerServer::LaunchAppL( + TUid aApplicationUid, + const TDesC8& aCmdLineArg ) + { + DEBUG("+ CEvtHandlerServer::LaunchAppL"); + + // Create the Session handle and connect to the Application architecture + // server. This is required to obtain the details of the application from + // the Application UID. + RApaLsSession lsSession; + User::LeaveIfError( lsSession.Connect() ); + CleanupClosePushL( lsSession ); + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Get the Application Information"); + // Get the Application Information. + TApaAppInfo appInfo; + TInt error = lsSession.GetAppInfo( appInfo, aApplicationUid ); + if ( error ) + { + EVTUIDEBUG1("Get the Application Information Error : %d", error ); + User::Leave( error ); + } + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Fill the command line argument structure"); + // Fill the command line argument structure + CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Set the Application name"); + // Set the Application name. + TFileName appName = appInfo.iFullName; + cmdLine->SetExecutableNameL( appName ); + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Set the Command"); + // Set the Command + cmdLine->SetCommandL( EApaCommandRun ); + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Set the Command line arguments"); + // Set the Command line arguments. + if ( aCmdLineArg.Length()) + { + // These arguments would be sent as Tail end arguments to the launched + // Application. Its left to the application to handle those + HBufC8* tailEnd = HBufC8::NewLC( aCmdLineArg.Length()); + tailEnd->Des().Copy( aCmdLineArg ); + + // The Tail end buffer is copied to the Command line structure. Hence, + // can delete this variable after the set operation succeeds. + cmdLine->SetTailEndL( tailEnd->Des()); + + CleanupStack::PopAndDestroy( tailEnd ); + } + + DEBUG("+ CEvtHandlerServer::LaunchAppL - Start the Application"); + // Start the Application + User::LeaveIfError( lsSession.StartApp( *cmdLine )); + + // Clean up all the allocated heap variables. + CleanupStack::PopAndDestroy( cmdLine ); + CleanupStack::PopAndDestroy(); //lsSession + + DEBUG("- CEvtHandlerServer::LaunchAppL"); + } +// End of File