clock/clockmw/clockalarms/src/alarmclient.cpp
changeset 18 c198609911f9
child 26 a949c2543c15
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock/clockmw/clockalarms/src/alarmclient.cpp	Fri Apr 16 14:57:40 2010 +0300
@@ -0,0 +1,449 @@
+/*
+* 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>
+#include <QDebug>
+
+// User includes
+#include "alarmclient.h"
+#include "alarmlistener.h"
+
+/*!
+	\class AlarmClient
+ */
+
+/*!
+	Default constructor.
+ */
+AlarmClient::AlarmClient(QObject* parent)
+:QObject(parent),
+mListener(0)
+{
+	qDebug("clock: AlarmClient::AlarmClient() -->");
+
+	// Connect to the alarm server.
+	User::LeaveIfError(mAlarmSrvSession.Connect());
+
+	qDebug("clock: AlarmClient::AlarmClient() - Connection done, looks ok.");
+
+	// Construct the listener, but do not start it.
+	mListener = new AlarmListener(this, mAlarmSrvSession);
+
+	qDebug("clock: AlarmClient::AlarmClient() <--");
+}
+
+/*!
+	Destructor.
+ */
+AlarmClient::~AlarmClient()
+{
+	qDebug("clock: AlarmClient::~AlarmClient() -->");
+
+	if (mListener) {
+		mListener->stop();
+		delete mListener;
+		mListener = 0;
+	}
+	mAlarmSrvSession.Close();
+
+	qDebug("clock: AlarmClient::~AlarmClient() <--");
+}
+
+/*!
+	Returns the list of alarms currently set on the phone.
+
+	\param alarmList Reference to a list of alarms.
+ */
+void AlarmClient::getAlarmList(QList<AlarmInfo>& alarmList)
+{
+	qDebug() << "clock: AlarmClient::getAlarmList -->";
+
+	// 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();
+
+	qDebug() << "clock: AlarmClient::getAlarmList <--";
+}
+
+/*!
+	Sets a new alarm with the alarmserver.
+ */
+void AlarmClient::setAlarm(AlarmInfo& alarmInfo)
+{
+	qDebug() << "clock: AlarmClient::setAlarm -->";
+
+	// 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;
+	}
+
+	qDebug() << "clock: AlarmClient::setAlarm <--";
+}
+
+void AlarmClient::setAlarmState(TAlarmState state, AlarmState& alarmState)
+{
+	qDebug() << "clock: AlarmClient::setAlarmState -->";
+
+	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;
+	}
+
+	qDebug() << "clock: AlarmClient::setAlarmState <--";
+}
+
+void AlarmClient::setAlarmState(AlarmState state, TAlarmState& alarmState)
+{
+	qDebug() << "clock: AlarmClient::setAlarmState -->";
+
+	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;
+	}
+
+	qDebug() << "clock: AlarmClient::setAlarmState <--";
+}
+
+void AlarmClient::setAlarmRepeatType(
+		TAlarmRepeatDefinition repeat, AlarmRepeatType& repeatType)
+{
+	qDebug() << "clock: AlarmClient::setAlarmRepeatType -->";
+
+	switch (repeat) {
+		case EAlarmRepeatDefintionRepeatOnce:
+			repeatType = Once;
+			break;
+		case EAlarmRepeatDefintionRepeatDaily:
+			repeatType = Daily;
+			break;
+		case EAlarmRepeatDefintionRepeatWorkday:
+			repeatType = Workday;
+			break;
+		case EAlarmRepeatDefintionRepeatWeekly:
+			repeatType = Weekly;
+			break;
+		default:
+			break;
+	}
+
+	qDebug() << "clock: AlarmClient::setAlarmRepeatType <--";
+}
+
+void AlarmClient::setAlarmRepeatType(
+		AlarmRepeatType repeat, TAlarmRepeatDefinition& repeatType)
+{
+	qDebug() << "clock: AlarmClient::setAlarmRepeatType -->";
+
+	switch (repeat) {
+		case Once:
+			repeatType = EAlarmRepeatDefintionRepeatOnce;
+			break;
+		case Daily:
+			repeatType = EAlarmRepeatDefintionRepeatDaily;
+			break;
+		case Workday:
+			repeatType = EAlarmRepeatDefintionRepeatWorkday;
+			break;
+		case Weekly:
+			repeatType = EAlarmRepeatDefintionRepeatWeekly;
+			break;
+		default:
+			break;
+	}
+
+	qDebug() << "clock: AlarmClient::setAlarmRepeatType <--";
+}
+
+void AlarmClient::deleteAlarm(int alarmId)
+{
+	qDebug() << "clock: AlarmClient::deleteAlarm -->";
+
+	// Request the alarmserver to delete the alarm.
+	mAlarmSrvSession.AlarmDelete(alarmId);
+
+	qDebug() << "clock: AlarmClient::deleteAlarm <--";
+}
+
+int AlarmClient::getAlarmInfo(int alarmId, AlarmInfo& alarmInfo)
+{
+	qDebug() << "clock: AlarmClient::getAlarmInfo -->";
+
+	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 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 = alarmId;
+
+		// Alarm volume status.
+		if(tempSharedAlarm.ClientData2()) {
+			alarmInfo.volumeStatus = AlarmVolumeOn;
+		} else {
+			alarmInfo.volumeStatus = AlarmVolumeOff;
+		}
+	}
+
+	qDebug() << "clock: AlarmClient::getAlarmInfo <--";
+
+	return error;
+}
+
+void AlarmClient::toggleAlarmStatus(int alarmId, int alarmStatus)
+{
+	qDebug() << "clock: AlarmClient::toggleAlarmStatus -->";
+
+	mAlarmSrvSession.SetAlarmStatus(alarmId, (TAlarmStatus)alarmStatus);
+
+	qDebug() << "clock: AlarmClient::toggleAlarmStatus <--";
+}
+
+void AlarmClient::startListener()
+{
+	qDebug("clock: AlarmClient::startListener() -->");
+
+	mListener->start();
+
+	qDebug("clock: AlarmClient::startListener() <--");
+}
+
+void AlarmClient::stopListener()
+{
+	qDebug("clock: AlarmClient::stopListener() -->");
+
+	mListener->stop();
+
+	qDebug("clock: AlarmClient::stopListener() <--");
+}
+
+void AlarmClient::notifyChange(int alarmId)
+{
+	qDebug() << "clock: AlarmClient::notifyChange -->";
+
+	emit alarmStateChanged(alarmId);
+
+	qDebug() << "clock: AlarmClient::notifyChange <--";
+}
+
+// End of file	--Don't remove this.