Projekt

Obecné

Profil

Stáhnout (3.67 KB) Statistiky
| Větev: | Tag: | Revize:
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
}
(9-9/10)