Skip to content

Commit 6f75bed

Browse files
committed
Add advertisement packet support.
Fix a bug with listviewitem providing.
1 parent c588dfb commit 6f75bed

File tree

9 files changed

+233
-39
lines changed

9 files changed

+233
-39
lines changed

C-ALM-VOIP/C-ALM-VOIP/AddrBook/AddressableBase.vb

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ Public MustInherit Class AddressableBase
1313
Protected _passmode As MessagePassMode = messagePassMode.Disable
1414
Protected _targver As IPVersion = IPVersion.None
1515
Protected _lvi As ListViewItem = Nothing
16+
<NonSerialized>
17+
Protected slocklvi As New Object()
1618

1719
Public Sub New(other As AddressableBase)
1820
_name = other._name
@@ -129,26 +131,34 @@ Public MustInherit Class AddressableBase
129131
Public MustOverride Function duplicateToNew() As AddressableBase
130132

131133
Public Overridable Sub updateLVI(u As Boolean) Implements IListViewable.updateItem
132-
If (Not _lvi Is Nothing) AndAlso (Not _lvi.ListView Is Nothing) AndAlso _lvi.ListView.InvokeRequired Then
133-
_lvi.ListView.Invoke(Sub() Me.updateLVI(u))
134-
Else
135-
If _lvi Is Nothing Then _lvi = New ListViewItem(_name) Else _lvi.Text = name
136-
If _lvi.SubItems.Count < 2 Then _lvi.SubItems.Add(_targaddress) Else _lvi.SubItems(1).Text = _targaddress
137-
If _lvi.SubItems.Count < 3 Then _lvi.SubItems.Add(_targport) Else _lvi.SubItems(2).Text = _targport
138-
If _lvi.SubItems.Count < 4 Then _lvi.SubItems.Add(_type.ToString()) Else _lvi.SubItems(3).Text = _type.ToString()
139-
'If Not (_lvi.ListView Is Nothing) And u Then Update List View Somehow (Via Flag)
140-
'Uneeded as the list view automatically updates
141-
End If
134+
SyncLock slocklvi
135+
If (Not _lvi Is Nothing) AndAlso (Not _lvi.ListView Is Nothing) AndAlso _lvi.ListView.InvokeRequired Then
136+
_lvi.ListView.Invoke(Sub() updateLVIActual(u))
137+
Else
138+
updateLVIActual(u)
139+
End If
140+
End SyncLock
141+
End Sub
142+
143+
Protected Overridable Sub updateLVIActual(u As Boolean)
144+
If _lvi Is Nothing Then _lvi = New ListViewItem(_name) Else _lvi.Text = name
145+
If _lvi.SubItems.Count < 2 Then _lvi.SubItems.Add(_targaddress) Else _lvi.SubItems(1).Text = _targaddress
146+
If _lvi.SubItems.Count < 3 Then _lvi.SubItems.Add(_targport) Else _lvi.SubItems(2).Text = _targport
147+
If _lvi.SubItems.Count < 4 Then _lvi.SubItems.Add(_type.ToString()) Else _lvi.SubItems(3).Text = _type.ToString()
142148
End Sub
143149

144150
Public ReadOnly Property item As ListViewItem Implements IListViewable.item
145151
Get
146-
Return _lvi
152+
SyncLock slocklvi
153+
Return _lvi
154+
End SyncLock
147155
End Get
148156
End Property
149157

150158
Public Sub cleanItem() Implements IListViewable.cleanItem
151-
_lvi = Nothing
159+
SyncLock slocklvi
160+
_lvi = Nothing
161+
End SyncLock
152162
End Sub
153163
End Class
154164

C-ALM-VOIP/C-ALM-VOIP/AddrBook/Client.vb

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,21 @@ Public Class Client
3232
End Sub
3333

3434
Protected Overridable Sub msgrec(msg As IPacket)
35-
If _passmode = voip.MessagePassMode.Disable Or _passmode = voip.MessagePassMode.Send Then Exit Sub
35+
If _type = AddressableType.Block Or _passmode = voip.MessagePassMode.Disable Or _passmode = voip.MessagePassMode.Send Then Exit Sub
3636
If isForMe(msg) Then
37-
If msg.dataType = GetType(Tuple(Of Byte(), DateTime)) And isNewerTimeStamp(msg.data) Then
37+
If msg.dataType = GetType(Tuple(Of Byte(), DateTime)) AndAlso isNewerTimeStamp(msg.data) Then
3838
_lts = CType(msg.data, Tuple(Of Byte(), DateTime)).Item2
3939
If Not _str Is Nothing Then _
4040
_str.ingestData(CType(msg.data, Tuple(Of Byte(), DateTime)).Item1, False)
41+
ElseIf msg.dataType = GetType(Tuple(Of String, String, Integer)) Then
42+
If settings.setAdvertisedNames Then
43+
Me.name = CType(msg.data, Tuple(Of String, String, Integer)).Item1
44+
Me.updateLVI(True)
45+
If Not _str Is Nothing Then _
46+
_str.updateLVI(True)
47+
End If
48+
Me.advertisedAddress = CType(msg.data, Tuple(Of String, String, Integer)).Item2
49+
Me.advertisedPort = CType(msg.data, Tuple(Of String, String, Integer)).Item3
4150
End If
4251
End If
4352
End Sub
@@ -52,7 +61,7 @@ Public Class Client
5261
End Function
5362

