From a5e443a332738c16c74aedf78b483fb0165f6164 Mon Sep 17 00:00:00 2001 From: Chris Apers Date: Mon, 3 Nov 2003 16:18:13 +0000 Subject: AppStart/AppStop functions svn-id: r11102 --- backends/PalmOS/Src/app.cpp | 417 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 417 insertions(+) create mode 100644 backends/PalmOS/Src/app.cpp (limited to 'backends/PalmOS/Src/app.cpp') diff --git a/backends/PalmOS/Src/app.cpp b/backends/PalmOS/Src/app.cpp new file mode 100644 index 0000000000..b79e01cdda --- /dev/null +++ b/backends/PalmOS/Src/app.cpp @@ -0,0 +1,417 @@ +#include +#include + +#include "StarterRsc.h" +#include "start.h" +#include "globals.h" + +#include "mathlib.h" +#include "formCards.h" +#include "games.h" + +#define kOS5Version sysMakeROMVersion(5,0,0,sysROMStageRelease,0) + +/*********************************************************************** + * + * FUNCTION: AppStart + * + * DESCRIPTION: Get the current application's preferences. + * + * PARAMETERS: nothing + * + * RETURNED: Err value 0 if nothing went wrong + * + * REVISION HISTORY: + * + * + ***********************************************************************/ +static Err AppStartCheckHRmode() +{ + SonySysFtrSysInfoP sonySysFtrSysInfoP; + UInt32 version; + Err error = errNone; + + // test if sonyHR is present + if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { + if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrHR) { // HR available + + if ((error = SysLibFind(sonySysLibNameHR, &gVars->HRrefNum))) + if (error == sysErrLibNotFound) // couldn't find lib + error = SysLibLoad( 'libr', sonySysFileCHRLib, &gVars->HRrefNum); + + if (!error) { // Now we can use HR lib. Executes Open library. + error = HROpen(gVars->HRrefNum); + gVars->options |= optIsClieDevice; + } + } + } + // if not Hi-Density ? + if (error && !(error = FtrGet(sysFtrCreator, sysFtrNumWinVersion, &version))) { + gVars->HRrefNum = sysInvalidRefNum; // Not sony HR + gVars->options &= ~optIsClieDevice; + + if (version<4) + error = 1; + } + + if (!error) { // Not, error processing + UInt32 width, height, depth; + Boolean color; + + width = hrWidth; + height= hrHeight; + depth = 8; + color = true; + + if (gVars->HRrefNum != sysInvalidRefNum) + error = HRWinScreenMode (gVars->HRrefNum, winScreenModeSet, &width, &height, &depth, &color ); + else + error = WinScreenMode (winScreenModeSet, &width, &height, &depth, &color ); + + // high-resolution mode entered from here if no error + if (error != errNone) + FrmCustomAlert(FrmErrorAlert,"Your device doesn't seems to support 256 colors mode.",0,0); + + // check for 16bit mode + if (!WinScreenMode(winScreenModeGetSupportedDepths, NULL, NULL, &depth, &color)) + gVars->options |= ((depth & 0x8000) ? optHas16BitMode : 0); + } + else + FrmCustomAlert(FrmErrorAlert,"This device doesn't seems to support\nHi-Res mode.",0,0); + + return error; +} + +static void AppStopHRMode() { + if (gVars->HRrefNum != sysInvalidRefNum) { + HRClose(gVars->HRrefNum); + //SysLibRemove(gVars->HRrefNum); // never call this !! + } +} + +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; + + // 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 (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); + } + + if (err) + FrmCustomAlert(FrmErrorAlert,"No skin found.\nPlease install a skin and restart ScummVM.",0,0); + + return err; +} + +static Err AppStartCheckMathLib() +{ + Err error = errNone; + + if ((error = SysLibFind(MathLibName, &MathLibRef))) + if (error == sysErrLibNotFound) // couldn't find lib + error = SysLibLoad( LibType, MathLibCreator, &MathLibRef); + + if (!error) {// Now we can use lib. Executes Open library. + error = MathLibOpen(MathLibRef, MathLibVersion); + if (error) + FrmCustomAlert(FrmErrorAlert,"Can't open MathLib !",0,0); + + } else { + FrmCustomAlert(FrmErrorAlert,"Can't find MathLib.\nPlease install it first.",0,0); + } + + return error; +} + +static void AppStopMathLib() { + UInt16 useCount; + + if (MathLibRef != sysInvalidRefNum) { + MathLibClose(MathLibRef, &useCount); + + if (!useCount) + SysLibRemove(MathLibRef); + } +} + +static Err AppStartCheckScreenSize() { + SonySysFtrSysInfoP sonySysFtrSysInfoP; + Err error = errNone; + UInt32 ftr = 0; + +// WinGetDisplayExtent(&gVars->screenWidth, &gVars->screenHeight); + +// gVars->screenWidth <<= 1; +// gVars->screenHeight <<= 1; + gVars->screenWidth = 320; + gVars->screenHeight = 320; + + gVars->screenFullWidth = gVars->screenWidth; + gVars->screenFullHeight = gVars->screenHeight; + + // Sony HiRes+ + if (!(error = FtrGet(sonySysFtrCreator, sonySysFtrNumSysInfoP, (UInt32*)&sonySysFtrSysInfoP))) { + if (sonySysFtrSysInfoP->libr & sonySysFtrSysInfoLibrSilk) { + + if ((error = SysLibFind(sonySysLibNameSilk, &gVars->slkRefNum))) + if (error == sysErrLibNotFound) + error = SysLibLoad( sonySysFileTSilkLib, sonySysFileCSilkLib, &gVars->slkRefNum); + + if (!error) { + error = FtrGet(sonySysFtrCreator, sonySysFtrNumVskVersion, &gVars->slkVersion); + // Get screen size + if (error) { + // v1 = NR + error = SilkLibOpen(gVars->slkRefNum); + if(!error) { + gVars->slkVersion = vskVersionNum1; + SilkLibEnableResize(gVars->slkRefNum); + SilkLibResizeDispWin(gVars->slkRefNum, silkResizeMax); + HRWinGetWindowExtent(gVars->HRrefNum, &gVars->screenFullWidth, &gVars->screenFullHeight); + SilkLibResizeDispWin(gVars->slkRefNum, silkResizeNormal); + SilkLibDisableResize(gVars->slkRefNum); + } + } else { + // v2 = NX/NZ + // v3 = UX + error = VskOpen(gVars->slkRefNum); + if(!error) { + VskSetState(gVars->slkRefNum, vskStateEnable, (gVars->slkVersion == vskVersionNum2 ? vskResizeVertically : vskResizeHorizontally)); + gVars->options |= (gVars->slkVersion == vskVersionNum2 ? optIsLandscapeMode : 0); + VskSetState(gVars->slkRefNum, vskStateResize, vskResizeNone); + HRWinGetWindowExtent(gVars->HRrefNum, &gVars->screenFullWidth, &gVars->screenFullHeight); + VskSetState(gVars->slkRefNum, vskStateResize, vskResizeMax); + VskSetState(gVars->slkRefNum, vskStateEnable, vskResizeDisable); + } + } + } + } + + if (error) + gVars->slkRefNum = sysInvalidRefNum; + else + gVars->options |= optHasWideMode; + } + + // Tapwave Zodiac and other DIA API compatible devies, TODO : a better handler, read the doc + if (error) { + if (!(error = FtrGet(sysFtrCreator, sysFtrNumInputAreaFlags, &ftr))) { + if (ftr & grfFtrInputAreaFlagLandscape) { + UInt16 old = SysGetOrientation(); + error = SysSetOrientation(sysOrientationLandscape); + error = (error) ? error : PINSetInputAreaState(pinInputAreaClosed); + error = (error) ? error : StatHide(); + + if (!error) { + RectangleType r; + WinGetBounds(WinGetDisplayWindow(), &r); + gVars->screenFullWidth = r.extent.x << 1; + gVars->screenFullHeight = r.extent.y << 1; + gVars->options |= optHasWideMode|optIsLandscapeMode; + } + + error = StatShow(); + error = PINSetInputAreaState(pinInputAreaOpen); + error = SysSetOrientation(old); + } + } + } + + return error; +} + +static void AppStopSilk() { + if (gVars->slkRefNum != sysInvalidRefNum) + SilkLibClose(gVars->slkRefNum); +} + +Err AppStart(void) { + UInt16 dataSize, checkSize = 0; + UInt32 ulProcessorType; + UInt32 romVersion; + Err error; + + // 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->volRefNum = sysInvalidRefNum; + gVars->slkRefNum = sysInvalidRefNum; + gVars->skinSet = false; + gVars->options = optNone; + + // OS5 ? + if (!FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion)) + gVars->options |= ((romVersion >= kOS5Version) ? optIsOS5Device : 0); + + // ARM ? + if (!FtrGet(sysFileCSystem, sysFtrNumProcessorID, &ulProcessorType)) + gVars->options |= ((sysFtrNumProcessorIsARM(ulProcessorType)) ? optIsARMDevice : 0); + + // 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 = sysInvalidRefNum; + + gPrefs->autoOff = true; + gPrefs->vibrator = CheckVibratorExists(); + gPrefs->debug = false; + + gPrefs->stdPalette = (gVars->options & optIsOS5Device); + + gPrefs->volume.speaker = 16; + gPrefs->volume.headphone = 16; + + gPrefs->volume.master = 192; + gPrefs->volume.music = 192; + gPrefs->volume.sfx = 192; + + gPrefs->sound.tempo = 100; + gPrefs->sound.defaultTrackLength = 10; + gPrefs->sound.firstTrack = 1; + + } else { + PrefGetAppPreferences(appFileCreator, appPrefID, gPrefs, &dataSize, true); + } + + error = AppStartCheckMathLib(); + if (error) return (error); + + error = AppStartCheckHRmode(); + if (error) return (error); + + error = AppStartLoadSkin(); + if (error) return (error); + + if (gPrefs->card.volRefNum != sysInvalidRefNum) { // if volref previously defined, check if it's a valid one + VolumeInfoType volInfo; + Err err = VFSVolumeInfo(gPrefs->card.volRefNum, &volInfo); + if (err) + gPrefs->card.volRefNum = sysInvalidRefNum; + } + else + gPrefs->card.volRefNum = parseCards(); //parseCards(0); // get first volref + + error = GamOpenDatabase(); + if (error) return (error); + GamImportDatabase(); + + AppStartCheckNotify(); // not fatal error if not avalaible + AppStartCheckScreenSize(); + + 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 + AppStopSilk(); + AppStopCheckNotify(); + AppStopMathLib(); + AppStopHRMode(); + + // reset if needed + if (gVars) { + Boolean autoReset = gVars->autoReset; + MemPtrFree(gVars); + if (autoReset) + SysReset(); + } +} \ No newline at end of file -- cgit v1.2.3