clock/clockmw/clockalarms/src/alarmclient.cpp
author hgs
Mon, 09 Aug 2010 18:30:52 +0530
changeset 57 bb2d3e476f29
parent 45 b6db4fd4947b
permissions -rw-r--r--
201031

/*
* Copyright (c) 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:
* Source file for the class AlarmClient
*
*/

// System includes
#include <e32cmn.h>
// User includes
#include "alarmclient.h"
#include "alarmlistener.h"
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "alarmclientTraces.h"
#endif


/*!
	\class AlarmClient
 */

/*!
	Default constructor.
 */
AlarmClient::AlarmClient(QObject* parent)
:QObject(parent),
mListener(0)
{	
	OstTraceFunctionEntry0( ALARMCLIENT_ALARMCLIENT_ENTRY );
	// Connect to the alarm server.
	User::LeaveIfError(mAlarmSrvSession.Connect());
	// Construct the listener, but do not start it.
	mListener = new AlarmListener(this, mAlarmSrvSession);
OstTraceFunctionExit0( ALARMCLIENT_ALARMCLIENT_EXIT );
}

/*!
	Destructor.
 */
AlarmClient::~AlarmClient()
{
OstTraceFunctionEntry0( DUP1_ALARMCLIENT_ALARMCLIENT_ENTRY );

	if (mListener) {
		mListener->stop();
		delete mListener;
		mListener = 0;
	}
	mAlarmSrvSession.Close();
OstTraceFunctionExit0( DUP1_ALARMCLIENT_ALARMCLIENT_EXIT );
}

/*!
	Returns the list of alarms currently set on the phone.

	\param alarmList Reference to a list of alarms.
 */
void AlarmClient::getAlarmList(QList<AlarmInfo>& alarmList)
{
	OstTraceFunctionEntry0( ALARMCLIENT_GETALARMLIST_ENTRY );
	// This will hold the alarm ids returned from alarm server.
	RArray<TAlarmId> alarmIdArray;
	AlarmInfo alarmInfo;
	TASShdAlarm tempSharedAlarm;

	// Get the ids from alarmserver.
	mAlarmSrvSession.GetAlarmIdListForCategoryL(KAlarmClockOne, alarmIdArray);

	// Get the alarm count
	int alarmCount = alarmIdArray.Count();

	for (int index(0); index < alarmCount; index++) {
		// Fetch the details of the alarm.
		int error = mAlarmSrvSession.GetAlarmDetails(
				alarmIdArray[index], tempSharedAlarm);

		if (KErrNone == error) {
			// Alarm description
			alarmInfo.alarmDesc = QString::fromUtf16(
					tempSharedAlarm.Message().Ptr(),
					tempSharedAlarm.Message().Length());

			// Original expiry time
			alarmInfo.origAlarmTime.setHMS(
					tempSharedAlarm.OriginalExpiryTime().DateTime().Hour(),
					tempSharedAlarm.OriginalExpiryTime().DateTime().Minute(),
					tempSharedAlarm.OriginalExpiryTime().DateTime().Second());

			// Next due time
			alarmInfo.nextDueTime.setHMS(
					tempSharedAlarm.NextDueTime().DateTime().Hour(),
					tempSharedAlarm.NextDueTime().DateTime().Minute(),
					tempSharedAlarm.NextDueTime().DateTime().Second());

			// Alarm day
			alarmInfo.alarmDateTime.setYMD(
					tempSharedAlarm.OriginalExpiryTime().DateTime().Year(),
					tempSharedAlarm.OriginalExpiryTime().DateTime().Month()+1,
					tempSharedAlarm.OriginalExpiryTime().DateTime().Day()+1);

			// The alarm status
			if (EAlarmStatusEnabled == tempSharedAlarm.Status()) {
				alarmInfo.alarmStatus = Enabled;
			} else {
				alarmInfo.alarmStatus = Disabled;
			}

			// The alarm state
			setAlarmState(tempSharedAlarm.State(), alarmInfo.alarmState);

			// The repeat type
			setAlarmRepeatType(
					tempSharedAlarm.RepeatDefinition(), alarmInfo.repeatType);

			// The alarm id
			alarmInfo.alarmId = alarmIdArray[index];
			alarmList.append(alarmInfo);
		}
	}
	// Cleanup.
	alarmIdArray.Close();
OstTraceFunctionExit0( ALARMCLIENT_GETALARMLIST_EXIT );
}

