aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authordvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-02 15:05:57 +0000
committerdvossel <dvossel@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-02 15:05:57 +0000
commitf16a04502850e885efd3ddec985baec5c35e72c1 (patch)
treeb579c7a6441babd31d19e0ae3240551dfa64aacc /include
parent249bc2175103b1db9ab22f1f5fd94adad6b5cac0 (diff)
Improved mapping of extension states from combined device states.
This fixes a few issues with incorrect extension states and adds a cli command, core show device2extenstate, to display all possible state mappings. (closes issue #15413) Reported by: legart Patches: exten_helper.diff uploaded by dvossel (license 671) Tested by: dvossel, legart, amilcar Review: https://reviewboard.asterisk.org/r/301/ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@204681 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/devicestate.h32
-rw-r--r--include/asterisk/pbx.h59
2 files changed, 72 insertions, 19 deletions
diff --git a/include/asterisk/devicestate.h b/include/asterisk/devicestate.h
index 561bd2cb4..960d622e7 100644
--- a/include/asterisk/devicestate.h
+++ b/include/asterisk/devicestate.h
@@ -27,24 +27,18 @@
extern "C" {
#endif
-/*! Device is valid but channel didn't know state */
-#define AST_DEVICE_UNKNOWN 0
-/*! Device is not used */
-#define AST_DEVICE_NOT_INUSE 1
-/*! Device is in use */
-#define AST_DEVICE_INUSE 2
-/*! Device is busy */
-#define AST_DEVICE_BUSY 3
-/*! Device is invalid */
-#define AST_DEVICE_INVALID 4
-/*! Device is unavailable */
-#define AST_DEVICE_UNAVAILABLE 5
-/*! Device is ringing */
-#define AST_DEVICE_RINGING 6
-/*! Device is ringing *and* in use */
-#define AST_DEVICE_RINGINUSE 7
-/*! Device is on hold */
-#define AST_DEVICE_ONHOLD 8
+enum ast_device_state {
+ AST_DEVICE_UNKNOWN, /*!< Device is valid but channel didn't know state */
+ AST_DEVICE_NOT_INUSE, /*!< Device is not used */
+ AST_DEVICE_INUSE, /*!< Device is in use */
+ AST_DEVICE_BUSY, /*!< Device is busy */
+ AST_DEVICE_INVALID, /*!< Device is invalid */
+ AST_DEVICE_UNAVAILABLE, /*!< Device is unavailable */
+ AST_DEVICE_RINGING, /*!< Device is ringing */
+ AST_DEVICE_RINGINUSE, /*!< Device is ringing *and* in use */
+ AST_DEVICE_ONHOLD, /*!< Device is on hold */
+ AST_DEVICE_TOTAL, /*!< Total num of device states, used for testing */
+};
/*! \brief Devicestate watcher call back */
typedef int (*ast_devstate_cb_type)(const char *dev, int state, void *data);
@@ -55,7 +49,7 @@ typedef int (*ast_devstate_prov_cb_type)(const char *data);
/*! \brief Convert device state to text string for output
* \param devstate Current device state
*/
-const char *devstate2str(int devstate);
+const char *devstate2str(enum ast_device_state devstate);
/*! \brief Search the Channels by Name
* \param device like a dialstring
diff --git a/include/asterisk/pbx.h b/include/asterisk/pbx.h
index 0ac09f39d..11aa57be4 100644
--- a/include/asterisk/pbx.h
+++ b/include/asterisk/pbx.h
@@ -26,6 +26,7 @@
#include "asterisk/sched.h"
#include "asterisk/channel.h"
#include "asterisk/linkedlists.h"
+#include "asterisk/devicestate.h"
#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
@@ -305,6 +306,64 @@ int ast_register_application(const char *app, int (*execute)(struct ast_channel
*/
int ast_unregister_application(const char *app);
+/*!
+ * \brief An object to hold state when calculating aggregate device state
+ */
+struct ast_devstate_aggregate;
+
+/*!
+ * \brief Initialize aggregate device state
+ *
+ * \param[in] agg the state object
+ *
+ * \return nothing
+ */
+void ast_devstate_aggregate_init(struct ast_devstate_aggregate *agg);
+
+/*!
+ * \brief Add a device state to the aggregate device state
+ *
+ * \param[in] agg the state object
+ * \param[in] state the state to add
+ *
+ * \return nothing
+ */
+void ast_devstate_aggregate_add(struct ast_devstate_aggregate *agg, enum ast_device_state state);
+
+/*!
+ * \brief Get the aggregate device state result
+ *
+ * \param[in] agg the state object
+ *
+ * \return the aggregate device state after adding some number of device states.
+ */
+enum ast_device_state ast_devstate_aggregate_result(struct ast_devstate_aggregate *agg);
+
+/*!
+ * \brief Map devstate to an extension state.
+ *
+ * \param[in] device state
+ *
+ * \return the extension state mapping.
+ */
+enum ast_extension_states ast_devstate_to_extenstate(enum ast_device_state devstate);
+
+/*!
+ * \brief You shouldn't care about the contents of this struct
+ *
+ * This struct is only here so that it can be easily declared on the stack.
+ */
+struct ast_devstate_aggregate {
+ unsigned int all_unavail:1;
+ unsigned int all_busy:1;
+ unsigned int all_free:1;
+ unsigned int all_unknown:1;
+ unsigned int on_hold:1;
+ unsigned int busy:1;
+ unsigned int in_use:1;
+ unsigned int ring:1;
+};
+
/*!
* \brief Uses hint and devicestate callback to get the state of an extension
*