change AgentPreferencesModule to use SimpleStreamHandler, as a simple first test

master
UbitUmarov 2020-04-23 22:35:31 +01:00
parent 9a5a811c7d
commit 7a24d8af52
1 changed files with 55 additions and 33 deletions

View File

@ -27,8 +27,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net;
using System.Reflection; using System.Reflection;
using System.IO; using System.Text;
using log4net; using log4net;
using Mono.Addins; using Mono.Addins;
using Nini.Config; using Nini.Config;
@ -73,10 +74,7 @@ namespace OpenSim.Region.ClientStack.LindenCaps
public void RegionLoaded(Scene scene) public void RegionLoaded(Scene scene)
{ {
scene.EventManager.OnRegisterCaps += delegate(UUID agentID, OpenSim.Framework.Capabilities.Caps caps) scene.EventManager.OnRegisterCaps += RegisterCaps;
{
RegisterCaps(agentID, caps);
};
ISimulatorFeaturesModule simFeatures = scene.RequestModuleInterface<ISimulatorFeaturesModule>(); ISimulatorFeaturesModule simFeatures = scene.RequestModuleInterface<ISimulatorFeaturesModule>();
if(simFeatures != null) if(simFeatures != null)
@ -97,52 +95,66 @@ namespace OpenSim.Region.ClientStack.LindenCaps
public void RegisterCaps(UUID agent, Caps caps) public void RegisterCaps(UUID agent, Caps caps)
{ {
string capPath = "/CAPS/" + UUID.Random().ToString(); string capPath = UUID.Random().ToString();
caps.RegisterHandler("AgentPreferences", caps.RegisterSimpleHandler("AgentPreferences",
new RestStreamHandler("POST", capPath, new SimpleStreamHandler(capPath, delegate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
delegate(string request, string path, string param,
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{ {
return UpdateAgentPreferences(request, path, param, agent); UpdateAgentPreferences(httpRequest, httpResponse, agent);
})); }));
caps.RegisterHandler("UpdateAgentLanguage", caps.RegisterSimpleHandler("UpdateAgentLanguage",
new RestStreamHandler("POST", capPath, new SimpleStreamHandler( capPath, delegate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
delegate(string request, string path, string param,
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{ {
return UpdateAgentPreferences(request, path, param, agent); UpdateAgentPreferences(httpRequest, httpResponse, agent);
})); }), false);
caps.RegisterHandler("UpdateAgentInformation", caps.RegisterSimpleHandler("UpdateAgentInformation",
new RestStreamHandler("POST", capPath, new SimpleStreamHandler(capPath, delegate(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
delegate(string request, string path, string param,
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
{ {
return UpdateAgentPreferences(request, path, param, agent); UpdateAgentPreferences(httpRequest, httpResponse, agent);
})); }), false);
} }
public string UpdateAgentPreferences(string request, string path, string param, UUID agent) public void UpdateAgentPreferences(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID agent)
{ {
OSDMap resp = new OSDMap(); if(httpRequest.HttpMethod != "POST")
{
httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
return;
}
httpResponse.KeepAlive = false;
// if there is no preference service, // if there is no preference service,
// we'll return a null llsd block for debugging purposes. This may change if someone knows what the // we'll return a null llsd block for debugging purposes. This may change if someone knows what the
// correct server response would be here. // correct server response would be here.
if (m_scenes[0].AgentPreferencesService == null) if (m_scenes[0].AgentPreferencesService == null)
{ {
return OSDParser.SerializeLLSDXmlString(resp); httpResponse.StatusCode = (int)HttpStatusCode.NotFound;
return;
} }
m_log.DebugFormat("[AgentPrefs]: UpdateAgentPreferences for {0}", agent.ToString()); m_log.DebugFormat("[AgentPrefs]: UpdateAgentPreferences for {0}", agent.ToString());
OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request); OSDMap req;
try
{
req = (OSDMap)OSDParser.DeserializeLLSDXml(httpRequest.InputStream);
}
catch
{
httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
AgentPrefs data = m_scenes[0].AgentPreferencesService.GetAgentPreferences(agent); AgentPrefs data = m_scenes[0].AgentPreferencesService.GetAgentPreferences(agent);
if (data == null) if (data == null)
{ {
data = new AgentPrefs(agent); data = new AgentPrefs(agent);
} }
bool changed = false;
if (req.ContainsKey("access_prefs")) if (req.ContainsKey("access_prefs"))
{ {
OSDMap accessPrefs = (OSDMap)req["access_prefs"]; // We could check with ContainsKey... OSDMap accessPrefs = (OSDMap)req["access_prefs"]; // We could check with ContainsKey...
data.AccessPrefs = accessPrefs["max"].AsString(); data.AccessPrefs = accessPrefs["max"].AsString();
changed = true;
} }
if (req.ContainsKey("default_object_perm_masks")) if (req.ContainsKey("default_object_perm_masks"))
{ {
@ -150,40 +162,50 @@ namespace OpenSim.Region.ClientStack.LindenCaps
data.PermEveryone = permsMap["Everyone"].AsInteger(); data.PermEveryone = permsMap["Everyone"].AsInteger();
data.PermGroup = permsMap["Group"].AsInteger(); data.PermGroup = permsMap["Group"].AsInteger();
data.PermNextOwner = permsMap["NextOwner"].AsInteger(); data.PermNextOwner = permsMap["NextOwner"].AsInteger();
changed = true;
} }
if (req.ContainsKey("hover_height")) if (req.ContainsKey("hover_height"))
{ {
data.HoverHeight = (float)req["hover_height"].AsReal(); data.HoverHeight = (float)req["hover_height"].AsReal();
changed = true;
} }
if (req.ContainsKey("language")) if (req.ContainsKey("language"))
{ {
data.Language = req["language"].AsString(); data.Language = req["language"].AsString();
changed = true;
} }
if (req.ContainsKey("language_is_public")) if (req.ContainsKey("language_is_public"))
{ {
data.LanguageIsPublic = req["language_is_public"].AsBoolean(); data.LanguageIsPublic = req["language_is_public"].AsBoolean();
changed = true;
} }
if(changed)
m_scenes[0].AgentPreferencesService.StoreAgentPreferences(data); m_scenes[0].AgentPreferencesService.StoreAgentPreferences(data);
IAvatarFactoryModule afm = m_scenes[0].RequestModuleInterface<IAvatarFactoryModule>();
afm?.SetPreferencesHoverZ(agent, (float)data.HoverHeight);
OSDMap resp = new OSDMap();
OSDMap respAccessPrefs = new OSDMap(); OSDMap respAccessPrefs = new OSDMap();
respAccessPrefs["max"] = data.AccessPrefs; respAccessPrefs["max"] = data.AccessPrefs;
resp["access_prefs"] = respAccessPrefs; resp["access_prefs"] = respAccessPrefs;
OSDMap respDefaultPerms = new OSDMap(); OSDMap respDefaultPerms = new OSDMap();
respDefaultPerms["Everyone"] = data.PermEveryone; respDefaultPerms["Everyone"] = data.PermEveryone;
respDefaultPerms["Group"] = data.PermGroup; respDefaultPerms["Group"] = data.PermGroup;
respDefaultPerms["NextOwner"] = data.PermNextOwner; respDefaultPerms["NextOwner"] = data.PermNextOwner;
resp["default_object_perm_masks"] = respDefaultPerms; resp["default_object_perm_masks"] = respDefaultPerms;
resp["god_level"] = 0; // *TODO: Add this resp["god_level"] = 0; // *TODO: Add this
resp["hover_height"] = data.HoverHeight; resp["hover_height"] = data.HoverHeight;
resp["language"] = data.Language; resp["language"] = data.Language;
resp["language_is_public"] = data.LanguageIsPublic; resp["language_is_public"] = data.LanguageIsPublic;
IAvatarFactoryModule afm = m_scenes[0].RequestModuleInterface<IAvatarFactoryModule>();
afm?.SetPreferencesHoverZ(agent, (float)data.HoverHeight);
string response = OSDParser.SerializeLLSDXmlString(resp); string response = OSDParser.SerializeLLSDXmlString(resp);
return response; httpResponse.RawBuffer = Encoding.UTF8.GetBytes(response);
httpResponse.StatusCode = (int)HttpStatusCode.OK;
} }
#endregion Region module #endregion Region module
} }
} }