⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 application.h

📁 C++ class libraries for network-centric, portable applications, integrated perfectly with the C++ St
💻 H
字号:
//// Application.h//// $Id: //poco/1.2/Util/include/Poco/Util/Application.h#2 $//// Library: Util// Package: Application// Module:  Application//// Definition of the Application class.//// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.// and Contributors.//// Permission is hereby granted, free of charge, to any person or organization// obtaining a copy of the software and accompanying documentation covered by// this license (the "Software") to use, reproduce, display, distribute,// execute, and transmit the Software, and to prepare derivative works of the// Software, and to permit third-parties to whom the Software is furnished to// do so, all subject to the following:// // The copyright notices in the Software and this entire statement, including// the above license grant, this restriction and the following disclaimer,// must be included in all copies of the Software, in whole or in part, and// all derivative works of the Software, unless such copies or derivative// works are solely in the form of machine-executable object code generated by// a source language processor.// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER// DEALINGS IN THE SOFTWARE.//#ifndef Util_Application_INCLUDED#define Util_Application_INCLUDED#include "Poco/Util/Util.h"#include "Poco/Util/Subsystem.h"#include "Poco/Util/LayeredConfiguration.h"#include "Poco/Util/OptionSet.h"#include "Poco/AutoPtr.h"#include "Poco/Logger.h"#include "Poco/Path.h"#include "Poco/Timestamp.h"#include "Poco/Timespan.h"#include <vector>namespace Poco {namespace Util {class OptionSet;class Util_API Application: public Subsystem	/// The Application class implements the main subsystem	/// in a process. The application class is responsible for	/// initializing all its subsystems.	///	/// Subclasses can and should override the following virtual methods:	///   - initialize() (the one-argument, protected variant)	///   - uninitialize()	///   - reinitialize()	///   - defineOptions()	///   - handleOption()	///   - main()	///	/// The application's main logic should be implemented in	/// the main() method.	///	/// There may be at most one instance of the Application class	/// in a process.	///	/// The Application class sets a few default properties in 	/// its configuration (available via the config() method).	/// These are:	///   - application.path: the absolute path to application executable	///   - application.name: the file name of the application executable	///   - application.baseName: the file name (excluding extension) of the application executable	///   - application.dir: the path to the directory where the application executable resides	///   - application.configDir: the path to the directory where the last configuration file loaded with loadConfiguration() was found.	/// If loadConfiguration() has never been called, application.configDir will be equal to application.dir.	///	/// The POCO_APP_MAIN macro can be used to implement main(argc, argv).	/// If POCO has been built with POCO_WIN32_UTF8, POCO_APP_MAIN supports	/// Unicode command line arguments.{public:	enum ExitCode		/// Commonly used exit status codes.		/// Based on the definitions in the 4.3BSD <sysexits.h> header file.	{		EXIT_OK          = 0,  /// successful termination		EXIT_USAGE	     = 64, /// command line usage error		EXIT_DATAERR     = 65, /// data format error		EXIT_NOINPUT     = 66, /// cannot open input		EXIT_NOUSER      = 67, /// addressee unknown		EXIT_NOHOST      = 68, /// host name unknown		EXIT_UNAVAILABLE = 69, /// service unavailable		EXIT_SOFTWARE    = 70, /// internal software error		EXIT_OSERR	     = 71, /// system error (e.g., can't fork)		EXIT_OSFILE      = 72, /// critical OS file missing		EXIT_CANTCREAT   = 73, /// can't create (user) output file		EXIT_IOERR       = 74, /// input/output error		EXIT_TEMPFAIL    = 75, /// temp failure; user is invited to retry		EXIT_PROTOCOL    = 76, /// remote error in protocol		EXIT_NOPERM      = 77, /// permission denied		EXIT_CONFIG      = 78  /// configuration error	};		Application();		/// Creates the Application.	Application(int argc, char* argv[]);		/// Creates the Application and calls init(argc, argv).	void addSubsystem(Subsystem* pSubsystem);		/// Adds a new subsystem to the application. The		/// application immediately takes ownership of it, so that a		/// call in the form		///     Application::instance().addSubsystem(new MySubsystem);		/// is okay.	void init(int argc, char* argv[]);		/// Initializes the application and all registered subsystems,		/// using the given command line arguments.#if defined(POCO_WIN32_UTF8)	void init(int argc, wchar_t* argv[]);		/// Initializes the application and all registered subsystems,		/// using the given command line arguments.		///		/// This Windows-specific version of init is used for passing		/// Unicode command line arguments from wmain().#endif	void init(const std::vector<std::string>& args);		/// Initializes the application and all registered subsystems,		/// using the given command line arguments.	bool initialized() const;		/// Returns true iff the application is in initialized state		/// (that means, has been initialized but not yet uninitialized).	void setUnixOptions(bool flag);		/// Specify whether command line option handling is Unix-style		/// (flag == true; default) or Windows/OpenVMS-style (flag == false).	int loadConfiguration();		/// Loads configuration information from a default location.		///		/// The configuration file(s) must be located in the same directory		/// as the executable or a parent directory of it, and must have the 		/// same base name as the executable, with one of the following extensions:		/// .properties, .ini or .xml.		///		/// The .properties file, if it exists, is loaded first, followed		/// by the .ini file and the .xml file.		///		/// If the application is built in debug mode (the _DEBUG preprocessor		/// macro is defined) and the base name of the appication executable		/// ends with a 'd', a config file without the 'd' ending its base name is 		/// also found.		/// 		/// Example: Given the application "SampleAppd.exe", built in debug mode.		/// Then loadConfiguration() will automatically find a configuration file		/// named "SampleApp.properties" if it exists and if "SampleAppd.properties"		/// cannot be found.		///		/// Returns the number of configuration files loaded, which may be zero.		///		/// This method must not be called before initialize(argc, argv)		/// has been called.	void loadConfiguration(const std::string& path);		/// Loads configuration information from the file specified by		/// the given path. The file type is determined by the file		/// extension. The following extensions are supported:		///   - .properties - properties file (PropertyFileConfiguration)		///   - .ini        - initialization file (IniFileConfiguration)		///   - .xml        - XML file (XMLConfiguration)		///		/// Extensions are not case sensitive.	template <class C> C& getSubsystem() const;		/// Returns a reference to the subsystem of the class		/// given as template argument.		///		/// Throws a NotFoundException if such a subsystem has		/// not been registered.	virtual int run();		/// Runs the application by performing additional initializations		/// and calling the main() method.	std::string commandName() const;		/// Returns the command name used to invoke the application.	LayeredConfiguration& config() const;		/// Returns the application's configuration.			Poco::Logger& logger() const;		/// Returns the application's logger.		///		/// Before the logging subsystem has been initialized, the		/// application's logger is "ApplicationStartup", which is		/// connected to a ConsoleChannel.		///		/// After the logging subsystem has been initialized, which 		/// usually happens as the first action in Application::initialize(),		/// the application's logger is the one specified by the		/// "application.logger" configuration property. If that property		/// is not specified, the logger is "Application".			const OptionSet& options() const;		/// Returns the application's option set.	static Application& instance();		/// Returns a reference to the Application singleton.		///		/// Throws a NullPointerException if no Application instance exists.	const Poco::Timestamp& startTime() const;		/// Returns the application start time (UTC).	Poco::Timespan uptime() const;		/// Returns the application uptime.			void stopOptionsProcessing();		/// If called from an option callback, stops all further		/// options processing.		///		/// If called, the following options on the command line		/// will not be processed, and required options will not		/// be checked.		///		/// This is useful, for example, if an option for displaying		/// help information has been encountered and no other things		/// besides displaying help shall be done.	const char* name() const;protected:	void initialize(Application& self);		/// Initializes the application and all registered subsystems.		/// Subsystems are always initialized in the exact same order		/// in which they have been registered.		///		/// Overriding implementations must call the base class implementation.			void uninitialize();		/// Uninitializes the application and all registered subsystems.		/// Subsystems are always uninitialized in reverse order in which		/// they have been initialized. 		///		/// Overriding implementations must call the base class implementation.	void reinitialize(Application& self);		/// Re-nitializes the application and all registered subsystems.		/// Subsystems are always reinitialized in the exact same order		/// in which they have been registered.		///		/// Overriding implementations must call the base class implementation.	virtual void defineOptions(OptionSet& options);		/// Called before command line processing begins.		/// If a subclass wants to support command line arguments,		/// it must override this method.		/// The default implementation does not define any options.		///		/// Overriding implementations should call the base class implementation.	virtual void handleOption(const std::string& name, const std::string& value);		/// Called when the option with the given name is encountered		/// during command line arguments processing.		///		/// The default implementation does option validation, bindings		/// and callback handling.		///		/// Overriding implementations must call the base class implementation.	void setLogger(Poco::Logger& logger);		/// Sets the logger used by the application.	virtual int main(const std::vector<std::string>& args);		/// The application's main logic.		///		/// Unprocessed command line arguments are passed in args.		/// Note that all original command line arguments are available		/// via the properties application.argc and application.argv[<n>].		///		/// Returns an exit code which should be one of the values		/// from the ExitCode enumeration.	bool findFile(Poco::Path& path) const;		/// Searches for the file in path in the application directory.		///		/// If path is absolute, the method immediately returns true and		/// leaves path unchanged.		///		/// If path is relative, searches for the file in the application		/// directory and in all subsequent parent directories.		/// Returns true and stores the absolute path to the file in		/// path if the file could be found. Returns false and leaves path		/// unchanged otherwise.	void init();		/// Common initialization code.	~Application();		/// Destroys the Application and deletes all registered subsystems.private:	void setup();	void setArgs(int argc, char* argv[]);	void setArgs(const std::vector<std::string>& args);	void getApplicationPath(Poco::Path& path) const;	void processOptions();	bool findAppConfigFile(const std::string& appName, const std::string& extension, Poco::Path& path) const;	typedef Poco::AutoPtr<Subsystem> SubsystemPtr;	typedef std::vector<SubsystemPtr> SubsystemVec;	typedef Poco::AutoPtr<LayeredConfiguration> ConfigPtr;	typedef std::vector<std::string> ArgVec;		ConfigPtr       _pConfig;	SubsystemVec    _subsystems;	bool            _initialized;	std::string     _command;	ArgVec          _args;	OptionSet       _options;	bool            _unixOptions;	Poco::Logger*   _pLogger;	Poco::Timestamp _startTime;	bool            _stopOptionsProcessing;	static Application* _pInstance;		friend class LoggingSubsystem;};//// inlines//template <class C> C& Application::getSubsystem() const{	for (SubsystemVec::const_iterator it = _subsystems.begin(); it != _subsystems.end(); ++it)	{		if (dynamic_cast<C*>(*it))			return **it;	}	throw Poco::NotFoundException("The subsystem has not been registered");}inline bool Application::initialized() const{	return _initialized;}inline LayeredConfiguration& Application::config() const{	return *const_cast<LayeredConfiguration*>(_pConfig.get());}inline Poco::Logger& Application::logger() const{	poco_check_ptr (_pLogger);	return *_pLogger;}inline const OptionSet& Application::options() const{	return _options;}inline Application& Application::instance(){	poco_check_ptr (_pInstance);	return *_pInstance;}inline const Poco::Timestamp& Application::startTime() const{	return _startTime;}inline Poco::Timespan Application::uptime() const{	Poco::Timestamp now;	Poco::Timespan uptime = now - _startTime;		return uptime;}} } // namespace Poco::Util//// Macro to implement main()//#if defined(POCO_WIN32_UTF8)	#define POCO_APP_MAIN(App) \	int wmain(int argc, wchar_t** argv)		\	{										\		AutoPtr<App> pApp = new App;		\		try									\		{									\			pApp->init(argc, argv);			\		}									\		catch (Poco::Exception& exc)		\		{									\			pApp->logger().log(exc);		\			return Application::EXIT_CONFIG;\		}									\		return pApp->run();					\	}#else	#define POCO_APP_MAIN(App) \	int main(int argc, char** argv)			\	{										\		AutoPtr<App> pApp = new App;		\		try									\		{									\			pApp->init(argc, argv);			\		}									\		catch (Poco::Exception& exc)		\		{									\			pApp->logger().log(exc);		\			return Application::EXIT_CONFIG;\		}									\		return pApp->run();					\	}#endif#endif // Util_Application_INCLUDED

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -