Fawkes API
Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * xmlrpc_thread.cpp - Thread that handles xml-rpc requests 00004 * 00005 * Created: Sun Aug 30 12:49:26 2009 00006 * Copyright 2006-2009 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. 00014 * 00015 * This program is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 * GNU Library General Public License for more details. 00019 * 00020 * Read the full text in the LICENSE.GPL file in the doc directory. 00021 */ 00022 00023 #include "xmlrpc_thread.h" 00024 #include "xmlrpc_processor.h" 00025 #include "methods/plugin.h" 00026 #include "methods/log.h" 00027 00028 #include <core/version.h> 00029 #include <webview/server.h> 00030 #include <webview/url_manager.h> 00031 #include <webview/request_dispatcher.h> 00032 00033 using namespace fawkes; 00034 00035 00036 /** @class XmlRpcThread "xmlrpc_thread.h" 00037 * XML-RPC Thread. 00038 * This thread runs the HTTP server and handles XML-RPC calls. 00039 * @author Tim Niemueller 00040 */ 00041 00042 00043 /** Constructor. */ 00044 XmlRpcThread::XmlRpcThread() 00045 : Thread("XmlRpcThread", Thread::OPMODE_CONTINUOUS), 00046 LoggerAspect(&__cache_logger) 00047 { 00048 set_prepfin_conc_loop(true); 00049 00050 } 00051 00052 00053 XmlRpcThread::~XmlRpcThread() 00054 { 00055 } 00056 00057 void 00058 XmlRpcThread::init() 00059 { 00060 try { 00061 __custom_server = config->get_bool("/xmlrpc/custom_server"); 00062 } catch (Exception &e) { 00063 __custom_server = false; 00064 } 00065 if (__custom_server) { 00066 __cfg_port = config->get_uint("/xmlrpc/port"); 00067 } 00068 00069 __cache_logger.clear(); 00070 00071 __processor = new XmlRpcRequestProcessor(logger); 00072 00073 xmlrpc_c::registry *registry = __processor->registry(); 00074 __plugin_methods = new XmlRpcPluginMethods(registry, plugin_manager, logger); 00075 __log_methods = new XmlRpcLogMethods(registry, &__cache_logger, logger); 00076 00077 if (__custom_server) { 00078 __url_manager = new WebUrlManager(); 00079 __dispatcher = new WebRequestDispatcher(__url_manager); 00080 __webserver = new WebServer(__cfg_port, __dispatcher); 00081 00082 logger->log_info("XmlRpcThread", "Listening for HTTP connections on port %u", 00083 __cfg_port); 00084 00085 __url_manager->register_baseurl("/", __processor); 00086 00087 __xmlrpc_service = new NetworkService(nnresolver, "Fawkes XML-RPC on %h", 00088 "_http._tcp", __cfg_port); 00089 __xmlrpc_service->add_txt("fawkesver=%u.%u.%u", FAWKES_VERSION_MAJOR, 00090 FAWKES_VERSION_MINOR, FAWKES_VERSION_MICRO); 00091 service_publisher->publish_service(__xmlrpc_service); 00092 } else { 00093 set_opmode(Thread::OPMODE_WAITFORWAKEUP); 00094 logger->log_info("XmlRpcThread", "Registering as /xmlrpc in webview"); 00095 webview_url_manager->register_baseurl("/xmlrpc", __processor); 00096 } 00097 00098 } 00099 00100 void 00101 XmlRpcThread::finalize() 00102 { 00103 if (__custom_server) { 00104 service_publisher->unpublish_service(__xmlrpc_service); 00105 delete __xmlrpc_service; 00106 00107 delete __webserver; 00108 delete __plugin_methods; 00109 delete __dispatcher; 00110 delete __url_manager; 00111 } else { 00112 webview_url_manager->unregister_baseurl("/xmlrpc"); 00113 } 00114 delete __processor; 00115 } 00116 00117 00118 void 00119 XmlRpcThread::loop() 00120 { 00121 if (__custom_server) { 00122 __webserver->process(); 00123 } else { 00124 00125 } 00126 }