コード例 #1
0
ファイル: Canvas.cs プロジェクト: rGovers/Erde-Engine
        public static Canvas LoadGUI(string a_filename, IFileSystem a_fileSystem, Pipeline a_pipeline)
        {
            if (a_fileSystem != null)
            {
                Stream stream;
                if (a_fileSystem.Load(a_filename, out stream))
                {
                    XmlDocument xmlDocument = new XmlDocument();
                    xmlDocument.Load(stream);

                    Canvas canv = Load(xmlDocument, a_fileSystem, a_pipeline);

                    if (canv != null)
                    {
                        canv.m_fileSystem = a_fileSystem;
                    }

                    return(canv);
                }
                else
                {
                    InternalConsole.Error("Cannot access canvas file");
                }
            }
            else
            {
                InternalConsole.Error("No filesystem to load from for canvas");
            }

            return(null);
        }
コード例 #2
0
ファイル: DiscordClient.cs プロジェクト: rGovers/Erde-Engine
        bool WriteFrame(Frame a_frame)
        {
            if (!m_internalClient.IsConnected)
            {
                InternalConsole.AddMessage("Failed to write to disconnected stream");
            }

            try
            {
                m_internalClient.WriteToStream(a_frame.ToBytes());

                return(true);
            }
            catch (IOException e)
            {
                InternalConsole.Error(string.Format("Discord Client: Failed to write frame: IOException: {0}", e.Message));
            }
            catch (ObjectDisposedException)
            {
                InternalConsole.Error("Discord Client: Failed to write frame: Disposed");
            }
            catch (InvalidOperationException)
            {
                InternalConsole.Error("Discord Client: Invalid Operaion when writing frame");
            }

            return(false);
        }
コード例 #3
0
        void Error(IntPtr a_errorStr)
        {
            string str = Marshal.PtrToStringAnsi(a_errorStr);

            if (!string.IsNullOrEmpty(str))
            {
                InternalConsole.Error(str);
            }
        }
コード例 #4
0
ファイル: DiscordClient.cs プロジェクト: rGovers/Erde-Engine
        void ProcessCommandQueue()
        {
            if (m_state != e_RPCState.Connected)
            {
                return;
            }

            bool     write   = m_commandQueue.Count > 0;
            ICommand command = null;

            while (write && m_internalClient.IsConnected)
            {
                command = m_commandQueue.Peek();

                if (command is CloseCommand)
                {
                    m_state = e_RPCState.Disconnected;

                    if (!WriteFrame(new Frame(Frame.e_OpCode.Close, new Handshake()
                    {
                        Version = m_version, ClientID = m_clientID
                    })))
                    {
                        InternalConsole.Error("Discord Client: Handwave Failed");
                    }

                    return;
                }
                else
                {
                    IPayload payload = command.PreparePayload(m_nounce++);

                    Frame frame = new Frame();

                    if (!m_shutdown)
                    {
                        frame.OpCode = Frame.e_OpCode.Frame;
                        frame.SetObject(payload);

                        WriteFrame(frame);
                    }
                }

                m_commandQueue.Dequeue();
                write = m_commandQueue.Count > 0;
            }
        }
コード例 #5
0
ファイル: DiscordClient.cs プロジェクト: rGovers/Erde-Engine
        void ProcessEvent(EventPayload a_event)
        {
            if (a_event.Event.HasValue && a_event.Event == EventPayload.e_ServerEvent.Error)
            {
                ErrorMessage error = a_event.GetObject <ErrorMessage>();

                InternalConsole.Error(string.Format("Discord responded with error: ({0}) {1}", error.ErrorCode, error.Message));

                EnqueueMessage(error);
            }

            if (m_state == e_RPCState.Connecting)
            {
                if (a_event.Command == e_Command.Dispatch && a_event.Event.HasValue && a_event.Event.Value == EventPayload.e_ServerEvent.Ready)
                {
                    m_state = e_RPCState.Connected;

                    ReadyMessage ready = a_event.GetObject <ReadyMessage>();

                    m_config = ready.Configuration;

                    User user = ready.User;

                    user.Configuration = ready.Configuration;

                    ready.User = user;
                    m_user     = user;

                    EnqueueMessage(ready);

                    return;
                }
            }

            // TODO: Implement Connected Commands
            if (m_state == e_RPCState.Connected)
            {
                switch (a_event.Command)
                {
                case e_Command.Dispatch:
                {
                    break;
                }
                }
            }
        }