/*!
	Sets a new alarm with the alarmserver.
 */
void AlarmClient::setAlarm(AlarmInfo& alarmInfo)
{
	OstTraceFunctionEntry0( ALARMCLIENT_SETALARM_ENTRY );
	// Get the current home time
	TTime homeTime;
	homeTime.HomeTime();
	TDateTime homeDateTime = homeTime.DateTime();

	// Set the alarm time
	TDateTime alarmDateTime = TDateTime(homeDateTime.Year(),
			TMonth(homeDateTime.Month()),
			homeDateTime.Day(),
			alarmInfo.origAlarmTime.hour(),
			alarmInfo.origAlarmTime.minute(),
			alarmInfo.origAlarmTime.second(),
			0);
	TTime alarmTime(alarmDateTime);

	TInt dayIndex = 0;
	TInt currentDayIndex = 0;

	// Decide the day for 'Once' and 'Repeat Weekly' alarms.
	switch (alarmInfo.repeatType) {
		case Once:
		case Weekly:
			currentDayIndex = homeTime.DayNoInWeek();

			if (currentDayIndex < alarmInfo.alarmDay) {
				dayIndex = alarmInfo.alarmDay - currentDayIndex;
			} else if (currentDayIndex > alarmInfo.alarmDay) {
				dayIndex = 7 - (currentDayIndex - alarmInfo.alarmDay);
			} else {
				if (alarmTime > homeTime) {
					dayIndex = 0;
				} else {
					dayIndex = 7;
				}
			}
			break;

		default:
			break;
	}

	// Add corresponding no. of days based on the type of alarm.
	alarmTime += TTimeIntervalDays(dayIndex);

	// Set the details of the alarm and set it thru the alarm server.
	TASShdAlarm alarmDetails;
	alarmDetails.Category() = KAlarmClockOne;
	setAlarmRepeatType(alarmInfo.repeatType, alarmDetails.RepeatDefinition());
	alarmDetails.OriginalExpiryTime() = alarmTime;
	alarmDetails.NextDueTime() = alarmTime;
	alarmDetails.Message() = alarmInfo.alarmDesc.utf16();
	alarmDetails.SetWakeup(true);
	alarmDetails.ClientData2() = alarmInfo.volumeStatus;

	TInt error(mAlarmSrvSession.AlarmAdd(alarmDetails));

	if( KErrNone == error ) {
		mAlmObj = alarmDetails;
		mAlarmIdDetail = alarmDetails.Id();
		alarmInfo.alarmId = alarmDetails.Id();
		// The alarm status.
		if (EAlarmStatusEnabled == alarmDetails.Status()) {
			alarmInfo.alarmStatus = Enabled;
		} else {
			alarmInfo.alarmStatus = Disabled;
		}
		TDateTime nextDueDateTime(alarmDetails.NextDueTime().DateTime());
		QTime nextDueTime(nextDueDateTime.Hour(),nextDueDateTime.Minute(),
				nextDueDateTime.Second(),nextDueDateTime.MicroSecond());
		alarmInfo.nextDueTime = nextDueTime;

		QDate alarmDate(
		nextDueDateTime.Year(),nextDueDateTime.Month()+1,nextDueDateTime.Day()+1);

		alarmInfo.alarmDateTime = alarmDate;
	}
OstTraceFunctionExit0( ALARMCLIENT_SETALARM_EXIT );
}

void AlarmClient::setAlarmState(TAlarmState state, AlarmState& alarmState)
{
	OstTraceFunctionEntry0( ALARMCLIENT_SETALARMSTATE_ENTRY );
	switch (state) {
		case EAlarmStateInPreparation:
			alarmState = InPreparation;
			break;
		case EAlarmStateQueued:
			alarmState = Queued;
			break;
		case EAlarmStateSnoozed:
			alarmState = Snoozed;
			break;
		case EAlarmStateWaitingToNotify:
			alarmState = WaitingToNotify;
			break;
		case EAlarmStateNotifying:
			alarmState = Notifying;
			break;
		case EAlarmStateNotified:
			alarmState = Notified;
			break;
		default:
			break;
	}

OstTraceFunctionExit0( ALARMCLIENT_SETALARMSTATE_EXIT );
}

