src/proto2/Application.cc
author terom
Sat, 08 Nov 2008 18:02:58 +0000
changeset 21 32c6cc55256a
child 22 b70d30e1b0fe
permissions -rw-r--r--
change proto2 network code to use CL_NetSession
21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     1
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     2
#include "Engine.hh"
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     3
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     4
#include <stdexcept>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     5
#include <cassert>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     6
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     7
#include <ClanLib/core.h>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     8
#include <ClanLib/application.h>
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
     9
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    10
class ArgumentError : public std::exception {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    11
	private:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    12
		const char *message;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    13
	
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    14
	public:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    15
		ArgumentError (const std::string &message) : message(message.c_str()) { }
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    16
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    17
		virtual const char* what() const throw() {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    18
			return message;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    19
		}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    20
};
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    21
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    22
class Main : public CL_ClanApplication {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    23
	private:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    24
		// arguments
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    25
		CL_CommandLine args;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    26
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    27
		std::string arg_port;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    28
		bool arg_dedicated;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    29
		std::string arg_connect;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    30
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    31
		void parse_args (int argc, char **argv) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    32
			// set up the options
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    33
			args.add_option('p', "port", "PORT", "set network port used", true);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    34
			args.add_option('D', "dedicated", "", "act as a network server", true);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    35
			args.add_option('c', "connect", "SERVERHOST", "act as a network client", true);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    36
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    37
			// set defaults
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    38
			arg_port = NETWORK_PORT_STR;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    39
			arg_dedicated = false;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    40
			arg_connect = "";
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    41
			
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    42
			try {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    43
				// parse args
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    44
				args.parse_args(argc, argv);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    45
			} catch (CL_Error &e) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    46
				throw ArgumentError(e.message);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    47
			}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    48
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    49
			while (args.next()) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    50
				switch (args.get_key()) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    51
					case 'p':
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    52
						arg_port = args.get_argument();
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    53
						break;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    54
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    55
					case 'D':
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    56
						arg_dedicated = true;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    57
						break;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    58
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    59
					case 'c':
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    60
						arg_connect = args.get_argument();
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    61
						break;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    62
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    63
					case CL_CommandLine::REST_ARG:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    64
						throw ArgumentError(args.get_argument());
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    65
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    66
					default:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    67
						throw ArgumentError(std::string(1, (char) args.get_key()));
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    68
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    69
				}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    70
			}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    71
			
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    72
			// check for valid combinations of arugments
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    73
			if (arg_dedicated && !arg_connect.empty())
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    74
				throw ArgumentError("-D and -c are mutually exclusive");
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    75
			
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    76
			if (!arg_dedicated && arg_connect.empty())
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    77
				throw ArgumentError("nothing to do");
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    78
		}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    79
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    80
	public:
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    81
		virtual int main (int argc, char **argv) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    82
			// initialize core
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    83
			CL_SetupCore setup_core;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    84
			
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    85
			try {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    86
				// parse arugments
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    87
				parse_args(argc, argv);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    88
				
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    89
				// run engine based on args
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    90
				if (arg_dedicated) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    91
					Engine::runNetworkServer(arg_port);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    92
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    93
				} else if (!arg_connect.empty()) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    94
					Engine::runNetworkClient(arg_connect, arg_port);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    95
				
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    96
				} else
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    97
					assert(false);
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    98
				
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
    99
				// succesful return
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   100
				return 0;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   101
			
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   102
			} catch (ArgumentError &e) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   103
				std::cerr << e.what() << std::endl;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   104
				args.print_help();
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   105
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   106
				// XXX: handle --help
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   107
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   108
			} catch (std::exception &e) {
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   109
				std::cerr << e.what() << std::endl;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   110
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   111
				return 1;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   112
			}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   113
		}
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   114
} app;
32c6cc55256a change proto2 network code to use CL_NetSession
terom
parents:
diff changeset
   115