5463
Protected Overridable Sub msgsnd(bts As Byte())
55-
If _passmode = voip.MessagePassMode.Disable Or _passmode = voip.MessagePassMode.Receive Then Exit Sub
64+
If _type = AddressableType.Block Or _passmode = voip.MessagePassMode.Disable Or _passmode = voip.MessagePassMode.Receive Then Exit Sub
5665
Dim ap As AudioPacket = Nothing
5766
If _type = AddressableType.TCP Then
5867
ap = New AudioPacket() With {.bytes = bts, .receiverIP = _cl.duplicatedInternalSocketConfig.remoteIPAddress, .receiverPort = _cl.duplicatedInternalSocketConfig.remotePort, .senderIP = _cl.duplicatedInternalSocketConfig.localIPAddress, .senderPort = _cl.duplicatedInternalSocketConfig.localPort}
@@ -63,6 +72,25 @@ Public Class Client
6372
_cl.sendMessage(ap)
6473
End Sub
6574

75+
Public Overridable Sub sendAdvertisement()
76+
If _type = AddressableType.Block Or _passmode = voip.MessagePassMode.Disable Or _passmode = voip.MessagePassMode.Receive Then Exit Sub
77+
Dim ap As AdvPacket = Nothing
78+
If _type = AddressableType.TCP Then
79+
If _targver = IPVersion.IPv6 Then
80+
ap = New AdvPacket() With {.advName = settings.myName, .advIP = settings.external_Address_IPv6, .advPort = settings.external_TCP_Port_IPv6, .receiverIP = _cl.duplicatedInternalSocketConfig.remoteIPAddress, .receiverPort = _cl.duplicatedInternalSocketConfig.remotePort, .senderIP = _cl.duplicatedInternalSocketConfig.localIPAddress, .senderPort = _cl.duplicatedInternalSocketConfig.localPort}
81+
Else
82+
ap = New AdvPacket() With {.advName = settings.myName, .advIP = settings.external_Address_IPv4, .advPort = settings.external_TCP_Port_IPv4, .receiverIP = _cl.duplicatedInternalSocketConfig.remoteIPAddress, .receiverPort = _cl.duplicatedInternalSocketConfig.remotePort, .senderIP = _cl.duplicatedInternalSocketConfig.localIPAddress, .senderPort = _cl.duplicatedInternalSocketConfig.localPort}
83+
End If
84+
ElseIf _type = AddressableType.UDP Then
85+
If _targver = IPVersion.IPv6 Then
86+
ap = New AdvPacket() With {.advName = settings.myName, .advIP = settings.external_Address_IPv6, .advPort = settings.external_UDP_Port_IPv6, .receiverIP = _targaddress, .receiverPort = _targport, .senderIP = _myaddress, .senderPort = _myport}
87+
Else
88+
ap = New AdvPacket() With {.advName = settings.myName, .advIP = settings.external_Address_IPv4, .advPort = settings.external_UDP_Port_IPv4, .receiverIP = _targaddress, .receiverPort = _targport, .senderIP = _myaddress, .senderPort = _myport}
89+
End If
90+
End If
91+
_cl.sendMessage(ap)
92+
End Sub
93+
6694
Public Overridable ReadOnly Property connected As Boolean
6795
Get
6896
If _cl Is Nothing Then Return False
@@ -164,14 +192,8 @@ Public Class Client
164192
Return tstchk.Item2 > _lts
165193
End Function
166194

167-
Public Overrides Sub updateLVI(u As Boolean)
168-
If (Not _lvi Is Nothing) AndAlso (Not _lvi.ListView Is Nothing) AndAlso _lvi.ListView.InvokeRequired Then
169-
_lvi.ListView.Invoke(Sub() Me.updateLVI(u))
170-
Else
171-
MyBase.updateLVI(False)
172-
If _lvi.SubItems.Count < 5 Then _lvi.SubItems.Add(Me.connected) Else _lvi.SubItems(4).Text = Me.connected
173-
'If Not (_lvi.ListView Is Nothing) And u Then Update List View Somehow (Via Flag)
174-
'Uneeded as the list view automatically updates
175-
End If
195+
Protected Overrides Sub updateLVIActual(u As Boolean)
196+
MyBase.updateLVIActual(False)
197+
If _lvi.SubItems.Count < 5 Then _lvi.SubItems.Add(Me.connected) Else _lvi.SubItems(4).Text = Me.connected
176198
End Sub
177199
End Class

