[asterisk-commits] mmichelson: branch group/CCSS r231733 - in /team/group/CCSS: channels/ includ...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Mon Nov 30 16:45:24 CST 2009
Author: mmichelson
Date: Mon Nov 30 16:45:22 2009
New Revision: 231733
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=231733
Log:
Add method to search for an agent given a piece of data.
While trying to write code to handle an incoming PUBLISH, it became
clear that the way I would need to find the appropriate CC agent was
based on the request URI of the PUBLISH. I needed to match the URI
to the stored URI in the agent's private_data. Unfortunately, I can't
search the container of cc_core_instances in chan_sip because the container
and the cc_core_instance struct are both private to ccss.c. However, it
was not too difficult to create a public API call which could use ao2_callback
within ccss.c. This is very Matryoshka-esque code.
Modified:
team/group/CCSS/channels/chan_sip.c
team/group/CCSS/include/asterisk/ccss.h
team/group/CCSS/main/ccss.c
Modified: team/group/CCSS/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/channels/chan_sip.c?view=diff&rev=231733&r1=231732&r2=231733
==============================================================================
--- team/group/CCSS/channels/chan_sip.c (original)
+++ team/group/CCSS/channels/chan_sip.c Mon Nov 30 16:45:22 2009
@@ -3366,6 +3366,21 @@
char is_available;
};
+static int find_by_uri_helper(void *obj, void *arg, int flags)
+{
+ struct ast_cc_agent *agent = obj;
+ struct sip_cc_agent_pvt *agent_pvt = agent->private_data;
+ const char *uri = arg;
+
+ return !strcmp(agent_pvt->notify_uri, uri) ? CMP_MATCH | CMP_STOP : 0;
+}
+
+static struct ast_cc_agent *find_sip_cc_agent_by_uri(const char * const uri)
+{
+ struct ast_cc_agent *agent = ast_cc_agent_callback(0, find_by_uri_helper, (char *)uri, "SIP");
+ return agent;
+}
+
static int sip_cc_agent_init(struct ast_cc_agent *agent, struct ast_channel *chan)
{
struct sip_cc_agent_pvt *agent_pvt = ast_calloc(1, sizeof(*agent_pvt));
Modified: team/group/CCSS/include/asterisk/ccss.h
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/include/asterisk/ccss.h?view=diff&rev=231733&r1=231732&r2=231733
==============================================================================
--- team/group/CCSS/include/asterisk/ccss.h (original)
+++ team/group/CCSS/include/asterisk/ccss.h Mon Nov 30 16:45:22 2009
@@ -861,6 +861,24 @@
void (*destructor)(struct ast_cc_agent *agent);
};
+/*!
+ * \brief Call a callback on all agents of a specific type
+ *
+ * Since the container of CC core instances is private, and so
+ * are the items which the container contains, we have to provide
+ * an ao2_callback-like method so that a specific agent may be
+ * found or so that an operation can be made on all agents of
+ * a particular type. The first three arguments should be familiar
+ * to anyone who has used ao2_callback. The final argument is the
+ * type of agent you wish to have the callback called on.
+ *
+ * \param flags astobj2 search flags
+ * \param function an ao2 callback function to call
+ * \param arg the argument to the callback function
+ * \param type The type of agents to call the callback on
+ */
+void *ast_cc_agent_callback(int flags, ao2_callback_fn function, void *arg, const char * const type);
+
/* END STRUCTURES FOR AGENTS */
/* BEGIN STATE CHANGE API */
Modified: team/group/CCSS/main/ccss.c
URL: http://svnview.digium.com/svn/asterisk/team/group/CCSS/main/ccss.c?view=diff&rev=231733&r1=231732&r2=231733
==============================================================================
--- team/group/CCSS/main/ccss.c (original)
+++ team/group/CCSS/main/ccss.c Mon Nov 30 16:45:22 2009
@@ -241,6 +241,30 @@
struct cc_core_instance finder = {.core_id = core_id,};
return ao2_t_find(cc_core_instances, &finder, OBJ_POINTER, "Finding a core_instance");
+}
+
+struct cc_callback_helper {
+ ao2_callback_fn function;
+ void *args;
+ const char *type;
+};
+
+static int cc_agent_callback_helper(void *obj, void *args, int flags)
+{
+ struct cc_core_instance *core_instance = obj;
+ struct cc_callback_helper *helper = args;
+
+ if (strcmp(core_instance->agent->callbacks->type, helper->type)) {
+ return 0;
+ }
+
+ return helper->function(core_instance->agent, helper->args, flags);
+}
+
+void *ast_cc_agent_callback(int flags, ao2_callback_fn function, void *args, const char * const type)
+{
+ struct cc_callback_helper helper = {.function = function, .args = args, .type = type};
+ return ao2_callback(cc_core_instances, flags, cc_agent_callback_helper, &helper);
}
enum match_flags {
More information about the asterisk-commits
mailing list