diff --git a/OpenSim/Services/FreeswitchService/FreeswitchService.cs b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
index 109ef9b81d..b62a65aad5 100644
--- a/OpenSim/Services/FreeswitchService/FreeswitchService.cs
+++ b/OpenSim/Services/FreeswitchService/FreeswitchService.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Text;
using System.Reflection;
using Nini.Config;
using log4net;
@@ -46,14 +47,342 @@ namespace OpenSim.Services.FreeswitchService
// Perform initilialization here
}
- public Hashtable HandleDirectoryRequest(Hashtable requestBody)
+ public Hashtable HandleDialplanRequest(Hashtable request)
{
- return new Hashtable();
+ m_log.DebugFormat("[FreeSwitchVoice] HandleDialplanRequest called with {0}",request.ToString());
+
+ Hashtable response = new Hashtable();
+
+ foreach (DictionaryEntry item in request)
+ {
+ m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}",item.Key, item.Value);
+ }
+
+ string requestcontext = (string) request["Hunt-Context"];
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+
+ if (m_freeSwitchContext != String.Empty && m_freeSwitchContext != requestcontext)
+ {
+ m_log.Debug("[FreeSwitchDirectory] returning empty as it's for another context");
+ response["str_response_string"] = "";
+ }
+ else
+ {
+ response["str_response_string"] = String.Format(@"
+
+
+ " +
+
+/*
+
+
+
+
+
+ */
+
+ @"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ", m_freeSwitchContext, m_freeSwitchRealm);
+ }
+
+ return response;
}
- public Hashtable HandleDialplanRequest(Hashtable requestBody)
+ public Hashtable HandleDirectoryRequest(Hashtable request)
{
- return new Hashtable();
+ Hashtable response = new Hashtable();
+ string domain = (string) request["domain"];
+ if (domain != m_freeSwitchRealm) {
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = "";
+ } else {
+ m_log.DebugFormat("[FreeSwitchDirectory] HandleDirectoryRequest called with {0}",request.ToString());
+
+ // information in the request we might be interested in
+
+ // Request 1 sip_auth for users account
+
+ //Event-Calling-Function=sofia_reg_parse_auth
+ //Event-Calling-Line-Number=1494
+ //action=sip_auth
+ //sip_user_agent=Vivox-SDK-2.1.3010.6151-Mac%20(Feb-11-2009/16%3A42%3A41)
+ //sip_auth_username=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_auth_realm=9.20.151.43
+ //sip_contact_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D (==)
+ //sip_contact_host=192.168.0.3 // this shouldnt really be a local IP, investigate STUN servers
+ //sip_to_user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //sip_to_host=9.20.151.43
+ //sip_auth_method=REGISTER
+ //user=xhZuXKmRpECyr2AARJYyGgg%3D%3D
+ //domain=9.20.151.43
+ //ip=9.167.220.137 // this is the correct IP rather than sip_contact_host above when through a vpn or NAT setup
+
+ foreach (DictionaryEntry item in request)
+ {
+ m_log.InfoFormat("[FreeSwitchDirectory] requestBody item {0} {1}", item.Key, item.Value);
+ }
+
+ string eventCallingFunction = (string) request["Event-Calling-Function"];
+ if (eventCallingFunction == null)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
+
+ if (eventCallingFunction.Length == 0)
+ {
+ eventCallingFunction = "sofia_reg_parse_auth";
+ }
+
+ if (eventCallingFunction == "sofia_reg_parse_auth")
+ {
+ string sipAuthMethod = (string)request["sip_auth_method"];
+
+ if (sipAuthMethod == "REGISTER")
+ {
+ response = HandleRegister(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (sipAuthMethod == "INVITE")
+ {
+ response = HandleInvite(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown sip_auth_method {0}",sipAuthMethod);
+ response["int_response_code"] = 404;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ else if (eventCallingFunction == "switch_xml_locate_user")
+ {
+ response = HandleLocateUser(m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "user_data_function") // gets called when an avatar to avatar call is made
+ {
+ response = HandleLocateUser(m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "user_outgoing_channel")
+ {
+ response = HandleRegister(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "config_sofia") // happens once on freeswitch startup
+ {
+ response = HandleConfigSofia(m_freeSwitchContext, m_freeSwitchRealm, request);
+ }
+ else if (eventCallingFunction == "switch_load_network_lists")
+ {
+ //response = HandleLoadNetworkLists(request);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ else
+ {
+ m_log.ErrorFormat("[FreeSwitchVoice] HandleDirectoryRequest unknown Event-Calling-Function {0}",eventCallingFunction);
+ response["int_response_code"] = 404;
+ response["keepalive"] = false;
+ response["content_type"] = "text/xml";
+ response["str_response_string"] = "";
+ }
+ }
+ return response;
+ }
+
+ private Hashtable HandleRegister(string Context, string Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleRegister called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string password = "1234";
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user, password, Context);
+
+ return response;
+ }
+
+ private Hashtable HandleInvite(string Context, string Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleInvite called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string password = "1234";
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+ string sipRequestUser = (string) request["sip_request_user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ ""+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user, password,sipRequestUser, Context);
+
+ return response;
+ }
+
+ private Hashtable HandleLocateUser(String Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleLocateUser called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string domain = (string) request["domain"];
+ string user = (string) request["user"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ ""+
+ "\r\n"+
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain , user);
+
+ return response;
+ }
+
+ private Hashtable HandleConfigSofia(string Context, string Realm, Hashtable request)
+ {
+ m_log.Info("[FreeSwitchDirectory] HandleConfigSofia called");
+
+ // TODO the password we return needs to match that sent in the request, this is hard coded for now
+ string domain = (string) request["domain"];
+
+ Hashtable response = new Hashtable();
+ response["content_type"] = "text/xml";
+ response["keepalive"] = false;
+ response["int_response_code"] = 200;
+ response["str_response_string"] = String.Format(
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ ""+
+ "\r\n" +
+ "\r\n"+
+ "\r\n"+
+ "\r\n"+
+ "\r\n" +
+ "\r\n" +
+ "\r\n",
+ domain, Context);
+
+ return response;
}
}
}