void AlarmClient::setAlarmState(AlarmState state, TAlarmState& alarmState)
{
	OstTraceFunctionEntry0( DUP1_ALARMCLIENT_SETALARMSTATE_ENTRY );
	switch (state) {
		case InPreparation:
			alarmState = EAlarmStateInPreparation;
			break;
		case Queued:
			alarmState = EAlarmStateQueued;
			break;
		case Snoozed:
			alarmState = EAlarmStateSnoozed;
			break;
		case WaitingToNotify:
			alarmState = EAlarmStateWaitingToNotify;
			break;
		case Notifying:
			alarmState = EAlarmStateNotifying;
			break;
		case Notified:
			alarmState = EAlarmStateNotified;
			break;
		default:
			break;
	}
OstTraceFunctionExit0( DUP1_ALARMCLIENT_SETALARMSTATE_EXIT );
}

void AlarmClient::setAlarmRepeatType(
		TAlarmRepeatDefinition repeat, AlarmRepeatType& repeatType)
{
	OstTraceFunctionEntry0( ALARMCLIENT_SETALARMREPEATTYPE_ENTRY );
	switch (repeat) {
		case EAlarmRepeatDefintionRepeatOnce:
			repeatType = Once;
			break;
		case EAlarmRepeatDefintionRepeatDaily:
			repeatType = Daily;
			break;
		case EAlarmRepeatDefintionRepeatWorkday:
			repeatType = Workday;
			break;
		case EAlarmRepeatDefintionRepeatWeekly:
			repeatType = Weekly;
			break;
		default:
			break;
	}
OstTraceFunctionExit0( ALARMCLIENT_SETALARMREPEATTYPE_EXIT );
}

void AlarmClient::setAlarmRepeatType(
		AlarmRepeatType repeat, TAlarmRepeatDefinition& repeatType)
{
	OstTraceFunctionEntry0( DUP1_ALARMCLIENT_SETALARMREPEATTYPE_ENTRY );
	switch (repeat) {
		case Once:
			repeatType = EAlarmRepeatDefintionRepeatOnce;
			break;
		case Daily:
			repeatType = EAlarmRepeatDefintionRepeatDaily;
			break;
		case Workday:
			repeatType = EAlarmRepeatDefintionRepeatWorkday;
			break;
		case Weekly:
			repeatType = EAlarmRepeatDefintionRepeatWeekly;
			break;
		default:
			break;
	}
OstTraceFunctionExit0( DUP1_ALARMCLIENT_SETALARMREPEATTYPE_EXIT );
}

void AlarmClient::deleteAlarm(int alarmId)
{
	OstTraceFunctionEntry0( ALARMCLIENT_DELETEALARM_ENTRY );
	// Request the alarmserver to delete the alarm.
	mAlarmSrvSession.AlarmDelete(alarmId);
OstTraceFunctionExit0( ALARMCLIENT_DELETEALARM_EXIT );
}

/*!
	 Delete the snoozed alarm.
	 
	 \param alarmId needs to be deleted and reset again.
	 \return int error value if any.
 */
int AlarmClient::deleteSnoozedAlarm(int alarmId)
{
	OstTraceFunctionEntry0( ALARMCLIENT_DELETESNOOZEDALARM_ENTRY );
	AlarmInfo alarmInfo;
	int retVal(KErrNone);
	int returnVal = getAlarmInfo(alarmId, alarmInfo);
	if (KErrNone != retVal) {
		OstTraceFunctionExit0( ALARMCLIENT_DELETESNOOZEDALARM_EXIT );
		return retVal;
	}
	returnVal = mAlarmSrvSession.AlarmDelete(alarmId);
	if (KErrNone != retVal) {
		OstTraceFunctionExit0( DUP1_ALARMCLIENT_DELETESNOOZEDALARM_EXIT );
		return retVal;
	}
	alarmInfo.alarmState = InPreparation;
	alarmInfo.nextDueTime = alarmInfo.origAlarmTime;
	setAlarm(alarmInfo);
	
	OstTraceFunctionExit0( DUP2_ALARMCLIENT_DELETESNOOZEDALARM_EXIT );
	return retVal;
}

