2025-01-22 17:22:38 +01:00

120 lines
3.9 KiB
C

/*
* libwebsockets - small server side websockets and web server implementation
*
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
struct lws_state_notify_link;
struct lws_state_manager;
#if defined(LWS_WITH_SYS_STATE)
typedef int (*lws_state_notify_t)(struct lws_state_manager *mgr,
struct lws_state_notify_link *link,
int current, int target);
typedef struct lws_state_notify_link {
lws_dll2_t list;
lws_state_notify_t notify_cb;
const char *name;
} lws_state_notify_link_t;
typedef struct lws_state_manager {
lws_dll2_owner_t notify_list;
struct lws_context *context;
void *parent;
#if defined(LWS_WITH_SYS_SMD)
lws_smd_class_t smd_class;
#endif
/**< optional opaque pointer to owning object... useful to make such
* a pointer available to a notification callback. Ignored by lws */
const char **state_names;
const char *name;
int state;
} lws_state_manager_t;
/**
* lws_state_reg_notifier() - add dep handler for state notifications
*
* \param context: the lws_context
* \param nl: the handler to add to the notifier linked-list
*
* Add \p notify_link to the context's list of notification handlers for system
* state changes. The handlers can defeat or take over responsibility for
* retrying the change after they have initiated some dependency.
*/
LWS_EXTERN LWS_VISIBLE void
lws_state_reg_notifier(lws_state_manager_t *mgr, lws_state_notify_link_t *nl);
/**
* lws_state_reg_deregister() - deregister a notifier
*
* \param nl: notification hardler to deregister
*
* Remove a notification handler from its state manager
*/
LWS_EXTERN LWS_VISIBLE void
lws_state_reg_deregister(lws_state_notify_link_t *nl);
/**
* lws_state_reg_notifier_list() - add dep handlers for state notifications
*
* \param context: the lws_context
* \param nl: list of notification handlers
*
* Add a NULL-terminated list of notification handler pointers to a notification
* manager object
*/
LWS_EXTERN LWS_VISIBLE void
lws_state_reg_notifier_list(lws_state_manager_t *mgr,
lws_state_notify_link_t * const *nl);
/**
* lws_state_transition_steps() - move to state via starting any deps
*
* \param mgr: the state manager object
* \param target: the state we wish to move to
*
* Advance state by state towards state \p target. At each state, notifiers
* may veto the change and be triggered to perform dependencies, stopping the
* advance towards the target state.
*/
LWS_EXTERN LWS_VISIBLE int
lws_state_transition_steps(lws_state_manager_t *mgr, int target);
/**
* lws_state_transition() - move to state via starting any deps
*
* \param mgr: the state manager object
* \param target: the state we wish to move to
*
* Jump to state target atomically. Notifiers may veto it.
*/
LWS_EXTERN LWS_VISIBLE int
lws_state_transition(lws_state_manager_t *mgr, int target);
#else
#endif