Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-02-05 00:41:59 +0000
committerStijn Buys <ingar@osirion.org>2008-02-05 00:41:59 +0000
commit8ee5d47d7e1336eb69064ca31e27bbfa7d86b51e (patch)
treeb4ac5b825a118e8c88f4003603bca231ea3bc8bb /src/core/application.cc
parente63d8bec31ad067efb7aafd1c798bcdab8db8faf (diff)
renamed ApplicationInterface to Application
Diffstat (limited to 'src/core/application.cc')
-rw-r--r--src/core/application.cc198
1 files changed, 198 insertions, 0 deletions
diff --git a/src/core/application.cc b/src/core/application.cc
new file mode 100644
index 0000000..810bacb
--- /dev/null
+++ b/src/core/application.cc
@@ -0,0 +1,198 @@
+/*
+ core/application.cc
+ This file is part of the Osirion project and is distributed under
+ the terms of the GNU General Public License version 2
+*/
+
+#include "core/core.h"
+#include "filesystem/filesystem.h"
+#include "sys/sys.h"
+
+#include <iostream>
+#include <errno.h>
+#include <signal.h>
+
+namespace core
+{
+
+// --------------- function repository ------------------------------
+extern "C" void func_print(std::stringstream &args)
+{
+ char text[MAXCMDSIZE];
+ // FIXME leading space
+ if (args.getline(text, MAXCMDSIZE))
+ con_print << text << std::endl;
+}
+
+extern "C" void func_help(std::stringstream &args)
+{
+ con_print << "This is the help function" << std::endl;
+}
+
+extern "C" void func_quit(std::stringstream &args)
+{
+ if (Application::instance()) {
+ Application::instance()->shutdown();
+ Application::instance()->quit(0);
+ }
+}
+
+extern "C" void func_connect(std::stringstream &args)
+{
+ if (Application::instance())
+ Application::instance()->connect();
+}
+
+extern "C" void func_disconnect(std::stringstream &args)
+{
+ if (Application::instance())
+ Application::instance()->disconnect();
+}
+
+// --------------- signal_handler -----------------------------------
+
+extern "C" void signal_handler(int signum)
+{
+ switch (signum) {
+ case SIGHUP:
+ case SIGINT:
+ case SIGQUIT:
+ case SIGTERM:
+ if (Application::instance()) {
+ con_warn << "received signal " << signum << ", shutting down..." << std::endl;
+ Application::instance()->shutdown();
+ Application::instance()->quit(0);
+ } else {
+ std::cerr << "received signal " << signum << ", terminated..." << std::endl;
+ sys::quit(1);
+ }
+ break;
+ default:
+ std::cerr << "received signal " << signum << ", terminated..." << std::endl;
+ sys::quit(1);
+ break;
+ }
+}
+
+// --------------- Application -----------------------------
+
+Application *Application::application_instance = 0;
+
+Application::Application()
+{
+ if (application_instance) {
+ std::cerr << "multiple core::Application instances!" << std::endl;
+ sys::quit(2);
+ }
+ application_instance = this;
+
+ sys::signal(SIGHUP, signal_handler);
+ sys::signal(SIGINT, signal_handler);
+ sys::signal(SIGQUIT, signal_handler);
+ sys::signal(SIGTERM, signal_handler);
+}
+
+Application::~Application()
+{
+ application_instance = 0;
+}
+
+Application *Application::instance()
+{
+ return application_instance;
+}
+
+void Application::init()
+{
+ con_print << "Initializing core..." << std::endl;
+ con_debug << "Debug messages enabled" << std::endl;
+
+ // initialize core subsystems
+ filesystem::init();
+
+ // register our functions
+ func::add("print", func_print);
+ func::add("help", func_help);
+ func::add("quit", func_quit);
+
+ func::add("connect", func_connect);
+ func::add("disconnect", func_disconnect);
+
+ if (game())
+ game()->connected = false;
+ else
+ con_warn << "No game module loaded!" << std::endl;
+ current_time = 0;
+}
+
+void Application::shutdown()
+{
+ con_print << "Shutting down core..." << std::endl;
+
+ if (game())
+ if (game()->connected)
+ disconnect();
+ else
+ con_warn << "No game module loaded!" << std::endl;
+
+ filesystem::shutdown();
+}
+
+void Application::quit(int status)
+{
+ sys::quit(status);
+}
+
+void Application::connect()
+{
+ if (!game()) {
+ con_warn << "No game module loaded!" << std::endl;
+ return;
+ }
+
+ if (game()->connected) {
+ con_warn << "Connected. Disconnect first." << std::endl;
+ }
+
+ game()->current_time = 0;
+ if (game()->connected = game()->init()) {
+ con_print << "Connected." << std::endl;
+ } else {
+ con_warn << "Connect failed." << std::endl;
+ }
+}
+
+void Application::disconnect()
+{
+ if (!game()) {
+ con_warn << "No game module loaded!" << std::endl;
+ return;
+ }
+
+ if (!game()->connected) {
+ con_warn << "Not connected." << std::endl;
+ return;
+ }
+
+ game()->shutdown();
+
+ game()->connected = false;
+ game()->current_time = 0;
+
+ con_print << "Disconnected." << std::endl;
+}
+
+void Application::frame(float seconds)
+{
+ current_time += seconds;
+
+ if (game() && game()->connected) {
+ game()->current_time += seconds;
+ game()->frame(seconds);
+ }
+
+ // execute commands in the buffer
+ commandbuffer::execute();
+}
+
+}