X-Git-Url: https://git.saurik.com/apple/mdnsresponder.git/blobdiff_plain/32bb7e43b766b4cf6c03ab11609bf9c164e40239..0b74dd16dce34c1c64267ece7abda266fa586255:/Clients/SimpleChat.NET/SimpleChat.cs diff --git a/Clients/SimpleChat.NET/SimpleChat.cs b/Clients/SimpleChat.NET/SimpleChat.cs index cdfdad3..338bdb7 100755 --- a/Clients/SimpleChat.NET/SimpleChat.cs +++ b/Clients/SimpleChat.NET/SimpleChat.cs @@ -13,34 +13,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - - Change History (most recent first): - -$Log: SimpleChat.cs,v $ -Revision 1.7 2009/06/04 20:21:19 herscher - Update code to work with DNSSD COM component - -Revision 1.6 2006/08/14 23:24:21 cheshire -Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0 - -Revision 1.5 2004/09/13 19:37:42 shersche -Change code to reflect namespace and type changes to dnssd.NET library - -Revision 1.4 2004/09/11 05:42:56 shersche -don't reset SelectedIndex in OnRemove - -Revision 1.3 2004/09/11 00:38:58 shersche -DNSService APIs now expect port in host format - -Revision 1.2 2004/07/19 22:08:53 shersche -Fixed rdata->int conversion problem in QueryRecordReply - -Revision 1.1 2004/07/19 07:57:08 shersche -Initial revision - - - -*/ + */ using System; using System.Drawing; @@ -65,19 +38,22 @@ namespace SimpleChat.NET private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Button button1; - private System.Windows.Forms.Label label1; - private Bonjour.DNSSDEventManager m_eventManager = null; - private Bonjour.DNSSDService m_service = null; - private Bonjour.DNSSDService m_registrar = null; - private Bonjour.DNSSDService m_browser = null; + private System.Windows.Forms.Label label1; + + private Bonjour.DNSSDEventManager m_eventManager = null; + private Bonjour.DNSSDService m_service = null; + private Bonjour.DNSSDService m_registrar = null; + private Bonjour.DNSSDService m_browser = null; private Bonjour.DNSSDService m_resolver = null; - private String m_name; - private Socket m_socket = null; - private const int BUFFER_SIZE = 1024; - public byte[] m_buffer = new byte[BUFFER_SIZE]; - public bool m_complete = false; - public StringBuilder m_sb = new StringBuilder(); - delegate void ReadMessageCallback(String data); + private String m_name; + private Socket m_socket = null; + private const int BUFFER_SIZE = 1024; + public byte[] m_buffer = new byte[BUFFER_SIZE]; + public bool m_complete = false; + public StringBuilder m_sb = new StringBuilder(); + + delegate void ReadMessageCallback(String data); + ReadMessageCallback m_readMessageCallback; /// /// Required designer variable. @@ -89,29 +65,31 @@ namespace SimpleChat.NET // // Called by DNSServices core as a result of Register() // call - // - - public void - ServiceRegistered - ( - DNSSDService service, - DNSSDFlags flags, - String name, - String regType, - String domain - ) - { - m_name = name; - - try - { - m_browser = m_service.Browse(0, 0, "_p2pchat._udp", null, m_eventManager); - } - catch - { - MessageBox.Show("Browse Failed", "Error"); - Application.Exit(); - } + // + public void + ServiceRegistered + ( + DNSSDService service, + DNSSDFlags flags, + String name, + String regType, + String domain + ) + { + m_name = name; + + // + // Try to start browsing for other instances of this service + // + try + { + m_browser = m_service.Browse(0, 0, "_p2pchat._udp", null, m_eventManager); + } + catch + { + MessageBox.Show("Browse Failed", "Error"); + Application.Exit(); + } } // @@ -119,7 +97,6 @@ namespace SimpleChat.NET // // Called by DNSServices core as a result of a Browse call // - public void ServiceFound ( @@ -130,52 +107,51 @@ namespace SimpleChat.NET String regType, String domain ) - { - if (serviceName != m_name) - { - PeerData peer = new PeerData(); - - peer.InterfaceIndex = ifIndex; - peer.Name = serviceName; - peer.Type = regType; - peer.Domain = domain; - peer.Address = null; - - comboBox1.Items.Add(peer); - - if (comboBox1.Items.Count == 1) - { - comboBox1.SelectedIndex = 0; - } + { + if (serviceName != m_name) + { + PeerData peer = new PeerData(); + + peer.InterfaceIndex = ifIndex; + peer.Name = serviceName; + peer.Type = regType; + peer.Domain = domain; + peer.Address = null; + + comboBox1.Items.Add(peer); + + if (comboBox1.Items.Count == 1) + { + comboBox1.SelectedIndex = 0; + } } - } - - // - // ServiceLost - // - // Called by DNSServices core as a result of a Browse call - // - - public void - ServiceLost - ( - DNSSDService sref, - DNSSDFlags flags, - uint ifIndex, - String serviceName, - String regType, - String domain - ) - { - PeerData peer = new PeerData(); - - peer.InterfaceIndex = ifIndex; - peer.Name = serviceName; - peer.Type = regType; - peer.Domain = domain; - peer.Address = null; - - comboBox1.Items.Remove(peer); + } + + // + // ServiceLost + // + // Called by DNSServices core as a result of a Browse call + // + public void + ServiceLost + ( + DNSSDService sref, + DNSSDFlags flags, + uint ifIndex, + String serviceName, + String regType, + String domain + ) + { + PeerData peer = new PeerData(); + + peer.InterfaceIndex = ifIndex; + peer.Name = serviceName; + peer.Type = regType; + peer.Domain = domain; + peer.Address = null; + + comboBox1.Items.Remove(peer); } // @@ -184,34 +160,36 @@ namespace SimpleChat.NET // Called by DNSServices core as a result of DNSService.Resolve() // call // - - public void - ServiceResolved - ( - DNSSDService sref, - DNSSDFlags flags, - uint ifIndex, - String fullName, - String hostName, - ushort port, - TXTRecord txtRecord + public void + ServiceResolved + ( + DNSSDService sref, + DNSSDFlags flags, + uint ifIndex, + String fullName, + String hostName, + ushort port, + TXTRecord txtRecord ) - { - m_resolver.Stop(); - m_resolver = null; - - PeerData peer = (PeerData)comboBox1.SelectedItem; - - peer.Port = port; - - try - { - m_resolver = m_service.QueryRecord(0, ifIndex, hostName, DNSSDRRType.kDNSSDType_A, DNSSDRRClass.kDNSSDClass_IN, m_eventManager ); - } - catch - { - MessageBox.Show("QueryRecord Failed", "Error"); - Application.Exit(); + { + m_resolver.Stop(); + m_resolver = null; + + PeerData peer = (PeerData)comboBox1.SelectedItem; + + peer.Port = port; + + // + // Query for the IP address associated with "hostName" + // + try + { + m_resolver = m_service.QueryRecord(0, ifIndex, hostName, DNSSDRRType.kDNSSDType_A, DNSSDRRClass.kDNSSDClass_IN, m_eventManager ); + } + catch + { + MessageBox.Show("QueryRecord Failed", "Error"); + Application.Exit(); } } @@ -221,7 +199,6 @@ namespace SimpleChat.NET // Called by DNSServices core as a result of DNSService.QueryRecord() // call // - public void QueryAnswered ( @@ -234,51 +211,55 @@ namespace SimpleChat.NET Object rdata, uint ttl ) - { - m_resolver.Stop(); - m_resolver = null; - - PeerData peer = (PeerData) comboBox1.SelectedItem; + { + // + // Stop the resolve to reduce the burden on the network + // + m_resolver.Stop(); + m_resolver = null; + PeerData peer = (PeerData) comboBox1.SelectedItem; uint bits = BitConverter.ToUInt32( (Byte[])rdata, 0); System.Net.IPAddress address = new System.Net.IPAddress(bits); peer.Address = address; - } - - public void - OperationFailed - ( - DNSSDService service, - DNSSDError error - ) - { - MessageBox.Show("Operation returned an error code " + error, "Error"); - } - - // - // OnReadMessage - // - // Called when there is data to be read on a socket - // - // This is called (indirectly) from OnReadSocket() - // - private void - OnReadMessage - ( - String msg - ) - { - int rgb = 0; - - for (int i = 0; i < msg.Length && msg[i] != ':'; i++) - { - rgb = rgb ^ ((int)msg[i] << (i % 3 + 2) * 8); - } - - Color color = Color.FromArgb(rgb & 0x007F7FFF); - richTextBox1.SelectionColor = color; - richTextBox1.AppendText(msg + Environment.NewLine); + } + + public void + OperationFailed + ( + DNSSDService service, + DNSSDError error + ) + { + MessageBox.Show("Operation returned an error code " + error, "Error"); + } + + // + // OnReadMessage + // + // Called when there is data to be read on a socket + // + // This is called (indirectly) from OnReadSocket() + // + private void + OnReadMessage + ( + String msg + ) + { + int rgb = 0; + + for (int i = 0; i < msg.Length && msg[i] != ':'; i++) + { + rgb = rgb ^ ((int)msg[i] << (i % 3 + 2) * 8); + + } + + Color color = Color.FromArgb(rgb & 0x007F7FFF); + + richTextBox1.SelectionColor = color; + richTextBox1.AppendText(msg + Environment.NewLine); } // @@ -317,26 +298,32 @@ namespace SimpleChat.NET // // Required for Windows Form Designer support // - InitializeComponent(); - - try - { - m_service = new DNSSDService(); - } - catch - { - MessageBox.Show("Bonjour Service is not available", "Error"); - Application.Exit(); - } - - m_eventManager = new DNSSDEventManager(); - m_eventManager.ServiceRegistered += new _IDNSSDEvents_ServiceRegisteredEventHandler(this.ServiceRegistered); - m_eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(this.ServiceFound); - m_eventManager.ServiceLost += new _IDNSSDEvents_ServiceLostEventHandler(this.ServiceLost); - m_eventManager.ServiceResolved += new _IDNSSDEvents_ServiceResolvedEventHandler(this.ServiceResolved); - m_eventManager.QueryRecordAnswered += new _IDNSSDEvents_QueryRecordAnsweredEventHandler(this.QueryAnswered); + InitializeComponent(); + + try + { + m_service = new DNSSDService(); + } + catch + { + MessageBox.Show("Bonjour Service is not available", "Error"); + Application.Exit(); + } + + // + // Associate event handlers with all the Bonjour events that the app is interested in. + // + m_eventManager = new DNSSDEventManager(); + m_eventManager.ServiceRegistered += new _IDNSSDEvents_ServiceRegisteredEventHandler(this.ServiceRegistered); + m_eventManager.ServiceFound += new _IDNSSDEvents_ServiceFoundEventHandler(this.ServiceFound); + m_eventManager.ServiceLost += new _IDNSSDEvents_ServiceLostEventHandler(this.ServiceLost); + m_eventManager.ServiceResolved += new _IDNSSDEvents_ServiceResolvedEventHandler(this.ServiceResolved); + m_eventManager.QueryRecordAnswered += new _IDNSSDEvents_QueryRecordAnsweredEventHandler(this.QueryAnswered); m_eventManager.OperationFailed += new _IDNSSDEvents_OperationFailedEventHandler(this.OperationFailed); + // + // Socket read handler + // m_readMessageCallback = new ReadMessageCallback(OnReadMessage); this.Load += new System.EventHandler(this.Form1_Load); @@ -365,17 +352,17 @@ namespace SimpleChat.NET if (m_browser != null) { m_browser.Stop(); - } - - if (m_resolver != null) - { - m_resolver.Stop(); - } - - m_eventManager.ServiceFound -= new _IDNSSDEvents_ServiceFoundEventHandler(this.ServiceFound); - m_eventManager.ServiceLost -= new _IDNSSDEvents_ServiceLostEventHandler(this.ServiceLost); - m_eventManager.ServiceResolved -= new _IDNSSDEvents_ServiceResolvedEventHandler(this.ServiceResolved); - m_eventManager.QueryRecordAnswered -= new _IDNSSDEvents_QueryRecordAnsweredEventHandler(this.QueryAnswered); + } + + if (m_resolver != null) + { + m_resolver.Stop(); + } + + m_eventManager.ServiceFound -= new _IDNSSDEvents_ServiceFoundEventHandler(this.ServiceFound); + m_eventManager.ServiceLost -= new _IDNSSDEvents_ServiceLostEventHandler(this.ServiceLost); + m_eventManager.ServiceResolved -= new _IDNSSDEvents_ServiceResolvedEventHandler(this.ServiceResolved); + m_eventManager.QueryRecordAnswered -= new _IDNSSDEvents_QueryRecordAnsweredEventHandler(this.QueryAnswered); m_eventManager.OperationFailed -= new _IDNSSDEvents_OperationFailedEventHandler(this.OperationFailed); } base.Dispose( disposing ); @@ -517,8 +504,10 @@ namespace SimpleChat.NET Byte[] bytes = Encoding.UTF8.GetBytes(message); - IPEndPoint endPoint = new IPEndPoint( peer.Address, peer.Port ); - + IPEndPoint endPoint = new IPEndPoint( peer.Address, peer.Port ); + + + m_socket.SendTo(bytes, endPoint); richTextBox1.SelectionColor = Color.Black; @@ -558,54 +547,55 @@ namespace SimpleChat.NET Application.Exit(); } } - } - - // - // PeerData - // - // Holds onto the information associated with a peer on the network - // - public class PeerData - { - public uint InterfaceIndex; - public String Name; - public String Type; - public String Domain; - public IPAddress Address; - public int Port; - - public override String - ToString() - { - return Name; - } - - public override bool - Equals(object other) - { - bool result = false; - - if (other != null) - { - if ((object)this == other) - { - result = true; - } - else if (other is PeerData) - { - PeerData otherPeerData = (PeerData)other; - - result = (this.Name == otherPeerData.Name); - } - } - - return result; - } - - public override int - GetHashCode() - { - return Name.GetHashCode(); - } + } + + // + // PeerData + // + // Holds onto the information associated with a peer on the network + // + public class PeerData + { + public uint InterfaceIndex; + public String Name; + public String Type; + public String Domain; + public IPAddress Address; + public int Port; + + public override String + ToString() + { + return Name; + } + + public override bool + Equals(object other) + { + bool result = false; + + if (other != null) + { + if ((object)this == other) + { + result = true; + } + else if (other is PeerData) + { + PeerData otherPeerData = (PeerData)other; + + result = (this.Name == otherPeerData.Name); + } + } + + return result; + } + + + public override int + GetHashCode() + { + return Name.GetHashCode(); + } }; }