blob: 624b401cf0ca62dc80390c658294de764e91d6ed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Text.RegularExpressions;
using System.Diagnostics;
namespace IvyBus
{
/* This is the Client side of binding storage */
/* association of a generated Key and the expression and a compiled Expression matching */
/* this is RECEIVED from other client */
/// <summary>
/// Description résumée de IvyBinding.
/// </summary>
internal abstract class IvyBindingBase
{
private ushort key;
internal ushort Key
{
get { return key; }
}
protected string expression;
internal string Expression
{
get { return expression; }
}
internal IvyBindingBase(ushort id, string exp)
{
key = id;
expression = exp;
}
internal abstract string[] Match(string message);
}
internal class IvyBindingRegexp : IvyBindingBase
{
internal Regex regexp;
public IvyBindingRegexp(ushort id, string exp)
: base(id, exp)
{
regexp = new Regex(expression, /* RegexOptions.Compiled | */RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
//regexp.Match("###"); // for really compile the expression really slow on 3000 expression
}
internal override string[] Match(string message)
{
string[] args = null;
// use of regexp to extract info
Match result = regexp.Match(message);
if (result.Success)
{
// Start at 1 because group 0 represent entire matching
args = new string[result.Groups.Count-1];
for (int sub = 1; sub < result.Groups.Count; sub++)
{
args[sub-1] = result.Groups[sub].Value;
}
}
return args;
}
}
internal class IvyBindingSimple : IvyBindingBase
{
internal string msgname; // message name
internal string[] msgargs; // list of message args names
static string msgtag; // send message name
static StringDictionary args_values; // send message args[name]=value
internal IvyBindingSimple(ushort id, string exp)
: base(id, exp)
{
string[] expr = expression.Split( ' ' );
msgname = expr[0];
msgargs = new string[ expr.Length -1 ];
for ( int i = 1; i < expr.Length; i++ )
msgargs[i-1] = expr[i];
}
static internal void Prepare(string message)
{
string[] msg = message.Split(' ');
msgtag = msg[0];
args_values = new StringDictionary();
for( int sub=1 ; sub < msg.Length; sub++ )
{
string[] arg = msg[sub].Split('='); // champ = valeur
if ( arg.Length == 2 )
args_values[arg[0]] = arg[1];
else
{
Ivy.traceError("IvyBindingSimple" , "abnormally Formed message expected 'msg champ=valeur champ=valeur....' :" + message);
}
}
}
internal override string[] Match(string message)
{
// the message is already parsed by prepare
//
string[] args = null;
if (msgtag == msgname)
{
args = new string[msgargs.Length];
for( int sub= 0; sub < msgargs.Length; sub++)
{
args[sub] = args_values[msgargs[sub]];
}
}
return args;
}
}
}
|