From 3a1a7b17f7765edf56d2714c337c8501adcf2189 Mon Sep 17 00:00:00 2001 From: fcolin Date: Fri, 9 Nov 2007 10:20:21 +0000 Subject: separation des references a Windows Form --- IvyControl/IvyControl.cs | 473 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 473 insertions(+) create mode 100644 IvyControl/IvyControl.cs (limited to 'IvyControl/IvyControl.cs') diff --git a/IvyControl/IvyControl.cs b/IvyControl/IvyControl.cs new file mode 100644 index 0000000..a432914 --- /dev/null +++ b/IvyControl/IvyControl.cs @@ -0,0 +1,473 @@ +/// François-Régis Colin +/// http://www.tls.cena.fr/products/ivy/ +/// * +/// (C) CENA +/// * +/// + +namespace IvyBus +{ + using System; + using System.IO; + using System.Collections; + using System.Collections.Specialized; + using System.Collections.Generic; + using System.Net; + using System.Net.Sockets; + using System.Threading; + using System.Configuration; + using System.Globalization; + using System.Text.RegularExpressions; + using System.Text; + using System.Reflection; + using System.ComponentModel; + using System.Diagnostics; + +#if (!PocketPC) + using System.ComponentModel.Design; +#endif +// using System.Drawing.Design; + + + /// The Main bus Class + /// + /// +#if (!PocketPC) + // Show this property in the property grid. + [ToolboxItemFilter("System.Windows.Forms.Form", ToolboxItemFilterType.Allow)] + [Description("IVY Main API")] +#endif + [DesignerCategory("Component")] + public class IvyControl : System.ComponentModel.Component, ISupportInitialize + { + public Ivy ivy; + private List app_bindings; + + /* Event */ + [Description("Occurs when a new client connect to the bus")] + public event EventHandler ClientConnected + { + remove + { + ivy.ClientConnected -= value; + } + add + { + ivy.ClientConnected += value; + } + + } + [Description("Occurs when a client discconnect from the bus")] + public event EventHandler ClientDisconnected + { + remove + { + ivy.ClientDisconnected -= value; + } + add + { + ivy.ClientDisconnected += value; + } + + } + [Description("Occurs when a client receive a direct message from another client")] + public event EventHandler DirectMessageReceived + { + remove + { + ivy.DirectMessageReceived -= value; + } + add + { + ivy.DirectMessageReceived += value; + } + + } + [Description("Occurs when somebody ask for killing every client on the bus")] + public event EventHandler DieReceived + { + remove + { + ivy.DieReceived -= value; + } + add + { + ivy.DieReceived += value; + } + + } + [Description("Occurs when a client receive a add binding from another client")] + public event EventHandler BindingAdd + { + remove + { + ivy.BindingAdd -= value; + } + add + { + ivy.BindingAdd += value; + } + + } + [Description("Occurs when a client receive a remove binding from another client")] + public event EventHandler BindingRemove + { + remove + { + ivy.BindingRemove -= value; + } + add + { + ivy.BindingRemove += value; + } + + } + [Description("Occurs when a client receive a binding from another client and it as been filtered ")] + public event EventHandler BindingFilter + { + remove + { + ivy.BindingFilter -= value; + } + add + { + ivy.BindingFilter += value; + } + + } + [Description("Occurs when a client receive a remove binding from another client")] + public event EventHandler ErrorMessage + { + remove + { + ivy.ErrorMessage -= value; + } + add + { + ivy.ErrorMessage += value; + } + + } + +#if (!PocketPC) + [Bindable(true)] + [Category("Ivy")] +#endif + [DefaultValue(false)] + public static bool DebugProtocol + { + get + { + return Ivy.DebugProtocol; + } + set + { + Ivy.DebugProtocol = value; + } + + } +#if (!PocketPC) + [Category("Ivy")] +#endif + public CultureInfo Culture + { + get + { + return ivy.Culture; + } + set + { + ivy.Culture = value; + } + + } + + + /// AppName the application name + +#if (!PocketPC) + [Category("Ivy")] + [Bindable(true)] +#endif + [DefaultValue(null)] + public string AppName + { + set + { + ivy.AppName = value; + } + get + { + return ivy.AppName; + } + + } + + /// AppPriority the Application Priority: the clients list is sorted against priority +#if (!PocketPC) + [Category("Ivy")] +#endif + [DefaultValue(Ivy.DEFAULT_PRIORITY)] + public ushort AppPriority + { + set + { + ivy.AppPriority = value; + } + get + { + return ivy.AppPriority; + } + + } + + ///SentMessageClasses the first word token of sent messages + /// optimise the parsing process when sending messages + /// +#if (!PocketPC) + [Category("Ivy")] + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + // sinon bug System.String constructor not found ! + [Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design", "System.Drawing.Design.UITypeEditor, System.Drawing")] +#endif + public List SentMessageFilter + { + get + { + return ivy.SentMessageFilter; + } + } + /// ReadyMessage message send when Application receive all the regexp at the connection of the client + +#if (!PocketPC) + [Bindable(true)] + [Category("Ivy")] +#endif + [DefaultValue(null)] + public string ReadyMessage + { + get { return ivy.ReadyMessage; } + set { ivy.ReadyMessage = value; } + } + + + +#if (PocketPC) +#if (!PocketPC) + [Category("Ivy")] +#endif + [DefaultValue(null)] + public System.Windows.Forms.ContainerControl ContainerControl + { + get { return parentControl; } + set + { + parentControl = value; + } + } +#endif +#if (!PocketPC) + [Category("Ivy")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] +#endif + public List Bindings + { + get { return app_bindings; } + } + + + /// + /// Initializes a new instance of the class. + /// + public IvyControl() + { + ivy = new Ivy(); + app_bindings = new List(); + + // get binding from Attribute IvyBinding + //TODO Autobinding attribute +#if (PocketPC) + if (parentControl != null) + BindAttibute(parentControl); +#endif + Assembly assembly = Assembly.GetCallingAssembly(); + if ( assembly != this.GetType().Assembly ) + ivy.BindAttibute(assembly); + } + public IvyControl(IContainer container) + : this() + { + container.Add(this); + // get binding from Attribute IvyBinding + //TODO Autobinding attribute + Assembly assembly = Assembly.GetCallingAssembly(); + if (assembly != this.GetType().Assembly) + ivy.BindAttibute(assembly); + } + /// + /// Readies the structures for the software bus connexion. + /// + /// This sample shows how to start working with Ivy. + /// + /// Ivy bus = new Ivy("Dummy agent","ready"); + /// bus.bindMsg("(.*)",myMessageListener); + /// bus.start(null); + /// + /// How to send & receive: + /// the Ivy agent A performs b.bindMsg("^Hello (*)",cb); + /// the Ivy agent B performs b2.sendMsg("Hello world"); + /// a thread in A will run the callback cb with its second argument set + /// to a array of string, with one single element, "world" + /// + /// + /// the real work begin in the start() method + /// + /// + /// The name of your Ivy agent on the software bus + /// + /// The hellow message you will send once ready + /// + public IvyControl(string name, string rdy_message) + : this() + { + ivy.AppName = name; + ivy.ReadyMessage = rdy_message; + // get binding from Attribute IvyBinding + //TODO Autobinding attribute + Assembly assembly = Assembly.GetCallingAssembly(); + if (assembly != this.GetType().Assembly) + ivy.BindAttibute(assembly); + } + + protected override void Dispose(bool disposing) + { + try + { + if (disposing && ivy != null ) + { + ivy.Stop(); + } + } + finally + { + base.Dispose(disposing); + } + } + + + /// + /// Send a formated message to someone on the bus + /// + /// + /// Performs a pattern matching according to everyone's regexps, and sends + /// the results to the relevant ivy agents. + /// There is one thread for each client connected, we could also + /// create another thread each time we send a message. + /// + /// A string message format to build the message + /// args used in message format + /// + /// the number of messages actually sent + /// + public int SendMsg(string format, params object[] args) + { + return ivy.SendMsg(format, args); + } + // + public ushort BindMsg(IvyApplicationBinding newbind) + { + return ivy.BindMsg(newbind); + } + /// + /// Subscribes to a regular expression. + /// + /// a regular expression, groups are done with parenthesis + /// any objects implementing the Ivy.MessageListener + /// The args. + /// the id of the regular expression + /// + /// The callback will be executed with + /// the saved parameters of the regexp as arguments when a message will sent + /// by another agent. A program doesn't receive its own messages. + /// + // + public ushort BindMsg(string regexp, EventHandler callback, params object[] args) + { + return ivy.BindMsg(regexp, callback,args); + } + + /// + /// unsubscribes a regular expression + /// + /// the id of the regular expression, returned when it was bound + public void UnbindMsg(ushort id) + { + ivy.UnbindMsg(id); + } + + /// + /// unsubscribes a regular expression + /// + /// the string for the regular expression + /// + /// a boolean, true if the regexp existed, false otherwise or + /// whenever an exception occured during unbinding + /// + public bool UnbindMsg(string re) + { + return ivy.UnbindMsg(re); + } + + + /// + /// Subscribes to a simple expression ( msg ar1 arg2 arg3 etc). + /// + /// + /// The callback will be executed with + /// the saved parameters of the regexp as arguments when a message will sent + /// by another agent. A program doesn't receive its own messages. + /// + /// + /// a regular expression, groups are done with parenthesis + /// any objects implementing the EventHandler + /// + /// the id of the regular expression + /// + public int BindSimpleMsg(string expression, EventHandler callback, params object[] args) + { + return ivy.BindSimpleMsg(expression, callback, args); + } + + /// + /// gives a list of IvyClient(s) with the name given in parameter + /// + /// The name of the Ivy agent you're looking for + /// + public List GetClientsByName(string name) + { + + return ivy.GetClientsByName( name ); + } + + + #region ISupportInitialize Members + + public void BeginInit() + { + + } + + public void EndInit() + { + // TODO ugly should be added directly the bindings Dictionary ! + foreach (IvyApplicationBindingControl bind in app_bindings) + { + ivy.BindMsg(bind.binding); + } + } + + #endregion + + } +} \ No newline at end of file -- cgit v1.1