]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_conference] Add flag to destroy the conference only when all mandatory members...
authorDavid Villasmil <david.villasmil.work@gmail.com>
Wed, 28 Jun 2023 16:39:22 +0000 (18:39 +0200)
committerGitHub <noreply@github.com>
Wed, 28 Jun 2023 16:39:22 +0000 (19:39 +0300)
* feature/mod_conference_mandatory_member_flag: Add flag to destroy the conference only when all mandatory members disconnect. And set endconf to end the conference when any member with the flag disconnects

src/mod/applications/mod_conference/conference_cdr.c
src/mod/applications/mod_conference/conference_member.c
src/mod/applications/mod_conference/conference_utils.c
src/mod/applications/mod_conference/mod_conference.c
src/mod/applications/mod_conference/mod_conference.h

index b6eb630540e3e39d7f4982bdcf67aa7d1411d079..f7ed7ddf27eb90aebf27a27aaa1c710062ef4e70 100644 (file)
@@ -662,6 +662,9 @@ void conference_cdr_render(conference_obj_t *conference)
                        x_tag = switch_xml_add_child_d(x_flags, "end_conference", flag_off++);
                        switch_xml_set_txt_d(x_tag, conference_cdr_test_mflag(np, MFLAG_ENDCONF) ? "true" : "false");
 
+                       x_tag = switch_xml_add_child_d(x_flags, "mandatory_member_end_conference", flag_off++);
+                       switch_xml_set_txt_d(x_tag, conference_cdr_test_mflag(np, MFLAG_MANDATORY_MEMBER_ENDCONF) ? "true" : "false");
+
                        x_tag = switch_xml_add_child_d(x_flags, "was_kicked", flag_off++);
                        switch_xml_set_txt_d(x_tag, conference_cdr_test_mflag(np, MFLAG_KICKED) ? "true" : "false");
 
index 6112a2890c89fdc0b1df33a1b886f7ca43dc27aa..c258e59783637d6500d17fc761f24ccd5e77c686 100644 (file)
@@ -766,7 +766,12 @@ switch_status_t conference_member_add(conference_obj_t *conference, conference_m
                        conference->count++;
                }
 
+
                if (conference_utils_member_test_flag(member, MFLAG_ENDCONF)) {
+                       conference->endconference_time = 0;
+               }
+
+               if (conference_utils_member_test_flag(member, MFLAG_MANDATORY_MEMBER_ENDCONF)) {
                        if (conference->end_count++) {
                                conference->endconference_time = 0;
                        }
@@ -1314,9 +1319,14 @@ switch_status_t conference_member_del(conference_obj_t *conference, conference_m
 
                conference_video_check_flush(member, SWITCH_FALSE);
 
+               /* End conference when any member with "endconf" flag disconnects */
                if (conference_utils_member_test_flag(member, MFLAG_ENDCONF)) {
+                       conference_utils_set_flag_locked(conference, CFLAG_DESTRUCT);
+               }
+
+               /* End conference only if all mandatory members have disconnected */
+               if (conference_utils_member_test_flag(member, MFLAG_MANDATORY_MEMBER_ENDCONF)) {
                        if (!--conference->end_count) {
-                               //conference_utils_set_flag_locked(conference, CFLAG_DESTRUCT);
                                conference->endconference_time = switch_epoch_time_now(NULL);
                        }
                }
index c8dd0fd4e9c96fa2decf7b5518f35d6e84d60a8c..a441594ddcb0e5aa4118bc1a954b6ebdbc523c71 100644 (file)
@@ -132,6 +132,8 @@ void conference_utils_set_mflags(const char *flags, member_flag_t *f)
                                f[MFLAG_NOMOH] = 1;
                        } else if (!strcasecmp(argv[i], "endconf")) {
                                f[MFLAG_ENDCONF] = 1;
+                       } else if (!strcasecmp(argv[i], "mandatory_member_endconf")) {
+                               f[MFLAG_MANDATORY_MEMBER_ENDCONF] = 1;
                        } else if (!strcasecmp(argv[i], "mintwo")) {
                                f[MFLAG_MINTWO] = 1;
                        } else if (!strcasecmp(argv[i], "talk-data-events")) {
index 619cd8c4a618933cd03137847fad7821ea7446ce..bf03d2a5bcd6d0bed33dbcb296c5d8556ec4005a 100644 (file)
@@ -1347,6 +1347,9 @@ void conference_xlist(conference_obj_t *conference, switch_xml_t x_conference, i
                x_tag = switch_xml_add_child_d(x_flags, "end_conference", count++);
                switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_ENDCONF) ? "true" : "false");
 
+               x_tag = switch_xml_add_child_d(x_flags, "mandatory_member_end_conference", count++);
+               switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_MANDATORY_MEMBER_ENDCONF) ? "true" : "false");
+
                x_tag = switch_xml_add_child_d(x_flags, "is_ghost", count++);
                switch_xml_set_txt_d(x_tag, conference_utils_member_test_flag(member, MFLAG_GHOST) ? "true" : "false");
 
@@ -1456,6 +1459,7 @@ void conference_jlist(conference_obj_t *conference, cJSON *json_conferences)
                ADDBOOL(json_conference_member_flags, "has_floor", member->id == member->conference->floor_holder);
                ADDBOOL(json_conference_member_flags, "is_moderator", conference_utils_member_test_flag(member, MFLAG_MOD));
                ADDBOOL(json_conference_member_flags, "end_conference", conference_utils_member_test_flag(member, MFLAG_ENDCONF));
+               ADDBOOL(json_conference_member_flags, "mandatory_member_end_conference", conference_utils_member_test_flag(member, MFLAG_MANDATORY_MEMBER_ENDCONF));
                ADDBOOL(json_conference_member_flags, "pass_digits", conference_utils_member_test_flag(member, MFLAG_DIST_DTMF));
        }
        switch_mutex_unlock(conference->member_mutex);
index 3c28634264873eaa07cbbc8a45990db6f5b603bc..21baaadc824fdedcf85773b9d170973484d1199d 100644 (file)
@@ -178,6 +178,7 @@ typedef enum {
        MFLAG_NO_MINIMIZE_ENCODING,
        MFLAG_FLUSH_BUFFER,
        MFLAG_ENDCONF,
+       MFLAG_MANDATORY_MEMBER_ENDCONF,
        MFLAG_HAS_AUDIO,
        MFLAG_TALKING,
        MFLAG_RESTART,