LaunchAPPL: shared file transport
This commit is contained in:
parent
303428e10a
commit
d16f1aae6b
|
@ -3,9 +3,11 @@ find_package(Boost COMPONENTS filesystem program_options)
|
||||||
set(LAUNCHMETHODS
|
set(LAUNCHMETHODS
|
||||||
Executor.h Executor.cc
|
Executor.h Executor.cc
|
||||||
MiniVMac.h MiniVMac.cc
|
MiniVMac.h MiniVMac.cc
|
||||||
SSH.h SSH.cc
|
SSH.h SSH.cc
|
||||||
|
StreamBasedLauncher.h StreamBasedLauncher.cc
|
||||||
Serial.h Serial.cc
|
Serial.h Serial.cc
|
||||||
TCP.h TCP.cc
|
TCP.h TCP.cc
|
||||||
|
SharedFile.h SharedFile.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "SSH.h"
|
#include "SSH.h"
|
||||||
#include "Serial.h"
|
#include "Serial.h"
|
||||||
#include "TCP.h"
|
#include "TCP.h"
|
||||||
|
#include "SharedFile.h"
|
||||||
|
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
@ -46,7 +47,8 @@ static void RegisterLaunchMethods()
|
||||||
new Executor(), new MiniVMac(),
|
new Executor(), new MiniVMac(),
|
||||||
new SSH(),
|
new SSH(),
|
||||||
new Serial(),
|
new Serial(),
|
||||||
new TCP()
|
new TCP(),
|
||||||
|
new SharedFile()
|
||||||
// #### Add new `LaunchMethod`s here.
|
// #### Add new `LaunchMethod`s here.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "Serial.h"
|
#include "Serial.h"
|
||||||
#include "Launcher.h"
|
#include "StreamBasedLauncher.h"
|
||||||
#include "Utilities.h"
|
#include "Utilities.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "ReliableStream.h"
|
#include "ReliableStream.h"
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
using namespace std::literals::chrono_literals;
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
class SerialStream : public Stream
|
class SerialStream : public WaitableStream
|
||||||
{
|
{
|
||||||
static const long kReadBufferSize = 4096;
|
static const long kReadBufferSize = 4096;
|
||||||
uint8_t readBuffer[kReadBufferSize];
|
uint8_t readBuffer[kReadBufferSize];
|
||||||
|
@ -25,28 +25,18 @@ public:
|
||||||
|
|
||||||
virtual void write(const void* p, size_t n) override;
|
virtual void write(const void* p, size_t n) override;
|
||||||
|
|
||||||
void wait();
|
virtual void wait() override;
|
||||||
|
|
||||||
SerialStream(po::variables_map &options);
|
SerialStream(po::variables_map &options);
|
||||||
~SerialStream();
|
~SerialStream();
|
||||||
};
|
};
|
||||||
|
|
||||||
class SerialLauncher : public Launcher
|
class SerialLauncher : public StreamBasedLauncher
|
||||||
{
|
{
|
||||||
SerialStream stream;
|
SerialStream stream;
|
||||||
ReliableStream rStream;
|
ReliableStream rStream;
|
||||||
std::vector<char> outputBytes;
|
|
||||||
bool upgradeMode = false;
|
|
||||||
public:
|
public:
|
||||||
SerialLauncher(po::variables_map& options);
|
SerialLauncher(po::variables_map& options);
|
||||||
virtual ~SerialLauncher();
|
|
||||||
|
|
||||||
virtual bool Go(int timeout = 0);
|
|
||||||
virtual void DumpOutput();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void write(const void *p, size_t n);
|
|
||||||
size_t read(void * p, size_t n);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,41 +118,10 @@ void SerialStream::wait()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SerialLauncher::SerialLauncher(po::variables_map &options)
|
SerialLauncher::SerialLauncher(po::variables_map &options)
|
||||||
: Launcher(options), stream(options), rStream(&stream)
|
: StreamBasedLauncher(options), stream(options), rStream(&stream)
|
||||||
{
|
{
|
||||||
if(options.count("upgrade-server"))
|
SetupStream(&stream, &rStream);
|
||||||
upgradeMode = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
SerialLauncher::~SerialLauncher()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t SerialLauncher::read(void *p0, size_t n)
|
|
||||||
{
|
|
||||||
uint8_t* p = (uint8_t*)p0;
|
|
||||||
size_t gotBytes = rStream.read(p, n);
|
|
||||||
while(gotBytes < n)
|
|
||||||
{
|
|
||||||
rStream.flushWrite();
|
|
||||||
stream.wait();
|
|
||||||
gotBytes += rStream.read(p + gotBytes, n - gotBytes);
|
|
||||||
}
|
|
||||||
return gotBytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SerialLauncher::write(const void *p, size_t n)
|
|
||||||
{
|
|
||||||
while(!rStream.readyToWrite())
|
|
||||||
stream.wait();
|
|
||||||
rStream.write(p, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SerialLauncher::Go(int timeout)
|
|
||||||
{
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -175,50 +134,6 @@ bool SerialLauncher::Go(int timeout)
|
||||||
} while(!rStream.resetResponseArrived());
|
} while(!rStream.resetResponseArrived());
|
||||||
|
|
||||||
std::cerr << "Connected." << std::endl;
|
std::cerr << "Connected." << std::endl;
|
||||||
|
|
||||||
{
|
|
||||||
RemoteCommand cmd = upgradeMode ? RemoteCommand::upgradeLauncher : RemoteCommand::launchApp;
|
|
||||||
write(&cmd, 1);
|
|
||||||
|
|
||||||
write(std::string(app.type).data(), 4);
|
|
||||||
write(std::string(app.creator).data(), 4);
|
|
||||||
|
|
||||||
std::ostringstream rsrcOut;
|
|
||||||
app.resources.writeFork(rsrcOut);
|
|
||||||
std::string rsrc = rsrcOut.str();
|
|
||||||
std::string& data = app.data;
|
|
||||||
std::cerr << "Transfering " << (data.size() + rsrc.size() + 1023) / 1024 << " KB." << std::endl;
|
|
||||||
|
|
||||||
tmp = htonl(data.size());
|
|
||||||
write(&tmp, 4);
|
|
||||||
tmp = htonl(rsrc.size());
|
|
||||||
write(&tmp, 4);
|
|
||||||
|
|
||||||
write(data.data(), data.size());
|
|
||||||
write(rsrc.data(), rsrc.size());
|
|
||||||
}
|
|
||||||
while(!rStream.allDataArrived())
|
|
||||||
stream.wait();
|
|
||||||
std::cerr << "Running Appliation..." << std::endl;
|
|
||||||
read(&tmp, 4);
|
|
||||||
uint32_t result = ntohl(tmp);
|
|
||||||
std::cerr << "Finished (result = " << result << ")." << std::endl;
|
|
||||||
|
|
||||||
if(result == 0)
|
|
||||||
{
|
|
||||||
read(&tmp, 4);
|
|
||||||
uint32_t size = ntohl(tmp);
|
|
||||||
outputBytes.resize(size);
|
|
||||||
if(size > 0)
|
|
||||||
read(outputBytes.data(), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SerialLauncher::DumpOutput()
|
|
||||||
{
|
|
||||||
std::cout.write(outputBytes.data(), outputBytes.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Serial::GetOptions(options_description &desc)
|
void Serial::GetOptions(options_description &desc)
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
#include "SharedFile.h"
|
||||||
|
#include "StreamBasedLauncher.h"
|
||||||
|
#include "Utilities.h"
|
||||||
|
#include "Stream.h"
|
||||||
|
#include "ServerProtocol.h"
|
||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
|
||||||
|
namespace fs = boost::filesystem;
|
||||||
|
namespace po = boost::program_options;
|
||||||
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
|
class SharedFileStream : public WaitableStream
|
||||||
|
{
|
||||||
|
static const long kReadBufferSize = 4096;
|
||||||
|
uint8_t readBuffer[kReadBufferSize];
|
||||||
|
fs::path shared_directory;
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void write(const void* p, size_t n) override;
|
||||||
|
|
||||||
|
virtual void wait() override;
|
||||||
|
|
||||||
|
SharedFileStream(po::variables_map &options);
|
||||||
|
~SharedFileStream();
|
||||||
|
};
|
||||||
|
|
||||||
|
class SharedFileLauncher : public StreamBasedLauncher
|
||||||
|
{
|
||||||
|
SharedFileStream stream;
|
||||||
|
public:
|
||||||
|
SharedFileLauncher(po::variables_map& options);
|
||||||
|
};
|
||||||
|
|
||||||
|
SharedFileStream::SharedFileStream(po::variables_map &options)
|
||||||
|
{
|
||||||
|
shared_directory = options["shared-directory"].as<std::string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedFileStream::~SharedFileStream()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileStream::write(const void* p, size_t n)
|
||||||
|
{
|
||||||
|
if(n == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
{
|
||||||
|
fs::ofstream out(shared_directory / "in_channel_1", std::ios::binary);
|
||||||
|
out.write((const char*)p, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
fs::rename(shared_directory / "in_channel_1", shared_directory / "in_channel");
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
usleep(100000);
|
||||||
|
} while(fs::exists(shared_directory / "in_channel"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileStream::wait()
|
||||||
|
{
|
||||||
|
usleep(100000);
|
||||||
|
if(fs::exists(shared_directory / "out_channel"))
|
||||||
|
{
|
||||||
|
{
|
||||||
|
fs::ifstream in(shared_directory / "out_channel");
|
||||||
|
|
||||||
|
while(in.read((char*)readBuffer, sizeof(readBuffer)), in.gcount() > 0)
|
||||||
|
notifyReceive(readBuffer, in.gcount());
|
||||||
|
}
|
||||||
|
fs::remove(shared_directory / "out_channel");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedFileLauncher::SharedFileLauncher(po::variables_map &options)
|
||||||
|
: StreamBasedLauncher(options), stream(options)
|
||||||
|
{
|
||||||
|
SetupStream(&stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFile::GetOptions(options_description &desc)
|
||||||
|
{
|
||||||
|
desc.add_options()
|
||||||
|
("shared-directory", po::value<std::string>(), "Path to a directory shared with the old mac")
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SharedFile::CheckOptions(variables_map &options)
|
||||||
|
{
|
||||||
|
return options.count("shared-directory") != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Launcher> SharedFile::MakeLauncher(variables_map &options)
|
||||||
|
{
|
||||||
|
return std::unique_ptr<Launcher>(new SharedFileLauncher(options));
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "LaunchMethod.h"
|
||||||
|
|
||||||
|
class SharedFile : public LaunchMethod
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual std::string GetName() { return "shared"; }
|
||||||
|
virtual void GetOptions(options_description& desc);
|
||||||
|
virtual bool CheckOptions(variables_map& options);
|
||||||
|
|
||||||
|
virtual std::unique_ptr<Launcher> MakeLauncher(variables_map& options);
|
||||||
|
};
|
|
@ -0,0 +1,91 @@
|
||||||
|
#include "StreamBasedLauncher.h"
|
||||||
|
#include "Stream.h"
|
||||||
|
#include "ServerProtocol.h"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
StreamBasedLauncher::StreamBasedLauncher(boost::program_options::variables_map &options)
|
||||||
|
: Launcher(options)
|
||||||
|
{
|
||||||
|
if(options.count("upgrade-server"))
|
||||||
|
upgradeMode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamBasedLauncher::~StreamBasedLauncher()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void StreamBasedLauncher::SetupStream(WaitableStream* aStream, Stream* wrapped)
|
||||||
|
{
|
||||||
|
this->stream = aStream;
|
||||||
|
this->rStream = wrapped ? wrapped : aStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t StreamBasedLauncher::read(void *p0, size_t n)
|
||||||
|
{
|
||||||
|
uint8_t* p = (uint8_t*)p0;
|
||||||
|
size_t gotBytes = rStream->read(p, n);
|
||||||
|
while(gotBytes < n)
|
||||||
|
{
|
||||||
|
rStream->flushWrite();
|
||||||
|
stream->wait();
|
||||||
|
gotBytes += rStream->read(p + gotBytes, n - gotBytes);
|
||||||
|
}
|
||||||
|
return gotBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StreamBasedLauncher::write(const void *p, size_t n)
|
||||||
|
{
|
||||||
|
while(!rStream->readyToWrite())
|
||||||
|
stream->wait();
|
||||||
|
rStream->write(p, n);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StreamBasedLauncher::Go(int timeout)
|
||||||
|
{
|
||||||
|
uint32_t tmp;
|
||||||
|
|
||||||
|
{
|
||||||
|
RemoteCommand cmd = upgradeMode ? RemoteCommand::upgradeLauncher : RemoteCommand::launchApp;
|
||||||
|
write(&cmd, 1);
|
||||||
|
|
||||||
|
write(std::string(app.type).data(), 4);
|
||||||
|
write(std::string(app.creator).data(), 4);
|
||||||
|
|
||||||
|
std::ostringstream rsrcOut;
|
||||||
|
app.resources.writeFork(rsrcOut);
|
||||||
|
std::string rsrc = rsrcOut.str();
|
||||||
|
std::string& data = app.data;
|
||||||
|
std::cerr << "Transferring " << (data.size() + rsrc.size() + 1023) / 1024 << " KB." << std::endl;
|
||||||
|
|
||||||
|
tmp = htonl(data.size());
|
||||||
|
write(&tmp, 4);
|
||||||
|
tmp = htonl(rsrc.size());
|
||||||
|
write(&tmp, 4);
|
||||||
|
|
||||||
|
write(data.data(), data.size());
|
||||||
|
write(rsrc.data(), rsrc.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
while(!rStream->allDataArrived())
|
||||||
|
stream->wait();
|
||||||
|
std::cerr << "Running Appliation..." << std::endl;
|
||||||
|
read(&tmp, 4);
|
||||||
|
uint32_t result = ntohl(tmp);
|
||||||
|
std::cerr << "Finished (result = " << result << ")." << std::endl;
|
||||||
|
|
||||||
|
if(result == 0)
|
||||||
|
{
|
||||||
|
read(&tmp, 4);
|
||||||
|
uint32_t size = ntohl(tmp);
|
||||||
|
outputBytes.resize(size);
|
||||||
|
if(size > 0)
|
||||||
|
read(outputBytes.data(), size);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StreamBasedLauncher::DumpOutput()
|
||||||
|
{
|
||||||
|
std::cout.write(outputBytes.data(), outputBytes.size());
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
#include "Launcher.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class Stream;
|
||||||
|
class WaitableStream;
|
||||||
|
|
||||||
|
class StreamBasedLauncher : public Launcher
|
||||||
|
{
|
||||||
|
WaitableStream *stream;
|
||||||
|
Stream *rStream;
|
||||||
|
std::vector<char> outputBytes;
|
||||||
|
bool upgradeMode = false;
|
||||||
|
public:
|
||||||
|
StreamBasedLauncher(boost::program_options::variables_map& options);
|
||||||
|
virtual ~StreamBasedLauncher();
|
||||||
|
|
||||||
|
virtual bool Go(int timeout = 0);
|
||||||
|
virtual void DumpOutput();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void SetupStream(WaitableStream* aStream, Stream* wrapped = nullptr);
|
||||||
|
private:
|
||||||
|
void write(const void *p, size_t n);
|
||||||
|
ssize_t read(void * p, size_t n);
|
||||||
|
};
|
|
@ -1,5 +1,5 @@
|
||||||
#include "TCP.h"
|
#include "TCP.h"
|
||||||
#include "Launcher.h"
|
#include "StreamBasedLauncher.h"
|
||||||
#include "Utilities.h"
|
#include "Utilities.h"
|
||||||
#include "Stream.h"
|
#include "Stream.h"
|
||||||
#include "ServerProtocol.h"
|
#include "ServerProtocol.h"
|
||||||
|
@ -14,7 +14,7 @@
|
||||||
namespace po = boost::program_options;
|
namespace po = boost::program_options;
|
||||||
using namespace std::literals::chrono_literals;
|
using namespace std::literals::chrono_literals;
|
||||||
|
|
||||||
class TCPStream : public Stream
|
class TCPStream : public WaitableStream
|
||||||
{
|
{
|
||||||
|
|
||||||
static const long kReadBufferSize = 4096;
|
static const long kReadBufferSize = 4096;
|
||||||
|
@ -24,28 +24,17 @@ public:
|
||||||
|
|
||||||
virtual void write(const void* p, size_t n) override;
|
virtual void write(const void* p, size_t n) override;
|
||||||
|
|
||||||
void wait();
|
virtual void wait() override;
|
||||||
|
|
||||||
TCPStream(po::variables_map &options);
|
TCPStream(po::variables_map &options);
|
||||||
~TCPStream();
|
~TCPStream();
|
||||||
};
|
};
|
||||||
|
|
||||||
class TCPLauncher : public Launcher
|
class TCPLauncher : public StreamBasedLauncher
|
||||||
{
|
{
|
||||||
TCPStream stream;
|
TCPStream stream;
|
||||||
TCPStream& rStream = stream;
|
|
||||||
std::vector<char> outputBytes;
|
|
||||||
bool upgradeMode = false;
|
|
||||||
public:
|
public:
|
||||||
TCPLauncher(po::variables_map& options);
|
TCPLauncher(po::variables_map& options);
|
||||||
virtual ~TCPLauncher();
|
|
||||||
|
|
||||||
virtual bool Go(int timeout = 0);
|
|
||||||
virtual void DumpOutput();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void write(const void *p, size_t n);
|
|
||||||
ssize_t read(void * p, size_t n);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,86 +70,10 @@ void TCPStream::wait()
|
||||||
notifyReceive(readBuffer, n);
|
notifyReceive(readBuffer, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TCPLauncher::TCPLauncher(po::variables_map &options)
|
TCPLauncher::TCPLauncher(po::variables_map &options)
|
||||||
: Launcher(options), stream(options)
|
: StreamBasedLauncher(options), stream(options)
|
||||||
{
|
{
|
||||||
if(options.count("upgrade-server"))
|
SetupStream(&stream);
|
||||||
upgradeMode = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
TCPLauncher::~TCPLauncher()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t TCPLauncher::read(void *p0, size_t n)
|
|
||||||
{
|
|
||||||
uint8_t* p = (uint8_t*)p0;
|
|
||||||
size_t gotBytes = rStream.read(p, n);
|
|
||||||
while(gotBytes < n)
|
|
||||||
{
|
|
||||||
rStream.flushWrite();
|
|
||||||
stream.wait();
|
|
||||||
gotBytes += rStream.read(p + gotBytes, n - gotBytes);
|
|
||||||
}
|
|
||||||
return gotBytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TCPLauncher::write(const void *p, size_t n)
|
|
||||||
{
|
|
||||||
while(!rStream.readyToWrite())
|
|
||||||
stream.wait();
|
|
||||||
rStream.write(p, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TCPLauncher::Go(int timeout)
|
|
||||||
{
|
|
||||||
uint32_t tmp;
|
|
||||||
|
|
||||||
|
|
||||||
{
|
|
||||||
RemoteCommand cmd = upgradeMode ? RemoteCommand::upgradeLauncher : RemoteCommand::launchApp;
|
|
||||||
write(&cmd, 1);
|
|
||||||
|
|
||||||
write(std::string(app.type).data(), 4);
|
|
||||||
write(std::string(app.creator).data(), 4);
|
|
||||||
|
|
||||||
std::ostringstream rsrcOut;
|
|
||||||
app.resources.writeFork(rsrcOut);
|
|
||||||
std::string rsrc = rsrcOut.str();
|
|
||||||
std::string& data = app.data;
|
|
||||||
std::cerr << "Transfering " << (data.size() + rsrc.size() + 1023) / 1024 << " KB." << std::endl;
|
|
||||||
|
|
||||||
tmp = htonl(data.size());
|
|
||||||
write(&tmp, 4);
|
|
||||||
tmp = htonl(rsrc.size());
|
|
||||||
write(&tmp, 4);
|
|
||||||
|
|
||||||
write(data.data(), data.size());
|
|
||||||
write(rsrc.data(), rsrc.size());
|
|
||||||
}
|
|
||||||
while(!rStream.allDataArrived())
|
|
||||||
stream.wait();
|
|
||||||
std::cerr << "Running Appliation..." << std::endl;
|
|
||||||
read(&tmp, 4);
|
|
||||||
uint32_t result = ntohl(tmp);
|
|
||||||
std::cerr << "Finished (result = " << result << ")." << std::endl;
|
|
||||||
|
|
||||||
if(result == 0)
|
|
||||||
{
|
|
||||||
read(&tmp, 4);
|
|
||||||
uint32_t size = ntohl(tmp);
|
|
||||||
outputBytes.resize(size);
|
|
||||||
if(size > 0)
|
|
||||||
read(outputBytes.data(), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TCPLauncher::DumpOutput()
|
|
||||||
{
|
|
||||||
std::cout.write(outputBytes.data(), outputBytes.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCP::GetOptions(options_description &desc)
|
void TCP::GetOptions(options_description &desc)
|
||||||
|
|
|
@ -36,6 +36,12 @@ protected:
|
||||||
void notifyReset();
|
void notifyReset();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class WaitableStream : public Stream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void wait() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
class StreamWrapper : public Stream, private StreamListener
|
class StreamWrapper : public Stream, private StreamListener
|
||||||
{
|
{
|
||||||
Stream* underlying_;
|
Stream* underlying_;
|
||||||
|
|
|
@ -54,6 +54,16 @@
|
||||||
# emulator = tcp
|
# emulator = tcp
|
||||||
# tcp-address = 192.168.0.42 # IP address of your mac
|
# tcp-address = 192.168.0.42 # IP address of your mac
|
||||||
|
|
||||||
|
# ########### A real Mac or emulator that can access a shared volume
|
||||||
|
|
||||||
|
# Prerequisited:
|
||||||
|
# - LaunchAPPLServer compiled by Retro68 for your Mac or emulator
|
||||||
|
# - A volume or folder shared between your classic Mac/emulator and the computer you're running LaunchAPPL on
|
||||||
|
|
||||||
|
# For example, this can be SheepShaver or Basilisk with their built-in shared folder support.
|
||||||
|
|
||||||
|
# emulator = shared
|
||||||
|
# shared-directory = /path/to/some/empty/directory
|
||||||
|
|
||||||
# ########### Mini vMac (old 68K Macs)
|
# ########### Mini vMac (old 68K Macs)
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "AboutBox.h"
|
#include "AboutBox.h"
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <TextEdit.h>
|
#include <TextEdit.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "AppLauncher.h"
|
#include "AppLauncher.h"
|
||||||
|
|
||||||
#include <Processes.h>
|
#include <Processes.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -25,6 +25,13 @@ else()
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
list(APPEND CONNECTION_SOURCES
|
||||||
|
SharedFileStream.h
|
||||||
|
SharedFileStream.cc
|
||||||
|
SharedFileProvider.h
|
||||||
|
SharedFileProvider.cc
|
||||||
|
)
|
||||||
|
|
||||||
option(LAUNCHAPPLSERVER_DEBUG_CONSOLE "Add a debug console to LaunchAPPLServer" FALSE)
|
option(LAUNCHAPPLSERVER_DEBUG_CONSOLE "Add a debug console to LaunchAPPLServer" FALSE)
|
||||||
|
|
||||||
set(MAYBE_CONSOLE)
|
set(MAYBE_CONSOLE)
|
||||||
|
@ -50,6 +57,8 @@ add_application(LaunchAPPLServer
|
||||||
AboutBox.cc
|
AboutBox.cc
|
||||||
ConnectionProvider.h
|
ConnectionProvider.h
|
||||||
CarbonFileCompat.h
|
CarbonFileCompat.h
|
||||||
|
Preferences.h
|
||||||
|
Preferences.cc
|
||||||
|
|
||||||
${CONNECTION_SOURCES}
|
${CONNECTION_SOURCES}
|
||||||
)
|
)
|
||||||
|
@ -73,7 +82,7 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES RetroPPC)
|
if(CMAKE_SYSTEM_NAME MATCHES RetroPPC)
|
||||||
target_link_libraries(LaunchAPPLServer -lOpenTransportAppPPC -lOpenTransportLib -lOpenTptInternetLib )
|
target_link_libraries(LaunchAPPLServer -lOpenTransportAppPPC -lOpenTransportLib -lOpenTptInternetLib -lNavigationLib)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(FALSE)
|
if(FALSE)
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Files.h>
|
#include <Files.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class StreamListener;
|
class StreamListener;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2018 Wolfgang Thaller.
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
This file is part of Retro68.
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
@ -34,6 +34,7 @@
|
||||||
#include "AppLauncher.h"
|
#include "AppLauncher.h"
|
||||||
#include "StatusDisplay.h"
|
#include "StatusDisplay.h"
|
||||||
#include "AboutBox.h"
|
#include "AboutBox.h"
|
||||||
|
#include "Preferences.h"
|
||||||
|
|
||||||
#include <ServerProtocol.h>
|
#include <ServerProtocol.h>
|
||||||
#include <Processes.h>
|
#include <Processes.h>
|
||||||
|
@ -48,6 +49,7 @@
|
||||||
#if !TARGET_CPU_68K
|
#if !TARGET_CPU_68K
|
||||||
#include "OpenTptConnectionProvider.h"
|
#include "OpenTptConnectionProvider.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "SharedFileProvider.h"
|
||||||
|
|
||||||
#include "SystemInfo.h"
|
#include "SystemInfo.h"
|
||||||
|
|
||||||
|
@ -68,33 +70,19 @@ enum
|
||||||
kItemAbout = 1,
|
kItemAbout = 1,
|
||||||
|
|
||||||
kItemClose = 1,
|
kItemClose = 1,
|
||||||
kItemQuit = 3
|
kItemQuit = 3,
|
||||||
};
|
|
||||||
|
|
||||||
enum class Port : int
|
kItemChooseFolder = 14
|
||||||
{
|
|
||||||
modemPort = 0,
|
|
||||||
printerPort,
|
|
||||||
macTCP,
|
|
||||||
openTptTCP
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if TARGET_API_MAC_CARBON
|
#if TARGET_API_MAC_CARBON
|
||||||
bool portsAvailable[] = { false, false, false, false };
|
bool portsAvailable[] = { false, false, false, false, true };
|
||||||
#else
|
#else
|
||||||
bool portsAvailable[] = { true, true, false, false };
|
bool portsAvailable[] = { true, true, false, false, true };
|
||||||
#endif
|
#endif
|
||||||
bool hasIconUtils = true;
|
bool hasIconUtils = true;
|
||||||
bool hasColorQD = true;
|
bool hasColorQD = true;
|
||||||
|
bool hasSys7StdFile = true;
|
||||||
struct Prefs
|
|
||||||
{
|
|
||||||
const static int currentVersion = 1;
|
|
||||||
int version = currentVersion;
|
|
||||||
Port port = Port::modemPort;
|
|
||||||
long baud = 19200;
|
|
||||||
bool inSubLaunch = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
Prefs gPrefs;
|
Prefs gPrefs;
|
||||||
|
|
||||||
|
@ -170,7 +158,9 @@ void UpdateMenus()
|
||||||
CheckMenuItem(m, 3, gPrefs.port == Port::modemPort);
|
CheckMenuItem(m, 3, gPrefs.port == Port::modemPort);
|
||||||
SetItemEnabled(m, 4, portsAvailable[(int)Port::printerPort]);
|
SetItemEnabled(m, 4, portsAvailable[(int)Port::printerPort]);
|
||||||
CheckMenuItem(m, 4, gPrefs.port == Port::printerPort);
|
CheckMenuItem(m, 4, gPrefs.port == Port::printerPort);
|
||||||
for(int i = 6; i <= CountMenuItems(m); i++)
|
SetItemEnabled(m, 5, portsAvailable[(int)Port::sharedFiles]);
|
||||||
|
CheckMenuItem(m, 5, gPrefs.port == Port::sharedFiles);
|
||||||
|
for(int i = 7; i < kItemChooseFolder; i++)
|
||||||
{
|
{
|
||||||
Str255 str;
|
Str255 str;
|
||||||
long baud;
|
long baud;
|
||||||
|
@ -250,6 +240,13 @@ void DoMenuCommand(long menuCommand)
|
||||||
case 4:
|
case 4:
|
||||||
gPrefs.port = Port::printerPort;
|
gPrefs.port = Port::printerPort;
|
||||||
break;
|
break;
|
||||||
|
case 5:
|
||||||
|
gPrefs.port = Port::sharedFiles;
|
||||||
|
break;
|
||||||
|
case kItemChooseFolder:
|
||||||
|
ChooseSharedDirectory();
|
||||||
|
UnloadSeg((void*) &ChooseSharedDirectory);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
GetMenuItemText(GetMenuHandle(menuID), menuItem, str);
|
GetMenuItemText(GetMenuHandle(menuID), menuItem, str);
|
||||||
StringToNum(str, &gPrefs.baud);
|
StringToNum(str, &gPrefs.baud);
|
||||||
|
@ -301,7 +298,7 @@ public:
|
||||||
size_t onReceive(const uint8_t* p, size_t n)
|
size_t onReceive(const uint8_t* p, size_t n)
|
||||||
{
|
{
|
||||||
#ifdef DEBUG_CONSOLE
|
#ifdef DEBUG_CONSOLE
|
||||||
// printf("Received %d bytes in state %d.\n", (int)n, (int)state);
|
printf("Received %d bytes in state %d.\n", (int)n, (int)state);
|
||||||
#endif
|
#endif
|
||||||
switch(state)
|
switch(state)
|
||||||
{
|
{
|
||||||
|
@ -546,8 +543,13 @@ LaunchServer server;
|
||||||
|
|
||||||
void ConnectionChanged()
|
void ConnectionChanged()
|
||||||
{
|
{
|
||||||
|
void *connectionSeg = connection ? connection->segmentToUnload() : nullptr;
|
||||||
|
|
||||||
connection.reset(); // deallocate before we create the new provider
|
connection.reset(); // deallocate before we create the new provider
|
||||||
|
|
||||||
|
if(connectionSeg)
|
||||||
|
UnloadSeg(connectionSeg);
|
||||||
|
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
@ -582,6 +584,15 @@ void ConnectionChanged()
|
||||||
connection = std::make_unique<OpenTptConnectionProvider>(statusDisplay.get());;
|
connection = std::make_unique<OpenTptConnectionProvider>(statusDisplay.get());;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case Port::sharedFiles:
|
||||||
|
if(gPrefs.sharedDirectoryPath[0] == 0)
|
||||||
|
{
|
||||||
|
ChooseSharedDirectory();
|
||||||
|
UnloadSeg((void*) &ChooseSharedDirectory);
|
||||||
|
}
|
||||||
|
if(gPrefs.sharedDirectoryPath[0] != 0)
|
||||||
|
connection = std::make_unique<SharedFileProvider>(statusDisplay.get());;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -657,6 +668,9 @@ int main()
|
||||||
|
|
||||||
err = Gestalt(gestaltQuickdrawVersion, &response);
|
err = Gestalt(gestaltQuickdrawVersion, &response);
|
||||||
hasColorQD = err == noErr && response != 0;
|
hasColorQD = err == noErr && response != 0;
|
||||||
|
|
||||||
|
err = Gestalt(gestaltStandardFileAttr, &response);
|
||||||
|
hasSys7StdFile = err == noErr && (response & (1 << gestaltStandardFile58)) != 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2018 Wolfgang Thaller.
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
This file is part of Retro68.
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
||||||
#include "Windows.r"
|
#include "Windows.r"
|
||||||
#include "MacTypes.r"
|
#include "MacTypes.r"
|
||||||
#include "Finder.r"
|
#include "Finder.r"
|
||||||
|
#include "Dialogs.r"
|
||||||
|
|
||||||
resource 'MENU' (128) {
|
resource 'MENU' (128) {
|
||||||
128, textMenuProc;
|
128, textMenuProc;
|
||||||
|
@ -67,6 +68,7 @@ resource 'MENU' (131) {
|
||||||
"OpenTransport TCP", noIcon, noKey, noMark, plain;
|
"OpenTransport TCP", noIcon, noKey, noMark, plain;
|
||||||
"Modem Port", noIcon, noKey, noMark, plain;
|
"Modem Port", noIcon, noKey, noMark, plain;
|
||||||
"Printer Port", noIcon, noKey, noMark, plain;
|
"Printer Port", noIcon, noKey, noMark, plain;
|
||||||
|
"Shared Files", noIcon, noKey, noMark, plain;
|
||||||
"-", noIcon, noKey, noMark, plain;
|
"-", noIcon, noKey, noMark, plain;
|
||||||
"9600", noIcon, noKey, noMark, plain;
|
"9600", noIcon, noKey, noMark, plain;
|
||||||
"19200", noIcon, noKey, check, plain;
|
"19200", noIcon, noKey, check, plain;
|
||||||
|
@ -74,6 +76,8 @@ resource 'MENU' (131) {
|
||||||
"57600", noIcon, noKey, noMark, plain;
|
"57600", noIcon, noKey, noMark, plain;
|
||||||
"115200", noIcon, noKey, noMark, plain;
|
"115200", noIcon, noKey, noMark, plain;
|
||||||
"230400", noIcon, noKey, noMark, plain;
|
"230400", noIcon, noKey, noMark, plain;
|
||||||
|
"-", noIcon, noKey, noMark, plain;
|
||||||
|
"Choose Shared Directory...", noIcon, noKey, noMark, plain;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -115,6 +119,7 @@ resource 'STR#' (128, purgeable) {
|
||||||
"Listening on Printer Port...";
|
"Listening on Printer Port...";
|
||||||
"Listening on TCP port 1984 (MacTCP)...";
|
"Listening on TCP port 1984 (MacTCP)...";
|
||||||
"Listening on TCP port 1984 (OpenTransport)...";
|
"Listening on TCP port 1984 (OpenTransport)...";
|
||||||
|
"Waiting for shared files...";
|
||||||
"Downloading Application...";
|
"Downloading Application...";
|
||||||
"Downloading Upgrade...";
|
"Downloading Upgrade...";
|
||||||
"Running Application...";
|
"Running Application...";
|
||||||
|
@ -151,7 +156,7 @@ resource 'SIZE' (-1) {
|
||||||
notDisplayManagerAware,
|
notDisplayManagerAware,
|
||||||
reserved,
|
reserved,
|
||||||
reserved,
|
reserved,
|
||||||
350 * 1024,
|
500 * 1024,
|
||||||
136 * 1024
|
136 * 1024
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -178,3 +183,75 @@ resource 'BNDL' (128, purgeable) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
resource 'DLOG' (128, purgeable)
|
||||||
|
{
|
||||||
|
{0, 0, 225, 348},
|
||||||
|
dBoxProc,
|
||||||
|
invisible,
|
||||||
|
noGoAway,
|
||||||
|
0x0,
|
||||||
|
128,
|
||||||
|
"",
|
||||||
|
noAutoCenter
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'DITL' (128, purgeable)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
/* [1] */
|
||||||
|
{138, 256, 156, 336},
|
||||||
|
Button { enabled, "Open" },
|
||||||
|
/* [2] */
|
||||||
|
{1152, 59, 1232, 77},
|
||||||
|
Button { enabled, "" },
|
||||||
|
/* [3] */
|
||||||
|
{188, 256, 206, 336},
|
||||||
|
Button { enabled, "Cancel" },
|
||||||
|
/* [4] */
|
||||||
|
{39, 232, 59, 347},
|
||||||
|
UserItem { disabled },
|
||||||
|
/* [5] */
|
||||||
|
{68, 256, 86, 336},
|
||||||
|
Button { enabled, "Eject" },
|
||||||
|
/* [6] */
|
||||||
|
{93, 256, 111, 336},
|
||||||
|
Button { enabled, "Drive" },
|
||||||
|
/* [7] */
|
||||||
|
{39, 12, 210, 230},
|
||||||
|
UserItem { enabled },
|
||||||
|
/* [8] */
|
||||||
|
{39, 229, 210, 246},
|
||||||
|
UserItem { enabled },
|
||||||
|
/* [9] */
|
||||||
|
{124, 252, 125, 340},
|
||||||
|
UserItem { disabled },
|
||||||
|
/* [10] */
|
||||||
|
{1044, 20, 1145, 116},
|
||||||
|
StaticText { disabled, "" },
|
||||||
|
/* [11] */
|
||||||
|
{163, 256, 181, 336},
|
||||||
|
Button { enabled, "Choose" }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'DLOG' (129, purgeable)
|
||||||
|
{
|
||||||
|
{0, 0, 200, 344}, dBoxProc, invisible, noGoAway, 0,
|
||||||
|
129, "", noAutoCenter
|
||||||
|
};
|
||||||
|
resource 'DITL'(129)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{169, 252, 189, 332}, Button { enabled, "Open" },
|
||||||
|
{107, 252, 127, 332}, Button { enabled, "Cancel" },
|
||||||
|
{0, 0, 0, 0}, HelpItem { disabled, HMScanhdlg {-6042}},
|
||||||
|
{8, 235, 24, 337}, UserItem { enabled },
|
||||||
|
{32, 252, 52, 332}, Button { enabled, "Eject" },
|
||||||
|
{60, 252, 80, 332}, Button { enabled, "Desktop" },
|
||||||
|
{29, 12, 193, 230}, UserItem { enabled },
|
||||||
|
{6, 12, 25, 230}, UserItem { enabled },
|
||||||
|
{93, 251, 94, 333}, Picture { disabled, 11 },
|
||||||
|
{138, 252, 158, 332}, Button { enabled, "Choose" },
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -7,6 +7,9 @@ SEGMENT MacTCP
|
||||||
*/MacTCPStream.*
|
*/MacTCPStream.*
|
||||||
*/TCPConnectionProvider.*
|
*/TCPConnectionProvider.*
|
||||||
|
|
||||||
|
SEGMENT SharedFile
|
||||||
|
*/SharedFile*.*
|
||||||
|
|
||||||
SEGMENT Launcher
|
SEGMENT Launcher
|
||||||
*/AppLauncher.*
|
*/AppLauncher.*
|
||||||
*/ToolLauncher.*
|
*/ToolLauncher.*
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "Icons.r"
|
#include "Icons.r"
|
||||||
|
|
||||||
resource 'icl8' (128, purgeable) {
|
resource 'icl8' (128, purgeable) {
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "MacSerialStream.h"
|
#include "MacSerialStream.h"
|
||||||
|
|
||||||
#include <Serial.h>
|
#include <Serial.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef MACSERIALSTREAM_H_
|
#ifndef MACSERIALSTREAM_H_
|
||||||
#define MACSERIALSTREAM_H_
|
#define MACSERIALSTREAM_H_
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "MacTCPStream.h"
|
#include "MacTCPStream.h"
|
||||||
#include <Devices.h>
|
#include <Devices.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "OpenTptConnectionProvider.h"
|
#include "OpenTptConnectionProvider.h"
|
||||||
#include "OpenTptStream.h"
|
#include "OpenTptStream.h"
|
||||||
#include <ReliableStream.h>
|
#include <ReliableStream.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "ConnectionProvider.h"
|
#include "ConnectionProvider.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <ConditionalMacros.h>
|
#include <ConditionalMacros.h>
|
||||||
#if TARGET_API_MAC_CARBON
|
#if TARGET_API_MAC_CARBON
|
||||||
#define OTCARBONAPPLICATION 1
|
#define OTCARBONAPPLICATION 1
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Stream.h>
|
#include <Stream.h>
|
||||||
|
|
|
@ -0,0 +1,243 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Preferences.h"
|
||||||
|
#include <Navigation.h>
|
||||||
|
#include <StandardFile.h>
|
||||||
|
#include <LowMem.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include "Window.h"
|
||||||
|
#include "SystemInfo.h"
|
||||||
|
|
||||||
|
static void ConvertToPathName(const FSSpec& spec)
|
||||||
|
{
|
||||||
|
Str255 buf;
|
||||||
|
unsigned char path[257];
|
||||||
|
|
||||||
|
CInfoPBRec ipb;
|
||||||
|
|
||||||
|
long dirID = spec.parID;
|
||||||
|
path[0] = 0;
|
||||||
|
|
||||||
|
while(dirID != 1)
|
||||||
|
{
|
||||||
|
ipb.dirInfo.ioCompletion = nullptr;
|
||||||
|
ipb.dirInfo.ioVRefNum = spec.vRefNum;
|
||||||
|
ipb.dirInfo.ioNamePtr = buf;
|
||||||
|
ipb.dirInfo.ioFDirIndex = -1;
|
||||||
|
ipb.dirInfo.ioDrDirID = dirID;
|
||||||
|
|
||||||
|
PBGetCatInfoSync(&ipb);
|
||||||
|
|
||||||
|
buf[buf[0]+1] = 0;
|
||||||
|
printf("element: %s\n", buf+1);
|
||||||
|
|
||||||
|
if(path[0] + buf[0] + 1 > 255)
|
||||||
|
{
|
||||||
|
printf("Path length overflow.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
path[++path[0]] = ':';
|
||||||
|
std::reverse_copy(buf + 1, buf + 1 + buf[0], path + path[0] + 1);
|
||||||
|
path[0] += buf[0];
|
||||||
|
|
||||||
|
dirID = ipb.dirInfo.ioDrParID;
|
||||||
|
}
|
||||||
|
std::reverse(path + 1, path + 1 + path[0]);
|
||||||
|
path[path[0] + 1] = 0;
|
||||||
|
printf("path: %s\n", path+1);
|
||||||
|
|
||||||
|
memcpy(gPrefs.sharedDirectoryPath, path, path[0] + 1);
|
||||||
|
WritePrefs();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !TARGET_CPU_68K
|
||||||
|
// TODO: need to properly link to Navigation.far.o on 68K
|
||||||
|
|
||||||
|
static pascal void NavEventProc(NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, void *callBackUD)
|
||||||
|
{
|
||||||
|
if(callBackSelector == kNavCBEvent)
|
||||||
|
{
|
||||||
|
if(callBackParms->eventData.eventDataParms.event->what == updateEvt)
|
||||||
|
{
|
||||||
|
auto win = reinterpret_cast<WindowRef>(callBackParms->eventData.eventDataParms.event->message);
|
||||||
|
if(auto winObject = reinterpret_cast<Window*>(GetWRefCon(win)))
|
||||||
|
{
|
||||||
|
winObject->Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ChooseSharedDirectoryNav(FSSpec& spec)
|
||||||
|
{
|
||||||
|
bool success = false;
|
||||||
|
NavReplyRecord reply = {};
|
||||||
|
NavDialogOptions options = {};
|
||||||
|
|
||||||
|
options.version = kNavDialogOptionsVersion;
|
||||||
|
options.location = {-1,-1};
|
||||||
|
|
||||||
|
auto eventProc = NewNavEventUPP(&NavEventProc);
|
||||||
|
OSErr err = NavChooseFolder(nullptr, &reply, &options, eventProc, nullptr, nullptr);
|
||||||
|
DisposeNavEventUPP(eventProc);
|
||||||
|
|
||||||
|
if(err == noErr)
|
||||||
|
{
|
||||||
|
if(reply.validRecord)
|
||||||
|
{
|
||||||
|
long count = 0;
|
||||||
|
err = AECountItems(&reply.selection, &count);
|
||||||
|
if(err == noErr && count > 0)
|
||||||
|
{
|
||||||
|
AEKeyword keyword;
|
||||||
|
DescType actualType;
|
||||||
|
Size actualSize;
|
||||||
|
|
||||||
|
err = AEGetNthPtr(&reply.selection, 1, typeFSS, &keyword, &actualType,
|
||||||
|
&spec, sizeof(spec), &actualSize);
|
||||||
|
|
||||||
|
if(err == noErr)
|
||||||
|
success = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
NavDisposeReply(&reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !TARGET_API_MAC_CARBON
|
||||||
|
static bool choosePressed = false;
|
||||||
|
static pascal short DlgHookProc(short item, DialogRef theDialog)
|
||||||
|
{
|
||||||
|
if(choosePressed)
|
||||||
|
return 1;
|
||||||
|
if(item == 11)
|
||||||
|
{
|
||||||
|
choosePressed = true;
|
||||||
|
return sfHookOpenFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pascal Boolean FileFilterProc(CInfoPBPtr pb)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ChooseSharedDirectory6(FSSpec& spec)
|
||||||
|
{
|
||||||
|
SFReply reply;
|
||||||
|
auto dlgHookProc = NewDlgHookUPP(&DlgHookProc);
|
||||||
|
auto fileFilterProc = NewFileFilterUPP(&FileFilterProc);
|
||||||
|
choosePressed = false;
|
||||||
|
SFPGetFile(Point{-1,-1}, "\p", fileFilterProc, 0, nullptr, dlgHookProc, &reply, 128, nullptr);
|
||||||
|
DisposeDlgHookUPP(dlgHookProc);
|
||||||
|
DisposeFileFilterUPP(fileFilterProc);
|
||||||
|
|
||||||
|
if(choosePressed)
|
||||||
|
{
|
||||||
|
spec.name[0] = 0;
|
||||||
|
spec.parID = LMGetCurDirStore();
|
||||||
|
spec.vRefNum = -LMGetSFSaveDisk();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
static pascal short DlgHookYDProc(short item, DialogRef theDialog, void *yourDataPtr)
|
||||||
|
{
|
||||||
|
if(choosePressed)
|
||||||
|
return 1;
|
||||||
|
if(item == 10)
|
||||||
|
{
|
||||||
|
choosePressed = true;
|
||||||
|
return sfHookOpenFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
static pascal Boolean FileFilterYDProc(CInfoPBPtr pb, void *yourDataPtr)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ChooseSharedDirectory7(FSSpec& spec)
|
||||||
|
{
|
||||||
|
StandardFileReply reply;
|
||||||
|
auto dlgHookProc = NewDlgHookYDUPP(&DlgHookYDProc);
|
||||||
|
auto fileFilterProc = NewFileFilterYDUPP(&FileFilterYDProc);
|
||||||
|
choosePressed = false;
|
||||||
|
CustomGetFile(
|
||||||
|
fileFilterProc,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
&reply,
|
||||||
|
129,
|
||||||
|
Point{-1,-1},
|
||||||
|
dlgHookProc,
|
||||||
|
/*filterProc*/nullptr,
|
||||||
|
nullptr, nullptr,
|
||||||
|
nullptr);
|
||||||
|
|
||||||
|
DisposeDlgHookYDUPP(dlgHookProc);
|
||||||
|
DisposeFileFilterYDUPP(fileFilterProc);
|
||||||
|
|
||||||
|
if(choosePressed)
|
||||||
|
{
|
||||||
|
spec.name[0] = 0;
|
||||||
|
spec.parID = LMGetCurDirStore();
|
||||||
|
spec.vRefNum = -LMGetSFSaveDisk();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ChooseSharedDirectory()
|
||||||
|
{
|
||||||
|
FSSpec spec;
|
||||||
|
bool ok = false;
|
||||||
|
|
||||||
|
|
||||||
|
#if TARGET_API_MAC_CARBON
|
||||||
|
ok = ChooseSharedDirectoryNav(spec);
|
||||||
|
#else
|
||||||
|
|
||||||
|
#if !TARGET_CPU_68K
|
||||||
|
if(NavServicesAvailable())
|
||||||
|
ok = ChooseSharedDirectoryNav(spec);
|
||||||
|
#else
|
||||||
|
if(!hasSys7StdFile)
|
||||||
|
ok = ChooseSharedDirectory6(spec);
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
ok = ChooseSharedDirectory7(spec);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if(ok)
|
||||||
|
ConvertToPathName(spec);
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <MacTypes.h>
|
||||||
|
|
||||||
|
enum class Port : int
|
||||||
|
{
|
||||||
|
modemPort = 0,
|
||||||
|
printerPort,
|
||||||
|
macTCP,
|
||||||
|
openTptTCP,
|
||||||
|
sharedFiles
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Prefs
|
||||||
|
{
|
||||||
|
const static int currentVersion = 2;
|
||||||
|
int version = currentVersion;
|
||||||
|
Port port = Port::modemPort;
|
||||||
|
long baud = 19200;
|
||||||
|
bool inSubLaunch = false;
|
||||||
|
Str255 sharedDirectoryPath;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Prefs gPrefs;
|
||||||
|
|
||||||
|
void ChooseSharedDirectory();
|
||||||
|
|
||||||
|
void ReadPrefs();
|
||||||
|
void WritePrefs();
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "SerialConnectionProvider.h"
|
#include "SerialConnectionProvider.h"
|
||||||
#include "MacSerialStream.h"
|
#include "MacSerialStream.h"
|
||||||
#include <ReliableStream.h>
|
#include <ReliableStream.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "ConnectionProvider.h"
|
#include "ConnectionProvider.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SharedFileProvider.h"
|
||||||
|
#include "SharedFileStream.h"
|
||||||
|
#include "Preferences.h"
|
||||||
|
|
||||||
|
SharedFileProvider::SharedFileProvider(StatusDisplay *statusDisplay)
|
||||||
|
{
|
||||||
|
stream = std::make_unique<SharedFileStream>(gPrefs.sharedDirectoryPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedFileProvider::~SharedFileProvider()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Stream* SharedFileProvider::getStream()
|
||||||
|
{
|
||||||
|
return stream.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileProvider::idle()
|
||||||
|
{
|
||||||
|
if(stream)
|
||||||
|
{
|
||||||
|
stream->setListener(listener);
|
||||||
|
stream->idle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileProvider::unloadSegDummy()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void *SharedFileProvider::segmentToUnload()
|
||||||
|
{
|
||||||
|
return (void*) &unloadSegDummy;
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "ConnectionProvider.h"
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class SharedFileStream;
|
||||||
|
class StatusDisplay;
|
||||||
|
|
||||||
|
class SharedFileProvider : public ConnectionProvider
|
||||||
|
{
|
||||||
|
std::unique_ptr<SharedFileStream> stream;
|
||||||
|
|
||||||
|
static void unloadSegDummy();
|
||||||
|
public:
|
||||||
|
SharedFileProvider(StatusDisplay *statusDisplay);
|
||||||
|
virtual ~SharedFileProvider();
|
||||||
|
|
||||||
|
virtual Stream* getStream();
|
||||||
|
|
||||||
|
virtual void idle();
|
||||||
|
|
||||||
|
virtual void* segmentToUnload();
|
||||||
|
};
|
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SharedFileStream.h"
|
||||||
|
#include <Files.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <TextUtils.h>
|
||||||
|
|
||||||
|
void SharedFileStream::MakeFileName(unsigned char *name, int i)
|
||||||
|
{
|
||||||
|
const unsigned char *templ = "\pout_channel_";
|
||||||
|
memcpy(name, templ, templ[0]+1);
|
||||||
|
Str31 s;
|
||||||
|
NumToString(i, s);
|
||||||
|
memcpy(name + name[0] + 1, s + 1, s[0]);
|
||||||
|
name[0] += s[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileStream::write(const void* p, size_t n)
|
||||||
|
{
|
||||||
|
Str31 name;
|
||||||
|
MakeFileName(name, outQueueTail++);
|
||||||
|
HCreate(vRefNum, dirID, name, 'R68L', 'DATA' );
|
||||||
|
|
||||||
|
short refNum;
|
||||||
|
OSErr err = HOpenDF(vRefNum, dirID, name, fsWrDenyPerm, &refNum);
|
||||||
|
if(err)
|
||||||
|
return;
|
||||||
|
long count = n;
|
||||||
|
FSWrite(refNum, &count, p);
|
||||||
|
FSClose(refNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SharedFileStream::idle()
|
||||||
|
{
|
||||||
|
const unsigned char* in_channel = "\pin_channel";
|
||||||
|
|
||||||
|
static int count = 0;
|
||||||
|
if(++count % 10)
|
||||||
|
return;
|
||||||
|
short refNum;
|
||||||
|
|
||||||
|
OSErr err = HOpenDF(vRefNum, dirID, in_channel, fsRdDenyPerm, &refNum);
|
||||||
|
if(err == 0)
|
||||||
|
{
|
||||||
|
long count, countTotal = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
count = kReadBufferSize;
|
||||||
|
err = FSRead(refNum, &count, &readBuffer);
|
||||||
|
countTotal += count;
|
||||||
|
if((err == noErr || err == eofErr) && count > 0)
|
||||||
|
notifyReceive(readBuffer, count);
|
||||||
|
} while(err == noErr);
|
||||||
|
FSClose(refNum);
|
||||||
|
#ifdef DEBUG_CONSOLE
|
||||||
|
printf("read %ld bytes, deleting package\n", countTotal);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HDelete(vRefNum, dirID, in_channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outQueueTail > outQueueHead)
|
||||||
|
{
|
||||||
|
const unsigned char* out_channel = "\pout_channel";
|
||||||
|
Str31 name;
|
||||||
|
MakeFileName(name, outQueueHead);
|
||||||
|
if(HRename(vRefNum, dirID, name, out_channel) == noErr)
|
||||||
|
++outQueueHead;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(outQueueHead == outQueueTail)
|
||||||
|
outQueueHead = outQueueTail = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SharedFileStream::allDataArrived() const
|
||||||
|
{
|
||||||
|
return outQueueHead == outQueueTail;
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedFileStream::SharedFileStream(const unsigned char* path)
|
||||||
|
{
|
||||||
|
Str255 str;
|
||||||
|
memcpy(str, path, path[0] + 1);
|
||||||
|
CInfoPBRec ipb;
|
||||||
|
ipb.hFileInfo.ioCompletion = nullptr;
|
||||||
|
ipb.hFileInfo.ioVRefNum = 0;
|
||||||
|
ipb.hFileInfo.ioNamePtr = str;
|
||||||
|
ipb.hFileInfo.ioFDirIndex = 0;
|
||||||
|
ipb.hFileInfo.ioDirID = 0;
|
||||||
|
|
||||||
|
PBGetCatInfoSync(&ipb);
|
||||||
|
|
||||||
|
dirID = ipb.hFileInfo.ioDirID;
|
||||||
|
|
||||||
|
#ifdef DEBUG_CONSOLE
|
||||||
|
printf("dirID = %ld\n", dirID);
|
||||||
|
str[str[0]+1] = 0;
|
||||||
|
printf("name = %s\n", str + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
HParamBlockRec hpb;
|
||||||
|
hpb.ioParam.ioCompletion = nullptr;
|
||||||
|
hpb.ioParam.ioVRefNum = 0;
|
||||||
|
hpb.volumeParam.ioVolIndex = -1;
|
||||||
|
memcpy(str, path, path[0] + 1);
|
||||||
|
hpb.volumeParam.ioNamePtr = str;
|
||||||
|
PBHGetVInfoSync(&hpb);
|
||||||
|
|
||||||
|
#ifdef DEBUG_CONSOLE
|
||||||
|
str[str[0]+1] = 0;
|
||||||
|
printf("vRefNum = %d, name = %s\n", hpb.volumeParam.ioVRefNum, str + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
vRefNum = hpb.volumeParam.ioVRefNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedFileStream::~SharedFileStream()
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Stream.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
class SharedFileStream : public Stream
|
||||||
|
{
|
||||||
|
short vRefNum;
|
||||||
|
long dirID;
|
||||||
|
|
||||||
|
int outQueueHead = 1, outQueueTail = 1;
|
||||||
|
static const long kReadBufferSize = 4096;
|
||||||
|
uint8_t readBuffer[kReadBufferSize];
|
||||||
|
|
||||||
|
void MakeFileName(unsigned char *name, int i);
|
||||||
|
public:
|
||||||
|
virtual void write(const void* p, size_t n) override;
|
||||||
|
virtual bool allDataArrived() const override;
|
||||||
|
|
||||||
|
void idle();
|
||||||
|
|
||||||
|
SharedFileStream(const unsigned char* path);
|
||||||
|
~SharedFileStream();
|
||||||
|
};
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "StatusDisplay.h"
|
#include "StatusDisplay.h"
|
||||||
#include <Quickdraw.h>
|
#include <Quickdraw.h>
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
@ -8,7 +27,6 @@ const short tableTop = 50;
|
||||||
const short tableLineHeight = 20;
|
const short tableLineHeight = 20;
|
||||||
const short tableBaseline = 15;
|
const short tableBaseline = 15;
|
||||||
|
|
||||||
|
|
||||||
enum class StatusDisplay::Stat : short
|
enum class StatusDisplay::Stat : short
|
||||||
{
|
{
|
||||||
heapSize,
|
heapSize,
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <MacTypes.h>
|
#include <MacTypes.h>
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <TextUtils.h>
|
#include <TextUtils.h>
|
||||||
|
@ -14,6 +33,7 @@ enum class AppStatus
|
||||||
readyPrinter,
|
readyPrinter,
|
||||||
readyMacTCP,
|
readyMacTCP,
|
||||||
readyOpenTpt,
|
readyOpenTpt,
|
||||||
|
readySharedFiles,
|
||||||
downloading,
|
downloading,
|
||||||
upgrading,
|
upgrading,
|
||||||
running,
|
running,
|
||||||
|
|
|
@ -1,4 +1,24 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
extern bool hasColorQD;
|
extern bool hasColorQD;
|
||||||
extern bool hasIconUtils;
|
extern bool hasIconUtils;
|
||||||
|
extern bool hasSys7StdFile;
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "TCPConnectionProvider.h"
|
#include "TCPConnectionProvider.h"
|
||||||
#include "MacTCPStream.h"
|
#include "MacTCPStream.h"
|
||||||
#include <ReliableStream.h>
|
#include <ReliableStream.h>
|
||||||
|
@ -12,7 +31,6 @@ TCPConnectionProvider::TCPConnectionProvider(StatusDisplay *statusDisplay)
|
||||||
|
|
||||||
TCPConnectionProvider::~TCPConnectionProvider()
|
TCPConnectionProvider::~TCPConnectionProvider()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Stream* TCPConnectionProvider::getStream()
|
Stream* TCPConnectionProvider::getStream()
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "ConnectionProvider.h"
|
#include "ConnectionProvider.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include "AppLauncher.h"
|
#include "AppLauncher.h"
|
||||||
|
|
||||||
#include <AppleEvents.h>
|
#include <AppleEvents.h>
|
||||||
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/*
|
||||||
|
Copyright 2019 Wolfgang Thaller.
|
||||||
|
|
||||||
|
This file is part of Retro68.
|
||||||
|
|
||||||
|
Retro68 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 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Retro68 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 Retro68. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
class Window
|
class Window
|
||||||
|
|
|
@ -328,6 +328,7 @@ Currently, LaunchAPPL supports the following methods for launching Mac applicati
|
||||||
* ssh - Invoke the `LaunchAPPL` tool remotely via ssh
|
* ssh - Invoke the `LaunchAPPL` tool remotely via ssh
|
||||||
* serial - Connect to a real Mac running the `LaunchAPPLServer` application via a null modem cable
|
* serial - Connect to a real Mac running the `LaunchAPPLServer` application via a null modem cable
|
||||||
* tcp - Connect to a real Mac running the `LaunchAPPLServer` application via a completely insecure TCP connection
|
* tcp - Connect to a real Mac running the `LaunchAPPLServer` application via a completely insecure TCP connection
|
||||||
|
* shared - Communicate with `LaunchAPPLServer` via files in a shared folder
|
||||||
|
|
||||||
If you're running on a Mac that's old enough to use the `classic` or `carbon` backends,
|
If you're running on a Mac that's old enough to use the `classic` or `carbon` backends,
|
||||||
they will work out of the box, just launch an application as follows
|
they will work out of the box, just launch an application as follows
|
||||||
|
|
Loading…
Reference in New Issue