1
|
using System;
|
2
|
using System.Collections.Generic;
|
3
|
using System.Linq;
|
4
|
using System.Runtime.InteropServices;
|
5
|
using System.Text;
|
6
|
using System.Threading.Tasks;
|
7
|
|
8
|
namespace LDClient.detection {
|
9
|
|
10
|
public class T32ApiFetcher : AInfoFetcher, IT32Utils {
|
11
|
#if _WINDOWS
|
12
|
private const string T32DllLibrary = "./lib/t32api64.dll";
|
13
|
#else
|
14
|
private const string T32DllLibrary = "./lib/t32api64.so";
|
15
|
#endif
|
16
|
|
17
|
private readonly string _t32Address;
|
18
|
private readonly string _t32Port;
|
19
|
private readonly string _t32PacketLength;
|
20
|
private readonly string[] _commands;
|
21
|
|
22
|
public T32ApiFetcher(uint maxAttempts, uint waitPeriodMs, string infoFilePath, string t32Address,
|
23
|
string t32Port, string t32PacketLength, string[] commands) : base(maxAttempts, waitPeriodMs, infoFilePath) {
|
24
|
this._t32Address = t32Address;
|
25
|
this._t32Port = t32Port;
|
26
|
this._t32PacketLength = t32PacketLength;
|
27
|
this._commands = commands;
|
28
|
}
|
29
|
|
30
|
|
31
|
[DllImport(T32DllLibrary, CharSet = CharSet.Ansi)]
|
32
|
private static extern int T32_Config(string s1, string s2);
|
33
|
|
34
|
[DllImport(T32DllLibrary, CharSet = CharSet.Ansi)]
|
35
|
private static extern int T32_Init();
|
36
|
|
37
|
[DllImport(T32DllLibrary, CharSet = CharSet.Ansi)]
|
38
|
private static extern int T32_Attach(int dev);
|
39
|
|
40
|
[DllImport(T32DllLibrary, CharSet = CharSet.Ansi)]
|
41
|
private static extern int T32_Cmd(string command);
|
42
|
|
43
|
[DllImport(T32DllLibrary, CharSet = CharSet.Ansi)]
|
44
|
private static extern int T32_Exit();
|
45
|
|
46
|
public bool InitConnection() {
|
47
|
Program.DefaultLogger.Debug("Trace32 connection initialization");
|
48
|
var config1 = T32_Config("NODE=", _t32Address);
|
49
|
var config2 = T32_Config("PORT=", _t32Port);
|
50
|
var config3 = T32_Config("PACKLEN=", _t32PacketLength);
|
51
|
|
52
|
if (config1 != 0 || config2 != 0 || config3 != 0) {
|
53
|
Program.DefaultLogger.Error("Trace32 API connection configuration failed.");
|
54
|
return false;
|
55
|
}
|
56
|
var init = T32_Init();
|
57
|
if (init != 0) {
|
58
|
Program.DefaultLogger.Error("Trace32 API connection init failed.");
|
59
|
return false;
|
60
|
}
|
61
|
|
62
|
var attach = T32_Attach(1);
|
63
|
if (attach != 0) {
|
64
|
Program.DefaultLogger.Error("Trace32 API connection attach failed.");
|
65
|
}
|
66
|
|
67
|
Program.DefaultLogger.Info("Trace32 connection established");
|
68
|
return true;
|
69
|
}
|
70
|
|
71
|
public bool ExecuteCommands() {
|
72
|
Program.DefaultLogger.Info("Trace32 API commands execution.");
|
73
|
foreach (var command in _commands) {
|
74
|
Program.DefaultLogger.Debug($"Executing Trace32 command '{command}'.");
|
75
|
var ret = T32_Cmd(command);
|
76
|
if (ret != 0) {
|
77
|
Program.DefaultLogger.Error($"Execution of command '{command}' failed. Return code {ret}.");
|
78
|
return false;
|
79
|
}
|
80
|
}
|
81
|
Program.DefaultLogger.Info("All Trace32 commands executed successfully.");
|
82
|
return true;
|
83
|
}
|
84
|
|
85
|
public bool CloseConnection() {
|
86
|
Program.DefaultLogger.Debug("Trace32 connection exit");
|
87
|
return T32_Exit() == 0;
|
88
|
}
|
89
|
|
90
|
protected override bool FetchData() {
|
91
|
var connected = false;
|
92
|
for (var i = 0; i < _maxAttempts; i++) {
|
93
|
connected = InitConnection();
|
94
|
if (connected) {
|
95
|
break;
|
96
|
}
|
97
|
Thread.Sleep((int)_waitPeriodMs);
|
98
|
|
99
|
}
|
100
|
return connected && ExecuteCommands() && CloseConnection();
|
101
|
}
|
102
|
}
|
103
|
}
|