C-ALM-VOIP/C-ALM-VOIP/C-ALM-VOIP.vbproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@
9797
<SubType>Form</SubType>
9898
</Compile>
9999
<Compile Include="AddrBook\AddressableBase.vb" />
100-
<Compile Include="VOIPSys\AudioPacket.vb" />
100+
<Compile Include="VOIPSys\Packets\AdvPacket.vb" />
101+
<Compile Include="VOIPSys\Packets\AudioPacket.vb" />
101102
<Compile Include="AddrBook\Client.vb" />
102103
<Compile Include="Views\Configure.Designer.vb">
103104
<DependentUpon>Configure.vb</DependentUpon>
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
Imports captainalm.CALMNetMarshal
2+
Imports captainalm.Serialize
3+
Imports System.Xml.Serialization
4+
5+
<Serializable>
6+
Public Structure AdvPacket
7+
Implements IPacket
8+
9+
Private senderIP_ As String
10+
Private senderPort_ As Integer
11+
Private receiverIP_ As String
12+
Private receiverPort_ As Integer
13+
<XmlIgnore>
14+
Public advName As String
15+
Public Property advNameSafe As String
16+
Get
17+
If advName Is Nothing Then Return ""
18+
Return advName
19+
End Get
20+
Set(value As String)
21+
advName = value
22+
End Set
23+
End Property
24+
<XmlIgnore>
25+
Public advIP As String
26+
Public Property advIPSafe As String
27+
Get
28+
If advIP Is Nothing Then Return ""
29+
Return advIP
30+
End Get
31+
Set(value As String)
32+
advIP = value
33+
End Set
34+
End Property
35+
Public advPort As Integer
36+
<NonSerialized, XmlIgnore>
37+
Public serializer As ISerialize
38+
<XmlIgnore>
39+
Public Property data As Object Implements IPacket.data
40+
Get
41+
Return New Tuple(Of String, String, Integer)(advName, advIP, advPort)
42+
End Get
43+
Set(value As Object)
44+
Dim val As Tuple(Of String, String, Integer) = value
45+
advName = val.Item1
46+
advIP = val.Item2
47+
advPort = val.Item3
48+
End Set
49+
End Property
50+
51+
Public ReadOnly Property dataType As Type Implements IPacket.dataType
52+
Get
53+
Return GetType(Tuple(Of String, String, Integer))
54+
End Get
55+
End Property
56+
57+
Public ReadOnly Property getData As Byte() Implements IPacket.getData
58+
Get
59+
If serializer Is Nothing Then serializer = settings.gserializer
60+
Return serializer.serializeObject(Of AdvPacket)(Me)
61+
End Get
62+
End Property
63+
64+
Public WriteOnly Property setData As Byte() Implements IPacket.setData
65+
Set(value As Byte())
66+
If serializer Is Nothing Then serializer = settings.gserializer
67+
Dim msg As AdvPacket = serializer.deSerializeObject(Of AdvPacket)(value)
68+
Me.receiverIP_ = msg.receiverIP_
69+
Me.receiverPort_ = msg.receiverPort_
70+
Me.senderIP_ = msg.senderIP_
71+
Me.senderPort_ = msg.senderPort_
72+
Me.advName = msg.advName
73+
Me.advIP = msg.advIP
74+
Me.advPort = msg.advPort
75+
msg = Nothing
76+
End Set
77+
End Property
78+
79+
Public Property receiverIP As String Implements IPacket.receiverIP
80+
Get
81+
Return receiverIP_
82+
End Get
83+
Set(value As String)
84+
receiverIP_ = value
85+
End Set
86+
End Property
87+
88+
Public Property receiverPort As Integer Implements IPacket.receiverPort
89+
Get
90+
Return receiverPort_
91+
End Get
92+
Set(value As Integer)
93+
receiverPort_ = value
94+
End Set
95+
End Property
96+
97+
Public Property senderIP As String Implements IPacket.senderIP
98+
Get
99+
Return senderIP_
100+
End Get
101+
Set(value As String)
102+
senderIP_ = value
103+
End Set
104+
End Property
105+
106+
Public Property senderPort As Integer Implements IPacket.senderPort
107+
Get
108+
Return senderPort_
109+
End Get
110+
Set(value As Integer)
111+
senderPort_ = value
112+
End Set
113+
End Property
114+
End Structure

