Fresco/Berlin/server server.cc,1.73,1.74
Tobias Hunger <[email protected]> Fri, 31 Oct 2003 22:33:42 +0000
| Newsgroups | gmane.comp.video.fresco.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvs/fresco/Fresco/Berlin/server In directory purcel:/tmp/cvs-serv28781/Berlin/server Modified Files: server.cc Log Message: Fix up indention according to the coding style guide. Index: server.cc =================================================================== RCS file: /cvs/fresco/Fresco/Berlin/server/server.cc,v retrieving revision 1.73 retrieving revision 1.74 diff -u -d -r1.73 -r1.74 --- server.cc 16 Sep 2003 18:06:09 -0000 1.73 +++ server.cc 31 Oct 2003 22:33:08 -0000 1.74 @@ -1,8 +1,8 @@ /*$Id$ * * This source file is a part of the Fresco Project. - * Copyright (C) 1999, 2000 Stefan Seefeld <[email protected]> - * Copyright (C) 1999 Graydon Hoare <[email protected]> + * Copyright (C) 1999, 2000 Stefan Seefeld <[email protected]> + * Copyright (C) 1999 Graydon Hoare <[email protected]> * http://www.fresco.org * * This library is free software; you can redistribute it and/or @@ -78,7 +78,7 @@ { Berlin::GraphDebugger * debugger; - struct Dump : Signal::Notifier + struct Dump : Signal::Notifier { private: Prague::Semaphore & my_semaphore; @@ -89,52 +89,53 @@ : my_semaphore(semaphore){} void notify(int signo) /*FOLD00*/ { - switch (signo) - { - case Signal::usr1: - if (debugger) - { - Logger::log(Logger::loader) - << "Starting scenegraph debugger." << std::endl; - debugger->debug(); - Logger::log(Logger::loader) - << "Scenegraph debugger run finished." << std::endl; - } - else - Logger::log(Logger::loader) - << "Debugger not activated on " - << "command line. Not entering debug mode." - << std::endl; - return; - case Signal::usr2: - if (Console::instance()) - { - Console::instance()->activate_autoplay(); - Console::instance()->wakeup(); - } - return; - case Signal::interrupt: break; - case Signal::hangup: Profiler::dump(std::cerr); break; - case Signal::abort: - case Signal::segv: + switch (signo) { - std::string output = "server.log"; - std::ofstream ofs(output.c_str()); - ofs << "I used to be version " << version - << " of the Fresco Display Server.\n\n"; - Logger::dump(ofs); - Tracer::dump(ofs); - std::cerr << "Something went wrong. '" << output - << "' contains a debugging log.\n" - << "Please mail this output to [email protected] " - << "(together with a description\n" - << "of your configuration and what you were doing" - << " before the crash).\n\n"; - exit(-1); // NOTE: Must exit after getting segv: - // behaviour is undefined if not! + case Signal::usr1: + if (debugger) + { + Logger::log(Logger::loader) + << "Starting scenegraph debugger." << std::endl; + debugger->debug(); + Logger::log(Logger::loader) + << "Scenegraph debugger run finished." << std::endl; + } + else + Logger::log(Logger::loader) + << "Debugger not activated on " + << "command line. Not entering debug mode." + << std::endl; + return; + case Signal::usr2: + if (Console::instance()) + { + Console::instance()->activate_autoplay(); + Console::instance()->wakeup(); + } + return; + case Signal::interrupt: break; + case Signal::hangup: Profiler::dump(std::cerr); break; + case Signal::abort: + case Signal::segv: + { + std::string output = "server.log"; + std::ofstream ofs(output.c_str()); + ofs << "I used to be version " << version + << " of the Fresco Display Server." + << std::endl << std::endl; + Logger::dump(ofs); + Tracer::dump(ofs); + std::cerr << "Something went wrong. '" << output + << "' contains a debugging log." << std::endl + << "Please mail this output to [email protected] " + << "(together with a description" << std::endl + << "of your configuration and what you were doing" + << " before the crash)." << std::endl << std::endl; + exit(-1); // NOTE: Must exit after getting segv: + // behaviour is undefined if not! + } } - } - my_semaphore.post(); + my_semaphore.post(); } }; @@ -147,40 +148,40 @@ child = new Fork(true, true); if (child->child()) { - std::vector<char*> args; - // Split 'value' into command and arguments for execvp - int start = 0, index = 0; - value.push_back('\0'); - while ( (index = value.find(' ', index)) != std::string::npos) - { - value[index] = '\0'; - args.push_back(&*value.begin() + start); - start = index + 1; - } - args.push_back(&*value.begin() + start); - args.push_back(0); - - // FIXME: Where should we log this to? - std::ostringstream oss; - oss << "Starting client "; - char fill_char = '\"'; - for (std::vector<char *>::const_iterator i = args.begin(); - i != args.end() && 0 != *i; - ++i) - { - std::string tmp(*i); - oss << fill_char << tmp; - fill_char = ' '; - } - oss << "\"" << std::endl; - Logger::log(Logger::loader) << oss.str(); - - // Execute command - execvp(args[0], &*args.begin()); - - // Should not get here - std::cerr << "ERROR: Client could not get started." << std::endl; - exit(100); + std::vector<char*> args; + // Split 'value' into command and arguments for execvp + int start = 0, index = 0; + value.push_back('\0'); + while ((index = value.find(' ', index)) != std::string::npos) + { + value[index] = '\0'; + args.push_back(&*value.begin() + start); + start = index + 1; + } + args.push_back(&*value.begin() + start); + args.push_back(0); + + // FIXME: Where should we log this to? + std::ostringstream oss; + oss << "Starting client "; + char fill_char = '\"'; + for (std::vector<char *>::const_iterator i = args.begin(); + i != args.end() && 0 != *i; + ++i) + { + std::string tmp(*i); + oss << fill_char << tmp; + fill_char = ' '; + } + oss << "\"" << std::endl; + Logger::log(Logger::loader) << oss.str(); + + // Execute command + execvp(args[0], &*args.begin()); + + // Should not get here + std::cerr << "ERROR: Client could not get started." << std::endl; + exit(100); } // Attempt to kill client on these signals child->suicide_on_signal(Signal::interrupt); @@ -197,11 +198,11 @@ { bool use_debugger = 0; // turn on scenegraph debugger? debugger = 0; - + // --------------------------------------------------------------- // Setup signalhandling // --------------------------------------------------------------- - + Prague::Semaphore sem; Dump *dump = new Dump(sem); Signal::set(Signal::usr1, dump); @@ -210,11 +211,11 @@ Signal::set(Signal::segv, dump); Signal::set(Signal::hangup, dump); Signal::set(Signal::interrupt, dump); - + // --------------------------------------------------------------- // Parse commandline arguments // --------------------------------------------------------------- - + GetOpt getopt(argv[0], "a fresco display server"); getopt.add('h', "help", GetOpt::novalue, "help message"); add_resolving_options_to_getopt(getopt); @@ -222,375 +223,375 @@ getopt.add('l', "logger", GetOpt::optional, "switch logging on"); getopt.add('t', "tracer", GetOpt::novalue, "switch tracing on"); getopt.add('D', "debug", GetOpt::novalue, - "switch on the SceneGraph Debugger."); + "switch on the SceneGraph Debugger."); getopt.add('p', "profiler", GetOpt::novalue, "switch profiling on"); getopt.add('d', "drawing", GetOpt::mandatory, "the DrawingKit to choose"); getopt.add('r', "resource", GetOpt::mandatory, - "the resource file to load"); + "the resource file to load"); getopt.add('e', "execute", GetOpt::mandatory, - "the command to execute upon startup"); - getopt.add('c', "console", GetOpt::mandatory, - "console to use (use -C for possible values)"); - getopt.add('C', "list-available-consoles", GetOpt::novalue, - "list known consoles"); - getopt.add('s', "pixels", GetOpt::mandatory, - "number of pixels (eg. '640x480')"); + "the command to execute upon startup"); + getopt.add('c', "console", GetOpt::mandatory, + "console to use (use -C for possible values)"); + getopt.add('C', "list-available-consoles", GetOpt::novalue, + "list known consoles"); + getopt.add('s', "pixels", GetOpt::mandatory, + "number of pixels (eg. '640x480')"); size_t argo = getopt.parse(argc, argv); argc -= argo; argv += argo; - - if (getopt.is_set("help")) - { - getopt.usage(); - return 0; + + if (getopt.is_set("help")) + { + getopt.usage(); + return 0; } - - if (getopt.is_set("version")) - { - std::cout << "version is " << version << std::endl; - return 0; + + if (getopt.is_set("version")) + { + std::cout << "version is " << version << std::endl; + return 0; } - + if (getopt.is_set("debug")) use_debugger = 1; - + std::string value; - + if (getopt.is_set("export-ref")) { - getopt.get("export-ref",&value); - set_server_reference_export_method(value); + getopt.get("export-ref",&value); + set_server_reference_export_method(value); } - + value=""; if (getopt.get("logger", &value)) { - if (!value.empty()) - { - std::istringstream iss(value); - std::ostringstream oss; - std::string token; - while (iss >> token) - { - if (token == "corba") Logger::set(Logger::corba); - else if (token == "lifecycle") Logger::set(Logger::lifecycle); - else if (token == "focus") Logger::set(Logger::focus); - else if (token == "image") Logger::set(Logger::image); - else if (token == "loader") Logger::set(Logger::loader); - else if (token == "console") Logger::set(Logger::console); - else if (token == "subject") Logger::set(Logger::subject); - else if (token == "layout") Logger::set(Logger::layout); - else if (token == "picking") Logger::set(Logger::picking); - else if (token == "drawing") Logger::set(Logger::drawing); - else if (token == "traversal") Logger::set(Logger::traversal); - else if (token == "widget") Logger::set(Logger::widget); - else if (token == "text") Logger::set(Logger::text); - else if (token == "desktop") Logger::set(Logger::desktop); - else token == ""; - - if (!token.empty()) oss << token << " "; - } - Logger::log(Logger::loader) << "Logging of types \"" - << oss.str() << "\" activated." - << std::endl; - } - else - { - Logger::setall(); - Logger::log(Logger::loader) << "Logging of all types activated." - << std::endl; - } + if (!value.empty()) + { + std::istringstream iss(value); + std::ostringstream oss; + std::string token; + while (iss >> token) + { + if (token == "corba") Logger::set(Logger::corba); + else if (token == "lifecycle") Logger::set(Logger::lifecycle); + else if (token == "focus") Logger::set(Logger::focus); + else if (token == "image") Logger::set(Logger::image); + else if (token == "loader") Logger::set(Logger::loader); + else if (token == "console") Logger::set(Logger::console); + else if (token == "subject") Logger::set(Logger::subject); + else if (token == "layout") Logger::set(Logger::layout); + else if (token == "picking") Logger::set(Logger::picking); + else if (token == "drawing") Logger::set(Logger::drawing); + else if (token == "traversal") Logger::set(Logger::traversal); + else if (token == "widget") Logger::set(Logger::widget); + else if (token == "text") Logger::set(Logger::text); + else if (token == "desktop") Logger::set(Logger::desktop); + else token == ""; + + if (!token.empty()) oss << token << " "; + } + Logger::log(Logger::loader) << "Logging of types \"" + << oss.str() << "\" activated." + << std::endl; + } + else + { + Logger::setall(); + Logger::log(Logger::loader) << "Logging of all types activated." + << std::endl; + } } - + // Load the berlin rc files RCManager::setup(getopt); - + if (getopt.is_set("tracer")) { - Tracer::logging(true); - Logger::log(Logger::loader) << "Tracing enabled." << std::endl; + Tracer::logging(true); + Logger::log(Logger::loader) << "Tracing enabled." << std::endl; } - + if (getopt.is_set("list-available-consoles")) { - std::cout << "Available consoles:" << std::endl; - Console::list_available(std::cout); - return 0; + std::cout << "Available consoles:" << std::endl; + Console::list_available(std::cout); + return 0; } - + #ifdef JPROF if (getopt.is_set("profiler")) { - setupProfilingStuff(); - Logger::log(Logger::loader) << "Profiling enabled." << std::endl; + setupProfilingStuff(); + Logger::log(Logger::loader) << "Profiling enabled." << std::endl; } #endif - + Fork *child = 0; - + Logger::log(Logger::loader) - << "Commandline arguments are parsed," - << " configuration is read in." << std::endl; - + << "Commandline arguments are parsed," + << " configuration is read in." << std::endl; + // --------------------------------------------------------------- // Setup CORBA // --------------------------------------------------------------- - + CORBA::ORB_var orb; try { - orb = CORBA::ORB_init(argc, argv); - PortableServer::POA_var poa = - resolve_init<PortableServer::POA>(orb, "RootPOA"); - PortableServer::POAManager_var pman = poa->the_POAManager(); - pman->activate(); - Logger::log(Logger::corba) << "Root POA is activated." << std::endl; - - CORBA::PolicyList policies; + orb = CORBA::ORB_init(argc, argv); + PortableServer::POA_var poa = + resolve_init<PortableServer::POA>(orb, "RootPOA"); + PortableServer::POAManager_var pman = poa->the_POAManager(); + pman->activate(); + Logger::log(Logger::corba) << "Root POA is activated." << std::endl; + + CORBA::PolicyList policies; #ifdef COLOCATION_OPTIMIZATION # if defined(ORB_omniORB) - { - // create a POA for global objects derived from ServantBase - policies.length(2); - policies[0] = poa->create_implicit_activation_policy(PortableServer::IMPLICIT_ACTIVATION); - CORBA::Any value; - value <<= omniPolicy::LOCAL_CALLS_SHORTCUT; - policies[1] = orb->create_policy(omniPolicy::LOCAL_SHORTCUT_POLICY_TYPE, - value); - poa = poa->create_POA("shortcut", pman, policies); - - // create a policy list to be used by kit specific POAs - policies.length(1); - policies[0] = orb->create_policy(omniPolicy::LOCAL_SHORTCUT_POLICY_TYPE, - value); - } + { + // create a POA for global objects derived from ServantBase + policies.length(2); + policies[0] = poa->create_implicit_activation_policy(PortableServer::IMPLICIT_ACTIVATION); + CORBA::Any value; + value <<= omniPolicy::LOCAL_CALLS_SHORTCUT; + policies[1] = orb->create_policy(omniPolicy::LOCAL_SHORTCUT_POLICY_TYPE, + value); + poa = poa->create_POA("shortcut", pman, policies); + + // create a policy list to be used by kit specific POAs + policies.length(1); + policies[0] = orb->create_policy(omniPolicy::LOCAL_SHORTCUT_POLICY_TYPE, + value); + } # elif defined(ORB_TAO) - // fillin TAO-specific initialisation here... + // fillin TAO-specific initialisation here... # endif - Logger::log(Logger::corba) << "Colocation optimization activated." - << std::endl; + Logger::log(Logger::corba) << "Colocation optimization activated." + << std::endl; #endif - - DefaultPOA::default_POA(poa); - - Logger::log(Logger::corba) << "Default POA set up." << std::endl; - - // --------------------------------------------------------------- - // Setup Babylon - // --------------------------------------------------------------- - - { - Prague::Path path = RCManager::get_path("babylonpath"); - Babylon::override_path(path[0]); - } - Logger::log(Logger::loader) << "Babylon path set." << std::endl; - - // --------------------------------------------------------------- - // Open the Console - // --------------------------------------------------------------- - - std::string pixels; - Fresco::PixelCoord x_pixels(640), y_pixels(480); - if (getopt.is_set("pixels")) - { - getopt.get("pixels",&pixels); - unsigned x_position = pixels.find("x"); - bool invalid_format = false; - if (x_position == std::string::npos) invalid_format = true; - else - { - std::stringstream s(pixels.substr(0,x_position)); - s >> x_pixels; - std::stringstream t(pixels.substr(x_position+1,pixels.size())); - t >> y_pixels; - } - if ((x_pixels <= 0) || (y_pixels <= 0)) invalid_format = true; - if (invalid_format) - { - std::cerr << "ERROR: Format of 'pixels' option should be:" - << std::endl - << " --pixels=800x600, with 800 and 600 replaced" - << "by the desired x and y values" - << std::endl; - exit(1); - } - } - - value = ""; - getopt.get("console", &value); - try { Console::open(value, argc, argv, poa, x_pixels, y_pixels); } - catch (const std::runtime_error &e) - { - std::cerr << "ERROR: Failed to open the Console \"" << value - << "\":\n\t" << e.what() << std::endl; - exit(2); - } - - Logger::log(Logger::console) - << "Console is initialized." << std::endl; - - // --------------------------------------------------------------- - // Construct Server and load it with kits - // --------------------------------------------------------------- - - // NOTE: currently pass default poa; ideally function would know - PortableServer::POA_var server_poa = get_server_poa(orb,poa); - ServerImpl * server = ServerImpl::create(server_poa, policies); - Logger::log(Logger::loader) << "Server created in server-POA" - << std::endl; - - Prague::Path path = RCManager::get_path("modulepath"); - for (Prague::Path::iterator i = path.begin(); i != path.end(); ++i) - server->scan(*i); - Logger::log(Logger::loader) << "Kits are loaded." << std::endl; - - // --------------------------------------------------------------- - // Setup default DrawingKit - // --------------------------------------------------------------- - - Kit::PropertySeq props; - props.length(1); - props[0].name = CORBA::string_dup("implementation"); - value = ""; - getopt.get("drawing", &value); - if (!value.empty()) - props[0].value = CORBA::string_dup(value.c_str()); - else props[0].value = CORBA::string_dup("LibArtDrawingKit"); - Logger::log(Logger::drawing) << "Trying to resolve DrawingKit \"" - << props[0].value << "\"" << std::endl; - DrawingKit_var drawing = - server->resolve<DrawingKit>("IDL:fresco.org/Fresco/DrawingKit:1.0", - props, poa); - Logger::log(Logger::drawing) - << "DrawingKit is resolved." << std::endl; + DefaultPOA::default_POA(poa); - if (CORBA::is_nil(drawing)) - { - std::cerr << "ERROR: Unable to open " - << "IDL:fresco.org/Fresco/DrawingKit:1.0" - << " with attribute " - << props[0].name << '=' << props[0].value - << std::endl; - exit(3); - } - Logger::log(Logger::drawing) - << "Drawing system is set up." << std::endl; - - // --------------------------------------------------------------- - // make a Screen graphic to hold this server's scene graph - // --------------------------------------------------------------- - - ScreenImpl *screen = new ScreenImpl(); - EventManager *emanager = - new EventManager(Controller_var(screen->_this()), - screen->allocation()); - ScreenManager *smanager = - new ScreenManager(Graphic_var(screen->_this()), - emanager, drawing); - screen->bind_managers(emanager, smanager); - - // make sure to setup the debugger before registering graphics! - if (use_debugger) - debugger = new Berlin::GraphDebugger(screen->_this()); - - Berlin::GraphicDictionary::instance()->add(screen->_this(), screen, - "Server/Screen"); - - Logger::log(Logger::loader) << "Screen is set up and managers are " - << "bound to it." << std::endl; - - props.length(0); - LayoutKit_var layout = - server->resolve<LayoutKit>("IDL:fresco.org/Fresco/LayoutKit:1.0", - props, poa); - Layout::Stage_var stage = layout->create_stage(); - DesktopImpl *desktop = new DesktopImpl(orb, stage, sem); - screen->body(Desktop_var(desktop->_this())); - screen->append_controller(Desktop_var(desktop->_this())); - Logger::log(Logger::layout) << "Desktop is created." << std::endl; - - server->set_singleton("IDL:fresco.org/Fresco/Desktop:1.0", - Desktop_var(desktop->_this())); - server->set_singleton("IDL:fresco.org/Fresco/DrawingKit:1.0", drawing); - Logger::log(Logger::loader) << "singletons set" << std::endl; - - // --------------------------------------------------------------- - // Start the server thread - start the client listener and - // publish it - // --------------------------------------------------------------- - - server->start(); - Logger::log(Logger::loader) << "Server started." << std::endl; - - Server_var server_ref = server->_this(); - publish_server(server_ref, getopt, orb); - - Logger::log(Logger::corba) << "Server location published." - << std::endl; - - // --------------------------------------------------------------- - // Start any clients specified using --execute - // --------------------------------------------------------------- - value = ""; - getopt.get("execute", &value); - if (!value.empty()) - { - exec_child(child, value); - Logger::log(Logger::loader) - << "Child process started." << std::endl; - } - - // --------------------------------------------------------------- - // Start ScreenManager thread - // --------------------------------------------------------------- - - smanager->start(); - Logger::log(Logger::loader) - << "ScreenManager is running." << std::endl; - - // --------------------------------------------------------------- - // Wait until we receive a request to shut down, then do so - // NOTE: server/smanager threads assumed to be shut-down implicitly - // --------------------------------------------------------------- - - Logger::log(Logger::loader) - << "Blocking waiting for shutdown request." << std::endl; - sem.wait(); - Logger::log(Logger::loader) - << "Starting server shutdown." << std::endl; - - unpublish_server(orb); - Logger::log(Logger::loader) << "Un-published Server." << std::endl; - - server->stop(); - Logger::log(Logger::loader) << "Server stopped." << std::endl; + Logger::log(Logger::corba) << "Default POA set up." << std::endl; + + // --------------------------------------------------------------- + // Setup Babylon + // --------------------------------------------------------------- + + { + Prague::Path path = RCManager::get_path("babylonpath"); + Babylon::override_path(path[0]); + } + + Logger::log(Logger::loader) << "Babylon path set." << std::endl; + + // --------------------------------------------------------------- + // Open the Console + // --------------------------------------------------------------- + + std::string pixels; + Fresco::PixelCoord x_pixels(640), y_pixels(480); + if (getopt.is_set("pixels")) + { + getopt.get("pixels",&pixels); + unsigned x_position = pixels.find("x"); + bool invalid_format = false; + if (x_position == std::string::npos) invalid_format = true; + else + { + std::stringstream s(pixels.substr(0,x_position)); + s >> x_pixels; + std::stringstream t(pixels.substr(x_position+1,pixels.size())); + t >> y_pixels; + } + if ((x_pixels <= 0) || (y_pixels <= 0)) invalid_format = true; + if (invalid_format) + { + std::cerr << "ERROR: Format of 'pixels' option should be:" + << std::endl + << " --pixels=800x600, with 800 and 600 replaced" + << "by the desired x and y values" + << std::endl; + exit(1); + } + } + + value = ""; + getopt.get("console", &value); + try { Console::open(value, argc, argv, poa, x_pixels, y_pixels); } + catch (const std::runtime_error &e) + { + std::cerr << "ERROR: Failed to open the Console \"" << value + << "\":\n\t" << e.what() << std::endl; + exit(2); + } + + Logger::log(Logger::console) + << "Console is initialized." << std::endl; + + // --------------------------------------------------------------- + // Construct Server and load it with kits + // --------------------------------------------------------------- + + // NOTE: currently pass default poa; ideally function would know + PortableServer::POA_var server_poa = get_server_poa(orb,poa); + ServerImpl * server = ServerImpl::create(server_poa, policies); + Logger::log(Logger::loader) << "Server created in server-POA" + << std::endl; + + Prague::Path path = RCManager::get_path("modulepath"); + for (Prague::Path::iterator i = path.begin(); i != path.end(); ++i) + server->scan(*i); + Logger::log(Logger::loader) << "Kits are loaded." << std::endl; + + // --------------------------------------------------------------- + // Setup default DrawingKit + // --------------------------------------------------------------- + + Kit::PropertySeq props; + props.length(1); + props[0].name = CORBA::string_dup("implementation"); + value = ""; + getopt.get("drawing", &value); + if (!value.empty()) + props[0].value = CORBA::string_dup(value.c_str()); + else props[0].value = CORBA::string_dup("LibArtDrawingKit"); + Logger::log(Logger::drawing) << "Trying to resolve DrawingKit \"" + << props[0].value << "\"" << std::endl; + DrawingKit_var drawing = + server->resolve<DrawingKit>("IDL:fresco.org/Fresco/DrawingKit:1.0", + props, poa); + Logger::log(Logger::drawing) + << "DrawingKit is resolved." << std::endl; + + if (CORBA::is_nil(drawing)) + { + std::cerr << "ERROR: Unable to open " + << "IDL:fresco.org/Fresco/DrawingKit:1.0" + << " with attribute " + << props[0].name << '=' << props[0].value + << std::endl; + exit(3); + } + Logger::log(Logger::drawing) + << "Drawing system is set up." << std::endl; + + // --------------------------------------------------------------- + // make a Screen graphic to hold this server's scene graph + // --------------------------------------------------------------- + + ScreenImpl *screen = new ScreenImpl(); + EventManager *emanager = + new EventManager(Controller_var(screen->_this()), + screen->allocation()); + ScreenManager *smanager = + new ScreenManager(Graphic_var(screen->_this()), + emanager, drawing); + screen->bind_managers(emanager, smanager); + + // make sure to setup the debugger before registering graphics! + if (use_debugger) + debugger = new Berlin::GraphDebugger(screen->_this()); + + Berlin::GraphicDictionary::instance()->add(screen->_this(), screen, + "Server/Screen"); + + Logger::log(Logger::loader) << "Screen is set up and managers are " + << "bound to it." << std::endl; + + props.length(0); + LayoutKit_var layout = + server->resolve<LayoutKit>("IDL:fresco.org/Fresco/LayoutKit:1.0", + props, poa); + Layout::Stage_var stage = layout->create_stage(); + DesktopImpl *desktop = new DesktopImpl(orb, stage, sem); + screen->body(Desktop_var(desktop->_this())); + screen->append_controller(Desktop_var(desktop->_this())); + Logger::log(Logger::layout) << "Desktop is created." << std::endl; + + server->set_singleton("IDL:fresco.org/Fresco/Desktop:1.0", + Desktop_var(desktop->_this())); + server->set_singleton("IDL:fresco.org/Fresco/DrawingKit:1.0", drawing); + Logger::log(Logger::loader) << "singletons set" << std::endl; + + // --------------------------------------------------------------- + // Start the server thread - start the client listener and + // publish it + // --------------------------------------------------------------- + + server->start(); + Logger::log(Logger::loader) << "Server started." << std::endl; + + Server_var server_ref = server->_this(); + publish_server(server_ref, getopt, orb); + + Logger::log(Logger::corba) << "Server location published." + << std::endl; + + // --------------------------------------------------------------- + // Start any clients specified using --execute + // --------------------------------------------------------------- + value = ""; + getopt.get("execute", &value); + if (!value.empty()) + { + exec_child(child, value); + Logger::log(Logger::loader) + << "Child process started." << std::endl; + } + + // --------------------------------------------------------------- + // Start ScreenManager thread + // --------------------------------------------------------------- + + smanager->start(); + Logger::log(Logger::loader) + << "ScreenManager is running." << std::endl; + + // --------------------------------------------------------------- + // Wait until we receive a request to shut down, then do so + // NOTE: server/smanager threads assumed to be shut-down implicitly + // --------------------------------------------------------------- + + Logger::log(Logger::loader) + << "Blocking waiting for shutdown request." << std::endl; + sem.wait(); + Logger::log(Logger::loader) + << "Starting server shutdown." << std::endl; + + unpublish_server(orb); + Logger::log(Logger::loader) << "Un-published Server." << std::endl; + + server->stop(); + Logger::log(Logger::loader) << "Server stopped." << std::endl; } catch (const CORBA::SystemException &e) { - std::cerr << "ERROR: Unexpected CORBA::System exception caught: " - << e << std::endl; + std::cerr << "ERROR: Unexpected CORBA::System exception caught: " + << e << std::endl; } #ifdef ORB_omniORB catch(const omniORB::fatalException &fe) { - std::cerr << "ERROR: OmniORB fatal exception caught at " - << fe.file() << " " << fe.line() << ":" - << fe.errmsg() << std::endl; + std::cerr << "ERROR: OmniORB fatal exception caught at " + << fe.file() << " " << fe.line() << ":" + << fe.errmsg() << std::endl; } #endif catch (const CORBA::Exception &e) { - std::cerr << "ERROR: Unexpected CORBA::Exception caught: " - << e << std::endl; + std::cerr << "ERROR: Unexpected CORBA::Exception caught: " + << e << std::endl; } catch (const std::exception &e) { - std::cerr << "ERROR: Unexpected std::exception: " - << e.what() << std::endl; + std::cerr << "ERROR: Unexpected std::exception: " + << e.what() << std::endl; } catch (...) { - std::cerr << "ERROR: *UNKNOWN* exception caught" << std::endl; + std::cerr << "ERROR: *UNKNOWN* exception caught" << std::endl; } Logger::log(Logger::corba) << "CORBA servants gone." << std::endl; @@ -599,4 +600,3 @@ return 0; } -