From 3593a483d5566779f1d56e037615685cdc77c0a0 Mon Sep 17 00:00:00 2001 From: fcolin Date: Thu, 1 Feb 2007 12:05:47 +0000 Subject: modification structure svn --- IvyPPC/IvyBinding.cs | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 IvyPPC/IvyBinding.cs (limited to 'IvyPPC/IvyBinding.cs') diff --git a/IvyPPC/IvyBinding.cs b/IvyPPC/IvyBinding.cs new file mode 100644 index 0000000..624b401 --- /dev/null +++ b/IvyPPC/IvyBinding.cs @@ -0,0 +1,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 */ + + /// + /// Description résumée de IvyBinding. + /// + 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; + } + + } +} -- cgit v1.1