[svn-commits] russell: branch russell/events r73844 - /team/russell/events/main/devicestate.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat Jul 7 22:00:57 CDT 2007


Author: russell
Date: Sat Jul  7 22:00:57 2007
New Revision: 73844

URL: http://svn.digium.com/view/asterisk?view=rev&rev=73844
Log:
Update the ast_device_state() function to check to see if the device state
is cached.  If so, use that instead of calling the devstate provider's callback
to retrieve it.

Modified:
    team/russell/events/main/devicestate.c

Modified: team/russell/events/main/devicestate.c
URL: http://svn.digium.com/view/asterisk/team/russell/events/main/devicestate.c?view=diff&rev=73844&r1=73843&r2=73844
==============================================================================
--- team/russell/events/main/devicestate.c (original)
+++ team/russell/events/main/devicestate.c Sat Jul  7 22:00:57 2007
@@ -25,6 +25,7 @@
  *
  *	\arg \ref AstExtState
  */
+
 /*! \page AstExtState Extension and device states in Asterisk
  *
  *	Asterisk has an internal system that reports states
@@ -261,18 +262,42 @@
 	return res;
 }
 
+static enum ast_device_state devstate_cached(const char *device)
+{
+	enum ast_device_state res = AST_DEVICE_UNKNOWN;
+	struct ast_event *event;
+
+	event = ast_event_get_cached(AST_EVENT_DEVICE_STATE,
+		AST_EVENT_IE_DEVICE, AST_EVENT_IE_PLTYPE_STR, device,
+		AST_EVENT_IE_END);
+
+	if (!event)
+		return res;
+
+	res = ast_event_get_ie_uint(event, AST_EVENT_IE_STATE);
+
+	ast_event_destroy(event);
+
+	return res;
+}
+
 /*! \brief Check device state through channel specific function or generic function */
 enum ast_device_state ast_device_state(const char *device)
 {
 	char *buf;
 	char *number;
 	const struct ast_channel_tech *chan_tech;
-	enum ast_device_state res = AST_DEVICE_UNKNOWN;
+	enum ast_device_state res;
 	/*! \brief Channel driver that provides device state */
 	char *tech;
 	/*! \brief Another provider of device state */
 	char *provider = NULL;
-	
+
+	/* If the last known state is cached, just return that */
+	res = devstate_cached(device);
+	if (res != AST_DEVICE_UNKNOWN)
+		return res;
+
 	buf = ast_strdupa(device);
 	tech = strsep(&buf, "/");
 	if (!(number = buf)) {




More information about the svn-commits mailing list