commonappservices/alarmserver/ConsoleAlarmAlertServer/Source/ConsoleAlarmAlertConsole.cpp
author William Roberts <williamr@symbian.org>
Fri, 23 Apr 2010 14:37:17 +0100
branchRCL_3
changeset 22 c82a39b81a38
parent 0 2e3d3ce01487
permissions -rw-r--r--
Rework addition of Symbian splash screen to reduce the source impact (uses SVG from Bug 2414) Notes: by using the OPTION SOURCEDIR parameter in the mifconv extension instructions, I can arrange to use the same source file name in sfimage, without having to export over the original Nokia file. This means that the name inside splashscreen.mbg is the same, which removes the need for the conditional compilation in SplashScreen.cpp, and gets rid of sf_splashscreen.mmp.

// Copyright (c) 1999-2009 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 "ConsoleAlarmAlertConsole.h"

#include <e32twin.h>
#include <e32base.h>
#include <e32svr.h>
#include <calsession.h>
#include <calentryview.h>
#include <asaltdefs.h>
#include "ConsoleAlarmAlertSession.h"

CConsoleAlarmAlertConsole::CConsoleAlarmAlertConsole(CConsoleAlarmAlertSession& aSession)
:	CActive(CActive::EPriorityLow), iSession(aSession), iInstructionIndex(0)
	{
	CActiveScheduler::Add(this);
	}

CConsoleAlarmAlertConsole::~CConsoleAlarmAlertConsole()
	{
	Cancel();
	Hide();
	}

void CConsoleAlarmAlertConsole::GetKey()
	{
	if (iWin && !IsActive())
		{
		SetActive();
		iWin->Read(iStatus);
		}		
	}

void CConsoleAlarmAlertConsole::CancelKey()
	{
	if	(IsActive())
		Cancel();
	}

void CConsoleAlarmAlertConsole::DecCounterL()
	{
	if	(iTimeInterval > 0)
		{
		--iTimeInterval;
		UpdateDisplayL();
		}
	}

CCAASHelperCallBack::CCAASHelperCallBack()
	{
	}

void CCAASHelperCallBack::Progress(TInt /*aPercentageCompleted*/)
	{
	}
	
void CCAASHelperCallBack::Completed(TInt /*aError*/)
	{
	}
	
TBool CCAASHelperCallBack::NotifyProgress()
	{
	return EFalse;
	}

