lws-state.h (3946B)
1 /* 2 * libwebsockets - small server side websockets and web server implementation 3 * 4 * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22 * IN THE SOFTWARE. 23 */ 24 25struct lws_state_notify_link; 26struct lws_state_manager; 27 28#if defined(LWS_WITH_SYS_STATE) 29 30typedef int (*lws_state_notify_t)(struct lws_state_manager *mgr, 31 struct lws_state_notify_link *link, 32 int current, int target); 33 34typedef struct lws_state_notify_link { 35 lws_dll2_t list; 36 lws_state_notify_t notify_cb; 37 const char *name; 38} lws_state_notify_link_t; 39 40typedef struct lws_state_manager { 41 lws_dll2_owner_t notify_list; 42 struct lws_context *context; 43 void *parent; 44#if defined(LWS_WITH_SYS_SMD) 45 lws_smd_class_t smd_class; 46#endif 47 /**< optional opaque pointer to owning object... useful to make such 48 * a pointer available to a notification callback. Ignored by lws */ 49 const char **state_names; 50 const char *name; 51 int state; 52} lws_state_manager_t; 53 54/** 55 * lws_state_reg_notifier() - add dep handler for state notifications 56 * 57 * \param context: the lws_context 58 * \param nl: the handler to add to the notifier linked-list 59 * 60 * Add \p notify_link to the context's list of notification handlers for system 61 * state changes. The handlers can defeat or take over responsibility for 62 * retrying the change after they have initiated some dependency. 63 */ 64 65LWS_EXTERN LWS_VISIBLE void 66lws_state_reg_notifier(lws_state_manager_t *mgr, lws_state_notify_link_t *nl); 67 68/** 69 * lws_state_reg_deregister() - deregister a notifier 70 * 71 * \param nl: notification hardler to deregister 72 * 73 * Remove a notification handler from its state manager 74 */ 75 76LWS_EXTERN LWS_VISIBLE void 77lws_state_reg_deregister(lws_state_notify_link_t *nl); 78 79/** 80 * lws_state_reg_notifier_list() - add dep handlers for state notifications 81 * 82 * \param context: the lws_context 83 * \param nl: list of notification handlers 84 * 85 * Add a NULL-terminated list of notification handler pointers to a notification 86 * manager object 87 */ 88 89LWS_EXTERN LWS_VISIBLE void 90lws_state_reg_notifier_list(lws_state_manager_t *mgr, 91 lws_state_notify_link_t * const *nl); 92 93/** 94 * lws_state_transition_steps() - move to state via starting any deps 95 * 96 * \param mgr: the state manager object 97 * \param target: the state we wish to move to 98 * 99 * Advance state by state towards state \p target. At each state, notifiers 100 * may veto the change and be triggered to perform dependencies, stopping the 101 * advance towards the target state. 102 */ 103LWS_EXTERN LWS_VISIBLE int 104lws_state_transition_steps(lws_state_manager_t *mgr, int target); 105 106/** 107 * lws_state_transition() - move to state via starting any deps 108 * 109 * \param mgr: the state manager object 110 * \param target: the state we wish to move to 111 * 112 * Jump to state target atomically. Notifiers may veto it. 113 */ 114LWS_EXTERN LWS_VISIBLE int 115lws_state_transition(lws_state_manager_t *mgr, int target); 116 117#else 118 119#endif