namespace IvyBus { using System; using System.Collections; using System.Collections.Specialized; using System.Text.RegularExpressions; using System.Diagnostics; using IvyBus.Properties; /* 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 string expression; internal string Expression { get { return expression; } } internal IvyBindingBase(string exp) { expression = exp; } internal abstract string[] Match(string message); } internal class IvyBindingRegexp : IvyBindingBase { internal Regex regexp; public IvyBindingRegexp( string exp) : base(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(string exp) : base(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" , Resources.BadSimpleBinding + 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; } } }