void CConsoleAlarmAlertConsole::UpdateDisplayL()
	{
	TBuf<180> buf;
	_LIT(KEalwlAlarmSoundOff, "Off");
	_LIT(KEalwlAlarmSoundOn, "On");
	_LIT(KEalwlStatusEnabled, "Are");
	_LIT(KEalwlStatusNotEnabled, "Are Not");
	_LIT(KEalwlStatusIs, "Is");
	_LIT(KEalwlStatusIsNo, "Is No");
	_LIT(KFormatLocalTime,"\nDue Time:%D %H:%T:%S Local Time");
	_LIT(KFormatUtcTime,"\nDue Time:%D %H:%T:%S UTC Time");
	//
	if	(!iWin)
		return;
	iWin->SetCursorPosAbs(TPoint(0,0));

	// MESSAGE
	buf.Format(_L("Message : %S"), &iSession.Alarm().Message());
	iWin->Write(buf);
	iWin->ClearToEndOfLine();	
	if (iSession.Alarm().IsFloating())
		{
		(iSession.Alarm().NextDueTime()).FormatL(buf,KFormatLocalTime);		
		}
		else
		{
		(iSession.Alarm().NextDueTime()).FormatL(buf,KFormatUtcTime);		
		}	
	iWin->Write(buf);
	iWin->ClearToEndOfLine();

	// DATA
	if	(iSession.Alarm().HasAssociatedData())
		{
		const TAgnAlarmInfo data = iSession.AlarmData();
		const TUid KUidAgendaModelAlarmCategory = { 0x101F4A70 };
		if (data.iAlarmCategory == KUidAgendaModelAlarmCategory)
			{
			_LIT(KEalwlAgendaData,"\ndata: agenda filename \"%S\"");
			if (data.iFileName.Length() < 40)
				{
				buf.Format(KEalwlAgendaData,&data.iFileName);
				}
			else
				{
				TBuf<40> temp = data.iFileName.Left(40);
				buf.Format(KEalwlAgendaData,&temp);
				}
			}
		else
			{
			buf.Format(_L("\nAlarm has %d data bytes"), iSession.AlarmDataSize());
			}
		}
	else
		{
		buf = _L("\nAlarm has no associated data");
		}
	iWin->Write(buf);
	iWin->ClearToEndOfLine();

	// DEFER TIME
	if	(iSession.DeferTime() != Time::NullTTime())
		{
		TDateTime dateTime(iSession.DeferTime().DateTime());
		buf.Format(_L("\nDefer   : %02d:%02d"), dateTime.Hour(), dateTime.Minute());
		}
	else
		buf=_L("\nNULL defer time");
	iWin->Write(buf);
	iWin->ClearToEndOfLine();

	// TIME INTERVAL
	buf.Format(_L("\nCurrent time interval is %d minutes"), GetTimeInterval());
	iWin->Write(buf);
	iWin->ClearToEndOfLine();

	// STATE FLAGS
	buf.Format(_L("\nAlarm sounds are %S"),(iAlertState&EASAltStateFlagsSilentRunning)?&KEalwlAlarmSoundOff:&KEalwlAlarmSoundOn);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();
	buf.Format(_L("\nAlarm sounds %S paused"),(iAlertState&EASAltStateFlagsSoundIsPaused)?&KEalwlStatusEnabled:&KEalwlStatusNotEnabled);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();
	buf.Format(_L("\nAlarm sounds %S deferred"),(iAlertState&EASAltStateFlagsInQuietPeriod)?&KEalwlStatusEnabled:&KEalwlStatusNotEnabled);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();
	buf.Format(_L("\nThere %S more than one unacknowledged alarms"),(iAlertState&EASAltStateFlagsMoreThanOneDueAlarm)?&KEalwlStatusEnabled:&KEalwlStatusNotEnabled);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();
	buf.Format(_L("\nThere %S memory to snooze alarms"),(iAlertState&EASAltStateFlagsNoMemoryForSnoozeAlarm)?&KEalwlStatusIsNo:&KEalwlStatusIs);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();
	buf.Format(_L("\nThere %S an alarm sound to play"),(iAlertState&EASAltStateFlagsAlarmHasNoSoundFileName)?&KEalwlStatusIsNo:&KEalwlStatusIs);
	iWin->Write(buf);
	iWin->ClearToEndOfLine();

	// COMMAND PROMPTS
	iWin->Write(_L("\nENTER = Silence alarm          SPACE = Quiet Period"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\nESCAPE = Acknowledge alarm     A = Acknowledge all"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\nP = Pause alarm sound          TAB = Snooze alarm"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\n1 = 1 min sound interval		 0 = 0 mins sound interval"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\n+ = Increase int. and pause    - = Decrease int. and pause"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\n! = Kill alarm alert server"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\n"));
	iWin->ClearToEndOfLine();
	iWin->Write(_L("\r"));
	//
	if(!iSession.InstructionSet()) //Get user input if instruction set unspecified.
		GetKey();
	else if (iInstructionIndex >= static_cast<RArray<TInt>*>(iSession.InstructionSet())->Count()) //Get user input if program has already iterated thru entire instruction set.
		GetKey();
	else //Use the command in the instruction set, instead of waiting for user input.
		{
			if(!IsActive())
			{
			iStatus = KRequestPending;
			TRequestStatus* ptrStatus = &iStatus;
			User::RequestComplete( ptrStatus, KErrNone );
			SetActive();
			}
		}
	}

TInt CConsoleAlarmAlertConsole::GetTimeInterval() const
	{
	return(iTimeInterval);
	}

void CConsoleAlarmAlertConsole::SetVisibilityL(TInt aVis)
	{
	if	(!aVis)
		Hide();
	else if (!iWin)
		{
		// Create a new window, since cannot set order of console windows
		CreateWinL();
		UpdateDisplayL();
		}
	}

void CConsoleAlarmAlertConsole::SetAlertStateL(TInt aFlags)
	{
	iAlertState = aFlags;
	UpdateDisplayL();
	}

