From b5ed82acced82291a95186f1a08ff9c401f8fae3 Mon Sep 17 00:00:00 2001 From: Christopher Date: Thu, 16 Jul 2020 23:52:08 +0200 Subject: [PATCH] add new class --- MultiGridClient/AssetServicesConnector.cs | 39 +- MultiGridClient/AvatarServicesConnector.cs | 410 +++++++++++++++++++++ 2 files changed, 411 insertions(+), 38 deletions(-) create mode 100644 MultiGridClient/AvatarServicesConnector.cs diff --git a/MultiGridClient/AssetServicesConnector.cs b/MultiGridClient/AssetServicesConnector.cs index 91507cf..e67519f 100644 --- a/MultiGridClient/AssetServicesConnector.cs +++ b/MultiGridClient/AssetServicesConnector.cs @@ -66,8 +66,6 @@ namespace OpenSim.Services.Connectors private Dictionary> m_AssetHandlers = new Dictionary>(); - private Dictionary m_UriMap = new Dictionary(); - private Thread[] m_fetchThreads; public int MaxAssetRequestConcurrency @@ -116,19 +114,6 @@ namespace OpenSim.Services.Connectors m_retryTimer.AutoReset = true; m_retryTimer.Interval = 60000; - Uri serverUri = new Uri(m_assetServers[0]); - - string groupHost = serverUri.Host; - - for (int i = 0 ; i < 256 ; i++) - { - string prefix = i.ToString("x2"); - groupHost = assetConfig.GetString("AssetServerHost_"+prefix, groupHost); - - m_UriMap[prefix] = groupHost; - //m_log.DebugFormat("[ASSET]: Using {0} for prefix {1}", groupHost, prefix); - } - m_fetchThreads = new Thread[2]; for (int i = 0 ; i < 2 ; i++) @@ -139,29 +124,7 @@ namespace OpenSim.Services.Connectors private string MapServer(String m_ServerURI, string id) { - if (m_UriMap.Count == 0) - return m_ServerURI; - - UriBuilder serverUri = new UriBuilder(m_ServerURI); - - string prefix = id.Substring(0, 2).ToLower(); - - string host; - - // HG URLs will not be valid UUIDS - if (m_UriMap.ContainsKey(prefix)) - host = m_UriMap[prefix]; - else - host = m_UriMap["00"]; - - serverUri.Host = host; - - // m_log.DebugFormat("[ASSET]: Using {0} for host name for prefix {1}", host, prefix); - - string ret = serverUri.Uri.AbsoluteUri; - if (ret.EndsWith("/")) - ret = ret.Substring(0, ret.Length - 1); - return ret; + return m_ServerURI; } protected void retryCheck(object source, ElapsedEventArgs e) diff --git a/MultiGridClient/AvatarServicesConnector.cs b/MultiGridClient/AvatarServicesConnector.cs new file mode 100644 index 0000000..38509f4 --- /dev/null +++ b/MultiGridClient/AvatarServicesConnector.cs @@ -0,0 +1,410 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using log4net; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.ServiceAuth; +using OpenSim.Services.Interfaces; +using GridRegion = OpenSim.Services.Interfaces.GridRegion; +using IAvatarService = OpenSim.Services.Interfaces.IAvatarService; +using OpenSim.Server.Base; +using OpenMetaverse; + +namespace OpenSim.Services.Connectors +{ + public class AvatarServicesConnector : BaseServiceConnector, IAvatarService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + + private List m_avatarServers = new List(); + + public AvatarServicesConnector() + { + } + + public AvatarServicesConnector(string serverURI) + { + m_avatarServers.AddRange(serverURI.TrimEnd('/').Split(';')); + } + + public AvatarServicesConnector(IConfigSource source) + : base(source, "AvatarService") + { + Initialise(source); + } + + public virtual void Initialise(IConfigSource source) + { + IConfig gridConfig = source.Configs["AvatarService"]; + if (gridConfig == null) + { + m_log.Error("[AVATAR CONNECTOR]: AvatarService missing from OpenSim.ini"); + throw new Exception("Avatar connector init error"); + } + + string serviceURI = gridConfig.GetString("AvatarServerURI", + String.Empty); + + if (serviceURI == String.Empty) + { + m_log.Error("[AVATAR CONNECTOR]: No Server URI named in section AvatarService"); + throw new Exception("Avatar connector init error"); + } + + m_avatarServers.AddRange(serviceURI.Split(';')); + + base.Initialise(source, "AvatarService"); + } + + + #region IAvatarService + + public AvatarAppearance GetAppearance(UUID userID) + { + foreach(String serverURL in m_avatarServers) + { + AvatarAppearance result = GetAppearance(serverURL, userID); + + if (result != null) + return result; + } + + return null; + } + + public AvatarAppearance GetAppearance(String m_ServerURI, UUID userID) + { + AvatarData avatar = GetAvatar(m_ServerURI, userID); + return avatar.ToAvatarAppearance(); + } + + public bool SetAppearance(UUID userID, AvatarAppearance appearance) + { + foreach (String serverURL in m_avatarServers) + { + bool result = SetAppearance(serverURL, userID, appearance); + + if (result != false) + return result; + } + + return false; + } + + public bool SetAppearance(String m_ServerURI, UUID userID, AvatarAppearance appearance) + { + AvatarData avatar = new AvatarData(appearance); + return SetAvatar(m_ServerURI, userID, avatar); + } + + public AvatarData GetAvatar(UUID userID) + { + foreach (String serverURL in m_avatarServers) + { + AvatarData result = GetAvatar(serverURL, userID); + + if (result != null) + return result; + } + + return null; + } + + public AvatarData GetAvatar(String m_ServerURI, UUID userID) + { + Dictionary sendData = new Dictionary(); + //sendData["SCOPEID"] = scopeID.ToString(); + sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); + sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); + sendData["METHOD"] = "getavatar"; + + sendData["UserID"] = userID; + + string reply = string.Empty; + string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; + // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); + try + { + reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply == null || (reply != null && reply == string.Empty)) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: GetAgent received null or empty reply"); + return null; + } + } + catch (Exception e) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); + } + + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + AvatarData avatar = null; + + if ((replyData != null) && replyData.ContainsKey("result") && (replyData["result"] != null)) + { + if (replyData["result"] is Dictionary) + { + avatar = new AvatarData((Dictionary)replyData["result"]); + } + } + + return avatar; + + } + + public bool SetAvatar(UUID userID, AvatarData avatar) + { + foreach (String serverURL in m_avatarServers) + { + SetAvatar(serverURL, userID, avatar); + } + + return true; + } + + public bool SetAvatar(String m_ServerURI, UUID userID, AvatarData avatar) + { + Dictionary sendData = new Dictionary(); + //sendData["SCOPEID"] = scopeID.ToString(); + sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); + sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); + sendData["METHOD"] = "setavatar"; + + sendData["UserID"] = userID.ToString(); + + Dictionary structData = avatar.ToKeyValuePairs(); + + foreach (KeyValuePair kvp in structData) + sendData[kvp.Key] = kvp.Value.ToString(); + + + string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; + //m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); + try + { + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply != string.Empty) + { + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + + if (replyData.ContainsKey("result")) + { + if (replyData["result"].ToString().ToLower() == "success") + return true; + else + return false; + } + else + { + m_log.DebugFormat("[AVATAR CONNECTOR]: SetAvatar reply data does not contain result field"); + } + } + else + { + m_log.DebugFormat("[AVATAR CONNECTOR]: SetAvatar received empty reply"); + } + } + catch (Exception e) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); + } + + return false; + } + + public bool ResetAvatar(UUID userID) + { + foreach (String serverURL in m_avatarServers) + { + ResetAvatar(serverURL, userID); + } + + return true; + } + + public bool ResetAvatar(String m_ServerURI, UUID userID) + { + Dictionary sendData = new Dictionary(); + //sendData["SCOPEID"] = scopeID.ToString(); + sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); + sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); + sendData["METHOD"] = "resetavatar"; + + sendData["UserID"] = userID.ToString(); + + string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; + // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); + try + { + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply != string.Empty) + { + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + + if (replyData.ContainsKey("result")) + { + if (replyData["result"].ToString().ToLower() == "success") + return true; + else + return false; + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: SetItems reply data does not contain result field"); + + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: SetItems received empty reply"); + } + catch (Exception e) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); + } + + return false; + } + + public bool SetItems(UUID userID, string[] names, string[] values) + { + foreach (String serverURL in m_avatarServers) + { + SetItems(serverURL, userID, names, values); + } + + return true; + } + + public bool SetItems(String m_ServerURI, UUID userID, string[] names, string[] values) + { + Dictionary sendData = new Dictionary(); + sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); + sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); + sendData["METHOD"] = "setitems"; + + sendData["UserID"] = userID.ToString(); + sendData["Names"] = new List(names); + sendData["Values"] = new List(values); + + string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; + // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); + try + { + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply != string.Empty) + { + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + + if (replyData.ContainsKey("result")) + { + if (replyData["result"].ToString().ToLower() == "success") + return true; + else + return false; + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: SetItems reply data does not contain result field"); + + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: SetItems received empty reply"); + } + catch (Exception e) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); + } + + return false; + } + + public bool RemoveItems(UUID userID, string[] names) + { + foreach (String serverURL in m_avatarServers) + { + RemoveItems(serverURL, userID, names); + } + + return true; + } + + public bool RemoveItems(String m_ServerURI, UUID userID, string[] names) + { + Dictionary sendData = new Dictionary(); + //sendData["SCOPEID"] = scopeID.ToString(); + sendData["VERSIONMIN"] = ProtocolVersions.ClientProtocolVersionMin.ToString(); + sendData["VERSIONMAX"] = ProtocolVersions.ClientProtocolVersionMax.ToString(); + sendData["METHOD"] = "removeitems"; + + sendData["UserID"] = userID.ToString(); + sendData["Names"] = new List(names); + + string reqString = ServerUtils.BuildQueryString(sendData); + string uri = m_ServerURI + "/avatar"; + // m_log.DebugFormat("[AVATAR CONNECTOR]: queryString = {0}", reqString); + try + { + string reply = SynchronousRestFormsRequester.MakeRequest("POST", uri, reqString, m_Auth); + if (reply != string.Empty) + { + Dictionary replyData = ServerUtils.ParseXmlResponse(reply); + + if (replyData.ContainsKey("result")) + { + if (replyData["result"].ToString().ToLower() == "success") + return true; + else + return false; + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: RemoveItems reply data does not contain result field"); + + } + else + m_log.DebugFormat("[AVATAR CONNECTOR]: RemoveItems received empty reply"); + } + catch (Exception e) + { + m_log.DebugFormat("[AVATAR CONNECTOR]: Exception when contacting presence server at {0}: {1}", uri, e.Message); + } + + return false; + } + + #endregion + + } +}