Fawkes API  Fawkes Development Version
xmlrpc_thread.cpp
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 }