\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
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
Next i\r
End If\r
End Sub\r
+\r
Private Sub ClearServiceInfo()\r
TextRecord.Items.Clear()\r
NameField.Text = ""\r
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
\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
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
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