src/proto2/Application.cc
changeset 25 af75a1894a32
parent 24 b81cb670e6b2
child 35 e21cfda0edde
equal deleted inserted replaced
24:b81cb670e6b2 25:af75a1894a32
    21 
    21 
    22 class Main : public CL_ClanApplication {
    22 class Main : public CL_ClanApplication {
    23     private:
    23     private:
    24         // arguments
    24         // arguments
    25         CL_CommandLine args;
    25         CL_CommandLine args;
    26 
    26         
       
    27         bool arg_graphics;
    27         std::string arg_port;
    28         std::string arg_port;
    28         bool arg_dedicated;
    29         bool arg_server;
    29         std::string arg_connect;
    30         std::string arg_connect;
    30 
    31 
    31         void parse_args (int argc, char **argv) {
    32         void parse_args (int argc, char **argv) {
    32             // set up the options
    33             // set up the options
    33             args.add_option('p', "port", "PORT", "set network port used", true);
    34             args.add_option('p', "port", "PORT", "set network port used", true);
    34             args.add_option('D', "dedicated", "", "act as a network server", true);
    35             args.add_option('s', "server", "", "act as a network server", true);
    35             args.add_option('c', "connect", "SERVERHOST", "act as a network client", true);
    36             args.add_option('c', "client", "SERVERHOST", "act as a network client", true);
       
    37             args.add_option('g', "graphics", "", "run graphics/local input. Implied with --connect", true);
    36 
    38 
    37             // set defaults
    39             // set defaults
       
    40             arg_graphics = false;
    38             arg_port = NETWORK_PORT_STR;
    41             arg_port = NETWORK_PORT_STR;
    39             arg_dedicated = false;
    42             arg_server = false;
    40             arg_connect = "";
    43             arg_connect = "";
    41             
    44             
    42             try {
    45             try {
    43                 // parse args
    46                 // parse args
    44                 args.parse_args(argc, argv);
    47                 args.parse_args(argc, argv);
       
    48 
    45             } catch (CL_Error &e) {
    49             } catch (CL_Error &e) {
    46                 throw ArgumentError(e.message);
    50                 throw ArgumentError(e.message);
    47             }
    51             }
    48 
    52 
    49             while (args.next()) {
    53             while (args.next()) {
    50                 switch (args.get_key()) {
    54                 switch (args.get_key()) {
    51                     case 'p':
    55                     case 'p':
    52                         arg_port = args.get_argument();
    56                         arg_port = args.get_argument();
    53                         break;
    57                         break;
    54 
    58 
    55                     case 'D':
    59                     case 's':
    56                         arg_dedicated = true;
    60                         arg_server = true;
    57                         break;
    61                         break;
    58 
    62 
    59                     case 'c':
    63                     case 'c':
    60                         arg_connect = args.get_argument();
    64                         arg_connect = args.get_argument();
       
    65                         arg_graphics = true;
       
    66                         break;
       
    67 
       
    68                     case 'g':
       
    69                         arg_graphics = true;
    61                         break;
    70                         break;
    62 
    71 
    63                     case CL_CommandLine::REST_ARG:
    72                     case CL_CommandLine::REST_ARG:
    64                         throw ArgumentError(args.get_argument());
    73                         throw ArgumentError(args.get_argument());
    65 
    74 
    68 
    77 
    69                 }
    78                 }
    70             }
    79             }
    71             
    80             
    72             // check for valid combinations of arugments
    81             // check for valid combinations of arugments
    73             if (arg_dedicated && !arg_connect.empty())
    82             if (!(arg_server xor !arg_connect.empty()))
    74                 throw ArgumentError("-D and -c are mutually exclusive");
    83                 throw ArgumentError("must supply *exactly* one of --server/--client");
    75             
       
    76             if (!arg_dedicated && arg_connect.empty())
       
    77                 throw ArgumentError("nothing to do");
       
    78         }
    84         }
    79 
    85 
    80     public:
    86     public:
    81         virtual int main (int argc, char **argv) {
    87         virtual int main (int argc, char **argv) {
    82             // initialize core
    88             // initialize the ClanLib components that we use
    83             CL_SetupCore setup_core;
    89             CL_SetupCore setup_core;
    84             
    90             CL_SetupNetwork setup_network;
       
    91             CL_SetupDisplay setup_disp;
       
    92             CL_SetupGL setup_gl;
       
    93 
    85             try {
    94             try {
    86                 // parse arugments
    95                 // parse arugments
    87                 parse_args(argc, argv);
    96                 parse_args(argc, argv);
       
    97 
       
    98                 // our engine
       
    99                 Engine engine;
    88                 
   100                 
    89                 // run engine based on args
   101                 // setup graphics
    90                 if (arg_dedicated) {
   102                 if (arg_graphics)
    91                     Engine::runNetworkServer(arg_port);
   103                     engine.setupGraphics();
       
   104 
       
   105                 // setup either network server or client
       
   106                 if (arg_server) {
       
   107                     engine.setupNetworkServer(arg_port);
    92 
   108 
    93                 } else if (!arg_connect.empty()) {
   109                 } else if (!arg_connect.empty()) {
    94                     Engine::runNetworkClient(arg_connect, arg_port);
   110                     engine.setupNetworkClient(arg_connect, arg_port);
    95                 
   111                 
    96                 } else
   112                 } else
    97                     assert(false);
   113                     assert(false);
       
   114 
       
   115                 // run the main loop
       
   116                 engine.run();
    98                 
   117                 
    99                 // succesful return
   118                 // succesful return
   100                 return 0;
   119                 return 0;
   101             
   120             
   102             } catch (ArgumentError &e) {
   121             } catch (ArgumentError &e) {