2024-05-14 02:14:13 +02:00

92 lines
2.3 KiB
C++

#ifndef _VNXPLAT_SIGNAL_H_
#define _VNXPLAT_SIGNAL_H_
namespace vn {
namespace xplat {
/// \brief Provides access to system signals.
class Signal
{
// Types //////////////////////////////////////////////////////////////////
public:
/// \brief The available signals.
enum SignalType
{
/// Unknown type of signal.
UNKNOWN,
/// User pressed <em>Ctrl-C</em>.
CTRL_C
};
/// \brief Typedef for a function that can handle signal notifications.
///
/// \param[in] signal The signal type received.
/// \return Indicates if the signal was handled or not.
typedef bool (*HandleSignalFunc)(Signal signal);
/// \brief Allows for other objects to listen for signal events.
class Observer
{
public:
virtual ~Observer() { }
/// \brief If an observer is registered via
/// \ref RegisterSignalObserver, whenever a signal is received,
/// this method will be called to alert the observer.
///
/// \param[in] signal The signal that was raised.
/// \return Indicates if the signal was handled or not.
virtual bool XSignalHandleSingle(SignalType signal) = 0;
protected:
Observer() { }
};
// Public Methods /////////////////////////////////////////////////////////
public:
/// \brief Allows registering to receive notifications of system signals.
///
/// \param[in] handleFunc Function to call when signals are received.
static void RegisterForSignalNotifications(
HandleSignalFunc handleFunc);
/// \brief Allows unregistering from receiving signal notifications.
///
/// \param[in] handleFunc The function to unregister.
static void UnregisterForSignalNotifications(
HandleSignalFunc handleFunc);
/// \brief Allows registering an observer for notification when a signal is
/// received.
///
/// \param[in] observer The observer to register.
static void RegisterSignalObserver(
Observer* observer);
/// \brief Allows unregistering of an observer from being notified when a
/// signal is received.
///
/// \param[in] observer The observer to unregister.
static void UnregisterSignalObserver(
Observer* observer);
// Private Members ////////////////////////////////////////////////////////
private:
// Contains internal data, mainly stuff that is required for cross-platform
// support.
struct Impl;
};
}
}
#endif