⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pclock.cpp

📁 一个基于BREW上的电子时钟程序,通过太阳历计算当前时间,并有闹铃和日志功能.
💻 CPP
字号:
//
//      pclock.cpp
//
//      Copyright (C) 2006 Sophia Cradle Incorporated

#include "pclock.hpp"
#include "SGRSoftkeyWindow.hpp"
#include "SGRSoftkeyToolbox.hpp"

#define PCLOCK_CONFIG_FILENAME		"config.cfg"
#define PCLOCK_CURRENTCITY_TAG		0
#define PCLOCK_ALARM_SUBJECT_TAG	1
#define PCLOCK_ALARM_DATE_TAG		2
#define PCLOCK_ALARM_SOUNDFILE		"alarm.qcp"
#define PCLOCK_ALARMDIALOG_HEIGHT		220

// 僽乕僩 儘乕僟
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
    *license = "heap://U3TDGVKUPSNWQC6T2X9Z9RFYIWC2Y9R6YCSMT0PV0Y4Y3SCRFWCY9UG96XHT7TQZ9U7RET7RDYFUGXNXHR9R7VDTPLVJOUHXHT2WGY3T5WQUQVHX7WPW6SDS0GX8ROYLW3TIT9XKXQVKXKUIR9UPZ1VIU8T6XAEU6THR7SDYIUEU3XH1Y7RGUES0S8U3R8VCT9XPRHVQUKTKCTAU9WIRQ2XBT5R5S5W94BY7T5RQW2U8WHVFS7Y8RHW9XHWAVNUGUGWKT6V4VLTOW1S1Y6T9JR0T4CXNWNSN9XLSQ8T1V0SIT7Y9Y2RCU2XORFXCSIU4U5TQ6XGX7Z8S9YOU2X9U1WOV4YGTAVOJWJVK1XG6";

    return (id == AEECLSID_PCLOCK) ? (&pclock::Factory) : (null);
}


// 僼傽僋僩儕娭悢
SFCInvokerPtr pclock::Factory(Void)
{
    return ::new pclock;
}

// 僐儞僗僩儔僋僞
pclock::pclock(Void) static_throws : _clockWindow(null), _alarmFlag(false), _toRemoveDialog(null)
{
	// 偙偙偱奺庬僴儞僪儔偺搊榐傪峴偄傑偡丅
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_APP_START, HANDLER_BEFORE, HANDLER_FUNCTION(OnAppStart)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_APP_STOP, HANDLER_AFTER, HANDLER_FUNCTION(OnAppStop)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_APP_RESUME, HANDLER_BEFORE, HANDLER_FUNCTION(OnAppResume)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_APP_SUSPEND, HANDLER_AFTER, HANDLER_FUNCTION(OnAppSuspend)));
    }
    if (static_try()) {
        static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
    }
	if (static_try()) {
		// 傾儔乕儉偺僀儀儞僩 僴儞僪儔傪搊榐
		static_throw(RegisterHandler(SFEVT_ALARM, HANDLER_BEFORE, HANDLER_FUNCTION(OnAlarm)));
	}
	return;
}


// 僨僗僩儔僋僞
pclock::~pclock(Void)
{
	return;
}


// 傾僾儕奐巒僴儞僪儔
HANDLER_IMPLEMENT_VOIDSTART(pclock, OnAppStart, environment)
{
    // 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅

    unused(environment);

    // 偙偙偵傾僾儕奐巒帪偺張棟傪婰弎偟傑偡丅
	SGRSoftkeyWindowPtr softkey;
	SFXConfig config;
	SInt32 index;
	CityInformation::CITY city;
	SFXDateConst defaultDate(2001, 1, 1, 0, 0, 0);
	UInt32 sec(0);

	// AEE_FONT_NORMAL 偱昤夋偡傞僼僅儞僩傪曄峏
#if TARGET_VERSION_GE(3, 1, 0)
	SFXGraphics::RegisterFont(AEE_FONT_NORMAL, KDDI_FONT_FIXED16X16);
#elif TARGET_VERSION_GE(2, 1, 0)
	SFXGraphics::RegisterFont(AEE_FONT_NORMAL, AEECLSID_KDDI_SMALL_FONT);
#endif

	// 搒巗忣曬偵娭偟偰
	config.Load(PCLOCK_CONFIG_FILENAME);
	index = _cityInfo.Find(config.ReadSFXWideString(PCLOCK_CURRENTCITY_TAG, "搶嫗"));
	city = (index == -1) ? _cityInfo.Get(0) : _cityInfo.Get(index);
	_currentCity.Set(city._name);
	
	// 傾儔乕儉偺愝掕偵娭偟偰
	_alarmInfo._userCode = 0;
	_alarmInfo._subject = config.ReadSFXWideString(PCLOCK_ALARM_SUBJECT_TAG, "");
	sec = config.ReadUInt32(PCLOCK_ALARM_DATE_TAG, 0);
	_alarmInfo._date.Set((sec > 0) ? sec : defaultDate.ToUInt32());

	// 僜僼僩 僉乕偺嶌惉
	softkey = :: new SGRSoftkeyWindow(this);
	if (softkey == null) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*softkey);
	}
	if (!static_try()) {
		::delete softkey;
	}

	_clockWindow = ::new ClockWindow(this, SGRSoftkeyToolbox::GetWindowPosition(), city._name, city._timeDifference, city._longitude, city._latitude, city._height);
	if (_clockWindow == null) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*_clockWindow);
	}
	if (!static_try()) {
		::delete _clockWindow;
	}

	// 傾儔乕儉偵傛傞婲摦
	if (_alarmFlag) {
		TellAlarm();
	}

    return;
}


