diff --git a/LaunchAPPL/Server/LaunchAPPLServer.cc b/LaunchAPPL/Server/LaunchAPPLServer.cc index 565924d1cb..d2265bd1b3 100644 --- a/LaunchAPPL/Server/LaunchAPPLServer.cc +++ b/LaunchAPPL/Server/LaunchAPPLServer.cc @@ -54,7 +54,14 @@ enum kItemQuit = 1 }; -long gBaud = 19200; +struct Prefs +{ + long baud = 19200; + bool inSubLaunch = false; +}; + +Prefs gPrefs; +bool gQuitting = false; void SetBaud(long baud); @@ -131,7 +138,7 @@ void UpdateMenus() long baud; GetMenuItemText(m, i, str); StringToNum(str, &baud); - CheckMenuItem(m, i, baud == gBaud); + CheckMenuItem(m, i, baud == gPrefs.baud); } } @@ -158,7 +165,7 @@ void DoMenuCommand(long menuCommand) switch(menuItem) { case kItemQuit: - ExitToShell(); + gQuitting = true; break; } } @@ -174,8 +181,8 @@ void DoMenuCommand(long menuCommand) else if(menuID == kMenuSpeed) { GetMenuItemText(GetMenu(menuID), menuItem, str); - StringToNum(str, &gBaud); - SetBaud(gBaud); + StringToNum(str, &gPrefs.baud); + SetBaud(gPrefs.baud); } HiliteMenu(0); } @@ -343,7 +350,32 @@ void SetBaud(long baud) gSerialStream->setBaud(baud); } +void StartResponding(LaunchServer& server, ReliableStream& rStream) +{ + server.state = LaunchServer::State::respond; + uint32_t zero = 0; + rStream.write(&zero, 4); + OpenDF("\pout", 0, &outRefNum); + GetEOF(outRefNum, &outSize); + outSizeRemaining = outSize; + SetStatus(AppStatus::uploading, 0, outSize); + + rStream.write(&outSize, 4); + rStream.flushWrite(); +} + +void WritePrefs() +{ + short refNum; + Create("\pLaunchAPPLServer Preferences", 0, '????', 'LAPR'); + if(OpenDF("\pLaunchAPPLServer Preferences", 0, &refNum) == noErr) + { + long count = sizeof(gPrefs); + FSWrite(refNum, &count, &gPrefs); + FSClose(refNum); + } +} int main() { @@ -364,7 +396,18 @@ int main() statusWindow = GetNewWindow(129, NULL, (WindowPtr) -1); SetStatus(AppStatus::ready); - MacSerialStream stream; + + { + short refNum; + if(OpenDF("\pLaunchAPPLServer Preferences", 0, &refNum) == noErr) + { + long count = sizeof(gPrefs); + FSRead(refNum, &count, &gPrefs); + FSClose(refNum); + } + } + + MacSerialStream stream(gPrefs.baud); gSerialStream = &stream; //#define SIMULATE_ERRORS @@ -379,7 +422,13 @@ int main() std::unique_ptr appLauncher = CreateAppLauncher(); - for(;;) + if(gPrefs.inSubLaunch) + { + gPrefs.inSubLaunch = false; + StartResponding(server, rStream); + } + + while(!gQuitting) { EventRecord e; WindowRef win; @@ -439,7 +488,12 @@ int main() if(server.state == LaunchServer::State::launch) { gSerialStream->close(); + gPrefs.inSubLaunch = true; + WritePrefs(); bool launched = appLauncher->Launch("\pRetro68App"); + gPrefs.inSubLaunch = false; + WritePrefs(); + if(launched) { server.state = LaunchServer::State::wait; @@ -458,17 +512,7 @@ int main() if(!appLauncher->IsRunning("\pRetro68App")) { gSerialStream->open(); - server.state = LaunchServer::State::respond; - uint32_t zero = 0; - rStream.write(&zero, 4); - - OpenDF("\pout", 0, &outRefNum); - GetEOF(outRefNum, &outSize); - outSizeRemaining = outSize; - SetStatus(AppStatus::uploading, 0, outSize); - - rStream.write(&outSize, 4); - rStream.flushWrite(); + StartResponding(server, rStream); } } else if(server.state == LaunchServer::State::respond) @@ -494,9 +538,8 @@ int main() rStream.reset(0); } } - - //if(someoneExited) - // SetStatus(AppStatus::running, 50, 100); } + + WritePrefs(); return 0; } diff --git a/LaunchAPPL/Server/MacSerialStream.cc b/LaunchAPPL/Server/MacSerialStream.cc index 413c8be203..2fc760437c 100644 --- a/LaunchAPPL/Server/MacSerialStream.cc +++ b/LaunchAPPL/Server/MacSerialStream.cc @@ -5,9 +5,9 @@ #include -MacSerialStream::MacSerialStream() +MacSerialStream::MacSerialStream(int baud) + : curBaud(baud) { - curBaud = 19200; open(); } diff --git a/LaunchAPPL/Server/MacSerialStream.h b/LaunchAPPL/Server/MacSerialStream.h index c1fa76c0c9..92d62069d5 100644 --- a/LaunchAPPL/Server/MacSerialStream.h +++ b/LaunchAPPL/Server/MacSerialStream.h @@ -17,7 +17,7 @@ public: void idle(); - MacSerialStream(); + MacSerialStream(int baud = 19200); ~MacSerialStream(); void close();