@@ -12,78 +12,89 @@ protocol ServerIPProvider: AnyObject {
1212 var serverIP : String ? { get }
1313}
1414
15- protocol UDPCommunicationDelegate : AnyObject {
16- var discoveryServerString : String { get }
17- func deviceDidReceiveBroadcastMessage( _ text: String , from sender: String )
15+ protocol GrantRoleDelegate : AnyObject {
16+ func deviceAsksServerPermissions( _ device: NetworkDevice )
1817}
1918
20- protocol ServerTCPCommunicationDelegate : UDPCommunicationDelegate {
21- func serverWantsToSendTCPText( _ text: String ) -> MessageType
22- func serverDidReceiveClientTCPText( _ text: String , senderIP: String ) -> MessageType
23-
24- func serverDidSendText( _ text: String )
25- func serverDidSendClientText( _ text: String , clientIP: String )
26- func serverDidSendInformationText( _ text: String )
19+ enum DeviceType {
20+ case broadcastDevice( BroadcastDevice )
21+ case client( Client )
22+ case server( Server )
2723}
2824
29- protocol ClientTCPCommunicationDelegate : UDPCommunicationDelegate {
30- func clientDidReceiveTCPText( _ text: String )
31- func clientDidSendText( _ text: String )
32- }
25+ final class Manager : ServerIPProvider {
26+ // The instance of the current device
27+ private var currentDevice : DeviceType
28+
29+ private var currentDeviceIP : String {
30+ switch currentDevice {
31+ case . client( let client) :
32+ return client. ip
33+ case . server( let server) :
34+ return server. ip
35+ case . broadcastDevice( let broadcastDevice) :
36+ return broadcastDevice. ip
37+ }
38+ }
3339
40+ private var broadcastDevice : BroadcastDevice ? {
41+ guard case . broadcastDevice( let device) = currentDevice else {
42+ return nil
43+ }
44+ return device
45+ }
3446
35- protocol GrantRoleDelegate : AnyObject {
36- func deviceAsksServerPermissions( _ device: Device )
37- }
47+ private var client : Client ? {
48+ guard case . client( let client) = currentDevice else {
49+ return nil
50+ }
51+ return client
52+ }
3853
39- final class Manager : ServerIPProvider {
54+ private var server : Server ? {
55+ guard case . server( let server) = currentDevice else {
56+ return nil
57+ }
58+ return server
59+ }
4060
41- // The instance of the current device
42- private var currentDevice : BroadcastDevice
43- // If the current device is also the server, then this var wont be nil
44- private var server : Server ?
45- // The serverIP as it's ServerIPProvider
4661 var serverIP : String ?
4762
48- private let messageFactory : MessageFactory
63+ var isServer : Bool {
64+ return server != nil
65+ }
4966
50- init ( currentDevice: BroadcastDevice ) {
51- self . currentDevice = currentDevice
52- self . messageFactory = MessageFactory ( device: currentDevice)
67+ var isThereServer : Bool {
68+ return serverIP != nil
5369 }
5470
5571 var presenter : MessagePresenter ?
5672
57- var isServer : Bool {
58- return currentDevice. ip == serverIP
73+ private let messageFactory : MessageFactory
74+
75+ init ( broadcastDevice: BroadcastDevice ) {
76+ self . currentDevice = . broadcastDevice( broadcastDevice)
77+ self . messageFactory = MessageFactory ( device: broadcastDevice)
5978 }
6079
61- var isThereServer : Bool {
62- return serverIP != nil
80+ func allowBroadcastDeviceTransmissionReceptionUDPMessages( ) {
81+ // Open a socket, create a queue for handling the oncoming events, enable transmission of broadcast messages and find a server
82+ broadcastDevice? . enableReceptionAndTransmissionUDPMessages ( )
83+ // Find a server
84+ broadcastDevice? . findServer ( )
6385 }
6486
6587 func send( _ message: String ) {
66- if
67- !isServer,
68- let client = currentDevice as? Client
69- {
88+ switch currentDevice {
89+ case . client( let client) :
7090 client. sendToServerTCP ( message)
71- } else if
72- let server = server,
73- isServer
74- {
91+ case . server( let server) :
7592 server. sendServerText ( message)
93+ case . broadcastDevice( _) :
94+ break
7695 }
7796 }
7897
79- func allowClientToUDPCommunication( ) {
80- // Open a socket, create a queue for handling the oncoming events, enable transmission of broadcast messages and find a server
81- currentDevice. bindForUDPMessages ( )
82- currentDevice. createBroadcastKqueue ( )
83- currentDevice. enableTransmissionToBroadcast ( )
84- currentDevice. findServer ( )
85- }
86-
8798 private func presentMessage( chatMessage: ChatMessage ) {
8899 DispatchQueue . main. async { [ weak self] in
89100 guard let _self = self else { return }
@@ -103,7 +114,7 @@ extension Manager: UDPCommunicationDelegate {
103114 // Generate Message
104115 let message = messageFactory. receivedUDPMessage ( text, from: sender)
105116 // Since it's broadcast, you can receive your message back then skip it
106- guard message. senderIP != currentDevice . ip else { return }
117+ guard message. senderIP != currentDeviceIP else { return }
107118
108119 if isServer {
109120 serverHasReceivedBroadcastMessage ( message)
@@ -119,7 +130,7 @@ extension Manager: UDPCommunicationDelegate {
119130 case messageFactory. discoveryMessage:
120131 // The server will reply sending back its IP
121132 let serverResponse = messageFactory. serverBroadcastAuthenticationResponse
122- currentDevice . sendBroadcastMessage ( serverResponse)
133+ server ? . sendBroadcastMessage ( serverResponse)
123134 print ( " New client " + message. senderIP)
124135 default :
125136 assertionFailure ( " Server has received an unknown message \( message. text) " )
@@ -141,12 +152,18 @@ extension Manager: UDPCommunicationDelegate {
141152 let serverIP = message. senderIP
142153 self . serverIP = serverIP
143154 print ( " Found out a server @ " + message. senderIP)
155+ broadcastDevice? . clearKqueueEvents ( )
156+
157+ let client = Client (
158+ ip: currentDeviceIP,
159+ serverIP: serverIP
160+ )
161+
162+ currentDevice = . client( client)
144163
145164 // Unbind from the UDP port and connect to the server via TCP
146- if let client = currentDevice as? Client {
147- client. clearReceptionBroadcastKQueue ( )
148- client. startTCPconnectionToServer ( serverIP: serverIP)
149- }
165+ client. clientTCPCommunicationDelegate = self
166+ client. startTCPconnectionToServer ( )
150167 default :
151168 assertionFailure ( " Client has received an unknown message \( message. text) " )
152169 break
@@ -200,37 +217,32 @@ extension Manager: ClientTCPCommunicationDelegate {
200217}
201218
202219extension Manager : GrantRoleDelegate {
203- func deviceAsksServerPermissions( _ device: Device ) {
220+ func deviceAsksServerPermissions( _ device: NetworkDevice ) {
204221 // When a client claims to become the server, check if there is already a device which is the current server
205- guard !isThereServer else {
206- ( currentDevice as? Client ) ? . clientTCPCommunicationDelegate = self
222+ guard
223+ !isThereServer,
224+ let device = broadcastDevice
225+ else {
207226 return
208227 }
209228
210- // The current device is about to become server.
211- // Clear the queue of events
212- currentDevice. clearReceptionBroadcastKQueue ( )
213229 // Set up your IP as serverIP
214230 serverIP = device. ip
215231
216232 print ( Constant . Message. presentMeAsServer)
217233
218234 // Create an instance of the Server class
219- let server = Server ( ip: currentDevice . ip,
220- broadcastIP: currentDevice . broadcastIP,
221- udp_broadcast_message_socket: currentDevice . udp_broadcast_message_socket,
222- udp_reception_message_socket: currentDevice . udp_reception_message_socket
235+ let server = Server ( ip: device . ip,
236+ broadcastIP: device . broadcastIP,
237+ udp_broadcast_message_socket: device . udp_broadcast_message_socket,
238+ udp_reception_message_socket: device . udp_reception_message_socket
223239 )
224240
225- self . server = server
241+ currentDevice = . server( server )
226242 server. serverTCPCommunicationDelegate = self
227- server. udpCommunicationDelegate = currentDevice. udpCommunicationDelegate
228- currentDevice = server
243+ server. udpCommunicationDelegate = device. udpCommunicationDelegate
229244
230- // Reenable the reception and transmission of the broadcast messages
231- server. createBroadcastKqueue ( )
232- server. enableTransmissionToBroadcast ( )
233245 // Create a TCP socket to accept clients requests
234- server. createTCPSocket ( )
246+ server. enableTCPCommunication ( )
235247 }
236248}
0 commit comments