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