summaryrefslogtreecommitdiff
path: root/CSharp/Ivy/IvyPPC/IvyBinding.cs
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;
		}
        
	}
}