// 傾僾儕廔椆僴儞僪儔
HANDLER_IMPLEMENT_VOIDSTOP(pclock, OnAppStop, quitable)
{
    // 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅

    unused(quitable);

    // 偙偙偵傾僾儕廔椆帪偺張棟傪婰弎偟傑偡丅
	SFXConfig config;

	// 搒巗忣曬偵娭偟偰
	config.Load(PCLOCK_CONFIG_FILENAME);
	config.WriteSFXWideString(PCLOCK_CURRENTCITY_TAG, _currentCity);
	config.Save();

	// 壒惡嵞惗屻偺屻巒枛
	if (_mediaQCP != null) {
		_mediaQCP->Stop();
		_mediaQCP.Release();
	}

	SFBShell::GetInstance()->CancelTimer(null, this);

    return;
}


// 傾僾儕嵞奐僴儞僪儔
HANDLER_IMPLEMENT_VOIDRESUME(pclock, OnAppResume, environment)
{
    // 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅

    unused(environment);

    // 偙偙偵傾僾儕嵞奐帪偺張棟傪婰弎偟傑偡丅

    return;
}


// 傾僾儕拞抐僴儞僪儔
HANDLER_IMPLEMENT_VOIDSUSPEND(pclock, OnAppSuspend, reason, info)
{
    // 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅

    unused(reason);
    unused(info);

    // 偙偙偵傾僾儕拞抐帪偺張棟傪婰弎偟傑偡丅
	SFBShell::GetInstance()->CancelTimer(null, this);
	if (_mediaQCP != null) {
		_mediaQCP->Stop();
		_mediaQCP.Release();
	}
    return;
}


// 僉乕 僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(pclock, OnKey, event)
{
    // 偙偙偵僉乕偑墴偝傟偨偲偒偺張棟傪婰弎偟傑偡丅
	unused(event);

    return false;
}

// 怴偨偵慖戰偝傟偨搒巗忣曬傪傾僾儕慡懱偵斀塮偝偣傞
Void pclock::SetCurrentCity(SInt32 index)
{
	CityInformation::CITY city((index == -1) ? _cityInfo.Get(0) : _cityInfo.Get(index));

	_currentCity.Set(city._name);
	if (_clockWindow) {
		_clockWindow->SetCity(city._name, city._timeDifference, city._longitude, city._latitude, city._height);
	}
}

// 傾儔乕儉傪愝掕偡傞
// 傾儔乕儉偼暘扨埵偱偟偐愝掕偱偒側偄偺偱丄僞僀儅乕偲暪梡偡傞
Bool pclock::SetAlarm(AlarmInformationConstRef info)
{
	SFBShellSmp shell(SFBShell::GetInstance());
	SFXDate updateDate, currentDate;
	SFXDateDuration duration;

	if (shell->AlarmsActive()) {
		shell->CancelAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode);
	}
	_alarmInfo = info;
	_alarmInfo._userCode = 0;
	currentDate = SFXDate::CurrentUTCDate();
	updateDate.Set(currentDate.GetYear(), currentDate.GetMonth(), currentDate.GetDay(), currentDate.GetHour(), currentDate.GetMinute(), 0);
	updateDate.AddMinute(1);
	duration = updateDate - currentDate;

	// 帪崗偑偪傚偆偳 0 昩偵側傞偺傪懸偮
	shell->SetTimer(duration.ToSInt32() * 1000, OnTimerSPP, this);

	return true;
}

