mirror of
https://github.com/autc04/Retro68.git
synced 2025-02-20 02:29:11 +00:00
LaunchAPPLServer: factor out StatusDisplay
This commit is contained in:
parent
d5945a90ba
commit
28fca0d630
@ -10,7 +10,10 @@ add_application(LaunchAPPLServer
|
|||||||
MacSerialStream.cc
|
MacSerialStream.cc
|
||||||
AppLauncher.h
|
AppLauncher.h
|
||||||
AppLauncher.cc
|
AppLauncher.cc
|
||||||
ToolLauncher.cc)
|
ToolLauncher.cc
|
||||||
|
StatusDisplay.h
|
||||||
|
StatusDisplay.cc
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(LaunchAPPLServer LaunchAPPLCommon)
|
target_link_libraries(LaunchAPPLServer LaunchAPPLCommon)
|
||||||
set_target_properties(LaunchAPPLServer PROPERTIES
|
set_target_properties(LaunchAPPLServer PROPERTIES
|
||||||
|
@ -33,9 +33,10 @@
|
|||||||
|
|
||||||
#include "MacSerialStream.h"
|
#include "MacSerialStream.h"
|
||||||
#include "AppLauncher.h"
|
#include "AppLauncher.h"
|
||||||
|
#include "StatusDisplay.h"
|
||||||
|
|
||||||
#include <ReliableStream.h>
|
#include <ReliableStream.h>
|
||||||
#include "ServerProtocol.h"
|
#include <ServerProtocol.h>
|
||||||
#include <Processes.h>
|
#include <Processes.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -190,64 +191,8 @@ void DoMenuCommand(long menuCommand)
|
|||||||
HiliteMenu(0);
|
HiliteMenu(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<StatusDisplay> statusDisplay;
|
||||||
|
|
||||||
WindowPtr statusWindow;
|
|
||||||
Str255 statusString = "\p";
|
|
||||||
int progressDone, progressTotal = 0;
|
|
||||||
|
|
||||||
void DoUpdate(WindowRef w)
|
|
||||||
{
|
|
||||||
if(w != statusWindow)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#if TARGET_API_MAC_CARBON
|
|
||||||
SetPortWindowPort(w);
|
|
||||||
#else
|
|
||||||
SetPort(w);
|
|
||||||
#endif
|
|
||||||
BeginUpdate(w);
|
|
||||||
EraseRect(&w->portRect);
|
|
||||||
|
|
||||||
MoveTo(10,20);
|
|
||||||
DrawString(statusString);
|
|
||||||
|
|
||||||
Rect r;
|
|
||||||
|
|
||||||
if(progressTotal)
|
|
||||||
{
|
|
||||||
SetRect(&r, 10, 40, w->portRect.right-10, 60);
|
|
||||||
FrameRect(&r);
|
|
||||||
SetRect(&r, 10, 40, 10 + (w->portRect.right-20) * progressDone / progressTotal, 60);
|
|
||||||
PaintRect(&r);
|
|
||||||
}
|
|
||||||
|
|
||||||
Str255 str;
|
|
||||||
NumToString(FreeMem(), str);
|
|
||||||
MoveTo(10,80);
|
|
||||||
DrawString(str); DrawString("\p / ");
|
|
||||||
NumToString(ApplicationZone()->bkLim - (Ptr)ApplicationZone(), str);
|
|
||||||
DrawString(str); DrawString("\p bytes free");
|
|
||||||
|
|
||||||
EndUpdate(w);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum class AppStatus
|
|
||||||
{
|
|
||||||
ready = 1,
|
|
||||||
downloading = 2,
|
|
||||||
running = 3,
|
|
||||||
uploading = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
void SetStatus(AppStatus stat, int done = 0, int total = 0)
|
|
||||||
{
|
|
||||||
GetIndString(statusString,128,(short)stat);
|
|
||||||
|
|
||||||
progressTotal = total;
|
|
||||||
progressDone = done;
|
|
||||||
SetPort(statusWindow);
|
|
||||||
InvalRect(&statusWindow->portRect);
|
|
||||||
}
|
|
||||||
|
|
||||||
class LaunchServer : public StreamListener
|
class LaunchServer : public StreamListener
|
||||||
{
|
{
|
||||||
@ -279,7 +224,7 @@ public:
|
|||||||
|
|
||||||
void onReset()
|
void onReset()
|
||||||
{
|
{
|
||||||
SetStatus(AppStatus::ready, 0, 0);
|
statusDisplay->SetStatus(AppStatus::ready, 0, 0);
|
||||||
state = State::command;
|
state = State::command;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +251,7 @@ public:
|
|||||||
dataSize = *(const uint32_t*)(p+8);
|
dataSize = *(const uint32_t*)(p+8);
|
||||||
rsrcSize = *(const uint32_t*)(p+12);
|
rsrcSize = *(const uint32_t*)(p+12);
|
||||||
|
|
||||||
SetStatus(AppStatus::downloading, 0, dataSize + rsrcSize);
|
statusDisplay->SetStatus(AppStatus::downloading, 0, dataSize + rsrcSize);
|
||||||
|
|
||||||
FSDelete("\pRetro68App", 0);
|
FSDelete("\pRetro68App", 0);
|
||||||
Create("\pRetro68App", 0, creator, type);
|
Create("\pRetro68App", 0, creator, type);
|
||||||
@ -326,7 +271,7 @@ public:
|
|||||||
FSWrite(refNum, &count, p);
|
FSWrite(refNum, &count, p);
|
||||||
remainingSize -= count;
|
remainingSize -= count;
|
||||||
|
|
||||||
SetStatus(AppStatus::downloading, dataSize - remainingSize, dataSize + rsrcSize);
|
statusDisplay->SetStatus(AppStatus::downloading, dataSize - remainingSize, dataSize + rsrcSize);
|
||||||
|
|
||||||
if(remainingSize)
|
if(remainingSize)
|
||||||
return count;
|
return count;
|
||||||
@ -347,14 +292,14 @@ public:
|
|||||||
FSWrite(refNum, &count, p);
|
FSWrite(refNum, &count, p);
|
||||||
remainingSize -= count;
|
remainingSize -= count;
|
||||||
|
|
||||||
SetStatus(AppStatus::downloading, dataSize + rsrcSize - remainingSize, dataSize + rsrcSize);
|
statusDisplay->SetStatus(AppStatus::downloading, dataSize + rsrcSize - remainingSize, dataSize + rsrcSize);
|
||||||
|
|
||||||
if(remainingSize)
|
if(remainingSize)
|
||||||
return count;
|
return count;
|
||||||
|
|
||||||
FSClose(refNum);
|
FSClose(refNum);
|
||||||
|
|
||||||
SetStatus(AppStatus::running);
|
statusDisplay->SetStatus(AppStatus::running);
|
||||||
|
|
||||||
state = State::launch;
|
state = State::launch;
|
||||||
return count;
|
return count;
|
||||||
@ -382,7 +327,7 @@ void StartResponding(LaunchServer& server, ReliableStream& rStream)
|
|||||||
OpenDF("\pout", 0, &outRefNum);
|
OpenDF("\pout", 0, &outRefNum);
|
||||||
GetEOF(outRefNum, &outSize);
|
GetEOF(outRefNum, &outSize);
|
||||||
outSizeRemaining = outSize;
|
outSizeRemaining = outSize;
|
||||||
SetStatus(AppStatus::uploading, 0, outSize);
|
statusDisplay->SetStatus(AppStatus::uploading, 0, outSize);
|
||||||
|
|
||||||
rStream.write(&outSize, 4);
|
rStream.write(&outSize, 4);
|
||||||
rStream.flushWrite();
|
rStream.flushWrite();
|
||||||
@ -481,8 +426,7 @@ int main()
|
|||||||
AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(&aeQuit), 0, false);
|
AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(&aeQuit), 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
statusWindow = GetNewWindow(129, NULL, (WindowPtr) -1);
|
statusDisplay = std::make_unique<StatusDisplay>();
|
||||||
SetStatus(AppStatus::ready);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
short refNum;
|
short refNum;
|
||||||
@ -569,7 +513,8 @@ int main()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case updateEvt:
|
case updateEvt:
|
||||||
DoUpdate((WindowRef)e.message);
|
if(statusDisplay && (WindowRef)e.message == statusDisplay->GetWindow())
|
||||||
|
statusDisplay->Update();
|
||||||
break;
|
break;
|
||||||
case kHighLevelEvent:
|
case kHighLevelEvent:
|
||||||
if(hasAppleEvents)
|
if(hasAppleEvents)
|
||||||
@ -582,6 +527,7 @@ int main()
|
|||||||
|
|
||||||
if(server.state != LaunchServer::State::wait)
|
if(server.state != LaunchServer::State::wait)
|
||||||
stream.idle();
|
stream.idle();
|
||||||
|
statusDisplay->Idle();
|
||||||
|
|
||||||
if(server.state == LaunchServer::State::launch)
|
if(server.state == LaunchServer::State::launch)
|
||||||
{
|
{
|
||||||
@ -621,13 +567,13 @@ int main()
|
|||||||
server.state = LaunchServer::State::wait;
|
server.state = LaunchServer::State::wait;
|
||||||
nullEventCounter = 0;
|
nullEventCounter = 0;
|
||||||
|
|
||||||
SetStatus(AppStatus::running, 0, 0);
|
statusDisplay->SetStatus(AppStatus::running, 0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
server.state = LaunchServer::State::command;
|
server.state = LaunchServer::State::command;
|
||||||
gSerialStream->open();
|
gSerialStream->open();
|
||||||
SetStatus(AppStatus::ready, 0, 0);
|
statusDisplay->SetStatus(AppStatus::ready, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(server.state == LaunchServer::State::wait && nullEventCounter > 3)
|
else if(server.state == LaunchServer::State::wait && nullEventCounter > 3)
|
||||||
@ -651,7 +597,7 @@ int main()
|
|||||||
rStream.write(buf, count);
|
rStream.write(buf, count);
|
||||||
outSizeRemaining -= count;
|
outSizeRemaining -= count;
|
||||||
}
|
}
|
||||||
SetStatus(AppStatus::uploading, outSize - outSizeRemaining, outSize);
|
statusDisplay->SetStatus(AppStatus::uploading, outSize - outSizeRemaining, outSize);
|
||||||
|
|
||||||
if(outSizeRemaining == 0)
|
if(outSizeRemaining == 0)
|
||||||
{
|
{
|
||||||
@ -660,7 +606,7 @@ int main()
|
|||||||
if(outSizeRemaining == 0 && rStream.allDataArrived())
|
if(outSizeRemaining == 0 && rStream.allDataArrived())
|
||||||
{
|
{
|
||||||
server.state = LaunchServer::State::command;
|
server.state = LaunchServer::State::command;
|
||||||
SetStatus(AppStatus::ready, 0, 0);
|
statusDisplay->SetStatus(AppStatus::ready, 0, 0);
|
||||||
rStream.reset(0);
|
rStream.reset(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
107
LaunchAPPL/Server/StatusDisplay.cc
Normal file
107
LaunchAPPL/Server/StatusDisplay.cc
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#include "StatusDisplay.h"
|
||||||
|
#include <Quickdraw.h>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
StatusDisplay::StatusDisplay()
|
||||||
|
{
|
||||||
|
statusWindow = GetNewWindow(129, NULL, (WindowPtr) -1);
|
||||||
|
|
||||||
|
Rect bounds = statusWindow->portRect;
|
||||||
|
|
||||||
|
SetRect(&statusRect, 10, 0, bounds.right-10, 30);
|
||||||
|
SetRect(&progressRect, 10, 30, bounds.right-10, 46);
|
||||||
|
SetRect(&memRect, 10, 70, bounds.right-10, 100);
|
||||||
|
RgnHandle tmp = NewRgn();
|
||||||
|
background = NewRgn();
|
||||||
|
RectRgn(background, &bounds);
|
||||||
|
RectRgn(tmp, &progressRect);
|
||||||
|
DiffRgn(background, tmp, background);
|
||||||
|
DisposeRgn(tmp);
|
||||||
|
|
||||||
|
SetStatus(AppStatus::ready);
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusDisplay::~StatusDisplay()
|
||||||
|
{
|
||||||
|
DisposeWindow(statusWindow);
|
||||||
|
DisposeRgn(background);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusDisplay::Update()
|
||||||
|
{
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
SetPortWindowPort(statusWindow);
|
||||||
|
#else
|
||||||
|
SetPort(statusWindow);
|
||||||
|
#endif
|
||||||
|
BeginUpdate(statusWindow);
|
||||||
|
EraseRgn(background);
|
||||||
|
|
||||||
|
MoveTo(statusRect.left,statusRect.bottom-10);
|
||||||
|
DrawString(statusString);
|
||||||
|
|
||||||
|
Rect r;
|
||||||
|
|
||||||
|
if(progressTotal)
|
||||||
|
{
|
||||||
|
FrameRect(&progressRect);
|
||||||
|
InsetRect(&r, 1,1);
|
||||||
|
SetRect(&r, progressRect.left+1, progressRect.top+1,
|
||||||
|
progressRect.left+1 + (progressRect.right-progressRect.left-2) * progressDone / progressTotal,
|
||||||
|
progressRect.bottom-1);
|
||||||
|
FillRect(&r, &qd.dkGray);
|
||||||
|
r.left = r.right;
|
||||||
|
r.right = progressRect.right - 1;
|
||||||
|
FillRect(&r, &qd.ltGray);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
EraseRect(&progressRect);
|
||||||
|
|
||||||
|
Str255 str;
|
||||||
|
NumToString(freeMem, str);
|
||||||
|
MoveTo(memRect.left,memRect.bottom-10);
|
||||||
|
DrawString(str); DrawString("\p / ");
|
||||||
|
NumToString(ApplicationZone()->bkLim - (Ptr)ApplicationZone(), str);
|
||||||
|
DrawString(str); DrawString("\p bytes free");
|
||||||
|
|
||||||
|
EndUpdate(statusWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusDisplay::Idle()
|
||||||
|
{
|
||||||
|
long newFreeMem = FreeMem();
|
||||||
|
if(newFreeMem != freeMem)
|
||||||
|
{
|
||||||
|
freeMem = newFreeMem;
|
||||||
|
SetPort(statusWindow);
|
||||||
|
InvalRect(&memRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusDisplay::SetStatus(AppStatus stat)
|
||||||
|
{
|
||||||
|
if(stat != status)
|
||||||
|
{
|
||||||
|
status = stat;
|
||||||
|
GetIndString(statusString,128,(short)stat);
|
||||||
|
SetPort(statusWindow);
|
||||||
|
InvalRect(&statusRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusDisplay::SetProgress(int done, int total)
|
||||||
|
{
|
||||||
|
if(done != progressDone || total != progressTotal)
|
||||||
|
{
|
||||||
|
progressTotal = total;
|
||||||
|
progressDone = done;
|
||||||
|
SetPort(statusWindow);
|
||||||
|
InvalRect(&progressRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StatusDisplay::SetStatus(AppStatus stat, int done, int total)
|
||||||
|
{
|
||||||
|
SetStatus(stat);
|
||||||
|
SetProgress(done, total);
|
||||||
|
}
|
38
LaunchAPPL/Server/StatusDisplay.h
Normal file
38
LaunchAPPL/Server/StatusDisplay.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#include <MacTypes.h>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <TextUtils.h>
|
||||||
|
|
||||||
|
enum class AppStatus
|
||||||
|
{
|
||||||
|
empty = 0,
|
||||||
|
ready = 1,
|
||||||
|
downloading = 2,
|
||||||
|
running = 3,
|
||||||
|
uploading = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
class StatusDisplay
|
||||||
|
{
|
||||||
|
WindowPtr statusWindow;
|
||||||
|
Str255 statusString = "\p";
|
||||||
|
AppStatus status = AppStatus::empty;
|
||||||
|
int progressDone, progressTotal = 0;
|
||||||
|
long freeMem;
|
||||||
|
|
||||||
|
RgnHandle background;
|
||||||
|
Rect statusRect;
|
||||||
|
Rect progressRect;
|
||||||
|
Rect memRect;
|
||||||
|
public:
|
||||||
|
StatusDisplay();
|
||||||
|
~StatusDisplay();
|
||||||
|
|
||||||
|
WindowPtr GetWindow() { return statusWindow; }
|
||||||
|
void Update();
|
||||||
|
|
||||||
|
void Idle();
|
||||||
|
|
||||||
|
void SetStatus(AppStatus s);
|
||||||
|
void SetProgress(int done = 0, int total = 0);
|
||||||
|
void SetStatus(AppStatus stat, int done, int total);
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user