From 0772e19af25b8524fa2527a4d5f3bac496d07811 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 3 Oct 2010 20:01:59 -0700 Subject: [PATCH 1/6] Added viewer's channel, mac, and id0 to agent circuit data. Also moved client ip address to agent circuit data, so that it's always there. --- OpenSim/Framework/AgentCircuitData.cs | 37 ++++++++++++++++++- .../EntityTransfer/EntityTransferModule.cs | 22 ++++++++--- .../Handlers/Hypergrid/HomeAgentHandlers.cs | 2 +- .../Server/Handlers/Login/LLLoginHandlers.cs | 19 ++++++++-- .../Hypergrid/UserAgentServiceConnector.cs | 8 +++- .../HypergridService/UserAgentService.cs | 6 ++- OpenSim/Services/Interfaces/ILoginService.cs | 3 +- .../Services/LLLoginService/LLLoginService.cs | 20 +++++++--- 8 files changed, 97 insertions(+), 20 deletions(-) diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs index 783a8337a5..4f89d78c0e 100644 --- a/OpenSim/Framework/AgentCircuitData.cs +++ b/OpenSim/Framework/AgentCircuitData.cs @@ -108,10 +108,30 @@ namespace OpenSim.Framework public string ServiceSessionID = string.Empty; /// - /// Viewer's version string + /// The client's IP address, as captured by the login service + /// + public string IPAddress; + + /// + /// Viewer's version string as reported by the viewer at login /// public string Viewer; + /// + /// The channel strinf sent by the viewer at login + /// + public string Channel; + + /// + /// The Mac address as reported by the viewer at login + /// + public string Mac; + + /// + /// The id0 as reported by the viewer at login + /// + public string Id0; + /// /// Position the Agent's Avatar starts in the region /// @@ -179,7 +199,11 @@ namespace OpenSim.Framework args["service_session_id"] = OSD.FromString(ServiceSessionID); args["start_pos"] = OSD.FromString(startpos.ToString()); args["appearance_serial"] = OSD.FromInteger(Appearance.Serial); + args["client_ip"] = OSD.FromString(IPAddress); args["viewer"] = OSD.FromString(Viewer); + args["channel"] = OSD.FromString(Channel); + args["mac"] = OSD.FromString(Mac); + args["id0"] = OSD.FromString(Id0); if (Appearance != null) { @@ -279,8 +303,16 @@ namespace OpenSim.Framework SessionID = args["session_id"].AsUUID(); if (args["service_session_id"] != null) ServiceSessionID = args["service_session_id"].AsString(); + if (args["client_ip"] != null) + IPAddress = args["client_ip"].AsString(); if (args["viewer"] != null) Viewer = args["viewer"].AsString(); + if (args["channel"] != null) + Channel = args["channel"].AsString(); + if (args["mac"] != null) + Mac = args["mac"].AsString(); + if (args["id0"] != null) + Id0 = args["id0"].AsString(); if (args["start_pos"] != null) Vector3.TryParse(args["start_pos"].AsString(), out startpos); @@ -349,6 +381,9 @@ namespace OpenSim.Framework public float startposy; public float startposz; public string Viewer; + public string Channel; + public string Mac; + public string Id0; public sAgentCircuitData() { diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 81f49b6710..38fff1cab3 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -301,7 +301,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (currentAgentCircuit != null) { agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs; + agentCircuit.IPAddress = currentAgentCircuit.IPAddress; agentCircuit.Viewer = currentAgentCircuit.Viewer; + agentCircuit.Channel = currentAgentCircuit.Channel; + agentCircuit.Mac = currentAgentCircuit.Mac; + agentCircuit.Id0 = currentAgentCircuit.Id0; } if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) @@ -955,16 +959,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.CapsPath = CapsUtil.GetRandomCapsObjectPath(); agent.ChildrenCapSeeds = new Dictionary(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); - m_log.DebugFormat("[XXX] Seeds 1 {0}", agent.ChildrenCapSeeds.Count); + //m_log.DebugFormat("[XXX] Seeds 1 {0}", agent.ChildrenCapSeeds.Count); if (!agent.ChildrenCapSeeds.ContainsKey(sp.Scene.RegionInfo.RegionHandle)) agent.ChildrenCapSeeds.Add(sp.Scene.RegionInfo.RegionHandle, sp.ControllingClient.RequestClientInfo().CapsPath); - m_log.DebugFormat("[XXX] Seeds 2 {0}", agent.ChildrenCapSeeds.Count); + //m_log.DebugFormat("[XXX] Seeds 2 {0}", agent.ChildrenCapSeeds.Count); sp.AddNeighbourRegion(region.RegionHandle, agent.CapsPath); - foreach (ulong h in agent.ChildrenCapSeeds.Keys) - m_log.DebugFormat("[XXX] --> {0}", h); - m_log.DebugFormat("[XXX] Adding {0}", region.RegionHandle); + //foreach (ulong h in agent.ChildrenCapSeeds.Keys) + // m_log.DebugFormat("[XXX] --> {0}", h); + //m_log.DebugFormat("[XXX] Adding {0}", region.RegionHandle); agent.ChildrenCapSeeds.Add(region.RegionHandle, agent.CapsPath); if (sp.Scene.CapsModule != null) @@ -975,7 +979,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (currentAgentCircuit != null) { agent.ServiceURLs = currentAgentCircuit.ServiceURLs; + agent.IPAddress = currentAgentCircuit.IPAddress; agent.Viewer = currentAgentCircuit.Viewer; + agent.Channel = currentAgentCircuit.Channel; + agent.Mac = currentAgentCircuit.Mac; + agent.Id0 = currentAgentCircuit.Id0; } InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync; @@ -1064,7 +1072,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer if (currentAgentCircuit != null) { agent.ServiceURLs = currentAgentCircuit.ServiceURLs; + agent.IPAddress = currentAgentCircuit.IPAddress; agent.Viewer = currentAgentCircuit.Viewer; + agent.Channel = currentAgentCircuit.Channel; + agent.Mac = currentAgentCircuit.Mac; + agent.Id0 = currentAgentCircuit.Id0; } if (newRegions.Contains(neighbour.RegionHandle)) diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs index d10d6fc6fe..21f4f3d86a 100644 --- a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs @@ -157,7 +157,7 @@ namespace OpenSim.Server.Handlers.Hypergrid // Verify if this caller has authority to send the client IP if (callerIP == m_LoginServerIP) client_ipaddress = new IPEndPoint(IPAddress.Parse(ip_str), 0); - else + else // leaving this for now, but this warning should be removed m_log.WarnFormat("[HOME AGENT HANDLER]: Unauthorized machine {0} tried to set client ip to {1}", callerIP, ip_str); } catch diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs index 30dc65e5e8..48f5f99ed3 100644 --- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs +++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs @@ -88,14 +88,26 @@ namespace OpenSim.Server.Handlers.Login startLocation = requestData["start"].ToString(); string clientVersion = "Unknown"; - if (requestData.Contains("version")) + if (requestData.Contains("version") && requestData["version"] != null) clientVersion = requestData["version"].ToString(); // We should do something interesting with the client version... + string channel = "Unknown"; + if (requestData.Contains("channel") && requestData["channel"] != null) + channel = requestData["channel"].ToString(); + + string mac = "Unknown"; + if (requestData.Contains("mac") && requestData["mac"] != null) + mac = requestData["mac"].ToString(); + + string id0 = "Unknown"; + if (requestData.Contains("id0") && requestData["id0"] != null) + id0 = requestData["id0"].ToString(); + //m_log.InfoFormat("[LOGIN]: XMLRPC Login Requested for {0} {1}, starting in {2}, using {3}", first, last, startLocation, clientVersion); LoginResponse reply = null; - reply = m_LocalService.Login(first, last, passwd, startLocation, scopeID, clientVersion, remoteClient); + reply = m_LocalService.Login(first, last, passwd, startLocation, scopeID, clientVersion, channel, mac, id0, remoteClient); XmlRpcResponse response = new XmlRpcResponse(); response.Value = reply.ToHashtable(); @@ -166,7 +178,8 @@ namespace OpenSim.Server.Handlers.Login m_log.Info("[LOGIN]: LLSD Login Requested for: '" + map["first"].AsString() + "' '" + map["last"].AsString() + "' / " + startLocation); LoginResponse reply = null; - reply = m_LocalService.Login(map["first"].AsString(), map["last"].AsString(), map["passwd"].AsString(), startLocation, scopeID, String.Empty, remoteClient); + reply = m_LocalService.Login(map["first"].AsString(), map["last"].AsString(), map["passwd"].AsString(), startLocation, scopeID, + map["version"].AsString(), map["channel"].AsString(), map["mac"].AsString(), map["id0"].AsString(), remoteClient); return reply.ToOSDMap(); } diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 6d3c64a875..247dd7ed10 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -238,8 +238,12 @@ namespace OpenSim.Services.Connectors.Hypergrid args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString()); args["destination_name"] = OSD.FromString(destination.RegionName); args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); - if (ipaddress != null) - args["client_ip"] = OSD.FromString(ipaddress.Address.ToString()); + + // 10/3/2010 + // I added the client_ip up to the regular AgentCircuitData, so this doesn't need to be here. + // This need cleaning elsewhere... + //if (ipaddress != null) + // args["client_ip"] = OSD.FromString(ipaddress.Address.ToString()); return args; } diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 8acd618b92..eb6433cc6f 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -148,7 +148,6 @@ namespace OpenSim.Services.HypergridService agentCircuit.ServiceSessionID = "http://" + region.ExternalHostName + ":" + region.HttpPort + ";" + UUID.Random(); TravelingAgentInfo old = UpdateTravelInfo(agentCircuit, region); - //bool success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out reason); bool success = false; string myExternalIP = string.Empty; string gridName = "http://" + gatekeeper.ExternalHostName + ":" + gatekeeper.HttpPort; @@ -200,6 +199,11 @@ namespace OpenSim.Services.HypergridService { if (m_TravelingAgents.ContainsKey(agentCircuit.SessionID)) { + // Very important! Override whatever this agent comes with. + // UserAgentService always sets the IP for every new agent + // with the original IP address. + agentCircuit.IPAddress = m_TravelingAgents[agentCircuit.SessionID].ClientIPAddress; + old = m_TravelingAgents[agentCircuit.SessionID]; } diff --git a/OpenSim/Services/Interfaces/ILoginService.cs b/OpenSim/Services/Interfaces/ILoginService.cs index 9e573393d7..ee9b0b1720 100644 --- a/OpenSim/Services/Interfaces/ILoginService.cs +++ b/OpenSim/Services/Interfaces/ILoginService.cs @@ -47,7 +47,8 @@ namespace OpenSim.Services.Interfaces public interface ILoginService { - LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, IPEndPoint clientIP); + LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, + string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP); Hashtable SetLevel(string firstName, string lastName, string passwd, int level, IPEndPoint clientIP); } diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index d30c149cf0..127c4b2c5c 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs @@ -208,7 +208,8 @@ namespace OpenSim.Services.LLLoginService return response; } - public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, string clientVersion, IPEndPoint clientIP) + public LoginResponse Login(string firstName, string lastName, string passwd, string startLocation, UUID scopeID, + string clientVersion, string channel, string mac, string id0, IPEndPoint clientIP) { bool success = false; UUID session = UUID.Random(); @@ -340,7 +341,8 @@ namespace OpenSim.Services.LLLoginService // string reason = string.Empty; GridRegion dest; - AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, clientVersion, clientIP, out where, out reason, out dest); + AgentCircuitData aCircuit = LaunchAgentAtGrid(gatekeeper, destination, account, avatar, session, secureSession, position, where, + clientVersion, channel, mac, id0, clientIP, out where, out reason, out dest); destination = dest; if (aCircuit == null) { @@ -600,7 +602,8 @@ namespace OpenSim.Services.LLLoginService } protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarData avatar, - UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, IPEndPoint clientIP, out string where, out string reason, out GridRegion dest) + UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, + IPEndPoint clientIP, out string where, out string reason, out GridRegion dest) { where = currentWhere; ISimulationService simConnector = null; @@ -640,7 +643,7 @@ namespace OpenSim.Services.LLLoginService if (m_UserAgentService == null && simConnector != null) { circuitCode = (uint)Util.RandomClass.Next(); ; - aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, viewer); + aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); success = LaunchAgentDirectly(simConnector, destination, aCircuit, out reason); if (!success && m_GridService != null) { @@ -665,7 +668,7 @@ namespace OpenSim.Services.LLLoginService if (m_UserAgentService != null) { circuitCode = (uint)Util.RandomClass.Next(); ; - aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, viewer); + aCircuit = MakeAgent(destination, account, avatar, session, secureSession, circuitCode, position, clientIP.Address.ToString(), viewer, channel, mac, id0); success = LaunchAgentIndirectly(gatekeeper, destination, aCircuit, clientIP, out reason); if (!success && m_GridService != null) { @@ -694,7 +697,8 @@ namespace OpenSim.Services.LLLoginService } private AgentCircuitData MakeAgent(GridRegion region, UserAccount account, - AvatarData avatar, UUID session, UUID secureSession, uint circuit, Vector3 position, string viewer) + AvatarData avatar, UUID session, UUID secureSession, uint circuit, Vector3 position, + string ipaddress, string viewer, string channel, string mac, string id0) { AgentCircuitData aCircuit = new AgentCircuitData(); @@ -715,7 +719,11 @@ namespace OpenSim.Services.LLLoginService aCircuit.SecureSessionID = secureSession; aCircuit.SessionID = session; aCircuit.startpos = position; + aCircuit.IPAddress = ipaddress; aCircuit.Viewer = viewer; + aCircuit.Channel = channel; + aCircuit.Mac = mac; + aCircuit.Id0 = id0; SetServiceURLs(aCircuit, account); return aCircuit; From 934ae03d44716e7102d4548045a6aed891209603 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sun, 3 Oct 2010 20:35:26 -0700 Subject: [PATCH 2/6] Made the Gatekeeper proxy-able. --- .../Handlers/Hypergrid/AgentHandlers.cs | 3 ++- .../Hypergrid/GatekeeperServerConnector.cs | 6 ++++- .../Handlers/Simulation/AgentHandlers.cs | 22 ++++++++++++++++++- bin/Robust.HG.ini.example | 4 ++++ bin/Robust.ini.example | 3 +++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs index c95165398b..31eefb1a6e 100644 --- a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs @@ -54,9 +54,10 @@ namespace OpenSim.Server.Handlers.Hypergrid private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private IGatekeeperService m_GatekeeperService; - public GatekeeperAgentHandler(IGatekeeperService gatekeeper) + public GatekeeperAgentHandler(IGatekeeperService gatekeeper, bool proxy) { m_GatekeeperService = gatekeeper; + m_Proxy = proxy; } protected override bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) diff --git a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs index dcb27257a0..49de8b1c66 100644 --- a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs @@ -51,6 +51,8 @@ namespace OpenSim.Server.Handlers.Hypergrid get { return m_GatekeeperService; } } + bool m_Proxy = false; + public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server, ISimulationService simService) : base(config, server, String.Empty) { @@ -65,11 +67,13 @@ namespace OpenSim.Server.Handlers.Hypergrid if (m_GatekeeperService == null) throw new Exception("Gatekeeper server connector cannot proceed because of missing service"); + m_Proxy = gridConfig.GetBoolean("HasProxy", false); + HypergridHandlers hghandlers = new HypergridHandlers(m_GatekeeperService); server.AddXmlRPCHandler("link_region", hghandlers.LinkRegionRequest, false); server.AddXmlRPCHandler("get_region", hghandlers.GetRegion, false); - server.AddHTTPHandler("/foreignagent/", new GatekeeperAgentHandler(m_GatekeeperService).Handler); + server.AddHTTPHandler("/foreignagent/", new GatekeeperAgentHandler(m_GatekeeperService, m_Proxy).Handler); } public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server) diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 2997430302..1f7e50217f 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs @@ -52,6 +52,8 @@ namespace OpenSim.Server.Handlers.Simulation private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private ISimulationService m_SimulationService; + protected bool m_Proxy = false; + public AgentHandler() { } public AgentHandler(ISimulationService sim) @@ -179,13 +181,31 @@ namespace OpenSim.Server.Handlers.Simulation resp["reason"] = OSD.FromString(reason); resp["success"] = OSD.FromBoolean(result); // Let's also send out the IP address of the caller back to the caller (HG 1.5) - resp["your_ip"] = OSD.FromString(Util.GetCallerIP(request)); + resp["your_ip"] = OSD.FromString(GetCallerIP(request)); // TODO: add reason if not String.Empty? responsedata["int_response_code"] = HttpStatusCode.OK; responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); } + private string GetCallerIP(Hashtable request) + { + if (!m_Proxy) + return Util.GetCallerIP(request); + + // We're behind a proxy + Hashtable headers = (Hashtable)request["headers"]; + if (headers.ContainsKey("X-Forwarded-For") && headers["X-Forwarded-For"] != null) + { + IPEndPoint ep = Util.GetClientIPFromXFF((string)headers["X-Forwarded-For"]); + if (ep != null) + return ep.Address.ToString(); + } + + // Oops + return Util.GetCallerIP(request); + } + // subclasses can override this protected virtual bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason) { diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index deceb86cdd..0d87c4b74f 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -212,6 +212,10 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; Does this grid allow incoming links to any region in it? ; If false, HG TPs happen only to the Default regions specified in [GridService] section AllowTeleportsToAnyRegion = true + + ; If you run this gatekeeper server behind a proxy, set this to true + ; HasProxy = true + [UserAgentService] LocalServiceModule = "OpenSim.Services.HypergridService.dll:UserAgentService" diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index 093ead81d2..e42268dc31 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -141,6 +141,9 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; For snowglobe's web map ; MapTileURL = ""; + ; If you run this login server behind a proxy, set this to true + ; HasProxy = true + [GridInfoService] ; These settings are used to return information on a get_grid_info call. From 940246f2d50b505113e27b0c15ab349047c4413d Mon Sep 17 00:00:00 2001 From: Latif Khalifa Date: Mon, 4 Oct 2010 06:14:02 +0200 Subject: [PATCH 3/6] Use libomv 0.8.4.3445 --- bin/OpenMetaverse.StructuredData.XML | 666 +- bin/OpenMetaverse.StructuredData.dll | Bin 102400 -> 102400 bytes bin/OpenMetaverse.XML | 49977 ++++++++++++------------- bin/OpenMetaverse.dll | Bin 1712128 -> 1695744 bytes bin/OpenMetaverse.dll.config | 14 +- bin/OpenMetaverseTypes.XML | 5198 ++- bin/OpenMetaverseTypes.dll | Bin 114688 -> 114688 bytes 7 files changed, 27887 insertions(+), 27968 deletions(-) diff --git a/bin/OpenMetaverse.StructuredData.XML b/bin/OpenMetaverse.StructuredData.XML index a8e314f634..31f9d60bbc 100644 --- a/bin/OpenMetaverse.StructuredData.XML +++ b/bin/OpenMetaverse.StructuredData.XML @@ -1,333 +1,333 @@ - - - - OpenMetaverse.StructuredData - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Uses reflection to create an SDMap from all of the SD - serializable types in an object - - Class or struct containing serializable types - An SDMap holding the serialized values from the - container object - - - - Uses reflection to deserialize member variables in an object from - an SDMap - - Reference to an object to fill with deserialized - values - Serialized values to put in the target - object - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + OpenMetaverse.StructuredData + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Uses reflection to create an SDMap from all of the SD + serializable types in an object + + Class or struct containing serializable types + An SDMap holding the serialized values from the + container object + + + + Uses reflection to deserialize member variables in an object from + an SDMap + + Reference to an object to fill with deserialized + values + Serialized values to put in the target + object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index 45a72ecc9929c2d34643ca55ed39cda44596fc12..31f34fa3901d74d9da9c3b1ed93790e8f37cb2bd 100644 GIT binary patch literal 102400 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

5ITafK5ybc`N7czC$#xNBh$1rNUMs+Ls*Y zizSAJGfXL>R!)rR>*whlQ#rExBG5SDntx!A$;D4Ir)mbHY-Q9o4aed#pG=%hN>sAJ!4 zIGLh?D$$!%t=N)E4%$+nwB2}0XC*;5ECa@7Q!EccxoB~d3CC^a@@OetRa+@(x6(_mp z5#0AuiKICelny=hGZ5hjAkQuVo1gtV=zOKlB2_lo(n-GRDhBm zAU0gLp|q>03qKeh>4OKFp{YKK80rBLl5Q}{9FCD65QX*0z}EE*$Z#vglKLza+e|Ch zB{H1OBnKy-px@x{9PUdFrLzfHBFQ0G zhf3bPEJS_WH{{4R?_L%n_b3+WJHp{lc9ybtvH-?CcXBq~3xu>)ZVai5OWa#A|AO#c9Z%_F>60_K2rszuG-u zd{mO)bPQBD5hpK#Q&PiZI?dj>xCX5fq*Ov?N*hwZ#JM8ejr%cPr5T+;L2wSA>p&`* z;2<*~kvY8`Rl%s{RYUh4Nk7sAw8ICifL(*rzv1->NG`^K21}C6m6Pp*1&1<3uv_<{q7{R+m_&ATCQ}X(WgGU<lDGwqW?6tKY#S*&Jgfq9lfvzxbPI!(K$=t2xQZEbX|+RjpPCR6cr)3CkP zDL9TDuWgF#=|-{i@1}Tg>M@-41gCiNY*X#oq%6mx6I?ipeBb1>In`rwR^!|_G`Y`m z4ub3_XLC4}qJ2L{6*ea_IB!CEP6~a_7`epQjwlDk6|p)=TNz=Kkj1H}EVd(w0|abV z$xT)rw_}*%Hi(fRR=b4`42T`HWk=!29_tWa1&5)f3)G#W_!>nr7@$H#7im#0Gq@r~ zBCsen52a&qI{m}TKSV+iTTrX6(H&vXkr`B!X~+_sB-{|4PEspbWJL}l8WSGIf)=M{ z5{S7|EHfg-r9$rZU3zq|KN%O649BzMALlbmOfrSiDr7I~NU1FVI@dtKeDH}KKDx0` zHrD|dAcCcGX9m1f{caLP3d_Eb^ z?T9DQ5p)lmXV(%+NLM+OP~IrE;o5C+X5~spn&<#eV!!P4?r=1U8{6J(#m^bi85!Q! zMpskk%g6$+-=T{@*f9lr_ac%RQQ|%jPD55q`EaVo(5H?&gqgd+4py!9x<~A#t+Ll$TdlE8DnF$rUgKp>CQ+_wog7SeB<-6}G z-?hU|w~z^MrE}TrO=nUiDVQ6=(F+X9)QW>E=3E5mZ z3nBU$i49`=kQ5Fw-JrA5N1K>_HYd9Cw2~J+B4{){$T|4)96;%gD~y=qu+>9LLE!u3X