C-ALM-VOIP/C-ALM-VOIP/VOIPSys/Streamer.vb

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Public Class Streamer
1212
Protected _name As String = ""
1313
Protected _up As Boolean = False
1414
Protected _lvi As ListViewItem = Nothing
15+
Protected slocklvi As New Object()
1516
Public Event dataExgest(data As Byte())
1617
Public Event dataExgestWithVolume(data As Single())
1718

@@ -105,25 +106,33 @@ Public Class Streamer
105106
End Property
106107

107108
Public Overridable Sub updateLVI(u As Boolean) Implements IListViewable.updateItem
108-
If (Not _lvi Is Nothing) AndAlso (Not _lvi.ListView Is Nothing) AndAlso _lvi.ListView.InvokeRequired Then
109-
_lvi.ListView.Invoke(Sub() Me.updateLVI(u))
110-
Else
111-
If _lvi Is Nothing Then _lvi = New ListViewItem(_name) Else _lvi.Text = name
112-
If _lvi.SubItems.Count < 2 Then _lvi.SubItems.Add(_m) Else _lvi.SubItems(1).Text = _m
113-
If _lvi.SubItems.Count < 3 Then _lvi.SubItems.Add(Me.volume * 100) Else _lvi.SubItems(2).Text = Me.volume * 100
114-
'If Not (_lvi.ListView Is Nothing) And u Then Update List View Somehow (Via Flag)
115-
'Uneeded as the list view automatically updates
116-
End If
109+
SyncLock slocklvi
110+
If (Not _lvi Is Nothing) AndAlso (Not _lvi.ListView Is Nothing) AndAlso _lvi.ListView.InvokeRequired Then
111+
_lvi.ListView.Invoke(Sub() updateLVIActual(u))
112+
Else
113+
updateLVIActual(u)
114+
End If
115+
End SyncLock
116+
End Sub
117+
118+
Protected Overridable Sub updateLVIActual(u As Boolean)
119+
If _lvi Is Nothing Then _lvi = New ListViewItem(_name) Else _lvi.Text = name
120+
If _lvi.SubItems.Count < 2 Then _lvi.SubItems.Add(_m) Else _lvi.SubItems(1).Text = _m
121+
If _lvi.SubItems.Count < 3 Then _lvi.SubItems.Add(Me.volume * 100) Else _lvi.SubItems(2).Text = Me.volume * 100
117122
End Sub
118123

119124
Public ReadOnly Property item As ListViewItem Implements IListViewable.item
120125
Get
121-
Return _lvi
126+
SyncLock slocklvi
127+
Return _lvi
128+
End SyncLock
122129
End Get
123130
End Property
124131

125132
Public Sub cleanItem() Implements IListViewable.cleanItem
126-
_lvi = Nothing
133+
SyncLock slocklvi
134+
_lvi = Nothing
135+
End SyncLock
127136
End Sub
128137
End Class
129138

C-ALM-VOIP/C-ALM-VOIP/Views/MainProgram.vb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ Public NotInheritable Class MainProgram
118118
Threading.Thread.Sleep(125)
119119
End While
120120
saveSettings(settings)
121+
advToAllClients()
121122
End If
122123
wp.addEvent(New WorkerEvent(butrconf, New Object() {Me}, ETs.Click, e))
123124
End If
@@ -515,13 +516,14 @@ Public NotInheritable Class MainProgram
515516
Dim arr As IPAddress() = Nothing
516517
If adbIn.targetIPVersion = IPVersion.IPv6 Then arr = resolve(adbIn.targetAddress, Net.Sockets.AddressFamily.InterNetworkV6) Else arr = resolve(adbIn.targetAddress, Net.Sockets.AddressFamily.InterNetwork)
517518
For Each c As IPAddress In arr
518-
addClient(New BlockClient(adbIn, c.ToString()), Nothing)
519+
addClient(New BlockClient(adbIn, c.ToString()) With {.messagePassMode = MessagePassMode.Disable}, Nothing)
519520
Next
520521
End If
521522
End Sub
522523

523524
Private Sub addClient(clIn As Client, forceData As IPacket)
524525
If clientreg.find(New MClient(clIn.targetAddress, clIn.targetPort)).Length = 0 Then
526+
clIn.sendAdvertisement()
525527
clientreg.add(clIn)
526528
If Not forceData Is Nothing Then clIn.forceReceive(forceData)
527529
If Not clIn.stream Is Nothing Then streamreg.add(clIn.stream)
@@ -545,6 +547,12 @@ Public NotInheritable Class MainProgram
545547
End If
546548
End Sub
547549

550+
Private Sub advToAllClients()
551+
For i As Integer = clientreg.count - 1 To 0 Step -1
552+
clientreg(i).sendAdvertisement()
553+
Next
554+
End Sub
555+
548556
Private Sub clearAllClients()
549557
For i As Integer = clientreg.count - 1 To 0 Step -1
550558
removeClient(clientreg(i), True, True)
512 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)