1 // 2 // Copyright (c) 2010-2024 Antmicro 3 // 4 // This file is licensed under the MIT License. 5 // Full license text is available in 'licenses/MIT.txt'. 6 // 7 using System; 8 using System.Text; 9 using Antmicro.Renode.Utilities; 10 11 namespace Antmicro.Renode.Logging 12 { 13 public class NetworkBackend : FormattedTextBackend 14 { NetworkBackend(int port, bool plainMode = true)15 public NetworkBackend(int port, bool plainMode = true) 16 { 17 PlainMode = plainMode; 18 socketServerProvider = new SocketServerProvider(); 19 socketServerProvider.Start(port); 20 } 21 Dispose()22 public override void Dispose() 23 { 24 lock(sync) 25 { 26 socketServerProvider?.Stop(); 27 socketServerProvider = null; 28 } 29 } 30 SetColor(ConsoleColor color)31 protected override void SetColor(ConsoleColor color) 32 { 33 socketServerProvider?.Send(GetColorControlSequence(color)); 34 } 35 ResetColor()36 protected override void ResetColor() 37 { 38 socketServerProvider?.Send(setDefaultsControlSequence); 39 } 40 WriteLine(string line)41 protected override void WriteLine(string line) 42 { 43 socketServerProvider?.Send(Encoding.ASCII.GetBytes(line)); 44 socketServerProvider?.Send(newLineSequence); 45 } 46 GetColorControlSequence(ConsoleColor color)47 private static byte[] GetColorControlSequence(ConsoleColor color) 48 { 49 var index = (int)color; 50 if(index < 0 || index >= colorControlSequence.Length) 51 { 52 throw new ArgumentException($"Color must be a {nameof(ConsoleColor)} value", nameof(color)); 53 } 54 55 return colorControlSequence[index]; 56 } 57 58 private static readonly byte[][] colorControlSequence = { 59 Encoding.ASCII.GetBytes("\x1b[30m"), // ConsoleColor.Black 60 Encoding.ASCII.GetBytes("\x1b[34m"), // ConsoleColor.DarkBlue 61 Encoding.ASCII.GetBytes("\x1b[32m"), // ConsoleColor.DarkGreen 62 Encoding.ASCII.GetBytes("\x1b[36m"), // ConsoleColor.DarkCyan 63 Encoding.ASCII.GetBytes("\x1b[31m"), // ConsoleColor.DarkRed 64 Encoding.ASCII.GetBytes("\x1b[35m"), // ConsoleColor.DarkMagenta 65 Encoding.ASCII.GetBytes("\x1b[33m"), // ConsoleColor.DarkYellow 66 Encoding.ASCII.GetBytes("\x1b[37m"), // ConsoleColor.Gray 67 Encoding.ASCII.GetBytes("\x1b[90m"), // ConsoleColor.DarkGray 68 Encoding.ASCII.GetBytes("\x1b[94m"), // ConsoleColor.Blue 69 Encoding.ASCII.GetBytes("\x1b[92m"), // ConsoleColor.Green 70 Encoding.ASCII.GetBytes("\x1b[96m"), // ConsoleColor.Cyan 71 Encoding.ASCII.GetBytes("\x1b[91m"), // ConsoleColor.Red 72 Encoding.ASCII.GetBytes("\x1b[95m"), // ConsoleColor.Magenta 73 Encoding.ASCII.GetBytes("\x1b[93m"), // ConsoleColor.Yellow 74 Encoding.ASCII.GetBytes("\x1b[97m"), // ConsoleColor.White 75 }; 76 77 private static readonly byte[] setDefaultsControlSequence = Encoding.ASCII.GetBytes("\x1b[39;49m"); 78 private static readonly byte[] newLineSequence = Encoding.ASCII.GetBytes("\r\n"); 79 WriteChar(byte value)80 private void WriteChar(byte value) 81 { 82 socketServerProvider?.SendByte(value); 83 } 84 85 private SocketServerProvider socketServerProvider; 86 } 87 } 88