[asterisk-commits] mmichelson: branch group/CCSS r230503 - /team/group/CCSS/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Nov 19 14:18:40 CST 2009


Author: mmichelson
Date: Thu Nov 19 14:18:36 2009
New Revision: 230503

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=230503
Log:
Hmm, forgot to commit this Monday apparently...

Skeleton for handling responses to PUBLISHes.
I'll fill in the definitions for the callbacks shortly.


Modified:
    team/group/CCSS/channels/chan_sip.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=230503&r1=230502&r2=230503
==============================================================================
--- team/group/CCSS/channels/chan_sip.c (original)
+++ team/group/CCSS/channels/chan_sip.c Thu Nov 19 14:18:36 2009
@@ -1697,18 +1697,6 @@
    	 * will use event specific data
    	 */
 	void *event_specific_data;
-	/* When we receive a response to an outgoing
-	 * publish, we need to match that response to
-	 * an EPA entry. The best identifier for this is
-	 * the callid.
-	 * XXX Is it necessary to consider branches
-	 * when identifying an EPA entry? If a proxy forks
-	 * our PUBLISH, then we could get multiple responses
-	 * with different branches. In such a case, the two
-	 * endpoints would respond to our PUBLISH with two
-	 * separate SIP-Etag headers. guh.
-	 */
-	char call_id[SIPBUFSIZE];
 };
 
 static int cc_epa_hash_fn(const void *obj, const int flags)
@@ -1769,30 +1757,6 @@
 		}
 	}
 	return NULL;
-}
-
-static int get_by_call_id(void *obj, void *arg, int flags)
-{
-	struct sip_epa_entry *epa_entry = obj;
-	const char *call_id = arg;
-
-	if (!strcmp(epa_entry->call_id, call_id)) {
-		return CMP_MATCH | CMP_STOP;
-	}
-	return 0;
-}
-
-static struct sip_epa_entry *get_epa_entry_by_call_id(char *call_id, const char * event)
-{
-	struct event_publication_agent *epa;
-	struct sip_epa_entry *epa_entry;
-
-	if (!(epa = get_epa(event))) {
-		return NULL;
-	}
-
-	epa_entry = ao2_callback(epa->entries, 0, get_by_call_id, call_id);
-	return epa_entry;
 }
 
 static int initialize_epas(void)
@@ -2327,6 +2291,11 @@
 	 */
 	struct offered_media offered_media[OFFERED_MEDIA_COUNT];
 	struct ast_cc_config_params *cc_params;
+	/* When we receive a response to a SIP PUBLISH, the only way we can associate the response with the
+	 * appropriate event publication agent entry is through the sip_pvt. Unfortunately, there is no piece of information
+	 * in the response that allows us to know which event package the response pertains to.
+	 */
+	struct sip_epa_entry *epa_entry;
 };
 
 
@@ -6363,6 +6332,11 @@
 	ast_string_field_free_memory(p);
 
 	ast_cc_config_params_destroy(p->cc_params);
+
+	if (p->epa_entry) {
+		ao2_ref(p->epa_entry, -1);
+		p->epa_entry = NULL;
+	}
 
 	if (p->socket.tcptls_session) {
 		ao2_ref(p->socket.tcptls_session, -1);
@@ -11781,6 +11755,10 @@
 		add_line(&req, body);
 	}
 
+	/* Bump refcount for sip_pvt's reference */
+	ao2_ref(epa_entry, +1);
+	pvt->epa_entry = epa_entry;
+
 	send_request(pvt, &req, XMIT_RELIABLE, INITIAL_CSEQ);
 
 	return 0;
@@ -18884,7 +18862,28 @@
 
 static void handle_response_publish(struct sip_pvt *p, int resp, const char *rest, struct sip_request *req, int seqno)
 {
-
+	struct sip_epa_entry *epa_entry = p->epa_entry;
+	struct event_publication_agent *epa;
+
+	ast_assert(epa_entry != NULL);
+
+	epa = get_epa(epa_entry->event);
+
+	ast_assert(epa != NULL);
+
+	if (resp == 200) {
+		/* The nominal case. Everything went well. Everybody is happy.
+		 * Each EPA will have a specific action to take as a result of this
+		 * development, so ... callbacks!
+		 */
+		epa->callbacks->handle_ok(p, req, epa_entry);
+	} else {
+		/* Rather than try to make individual callbacks for each error
+		 * type, there is just a single error callback. The callback
+		 * can distinguish between error messages and do what it needs to
+		 */
+		epa->callbacks->handle_error(p, resp, req, epa_entry);
+	}
 }
 
 /*! \brief Handle SIP response to INVITE dialogue */




More information about the asterisk-commits mailing list