[Freeswitch-svn] [commit] r13771 - freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp

FreeSWITCH SVN jmesquita at freeswitch.org
Fri Jun 12 22:08:59 PDT 2009


Author: jmesquita
Date: Sat Jun 13 00:08:59 2009
New Revision: 13771

Log:
We are on the way of making a successful outgoing call

Modified:
   freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp

Modified: freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp
==============================================================================
--- freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp	(original)
+++ freeswitch/trunk/scripts/contrib/jmesquita/mod_khomp/mod_khomp.cpp	Sat Jun 13 00:08:59 2009
@@ -98,6 +98,9 @@
 	switch_mutex_t *mutex;
 	switch_mutex_t *flag_mutex;
 	//switch_thread_cond_t *cond;
+    unsigned int Kdevice;    // Represent de board we are making the call from
+    unsigned int Klink;      // Represent the link we are making the call from
+    unsigned int Kchannel;   // Represent the channel we are making the call from
 };
 
 typedef struct private_object private_t;
@@ -130,7 +133,8 @@
 
 
 
-static void tech_init(private_t *tech_pvt, switch_core_session_t *session)
+/* Will init part of our private structure and setup all the read/write buffers */
+static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *session)
 {
 	tech_pvt->read_frame.data = tech_pvt->databuf;
 	tech_pvt->read_frame.buflen = sizeof(tech_pvt->databuf);
@@ -138,6 +142,40 @@
 	switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
 	switch_core_session_set_private(session, tech_pvt);
 	tech_pvt->session = session;
+
+    if (switch_core_codec_init(&tech_pvt->read_codec,
+							   "PCMA",
+							   NULL,
+							   8000,
+							   20,
+							   1,
+							   SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+							   NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
+		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
+		return SWITCH_STATUS_GENERR;
+	} else {
+		if (switch_core_codec_init(&tech_pvt->write_codec,
+								   "PCMA",
+								   NULL,
+								   8000,
+								   20,
+								   1,
+								   SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE,
+								   NULL, switch_core_session_get_pool(tech_pvt->session)) != SWITCH_STATUS_SUCCESS) {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Can't load codec?\n");
+			switch_core_codec_destroy(&tech_pvt->read_codec);
+			return SWITCH_STATUS_GENERR;
+		}
+	}
+
+	switch_core_session_set_read_codec(tech_pvt->session, &tech_pvt->read_codec);
+	switch_core_session_set_write_codec(tech_pvt->session, &tech_pvt->write_codec);
+	switch_set_flag_locked(tech_pvt, TFLAG_CODEC);
+	tech_pvt->read_frame.codec = &tech_pvt->read_codec;
+	switch_set_flag_locked(tech_pvt, TFLAG_IO);
+
+	return SWITCH_STATUS_SUCCESS;
+
 }
 
 /* 
@@ -226,6 +264,15 @@
 		switch_core_codec_destroy(&tech_pvt->write_codec);
 	}
 
+    try {
+        k3l->command(tech_pvt->Kchannel, CM_DISCONNECT, NULL);
+    }
+    catch(K3LAPI::failed_command & e)
+    {
+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "WE COULD NOT HANGUP THE CHANNEL! rc:%d\n", e.rc);
+        return SWITCH_STATUS_TERM;
+    }
+
 
 	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s CHANNEL HANGUP\n", switch_channel_get_name(channel));
 	switch_mutex_lock(globals.mutex);
@@ -302,6 +349,9 @@
 	tech_pvt->read_frame.flags = SFF_NONE;
 	*frame = NULL;
 
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Are we being called?");
+
+
 	while (switch_test_flag(tech_pvt, TFLAG_IO)) {
 
 		if (switch_test_flag(tech_pvt, TFLAG_BREAK)) {
@@ -350,6 +400,8 @@
 	private_t *tech_pvt = NULL;
 	//switch_frame_t *pframe;
 
+    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Are we being called?");
+
 	channel = switch_core_session_get_channel(session);
 	assert(channel != NULL);
 
@@ -417,6 +469,10 @@
 													switch_caller_profile_t *outbound_profile,
 													switch_core_session_t **new_session, switch_memory_pool_t **pool, switch_originate_flag_t flags)
 {
+
+   	char *argv[4] = { 0 };
+	int argc = 0;
+
 	if ((*new_session = switch_core_session_request(khomp_endpoint_interface, SWITCH_CALL_DIRECTION_OUTBOUND, pool)) != 0) {
 		private_t *tech_pvt;
 		switch_channel_t *channel;
@@ -438,6 +494,24 @@
 			snprintf(name, sizeof(name), "Khomp/%s", outbound_profile->destination_number);
 			switch_channel_set_name(channel, name);
 
+            /* Let's setup our own vars on tech_pvt */
+            if ((argc = switch_separate_string(outbound_profile->destination_number, '/', argv, (sizeof(argv) / sizeof(argv[0])))) < 4)
+            {
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid dial string. Should be on the format:[Khomp/BOARD/LINK/CHANNEL]\n");
+                return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+            }
+            else
+            {
+                tech_pvt->Kdevice = atoi(argv[0]);
+                tech_pvt->Klink = atoi(argv[1]);
+                tech_pvt->Kchannel = atoi(argv[2]);
+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Dialing out from Board:%d, Link:%d, Channel:%d.\n",
+                                                                    tech_pvt->Kdevice,
+                                                                    tech_pvt->Klink,
+                                                                    tech_pvt->Kchannel);
+
+            }
+
 			caller_profile = switch_caller_profile_clone(*new_session, outbound_profile);
 			switch_channel_set_caller_profile(channel, caller_profile);
 			tech_pvt->caller_profile = caller_profile;
@@ -452,6 +526,21 @@
 		switch_channel_set_flag(channel, CF_OUTBOUND);
 		switch_set_flag_locked(tech_pvt, TFLAG_OUTBOUND);
 		switch_channel_set_state(channel, CS_INIT);
+
+        try {
+            /* Lets make the call! */
+            char params[ 255 ];
+            sprintf(params, "dest_addr=\"%s\"", argv[3]);
+            switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "We are calling with params: %s.\n", params);
+            k3l->command(tech_pvt->Kdevice,tech_pvt->Kchannel, CM_MAKE_CALL, params); 
+        }
+        /* TODO: Cmon learn how to catch already! */
+        catch(K3LAPI::failed_command & e)
+        {
+			switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not place call! Cause: code%d and rc%d.\n", e.code, e.rc);
+            return SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER;
+        }
+
 		return SWITCH_CAUSE_SUCCESS;
 	}
 



More information about the Freeswitch-svn mailing list