From bfcbdc8a93b560bdf46f13a5aac57516d310dc75 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 27 Apr 2020 21:42:35 +0100 Subject: [PATCH] change voice modules handlers --- .../FreeSwitchVoice/FreeSwitchVoiceModule.cs | 82 ++++++----- .../Voice/VivoxVoice/VivoxVoiceModule.cs | 135 ++++++++++-------- 2 files changed, 124 insertions(+), 93 deletions(-) diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs index b0aad6f024..31e8134beb 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs @@ -63,8 +63,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // Capability string prefixes - private static readonly string m_parcelVoiceInfoRequestPath = "0207/"; - private static readonly string m_provisionVoiceAccountRequestPath = "0208/"; //private static readonly string m_chatSessionRequestPath = "0209/"; // Control info @@ -283,26 +281,17 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice "[FreeSwitchVoice]: OnRegisterCaps() called with agentID {0} caps {1} in scene {2}", agentID, caps, scene.RegionInfo.RegionName); - string capsBase = "/CAPS/" + caps.CapsObjectPath; - caps.RegisterHandler( - "ProvisionVoiceAccountRequest", - new RestStreamHandler( - "POST", - capsBase + m_provisionVoiceAccountRequestPath, - (request, path, param, httpRequest, httpResponse) - => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), - "ProvisionVoiceAccountRequest", - agentID.ToString())); + caps.RegisterSimpleHandler("ProvisionVoiceAccountRequest", + new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + ProvisionVoiceAccountRequest(httpRequest, httpResponse, agentID, scene); + })); - caps.RegisterHandler( - "ParcelVoiceInfoRequest", - new RestStreamHandler( - "POST", - capsBase + m_parcelVoiceInfoRequestPath, - (request, path, param, httpRequest, httpResponse) - => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), - "ParcelVoiceInfoRequest", - agentID.ToString())); + caps.RegisterSimpleHandler("ParcelVoiceInfoRequest", + new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + ParcelVoiceInfoRequest(httpRequest, httpResponse, agentID, scene); + })); //caps.RegisterHandler( // "ChatSessionRequest", @@ -325,11 +314,18 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice /// /// /// - public string ProvisionVoiceAccountRequest(Scene scene, string request, string path, string param, - UUID agentID, Caps caps) + public void ProvisionVoiceAccountRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Scene scene) { + if(request.HttpMethod != "POST") + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + m_log.DebugFormat( - "[FreeSwitchVoice][PROVISIONVOICE]: ProvisionVoiceAccountRequest() request: {0}, path: {1}, param: {2}", request, path, param); + "[FreeSwitchVoice][PROVISIONVOICE]: ProvisionVoiceAccountRequest() request for {0}", agentID.ToString()); + + response.StatusCode = (int)HttpStatusCode.OK; ScenePresence avatar = scene.GetScenePresence(agentID); if (avatar == null) @@ -338,7 +334,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice avatar = scene.GetScenePresence(agentID); if (avatar == null) - return "undef"; + { + response.RawBuffer = Util.UTF8.GetBytes("undef"); + return; + } } string avatarName = avatar.Name; @@ -375,14 +374,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice LLSDxmlEncode.AddElem("voice_sip_uri_hostname", m_freeSwitchRealm, lsl); LLSDxmlEncode.AddElem("voice_account_server_name", accounturl, lsl); LLSDxmlEncode.AddEndMap(lsl); - return LLSDxmlEncode.End(lsl); + response.RawBuffer = Util.UTF8.GetBytes(LLSDxmlEncode.End(lsl)); } catch (Exception e) { m_log.ErrorFormat("[FreeSwitchVoice][PROVISIONVOICE]: avatar \"{0}\": {1}, retry later", avatarName, e.Message); m_log.DebugFormat("[FreeSwitchVoice][PROVISIONVOICE]: avatar \"{0}\": {1} failed", avatarName, e.ToString()); - return "undef"; + response.RawBuffer = Util.UTF8.GetBytes("undef"); } } @@ -396,14 +395,27 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice /// /// /// - public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param, - UUID agentID, Caps caps) + public void ParcelVoiceInfoRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Scene scene) { + if (request.HttpMethod != "POST") + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + response.StatusCode = (int)HttpStatusCode.OK; + m_log.DebugFormat( "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}", scene.RegionInfo.RegionName, agentID); ScenePresence avatar = scene.GetScenePresence(agentID); + if(avatar == null) + { + response.RawBuffer = Util.UTF8.GetBytes("undef"); + return; + } + string avatarName = avatar.Name; // - check whether we have a region channel in our cache @@ -416,8 +428,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice string channelUri; if (null == scene.LandChannel) - throw new Exception(String.Format("region \"{0}\": avatar \"{1}\": land data not yet available", - scene.RegionInfo.RegionName, avatarName)); + { + m_log.ErrorFormat("region \"{0}\": avatar \"{1}\": land data not yet available", + scene.RegionInfo.RegionName, avatarName); + response.RawBuffer = Util.UTF8.GetBytes("undef"); + return; + } // get channel_uri: check first whether estate // settings allow voice, then whether parcel allows @@ -459,7 +475,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice LLSDxmlEncode.AddEndMap(lsl); LLSDxmlEncode.AddEndMap(lsl); - return LLSDxmlEncode.End(lsl); + response.RawBuffer= Util.UTF8.GetBytes(LLSDxmlEncode.End(lsl)); } catch (Exception e) { @@ -468,7 +484,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice m_log.DebugFormat("[FreeSwitchVoice][PARCELVOICE]: region \"{0}\": avatar \"{1}\": {2} failed", scene.RegionInfo.RegionName, avatarName, e.ToString()); - return "undef"; + response.RawBuffer = Util.UTF8.GetBytes("undef"); } } diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs index e6ad11f129..343ec03e48 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Voice/VivoxVoice/VivoxVoiceModule.cs @@ -89,11 +89,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly Object vlock = new Object(); - // Capability strings - private static readonly string m_parcelVoiceInfoRequestPath = "0107/"; - private static readonly string m_provisionVoiceAccountRequestPath = "0108/"; - //private static readonly string m_chatSessionRequestPath = "0109/"; - // Control info, e.g. vivox server, admin user, admin password private static bool m_pluginEnabled = false; private static bool m_adminConnected = false; @@ -427,37 +422,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice { m_log.DebugFormat("[VivoxVoice] OnRegisterCaps: agentID {0} caps {1}", agentID, caps); - string capsBase = "/CAPS/" + caps.CapsObjectPath; + caps.RegisterSimpleHandler("ProvisionVoiceAccountRequest", + new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + ProvisionVoiceAccountRequest(httpRequest, httpResponse, agentID, scene); + })); - caps.RegisterHandler( - "ProvisionVoiceAccountRequest", - new RestStreamHandler( - "POST", - capsBase + m_provisionVoiceAccountRequestPath, - (request, path, param, httpRequest, httpResponse) - => ProvisionVoiceAccountRequest(scene, request, path, param, agentID, caps), - "ProvisionVoiceAccountRequest", - agentID.ToString())); + caps.RegisterSimpleHandler("ParcelVoiceInfoRequest", + new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + ParcelVoiceInfoRequest(httpRequest, httpResponse, agentID, scene); + })); - caps.RegisterHandler( - "ParcelVoiceInfoRequest", - new RestStreamHandler( - "POST", - capsBase + m_parcelVoiceInfoRequestPath, - (request, path, param, httpRequest, httpResponse) - => ParcelVoiceInfoRequest(scene, request, path, param, agentID, caps), - "ParcelVoiceInfoRequest", - agentID.ToString())); - - //caps.RegisterHandler( - // "ChatSessionRequest", - // new RestStreamHandler( - // "POST", - // capsBase + m_chatSessionRequestPath, - // (request, path, param, httpRequest, httpResponse) - // => ChatSessionRequest(scene, request, path, param, agentID, caps), - // "ChatSessionRequest", - // agentID.ToString())); + //caps.RegisterSimpleHandler("ChatSessionRequest", + // new SimpleStreamHandler("/" + UUID.Random(), delegate (IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + // { + // ChatSessionRequest(httpRequest, httpResponse, agentID, scene); + // })); } /// @@ -470,16 +451,25 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice /// /// /// - public string ProvisionVoiceAccountRequest(Scene scene, string request, string path, string param, - UUID agentID, Caps caps) + public void ProvisionVoiceAccountRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Scene scene) { + if(request.HttpMethod != "POST") + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + response.StatusCode = (int)HttpStatusCode.OK; try { ScenePresence avatar = null; string avatarName = null; if (scene == null) - return ""; + { + response.RawBuffer = Util.UTF8.GetBytes(""); + return; + } avatar = scene.GetScenePresence(agentID); int nretries = 10; @@ -490,7 +480,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice } if(avatar == null) - return ""; + { + response.RawBuffer = Util.UTF8.GetBytes(""); + return; + } avatarName = avatar.Name; @@ -592,7 +585,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice if (code != "OK") { m_log.DebugFormat("[VivoxVoice][PROVISIONVOICE]: Get Account Request failed for \"{0}\"", avatarName); - throw new Exception("Unable to execute request"); + response.RawBuffer = Util.UTF8.GetBytes(""); + return; } // Unconditionally change the password on each request @@ -607,14 +601,14 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice LLSDxmlEncode.AddElem("voice_account_server_name", m_vivoxVoiceAccountApi, lsl); LLSDxmlEncode.AddEndMap(lsl); - return LLSDxmlEncode.End(lsl); + response.RawBuffer = Util.UTF8.GetBytes(LLSDxmlEncode.End(lsl)); + return; } catch (Exception e) { - m_log.ErrorFormat("[VivoxVoice][PROVISIONVOICE]: : {0}, retry later", e.Message); m_log.DebugFormat("[VivoxVoice][PROVISIONVOICE]: : {0} failed", e.ToString()); - return ""; } + response.RawBuffer = Util.UTF8.GetBytes(""); } /// @@ -627,10 +621,23 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice /// /// /// - public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param, - UUID agentID, Caps caps) + public void ParcelVoiceInfoRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Scene scene) { + if (request.HttpMethod != "POST") + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + + response.StatusCode = (int)HttpStatusCode.OK; + ScenePresence avatar = scene.GetScenePresence(agentID); + if(avatar == null) + { + response.RawBuffer = Util.UTF8.GetBytes(""); + return; + } + string avatarName = avatar.Name; // - check whether we have a region channel in our cache @@ -642,9 +649,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice { string channel_uri; - if (null == scene.LandChannel) - throw new Exception(String.Format("region \"{0}\": avatar \"{1}\": land data not yet available", - scene.RegionInfo.RegionName, avatarName)); + if (scene.LandChannel == null) + { + m_log.ErrorFormat("region \"{0}\": avatar \"{1}\": land data not yet available", + scene.RegionInfo.RegionName, avatarName); + response.RawBuffer = Util.UTF8.GetBytes(""); + return; + } // get channel_uri: check first whether estate // settings allow voice, then whether parcel allows @@ -653,7 +664,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice LandData land = scene.GetLandData(avatar.AbsolutePosition); if (land == null) { - return ""; + response.RawBuffer = Util.UTF8.GetBytes(""); + return; } // m_log.DebugFormat("[VivoxVoice][PARCELVOICE]: region \"{0}\": Parcel \"{1}\" ({2}): avatar \"{3}\": request: {4}, path: {5}, param: {6}", @@ -691,17 +703,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice LLSDxmlEncode.AddEndMap(lsl); LLSDxmlEncode.AddEndMap(lsl); - return LLSDxmlEncode.End(lsl); + response.RawBuffer = Util.UTF8.GetBytes(LLSDxmlEncode.End(lsl)); + return; } catch (Exception e) { m_log.ErrorFormat("[VivoxVoice][PARCELVOICE]: region \"{0}\": avatar \"{1}\": {2}, retry later", scene.RegionInfo.RegionName, avatarName, e.Message); - m_log.DebugFormat("[VivoxVoice][PARCELVOICE]: region \"{0}\": avatar \"{1}\": {2} failed", - scene.RegionInfo.RegionName, avatarName, e.ToString()); - - return ""; } + response.RawBuffer = Util.UTF8.GetBytes(""); } /// @@ -714,15 +724,20 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.VivoxVoice /// /// /// - public string ChatSessionRequest(Scene scene, string request, string path, string param, - UUID agentID, Caps caps) + public void ChatSessionRequest(IOSHttpRequest request, IOSHttpResponse response, UUID agentID, Scene scene) { -// ScenePresence avatar = scene.GetScenePresence(agentID); -// string avatarName = avatar.Name; + if (request.HttpMethod != "POST") + { + response.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + // ScenePresence avatar = scene.GetScenePresence(agentID); + // string avatarName = avatar.Name; -// m_log.DebugFormat("[VivoxVoice][CHATSESSION]: avatar \"{0}\": request: {1}, path: {2}, param: {3}", -// avatarName, request, path, param); - return "true"; + // m_log.DebugFormat("[VivoxVoice][CHATSESSION]: avatar \"{0}\": request: {1}, path: {2}, param: {3}", + // avatarName, request, path, param); + response.RawBuffer = Util.UTF8.GetBytes("true"); + response.StatusCode = (int)HttpStatusCode.OK; } private string RegionGetOrCreateChannel(Scene scene, LandData land)