// 傾儔乕儉 僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(pclock, OnAlarm, event)
{
	unused(event);

	SFBShellSmp shell(SFBShell::GetInstance());

	if (shell->ActiveApplet() == AEECLSID_PCLOCK) {
		// 尰嵼婲摦拞
		TellAlarm();
	}
	else if (shell->CanStartApplet(AEECLSID_PCLOCK)) {
		// 崱偼婲摦偟偰偄側偄偑丄婲摦壜擻偱偁傞応崌
		_alarmFlag = true;
		shell->StartApplet(AEECLSID_PCLOCK);
	}

	return true;
}

// 傾儔乕儉偱愝掕偝傟偨帪崗偵側偭偨偙偲傪捠抦偡傞
Void pclock::TellAlarm(Void)
{
	SFRMultiDialogPtr dialog(null);
	SFRMultiDialog::ParamRec param;

	_alarmFlag = false;
	_mediaQCP = SFBMediaQCP::NewInstance();
	if (_mediaQCP != null) {
		_mediaData.clsData = MMD_FILE_NAME;
		_mediaData.pData = SFXHelper::strdup(PCLOCK_ALARM_SOUNDFILE);
		_mediaData.dwSize = 0;
		_mediaQCP->SetMediaData(&_mediaData);
		_mediaQCP->Play();
	}
	param.text = _alarmInfo._subject + " 偺帪娫偱偡丅";
	param.ok = "Ok";
	param.cancel = "";
	param.another = "";
	param.focus = SFRMultiDialog::FOCUS_CANCEL;
	param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, ACCEPT);

	dialog = ::new SFRMultiDialog(SGRSoftkeyToolbox::GetDialogPosition(SFRMultiDialog::GetMargin(), PCLOCK_ALARMDIALOG_HEIGHT), "傾儔乕儉偺捠抦", param);
	if (!dialog) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*dialog);
	}
	if (!static_try()) {
		::delete dialog;
		dialog = null;
	}
	else {
		SGRSoftkeyToolbox::OpenStandardDialog(dialog, HANDLER_FUNCTION(OnAlarmDialog));
	}
}

// 傾儔乕儉傪夝彍偡傞
Bool pclock::CancelAlarm(Void)
{
	SFBShellSmp shell(SFBShell::GetInstance());
	
	shell->CancelTimer(null, this);
	if (!shell->AlarmsActive()) {
		return true;
	}
	else {
		return shell->CancelAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode) == SUCCESS;
	}
}

// 帪崗偑偪傚偆偳 0 昩偵側偭偨偲偒偵傾儔乕儉傪愝掕偡傞
Void pclock::OnTimer(Void)
{
	SFBShellSmp shell(SFBShell::GetInstance());
	SFXDateDuration duration;
	SFXConfig config;
	SInt32 minute;

	duration = _alarmInfo._date - SFXDate::CurrentUTCDate();
	minute = duration.ToSInt32() / 60;
	if (minute == 0) {
		// 傾儔乕儉傪愝掕偡傞娫傕側偔丄帪娫偵側偭偨
		TellAlarm();
	}
	else {
		if (shell->SetAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode, minute) == SUCCESS) {
			config.Load(PCLOCK_CONFIG_FILENAME);
			config.WriteSFXWideString(PCLOCK_ALARM_SUBJECT_TAG, _alarmInfo._subject);
			config.WriteUInt32(PCLOCK_ALARM_DATE_TAG, _alarmInfo._date.ToUInt32());
			config.Save();
		}
	}
}

HANDLER_IMPLEMENT_VOIDDIALOG(pclock, OnAlarmDialog, result, dialog)
{
	unused(result);

	if (_mediaQCP != null) {
		_mediaQCP->Stop();
		_mediaQCP.Release();
	}
	SGRSoftkeyToolbox::CloseStandardDialog(dialog);
	if (_toRemoveDialog) {
		SGRSoftkeyWindow::Terminate(_toRemoveDialog);
		_toRemoveDialog->DialogHandler();
		_toRemoveDialog = null;
	}
}

// 愝掕偝傟偰偄傞傾儔乕儉帪崗傪暥帤楍偵曄姺
SFXWideString pclock::GetAlarmDate(SFXDateDurationConstRef timeDifference)
{
	SFXWideString result;
	SFXDate alarmLocalDate;

	if (IsAlarmActive()) {
		alarmLocalDate = _alarmInfo._date + timeDifference;
		result = SFXWideString::Format("%hd/%02hd/%02hd %02hd:%02hd", alarmLocalDate.GetYear(), alarmLocalDate.GetMonth(), alarmLocalDate.GetDay(), alarmLocalDate.GetHour(), alarmLocalDate.GetMinute());
	}
	else {
		result = "NONE";
	}

	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -