protected override void UnpackData(OSDMap args, AgentDestinationData d, Hashtable request) { base.UnpackData(args, d, request); ExtendedAgentDestinationData data = (ExtendedAgentDestinationData)d; try { if (args.ContainsKey("gatekeeper_host") && args["gatekeeper_host"] != null) data.host = args["gatekeeper_host"].AsString(); if (args.ContainsKey("gatekeeper_port") && args["gatekeeper_port"] != null) Int32.TryParse(args["gatekeeper_port"].AsString(), out data.port); if (args.ContainsKey("gatekeeper_serveruri") && args["gatekeeper_serveruri"] != null) data.gatekeeperServerURI = args["gatekeeper_serveruri"]; if (args.ContainsKey("destination_serveruri") && args["destination_serveruri"] != null) data.destinationServerURI = args["destination_serveruri"]; } catch (InvalidCastException) { m_log.ErrorFormat("[HOME AGENT HANDLER]: Bad cast in UnpackData"); } string callerIP = GetCallerIP(request); // Verify if this call came from the login server if (callerIP == m_LoginServerIP) data.fromLogin = true; }
public void Unpack(OSDMap args) { if (args["point"] != null) AttachPoint = args["point"].AsInteger(); ItemID = args.ContainsKey("item") ? args["item"].AsUUID() : UUID.Zero; AssetID = args.ContainsKey("asset") ? args["asset"].AsUUID() : UUID.Zero; }
public override void FromOSD(OSDMap map) { AgentInfo = new IAgentInfo(); AgentInfo.FromOSD((OSDMap) (map["AgentInfo"])); UserAccount = new UserAccount(); UserAccount.FromOSD((OSDMap)(map["UserAccount"])); if (!map.ContainsKey("ActiveGroup")) ActiveGroup = null; else { ActiveGroup = new GroupMembershipData(); ActiveGroup.FromOSD((OSDMap)(map["ActiveGroup"])); } GroupMemberships = ((OSDArray) map["GroupMemberships"]).ConvertAll<GroupMembershipData>((o) => { GroupMembershipData group = new GroupMembershipData (); group .FromOSD ((OSDMap ) o); return group; }); OfflineMessages = ((OSDArray) map["OfflineMessages"]).ConvertAll<GridInstantMessage>((o) => { GridInstantMessage group = new GridInstantMessage (); group.FromOSD( (OSDMap) o); return group; }); MuteList = ((OSDArray) map["MuteList"]).ConvertAll<MuteList>((o) => { MuteList group = new MuteList(); group.FromOSD((OSDMap) o); return group; }); if (map.ContainsKey("Appearance")) { Appearance = new AvatarAppearance(); Appearance.FromOSD((OSDMap)map["Appearance"]); } if (map.ContainsKey("FriendOnlineStatuses")) FriendOnlineStatuses = ((OSDArray)map["FriendOnlineStatuses"]).ConvertAll<UUID>((o) => { return o; }); if (map.ContainsKey("Friends")) Friends = ((OSDArray)map["Friends"]).ConvertAll<FriendInfo>((o) => { FriendInfo f = new FriendInfo(); f.FromOSD((OSDMap)o); return f; }); }
/// <summary> /// Region side /// </summary> /// <param name="message"></param> /// <returns></returns> protected OSDMap OnMessageReceived(OSDMap message) { //We need to check and see if this is an AgentStatusChange if (message.ContainsKey("Method") && message["Method"] == "UpdateAvatarAppearance") { var appearance = new AvatarAppearance(message["AgentID"], (OSDMap)message["Appearance"]); ISceneManager manager = m_registry.RequestModuleInterface<ISceneManager>(); if (manager != null) { foreach (IScene scene in manager.Scenes) { IScenePresence sp = scene.GetScenePresence(appearance.Owner); if (sp != null && !sp.IsChildAgent) { var avappmodule = sp.RequestModuleInterface<IAvatarAppearanceModule>(); if (avappmodule != null) { avappmodule.Appearance = appearance; avappmodule.SendAppearanceToAgent(sp); avappmodule.SendAppearanceToAllOtherAgents(); } } } } } return null; }
OSDMap GetParcelsByRegion (OSDMap map) { var resp = new OSDMap (); resp ["Parcels"] = new OSDArray (); resp ["Total"] = OSD.FromInteger (0); var directory = DataPlugins.RequestPlugin<IDirectoryServiceConnector> (); if (directory != null && map.ContainsKey ("Region") == true) { UUID regionID = UUID.Parse (map ["Region"]); UUID scopeID = map.ContainsKey ("ScopeID") ? UUID.Parse (map ["ScopeID"].ToString ()) : UUID.Zero; UUID owner = map.ContainsKey ("Owner") ? UUID.Parse (map ["Owner"].ToString ()) : UUID.Zero; uint start = map.ContainsKey ("Start") ? uint.Parse (map ["Start"].ToString ()) : 0; uint count = map.ContainsKey ("Count") ? uint.Parse (map ["Count"].ToString ()) : 10; ParcelFlags flags = map.ContainsKey ("Flags") ? (ParcelFlags)int.Parse (map ["Flags"].ToString ()) : ParcelFlags.None; ParcelCategory category = map.ContainsKey ("Category") ? (ParcelCategory)uint.Parse (map ["Flags"].ToString ()) : ParcelCategory.Any; uint total = directory.GetNumberOfParcelsByRegion (regionID, owner, flags, category); if (total > 0) { resp ["Total"] = OSD.FromInteger ((int)total); if (count == 0) { return resp; } List<LandData> regionParcels = directory.GetParcelsByRegion (start, count, regionID, owner, flags, category); OSDArray parcels = new OSDArray (regionParcels.Count); regionParcels.ForEach (delegate (LandData parcel) { parcels.Add (LandData2WebOSD (parcel)); }); resp ["Parcels"] = parcels; } } return resp; }
public void UnpackUpdateMessage(OSDMap args) { if (args.ContainsKey("animation")) animID = args["animation"].AsUUID(); if (args.ContainsKey("object_id")) objectID = args["object_id"].AsUUID(); if (args.ContainsKey("seq_num")) sequenceNum = args["seq_num"].AsInteger(); }
OSDMap GetGroups (OSDMap map) { var resp = new OSDMap (); var start = map.ContainsKey ("Start") ? map ["Start"].AsUInteger () : 0; resp ["Start"] = start; resp ["Total"] = 0; var groups = DataPlugins.RequestPlugin<IGroupsServiceConnector> (); var Groups = new OSDArray (); if (groups != null) { var sort = new Dictionary<string, bool> (); var boolFields = new Dictionary<string, bool> (); if (map.ContainsKey ("Sort") && map ["Sort"].Type == OSDType.Map) { var fields = (OSDMap)map ["Sort"]; foreach (string field in fields.Keys) { sort [field] = int.Parse (fields [field]) != 0; } } if (map.ContainsKey ("BoolFields") && map ["BoolFields"].Type == OSDType.Map) { var fields = (OSDMap)map ["BoolFields"]; foreach (string field in fields.Keys) { boolFields [field] = int.Parse (fields [field]) != 0; } } var reply = groups.GetGroupRecords ( AdminAgentID, start, map.ContainsKey ("Count") ? map ["Count"].AsUInteger () : 10, sort, boolFields ); if (reply.Count > 0) { foreach (GroupRecord groupReply in reply) { Groups.Add (GroupRecord2OSDMap (groupReply)); } } resp ["Total"] = groups.GetNumberOfGroups (AdminAgentID, boolFields); } resp ["Groups"] = Groups; return resp; }
OSDMap LocalSimulationServiceConnector_OnMessageReceived(OSDMap message) { if (!message.ContainsKey("Method")) return null; switch (message["Method"].AsString()) { case "CreateAgentRequest": CreateAgentRequest createAgentRequest = new CreateAgentRequest(); createAgentRequest.FromOSD(message); CreateAgentResponse createAgentResponse = new CreateAgentResponse(); createAgentResponse.Success = CreateAgent(createAgentRequest.Destination, createAgentRequest.CircuitData, createAgentRequest.TeleportFlags, out createAgentResponse); return createAgentResponse.ToOSD(); case "UpdateAgentPositionRequest": UpdateAgentPositionRequest updateAgentPositionRequest = new UpdateAgentPositionRequest(); updateAgentPositionRequest.FromOSD(message); return new OSDMap() { new KeyValuePair<string, OSD>("Success", UpdateAgent(updateAgentPositionRequest.Destination, updateAgentPositionRequest.Update)) }; case "UpdateAgentDataRequest": UpdateAgentDataRequest updateAgentDataRequest = new UpdateAgentDataRequest(); updateAgentDataRequest.FromOSD(message); return new OSDMap() { new KeyValuePair<string, OSD>("Success", UpdateAgent(updateAgentDataRequest.Destination, updateAgentDataRequest.Update)) }; case "FailedToMoveAgentIntoNewRegionRequest": FailedToMoveAgentIntoNewRegionRequest failedToMoveAgentIntoNewRegionRequest = new FailedToMoveAgentIntoNewRegionRequest(); failedToMoveAgentIntoNewRegionRequest.FromOSD(message); FailedToMoveAgentIntoNewRegion(failedToMoveAgentIntoNewRegionRequest.AgentID, failedToMoveAgentIntoNewRegionRequest.RegionID); break; case "CloseAgentRequest": CloseAgentRequest closeAgentRequest = new CloseAgentRequest(); closeAgentRequest.FromOSD(message); CloseAgent(closeAgentRequest.Destination, closeAgentRequest.AgentID); break; case "MakeChildAgentRequest": MakeChildAgentRequest makeChildAgentRequest = new MakeChildAgentRequest(); makeChildAgentRequest.FromOSD(message); MakeChildAgent(makeChildAgentRequest.AgentID, makeChildAgentRequest.Destination, makeChildAgentRequest.IsCrossing); break; case "FailedToTeleportAgentRequest": FailedToTeleportAgentRequest failedToTeleportAgentRequest = new FailedToTeleportAgentRequest(); failedToTeleportAgentRequest.FromOSD(message); FailedToTeleportAgent(failedToTeleportAgentRequest.Destination, failedToTeleportAgentRequest.FailedRegionID, failedToTeleportAgentRequest.AgentID, failedToTeleportAgentRequest.Reason, failedToTeleportAgentRequest.IsCrossing); break; case "RetrieveAgentRequest": RetrieveAgentRequest retrieveAgentRequest = new RetrieveAgentRequest(); retrieveAgentRequest.FromOSD(message); RetrieveAgentResponse retrieveAgentResponse = new RetrieveAgentResponse(); retrieveAgentResponse.Success = RetrieveAgent(retrieveAgentRequest.Destination, retrieveAgentRequest.AgentID, retrieveAgentRequest.AgentIsLeaving, out retrieveAgentResponse.AgentData, out retrieveAgentResponse.CircuitData); return retrieveAgentResponse.ToOSD(); case "CreateObjectRequest": CreateObjectRequest createObjectRequest = new CreateObjectRequest(); createObjectRequest.Scene = Scene; createObjectRequest.FromOSD(message); return new OSDMap() { new KeyValuePair<string, OSD>("Success", CreateObject(createObjectRequest.Destination, createObjectRequest.Object)) }; } return null; }
/// <summary> /// Attempts to convert an LLSD structure to a known Packet type /// </summary> /// <param name="capsEventName">Event name, this must match an actual /// packet name for a Packet to be successfully built</param> /// <param name="body">LLSD to convert to a Packet</param> /// <returns>A Packet on success, otherwise null</returns> public static Packet BuildPacket(string capsEventName, OSDMap body) { Assembly assembly = Assembly.GetExecutingAssembly(); // Check if we have a subclass of packet with the same name as this event Type type = assembly.GetType("OpenMetaverse.Packets." + capsEventName + "Packet", false); if (type == null) return null; Packet packet = null; try { // Create an instance of the object packet = (Packet)Activator.CreateInstance(type); // Iterate over all of the fields in the packet class, looking for matches in the LLSD foreach (FieldInfo field in type.GetFields()) { if (body.ContainsKey(field.Name)) { Type blockType = field.FieldType; if (blockType.IsArray) { OSDArray array = (OSDArray)body[field.Name]; Type elementType = blockType.GetElementType(); object[] blockArray = (object[])Array.CreateInstance(elementType, array.Count); for (int i = 0; i < array.Count; i++) { OSDMap map = (OSDMap)array[i]; blockArray[i] = ParseLLSDBlock(map, elementType); } field.SetValue(packet, blockArray); } else { OSDMap map = (OSDMap)((OSDArray)body[field.Name])[0]; field.SetValue(packet, ParseLLSDBlock(map, blockType)); } } } } catch (Exception) { //FIXME Logger.Log(e.Message, Helpers.LogLevel.Error, e); } return packet; }
protected OSDMap OnMessageReceived(OSDMap message) { //If it is an async message request, make sure that the request is valid and check it if (message["Method"] == "AsyncMessageRequest") { try { ICapsService service = m_registry.RequestModuleInterface<ICapsService>(); OSDMap response = new OSDMap(); OSDMap mapresponse = new OSDMap(); if (message.ContainsKey("RegionHandles")) { OSDArray handles = (OSDArray)message["RegionHandles"]; for (int i = 0; i < handles.Count; i += 2) { ulong regionHandle = handles[i].AsULong(); IRegionCapsService region = service.GetCapsForRegion(regionHandle); if (region != null) { bool verified = (region.Region.SessionID == handles[i + 1].AsUUID()); if (verified) { if (m_regionMessages.ContainsKey(regionHandle)) { //Get the array, then remove it OSDArray array = m_regionMessages[regionHandle]; m_regionMessages.Remove(regionHandle); mapresponse[regionHandle.ToString()] = array; } } } } } response["Messages"] = mapresponse; return response; } catch { } } return null; }
/// <summary> /// Request avatar's classified ads. /// </summary> /// <returns> /// An array containing all the calassified uuid and it's name created by the creator id /// </returns> /// <param name='json'> /// Our parameters are in the OSDMap json["params"] /// </param> /// <param name='response'> /// If set to <c>true</c> response. /// </param> public bool AvatarClassifiedsRequest(OSDMap json, ref JsonRpcResponse response) { if(!json.ContainsKey("params")) { response.Error.Code = ErrorCode.ParseError; m_log.DebugFormat ("Classified Request"); return false; } OSDMap request = (OSDMap)json["params"]; UUID creatorId = new UUID(request["creatorId"].AsString()); OSDArray data = (OSDArray) Service.AvatarClassifiedsRequest(creatorId); response.Result = data; return true; }
public override void FromOSD (OSDMap map) { State = map["State"].AsString (); Source = map["Source"].AsString (); ItemID = map["ItemID"].AsUUID (); Running = map["Running"].AsBoolean (); Disabled = map["Disabled"].AsBoolean (); Variables = map["Variables"].AsString (); Plugins = (OSDMap)map["Plugins"]; PermsGranter = map["PermsGranter"].AsUUID (); PermsMask = map["PermsMask"].AsInteger (); MinEventDelay = map["MinEventDelay"].AsReal (); AssemblyName = map["AssemblyName"].AsString (); UserInventoryID = map["UserInventoryID"].AsUUID (); TargetOmegaWasSet = map["TargetOmegaWasSet"].AsBoolean (); if(map.ContainsKey("Compiled")) Compiled = map["Compiled"].AsBoolean (); }
/// <summary> /// Region side /// </summary> /// <param name="message"></param> /// <returns></returns> protected OSDMap OnMessageReceived(OSDMap message) { //We need to check and see if this is an AgentStatusChange if (message.ContainsKey("Method") && message["Method"] == "UpdateAvatarAppearance") { AvatarAppearance appearance = new AvatarAppearance(message["AgentID"], (OSDMap)message["Appearance"]); ISceneManager manager = m_registry.RequestModuleInterface<ISceneManager>(); if (manager != null && manager.Scene != null) { IAvatarFactory factory = manager.Scene.RequestModuleInterface<IAvatarFactory>(); IScenePresence sp = manager.Scene.GetScenePresence(appearance.Owner); sp.RequestModuleInterface<IAvatarAppearanceModule>().Appearance = appearance; sp.RequestModuleInterface<IAvatarAppearanceModule>().SendAppearanceToAgent(sp); sp.RequestModuleInterface<IAvatarAppearanceModule>().SendAppearanceToAllOtherAgents(); } } return null; }
OSDMap GetRegions (OSDMap map) { OSDMap resp = new OSDMap (); RegionFlags type = map.Keys.Contains ("RegionFlags") ? (RegionFlags)map ["RegionFlags"].AsInteger () : RegionFlags.RegionOnline; int start = map.Keys.Contains ("Start") ? map ["Start"].AsInteger () : 0; if (start < 0) { start = 0; } int count = map.Keys.Contains ("Count") ? map ["Count"].AsInteger () : 10; if (count < 0) { count = 1; } var regiondata = DataPlugins.RequestPlugin<IRegionData> (); Dictionary<string, bool> sort = new Dictionary<string, bool> (); string [] supportedSort = { "SortRegionName", "SortLocX", "SortLocY" }; foreach (string sortable in supportedSort) { if (map.ContainsKey (sortable)) { sort [sortable.Substring (4)] = map [sortable].AsBoolean (); } } List<GridRegion> regions = regiondata.Get (type, sort); OSDArray Regions = new OSDArray (); if (start < regions.Count) { int i = 0; int j = regions.Count <= (start + count) ? regions.Count : (start + count); for (i = start; i < j; ++i) { Regions.Add (regions [i].ToOSD ()); } } resp ["Start"] = OSD.FromInteger (start); resp ["Count"] = OSD.FromInteger (count); resp ["Total"] = OSD.FromInteger (regions.Count); resp ["Regions"] = Regions; return resp; }
public override void FromOSD(OSDMap map) { AgentInfo = new IAgentInfo(); AgentInfo.FromOSD((OSDMap)(map["AgentInfo"])); UserAccount = new UserAccount(); UserAccount.FromOSD((OSDMap)(map["UserAccount"])); if (!map.ContainsKey("ActiveGroup")) ActiveGroup = null; else { ActiveGroup = new GroupMembershipData(); ActiveGroup.FromOSD((OSDMap)(map["ActiveGroup"])); } GroupMemberships = ((OSDArray)map["GroupMemberships"]).ConvertAll<GroupMembershipData>((o) => { GroupMembershipData group = new GroupMembershipData(); group.FromOSD((OSDMap)o); return group; }); }
protected OSDMap OnMessageReceived(OSDMap message) { //We need to check and see if this is an GroupSessionAgentUpdate if(message.ContainsKey("Method") && message["Method"] == "GroupSessionAgentUpdate") { //Send it on to whomever it concerns OSDMap innerMessage = (OSDMap)message["Message"]; if(innerMessage["message"] == "ChatterBoxSessionAgentListUpdates")//ONLY forward on this type of message { UUID agentID = message["AgentID"]; IEventQueueService eqs = m_registry.RequestModuleInterface<IEventQueueService>(); ICapsService caps = m_registry.RequestModuleInterface<ICapsService>(); if(caps != null) { IClientCapsService clientCaps = caps.GetClientCapsService(agentID); if(clientCaps != null && clientCaps.GetRootCapsService() != null) eqs.Enqueue(innerMessage, agentID, clientCaps.GetRootCapsService().RegionHandle); } } } return null; }
private OSDMap RegisterRegionWithGridModule_OnMessageReceived(OSDMap message) { if (!message.ContainsKey("Method")) return null; if (message["Method"] == "NeighborChange") { OSDMap innerMessage = (OSDMap) message["Message"]; bool down = innerMessage["Down"].AsBoolean(); UUID regionID = innerMessage["Region"].AsUUID(); UUID targetregionID = innerMessage["TargetRegion"].AsUUID(); if (m_knownNeighbors.ContainsKey(targetregionID)) { if (down) { //Remove it m_knownNeighbors[targetregionID].RemoveAll(delegate(GridRegion r) { if (r.RegionID == regionID) return true; return false; }); } else { //Add it if it doesn't already exist if (m_knownNeighbors[targetregionID].Find(delegate(GridRegion rr) { if (rr.RegionID == regionID) return true; return false; }) == null) m_knownNeighbors[targetregionID].Add(m_scenes[0].GridService.GetRegionByUUID(null, regionID)); } } } return null; }
protected virtual OSDMap OnMessageReceived(OSDMap message) { if (!message.ContainsKey("Method")) return null; UUID AgentID = message["AgentID"].AsUUID(); ulong requestingRegion = message["RequestingRegion"].AsULong(); ICapsService capsService = m_registry.RequestModuleInterface<ICapsService>(); if (capsService == null) return new OSDMap(); IClientCapsService clientCaps = capsService.GetClientCapsService(AgentID); IRegionClientCapsService regionCaps = null; if (clientCaps != null) regionCaps = clientCaps.GetCapsService(requestingRegion); if (message["Method"] == "LogoutRegionAgents") { LogOutAllAgentsForRegion(requestingRegion); } else if (message["Method"] == "RegionIsOnline") //This gets fired when the scene is fully finished starting up { //Log out all the agents first, then add any child agents that should be in this region LogOutAllAgentsForRegion(requestingRegion); IGridService GridService = m_registry.RequestModuleInterface<IGridService>(); if (GridService != null) { int x, y; Util.UlongToInts(requestingRegion, out x, out y); GridRegion requestingGridRegion = GridService.GetRegionByPosition(null, x, y); if (requestingGridRegion != null) Util.FireAndForget((o) => EnableChildAgentsForRegion(requestingGridRegion)); } } else if (message["Method"] == "DisableSimulator") { //KILL IT! if (regionCaps == null || clientCaps == null) return null; IEventQueueService eventQueue = m_registry.RequestModuleInterface<IEventQueueService>(); eventQueue.DisableSimulator(regionCaps.AgentID, regionCaps.RegionHandle); //regionCaps.Close(); //clientCaps.RemoveCAPS(requestingRegion); regionCaps.Disabled = true; } else if (message["Method"] == "ArrivedAtDestination") { if (regionCaps == null || clientCaps == null) return null; //Recieved a callback if (clientCaps.InTeleport) //Only set this if we are in a teleport, // otherwise (such as on login), this won't check after the first tp! clientCaps.CallbackHasCome = true; regionCaps.Disabled = false; //The agent is getting here for the first time (eg. login) OSDMap body = ((OSDMap) message["Message"]); //Parse the OSDMap int DrawDistance = body["DrawDistance"].AsInteger(); AgentCircuitData circuitData = new AgentCircuitData(); circuitData.UnpackAgentCircuitData((OSDMap) body["Circuit"]); //Now do the creation EnableChildAgents(AgentID, requestingRegion, DrawDistance, circuitData); } else if (message["Method"] == "CancelTeleport") { if (regionCaps == null || clientCaps == null) return null; //Only the region the client is root in can do this IRegionClientCapsService rootCaps = clientCaps.GetRootCapsService(); if (rootCaps != null && rootCaps.RegionHandle == regionCaps.RegionHandle) { //The user has requested to cancel the teleport, stop them. clientCaps.RequestToCancelTeleport = true; regionCaps.Disabled = false; } } else if (message["Method"] == "AgentLoggedOut") { //ONLY if the agent is root do we even consider it if (regionCaps != null) { if (regionCaps.RootAgent) { LogoutAgent(regionCaps, false); //The root is killing itself } } } else if (message["Method"] == "SendChildAgentUpdate") { if (regionCaps == null || clientCaps == null) return null; IRegionClientCapsService rootCaps = clientCaps.GetRootCapsService(); if (rootCaps != null && rootCaps.RegionHandle == regionCaps.RegionHandle) //Has to be root { OSDMap body = ((OSDMap) message["Message"]); AgentPosition pos = new AgentPosition(); pos.Unpack((OSDMap) body["AgentPos"]); SendChildAgentUpdate(pos, regionCaps); regionCaps.Disabled = false; } } else if (message["Method"] == "TeleportAgent") { if (regionCaps == null || clientCaps == null) return null; IRegionClientCapsService rootCaps = clientCaps.GetRootCapsService(); if (rootCaps != null && rootCaps.RegionHandle == regionCaps.RegionHandle) { OSDMap body = ((OSDMap) message["Message"]); GridRegion destination = new GridRegion(); destination.FromOSD((OSDMap) body["Region"]); uint TeleportFlags = body["TeleportFlags"].AsUInteger(); int DrawDistance = body["DrawDistance"].AsInteger(); AgentCircuitData Circuit = new AgentCircuitData(); Circuit.UnpackAgentCircuitData((OSDMap) body["Circuit"]); AgentData AgentData = new AgentData(); AgentData.Unpack((OSDMap) body["AgentData"]); regionCaps.Disabled = false; string ResponseURL = message["ResponseURL"].AsString(); if (ResponseURL == "") { OSDMap result = new OSDMap(); string reason = ""; result["success"] = TeleportAgent(ref destination, TeleportFlags, DrawDistance, Circuit, AgentData, AgentID, requestingRegion, out reason); result["Reason"] = reason; //Remove the region flags, not the regions problem destination.Flags = 0; result["Destination"] = destination.ToOSD(); //Send back the new destination return result; } else { Util.FireAndForget(delegate { OSDMap result = new OSDMap(); string reason = ""; result["success"] = TeleportAgent(ref destination, TeleportFlags, DrawDistance, Circuit, AgentData, AgentID, requestingRegion, out reason); result["Reason"] = reason; //Remove the region flags, not the regions problem destination.Flags = 0; result["Destination"] = destination.ToOSD(); //Send back the new destination WebUtils.PostToService(ResponseURL, result); }); return new OSDMap() { new KeyValuePair<string, OSD>("WillHaveResponse", true) }; } } } else if (message["Method"] == "CrossAgent") { if (regionCaps == null || clientCaps == null) return null; IRegionClientCapsService rootCaps = clientCaps.GetRootCapsService(); if (rootCaps == null || rootCaps.RegionHandle == regionCaps.RegionHandle) { //This is a simulator message that tells us to cross the agent OSDMap body = ((OSDMap) message["Message"]); Vector3 pos = body["Pos"].AsVector3(); Vector3 Vel = body["Vel"].AsVector3(); GridRegion Region = new GridRegion(); Region.FromOSD((OSDMap) body["Region"]); AgentCircuitData Circuit = new AgentCircuitData(); Circuit.UnpackAgentCircuitData((OSDMap) body["Circuit"]); AgentData AgentData = new AgentData(); AgentData.Unpack((OSDMap) body["AgentData"]); regionCaps.Disabled = false; string ResponseURL = message["ResponseURL"].AsString(); if (ResponseURL == "") { OSDMap result = new OSDMap(); string reason = ""; result["success"] = CrossAgent(Region, pos, Vel, Circuit, AgentData, AgentID, requestingRegion, out reason); result["reason"] = reason; return result; } else { Util.FireAndForget(delegate { OSDMap result = new OSDMap(); string reason = ""; result["success"] = CrossAgent(Region, pos, Vel, Circuit, AgentData, AgentID, requestingRegion, out reason); result["reason"] = reason; if (ResponseURL != null) WebUtils.PostToService(ResponseURL, result); }); return new OSDMap() { new KeyValuePair<string, OSD>("WillHaveResponse", true) }; } } else if (clientCaps.InTeleport) { OSDMap result = new OSDMap(); result["success"] = false; result["Note"] = false; return result; } else { OSDMap result = new OSDMap(); result["success"] = false; result["Note"] = false; return result; } } return null; }
private void OSDMapToSessions(OSDMap map) { if (!map.ContainsKey("sessions")) return; if (listViewSessions.InvokeRequired) listViewSessions.BeginInvoke((MethodInvoker)(() => OSDMapToSessions(map))); else { OSDArray sessionsArray = (OSDArray)map["sessions"]; progressBar1.Maximum = sessionsArray.Count; progressBar1.Value = 0; progressBar1.Step = 1; panelActionProgress.Visible = true; listViewSessions.VirtualListSize = 0; m_SessionViewItems.Clear(); ClearCache(); for (int i = 0; i < sessionsArray.Count; i++) { OSDMap session = (OSDMap)sessionsArray[i]; Session importedSession = (Session)m_CurrentAssembly.CreateInstance("WinGridProxy." + session["type"].AsString()); if (importedSession == null) { // System.Diagnostics.Debug.Assert(importedSession != null, session["type"].AsString() + ); } importedSession.Deserialize(session["tag"].AsBinary()); m_SessionViewItems.Add(importedSession); progressBar1.PerformStep(); } listViewSessions.VirtualListSize = m_SessionViewItems.Count; listViewSessions.Invalidate(); // resize columns to fit whats currently on screen listViewSessions.Columns[0].Width = listViewSessions.Columns[1].Width = listViewSessions.Columns[2].Width = listViewSessions.Columns[3].Width = listViewSessions.Columns[5].Width = -2; panelActionProgress.Visible = false; map = null; } }
protected OSDMap OnMessageReceived(OSDMap message) { if (message.ContainsKey("Method") && message["Method"] == "GridWideMessage") { //We got a message, now display it string user = message["User"].AsString(); string value = message["Value"].AsString(); //Get the Scene registry since IDialogModule is a region module, and isn't in the ISimulationBase registry ISceneManager manager = m_registry.RequestModuleInterface<ISceneManager>(); if (manager != null) { foreach (IScene scene in manager.Scenes) { IScenePresence sp = null; if (scene.TryGetScenePresence(UUID.Parse(user), out sp) && !sp.IsChildAgent) { IDialogModule dialogModule = scene.RequestModuleInterface<IDialogModule>(); if (dialogModule != null) { //Send the message to the user now dialogModule.SendAlertToUser(UUID.Parse(user), value); } } } } } else if (message.ContainsKey("Method") && message["Method"] == "KickUserMessage") { //We got a message, now display it string user = message["User"].AsString(); string value = message["Value"].AsString(); //Get the Scene registry since IDialogModule is a region module, and isn't in the ISimulationBase registry ISceneManager manager = m_registry.RequestModuleInterface<ISceneManager>(); if (manager != null) { foreach (IScene scene in manager.Scenes) { IScenePresence sp = null; if (scene.TryGetScenePresence(UUID.Parse(user), out sp)) { sp.ControllingClient.Kick(value == "" ? "The WhiteCore Grid Manager kicked you out." : value); IEntityTransferModule transferModule = scene.RequestModuleInterface<IEntityTransferModule>(); if (transferModule != null) transferModule.IncomingCloseAgent(scene, sp.UUID); } } } } return null; }
private static object ParseLLSDBlock(OSDMap blockData, Type blockType) { object block = Activator.CreateInstance(blockType); // Iterate over each field and set the value if a match was found in the LLSD foreach (FieldInfo field in blockType.GetFields()) { if (blockData.ContainsKey(field.Name)) { Type fieldType = field.FieldType; if (fieldType == typeof(ulong)) { // ulongs come in as a byte array, convert it manually here byte[] bytes = blockData[field.Name].AsBinary(); ulong value = Utils.BytesToUInt64(bytes); field.SetValue(block, value); } else if (fieldType == typeof(uint)) { // uints come in as a byte array, convert it manually here byte[] bytes = blockData[field.Name].AsBinary(); uint value = Utils.BytesToUInt(bytes); field.SetValue(block, value); } else if (fieldType == typeof(ushort)) { // Just need a bit of manual typecasting love here field.SetValue(block, (ushort)blockData[field.Name].AsInteger()); } else if (fieldType == typeof(byte)) { // Just need a bit of manual typecasting love here field.SetValue(block, (byte)blockData[field.Name].AsInteger()); } else if (fieldType == typeof(sbyte)) { field.SetValue(block, (sbyte)blockData[field.Name].AsInteger()); } else if (fieldType == typeof(short)) { field.SetValue(block, (short)blockData[field.Name].AsInteger()); } else if (fieldType == typeof(string)) { field.SetValue(block, blockData[field.Name].AsString()); } else if (fieldType == typeof(bool)) { field.SetValue(block, blockData[field.Name].AsBoolean()); } else if (fieldType == typeof(float)) { field.SetValue(block, (float)blockData[field.Name].AsReal()); } else if (fieldType == typeof(double)) { field.SetValue(block, blockData[field.Name].AsReal()); } else if (fieldType == typeof(int)) { field.SetValue(block, blockData[field.Name].AsInteger()); } else if (fieldType == typeof(UUID)) { field.SetValue(block, blockData[field.Name].AsUUID()); } else if (fieldType == typeof(Vector3)) { Vector3 vec = ((OSDArray)blockData[field.Name]).AsVector3(); field.SetValue(block, vec); } else if (fieldType == typeof(Vector4)) { Vector4 vec = ((OSDArray)blockData[field.Name]).AsVector4(); field.SetValue(block, vec); } else if (fieldType == typeof(Quaternion)) { Quaternion quat = ((OSDArray)blockData[field.Name]).AsQuaternion(); field.SetValue(block, quat); } else if (fieldType == typeof(byte[]) && blockData[field.Name].Type == OSDType.String) { field.SetValue(block, Utils.StringToBytes(blockData[field.Name])); } } } // Additional fields come as properties, Handle those as well. foreach (PropertyInfo property in blockType.GetProperties()) { if (blockData.ContainsKey(property.Name)) { OSDType proptype = blockData[property.Name].Type; MethodInfo set = property.GetSetMethod(); if (proptype.Equals(OSDType.Binary)) { set.Invoke(block, new object[] { blockData[property.Name].AsBinary() }); } else set.Invoke(block, new object[] { Utils.StringToBytes(blockData[property.Name].AsString()) }); } } return block; }
/// <summary> /// Unpack agent circuit data map into an AgentCiruitData object /// </summary> /// <param name="args"></param> public void UnpackAgentCircuitData(OSDMap args) { if (args["agent_id"] != null) AgentID = args["agent_id"].AsUUID(); if (args["base_folder"] != null) BaseFolder = args["base_folder"].AsUUID(); if (args["caps_path"] != null) CapsPath = args["caps_path"].AsString(); if ((args["children_seeds"] != null) && (args["children_seeds"].Type == OSDType.Array)) { OSDArray childrenSeeds = (OSDArray)(args["children_seeds"]); ChildrenCapSeeds = new Dictionary<ulong, string>(); foreach (OSD o in childrenSeeds) { if (o.Type == OSDType.Map) { ulong handle = 0; string seed = ""; OSDMap pair = (OSDMap)o; if (pair["handle"] != null) if (!UInt64.TryParse(pair["handle"].AsString(), out handle)) continue; if (pair["seed"] != null) seed = pair["seed"].AsString(); if (!ChildrenCapSeeds.ContainsKey(handle)) ChildrenCapSeeds.Add(handle, seed); } } } else ChildrenCapSeeds = new Dictionary<ulong, string>(); if (args["child"] != null) child = args["child"].AsBoolean(); if (args["circuit_code"] != null) UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode); if (args["first_name"] != null) firstname = args["first_name"].AsString(); if (args["last_name"] != null) lastname = args["last_name"].AsString(); if (args["inventory_folder"] != null) InventoryFolder = args["inventory_folder"].AsUUID(); if (args["secure_session_id"] != null) SecureSessionID = args["secure_session_id"].AsUUID(); if (args["session_id"] != null) 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); // DEBUG ON //m_log.WarnFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}", AgentID, child, startpos.ToString()); // DEBUG OFF try { // Unpack various appearance elements Appearance = new AvatarAppearance(AgentID); // Eventually this code should be deprecated, use full appearance // packing in packed_appearance if (args["appearance_serial"] != null) Appearance.Serial = args["appearance_serial"].AsInteger(); if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map)) { Appearance.Unpack((OSDMap)args["packed_appearance"]); // DEBUG ON //m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance"); // DEBUG OFF } // DEBUG ON else m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance"); // DEBUG OFF } catch (Exception e) { m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}", e.Message); } ServiceURLs = new Dictionary<string, object>(); if (args.ContainsKey("service_urls") && args["service_urls"] != null && (args["service_urls"]).Type == OSDType.Array) { OSDArray urls = (OSDArray)(args["service_urls"]); for (int i = 0; i < urls.Count / 2; i++) { ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString(); //System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString()); } } }
public void UnpackRegionInfoData(OSDMap args) { if (args.ContainsKey("region_id")) RegionID = args["region_id"].AsUUID(); if (args.ContainsKey("region_name")) RegionName = args["region_name"].AsString(); if (args.ContainsKey("http_port")) UInt32.TryParse(args["http_port"].AsString(), out m_httpPort); if (args.ContainsKey("region_xloc")) { int locx; Int32.TryParse(args["region_xloc"].AsString(), out locx); RegionLocX = locx; } if (args.ContainsKey("region_yloc")) { int locy; Int32.TryParse(args["region_yloc"].AsString(), out locy); RegionLocY = locy; } IPAddress ip_addr = null; if (args.ContainsKey("internal_ep_address")) { IPAddress.TryParse(args["internal_ep_address"].AsString(), out ip_addr); } int port = 0; if (args.ContainsKey("internal_ep_port")) { Int32.TryParse(args["internal_ep_port"].AsString(), out port); } InternalEndPoint = new IPEndPoint(ip_addr, port); if (args.ContainsKey("region_type")) m_regionType = args["region_type"].AsString(); if (args.ContainsKey("scope_id")) ScopeID = args["scope_id"].AsUUID(); if (args.ContainsKey("all_scope_ids")) AllScopeIDs = ((OSDArray) args["all_scope_ids"]).ConvertAll<UUID>(o => o); if (args.ContainsKey("region_size_x")) RegionSizeX = args["region_size_x"].AsInteger(); if (args.ContainsKey("region_size_y")) RegionSizeY = args["region_size_y"].AsInteger(); if (args.ContainsKey("region_size_z")) RegionSizeZ = args["region_size_z"].AsInteger(); if (args.ContainsKey("object_capacity")) m_objectCapacity = args["object_capacity"].AsInteger(); if (args.ContainsKey("region_type")) RegionType = args["region_type"].AsString(); if (args.ContainsKey("see_into_this_sim_from_neighbor")) SeeIntoThisSimFromNeighbor = args["see_into_this_sim_from_neighbor"].AsBoolean(); if (args.ContainsKey("startupType")) Startup = (StartupType) args["startupType"].AsInteger(); if (args.ContainsKey("InfiniteRegion")) InfiniteRegion = args["InfiniteRegion"].AsBoolean(); if (args.ContainsKey("RegionSettings")) { RegionSettings = new RegionSettings(); RegionSettings.FromOSD((OSDMap) args["RegionSettings"]); } if (args.ContainsKey("GridSecureSessionID")) GridSecureSessionID = args["GridSecureSessionID"]; if (args.ContainsKey("OpenRegionSettings")) { OpenRegionSettings = new OpenRegionSettings(); OpenRegionSettings.FromOSD((OSDMap) args["OpenRegionSettings"]); } else OpenRegionSettings = new OpenRegionSettings(); if (args.ContainsKey("EnvironmentSettings")) EnvironmentSettings = args["EnvironmentSettings"]; }
public void FromOSD(OSDMap map) { if (map.ContainsKey("uuid")) RegionID = map["uuid"].AsUUID(); if (map.ContainsKey("locX")) RegionLocX = map["locX"].AsInteger(); if (map.ContainsKey("locY")) RegionLocY = map["locY"].AsInteger(); if (map.ContainsKey("locZ")) RegionLocZ = map["locZ"].AsInteger(); if (map.ContainsKey("regionName")) RegionName = map["regionName"].AsString(); if (map.ContainsKey("regionType")) RegionType = map["regionType"].AsString(); if (map.ContainsKey("serverIP")) { //int port = 0; //Int32.TryParse((string)kvp["serverPort"], out port); //IPEndPoint ep = new IPEndPoint(IPAddress.Parse((string)kvp["serverIP"]), port); ExternalHostName = map["serverIP"].AsString(); } else ExternalHostName = "127.0.0.1"; if (map.ContainsKey("serverPort")) { Int32 port = map["serverPort"].AsInteger(); InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), port); } if (map.ContainsKey("serverHttpPort")) { UInt32 port = map["serverHttpPort"].AsUInteger(); HttpPort = port; } if (map.ContainsKey("serverURI")) ServerURI = map["serverURI"]; if (map.ContainsKey("regionMapTexture")) TerrainImage = map["regionMapTexture"].AsUUID(); if (map.ContainsKey("regionTerrainTexture")) TerrainMapImage = map["regionTerrainTexture"].AsUUID(); if (map.ContainsKey("access")) Access = (byte)map["access"].AsInteger(); if (map.ContainsKey("owner_uuid")) EstateOwner = map["owner_uuid"].AsUUID(); if (map.ContainsKey("AuthToken")) AuthToken = map["AuthToken"].AsString(); if (map.ContainsKey("sizeX")) m_RegionSizeX = map["sizeX"].AsInteger(); if (map.ContainsKey("sizeY")) m_RegionSizeY = map["sizeY"].AsInteger(); if (map.ContainsKey("sizeZ")) m_RegionSizeZ = map["sizeZ"].AsInteger(); if (map.ContainsKey("LastSeen")) LastSeen = map["LastSeen"].AsInteger(); if (map.ContainsKey("SessionID")) SessionID = map["SessionID"].AsUUID(); if (map.ContainsKey("Flags")) Flags = map["Flags"].AsInteger(); if (map.ContainsKey("GenericMap")) GenericMap = (OSDMap)map["GenericMap"]; if (map.ContainsKey("remoteEndPointIP")) { IPAddress add = new IPAddress(map["remoteEndPointIP"].AsBinary()); int port = map["remoteEndPointPort"].AsInteger(); m_remoteEndPoint = new IPEndPoint(add, port); } }
/// <summary> /// Deserialization of agent data. /// Avoiding reflection makes it painful to write, but that's the price! /// </summary> /// <param name="hash"></param> public virtual void Unpack(OSDMap args) { // DEBUG ON m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Unpack data"); // DEBUG OFF if (args.ContainsKey("region_id")) UUID.TryParse(args["region_id"].AsString(), out RegionID); if (args["circuit_code"] != null) UInt32.TryParse((string)args["circuit_code"].AsString(), out CircuitCode); if (args["agent_uuid"] != null) AgentID = args["agent_uuid"].AsUUID(); if (args["session_uuid"] != null) SessionID = args["session_uuid"].AsUUID(); if (args["position"] != null) Vector3.TryParse(args["position"].AsString(), out Position); if (args["velocity"] != null) Vector3.TryParse(args["velocity"].AsString(), out Velocity); if (args["center"] != null) Vector3.TryParse(args["center"].AsString(), out Center); if (args["size"] != null) Vector3.TryParse(args["size"].AsString(), out Size); if (args["at_axis"] != null) Vector3.TryParse(args["at_axis"].AsString(), out AtAxis); if (args["left_axis"] != null) Vector3.TryParse(args["left_axis"].AsString(), out AtAxis); if (args["up_axis"] != null) Vector3.TryParse(args["up_axis"].AsString(), out AtAxis); if (args["changed_grid"] != null) ChangedGrid = args["changed_grid"].AsBoolean(); if (args["far"] != null) Far = (float)(args["far"].AsReal()); if (args["aspect"] != null) Aspect = (float)args["aspect"].AsReal(); if (args["throttles"] != null) Throttles = args["throttles"].AsBinary(); if (args["locomotion_state"] != null) UInt32.TryParse(args["locomotion_state"].AsString(), out LocomotionState); if (args["head_rotation"] != null) Quaternion.TryParse(args["head_rotation"].AsString(), out HeadRotation); if (args["body_rotation"] != null) Quaternion.TryParse(args["body_rotation"].AsString(), out BodyRotation); if (args["control_flags"] != null) UInt32.TryParse(args["control_flags"].AsString(), out ControlFlags); if (args["energy_level"] != null) EnergyLevel = (float)(args["energy_level"].AsReal()); //This IS checked later if (args["god_level"] != null) Byte.TryParse(args["god_level"].AsString(), out GodLevel); if (args["speed"] != null) float.TryParse(args["speed"].AsString(), out Speed); else Speed = 1; if (args["draw_distance"] != null) float.TryParse(args["draw_distance"].AsString(), out DrawDistance); else DrawDistance = 0; //Reset this to fix movement... since regions are being bad about this if (Speed == 0) Speed = 1; if (args["always_run"] != null) AlwaysRun = args["always_run"].AsBoolean(); if (args["sent_initial_wearables"] != null) SentInitialWearables = args["sent_initial_wearables"].AsBoolean(); else SentInitialWearables = false; if (args["prey_agent"] != null) PreyAgent = args["prey_agent"].AsUUID(); if (args["agent_access"] != null) Byte.TryParse(args["agent_access"].AsString(), out AgentAccess); if (args["active_group_id"] != null) ActiveGroupID = args["active_group_id"].AsUUID(); if ((args["groups"] != null) && (args["groups"]).Type == OSDType.Array) { OSDArray groups = (OSDArray)(args["groups"]); Groups = new AgentGroupData[groups.Count]; int i = 0; foreach (OSD o in groups) { if (o.Type == OSDType.Map) { Groups[i++] = new AgentGroupData((OSDMap)o); } } } if ((args["animations"] != null) && (args["animations"]).Type == OSDType.Array) { OSDArray anims = (OSDArray)(args["animations"]); Anims = new Animation[anims.Count]; int i = 0; foreach (OSD o in anims) { if (o.Type == OSDType.Map) { Anims[i++] = new Animation((OSDMap)o); } } } //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) //{ // OSDArray textures = (OSDArray)(args["agent_textures"]); // AgentTextures = new UUID[textures.Count]; // int i = 0; // foreach (OSD o in textures) // AgentTextures[i++] = o.AsUUID(); //} Appearance = new AvatarAppearance(AgentID); // The code to unpack textures, visuals, wearables and attachments // should be removed; packed appearance contains the full appearance // This is retained for backward compatibility only if (args["texture_entry"] != null) { byte[] rawtextures = args["texture_entry"].AsBinary(); Primitive.TextureEntry textures = new Primitive.TextureEntry(rawtextures, 0, rawtextures.Length); List<UUID> changed = new List<UUID>(); Appearance.SetTextureEntries(textures, out changed); } if (args["visual_params"] != null) Appearance.SetVisualParams(args["visual_params"].AsBinary()); if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) { OSDArray wears = (OSDArray)(args["wearables"]); for (int i = 0; i < wears.Count / 2; i++) { AvatarWearable awear = new AvatarWearable((OSDArray)wears[i]); Appearance.SetWearable(i, awear); } } if ((args["attachments"] != null) && (args["attachments"]).Type == OSDType.Array) { OSDArray attachs = (OSDArray)(args["attachments"]); foreach (OSD o in attachs) { if (o.Type == OSDType.Map) { // We know all of these must end up as attachments so we // append rather than replace to ensure multiple attachments // per point continues to work Appearance.AppendAttachment(new AvatarAttachment((OSDMap)o)); } } } // end of code to remove if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map) Appearance = new AvatarAppearance(AgentID, (OSDMap)args["packed_appearance"]); // DEBUG ON else m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance"); // DEBUG OFF if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array) { OSDArray controls = (OSDArray)(args["controllers"]); Controllers = new ControllerData[controls.Count]; int i = 0; foreach (OSD o in controls) { if (o.Type == OSDType.Map) { Controllers[i++] = new ControllerData((OSDMap)o); } } } if (args["callback_uri"] != null) CallbackURI = args["callback_uri"].AsString(); }
public void Unpack(OSDMap args) { if (args.ContainsKey("region_handle")) UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle); if (args["circuit_code"] != null) UInt32.TryParse((string)args["circuit_code"].AsString(), out CircuitCode); if (args["agent_uuid"] != null) AgentID = args["agent_uuid"].AsUUID(); if (args["session_uuid"] != null) SessionID = args["session_uuid"].AsUUID(); if (args["position"] != null) Vector3.TryParse(args["position"].AsString(), out Position); if (args["velocity"] != null) Vector3.TryParse(args["velocity"].AsString(), out Velocity); if (args["center"] != null) Vector3.TryParse(args["center"].AsString(), out Center); if (args["size"] != null) Vector3.TryParse(args["size"].AsString(), out Size); if (args["at_axis"] != null) Vector3.TryParse(args["at_axis"].AsString(), out AtAxis); if (args["left_axis"] != null) Vector3.TryParse(args["left_axis"].AsString(), out LeftAxis); if (args["up_axis"] != null) Vector3.TryParse(args["up_axis"].AsString(), out UpAxis); if (args["changed_grid"] != null) ChangedGrid = args["changed_grid"].AsBoolean(); if (args["far"] != null) Far = (float)(args["far"].AsReal()); if (args["throttles"] != null) Throttles = args["throttles"].AsBinary(); }
/// <summary> /// Deserialization of agent data. /// Avoiding reflection makes it painful to write, but that's the price! /// </summary> /// <param name="hash"></param> public virtual void Unpack(OSDMap args) { if (args.ContainsKey("region_handle")) UInt64.TryParse(args["region_handle"].AsString(), out RegionHandle); if (args["circuit_code"] != null) UInt32.TryParse((string)args["circuit_code"].AsString(), out CircuitCode); if (args["agent_uuid"] != null) AgentID = args["agent_uuid"].AsUUID(); if (args["session_uuid"] != null) SessionID = args["session_uuid"].AsUUID(); if (args["position"] != null) Vector3.TryParse(args["position"].AsString(), out Position); if (args["velocity"] != null) Vector3.TryParse(args["velocity"].AsString(), out Velocity); if (args["center"] != null) Vector3.TryParse(args["center"].AsString(), out Center); if (args["size"] != null) Vector3.TryParse(args["size"].AsString(), out Size); if (args["at_axis"] != null) Vector3.TryParse(args["at_axis"].AsString(), out AtAxis); if (args["left_axis"] != null) Vector3.TryParse(args["left_axis"].AsString(), out AtAxis); if (args["up_axis"] != null) Vector3.TryParse(args["up_axis"].AsString(), out AtAxis); if (args["changed_grid"] != null) ChangedGrid = args["changed_grid"].AsBoolean(); if (args["far"] != null) Far = (float)(args["far"].AsReal()); if (args["aspect"] != null) Aspect = (float)args["aspect"].AsReal(); if (args["throttles"] != null) Throttles = args["throttles"].AsBinary(); if (args["locomotion_state"] != null) UInt32.TryParse(args["locomotion_state"].AsString(), out LocomotionState); if (args["head_rotation"] != null) Quaternion.TryParse(args["head_rotation"].AsString(), out HeadRotation); if (args["body_rotation"] != null) Quaternion.TryParse(args["body_rotation"].AsString(), out BodyRotation); if (args["control_flags"] != null) UInt32.TryParse(args["control_flags"].AsString(), out ControlFlags); if (args["energy_level"] != null) EnergyLevel = (float)(args["energy_level"].AsReal()); if (args["god_level"] != null) Byte.TryParse(args["god_level"].AsString(), out GodLevel); if (args["always_run"] != null) AlwaysRun = args["always_run"].AsBoolean(); if (args["prey_agent"] != null) PreyAgent = args["prey_agent"].AsUUID(); if (args["agent_access"] != null) Byte.TryParse(args["agent_access"].AsString(), out AgentAccess); if (args["active_group_id"] != null) ActiveGroupID = args["active_group_id"].AsUUID(); if ((args["groups"] != null) && (args["groups"]).Type == OSDType.Array) { OSDArray groups = (OSDArray)(args["groups"]); Groups = new AgentGroupData[groups.Count]; int i = 0; foreach (OSD o in groups) { if (o.Type == OSDType.Map) { Groups[i++] = new AgentGroupData((OSDMap)o); } } } if ((args["animations"] != null) && (args["animations"]).Type == OSDType.Array) { OSDArray anims = (OSDArray)(args["animations"]); Anims = new Animation[anims.Count]; int i = 0; foreach (OSD o in anims) { if (o.Type == OSDType.Map) { Anims[i++] = new Animation((OSDMap)o); } } } //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) //{ // OSDArray textures = (OSDArray)(args["agent_textures"]); // AgentTextures = new UUID[textures.Count]; // int i = 0; // foreach (OSD o in textures) // AgentTextures[i++] = o.AsUUID(); //} if (args["texture_entry"] != null) AgentTextures = args["texture_entry"].AsBinary(); if (args["visual_params"] != null) VisualParams = args["visual_params"].AsBinary(); if ((args["wearables"] != null) && (args["wearables"]).Type == OSDType.Array) { OSDArray wears = (OSDArray)(args["wearables"]); Wearables = new UUID[wears.Count]; int i = 0; foreach (OSD o in wears) Wearables[i++] = o.AsUUID(); } if (args["callback_uri"] != null) CallbackURI = args["callback_uri"].AsString(); }
private byte[] ProcessEnqueueEQMMessage(OSDMap request) { OSDMap response = new OSDMap(); response["success"] = false; try { UUID agentID = request["AgentID"].AsUUID(); ulong regionHandle = m_ourRegionHandle == 0 ? request["RegionHandle"].AsULong() : m_ourRegionHandle; OSDArray events = new OSDArray(); if (request.ContainsKey("Events") && request["Events"].Type == OSDType.Array) events = (OSDArray) request["Events"]; #if (!ISWIN) List<OSD> OSDEvents = new List<OSD>(); foreach (OSD ev in events) OSDEvents.Add(OSDParser.DeserializeLLSDXml(ev.AsString())); #else List<OSD> OSDEvents = events.Select(ev => OSDParser.DeserializeLLSDXml(ev.AsString())).ToList(); #endif IClientCapsService clientCaps = m_capsService.GetClientCapsService(agentID); if (clientCaps != null) { IRegionClientCapsService regionClient = clientCaps.GetCapsService(regionHandle); if (regionClient != null) { bool enqueueResult = false; foreach (OSD ev in OSDEvents) { enqueueResult = m_eventQueueService.Enqueue(ev, agentID, regionHandle); if (!enqueueResult) //Break if one fails break; } response["success"] = enqueueResult; } else MainConsole.Instance.Error("[EQMHandler]: ERROR IN THE HANDLER, FAILED TO FIND CLIENT'S REGION"); } else { MainConsole.Instance.Error("[EQMHandler]: ERROR IN THE HANDLER, FAILED TO FIND CLIENT, IWC/HG OR BOT?"); bool enqueueResult = false; foreach (OSD ev in OSDEvents) { enqueueResult = m_eventQueueService.Enqueue(ev, agentID, regionHandle); if (!enqueueResult) //Break if one fails break; } response["success"] = enqueueResult; } } catch (Exception ex) { MainConsole.Instance.Error("[EQMHandler]: ERROR IN THE HANDLER: " + ex); response = new OSDMap(); response["success"] = false; } string resp = OSDParser.SerializeJsonString(response); if (resp == "") return MainServer.BlankResponse; return Util.UTF8.GetBytes(resp); }
/// <summary> /// Unpack agent circuit data map into an AgentCiruitData object /// </summary> /// <param name="args"></param> public virtual void UnpackAgentCircuitData (OSDMap args) { if (args["agent_id"] != null) AgentID = args["agent_id"].AsUUID(); if (args["caps_path"] != null) CapsPath = args["caps_path"].AsString(); if (args["reallyischild"] != null) reallyischild = args["reallyischild"].AsBoolean (); if (args["child"] != null) child = args["child"].AsBoolean(); if (args["circuit_code"] != null) UInt32.TryParse(args["circuit_code"].AsString(), out circuitcode); if (args["secure_session_id"] != null) SecureSessionID = args["secure_session_id"].AsUUID(); if (args["session_id"] != null) 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["first_name"] != null) firstname = args["first_name"].AsString (); if (args["last_name"] != null) lastname = args["last_name"].AsString (); if (args["start_pos"] != null) Vector3.TryParse(args["start_pos"].AsString(), out startpos); if (args["teleport_flags"] != null) teleportFlags = args["teleport_flags"].AsUInteger(); // DEBUG ON //m_log.WarnFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}", AgentID, child, startpos.ToString()); // DEBUG OFF try { // Unpack various appearance elements Appearance = new AvatarAppearance(AgentID); // Eventually this code should be deprecated, use full appearance // packing in packed_appearance if (args["appearance_serial"] != null) Appearance.Serial = args["appearance_serial"].AsInteger(); if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map)) { Appearance.Unpack((OSDMap)args["packed_appearance"]); // DEBUG ON //m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance"); // DEBUG OFF } // DEBUG ON else m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance"); // DEBUG OFF } catch (Exception e) { m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}", e.ToString()); } if (args.ContainsKey("otherInfo")) OtherInformation = (OSDMap)OSDParser.DeserializeLLSDXml(args["otherInfo"].AsString()); ServiceURLs = new Dictionary<string, object> (); // Try parse the new way, OSDMap if (args.ContainsKey ("serviceurls") && args["serviceurls"] != null && (args["serviceurls"]).Type == OSDType.Map) { OSDMap urls = (OSDMap)(args["serviceurls"]); foreach (KeyValuePair<String, OSD> kvp in urls) { ServiceURLs[kvp.Key] = kvp.Value.AsString (); //System.Console.WriteLine("XXX " + kvp.Key + "=" + ServiceURLs[kvp.Key]); } } }
public override void FromOSD(OSDMap map) { Data = new Dictionary<string, string>(); if (map.ContainsKey("AvatarType")) AvatarType = map["AvatarType"]; foreach (KeyValuePair<string, OSD> _kvp in map) { if (_kvp.Value != null) { string key = _kvp.Key; if (_kvp.Key.StartsWith("Wearable")) { key = _kvp.Key.Replace("Wearable", ""); key = key.Insert(key.Length == 2 ? 1 : 2, ":"); key = "Wearable " + key; //Add the space back } Data[key] = _kvp.Value.ToString(); } } }