]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - Clients/DNSServiceBrowser.VB/DNSServiceBrowser.vb
mDNSResponder-333.10.tar.gz
[apple/mdnsresponder.git] / Clients / DNSServiceBrowser.VB / DNSServiceBrowser.vb
index dbbced9d436d8ceaaa38a7580535f58b8151006b..bb67adab654a2d15118b624f445ead7018f58d54 100644 (file)
@@ -29,17 +29,53 @@ Public Class DNSServiceBrowser
 \r
         ComboBox1.SelectedIndex = 0\r
     End Sub\r
+\r
+       'Called when a service is found as a result of a browse operation\r
     Public Sub MyEventManager_ServiceFound(ByVal browser As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal serviceName As String, ByVal regtype As String, ByVal domain As String) Handles MyEventManager.ServiceFound\r
-        Dim browseData As New BrowseData\r
-        browseData.ServiceName = serviceName\r
-        browseData.RegType = regtype\r
-        browseData.Domain = domain\r
-        ServiceNames.Items.Add(browseData)\r
+        Dim index As Integer\r
+        index = ServiceNames.Items.IndexOf(serviceName)\r
+               '\r
+               ' A simple reference counting scheme is implemented so that the same service\r
+               ' does not show up more than once in the browse list.  This can happen\r
+               ' if the machine has more than one network interface.\r
+               '\r
+               ' If we have not seen this service before, then it is added to the browse list\r
+               ' Otherwise it's reference count is bumped up.\r
+               '\r
+        If index = -1 Then\r
+            Dim browseData As New BrowseData\r
+            browseData.ServiceName = serviceName\r
+            browseData.RegType = regtype\r
+            browseData.Domain = domain\r
+            browseData.Refs = 1\r
+            ServiceNames.Items.Add(browseData)\r
+        Else\r
+            Dim browseData As BrowseData\r
+            browseData = ServiceNames.Items([index])\r
+            browseData.Refs += 1\r
+        End If\r
     End Sub\r
+\r
     Public Sub MyEventManager_ServiceLost(ByVal browser As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal serviceName As String, ByVal regtype As String, ByVal domain As String) Handles MyEventManager.ServiceLost\r
-        ServiceNames.Items.Remove(serviceName)\r
+        Dim index As Integer\r
+               '\r
+               ' See the above about reference counting\r
+               '\r
+        index = ServiceNames.Items.IndexOf(serviceName)\r
+        If index <> -1 Then\r
+            Dim browseData As BrowseData\r
+            browseData = ServiceNames.Items([index])\r
+            browseData.Refs -= 1\r
+            If browseData.Refs = 0 Then\r
+                ServiceNames.Items.Remove(serviceName)\r
+            End If\r
+        End If\r
     End Sub\r
+\r
     Public Sub MyEventManager_ServiceResolved(ByVal resolver As Bonjour.DNSSDService, ByVal flags As Bonjour.DNSSDFlags, ByVal ifIndex As UInteger, ByVal fullname As String, ByVal hostname As String, ByVal port As UShort, ByVal record As Bonjour.TXTRecord) Handles MyEventManager.ServiceResolved\r
+               '\r
+               ' Once the service is resolved, the resolve operation is stopped. This reduces the burdne on the network\r
+               '\r
         m_resolver.Stop()\r
         m_resolver = Nothing\r
         Dim browseData As BrowseData = ServiceNames.Items.Item(ServiceNames.SelectedIndex)\r
@@ -49,6 +85,9 @@ Public Class DNSServiceBrowser
         HostField.Text = hostname\r
         PortField.Text = port\r
 \r
+               '\r
+               ' The values found in the text record are assumed to be human readable strings.\r
+               '\r
         If record IsNot Nothing Then\r
             For i As UInteger = 0 To record.GetCount() - 1\r
                 Dim key As String = record.GetKeyAtIndex(i)\r
@@ -58,6 +97,7 @@ Public Class DNSServiceBrowser
             Next i\r
         End If\r
     End Sub\r
+\r
     Private Sub ClearServiceInfo()\r
         TextRecord.Items.Clear()\r
         NameField.Text = ""\r
@@ -66,14 +106,20 @@ Public Class DNSServiceBrowser
         HostField.Text = ""\r
         PortField.Text = ""\r
     End Sub\r
+\r
     Private Sub ServiceNames_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ServiceNames.SelectedIndexChanged\r
         If m_resolver IsNot Nothing Then\r
             m_resolver.Stop()\r
         End If\r
         Me.ClearServiceInfo()\r
         Dim browseData As BrowseData = ServiceNames.Items.Item(ServiceNames.SelectedIndex)\r
+\r
+               '\r
+               ' Selecting a service instance starts a new resolve operation\r
+               '\r
         m_resolver = m_service.Resolve(0, 0, browseData.ServiceName, browseData.RegType, browseData.Domain, MyEventManager)\r
     End Sub\r
+\r
     Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged\r
         If m_browser IsNot Nothing Then\r
             m_browser.Stop()\r
@@ -81,6 +127,11 @@ Public Class DNSServiceBrowser
 \r
         ServiceNames.Items.Clear()\r
         Me.ClearServiceInfo()\r
+\r
+               '\r
+               ' Selecting a service type start a new browse operation\r
+               '\r
+\r
         m_browser = m_service.Browse(0, 0, ComboBox1.Items.Item(ComboBox1.SelectedIndex), "", MyEventManager)\r
     End Sub\r
 \r
@@ -92,6 +143,7 @@ Public Class BrowseData
     Private m_serviceName As String\r
     Private m_regType As String\r
     Private m_domain As String\r
+    Private m_refs As Integer\r
 \r
     Property ServiceName() As String\r
         Get\r
@@ -120,6 +172,23 @@ Public Class BrowseData
         End Set\r
     End Property\r
 \r
+    Property Refs As Integer\r
+        Get\r
+            Return m_refs\r
+        End Get\r
+        Set(ByVal Value As Integer)\r
+            m_refs = Value\r
+        End Set\r
+    End Property\r
+\r
+    Public Overrides Function Equals(obj As Object) As Boolean\r
+        If obj Is Nothing Then\r
+            Return False\r
+        Else\r
+            Return m_serviceName.Equals(obj.ToString)\r
+        End If\r
+    End Function\r
+\r
     Public Overrides Function ToString() As String\r
         Return m_serviceName\r
     End Function\r