?? application.h
字號(hào):
//
// Application.h
//
// $Id: //poco/Main/Util/include/Util/Application.h#4 $
//
// Definition of the Application class.
//
// Copyright (c) 2004-2005, Guenter Obiltschnig/Applied Informatics.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Redistributions in any form must be accompanied by information on
// how to obtain complete source code for this software and any
// accompanying software that uses this software. The source code
// must either be included in the distribution or be available for no
// more than the cost of distribution plus a nominal fee, and must be
// freely redistributable under reasonable conditions. For an
// executable file, complete source code means the source code for all
// modules it contains. It does not include source code for modules or
// files that typically accompany the major components of the operating
// system on which the executable file runs.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
#ifndef Util_Application_INCLUDED
#define Util_Application_INCLUDED
#ifndef Util_Util_INCLUDED
#include "Util/Util.h"
#endif
#ifndef Util_Subsystem_INCLUDED
#include "Util/Subsystem.h"
#endif
#ifndef Util_LayeredConfiguration_INCLUDED
#include "Util/LayeredConfiguration.h"
#endif
#ifndef Util_OptionSet_INCLUDED
#include "Util/OptionSet.h"
#endif
#ifndef Foundation_AutoPtr_INCLUDED
#include "Foundation/AutoPtr.h"
#endif
#ifndef Foundation_Logger_INCLUDED
#include "Foundation/Logger.h"
#endif
#ifndef Foundation_Path_INCLUDED
#include "Foundation/Path.h"
#endif
#ifndef STD_VECTOR_INCLUDED
#include <vector>
#define STD_VECTOR_INCLUDED
#endif
Util_BEGIN
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()
/// - handleOptions()
/// - 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.
{
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 initialize(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.
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, 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.
///
/// 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.
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.
Foundation::Logger& logger() const;
/// Returns the application's logger.
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 char* name() const;
protected:
void initialize(const 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(const 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 nothing.
///
/// Overriding implementations should call the base class implementation.
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.
~Application();
/// Destroys the Application and deletes all registered subsystems.
private:
void setup();
void setArgs(int argc, char* argv[]);
void getApplicationPath(Foundation::Path& path);
void processOptions();
typedef Foundation::AutoPtr<Subsystem> SubsystemPtr;
typedef std::vector<SubsystemPtr> SubsystemVec;
typedef Foundation::AutoPtr<LayeredConfiguration> ConfigPtr;
typedef std::vector<std::string> ArgVec;
ConfigPtr _pConfig;
SubsystemVec _subsystems;
bool _initialized;
std::string _command;
ArgVec _args;
OptionSet _options;
bool _unixOptions;
Foundation::Logger& _logger;
static Application* _pInstance;
};
//
// 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 Foundation::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 Foundation::Logger& Application::logger() const
{
return _logger;
}
inline const OptionSet& Application::options() const
{
return _options;
}
inline Application& Application::instance()
{
poco_check_ptr (_pInstance);
return *_pInstance;
}
Util_END
#endif // Util_Application_INCLUDED
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -