예제 #1
0
        /// <summary>
        /// Send a message to the server.
        /// </summary>
        /// <param name="message">Message to send.</param>
        /// <returns><c>true</c> if successful, otherwise <c>false</c>.</returns>
        public bool Send(IrssMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (_serverSocket == null)
            {
                return(false);
            }

            byte[] data = message.ToBytes();

            int dataLength = IPAddress.HostToNetworkOrder(data.Length);

            byte[] dataLengthBytes = BitConverter.GetBytes(dataLength);

            try
            {
                // Send packet size ...
                _serverSocket.Send(dataLengthBytes);

                // Send packet ...
                _serverSocket.Send(data);

                return(true);
            }
            catch (SocketException)
            {
                return(false);
            }
        }
예제 #2
0
        private void ReceivedMessage(IrssMessage received)
        {
            switch (received.Type)
            {
            case MessageType.RegisterClient:
                if ((received.Flags & MessageFlags.Success) == MessageFlags.Success)
                {
                    _registered      = true;
                    labelStatus.Text = "Connected";
                }
                else if ((received.Flags & MessageFlags.Failure) == MessageFlags.Failure)
                {
                    _registered      = false;
                    labelStatus.Text = "Failed to negotiate connection";
                }
                return;

            case MessageType.ServerShutdown:
                _registered      = false;
                labelStatus.Text = "Server Shutdown";
                return;

            case MessageType.Error:
                labelStatus.Text = received.GetDataAsString();
                return;
            }
        }
예제 #3
0
        private void ButtonPress(string keyCode)
        {
            if (!_registered)
            {
                return;
            }

            if (keyCode == null)
            {
                return;
            }

            byte[] deviceNameBytes = Encoding.ASCII.GetBytes("Abstract");
            byte[] keyCodeBytes    = Encoding.ASCII.GetBytes(keyCode);

            byte[] bytes = new byte[8 + deviceNameBytes.Length + keyCodeBytes.Length];

            BitConverter.GetBytes(deviceNameBytes.Length).CopyTo(bytes, 0);
            deviceNameBytes.CopyTo(bytes, 4);
            BitConverter.GetBytes(keyCodeBytes.Length).CopyTo(bytes, 4 + deviceNameBytes.Length);
            keyCodeBytes.CopyTo(bytes, 8 + deviceNameBytes.Length);

            IrssMessage message = new IrssMessage(MessageType.ForwardRemoteEvent, MessageFlags.Notify, bytes);

            _client.Send(message);
        }
예제 #4
0
        private void ReceivedMessage(IrssMessage received)
        {
            switch (received.Type)
            {
            case MessageType.RegisterClient:
                if ((received.Flags & MessageFlags.Success) == MessageFlags.Success)
                {
                    _registered = true;
                    Invoke(_Notification, "Connected");
                }
                else if ((received.Flags & MessageFlags.Failure) == MessageFlags.Failure)
                {
                    _registered = false;
                    Invoke(_Notification, "Failed to negotiate connection");
                }
                return;

            case MessageType.ServerShutdown:
                _registered = false;
                Invoke(_Notification, "Server Shutdown");
                return;

            case MessageType.Error:
                Invoke(_Notification, received.GetDataAsString());
                return;
            }
        }
예제 #5
0
        private static void Connected(object obj)
        {
            IrssLog.Info("Connected to server");

            IrssMessage message = new IrssMessage(MessageType.RegisterClient, MessageFlags.Request);

            _client.Send(message);
        }
예제 #6
0
        private static void SendMessage(IrssMessage message)
        {
            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (_client != null)
            {
                _client.Send(message);
            }
        }
예제 #7
0
        internal static void ButtonPress(string keyCode)
        {
            if (!_registered)
            {
                return;
            }

            byte[] bytes = IrssMessage.EncodeRemoteEventData(_device, keyCode);

            IrssMessage message = new IrssMessage(MessageType.ForwardRemoteEvent, MessageFlags.Request, bytes);

            SendMessage(message);
        }
예제 #8
0
        private static void ReceivedMessage(IrssMessage received)
        {
            IrssLog.Debug("Received Message \"{0}\"", received.Type);

            try
            {
                switch (received.Type)
                {
                case MessageType.RegisterClient:
                    if ((received.Flags & MessageFlags.Success) == MessageFlags.Success)
                    {
                        //_irServerInfo = IRServerInfo.FromBytes(received.DataAsBytes);
                        _registered = true;

                        IrssLog.Info("Registered to IR Server");
                    }
                    else if ((received.Flags & MessageFlags.Failure) == MessageFlags.Failure)
                    {
                        _registered = false;
                        IrssLog.Warn("IR Server refused to register");
                    }
                    break;

                case MessageType.ServerShutdown:
                    IrssLog.Warn("IR Server Shutdown - Virtual Remote disabled until IR Server returns");
                    _registered = false;
                    break;

                case MessageType.Error:
                    IrssLog.Error(received.GetDataAsString());
                    break;
                }
            }
            catch (Exception ex)
            {
                IrssLog.Error(ex);
            }
        }
예제 #9
0
    private void ButtonPress(string keyCode)
    {
      if (!_registered)
        return;

      byte[] deviceNameBytes = Encoding.ASCII.GetBytes("Abstract");
      byte[] keyCodeBytes = Encoding.ASCII.GetBytes(keyCode);

      byte[] bytes = new byte[8 + deviceNameBytes.Length + keyCodeBytes.Length];

      BitConverter.GetBytes(deviceNameBytes.Length).CopyTo(bytes, 0);
      deviceNameBytes.CopyTo(bytes, 4);
      BitConverter.GetBytes(keyCodeBytes.Length).CopyTo(bytes, 4 + deviceNameBytes.Length);
      keyCodeBytes.CopyTo(bytes, 8 + deviceNameBytes.Length);

      IrssMessage message = new IrssMessage(MessageType.ForwardRemoteEvent, MessageFlags.Notify, bytes);
      _client.Send(message);
    }
예제 #10
0
 private void Connected(object obj)
 {
   IrssMessage message = new IrssMessage(MessageType.RegisterClient, MessageFlags.Request);
   _client.Send(message);
 }
예제 #11
0
    private void ReceivedMessage(IrssMessage received)
    {
      switch (received.Type)
      {
        case MessageType.RegisterClient:
          if ((received.Flags & MessageFlags.Success) == MessageFlags.Success)
          {
            _registered = true;
            Invoke(_Notification, "Connected", false);
          }
          else if ((received.Flags & MessageFlags.Failure) == MessageFlags.Failure)
          {
            _registered = false;
            Invoke(_Notification, "Failed to negotiate connection", true);
          }
          return;

        case MessageType.ServerShutdown:
          _registered = false;
          Invoke(_Notification, "Server Shutdown", true);
          return;

        case MessageType.Error:
          Invoke(_Notification, received.GetDataAsString(), true);
          return;
      }
    }
예제 #12
0
 private void QueueMessageSink(IrssMessage message)
 {
   _messageSink(message);
 }
예제 #13
0
    /// <summary>
    /// Send a message to the server.
    /// </summary>
    /// <param name="message">Message to send.</param>
    /// <returns><c>true</c> if successful, otherwise <c>false</c>.</returns>
    public bool Send(IrssMessage message)
    {
      if (message == null)
        throw new ArgumentNullException("message");

      if (_serverSocket == null)
        return false;

      byte[] data = message.ToBytes();

      int dataLength = IPAddress.HostToNetworkOrder(data.Length);

      byte[] dataLengthBytes = BitConverter.GetBytes(dataLength);

      try
      {
        // Send packet size ...
        _serverSocket.Send(dataLengthBytes);

        // Send packet ...
        _serverSocket.Send(data);

        return true;
      }
      catch (SocketException)
      {
        return false;
      }
    }
예제 #14
0
        private void ConnectionThread()
        {
            // Outer loop is for reconnection attempts ...
            while (_processConnectionThread)
            {
                _connected = false;

                _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                #region Attempt to connect

                while (_processConnectionThread)
                {
                    try
                    {
                        _serverSocket.Connect(_serverEndpoint);
                        break;
                    }
                    catch (SocketException socketException)
                    {
                        if (!_processConnectionThread)
                        {
                            return;
                        }

                        if (socketException.ErrorCode == 10061) // ConnectionRefused
                        {
                            Thread.Sleep(1000);
                            continue;
                        }

                        if (_commsFailureCallback != null)
                        {
                            _commsFailureCallback(socketException);
                        }
                        else
                        {
                            throw;
                        }
                    }
                    catch (Exception ex)
                    {
                        if (!_processConnectionThread)
                        {
                            return;
                        }

                        if (_commsFailureCallback != null)
                        {
                            _commsFailureCallback(ex);
                        }
                        else
                        {
                            throw;
                        }
                    }
                }

                #endregion Attempt to connect

                if (!_processConnectionThread)
                {
                    return;
                }

                _connected = true;

                if (_connectCallback != null)
                {
                    _connectCallback(null);
                }

                #region Read from socket

                try
                {
                    byte[] buffer = new byte[4];

                    int bytesRead;

                    // Read data from socket ...
                    while (_processConnectionThread)
                    {
                        bytesRead = _serverSocket.Receive(buffer, buffer.Length, SocketFlags.None);
                        if (bytesRead != buffer.Length)
                        {
                            break;
                        }

                        int readSize = BitConverter.ToInt32(buffer, 0);
                        readSize = IPAddress.NetworkToHostOrder(readSize);

                        byte[] packet = new byte[readSize];

                        bytesRead = _serverSocket.Receive(packet, packet.Length, SocketFlags.None);
                        if (bytesRead != packet.Length)
                        {
                            break;
                        }

                        IrssMessage message = IrssMessage.FromBytes(packet);
                        _messageSink(message);
                    }

                    if (!_processConnectionThread)
                    {
                        return;
                    }

                    if (_disconnectCallback != null)
                    {
                        _disconnectCallback(null);
                    }
                }
                catch (SocketException socketException)
                {
                    if (!_processConnectionThread)
                    {
                        return;
                    }

                    if (socketException.ErrorCode == 10054) // ConnectionReset
                    {
                        if (_disconnectCallback != null)
                        {
                            _disconnectCallback(null);
                        }
                    }
                    else
                    {
                        if (_commsFailureCallback != null)
                        {
                            _commsFailureCallback(socketException);
                        }
                        else
                        {
                            throw;
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (!_processConnectionThread)
                    {
                        return;
                    }

                    if (_commsFailureCallback != null)
                    {
                        _commsFailureCallback(ex);
                    }
                    else
                    {
                        throw;
                    }
                }

                #endregion Read from socket
            }
        }
예제 #15
0
        private void Connected(object obj)
        {
            IrssMessage message = new IrssMessage(MessageType.RegisterClient, MessageFlags.Request);

            _client.Send(message);
        }
예제 #16
0
 private void QueueMessageSink(IrssMessage message)
 {
     _messageSink(message);
 }
예제 #17
0
        private static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            IrssLog.LogLevel = IrssLog.Level.Debug;
            IrssLog.Open("Virtual Remote.log");

            Application.ThreadException += Application_ThreadException;

            LoadSettings();

            if (args.Length > 0) // Command Line Start ...
            {
                List <string> virtualButtons = new List <string>();

                try
                {
                    for (int index = 0; index < args.Length; index++)
                    {
                        if (args[index].Equals("-host", StringComparison.OrdinalIgnoreCase))
                        {
                            _serverHost = args[++index];
                            continue;
                        }
                        else
                        {
                            virtualButtons.Add(args[index]);
                        }
                    }
                }
                catch (Exception ex)
                {
                    IrssLog.Error("Error processing command line parameters: {0}", ex.ToString());
                }

                IPAddress  serverIP = Network.GetIPFromName(_serverHost);
                IPEndPoint endPoint = new IPEndPoint(serverIP, Server.DefaultPort);

                if (virtualButtons.Count != 0 && StartClient(endPoint))
                {
                    Thread.Sleep(250);

                    // Wait for registered ... Give up after 10 seconds ...
                    int attempt = 0;
                    while (!_registered)
                    {
                        if (++attempt >= 10)
                        {
                            break;
                        }
                        else
                        {
                            Thread.Sleep(1000);
                        }
                    }

                    if (_registered)
                    {
                        foreach (string button in virtualButtons)
                        {
                            if (button.StartsWith("~", StringComparison.OrdinalIgnoreCase))
                            {
                                Thread.Sleep(button.Length * 500);
                            }
                            else
                            {
                                IrssMessage message = new IrssMessage(MessageType.ForwardRemoteEvent, MessageFlags.Notify, button);
                                _client.Send(message);
                            }
                        }

                        Thread.Sleep(500);
                    }
                    else
                    {
                        IrssLog.Warn("Failed to register with server host \"{0}\", custom message(s) not sent", ServerHost);
                    }
                }
            }
            else // GUI Start ...
            {
                if (String.IsNullOrEmpty(_serverHost))
                {
                    ServerAddress serverAddress = new ServerAddress();
                    serverAddress.ShowDialog();

                    _serverHost = serverAddress.ServerHost;
                }

                bool clientStarted = false;

                IPAddress  serverIP = Network.GetIPFromName(_serverHost);
                IPEndPoint endPoint = new IPEndPoint(serverIP, Server.DefaultPort);

                try
                {
                    clientStarted = StartClient(endPoint);
                }
                catch (Exception ex)
                {
                    IrssLog.Error(ex);
                    clientStarted = false;
                }

                if (clientStarted)
                {
                    Application.Run(new MainForm());
                }

                SaveSettings();
            }

            StopClient();

            Application.ThreadException -= Application_ThreadException;

            IrssLog.Close();
        }