/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $URL$ * $Id$ * */ #include #include #include #include "StarterRsc.h" #include "palmdefs.h" #include "start.h" #include "globals.h" #include "rumble.h" #include "mathlib.h" #include "formCards.h" #include "games.h" #include "modules.h" #include "init_mathlib.h" #include "init_sony.h" #include "init_palmos.h" #include "init_stuffs.h" /*********************************************************************** * * FUNCTION: AppStart * * DESCRIPTION: Get the current application's preferences. * * PARAMETERS: nothing * * RETURNED: Err value 0 if nothing went wrong * * REVISION HISTORY: * * ***********************************************************************/ static Err AppStartCheckHRmode() { Err e = errNone; UInt32 depth = (OPTIONS_TST(kOptMode16Bit) && OPTIONS_TST(kOptDeviceOS5)) ? 16 : 8; // try to init Sony HR mode then Palm HR mode gVars->HRrefNum = SonyHRInit(depth); if (gVars->HRrefNum == sysInvalidRefNum) { if (e = PalmHRInit(depth)) FrmCustomAlert(FrmErrorAlert,"Your device doesn't seem to support Hi-Res or 256color mode.",0,0); } else { OPTIONS_SET(kOptDeviceClie); } return e; } static void AppStopHRMode() { if (gVars->HRrefNum != sysInvalidRefNum) SonyHRRelease(gVars->HRrefNum); else PalmHRRelease(); } static Err AppStartCheckNotify() { UInt32 romVersion; Err err; err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); if (!err) { UInt16 cardNo; LocalID dbID; err = SysCurAppDatabase(&cardNo, &dbID); if (!err) { SysNotifyRegister(cardNo, dbID, sysNotifyVolumeMountedEvent, NULL, sysNotifyNormalPriority, NULL); SysNotifyRegister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, NULL, sysNotifyNormalPriority, NULL); SysNotifyRegister(cardNo, dbID, sonySysNotifyMsaEnforceOpenEvent, NULL, sysNotifyNormalPriority, NULL); SysNotifyRegister(cardNo, dbID, sysNotifyDisplayResizedEvent, NULL, sysNotifyNormalPriority, NULL); } } return err; } static Err AppStartLoadSkin() { Err err = errNone; // if skin defined, check if the db still exists if (gPrefs->skin.dbID) { UInt32 type, creator; // check if the DB still exists DmSearchStateType state; UInt16 cardNo; LocalID dbID; Boolean found = false; err = DmGetNextDatabaseByTypeCreator(true, &state, 'skin', appFileCreator, false, &cardNo, &dbID); while (!err && dbID && !found) { found = (cardNo == gPrefs->skin.cardNo && dbID == gPrefs->skin.dbID); err = DmGetNextDatabaseByTypeCreator(false, &state, 'skin', appFileCreator, false, &cardNo, &dbID); } if (found) { // remember to check version for next revision of the skin err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0,0, &type, &creator); if (!err) if (type != 'skin' || creator != appFileCreator) err = dmErrInvalidParam; } if (!found || err) MemSet(&(gPrefs->skin),sizeof(SkinInfoType),0); } // No skin ? try to get the first one if (!gPrefs->skin.dbID) { DmSearchStateType stateInfo; err = DmGetNextDatabaseByTypeCreator(true, &stateInfo, 'skin', appFileCreator, false, &gPrefs->skin.cardNo, &gPrefs->skin.dbID); if (!err) err = DmDatabaseInfo (gPrefs->skin.cardNo, gPrefs->skin.dbID, gPrefs->skin.nameP, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } return err; } static Err AppStartCheckMathLib() { Err e = MathlibInit(); switch (e) { case errNone: break; case sysErrLibNotFound: FrmCustomAlert(FrmErrorAlert,"Can't find MathLib !",0,0); break; default: FrmCustomAlert(FrmErrorAlert,"Can't open MathLib !",0,0); break; } return e; } static void AppStopMathLib() { MathlibRelease(); } static void AppStartCheckScreenSize() { Coord sw, sh, fw, fh; UInt8 mode; OPTIONS_RST(kOptCollapsible); OPTIONS_RST(kOptModeWide); OPTIONS_RST(kOptModeLandscape); OPTIONS_RST(kOptModeRotatable); // we are on a sony device if (OPTIONS_TST(kOptDeviceClie)) { mode = SonyScreenSize(gVars->HRrefNum, &sw, &sh, &fw, &fh); if (mode) { OPTIONS_SET(kOptModeWide); OPTIONS_SET((mode == SONY_LANDSCAPE) ? kOptModeLandscape : kOptNone); } } else { mode = PalmScreenSize(&sw, &sh, &fw, &fh); if (mode) { OPTIONS_SET(kOptCollapsible); OPTIONS_SET(kOptModeWide); OPTIONS_SET((mode == PALM_LANDSCAPE) ? kOptModeLandscape : kOptNone); // TODO: doesn't work with Sony OPTIONS_SET(SysGlueTrapExists(pinSysSetOrientation) ? kOptModeRotatable :kOptNone); } } gVars->screenWidth = sw; gVars->screenHeight = sh; gVars->screenFullWidth = fw; gVars->screenFullHeight = fh; } #define max(id,value) gVars->memory[id] = (gVars->memory[id] < value ? value : gVars->memory[id]) #define min(id,value) gVars->memory[id] = (gVars->memory[id] > value ? value : gVars->memory[id]) #define threshold 700 static void AppStartSetMemory() { UInt32 mem, def; PalmGetMemory(0,0,0,&mem); def = (mem > threshold) ? (mem - threshold) * 1024 : 0; gVars->startupMemory = mem; } #undef threshold #undef min #undef max Err AppStart(void) { UInt16 dataSize, checkSize = 0; Err error; #ifndef _DEBUG_ENGINE // delete old databases ModDelete(); #endif // allocate global variables space dataSize = sizeof(GlobalsDataType); gVars = (GlobalsDataType *)MemPtrNew(dataSize); MemSet(gVars, dataSize, 0); gVars->indicator.on = 255; gVars->indicator.off = 0; gVars->HRrefNum = sysInvalidRefNum; gVars->VFS.volRefNum = vfsInvalidVolRef; gVars->slkRefNum = sysInvalidRefNum; gVars->options = kOptNone; // set memory required by the differents engines AppStartSetMemory(); StuffsGetFeatures(); // allocate prefs space dataSize = sizeof(GlobalsPreferenceType); gPrefs = (GlobalsPreferenceType *)MemPtrNew(dataSize); MemSet(gPrefs, dataSize, 0); // Read the saved preferences / saved-state information. if (PrefGetAppPreferences(appFileCreator, appPrefID, NULL, &checkSize, true) == noPreferenceFound || checkSize != dataSize) { // reset all elements MemSet(gPrefs, dataSize, 0); gPrefs->card.volRefNum = vfsInvalidVolRef; gPrefs->card.cacheSize = 4096; gPrefs->card.useCache = true; gPrefs->card.showLED = true; gPrefs->card.autoDetect = true; gPrefs->autoOff = true; gPrefs->vibrator = RumbleExists(); gPrefs->debug = false; gPrefs->exitLauncher = true; gPrefs->stdPalette = OPTIONS_TST(kOptDeviceOS5); gPrefs->stylusClick = true; } else { PrefGetAppPreferences(appFileCreator, appPrefID, gPrefs, &dataSize, true); } if (!OPTIONS_TST(kOptDeviceARM)) { error = AppStartCheckMathLib(); if (error) return (error); } error = AppStartCheckHRmode(); if (error) return (error); bDirectMode = (AppStartLoadSkin() != errNone); // if volref previously defined, check if it's a valid one if (gPrefs->card.volRefNum != vfsInvalidVolRef) { VolumeInfoType volInfo; Err err = VFSVolumeInfo(gPrefs->card.volRefNum, &volInfo); if (err) gPrefs->card.volRefNum = parseCards(); } else gPrefs->card.volRefNum = parseCards(); if (gPrefs->card.volRefNum != vfsInvalidVolRef) CardSlotCreateDirs(); // open games database error = GamOpenDatabase(); if (error) return (error); GamImportDatabase(); AppStartCheckScreenSize(); AppStartCheckNotify(); // not fatal error if not avalaible return error; } /*********************************************************************** * * FUNCTION: AppStop * * DESCRIPTION: Save the current state of the application. * * PARAMETERS: nothing * * RETURNED: nothing * * REVISION HISTORY: * * ***********************************************************************/ static Err AppStopCheckNotify() { UInt32 romVersion; Err err; err = FtrGet(sysFtrCreator, sysFtrNumNotifyMgrVersion, &romVersion); if (!err) { UInt16 cardNo; LocalID dbID; err = SysCurAppDatabase(&cardNo, &dbID); if (!err) { SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeUnmountedEvent, sysNotifyNormalPriority); SysNotifyUnregister(cardNo, dbID, sysNotifyVolumeMountedEvent, sysNotifyNormalPriority); // sonySysNotifyMsaEnforceOpenEvent SysNotifyUnregister(cardNo, dbID, sysNotifyDisplayResizedEvent, sysNotifyNormalPriority); } } return err; } void AppStop(void) { // Close all the open forms. FrmCloseAllForms(); WinEraseWindow(); WinPalette(winPaletteSetToDefault, 0, 256, NULL); // Close and move Game list database GamCloseDatabase(false); // Write the saved preferences / saved-state information. This data // will saved during a HotSync backup. SavePrefs(); // stop all AppStopCheckNotify(); if (!OPTIONS_TST(kOptDeviceARM)) AppStopMathLib(); AppStopHRMode(); if (!bLaunched) MemPtrFree(gVars); }