Пример #1
0
        //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,"");
        }
Пример #4
0
        /// -----------------------------------------------------------------
        /// <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,"");
        }