void buildAll() { Err err; LocalID olddb; olddb = DmFindDatabase(0, "Glbs::" BUILD_NAME); if (olddb) { DmDeleteDatabase(0,olddb); FrmCustomAlert(1000,"delete old " BUILD_NAME " DB",0,0); } err = DmCreateDatabase (0, "Glbs::" BUILD_NAME, 'ScVM', 'GLBS', false); olddb = DmFindDatabase(0, "Glbs::" BUILD_NAME); dbP[BUILD_RES] = DmOpenDatabase(0, olddb, dmModeReadWrite); #if defined(BUILD_COMMON) addNewGui(); #elif defined(BUILD_SCUMM) addDimuseTables(); // temp removed // TODO ::scummvm use sizeof(OLD256_MIDI_HACK) so i need to fix it // directly in the code or call MemHandleSize but it may slow down // code execution addAkos(); addDimuseCodecs(); addCodec47(); addGfx(); addDialogs(); addCharset(); addCostume(); addPlayerV2(); addScummTables(); #elif defined(BUILD_SIMON) addSimon(); Simon_addCharset(); #elif defined(BUILD_SKY) Sky_addHufftext(); #elif defined(BUILD_QUEEN) Queen_addTalk(); Queen_addRestables(); Queen_addGraphics(); Queen_addDisplay(); Queen_addMusicdata(); #elif defined(BUILD_SWORD1) Sword1_addStaticres(); #endif DmCloseDatabase(dbP[BUILD_RES]); }
/* * OpenIconSet - returns a DmOpenRef to an icon set * * Arguments: * name = Optional name of icon set to open (can be NULL). * canUseDefault = Indicates if it's ok to open a default icon set if * the named icon set isn't available. * * Returns: * NULL = Unable to open an icon set. * non-NULL = DmOpenRef to the icon set database. * * Remarks: If OpenIconSet() returns a valid DmOpenRef, the caller * is required to call DmCloseDatabase() to close it when * the caller is finished with it. */ DmOpenRef OpenIconSet(const Char *name, Boolean canUseDefault) { DmOpenRef pdb = 0; // If 'name' was specified, try to open it. if (name && *name) { const UInt16 card = 0; const LocalID lid = DmFindDatabase(card, name); if (lid) { UInt32 type; UInt32 creator; // Double check the type and creator. DmDatabaseInfo(card, lid, 0, 0, 0, 0, 0, 0, 0, 0, 0, &type, &creator); if ('Rsrc' == type && 'Actn' == creator) pdb = DmOpenDatabase(card, lid, dmModeReadOnly); } } // Fall back to the default icon set if we need to. if (!pdb && canUseDefault) pdb = DmOpenDatabaseByTypeCreator('Rsrc', 'Actn', dmModeReadOnly); // At this point we may or may not have been able to open an icon set. // The return value may be NULL or it may point to an icon set. return pdb; }
Err vfsImportDatabaseFromFile(UInt16 volRefNum, Char *pathNameP, UInt16 *cardNoP, LocalID *dbIDP) { axxPacFD fd; Err ret; Boolean needReset; Char nameP[32]; if ((fd = axxPacOpen(LibRef, pathNameP, O_RdOnly)) < 0) return vfsErrBadName; *cardNoP = 0; ret = ExgDBRead(&ReadDataFromFile,DeleteProc, &fd, dbIDP, *cardNoP, &needReset, true); ret = axxPacClose(LibRef, fd); if (ret < 0) return expErrNotEnoughPower; if (ret == dmErrAlreadyExists) { ret = vfsFileDBInfo(fd, nameP, NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL); *dbIDP = DmFindDatabase(0, nameP); *cardNoP = 0; } return ret; }
TDataMgr::TDataMgr(const char* dbName, UInt32 creator) : m_db(NULL) { LocalID dbId = DmFindDatabase(0, dbName); if (dbId == 0) { Err err = DmCreateDatabase(0, dbName, creator, 'DATA', false); if (err == errNone) { dbId = DmFindDatabase(0, dbName); } } if (dbId != 0) { m_db = DmOpenDatabase(0, dbId, dmModeReadWrite); } ErrFatalDisplayIf(m_db == NULL, "cannot open db"); }
/* Finds and opens database, * calls plugin specific code to create new item, * then fills in GoTo parameters. */ static UInt16 PickBooger(KleenexPtr kleenexP) { DmOpenRef dbR; UInt32 creatorID; UInt16 cardNo; LocalID dbID; Boolean closedb = false; UInt16 err, index; Char name[dmDBNameLength]; /* Check for the correct version */ if (!((kleenexP->version) & IBVERSION_PICTURE)) return (boogerErrorVersionMismatch); /* Open the database */ cardNo = 0; if (!(dbID = DmFindDatabase(cardNo, "DiddleIDB"))) return 1; if ((dbR = DmOpenDatabase(cardNo, dbID, dmModeReadWrite))) { closedb = true; } else if (DmGetLastErr() == dmErrAlreadyOpenForWrites) { dbR = NULL; while ((dbR = DmNextOpenDatabase(dbR))) { DmOpenDatabaseInfo(dbR, &dbID, NULL, NULL, &cardNo, NULL); DmDatabaseInfo(cardNo, dbID, name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &creatorID); if (!StrCompare(name, "DiddleIDB") && (creatorID == DB_CREATOR)) break; } if (!dbR) return 1; } /* Call plugin specific routine to create item in database */ err = DoTheBoogie(kleenexP, dbR, &index); /* Close the database */ if (closedb) DmCloseDatabase(dbR); /* Did it work? */ if (err) return (1); /* Load the GoTo parameters */ if (!(kleenexP->booger.cmdPBP = MemPtrNew(sizeof(GoToParamsType)))) return (1); MemSet(kleenexP->booger.cmdPBP, sizeof(GoToParamsType), 0); ((GoToParamsType *)(kleenexP->booger.cmdPBP))->dbCardNo = cardNo; ((GoToParamsType *)(kleenexP->booger.cmdPBP))->dbID = dbID; ((GoToParamsType *)(kleenexP->booger.cmdPBP))->recordNum = index; MemPtrSetOwner(kleenexP->booger.cmdPBP, 0); return (errNone); }
static Err ModImport(UInt16 volRefNum, UInt8 engine, Boolean *armP) { #ifndef _DEBUG_ENGINE char filename[256]; UInt16 cardNo; LocalID dbID; UInt32 result; FileRef file; #endif char msg[256]; FormPtr ofmP, frmP; Err e = errNone; ofmP = FrmGetActiveForm(); frmP = FrmInitForm(ImportForm); FrmSetActiveForm(frmP); FrmDrawForm(frmP); // In debug mode, the engine files are directly uploaded to the simulator #ifndef _DEBUG_ENGINE // engine file ? BUILD_FILE(engines[engine].fileP, ".engine"); CHECK_FILE("ScummVM engine file was not found !"); IMPRT_FILE("Cannot import engine file !"); // need more files ? dbID = DmFindDatabase(0, "ScummVM-Engine"); // be sure to have the correct dbID e = SysAppLaunch(cardNo, dbID, 0, sysAppLaunchCustomEngineGetInfo, 0, &result); *armP = ((result & GET_MODEARM) == GET_MODEARM); // common file ? if (!e && (result & GET_DATACOMMON)) { BUILD_FILE("common", ".data"); CHECK_FILE("Common data file was not found !"); IMPRT_FILE("Cannot import common data file !"); } // data file ? if (!e && (result & GET_DATAENGINE)) { BUILD_FILE(engines[engine].fileP, ".data"); CHECK_FILE("Engine data file was not found !"); IMPRT_FILE("Cannot import engine data file !"); } #endif // if error, cleanup if (e) ModDelete(); onError: FrmEraseForm(frmP); FrmDeleteForm(frmP); if (e) { if (ofmP) FrmSetActiveForm(ofmP); FrmCustomAlert(FrmErrorAlert, msg, 0, 0); } return e; }
//TODO : use Boolean instead of void to check err static DmOpenRef GlbOpenInternal(const Char *nameP) { LocalID dbID = DmFindDatabase(0, nameP); if (dbID) { UInt32 dbType, dbCreator; Err e = DmDatabaseInfo(0, dbID, 0, 0, 0, 0, 0, 0, 0, 0, 0, &dbType, &dbCreator); if (!e && dbType == 'GLBS' && dbCreator == appFileCreator) return DmOpenDatabase(0, dbID, dmModeReadOnly); } return NULL; }
/* Create database for list of documents */ static void CreateDocList( void ) /* THROWS */ { UInt16 cardNo; Err err; LocalID dbID; UInt16 version; /* list is always put on first card in RAM */ cardNo = 0; err = errNone; err = DmCreateDatabase( cardNo, PlkrDocListName, ViewerAppID, PlkrDocListType, false ); THROW_IF( err != errNone, memErrNotEnoughSpace ); dbID = DmFindDatabase( cardNo, PlkrDocListName ); version = PlkrDocListVersion; err = DmSetDatabaseInfo( cardNo, dbID, NULL, NULL, &version, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ); plkrDocList = DmOpenDatabaseByTypeCreator( PlkrDocListType, ViewerAppID, dmModeReadWrite ); ErrTry { InitPlkrAppInfo( plkrDocList ); } ErrCatch( UNUSED_PARAM( err ) ) { LocalID dbID; DmOpenDatabaseInfo( plkrDocList, &dbID, NULL, NULL, &cardNo, NULL ); CloseDatabase( plkrDocList ); DmDeleteDatabase( cardNo, dbID ); MSG( "Couldn't initialize Plkr document list [ appInfo ]\n" ); ErrThrow( memErrNotEnoughSpace ); } ErrEndCatch }
DmOpenRef init_gb2312_table(gb2312_table& table) { DmOpenRef libRef = NULL; LocalID dbId = DmFindDatabase(0, LibName); if (dbId == NULL) { libRef = NULL; ShowMsg("Please install gb2312table."); return NULL; } else { libRef = DmOpenDatabase(0, dbId, dmModeReadOnly); } set_var_to_ushort_record(gb2312_2uni_page21, 0); set_var_to_ushort_record(gb2312_2uni_page30, 1); set_var_to_ushort_record(gb2312_2charset, 2); set_var_to_summary_record(gb2312_uni2indx_page00, 3); set_var_to_summary_record(gb2312_uni2indx_page20, 4); set_var_to_summary_record(gb2312_uni2indx_page30, 5); set_var_to_summary_record(gb2312_uni2indx_page4e, 6); set_var_to_summary_record(gb2312_uni2indx_page9e, 7); set_var_to_summary_record(gb2312_uni2indx_pageff, 8); return libRef; }
NCSError NCSFileOpen(const NCSTChar *szFilename, int iFlags, NCS_FILE_HANDLE *phFile) { #ifdef WIN32 DWORD dwMode = GENERIC_READ; DWORD dwCreate = OPEN_EXISTING; if(iFlags & NCS_FILE_READ) dwMode = GENERIC_READ; if(iFlags & NCS_FILE_READ_WRITE) dwMode = GENERIC_READ|GENERIC_WRITE; if(iFlags & NCS_FILE_CREATE) dwCreate = CREATE_ALWAYS; if(iFlags & NCS_FILE_CREATE_UNIQUE) dwCreate = CREATE_NEW; if(iFlags & NCS_FILE_APPEND) dwCreate = OPEN_ALWAYS; *phFile = CreateFile(szFilename, // file name dwMode, // Generic read mode FILE_SHARE_READ, // Let anyone access and share the file NULL, // No security info (so can't be inherited by child process) dwCreate, // File must exist to be opened FILE_FLAG_RANDOM_ACCESS, // Going to be doing lots of random access NULL); // And no template file for attributes if( *phFile == INVALID_HANDLE_VALUE ) { return( NCS_FILE_OPEN_FAILED ); } else { return( NCS_SUCCESS ); } #elif defined MACINTOSH #if __POWERPC__ int i,length, result; Str255 pascalString; FSSpec fileSpec; // We have a C string, we need a PASCAL string. length = strlen(szFilename) + 1; for(i = 1; i < length; ++i) pascalString[i] = szFilename[i - 1]; pascalString[0] = strlen(szFilename); // Create a File Specification Record, then create a File result = FSMakeFSSpec(0,0,pascalString,&fileSpec); // return is meaningless, since the only possible error doesn't effect processing in this case switch(result) { case noErr: // we could dRes pFile here, but we are the only user result =FSpOpenDF(&fileSpec, fsRdPerm, (short *)phFile); if(result) return NCS_FILE_OPEN_FAILED; else return NCS_SUCCESS; break; default: return NCS_SUCCESS; break; } #else /* __POWERPC__ */ int i,length, result; Str255 pascalString; // We have a C string, we need a PASCAL string. length = strlen(szFilename) + 1; for(i = 1; i < length; ++i) pascalString[i] = szFilename[i - 1]; pascalString[0] = strlen(szFilename); result =FSOpen(pascalString, 0, (short *)phFile); if(result) return TRUE; else return FALSE; #endif /* __POWERPC__ */ #elif defined PALM NCS_FILE_HANDLE hFile; Err eErr; UInt32 nMode = 0; if(hFile = (NCS_FILE_HANDLE)NCSMalloc(sizeof(NCS_FILE_HANDLE_STRUCT), TRUE)) { hFile->dbID = DmFindDatabase(0, szFilename); if(hFile->dbID) { Char nameP[dmDBNameLength]; UInt16 attributes; UInt16 version; UInt32 crDate; UInt32 modDate; UInt32 bckUpDate; UInt32 modNum; LocalID appInfoID; LocalID sortInfoID; UInt32 type; UInt32 creator; DmDatabaseInfo(0, hFile->dbID, nameP, &attributes, &version, &crDate, &modDate, &bckUpDate, &modNum, &appInfoID, &sortInfoID, &type, &creator); if(creator == NCS_PALM_CREATOR_ID) { if(hFile->dbRef = DmOpenDatabase(0, hFile->dbID, dmModeReadOnly|dmModeShowSecret)) { UInt32 nRecords; UInt32 nTotalBytes; UInt32 nDataBytes; eErr = DmDatabaseSize(0, hFile->dbID, &nRecords, &nTotalBytes, &nDataBytes); if(eErr == errNone) { MemHandle hRecord; hFile->nRecords = nRecords; hFile->nDBSize = nDataBytes; #ifdef NOTDEF if(hRecord = DmGetRecord(hFile->dbRef, 0)) { MemPtr pData; if(pData = MemHandleLock(hRecord)) { hFile->nRecordSize = ((UINT16*)pData)[0]; MemHandleUnlock(hRecord); } DmReleaseRecord(hFile->dbRef, 0, false); } #endif *phFile = hFile; return(NCS_SUCCESS); } DmCloseDatabase(hFile->dbRef); return(NCSPalmGetNCSError(eErr)); } } } } else { return(NCS_COULDNT_ALLOC_MEMORY); } /* if(iFlags & NCS_FILE_READ) nMode = fileModeReadOnly|fileModeAnyTypeCreator; if(iFlags & NCS_FILE_READ_WRITE) nMode = fileModeUpdate|fileModeAnyTypeCreator; if(iFlags & NCS_FILE_CREATE) nMode = fileModeReadWrite|fileModeAnyTypeCreator; if(iFlags & NCS_FILE_CREATE_UNIQUE) nMode = fileModeReadWrite|fileModeDontOverwrite|fileModeAnyTypeCreator; if(iFlags & NCS_FILE_APPEND) nMode = fileModeAppend|fileModeAnyTypeCreator; *phFile = FileOpen(0, (char*)szFilename, 0, 0, nMode, &eErr); return(NCSPalmGetNCSError(eErr)); */ #elif defined(POSIX) int flags = O_RDONLY; if(iFlags & NCS_FILE_READ) flags = O_RDONLY; if(iFlags & NCS_FILE_READ_WRITE) flags = O_RDWR; if(iFlags & NCS_FILE_CREATE) flags |= O_CREAT; if(iFlags & NCS_FILE_CREATE_UNIQUE) flags |= O_CREAT|O_EXCL; if(iFlags & NCS_FILE_APPEND) flags |= O_APPEND; #if defined SOLARIS || (defined(HPUX) && !defined(__LP64__)) // Enable 64bit! flags |= O_LARGEFILE; #endif #ifdef HPUX *phFile = open64((const char*)CHAR_STRING(szFilename), (int)flags); #ifdef NOTDEF if (*phFile < 0) { fprintf(stderr, "Error opening file : %ld\n", errno); if (errno == EOVERFLOW) { fprintf(stderr, "The named file is a regular file and the size " "of the file cannot be represented correctly in an object of " "size off_t."); } } #endif #else *phFile = open((const char*)CHAR_STRING(szFilename), (int)flags, S_IRUSR|S_IWUSR); #endif if(*phFile != -1) { return(NCS_SUCCESS); } else { return(NCS_FILE_OPEN_FAILED); } #else /* SOLARIS||IRIX */ #error ERROR EcwFileCreate() routine is not defined for this platform #endif /* WIN32 */ }
Boolean StartScummVM() { Char **argvP; UInt8 lightspeed, argc = 0; UInt32 stackSize; Boolean toLauncher, direct, isARM; UInt8 engine; Char num[6]; UInt16 index = GamGetSelected(); argvP = ArgsInit(); direct = false; // start command line (exec name) ArgsAdd(&argvP[argc], "-", NULL, &argc); // no game selected if (index == dmMaxRecordIndex) { ListPtr listP; UInt16 whichButton; // init form FormPtr frmP = FrmInitForm(EngineForm); listP = (ListType *)FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, EngineListList)); itemsText = (Char **)MemPtrNew(ENGINE_COUNT * sizeof(Char *)); for (int i = 0; i < ENGINE_COUNT; i++) itemsText[i] = (Char *)engines[i].nameP; LstSetListChoices (listP, itemsText, ENGINE_COUNT); LstSetSelection(listP, 0); whichButton = FrmDoDialog(frmP); engine = LstGetSelection(listP); FrmDeleteForm(frmP); MemPtrFree(itemsText); itemsText = NULL; if (whichButton == EngineCancelButton) { if (bDirectMode) { // and force exit if nothing selected EventType event; event.eType = keyDownEvent; event.data.keyDown.chr = vchrLaunch; event.data.keyDown.modifiers = commandKeyMask; EvtAddUniqueEventToQueue(&event, 0, true); } // free args ArgsFree(argvP); return false; } // default values if (bDirectMode) gPrefs->card.volRefNum = parseCards(); // always use the first removable card available (?) gVars->filter = true; gVars->palmVolume = 50; gVars->fmQuality = FM_QUALITY_INI; direct = true; // somthing selected } else { Char pathP[256]; MemHandle recordH; GameInfoType *gameInfoP; recordH = DmQueryRecord(gameDB,index); gameInfoP = (GameInfoType *)MemHandleLock(recordH); engine = gameInfoP->engine; // build path StrCopy(pathP,"/Palm/Programs/ScummVM/Games/"); if (gameInfoP->pathP[0] == '/') StrCopy(pathP, gameInfoP->pathP); else if (!(gameInfoP->pathP[0] == '.' && StrLen(gameInfoP->pathP) == 1)) StrCat(pathP, gameInfoP->pathP); // path ArgsAdd(&argvP[argc], "-p", pathP, &argc); // language if (gameInfoP->language > 0) { const Char *lang = "zh\0cz\0gb\0en\0fr\0de\0hb\0it\0jp\0kr\0pl\0pt\0ru\0es\0se\0"; ArgsAdd(&argvP[argc], "-q", (lang + (gameInfoP->language - 1) * 3), &argc); } // fullscreen ? if (gameInfoP->fullscreen) ArgsAdd(&argvP[argc], "-f", NULL, &argc); // aspect-ratio ? ArgsAdd(&argvP[argc], (gameInfoP->aspectRatio ? "--aspect-ratio" : "--no-aspect-ratio"), NULL, &argc); // gfx mode gVars->filter = gameInfoP->filter; switch (gameInfoP->renderMode) { case 1: ArgsAdd(&argvP[argc], "--render-mode=", "amiga", &argc); break; case 2: ArgsAdd(&argvP[argc], "--render-mode=", "cga", &argc); break; case 3: ArgsAdd(&argvP[argc], "--render-mode=", "ega", &argc); break; case 4: ArgsAdd(&argvP[argc], "--render-mode=", "hercAmber", &argc); break; case 5: ArgsAdd(&argvP[argc], "--render-mode=", "hercGreen", &argc); break; } switch (gameInfoP->gfxMode) { case 1: ArgsAdd(&argvP[argc], "-g", "wide", &argc); break; default: ArgsAdd(&argvP[argc], "-g", "1x", &argc); break; } // load state if (gameInfoP->autoLoad) { StrIToA(num, gameInfoP->loadSlot); ArgsAdd(&argvP[argc], "-x", num, &argc); } // boot script parameter if (gameInfoP->bootParam) { StrIToA(num, gameInfoP->bootValue); ArgsAdd(&argvP[argc], "-b", num, &argc); } // not a PC version if (gameInfoP->setPlatform) { static const char *platform[] = { "3do", "acorn", "amiga", "atari", "c64", "pc", "fmtowns", "linux", "mac", "nes", "segacd", "windows" }; ArgsAdd(&argvP[argc], "--platform=", platform[gameInfoP->platform], &argc); } // subtitles if (gameInfoP->subtitles) ArgsAdd(&argvP[argc], "-n", NULL, &argc); // multi midi ? if (gameInfoP->musicInfo.sound.multiMidi) ArgsAdd(&argvP[argc], "--multi-midi", NULL, &argc); if (engine == ENGINE_SCUMM) { // music tempo StrIToA(num, gameInfoP->musicInfo.sound.tempo); ArgsAdd(&argvP[argc], "--tempo=", num, &argc); } // talk speed if (gameInfoP->talkSpeed) { StrIToA(num, gameInfoP->talkValue); ArgsAdd(&argvP[argc], "--talkspeed=", num, &argc); } // music driver if (gameInfoP->musicInfo.sound.music) { static char *drv[] = { "auto", "null", "adlib", "towns", "pcjr", "native", "pcspk" }; if (StrCompare(drv[gameInfoP->musicInfo.sound.drvMusic], "native") == 0) { if (OPTIONS_TST(kOptDeviceZodiac)) ArgsAdd(&argvP[argc], "-e", "zodiac", &argc); // Tapwave Zodiac else if (OPTIONS_TST(kOptSonyPa1LibAPI)) ArgsAdd(&argvP[argc], "-e", "ypa1", &argc); // Pa1Lib devices else ArgsAdd(&argvP[argc], "-e", "auto", &argc); // no driver, switch to auto } else { ArgsAdd(&argvP[argc], "-e", drv[gameInfoP->musicInfo.sound.drvMusic], &argc); } // output rate UInt32 rates[] = {4000, 8000, 11025, 22050, 44100}; StrIToA(num, rates[gameInfoP->musicInfo.sound.rate]); ArgsAdd(&argvP[argc], "--output-rate=", num, &argc); // FM quality gVars->fmQuality = gameInfoP->fmQuality; } else { ArgsAdd(&argvP[argc], "-e", "null", &argc); } // volume control StrIToA(num, gameInfoP->musicInfo.volume.sfx); ArgsAdd(&argvP[argc], "-s", num, &argc); StrIToA(num, gameInfoP->musicInfo.volume.music); ArgsAdd(&argvP[argc], "-m", num, &argc); StrIToA(num, gameInfoP->musicInfo.volume.speech); ArgsAdd(&argvP[argc], "-r", num, &argc); // game name ArgsAdd(&argvP[argc], gameInfoP->gameP, NULL, &argc); // others globals data gVars->CD.enable = gameInfoP->musicInfo.sound.CD; gVars->CD.driver = gameInfoP->musicInfo.sound.drvCD; gVars->CD.format = gameInfoP->musicInfo.sound.frtCD; gVars->CD.volume = gameInfoP->musicInfo.volume.audiocd; gVars->CD.defaultTrackLength = gameInfoP->musicInfo.sound.defaultTrackLength; gVars->CD.firstTrack = gameInfoP->musicInfo.sound.firstTrack; gVars->palmVolume = gameInfoP->musicInfo.sound.music ? gameInfoP->musicInfo.volume.palm : 0; MemHandleUnlock(recordH); } // end no game / game selected // common command line options // debug level if (gPrefs->debug) { StrIToA(num, gPrefs->debugLevel); ArgsAdd(&argvP[argc], "-d", num, &argc); } if (engine == ENGINE_QUEEN || engine == ENGINE_SKY) { // alternative intro ? if (gPrefs->altIntro) ArgsAdd(&argvP[argc], "--alt-intro", NULL, &argc); } if (engine == ENGINE_SCUMM) { // demo mode ? if (gPrefs->demoMode) ArgsAdd(&argvP[argc], "--demo-mode", NULL, &argc); } // copy protection ? if (gPrefs->copyProtection) ArgsAdd(&argvP[argc], "--copy-protection", NULL, &argc); // exceed max args ? if (argc > MAX_ARG) FrmCustomAlert(FrmErrorAlert, "Too many parameters.",0,0); // set some common options stackSize = (gPrefs->setStack ? STACK_LARGER : STACK_DEFAULT); lightspeed= (gPrefs->lightspeed.enable ? gPrefs->lightspeed.mode : 255); toLauncher= (gPrefs->exitLauncher); // gVars values // (gVars->HRrefNum defined in checkHRmode on CliƩ) gVars->VFS.volRefNum = gPrefs->card.volRefNum; gVars->vibrator = gPrefs->vibrator; gVars->stdPalette = gPrefs->stdPalette; gVars->VFS.cacheSize = (gPrefs->card.useCache ? gPrefs->card.cacheSize : 0); gVars->indicator.showLED= gPrefs->card.showLED; gVars->stylusClick = gPrefs->stylusClick; gVars->autoSave = (gPrefs->autoSave ? gPrefs->autoSavePeriod : -1); gVars->advancedMode = gPrefs->advancedMode; gVars->arrowKeys = gPrefs->arrowKeys; // user params HWR_RSTALL(); if (gPrefs->goLCD) HWR_SET(INIT_GOLCD); else OPTIONS_RST(kOptGoLcdAPI); if (!gPrefs->autoOff) HWR_SET(INIT_AUTOOFF); if (gVars->vibrator) HWR_SET(INIT_VIBRATOR); /* ???? if ( musicDriver == 1 || musicDriver == 3 || musicDriver == 4 || musicDriver == sysInvalidRefNum) { HWR_SET(INIT_PA1LIB); } */ if (ModImport(gVars->VFS.volRefNum, engine, &isARM) != errNone) { if (bDirectMode) { // and force exit if nothing selected EventType event; event.eType = keyDownEvent; event.data.keyDown.chr = vchrLaunch; event.data.keyDown.modifiers = commandKeyMask; EvtAddUniqueEventToQueue(&event, 0, true); } ArgsFree(argvP); return false; } // reset mode if screen rotation occured (DIA only) if (!direct && OPTIONS_TST(kOptCollapsible)) { UInt8 mode = PalmScreenSize(0,0, &(gVars->screenFullWidth), &(gVars->screenFullHeight)); OPTIONS_RST(kOptModeLandscape); OPTIONS_SET((mode == PALM_LANDSCAPE) ? kOptModeLandscape : kOptNone); } // free and save globals pref memory GamCloseDatabase(false); FrmCloseAllForms(); SavePrefs(); { UInt16 cardNo; UInt32 dbID; LaunchParamType *cmdPBP = (LaunchParamType *)MemPtrNew(sizeof(LaunchParamType)); MemPtrSetOwner(cmdPBP, 0); MemPtrSetOwner(gVars, 0); ArgsSetOwner(argvP, 0); cardNo = 0; dbID = DmFindDatabase(0, "ScummVM-Engine"); if (isARM) FtrSet(appFileCreator, ftrStack , (stackSize * 4)); else ModSetStack(stackSize, cardNo, dbID); cmdPBP->args.argc = argc; cmdPBP->args.argv = argvP; cmdPBP->gVars = gVars; cmdPBP->lightspeed = lightspeed; cmdPBP->exitLauncher = toLauncher; SysUIAppSwitch(cardNo, dbID, sysAppLaunchCmdNormalLaunch, cmdPBP); bLaunched = true; } return false; }
/*********************************************************************** * * FUNCTION: ReceiveDatabase * * DESCRIPTION: Receives data in the input field using the Exg API * * RETURNED: error code or zero for no error. * ***************************************************************************/ static Err ReceiveDatabase (ExgSocketPtr exgSocketP) { Err err; LocalID dbID; UInt16 cardNo = 0; Boolean *needResetP = NULL; Boolean keepDates = false; char outName [32]; char appName [32]; int bytesSent = -1; LocalID app_dbID; // Create exgSocket structure MemSet(exgSocketP, sizeof(exgSocketP->length), 0); // Start and exchange put operation err = ExgAccept(exgSocketP); if (!err){ // Receive the DB name we fix it at 32 bytes bytesSent = ExgReceive(exgSocketP, outName, 32, &err); if(bytesSent != 32){ return err; } // Receive the DB name we fix it at 32 bytes bytesSent = ExgReceive(exgSocketP, appName, 32, &err); if(bytesSent != 32){ return err; } // Receive the database err = ExgDBRead(ReadDBData, DeleteExistingDB, exgSocketP, &dbID, cardNo, needResetP, keepDates); /* exgSocketP->goToCreator = 'CCPr'; exgSocketP->noGoTo = 0; */ // Disconnect Exg and pass error err = ExgDisconnect(exgSocketP, err); // Try to rename the database to the outName if(StrLen(outName) > 0){ /* UInt cardNo, LocalID dbID, CharPtr nameP, UIntPtr attributesP, UIntPtr versionP, ULongPtr crDateP, ULongPtr modDateP, ULongPtr bckUpDateP, ULongPtr modNumP, LocalID* appInfoIDP, LocalID* sortInfoIDP, ULongPtr typeP, ULongPtr creatorP); */ DmSetDatabaseInfo(cardNo, dbID, outName, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); } if (!err && StrLen(appName) > 0) { // Find the database app_dbID = DmFindDatabase(0, appName); if(app_dbID != 0) { SysUIAppSwitch(0, app_dbID, sysAppLaunchCmdNormalLaunch, NULL); } } } /****************************************************************************/ return err; }
/*********************************************************************** * * FUNCTION: SendDatabase * * DESCRIPTION: Sends data in the input field using the Exg API * * RETURNED: error code or zero for no error. * ***************************************************************************/ static Err SendDatabase (BeamParamsPtr cmdPBP) { Err err; ExgSocketType exgSocket; int bytesSent = 0; LocalID inputDbID = -1; inputDbID = DmFindDatabase(0, cmdPBP->inName); if(inputDbID == 0){ return(err); } // Create exgSocket structure MemSet(&exgSocket, sizeof(ExgSocketType), 0); exgSocket.description = cmdPBP -> description; // If the there isn't an appName and outName // then send the database directly. if(StrLen(cmdPBP->appName) == 0 && StrLen(cmdPBP->outName) == 0){ exgSocket.name = "dummy.pdb"; // Start and exchange put operation err = ExgPut(&exgSocket); if (!err){ // This function converts a palm database into its external (public) // format. The first parameter is a callback that will be passed parts of // the database to send or write. err = ExgDBWrite(WriteDBData, &exgSocket, NULL, inputDbID, cmdPBP -> cardNo); // Disconnect Exg and pass error err = ExgDisconnect(&exgSocket, err); } else { FrmAlert (2000); } return err; } // Otherwise use our wrapper file name // This ensures that CCBeam will be launched again // by the recieving palm exgSocket.name = CCBeamDBFilename; // Start and exchange put operation err = ExgPut(&exgSocket); if (!err){ // Send the out name we fix it at 32 bytes bytesSent = ExgSend(&exgSocket, cmdPBP->outName, 32, &err); if(bytesSent < 32){ return err; } // Send the application name we fix it at 32 bytes bytesSent = ExgSend(&exgSocket, cmdPBP->appName, 32, &err); if(bytesSent < 32){ return err; } // This function converts a palm database into its external (public) // format. The first parameter is a callback that will be passed parts of // the database to send or write. err = ExgDBWrite(WriteDBData, &exgSocket, NULL, inputDbID, cmdPBP -> cardNo); // Disconnect Exg and pass error err = ExgDisconnect(&exgSocket, err); } else { FrmAlert (2000); } return err; }