11#pragma warning disable CS8601 // Possible null
22
3+ using System . Globalization ;
34using System . Text ;
5+ using System . Text . RegularExpressions ;
46using HardwareMonitor . PresentMon ;
57using HardwareMonitor . SharedMemory ;
68using HardwareMonitor . Sockets ;
@@ -54,31 +56,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
5456 using var writer = new BinaryWriter ( memoryStream ) ;
5557 var accumulator = 0 ;
5658
57- writer . Write ( ( short ) MonitorPacketCommand . Data ) ;
58- writer . Write ( sharedMemoryData . Hardwares . Count ) ;
59- writer . Write ( sharedMemoryData . Sensors . Count ) ;
60-
61- foreach ( var hardware in sharedMemoryData . Hardwares )
62- {
63- writer . Write ( GetBytes ( hardware . Name , SharedMemoryConsts . NameSize ) ) ;
64- writer . Write ( GetBytes ( hardware . Identifier , SharedMemoryConsts . IdentifierSize ) ) ;
65- writer . Write ( ( int ) hardware . HardwareType ) ;
66- }
67-
68- for ( var index = 0 ; index < sharedMemoryData . Sensors . Count ; index ++ )
69- {
70- var sensor = sharedMemoryData . Sensors [ index ] ;
71- sensor . Value = float . IsNaN ( sensor . Sensor . Value ?? 0f ) ? 0f : ( sensor . Sensor . Value ?? 0f ) ;
72-
73- writer . Write ( GetBytes ( sensor . Name , SharedMemoryConsts . NameSize ) ) ;
74- writer . Write ( GetBytes ( sensor . Identifier , SharedMemoryConsts . IdentifierSize ) ) ;
75- writer . Write ( GetBytes ( sensor . HardwareIdentifier , SharedMemoryConsts . IdentifierSize ) ) ;
76- writer . Write ( ( int ) sensor . SensorType ) ;
77- writer . Write ( ( float ) sensor . Value ) ;
78-
79- // store the starting offset of the float we just wrote
80- sensorValueOffset [ index ] = ( int ) writer . BaseStream . Position - 4 ;
81- }
59+ WriteDataToStream ( writer , sharedMemoryData ) ;
8260
8361 while ( ! stoppingToken . IsCancellationRequested )
8462 {
@@ -88,21 +66,13 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
8866 await Task . Delay ( 1000 , stoppingToken ) ;
8967 continue ;
9068 }
91-
69+
9270 foreach ( var hardware in sharedMemoryData . Hardwares )
9371 {
9472 hardware . Hardware . Update ( ) ;
9573 }
9674
97- for ( var index = 0 ; index < sharedMemoryData . Sensors . Count ; index ++ )
98- {
99- var sensor = sharedMemoryData . Sensors [ index ] ;
100- sensor . Value = float . IsNaN ( sensor . Sensor . Value ?? 0f ) ? 0f : ( sensor . Sensor . Value ?? 0f ) ;
101-
102- // seek to the sensor value offset
103- writer . Seek ( sensorValueOffset [ index ] , SeekOrigin . Begin ) ;
104- writer . Write ( ( float ) sensor . Value ) ;
105- }
75+ WriteDataToStream ( writer , sharedMemoryData ) ;
10676
10777 if ( _socketHost . HasConnections ( ) )
10878 {
@@ -123,6 +93,39 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
12393 hostApplicationLifetime . StopApplication ( ) ;
12494 }
12595
96+ private static void WriteDataToStream ( BinaryWriter writer , SharedMemoryData sharedMemoryData )
97+ {
98+ writer . Seek ( 0 , SeekOrigin . Begin ) ;
99+ writer . Write ( ( short ) MonitorPacketCommand . Data ) ;
100+ writer . Write ( sharedMemoryData . Hardwares . Count ) ;
101+ writer . Write ( sharedMemoryData . Sensors . Count ) ;
102+
103+ foreach ( var hardware in sharedMemoryData . Hardwares )
104+ {
105+ writer . Write ( ( short ) hardware . Name . Length ) ;
106+ writer . Write ( ( short ) hardware . Identifier . Length ) ;
107+ writer . Write ( Encoding . UTF8 . GetBytes ( hardware . Name ) ) ;
108+ writer . Write ( Encoding . UTF8 . GetBytes ( hardware . Identifier ) ) ;
109+ writer . Write ( ( int ) hardware . HardwareType ) ;
110+ }
111+
112+ foreach ( var sensor in sharedMemoryData . Sensors )
113+ {
114+ var value = sensor . HardwareSensor . Value ?? 0f ;
115+ var floatValue = ( IsNaN ( value ) ? 0f : value ) . ToString ( CultureInfo . InvariantCulture ) ;
116+ sensor . Value = float . Parse ( floatValue , CultureInfo . InvariantCulture ) ;
117+
118+ writer . Write ( ( short ) sensor . Name . Length ) ;
119+ writer . Write ( ( short ) sensor . Identifier . Length ) ;
120+ writer . Write ( ( short ) sensor . HardwareIdentifier . Length ) ;
121+ writer . Write ( Encoding . UTF8 . GetBytes ( sensor . Name ) ) ;
122+ writer . Write ( Encoding . UTF8 . GetBytes ( sensor . Identifier ) ) ;
123+ writer . Write ( Encoding . UTF8 . GetBytes ( sensor . HardwareIdentifier ) ) ;
124+ writer . Write ( ( int ) sensor . SensorType ) ;
125+ writer . Write ( ( float ) sensor . Value ) ;
126+ }
127+ }
128+
126129 private void OnClientConnected ( )
127130 {
128131 SendPresentMonAppsToClients ( ) ;
@@ -175,7 +178,6 @@ private void SendPresentMonAppsToClients()
175178 using var writer = new BinaryWriter ( memoryStream ) ;
176179
177180 writer . Write ( ( short ) MonitorPacketCommand . PresentMonApps ) ;
178- //logger.LogInformation("Sending presentmon apps to clients {Count}", _presentMonPoller.CurrentApps.Count);
179181 writer . Write ( ( short ) _presentMonPoller . CurrentApps . Count ) ;
180182 foreach ( var app in _presentMonPoller . CurrentApps )
181183 {
@@ -245,24 +247,35 @@ private void Stop()
245247
246248 private static SharedMemoryHardware MapHardware ( IHardware hardware ) => new ( )
247249 {
248- Name = hardware . Name ,
250+ Name = RemoveSpecialCharacters ( hardware . Name ) ,
249251 Identifier = hardware . Identifier . ToString ( ) ,
250252 HardwareType = hardware . HardwareType ,
251253 Hardware = hardware
252254 } ;
253255
254256 private static SharedMemorySensor MapSensor ( ISensor sensor ) => new ( )
255257 {
256- Name = sensor . Name ,
258+ Name = RemoveSpecialCharacters ( sensor . Name ) ,
257259 Identifier = sensor . Identifier . ToString ( ) ,
258260 SensorType = sensor . SensorType ,
259261 Value = float . IsNaN ( sensor . Value ?? 0f ) ? 0f : ( sensor . Value ?? 0f ) ,
260262 HardwareIdentifier = sensor . Hardware . Identifier . ToString ( ) ,
261- Sensor = sensor
263+ HardwareSensor = sensor
262264 } ;
263265
264266 private static byte [ ] GetBytes ( string str , int length )
265267 {
266268 return Encoding . UTF8 . GetBytes ( str . Length > length ? str [ ..length ] : str . PadRight ( length , '\0 ' ) ) ;
267269 }
270+
271+ public static string RemoveSpecialCharacters ( string str )
272+ {
273+ return Regex . Replace ( str , "[^a-zA-Z0-9_ .]+" , "_" , RegexOptions . Compiled ) ;
274+ }
275+
276+ public static unsafe bool IsNaN ( float f )
277+ {
278+ int binary = * ( int * ) ( & f ) ;
279+ return ( ( binary & 0x7F800000 ) == 0x7F800000 ) && ( ( binary & 0x007FFFFF ) != 0 ) ;
280+ }
268281}
0 commit comments