int AlarmClient::getAlarmInfo(int alarmId, AlarmInfo& alarmInfo)
{
	OstTraceFunctionEntry0( ALARMCLIENT_GETALARMINFO_ENTRY );
	TASShdAlarm tempSharedAlarm;

	// Get the requested alarm info from the alarm server.
	int error = mAlarmSrvSession.GetAlarmDetails(alarmId, tempSharedAlarm);

	if (KErrNone == error) {
		// Alarm description
		alarmInfo.alarmDesc = QString::fromUtf16(
				tempSharedAlarm.Message().Ptr(),
				tempSharedAlarm.Message().Length());

		// Original expiry time
		alarmInfo.origAlarmTime.setHMS(
				tempSharedAlarm.OriginalExpiryTime().DateTime().Hour(),
				tempSharedAlarm.OriginalExpiryTime().DateTime().Minute(),
				tempSharedAlarm.OriginalExpiryTime().DateTime().Second());

		// Next due time
		alarmInfo.nextDueTime.setHMS(
				tempSharedAlarm.NextDueTime().DateTime().Hour(),
				tempSharedAlarm.NextDueTime().DateTime().Minute(),
				tempSharedAlarm.NextDueTime().DateTime().Second());

		// Alarm date
		alarmInfo.alarmDateTime.setYMD(
				tempSharedAlarm.OriginalExpiryTime().DateTime().Year(),
				tempSharedAlarm.OriginalExpiryTime().DateTime().Month()+1,
				tempSharedAlarm.OriginalExpiryTime().DateTime().Day()+1);
		
		// Set alarm day.
		alarmInfo.alarmDay =
			tempSharedAlarm.OriginalExpiryTime().DayNoInWeek();

		// The alarm status
		if (EAlarmStatusEnabled == tempSharedAlarm.Status()) {
			alarmInfo.alarmStatus = Enabled;
		} else {
			alarmInfo.alarmStatus = Disabled;
		}

		// The alarm state
		setAlarmState(
				tempSharedAlarm.State(), alarmInfo.alarmState);

		// The repeat type
		setAlarmRepeatType(
				tempSharedAlarm.RepeatDefinition(), alarmInfo.repeatType);

		// The alarm id
		alarmInfo.alarmId = alarmId;

		// Alarm volume status.
		if(tempSharedAlarm.ClientData2()) {
			alarmInfo.volumeStatus = AlarmVolumeOn;
		} else {
			alarmInfo.volumeStatus = AlarmVolumeOff;
		}
	}
	OstTraceFunctionExit0( ALARMCLIENT_GETALARMINFO_EXIT );
	return error;
}

void AlarmClient::toggleAlarmStatus(int alarmId, int alarmStatus)
{
OstTraceFunctionEntry0( ALARMCLIENT_TOGGLEALARMSTATUS_ENTRY );

	mAlarmSrvSession.SetAlarmStatus(alarmId, (TAlarmStatus)alarmStatus);

OstTraceFunctionExit0( ALARMCLIENT_TOGGLEALARMSTATUS_EXIT );
}

void AlarmClient::startListener()
{
		OstTraceFunctionEntry0( ALARMCLIENT_STARTLISTENER_ENTRY );
		mListener->start();

OstTraceFunctionExit0( ALARMCLIENT_STARTLISTENER_EXIT );
}

void AlarmClient::stopListener()
{
	OstTraceFunctionEntry0( ALARMCLIENT_STOPLISTENER_ENTRY );
	mListener->stop();

OstTraceFunctionExit0( ALARMCLIENT_STOPLISTENER_EXIT );
}

void AlarmClient::notifyChange(int alarmId)
{
		OstTraceFunctionEntry0( ALARMCLIENT_NOTIFYCHANGE_ENTRY );
		emit alarmStateChanged(alarmId);
OstTraceFunctionExit0( ALARMCLIENT_NOTIFYCHANGE_EXIT );
}

// End of file	--Don't remove this.