void CConsoleAlarmAlertConsole::RunL()
	{
	if (iStatus.Int() == KErrCancel)
		return;

	__ASSERT_DEBUG(iWin, User::Invariant());
	TInt key = iWin->KeyCode();
	if(iSession.InstructionSet() && iInstructionIndex < static_cast<RArray<TInt>*>(iSession.InstructionSet())->Count())
		{
		RArray<TInt>* temp = static_cast<RArray<TInt>*>(iSession.InstructionSet());
		key = (*temp)[iInstructionIndex++];
		GetKey();
		}
	else
		{
		GetKey();
		if ((key>=EKeyF1 && key<=EKeyF12) || key==EKeyTab)
			{
			DoDeferTime(EASAltAlertServerResponseSnooze);
			}
		}

	switch (key)
		{
	// ACKNOWLEDGE CURRENT
	case EKeyEscape:
		iSession.Notify(EASAltAlertServerResponseClear);
		return;
	// ACKNOWLEDGE ALL
	case 'a':
	case 'A':
		iSession.Notify(EASAltAlertServerResponseClearAll);
		return;
	// QUIET PERIOD
	case EKeySpace:
		DoDeferTime(EASAltAlertServerResponseQuietPeriod);
		break;
	// PAUSE SOUND
	case 'p':
	case 'P':
		DoDeferTime(EASAltAlertServerResponsePauseSound);
		break;
	// SILENCE ALL SOUND
	case EKeyEnter:
		iSession.Notify(EASAltAlertServerResponseSilence);
		break;
	// INTERVAL 1 MINUTE
	case '1':
		iTimeInterval=1;
		iSession.Notify(EASAltAlertServerResponsePauseSound);
		break;
	// INTERVAL 0 MINUTES
	case '0':
		iTimeInterval=0;
		iSession.Notify(EASAltAlertServerResponsePauseSound);
		break;
	// PAUSE +
	case '=':
	case '+':
		iTimeInterval++;
		iSession.Notify(EASAltAlertServerResponsePauseSound);
		break;
	// PAUSE -
	case '-':
		iTimeInterval--;
		iSession.Notify(EASAltAlertServerResponsePauseSound);
		break;

	// QUIT
	case '!':
		CActiveScheduler::Stop();
		break;
		}

	TBuf<10> buf;
	buf.Format(_L("'%c',"), key);
	iWin->Write(buf);
	}

void CConsoleAlarmAlertConsole::DoCancel()
	{
	__ASSERT_DEBUG(iWin, User::Invariant());
	iWin->ReadCancel();
	}

void CConsoleAlarmAlertConsole::Hide()
	{
	if	(iWin)
		CancelKey(); 
	//
	delete iWin;
	iWin = NULL;
	//
	if	(iCountDown)
		iCountDown->Cancel();
	//
	delete iCountDown;
	iCountDown=NULL;
	}

void CConsoleAlarmAlertConsole::CreateWinL()
	{
	_LIT(KAlarmAlertConsoleCaption, "Test Alarm Alert Server Console");
	//
	__ASSERT_DEBUG(!iWin, User::Invariant());
	__ASSERT_DEBUG(!iCountDown, User::Invariant());
	//
	TRAPD(trapCheck, iWin = Console::NewL(KAlarmAlertConsoleCaption, TSize(KConsFullScreen, KConsFullScreen)));
	if	(trapCheck)
		{
		iWin=NULL;
		return;
		}
	
	TRAP(trapCheck, iCountDown = CPeriodic::NewL(CActive::EPriorityIdle));
	if	(trapCheck)
		{
		iCountDown=NULL;
		return;
		}
	//
	const TTimeIntervalMicroSeconds32 interval(60000000);
	iCountDown->Start(interval, interval, TCallBack(&CountDownCallBackL, this));
	}

void CConsoleAlarmAlertConsole::DoDeferTime(TASAltAlertServerResponse aResponse)
	{
	if	(++iTimeInterval > 60)
		{
		iTimeInterval = 5;
		User::Beep(440, 12);
		}
	//
	TTime now;
	now.UniversalTime();
	now += TTimeIntervalMinutes(iTimeInterval);
	//
	iSession.Notify(aResponse, now);
	}

TBool CConsoleAlarmAlertConsole::CountDownCallBackL(TAny* aSelf)
	{
	CConsoleAlarmAlertConsole& self = *reinterpret_cast<CConsoleAlarmAlertConsole*>(aSelf);
	self.DecCounterL();
	//
	return EFalse;
	}