コード例 #6
0
ファイル: WindowsClient.cs プロジェクト: rGovers/Erde-Engine
        void EndRead(IAsyncResult a_callback)
        {
            int bytes = -1;

            try
            {
                bytes = m_stream.EndRead(a_callback);
            }
            catch (IOException)
            {
                InternalConsole.Error("Discord Client: Attempted to read from closed pipe");

                return;
            }
            catch (ObjectDisposedException)
            {
                InternalConsole.Error("Discord Client: Attempted to end reading from a disposed pipe");

                return;
            }
            catch (NullReferenceException)
            {
                InternalConsole.Error("Discord Client: Attempted to connect to null pipe");

                return;
            }

            if (bytes > 0)
            {
                Frame frame = Frame.FromBytes(m_buffer);

                if (frame != null)
                {
                    Client.EnqueueFrame(frame);
                }
            }

            if (m_stream.IsConnected)
            {
                BeginRead();
            }
        }
コード例 #7
0
        public override bool AttemptConnection(string a_pipe)
        {
            m_socket          = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
            m_socket.Blocking = false;

            UnixEndPoint endPoint = new UnixEndPoint(string.Format("{0}/{1}", m_envPath, a_pipe));

            try
            {
                m_socket.Connect(endPoint);
            }
            catch (Exception e)
            {
                InternalConsole.Error(string.Format("Failed to connect to {0}: {1}", a_pipe, e.Message));

                return(false);
            }

            return(true);
        }
コード例 #8
0
ファイル: WindowsClient.cs プロジェクト: rGovers/Erde-Engine
        public override bool AttemptConnection(string a_pipe)
        {
            try
            {
                m_stream = new NamedPipeClientStream(".", a_pipe, PipeDirection.InOut, PipeOptions.Asynchronous);
                m_stream.Connect(1000);

                do
                {
                    Thread.Sleep(10);
                }while (!m_stream.IsConnected);

                InternalConsole.AddMessage(string.Format("Connected: {0}", a_pipe));

                return(true);
            }
            catch (Exception e)
            {
                InternalConsole.Error(string.Format("Failed to connect to {0}: {1}", a_pipe, e.Message));
            }

            return(false);
        }
コード例 #9
0
ファイル: WindowsClient.cs プロジェクト: rGovers/Erde-Engine
        public override void BeginRead()
        {
            if (!m_stream.IsConnected)
            {
                return;
            }

            try
            {
                m_stream.BeginRead(m_buffer, 0, m_buffer.Length, EndRead, m_stream.IsConnected);
            }
            catch (ObjectDisposedException)
            {
                InternalConsole.Error("Discord Client: Attempted to read from disposed stream");

                return;
            }
            catch (InvalidOperationException)
            {
                InternalConsole.Error("Discord Client: Attempted to read from closed pipe");

                return;
            }
        }
コード例 #10
0
        public override void BeginRead()
        {
            if (!m_socket.Connected)
            {
                return;
            }

            try
            {
                byte[] buffer = new byte[1024 * 16];

                SocketAsyncEventArgs eventArgs = new SocketAsyncEventArgs();
                eventArgs.SetBuffer(buffer, 0, buffer.Length);
                eventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(EndRead);

                m_socket.ReceiveAsync(eventArgs);
            }
            catch (Exception e)
            {
                InternalConsole.Error(string.Format("Discord Client: Reading socket: {0}", e.Message));

                return;
            }
        }
コード例 #11
0
ファイル: Canvas.cs プロジェクト: rGovers/Erde-Engine
        void PopulateElements(XmlNode a_node, Element a_parent)
        {
            if (a_node.NodeType == XmlNodeType.Comment)
            {
                return;
            }

            Type type = Type.GetType(a_node.Name);

            if (type == null)
            {
                type = Type.GetType("Erde.Graphics.GUI." + a_node.Name);

                if (type == null)
                {
                    InternalConsole.Error("Canvas: Invalid Element Type: " + a_node.Name);

                    return;
                }
            }

            MethodInfo methodInfo = type.GetMethod("Create", BindingFlags.Static | BindingFlags.NonPublic);

            Element element = methodInfo.Invoke(null, new object[] { a_node, m_fileSystem, m_pipeline }) as Element;

            if (element != null)
            {
                foreach (XmlAttribute att in a_node.Attributes)
                {
                    switch (att.Name.ToLower())
                    {
                    case "visible":
                    {
                        element.Visible = bool.Parse(att.Value);

                        break;
                    }

                    case "width":
                    {
                        Vector2 size = element.Size;
                        size.X       = float.Parse(att.Value);
                        element.Size = size;

                        break;
                    }

                    case "height":
                    {
                        Vector2 size = element.Size;
                        size.Y       = float.Parse(att.Value);
                        element.Size = size;

                        break;
                    }

                    case "xpos":
                    {
                        Vector2 pos = element.Position;
                        pos.X            = float.Parse(att.Value);
                        element.Position = pos;

                        break;
                    }

                    case "ypos":
                    {
                        Vector2 pos = element.Position;
                        pos.Y            = float.Parse(att.Value);
                        element.Position = pos;

                        break;
                    }

                    case "xlock":
                    {
                        for (int i = 0; i < (int)e_XLockMode.End; ++i)
                        {
                            e_XLockMode lockMode = (e_XLockMode)i;

                            if (lockMode.ToString().ToLower() == att.Value.ToLower())
                            {
                                element.XLockMode = lockMode;

                                break;
                            }
                        }

                        break;
                    }

                    case "ylock":
                    {
                        for (int i = 0; i < (int)e_YLockMode.End; ++i)
                        {
                            e_YLockMode lockMode = (e_YLockMode)i;

                            if (lockMode.ToString().ToLower() == att.Value.ToLower())
                            {
                                element.YLockMode = lockMode;

                                break;
                            }
                        }

                        break;
                    }

                    case "name":
                    {
                        if (!string.IsNullOrEmpty(att.Value))
                        {
                            m_namedElements.Add(att.Value, element);
                        }

                        break;
                    }

                    case "onhover":
                    {
                        string[] vals = att.Value.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

                        if (vals.Length > 1)
                        {
                            Element.Interaction dele = GetAssemblyFunction(vals[0].TrimEnd(), vals[1].TrimEnd());
                            if (dele != null)
                            {
                                element.Hover += dele;
                            }
                        }

                        break;
                    }

                    case "onnormal":
                    {
                        string[] vals = att.Value.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

                        if (vals.Length > 1)
                        {
                            Element.Interaction dele = GetAssemblyFunction(vals[0].TrimEnd(), vals[1].TrimEnd());
                            if (dele != null)
                            {
                                element.Normal += dele;
                            }
                        }

                        break;
                    }

                    case "onclick":
                    {
                        string[] vals = att.Value.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

                        if (vals.Length > 1)
                        {
                            Element.Interaction dele = GetAssemblyFunction(vals[0].TrimEnd(), vals[1].TrimEnd());
                            if (dele != null)
                            {
                                element.Click += dele;
                            }
                        }

                        break;
                    }

                    case "onrelease":
                    {
                        string[] vals = att.Value.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);

                        if (vals.Length > 1)
                        {
                            Element.Interaction dele = GetAssemblyFunction(vals[0].TrimEnd(), vals[1].TrimEnd());
                            if (dele != null)
                            {
                                element.Release += dele;
                            }
                        }

                        break;
                    }

                    case "submenu":
                    {
                        element.SubMenuDirectory = att.Value;

                        break;
                    }
                    }
                }

                m_elements.Add(element);

                foreach (XmlNode node in a_node.ChildNodes)
                {
                    PopulateElements(node, element);
                }

                if (a_parent != null)
                {
                    element.Parent = a_parent;
                }

                element.State = Element.e_State.Normal;
                if (element.Normal != null)
                {
                    element.Normal.Invoke(this, element);
                }
            }
        }
コード例 #12
0
ファイル: DiscordClient.cs プロジェクト: rGovers/Erde-Engine
        void DiscordLoop()
        {
            bool connected = false;

            m_join = false;

            for (int i = 0; i < 10; ++i)
            {
                if (AttemptConnection(i))
                {
                    connected = true;

                    break;
                }

                if (m_shutdown)
                {
                    break;
                }
            }

            if (!connected)
            {
                InternalConsole.Error("Failed to connect to Discord");

                m_shutdown = true;
            }
            else
            {
                m_internalClient.BeginRead();

                EnqueueMessage(new ConnectionEstablishedMessage(m_connectedPipe));

                Handshake();

                while (!m_shutdown)
                {
                    Frame frame;

                    if (ReadFrame(out frame))
                    {
                        switch (frame.OpCode)
                        {
                        case Frame.e_OpCode.Close:
                        {
                            ClosePayload close = frame.GetObject <ClosePayload>();

                            InternalConsole.AddMessage("Discord Client Remotely Terminated");

                            EnqueueMessage(new CloseMessage(close.Code, close.Reason));

                            m_shutdown = true;

                            break;
                        }

                        case Frame.e_OpCode.Ping:
                        {
                            WriteFrame(new Frame(Frame.e_OpCode.Pong, frame.Data));

                            break;
                        }

                        case Frame.e_OpCode.Pong:
                        {
                            InternalConsole.Warning("Got a pong from Discord?");

                            break;
                        }

                        case Frame.e_OpCode.Frame:
                        {
                            if (m_shutdown)
                            {
                                break;
                            }

                            if (frame.Data == null)
                            {
                                InternalConsole.Error("Discord Client: No data in frame");
                            }

                            EventPayload response = frame.GetObject <EventPayload>();
                            ProcessEvent(response);

                            break;
                        }

                        default:
                        {
                            InternalConsole.Error("Discord Client: Invalid Operation");
                            m_shutdown = true;

                            break;
                        }
                        }
                    }

                    ProcessCommandQueue();
                }

                ProcessCommandQueue();
            }

            m_join = true;
        }