@@ -414,6 +414,11 @@ private ExtensionElement addSupportedFeatures(
414
414
*/
415
415
private final RoomMetadataListener roomMetadataListener = new RoomMetadataListener ();
416
416
417
+ /**
418
+ * Listens for messages from visitors component.
419
+ */
420
+ private final VisitorsMessagesListener visitorsMessagesListener = new VisitorsMessagesListener ();
421
+
417
422
/**
418
423
* The features for the current xmpp provider we will use later adding to the room presence we send.
419
424
*/
@@ -848,6 +853,18 @@ private void discoverComponentAddresses()
848
853
MessageTypeFilter .NORMAL ,
849
854
FromMatchesFilter .create (JidCreate .domainBareFrom (roomMetadataIdentity .getName ()))));
850
855
}
856
+
857
+ DiscoverInfo .Identity visitorsIdentity = info .getIdentities ().stream ().
858
+ filter (di -> di .getCategory ().equals ("component" ) && di .getType ().equals ("visitors" ))
859
+ .findFirst ().orElse (null );
860
+
861
+ if (visitorsIdentity != null && !this .isTranscriber )
862
+ {
863
+ getConnection ().addAsyncStanzaListener (visitorsMessagesListener ,
864
+ new AndFilter (
865
+ MessageTypeFilter .CHAT ,
866
+ FromMatchesFilter .create (JidCreate .domainBareFrom (visitorsIdentity .getName ()))));
867
+ }
851
868
}
852
869
catch (Exception e )
853
870
{
@@ -1274,6 +1291,7 @@ private void leaveConferenceRoom()
1274
1291
{
1275
1292
connection .removeAsyncStanzaListener (roomConfigurationListener );
1276
1293
connection .removeAsyncStanzaListener (roomMetadataListener );
1294
+ connection .removeAsyncStanzaListener (visitorsMessagesListener );
1277
1295
}
1278
1296
1279
1297
// remove listener needs to be after leave,
@@ -2243,6 +2261,44 @@ private void processRoomMetadataJson(String json)
2243
2261
}
2244
2262
}
2245
2263
2264
+ /**
2265
+ * Process received demote request. Leaves the current room and keeps the connection
2266
+ * as we will send the invite to jicofo with the request to be visitor.
2267
+ * After the response the visitor's logic will kick in with disconnecting and connecting to the visitor's node.
2268
+ * @param json The received json.
2269
+ */
2270
+ private void processVisitorsJson (String json )
2271
+ {
2272
+ try
2273
+ {
2274
+ Object o = new JSONParser ().parse (json );
2275
+
2276
+ if (o instanceof JSONObject )
2277
+ {
2278
+ JSONObject data = (JSONObject ) o ;
2279
+
2280
+ if (data .get ("type" ).equals ("visitors" )
2281
+ && data .get ("action" ).equals ("demote-request" )
2282
+ && data .get ("id" ).equals (this .mucRoom .getUserNickname ()))
2283
+ {
2284
+ logger .info (callContext + " Received demote request to become visitor from: "
2285
+ + data .get ("actor" ));
2286
+
2287
+ this .leaveConferenceRoom ();
2288
+
2289
+ this .callContext .setRequestVisitor (true );
2290
+
2291
+ logger .info (callContext + " Will join requesting to be visitor." );
2292
+ this .joinConferenceRoom ();
2293
+ }
2294
+ }
2295
+ }
2296
+ catch (Exception e )
2297
+ {
2298
+ logger .error (callContext + " Error parsing" , e );
2299
+ }
2300
+ }
2301
+
2246
2302
/**
2247
2303
* Threads handles the timeout for stopping the conference.
2248
2304
* For waiting for conference call invite sent by the focus or for waiting
@@ -2626,4 +2682,23 @@ private void dropCall()
2626
2682
stop ();
2627
2683
}
2628
2684
}
2629
- }
2685
+
2686
+ /**
2687
+ * Listening for visitor's messages.
2688
+ */
2689
+ private class VisitorsMessagesListener
2690
+ implements StanzaListener
2691
+ {
2692
+ @ Override
2693
+ public void processStanza (Stanza stanza )
2694
+ {
2695
+ JsonMessageExtension jsonMsg = stanza .getExtension (JsonMessageExtension .class );
2696
+
2697
+ if (jsonMsg == null )
2698
+ {
2699
+ return ;
2700
+ }
2701
+
2702
+ processVisitorsJson (jsonMsg .getJson ());
2703
+ }
2704
+ }}
0 commit comments