calendarui/controller/src/calenstate.cpp
changeset 0 f979ecb2b13e
child 13 1984aceb8774
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/controller/src/calenstate.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,349 @@
+/*
+* 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:   Calendar state machine
+*
+*/
+
+
+
+// includes
+#include "calendarui_debug.h"           // Debug macros
+#include "calenstate.h"                 // Calendar States
+#include "calencontroller.h"
+#include "calenstatemachine.h"
+#include "calennotifier.h"
+#include "calenasynccallback.h"
+
+// ----------------------------------------------------------------------------
+// CCalenState::CCalenState
+// C++ constructor
+// ----------------------------------------------------------------------------
+CCalenState::CCalenState( CCalenController& aController,RHashSet<TCalenNotification>&  aOutstandingNotifications )
+    : iController( aController ),
+      iOutstandingNotifications( aOutstandingNotifications ),
+      iPreviousState( CCalenStateMachine::ECalenIdleState )
+    {
+    TRACE_ENTRY_POINT;
+
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::ConstructL
+// second phase construction
+// ----------------------------------------------------------------------------
+void CCalenState::BaseConstructL()
+    {
+    TRACE_ENTRY_POINT;
+    
+    TCalenCommand command;
+    MCalenCommandHandler* handler( NULL );
+    iCallBackPackage = new( ELeave ) CCalenCallbackPackage( this, command, handler );
+    
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::~CCalenState
+// Destructor
+// ----------------------------------------------------------------------------
+CCalenState::~CCalenState()
+    {
+    TRACE_ENTRY_POINT;
+    
+    delete iCallBackPackage;
+    iCallBackPackage = NULL;
+    delete iCmdCallback;
+    
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::RequestCallback
+// Request a callback
+// ----------------------------------------------------------------------------
+void CCalenState::RequestCallbackL( MCalenCommandHandler* aCommandHandler, const TCalenCommand& aCommand )
+    {
+    TRACE_ENTRY_POINT;
+
+    iCallBackPackage->SetCommandHandler(this, aCommand, aCommandHandler);
+     
+    if( !iCmdCallback )
+        {
+        TCallBack callback( CommandCallback, iCallBackPackage );
+        iCmdCallback = CCalenAsyncCallBack::NewL( callback, CActive::EPriorityHigh , iController );
+       }
+
+    TCallBack callback( CommandCallback, iCallBackPackage );
+    
+    iCmdCallback->Cancel();
+    iCmdCallback->Set( callback );
+    iCmdCallback->CallBack();
+    
+    TRACE_EXIT_POINT;
+    }
+
+
+
+// ----------------------------------------------------------------------------
+// CCalenState::CommandCallback
+// Static callback function
+// ----------------------------------------------------------------------------
+TInt CCalenState::CommandCallback( TAny* aCommandStruct )
+    {
+    TRACE_ENTRY_POINT;
+    TBool continueCommand(EFalse);
+    
+    CCalenCallbackPackage* package = static_cast<CCalenCallbackPackage*>( aCommandStruct );
+    continueCommand = package->HandleCallBack();
+    
+    TRACE_EXIT_POINT;
+    return continueCommand;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::HandleNotificationL
+// Default behaviour for notification handling is to go back to previous state.
+// Concrete states would be expected to check the notification is related
+// to the command issued.
+// ----------------------------------------------------------------------------
+void CCalenState::HandleNotificationL(const TCalenNotification& aNotification,
+                                      CCalenStateMachine& aStateMachine )
+    {
+    TRACE_ENTRY_POINT;
+    
+    switch( aNotification )
+        {
+        case ECalenNotifyAppBackgrounded:
+        	{
+        	CCalenStateMachine::TCalenStateIndex cachedState = aStateMachine.GetCurrentState();
+        	if(cachedState != CCalenStateMachine::ECalenMapState) // Never send calendar to background state in MapState as maps will 
+        	                                                        // launched in cahin mode not in stand alone mode
+        	    {
+                aStateMachine.SetCurrentState(CCalenStateMachine::ECalenBackgroundState);
+                aStateMachine.SetCurrentPreviousState(cachedState);
+                iOutstandingNotifications.InsertL(aNotification);
+                aStateMachine.ActivateCurrentStateL();
+        	    }
+        	}
+            break;
+        default:
+            iController.Notifier().BroadcastApprovedNotification( aNotification );
+            break;
+        }
+    
+   
+    TRACE_EXIT_POINT;
+
+    }
+
+
+// ----------------------------------------------------------------------------
+// CCalenState::PreviousState
+// C++ constructor
+// ----------------------------------------------------------------------------
+CCalenStateMachine::TCalenStateIndex CCalenState::PreviousState()
+    {
+    TRACE_ENTRY_POINT;
+    
+    TRACE_EXIT_POINT;
+    return iPreviousState;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::SetPreviousState
+// Sets previous state.
+// ----------------------------------------------------------------------------
+void CCalenState::SetPreviousState(const CCalenStateMachine::TCalenStateIndex& aPreviousState )
+    {
+    TRACE_ENTRY_POINT;
+    
+    iPreviousState = aPreviousState;
+    
+    TRACE_EXIT_POINT;
+    }
+    
+// ----------------------------------------------------------------------------
+// CCalenState::CommandExecuting
+// From CCalenState
+// ----------------------------------------------------------------------------    
+void CCalenState::CommandExecuting()
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }  
+
+// ----------------------------------------------------------------------------
+// CCalenState::CCalenCallbackPackage::CCalenCallbackPackage
+// C++ constructor
+// ----------------------------------------------------------------------------
+CCalenState::CCalenCallbackPackage::CCalenCallbackPackage( CCalenState* aSelf,
+                        TCalenCommand aCommand,  MCalenCommandHandler* aCommandHandler)
+    : iSelf( aSelf ), iCommand( aCommand ), iCommandHandler( aCommandHandler )                   
+    {
+    TRACE_ENTRY_POINT;
+    TRACE_EXIT_POINT;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::CCalenCallbackPackage::HandleCallBack
+// Handles a callback
+// ----------------------------------------------------------------------------
+TBool CCalenState::CCalenCallbackPackage::HandleCallBack()
+    {
+    TRACE_ENTRY_POINT;
+    TBool continueCommand(EFalse);
+
+    iSelf->CommandExecuting();
+    PIM_TRAPD_HANDLE ( continueCommand = iCommandHandler->HandleCommandL( iCommand ) );
+    
+    TRACE_EXIT_POINT;
+    return continueCommand;
+    }
+
+// ----------------------------------------------------------------------------
+// CCalenState::CCalenCallbackPackage::SetCommandHandler
+// Sets the command handler and command
+// ----------------------------------------------------------------------------
+void CCalenState::CCalenCallbackPackage::SetCommandHandler(CCalenState* aSelf,
+                        TCalenCommand aCommand,  MCalenCommandHandler* aCommandHandler)
+    {
+    TRACE_ENTRY_POINT;
+        
+    iSelf = aSelf;
+    iCommand = aCommand;
+    iCommandHandler = aCommandHandler; 
+
+    TRACE_EXIT_POINT;    
+    }
+    
+// ----------------------------------------------------------------------------
+// CCalenState::HandleStateActivationL
+// Default behavior when state is activated. Check and issue any outstanding
+// notifications
+// ----------------------------------------------------------------------------
+void CCalenState::HandleStateActivationL(CCalenStateMachine& /*aStateMachine*/)
+	{
+    TRACE_ENTRY_POINT;
+    
+    // Can only issue one of the following Notifications
+    // ECalenNotifySettingsChanged or 
+    // ECalenNotifySystemLocaleChanged or
+    // ECalenNotifySettingsClosed
+    
+    if(iOutstandingNotifications.Find(ECalenNotifySettingsChanged))
+        {
+        iOutstandingNotifications.Remove(ECalenNotifySystemLocaleChanged);
+        iOutstandingNotifications.Remove(ECalenNotifySettingsClosed);
+        }
+    else if(iOutstandingNotifications.Find(ECalenNotifySystemLocaleChanged))
+        {
+        iOutstandingNotifications.Remove(ECalenNotifySettingsClosed);
+        }
+    
+    THashSetIter<TCalenNotification> iterator(iOutstandingNotifications);
+    const TCalenNotification* notification = iterator.Next();
+    while(notification)
+        {
+        iController.Notifier().BroadcastApprovedNotification( *notification );
+        notification = iterator.Next();
+        }
+    
+    iOutstandingNotifications.Close();
+    
+    TRACE_EXIT_POINT;
+	}
+
+// ----------------------------------------------------------------------------
+// CCalenState::SetCurrentState
+// Sets the current state
+// ----------------------------------------------------------------------------
+void CCalenState::SetCurrentState(CCalenStateMachine& aStateMachine,
+								  const CCalenStateMachine::TCalenStateIndex& aState )	
+	{
+    TRACE_ENTRY_POINT;
+    
+    aStateMachine.SetCurrentState(aState);
+    
+    TRACE_EXIT_POINT;	
+	}
+
+// ----------------------------------------------------------------------------
+// CCalenState::GetCurrentState
+// Gets the current state
+// ----------------------------------------------------------------------------
+CCalenStateMachine::TCalenStateIndex CCalenState::GetCurrentState(
+											CCalenStateMachine& aStateMachine)
+	{
+	TRACE_ENTRY_POINT;
+	TRACE_EXIT_POINT;
+	
+	return aStateMachine.GetCurrentState();
+	}
+
+// ----------------------------------------------------------------------------
+// CCalenState::SetPreviousState
+// Sets the previous state through state machine
+// ----------------------------------------------------------------------------
+void CCalenState::SetCurrentPreviousState(CCalenStateMachine& aStateMachine, 
+								const CCalenStateMachine::TCalenStateIndex& aState)
+	{
+	TRACE_ENTRY_POINT;
+	
+	aStateMachine.SetCurrentPreviousState(aState);
+	
+	TRACE_EXIT_POINT;
+	}
+
+// ----------------------------------------------------------------------------
+// CCalenState::ActivateCurrentStateL
+// Activate current state
+// ----------------------------------------------------------------------------
+void CCalenState::ActivateCurrentStateL(CCalenStateMachine& aStateMachine)
+	{
+    TRACE_ENTRY_POINT;
+	
+    aStateMachine.ActivateCurrentStateL();
+    	
+    TRACE_EXIT_POINT;	
+	}
+// ----------------------------------------------------------------------------
+// CCalenState::CancelPreviousCmd
+// Cancel the previous command
+// ----------------------------------------------------------------------------
+void CCalenState::CancelPreviousCmd(CCalenStateMachine& aStateMachine)
+	{
+	TRACE_ENTRY_POINT;
+	
+	aStateMachine.CancelPreviousCmd();
+	
+	TRACE_EXIT_POINT;
+	}
+
+// ----------------------------------------------------------------------------
+// CCalenState::CancelExecutingCmd
+// Cancels executing command
+// ----------------------------------------------------------------------------
+void CCalenState::CancelExecutingCmd()
+	{
+    TRACE_ENTRY_POINT;
+	
+	if(iCmdCallback)
+		{
+		iCmdCallback->Cancel();
+		}
+    	
+    TRACE_EXIT_POINT;	
+	}	
+// End of file