//private Connection CacheServerCon; // соединение с кэш-сервером static void Main(string[] args) { dispatcher = new Dispatcher(); Console.ReadKey(); }
/// ----------------------------------------------------------------- /// <summary> /// </summary> // ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase SetRotationHandler(Dispatcher.Messages.RequestBase irequest) { if (irequest.GetType() != typeof(SetPartRotationRequest)) return OperationFailed("wrong type of request object"); SetPartRotationRequest request = (SetPartRotationRequest)irequest; SceneObjectGroup sog = m_scene.GetSceneObjectGroup(request.ObjectID); if (sog == null) return OperationFailed("no such object"); SceneObjectPart sop = request.LinkNum == 0 ? sog.RootPart : sog.GetLinkNumPart(request.LinkNum); if (sop == null) return OperationFailed("no such part"); sop.RotationOffset = request.Rotation; sog.ScheduleGroupForTerseUpdate(); return new Dispatcher.Messages.ResponseBase(ResponseCode.Success,""); }
/// ----------------------------------------------------------------- /// <summary> /// </summary> // ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase SetScaleHandler(Dispatcher.Messages.RequestBase irequest) { if (irequest.GetType() != typeof(SetPartScaleRequest)) return OperationFailed("wrong type of request object"); SetPartScaleRequest request = (SetPartScaleRequest)irequest; SceneObjectGroup sog = m_scene.GetSceneObjectGroup(request.ObjectID); if (sog == null) return OperationFailed("no such object"); SceneObjectPart sop = request.LinkNum == 0 ? sog.RootPart : sog.GetLinkNumPart(request.LinkNum); if (sop == null) return OperationFailed("no such part"); sop.Scale = request.Scale; sog.ScheduleGroupForFullUpdate(); // Full or terse? Don't seem to be sent with terse return new Dispatcher.Messages.ResponseBase(ResponseCode.Success,""); }
/// ----------------------------------------------------------------- /// <summary> /// </summary> // ----------------------------------------------------------------- public void Send(Dispatcher.Messages.CallbackBase msg) { try { String data = msg.SerializeToString(); byte[] buffer = Encoding.ASCII.GetBytes(data); Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sock.SendTo(buffer, m_endpoint); //m_log.WarnFormat("[Dispatcher] sent {0} to {1}:{2}",data,hostname,port); } catch (Exception e) { m_log.WarnFormat("[Dispatcher] send failed; {0}",e.Message); } }
/// ----------------------------------------------------------------- /// <summary> /// </summary> // ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase SetSunParametersHandler(Dispatcher.Messages.RequestBase request) { if (request.GetType() != typeof(SetSunParametersRequest)) return OperationFailed("wrong type"); SetSunParametersRequest req = (SetSunParametersRequest)request; if (req.YearLength > 0) m_SunModule.SetSunParameter("year_length", req.YearLength); if (req.DayLength > 0) m_SunModule.SetSunParameter("day_length",req.DayLength); if (req.HorizonShift > 0) m_SunModule.SetSunParameter("day_night_offset",req.HorizonShift); if (req.DayTimeSunHourScale > 0) m_SunModule.SetSunParameter("day_time_sun_hour_scale",req.DayTimeSunHourScale); // Always set the current time m_SunModule.SetSunParameter("current_time",req.CurrentTime); SunParametersResponse res = new SunParametersResponse(); res.YearLength = m_SunModule.GetSunParameter("year_length"); res.DayLength = m_SunModule.GetSunParameter("day_length"); res.HorizonShift = m_SunModule.GetSunParameter("day_night_offset"); res.DayTimeSunHourScale = m_SunModule.GetSunParameter("day_time_sun_hour_scale"); res.CurrentTime = m_SunModule.GetSunParameter("current_time"); return res; }
/// ----------------------------------------------------------------- /// <summary> /// </summary> /// ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase UnregisterTouchCallbackHandler(Dispatcher.Messages.RequestBase irequest) { if (irequest.GetType() != typeof(UnregisterTouchCallbackRequest)) return OperationFailed("wrong type"); UnregisterTouchCallbackRequest request = (UnregisterTouchCallbackRequest)irequest; // Find the EventCallback structure EventCallback cb = null; lock (m_objectRegistry) { List<EventCallback> cblist = null; if (! m_objectRegistry.TryGetValue(request.ObjectID, out cblist)) return OperationFailed(String.Format("no handler for requested object; {0}",request.ObjectID)); cb = cblist.Find(delegate(EventCallback test) { return test.RequestID == request.RequestID; }); if (cb == null) return OperationFailed(String.Format("invalid request id; {0}",request.RequestID)); cblist.Remove(cb); if (cblist.Count == 0) m_objectRegistry.Remove(request.ObjectID); } lock (m_endpointRegistry) { List<EventCallback> cblist = null; if (m_endpointRegistry.TryGetValue(cb.EndPointID,out cblist)) { cblist.Remove(cb); if (cblist.Count == 0) { EndPoint ep = m_dispatcher.LookupEndPoint(cb.EndPointID); ep.RemoveCloseHandler(this.EndPointCloseHandler); m_endpointRegistry.Remove(cb.EndPointID); } } } // Remove the touch event callback from the SOG SceneObjectGroup sog = m_scene.GetSceneObjectGroup(request.ObjectID); if (sog == null) return OperationFailed(String.Format("no such object; {0}",request.ObjectID)); sog.RootPart.RemoveScriptEvents(cb.RequestID); m_log.DebugFormat("[EventHandlers] unregistered touch callback for {0}",request.ObjectID); return new Dispatcher.Messages.ResponseBase(ResponseCode.Success,""); }
/// ----------------------------------------------------------------- /// <summary> /// </summary> /// ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase RegisterTouchCallbackHandler(Dispatcher.Messages.RequestBase irequest) { if (irequest.GetType() != typeof(RegisterTouchCallbackRequest)) return OperationFailed("wrong type"); RegisterTouchCallbackRequest request = (RegisterTouchCallbackRequest)irequest; // Get the object and register a handler for it SceneObjectGroup sog = m_scene.GetSceneObjectGroup(request.ObjectID); if (sog == null) return OperationFailed(String.Format("no such object; {0}",request.ObjectID)); if (sog.UUID != request.ObjectID) return OperationFailed("touch callback must be registered for root prim"); UUID requestID = UUID.Random(); sog.RootPart.SetScriptEvents(requestID,(int)scriptEvents.touch); // Create the event callback structure EventCallback cb = new EventCallback(request.ObjectID,request.EndPointID,requestID); // Add it to the object registry for handling the touch events lock (m_objectRegistry) { if (! m_objectRegistry.ContainsKey(request.ObjectID)) m_objectRegistry.Add(request.ObjectID,new List<EventCallback>()); m_objectRegistry[request.ObjectID].Add(cb); } // Add it to the endpoint registry for handling changes in the endpoint state lock (m_endpointRegistry) { if (! m_endpointRegistry.ContainsKey(request.EndPointID)) { m_endpointRegistry.Add(request.EndPointID,new List<EventCallback>()); // Only need to register the handler for the first request for this endpoint EndPoint ep = m_dispatcher.LookupEndPoint(request.EndPointID); ep.AddCloseHandler(this.EndPointCloseHandler); } m_endpointRegistry[request.EndPointID].Add(cb); } m_log.DebugFormat("[EventHandlers] registered touch callback for {0}",request.ObjectID); return new RegisterTouchCallbackResponse(requestID); }
/// ----------------------------------------------------------------- /// <summary> /// </summary> // ----------------------------------------------------------------- public Dispatcher.Messages.ResponseBase ChatHandler(Dispatcher.Messages.RequestBase request) { if (request.GetType() != typeof(ChatRequest)) return OperationFailed("wrong type"); ChatRequest req = (ChatRequest)request; OSChatMessage msg = new OSChatMessage(); msg.Scene = m_scene; msg.Type = ChatTypeEnum.Say; msg.Sender = null; msg.SenderUUID = req._UserAccount.PrincipalID; msg.From = req._UserAccount.Name; msg.Message = req.Message; msg.Position = req.Position; msg.Channel = req.Channel; m_scene.EventManager.TriggerOnChatBroadcast(new Object(), msg); return new Dispatcher.Messages.ResponseBase(ResponseCode.Success,""); }