1 /* 2 * Copyright (C) 2006-2008 Marc Boris Duerner 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * As a special exception, you may use this file as part of a free 10 * software library without restriction. Specifically, if other files 11 * instantiate templates or use macros or inline functions from this 12 * file, or you compile this file and link it with other files to 13 * produce an executable, this file does not by itself cause the 14 * resulting executable to be covered by the GNU General Public 15 * License. This exception does not however invalidate any other 16 * reasons why the executable file might be covered by the GNU Library 17 * General Public License. 18 * 19 * This library is distributed in the hope that it will be useful, 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 * Lesser General Public License for more details. 23 * 24 * You should have received a copy of the GNU Lesser General Public 25 * License along with this library; if not, write to the Free Software 26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 27 */ 28 #ifndef CXXTOOLS_APPLICATION_H 29 #define CXXTOOLS_APPLICATION_H 30 31 #include <cxxtools/api.h> 32 #include <cxxtools/eventloop.h> 33 #include <cxxtools/application.h> 34 #include <cxxtools/connectable.h> 35 #include <cxxtools/event.h> 36 #include <cxxtools/signal.h> 37 38 namespace cxxtools { 39 40 class ApplicationImpl; 41 42 /** 43 * \brief The Application class provides an event loop for console applications 44 * without a GUI. 45 * 46 * This class is used by non-GUI applications to provide the applications's event 47 * loop. There should be only exactly one instance of Application (or one of its 48 * subclasses) per application. This is not ensured, though. 49 * 50 * Application contains the main event loop, where event sources can be registered 51 * and events from those sources are dispatched to listeners, that were registered 52 * to the event loop. Events may for example be operating system events (timer, file 53 * system changes). 54 * 55 * The application and therefore the event loop is started with a call to run() and 56 * can be exited with a call to exit(). After calling exit() the application should 57 * terminate. 58 * 59 * The event loop can be access by calling eventLoop(). Events can be committed by 60 * calling EventLoop::commitEvent(). Long running operations can call 61 * EventLoop::processEvents() to keep the application responsive. 62 * 63 * There are convenience methods available for easier access to functionality of 64 * the underlying event loop. commitEvent() delegates to EventLoop::commitEvent(), 65 * queueEvent() delegates to EventLoop::delegateEvent() and processEvents() delegates 66 * to EventLoop::processEvents() without making it necessary to first obtain the 67 * event loop manually. 68 */ 69 class CXXTOOLS_API Application : public Connectable 70 { 71 void construct(); 72 73 public: 74 Application(); 75 76 Application(int argc, char** argv); 77 78 Application(EventLoopBase* loop); 79 80 Application(EventLoopBase* loop, int argc, char** argv); 81 82 ~Application(); 83 84 static Application& instance(); 85 loop()86 EventLoopBase& loop() 87 { return *_loop; } 88 run()89 void run() 90 { _loop->run(); } 91 exit()92 void exit() 93 { _loop->exit(); } 94 95 bool catchSystemSignal(int sig); 96 97 bool raiseSystemSignal(int sig); 98 99 Signal<int> systemSignal; 100 argc()101 int argc() const 102 { return _argc; } 103 argv()104 char** argv() const 105 { return _argv; } 106 impl()107 ApplicationImpl& impl() 108 { return *_impl; } 109 110 protected: 111 void init(EventLoopBase& loop); 112 113 private: 114 ApplicationImpl* _impl; 115 int _argc; 116 char** _argv; 117 EventLoopBase* _loop; 118 EventLoop* _owner; 119 }; 120 121 } // namespace cxxtools 122 123 #endif 124