/// <summary> /// Creates a concrete instance of IXDBroadcast used to broadcast messages to /// other processes in one or more modes. /// </summary> /// <param name="modes">One or more transport mechanisms to use for interprocess communication.</param> /// <returns>The concreate instance of IXDBroadcast</returns> public static IXDBroadcast CreateBroadcast(params XDTransportMode[] modes) { if (modes.Length == 0) { throw new ArgumentException("At least one transport mode must be defined."); } if (modes.Length == 1) { switch (modes[0]) { case XDTransportMode.IOStream: return(new XDIOStreamBroadcast()); case XDTransportMode.MailSlot: return(new XDMailSlotBroadcast(false)); default: return(new XDWindowsMessaging()); } } else { // ensure only one of each type added Dictionary <XDTransportMode, IXDBroadcast> singleItems = new Dictionary <XDTransportMode, IXDBroadcast>(); foreach (XDTransportMode mode in modes) { // only add one of each mode if (!singleItems.ContainsKey(mode)) { singleItems.Add(mode, XDBroadcast.CreateBroadcast(mode)); } } return(new XDMultiBroadcast(singleItems.Values)); } }
/// <summary> /// The non-obsolete constructor used internally for creating new instances of XDListener. /// </summary> /// <param name="nonObsolete"></param> internal XDListener(bool nonObsolete) { // create a top-level native window CreateParams p = new CreateParams(); p.Width = 0; p.Height = 0; p.X = 0; p.Y = 0; p.Caption = string.Concat("TheCodeKing.Net.XDServices.", Guid.NewGuid().ToString()); p.Parent = IntPtr.Zero; base.CreateHandle(p); this.networkRelay = new NetworkRelayListener(XDBroadcast.CreateBroadcast(XDTransportMode.WindowsMessaging), XDListener.CreateListener(XDTransportMode.MailSlot)); }
/// <summary> /// Creates an instance of IXDBroadcast with the otption to propagate over the local network. /// </summary> /// <param name="mode">The broadcast mode.</param> /// <param name="propagateNetwork">true to propagate messages over the local network.</param> /// <returns></returns> public static IXDBroadcast CreateBroadcast(XDTransportMode mode, bool propagateNetwork) { // MailSlots can communicate over a network by default, so // no need to use the NetworkRelayBroadcast instance for this type. if (mode == XDTransportMode.MailSlot) { return(new XDMailSlotBroadcast(propagateNetwork)); } IXDBroadcast broadcast = CreateBroadcast(mode); if (propagateNetwork) { // create a wrapper to broadcast that will also send messages over network return(new NetworkRelayBroadcast(broadcast, XDBroadcast.CreateBroadcast(XDTransportMode.MailSlot, true))); } else { return(broadcast); } }