@@ -42,6 +42,7 @@ class ManagedClient
4242 const int TypeDestroyClient = 107 ;
4343 const int TypeClientDestroyed = 108 ;
4444 const int TypeCheckPresence = 109 ;
45+ const int TypeClientStateChanged = 110 ;
4546
4647 const int ResultClientCreated = 201 ;
4748 const int ResultSuccess = 202 ;
@@ -258,9 +259,18 @@ private static void ClientRun(object o)
258259 var id = ( int ) o ;
259260 var managedClient = _clients [ id ] ;
260261
262+ // keep track of client state so we can notify application of state changes
263+ var prevState = managedClient . client . State ;
264+
261265 while ( managedClient . shouldRun )
262266 {
263267 managedClient . client . Update ( managedClient . time ) ;
268+
269+ if ( managedClient . client . State != prevState )
270+ {
271+ prevState = managedClient . client . State ;
272+ PostStateChange ( id ) ;
273+ }
264274
265275 if ( managedClient . client . State == ClientState . Connected )
266276 {
@@ -302,5 +312,75 @@ private static void ClientRun(object o)
302312
303313 managedClient . client . Dispose ( ) ;
304314 }
315+
316+ private static void PostStateChange ( int id )
317+ {
318+ string state ;
319+ switch ( _clients [ id ] . client . State )
320+ {
321+ case ClientState . Connected :
322+ {
323+ state = "connected" ;
324+ break ;
325+ }
326+ case ClientState . ConnectionDenied :
327+ {
328+ state = "connectionDenied" ;
329+ break ;
330+ }
331+ case ClientState . ConnectionRequestTimeout :
332+ {
333+ state = "connectionRequestTimeout" ;
334+ break ;
335+ }
336+ case ClientState . ConnectionResponseTimeout :
337+ {
338+ state = "connectionResponseTimeout" ;
339+ break ;
340+ }
341+ case ClientState . ConnectionTimedOut :
342+ {
343+ state = "connectionTimedOut" ;
344+ break ;
345+ }
346+ case ClientState . ConnectTokenExpired :
347+ {
348+ state = "connectTokenExpired" ;
349+ break ;
350+ }
351+ case ClientState . Disconnected :
352+ {
353+ state = "disconnected" ;
354+ break ;
355+ }
356+ case ClientState . InvalidConnectToken :
357+ {
358+ state = "invalidConnectToken" ;
359+ break ;
360+ }
361+ case ClientState . SendingConnectionRequest :
362+ {
363+ state = "sendingConnectionRequest" ;
364+ break ;
365+ }
366+ case ClientState . SendingConnectionResponse :
367+ {
368+ state = "sendingConnectionResponse" ;
369+ break ;
370+ }
371+ default :
372+ {
373+ state = "unknown" ;
374+ break ;
375+ }
376+ }
377+
378+ WriteMessage ( new JArray
379+ {
380+ JValue . FromObject ( TypeClientStateChanged ) ,
381+ JValue . FromObject ( id ) ,
382+ JValue . FromObject ( state ) ,
383+ } ) ;
384+ }
305385 }
306386}
0 commit comments