[svn-commits] russell: branch group/xcon_bfcp r58097 - in
/team/group/xcon_bfcp: ./ apps/ a...
svn-commits at lists.digium.com
svn-commits at lists.digium.com
Tue Mar 6 14:36:55 MST 2007
Author: russell
Date: Tue Mar 6 15:36:54 2007
New Revision: 58097
URL: http://svn.digium.com/view/asterisk?view=rev&rev=58097
Log:
Merge the latest patch from issue 7838
Added:
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_threads.h (with props)
team/group/xcon_bfcp/build_tools/make_linker_eo_script
- copied unchanged from r58025, trunk/build_tools/make_linker_eo_script
Modified:
team/group/xcon_bfcp/apps/app_meetme.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_base64.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_floor_list.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_floor_list.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_gw.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_gw.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_link_list.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_link_list.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_messages.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_messages.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_messages_build.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_messages_parse.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_sdp.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_sdp.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_server.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_server.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_strings.h
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_user_list.c
team/group/xcon_bfcp/apps/xcon_bfcp/bfcp_user_list.h
team/group/xcon_bfcp/apps/xcon_bfcp/xcon_blueprints.h
team/group/xcon_bfcp/apps/xcon_bfcp/xcon_scheduler.c
team/group/xcon_bfcp/apps/xcon_bfcp/xcon_scheduler.h
team/group/xcon_bfcp/build_tools/make_version
team/group/xcon_bfcp/build_tools/make_version_h
team/group/xcon_bfcp/channels/bfcp_sdp/bfcp_sdp.c
team/group/xcon_bfcp/channels/bfcp_sdp/bfcp_sdp.h
team/group/xcon_bfcp/channels/chan_jingle.c
team/group/xcon_bfcp/channels/chan_sip.c
team/group/xcon_bfcp/configs/xcon.conf.sample
team/group/xcon_bfcp/configure
team/group/xcon_bfcp/pbx/ (props changed)
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-test2
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-test3
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-test4
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-test6
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-test7
team/group/xcon_bfcp/pbx/ael/ael-test/ref.ael-vtest13
team/group/xcon_bfcp/pbx/ael/ael.tab.c
team/group/xcon_bfcp/pbx/pbx_ael.c
team/group/xcon_bfcp/pbx/pbx_config.c
team/group/xcon_bfcp/pbx/pbx_dundi.c
Modified: team/group/xcon_bfcp/apps/app_meetme.c
URL: http://svn.digium.com/view/asterisk/team/group/xcon_bfcp/apps/app_meetme.c?view=diff&rev=58097&r1=58096&r2=58097
==============================================================================
--- team/group/xcon_bfcp/apps/app_meetme.c (original)
+++ team/group/xcon_bfcp/apps/app_meetme.c Tue Mar 6 15:36:54 2007
@@ -38,8 +38,8 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
-
-#include "asterisk/zapata.h"
+#include <sys/ioctl.h>
+#include <zaptel/zaptel.h>
#include "asterisk/lock.h"
#include "asterisk/file.h"
@@ -63,7 +63,7 @@
#include "asterisk/dial.h"
#include "asterisk/term.h" /* Needed for some "coloured" console notifications */
-#include "asterisk/rtp.h" /* Needed for the cascaded conferences trunking and for the external VideoMixer */
+#include "asterisk/rtp.h" /* Needed for the cascaded conferences trunking and for the external VideoMixer (not used yet) */
/*! The Floor Control Server Gateway, to handle all that's related to BFCP:
1. centralized floor control for XCON Conferences;
@@ -78,12 +78,15 @@
#include "enter.h"
#include "leave.h"
-#define DEFAULT_XCON_PREFIX 867 /*!< Prefix wildcard for XCON conferences */
-#define DEFAULT_SCHEDULER_PORT 2346 /*!< Default XconScheduler listening port */
-#define DEFAULT_BFCP_PORT 2345 /*!< Default BFCP Server listening port */
-#define DEFAULT_GW_BFCP_PORT 2354 /*!< Default Gatewayed BFCP Server listening port (if used) */
-#define DEFAULT_GW_BFCP_DISPATCHER 3000 /*!< Default DCON Dispatcher listening port (if used) */
-#define DEFAULT_BFCP_MAXCONF 10 /*!< Default BFCP Server max number of allowed concurrent conferences */
+#define DEFAULT_XCON_PREFIX 867 /*!< Prefix wildcard for XCON conferences */
+#define DEFAULT_SCHEDULER_PORT 2346 /*!< Default XconScheduler listening port */
+#define DEFAULT_BFCP_TRANSPORT BFCP_OVER_TLS /*!< Default transport for BFCP (it can be BFCP_OVER_TCP as well) */
+#define DEFAULT_BFCP_PORT 2345 /*!< Default BFCP Server listening port */
+#define DEFAULT_GW_BFCP_PORT 2354 /*!< Default Gatewayed BFCP Server listening port (if used) */
+#define DEFAULT_GW_BFCP_DISPATCHER 3000 /*!< Default DCON Dispatcher listening port (if used) */
+#define DEFAULT_BFCP_MAXCONF 10 /*!< Default BFCP Server max number of allowed concurrent conferences */
+#define MAX_QUEUED_VIDEO_FRAMES 100 /*!< Max number of video fraes to enqueue for each user (then drop them) */
+
#define SLA_CONFIG_FILE "sla.conf"
/*! Static variable to store the prefix wildcard for XCON conferences as read from the configuration file */
@@ -91,6 +94,7 @@
/*! Static variable that tells us if we have to be DCON-compliant or not */
static int dcon_enabled;
+static unsigned short int dcon_stub_userID = 1;
/*! The address we bind the local Mixers' RTPs to */
static struct sockaddr_in bindaddr = { 0, };
@@ -192,7 +196,7 @@
enum {
OPT_ARG_WAITMARKED = 0,
OPT_ARG_ARRAY_SIZE = 1,
-};
+} meetme_option_args;
AST_APP_OPTIONS(meetme_opts, BEGIN_OPTIONS
AST_APP_OPTION('A', CONFFLAG_MARKEDUSER ),
@@ -203,8 +207,8 @@
AST_APP_OPTION('D', CONFFLAG_DYNAMICPIN ),
AST_APP_OPTION('d', CONFFLAG_DYNAMIC ),
AST_APP_OPTION('E', CONFFLAG_EMPTYNOPIN ),
+ AST_APP_OPTION('F', CONFFLAG_PASS_DTMF ),
AST_APP_OPTION('e', CONFFLAG_EMPTY ),
- AST_APP_OPTION('F', CONFFLAG_PASS_DTMF ),
AST_APP_OPTION('i', CONFFLAG_INTROUSER ),
AST_APP_OPTION('I', CONFFLAG_INTROUSERNOREVIEW ),
AST_APP_OPTION('M', CONFFLAG_MOH ),
@@ -288,7 +292,8 @@
" digit extension ${MEETME_EXIT_CONTEXT} or the current context\n"
" if that variable is not defined.\n"
" '1' -- do not play message when first person enters\n"
-" 'B' -- trigger XCON Conference mode, enabling BFCP for moderation.\n";
+" 'B' -- trigger XCON Conference mode, enabling BFCP for moderation.\n"
+" 'G' -- trigger DCON Conference mode (stub conference), enabling XCON distribution.\n";
static const char *descrip2 =
" MeetMeCount(confno[|var]): Plays back the number of users in the specified\n"
@@ -365,6 +370,8 @@
struct ast_frame *origframe;
struct ast_trans_pvt *transpath[32];
+ int video_switch; /*! Number of the user who is allowed to send her/his video (MeetMe only) */
+
int xcondcontype; /*!< XCON Local/Remote Conference */
unsigned long int xconconferenceID; /*!< XCON specific Conference ID */
char *subject; /*!< XCON specific Conference Subject (Topic) */
@@ -372,8 +379,6 @@
unsigned short int xconpassword; /*!< XCON Conference Administrator's numeric password */
unsigned short int audiofloorID; /*!< BFCP Floor ID for Audio, if enabled */
unsigned short int videofloorID; /*!< BFCP Floor ID for Video, if enabled */
-
- struct xcon_videomixer_leg *videomixer;
AST_LIST_HEAD_NOLOCK(, ast_conf_user) userlist;
AST_LIST_HEAD_NOLOCK(, xcon_cascaded_conference) cascadedlist;
@@ -409,7 +414,8 @@
int notify_audio_change; /*!< Flag to notify an user if he has been muted/unmuted */
int notify_video_change; /*!< Flag to notify an user if he can/can't send video */
- struct xcon_videomixer_leg *videomixer;
+ unsigned short int dcon_stub_userID; /*!< Temporary ID needed in DCON initial transactions */
+
unsigned short int queued_video_frames;
AST_LIST_HEAD_NOLOCK(, xcon_videoframe) videoframes;
ast_mutex_t videoframe_lock; /*!< Lock to update/retrieve frames */
@@ -434,41 +440,33 @@
AST_LIST_ENTRY(xcon_videoframe) list;
};
-struct xcon_videomixer_leg {
- int is_focus; /*! Is this leg related to a focus or to an user? */
- struct ast_conference *conf; /*!< The local Conference peer, if related to a conference */
- struct ast_conf_user *user; /*!< The local Conference peer, if related to an user */
-
- int active; /*!< A flag to check if the listener is active */
- struct ast_rtp *rtp; /*!< The Mixer's RTP channel to get the mixed video from (if focus) and send mixed video to (if user) */
- unsigned short int own_port; /*!< The Mixer's RTP channel local port */
- pthread_t listening_thread; /*!< Listening thread for incoming Mixer's RTP (only for focus) */
- pthread_attr_t listening_attr; /*!< Listening thread attribute (only for focus) */
-};
-
struct xcon_cascaded_conference {
int xcondcontype; /*!< This peer is an XCON Local/Remote Conference */
struct ast_conference *conf; /*!< The local Conference peer */
int conf_fd; /*!< Connected local channel */
int active; /*!< A flag to check if the listener is active */
- struct ast_rtp *rtp; /*!< The Mixer's RTP channel to get the mixed frames from */
- unsigned short int own_port; /*!< The Mixer's RTP channel listening port */
- char *peerIP;
- unsigned short int peer_port;
- pthread_t listening_thread; /*!< Listening thread for incoming Mixer's RTP */
+
+ char *peerIP; /*! The IP of the cascaded RTP peer */
+
+ struct ast_rtp *audio_rtp; /*!< The Audio RTP channel to get the mixed frames from */
+ unsigned short int audio_own_port; /*!< The Audio RTP channel listening port */
+ unsigned short int audioPeerPort;
+
+ struct ast_rtp *video_rtp; /*!< The Video RTP channel to get the mixed frames from */
+ unsigned short int video_own_port; /*!< The Video RTP channel listening port */
+ unsigned short int videoPeerPort;
+
+ pthread_t listening_thread; /*!< Listening thread for incoming Mixers' RTP */
pthread_attr_t listening_attr; /*!< Listening thread attribute */
AST_LIST_ENTRY(xcon_cascaded_conference) list;
};
-
-/*! \brief Method to setup a new videomixer leg */
-int xcon_setup_new_videomixer(int is_focus, void *leg);
-static void *videomixer_listener(void *args); /*!< The VideoMixer(s) listening thread(s) */
/*! \brief Method to setup a new cascaded conference */
struct xcon_cascaded_conference *xcon_setup_new_cascaded_conference(struct ast_conference *cnf);
static void *cascaded_listener(void *args); /*!< The Cascaded audio frames listening thread(s) */
+
enum sla_trunk_state {
SLA_TRUNK_STATE_IDLE,
@@ -482,9 +480,9 @@
struct sla_station {
AST_RWLIST_ENTRY(sla_station) entry;
AST_DECLARE_STRING_FIELDS(
- AST_STRING_FIELD(name);
- AST_STRING_FIELD(device);
- AST_STRING_FIELD(autocontext);
+ AST_STRING_FIELD(name);
+ AST_STRING_FIELD(device);
+ AST_STRING_FIELD(autocontext);
);
AST_LIST_HEAD_NOLOCK(, sla_trunk_ref) trunks;
struct ast_dial *dial;
@@ -520,7 +518,9 @@
int scheduler_notifications(int type, ...);
/*! XCON Binary Floor Control Protocol (BFCP) management */
+static int xcon_debug_level; /*! Level of verbose debug about XCON/DCON (0=no debug) */
static int bfcp_exists; /*! A static variable to check whether the FCS is up or not */
+static int bfcp_transport; /*! A static variable that tells which transport will be used for BFCP */
static unsigned short int bfcp_port; /*! The port the BFCP server will listen on (TCP only, TLS not supported yet) */
static unsigned short int gw_bfcp_port; /*! The port the BFCP server will listen on, if gatewayed (TCP only, TLS not supported yet) */
static char gw_ip[15]; /*! The IP the BFCP server will listen on, if gatewayed (TCP only, TLS not supported yet) */
@@ -560,7 +560,7 @@
/*! Wrapper functions to get pointers to a conference and/or an user */
struct ast_conference *xcon_get_conference(unsigned long int conferenceID);
struct ast_conf_user *xcon_get_user(struct ast_conference *cnf, unsigned short int userID);
-struct ast_conf_user *xcon_get_user_from_info(struct ast_conference *cnf, char *uri, char *display);
+struct ast_conf_user *xcon_get_user_from_info(struct ast_conference *cnf, unsigned short int tempUserID, char *uri, char *display);
/*! Muting/Unmuting XCON wrappers */
int xcon_mute_user(struct ast_conference *cnf, struct ast_conf_user *user);
@@ -571,7 +571,7 @@
struct dcon_user *dcon_get_remote_user(struct ast_conference *cnf, unsigned short int userID);
int dcon_remove_remote_user(struct ast_conference *cnf, unsigned short int userID);
int dcon_free_remote_users(struct ast_conference *cnf);
-
+
struct sla_trunk_ref {
AST_LIST_ENTRY(sla_trunk_ref) entry;
struct sla_trunk *trunk;
@@ -611,6 +611,9 @@
.thread = AST_PTHREADT_NULL,
};
+static int audio_buffers; /*!< The number of audio buffers to be allocated on pseudo channels
+ when in a conference
+ */
/*! The number of audio buffers to be allocated on pseudo channels
* when in a conference */
static int audio_buffers;
@@ -809,6 +812,7 @@
* \param make Make the conf if it doesn't exist
* \param dynamic Mark the newly created conference as dynamic
* \param refcount How many references to mark on the conference
+ * \param xcon If this is a MeetMe(0), XCON (1) or DCON(2) conference
*
* \return A pointer to the conference struct, or NULL if it wasn't found and
* make or dynamic were not set.
@@ -910,7 +914,7 @@
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Could not create the Cascaded Conference RTP channel...\n");
}
- if (!fatal && (option_verbose > 2))
+ if (!fatal && (option_verbose > 2) && (xcon_debug_level > 2))
ast_verbose(VERBOSE_PREFIX_3 "The new remote conference (ConferenceID: %lu) has been added to the BFCP Server:\n", cnf->xconconferenceID);
} else {
/* We don't read the file for that: we use the locally registered conferences */
@@ -941,7 +945,7 @@
ast_verbose(VERBOSE_PREFIX_3 "The new local conference could not be added to the BFCP Server...\n");
break;
}
- if (option_verbose > 2)
+ if ((option_verbose > 2) && (xcon_debug_level > 2))
ast_verbose(VERBOSE_PREFIX_3 "The new local conference (ConferenceID: %lu) has been added to the BFCP Server:\n", cnf->xconconferenceID);
/* ...and finally we add the required floors to the BFCP conference */
if(conferences->audiofloorID) { /* Add a Floor for Audio */
@@ -952,28 +956,22 @@
ast_verbose(VERBOSE_PREFIX_3 "Couldn't add the new Audio Floor to the Conference...\n");
break;
}
- if (option_verbose > 2)
+ if ((option_verbose > 2) && (xcon_debug_level > 2))
ast_verbose(VERBOSE_PREFIX_3 " Floor: Audio, ID %d (%s)\n", cnf->audiofloorID, conferences->audiousers ? "limited users" : "unlimited users");
}
if(conferences->videofloorID) { /* Add a Floor for Video */
cnf->videofloorID = conferences->videofloorID;
/* Only add to the list if Audio and Video floors are different (they could be managed together in the same floor) */
-/* if(cnf->videofloorID != cnf->audiofloorID) {*/
+ if(cnf->videofloorID != cnf->audiofloorID) {
if(bfcp_gw_add_floor_server(conferences->conferenceID, VIDEO_FLOOR, conferences->videofloorID, 0, conferences->videousers) <0 ) {
fatal++;
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Couldn't add the new Video Floor to the Conference...\n");
break;
}
-/* }*/
- if (option_verbose > 2)
+ }
+ if ((option_verbose > 2) && (xcon_debug_level > 2))
ast_verbose(VERBOSE_PREFIX_3 " Floor: Video, ID %d (%s)\n", cnf->videofloorID, conferences->videousers ? "limited users" : "unlimited users");
- /* NOTE: we create an RTP channel to latterly receive mixed frames from the video mixer as well
- if(xcon_setup_new_videomixer(1, cnf) < 0) {
- fatal++;
- if (option_verbose > 2)
- ast_verbose(VERBOSE_PREFIX_3 "Could not create the VideoMixer RTP channel...\n");
- } */
}
cnf->subject = conferences->subject;
conferences->is_active = 1;
@@ -984,7 +982,7 @@
AST_LIST_UNLOCK(®xconfs);
}
/* Show the results */
- if (option_verbose > 2)
+ if ((option_verbose > 2) && (xcon_debug_level > 2))
ast_verbose(VERBOSE_PREFIX_3 " Adding conference to the BFCP Server: %s\n", fatal ? "FAILED" : "DONE");
}
if(!fatal) {
@@ -1006,7 +1004,7 @@
AST_LIST_INSERT_HEAD(&confs, cnf, list);
}
-cnfout:
+ cnfout:
if (cnf)
cnf->refcount += refcount;
@@ -1017,20 +1015,29 @@
/*! \brief CLI commands for XCON related information */
static int xcon_info(int fd, int argc, char *argv[]);
+static int xcon_debug(int fd, int argc, char *argv[]);
static int xcon_show_registered(int fd, int argc, char *argv[]);
static int xcon_show_conferences(int fd, int argc, char *argv[]);
static int xcon_show_conference(int fd, int argc, char *argv[]);
static int xcon_show_users(int fd, int argc, char *argv[]);
static int xcon_show_user(int fd, int argc, char *argv[]);
+static int xcon_show_cascaded(int fd, int argc, char *argv[]);
static int xcon_remove_conference(int fd, int argc, char *argv[]);
static int xcon_remove_user(int fd, int argc, char *argv[]);
-static int xcon_add_mixer(int fd, int argc, char *argv[]);
static int xcon_play(int fd, int argc, char *argv[]);
static char xcon_info_usage[] =
"Usage: xcon info\n"
" Shows information on the XCON Servers.\n";
+static char xcon_debug_usage[] =
+"Usage: xcon debug <level>\n"
+" Set the level of verbose debug for XCON/DCON:\n"
+" 0 - no debug (only joins/leaves)\n"
+" 1 - only DCON/XCON messages\n"
+" 2 - BFCP messages too\n"
+" 3 - full debug\n";
+
static char xcon_show_registered_usage[] =
"Usage: xcon show registered\n"
" Shows the registered conferences in the XCON Server.\n";
@@ -1051,6 +1058,10 @@
"Usage: xcon show user <conferenceID> <userID>\n"
" Shows the user number <userID> in conference <conferenceID> on the XCON Server.\n";
+static char xcon_show_cascaded_usage[] =
+"Usage: xcon show cascaded <conferenceID>\n"
+" Shows all the cascaded peers in conference <conferenceID> on the XCON Server.\n";
+
static char xcon_remove_conference_usage[] =
"Usage: xcon remove conference <ID>\n"
" Removes the conference number <ID> and all its users from the XCON Server.\n";
@@ -1059,24 +1070,22 @@
"Usage: xcon remove user <conferenceID> <userID>\n"
" Removes the user <userID> from the conference <confID> in the XCON Server.\n";
-static char xcon_add_mixer_usage[] =
-"Usage: xcon add mixer <conferenceID> <IP> <port>\n"
-" Add a Video Mixer (<IP>:<port>) to the conference <confID>.\n";
-
static char xcon_play_usage[] =
"Usage: xcon play <conferenceID>\n"
" Play an announcement in conference <confID>.\n";
+
static struct ast_cli_entry xcon_cli[] = {
{ { "xcon", "info", NULL }, xcon_info, "Shows information on the XCON Server", xcon_info_usage },
+ { { "xcon", "debug", NULL }, xcon_debug, "Set the level of verbose debug for XCON/DCON", xcon_debug_usage },
{ { "xcon", "show", "registered", NULL }, xcon_show_registered, "Shows the registered conferences in the XCON Server", xcon_show_registered_usage },
{ { "xcon", "show", "conferences", NULL }, xcon_show_conferences, "Shows the active conferences on the XCON Server", xcon_show_conferences_usage },
{ { "xcon", "show", "conference", NULL }, xcon_show_conference, "Shows info about a conference in the XCON Server", xcon_show_conference_usage },
{ { "xcon", "show", "users", NULL }, xcon_show_users, "Shows all the users in an active conferences on the XCON Server", xcon_show_users_usage },
{ { "xcon", "show", "user", NULL }, xcon_show_user, "Shows info about an user in a conference in the XCON Server", xcon_show_user_usage },
+ { { "xcon", "show", "cascaded", NULL }, xcon_show_cascaded, "Shows all the cascaded peers in an active conferences on the XCON Server", xcon_show_cascaded_usage },
{ { "xcon", "remove", "conference", NULL }, xcon_remove_conference, "Removes a conference from the XCON Server", xcon_remove_conference_usage },
{ { "xcon", "remove", "user", NULL }, xcon_remove_user, "Removes an user from a conference in the XCON Server", xcon_remove_user_usage },
- { { "xcon", "add", "mixer", NULL }, xcon_add_mixer, "Add a Video Mixer to a conference", xcon_add_mixer_usage },
{ { "xcon", "play", NULL }, xcon_play, "Play an announcement in a conference", xcon_play_usage },
};
@@ -1084,21 +1093,38 @@
static int xcon_info(int fd, int argc, char *argv[])
{
if (bfcp_exists) {
+ ast_cli(fd, "\tXCON prefix %dxxxx\n", xcon_prefix);
if(dcon_enabled) {
- ast_cli(fd," Real BFCP Server listening on port %d.\n", gw_bfcp_port);
- ast_cli(fd," Gateway/Proxy BFCP Server listening on port %d.\n", bfcp_port);
+ ast_cli(fd, "\tDCON Dispatcher listening on port %hu\n", gw_bfcp_dispatcher);
+ ast_cli(fd, "\tReal BFCP Server listening on port %hu (%s)\n", gw_bfcp_port, bfcp_transport ? "TCP/TLS/BFCP" : "TCP/BFCP");
+ ast_cli(fd, "\tGateway/Proxy BFCP Server listening on port %hu (%s)\n", bfcp_port, bfcp_transport ? "TCP/TLS/BFCP" : "TCP/BFCP");
} else
- ast_cli(fd," BFCP Server listening on port %d.\n", bfcp_port);
+ ast_cli(fd, "\tBFCP Server listening on port %hu (%s)\n", bfcp_port, bfcp_transport ? "TCP/TLS/BFCP" : "TCP/BFCP");
bfcp list = bfcp_gw_get_list();
if(list)
- ast_cli(fd," BFCP Server List active with max %d conferences allowed (%d active).\n", list->Max_number_conference + 1, list->Actual_number_conference);
+ ast_cli(fd, "\tBFCP Server List active with max %d conferences allowed (%d active).\n", list->Max_number_conference + 1, list->Actual_number_conference);
}
else
- ast_cli(fd,"BFCP Server not up.\n");
+ ast_cli(fd, "BFCP Server not up.\n");
if (scheduler_exists)
- ast_cli(fd," XconScheduler Server listening on port %d.\n", scheduler_port);
+ ast_cli(fd, "\tXconScheduler Server listening on port %d.\n", scheduler_port);
else
- ast_cli(fd,"XconScheduler Server not up.\n");
+ ast_cli(fd, "XconScheduler Server not up.\n");
+ return RESULT_SUCCESS;
+}
+
+static int xcon_debug(int fd, int argc, char *argv[])
+{
+ if (argc != 3)
+ return RESULT_SHOWUSAGE;
+
+ int level = atoi(argv[2]);
+ if((level < 0) || (level > 3))
+ return RESULT_SHOWUSAGE;
+
+ xcon_debug_level = level;
+ ast_cli(fd, "Debug level for XCON/DCON set to %d.\n", level);
+
return RESULT_SUCCESS;
}
@@ -1109,13 +1135,13 @@
struct xcon_registered_conference *conferences = NULL;
AST_LIST_LOCK(®xconfs);
if (AST_LIST_EMPTY(®xconfs)) {
- ast_cli(fd," There are no registered conferences.\n");
+ ast_cli(fd, "\tThere are no registered conferences.\n");
return RESULT_SUCCESS;
}
- ast_cli(fd," Registered conferences:\n");
+ ast_cli(fd, "\tRegistered conferences:\n");
AST_LIST_TRAVERSE(®xconfs, conferences, list) {
i++;
- ast_cli(fd," %d: %li (password=%d), %s (PIN=%d), Audio %s, Video %s (Topic: %s)\n",i,conferences->conferenceID,conferences->password,conferences->pin ? "Private" : "Public",conferences->pin,conferences->audiofloorID ? "enabled" : "disabled",conferences->videofloorID ? "enabled" : "disabled", conferences->subject ? conferences->subject : "(none)");
+ ast_cli(fd, "\t %d: %li (password=%d), %s (PIN=%d), Audio %s, Video %s (Topic: %s)\n",i,conferences->conferenceID,conferences->password,conferences->pin ? "Private" : "Public",conferences->pin,conferences->audiofloorID ? "enabled" : "disabled",conferences->videofloorID ? "enabled" : "disabled", conferences->subject ? conferences->subject : "(none)");
}
AST_LIST_UNLOCK(®xconfs);
return RESULT_SUCCESS;
@@ -1125,26 +1151,26 @@
static int xcon_show_conferences(int fd, int argc, char *argv[])
{
if (!bfcp_exists)
- ast_cli(fd," BFCP Server List has not been created yet.\n");
+ ast_cli(fd, "\tBFCP Server List has not been created yet.\n");
else {
bfcp list = bfcp_gw_get_list();
if(!list) {
- ast_cli(fd," BFCP Server List doesn't exist?\n");
+ ast_cli(fd, "\tBFCP Server List doesn't exist?\n");
return RESULT_FAILURE;
}
bfcp_conference *lconferences = list->list_conferences;
int i = 0;
if (lconferences == NULL) {
- ast_cli(fd," The BFCP Server List is NULL.\n");
+ ast_cli(fd, "\tThe BFCP Server List is NULL.\n");
return RESULT_SUCCESS;
}
if (list->Actual_number_conference == 0) {
- ast_cli(fd," There are no active conferences in the BFCP Server.\n");
+ ast_cli(fd, "\tThere are no active conferences in the BFCP Server.\n");
return RESULT_SUCCESS;
}
- ast_cli(fd," Conferences:\n");
+ ast_cli(fd, "\tConferences:\n");
for(i=0; i < list->Actual_number_conference; i++)
- ast_cli(fd," %d: %li\n",i+1,list->list_conferences[i].conferenceID);
+ ast_cli(fd, "\t %d: %li\n",i+1,list->list_conferences[i].conferenceID);
}
return RESULT_SUCCESS;
}
@@ -1158,14 +1184,14 @@
bfcp_queue *list_link;
bfcp_user *user;
bfcp_node *node;
- bfcp_floor *FloorID;
+ bfcp_floor *floor;
floor_request_query *query_floorrequest;
floor_query *query;
if (argc != 4)
return RESULT_SHOWUSAGE;
if (!bfcp_exists)
- ast_cli(fd," BFCP Server List has not been created yet.\n");
+ ast_cli(fd, "\tBFCP Server List has not been created yet.\n");
else {
unsigned long int ID = atoi(argv[3]);
if(!ID)
@@ -1173,41 +1199,41 @@
int i = 0;
bfcp list = bfcp_gw_get_list();
if(!list) {
- ast_cli(fd," BFCP Server List doesn't exist?\n");
+ ast_cli(fd, "\tBFCP Server List doesn't exist?\n");
return RESULT_FAILURE;
}
if (list->list_conferences == NULL) {
- ast_cli(fd," The BFCP Server List is NULL.\n");
+ ast_cli(fd, "\tThe BFCP Server List is NULL.\n");
return RESULT_FAILURE;
}
if (list->Actual_number_conference == 0) {
- ast_cli(fd," There are no active conferences in the BFCP Server.\n");
+ ast_cli(fd, "\tThere are no active conferences in the BFCP Server.\n");
return RESULT_FAILURE;
}
for(i=0; i < list->Actual_number_conference; i++) {
if (list->list_conferences[i].conferenceID == ID) {
- ast_cli(fd,"ConferenceID: %li\n\n", list->list_conferences[i].conferenceID);
+ ast_cli(fd, "ConferenceID: %li\n\n", list->list_conferences[i].conferenceID);
list_floor = list->list_conferences[i].floor;
if (list_floor !=NULL) {
- ast_cli(fd,"Maximum number of floors in the conference: %d\n", list_floor->number_floors + 1);
- ast_cli(fd,"FLOORS\n");
+ ast_cli(fd, "Maximum number of floors in the conference: %d\n", list_floor->number_floors + 1);
+ ast_cli(fd, "FLOORS\n");
for(j= 0;j<list_floor->actual_number_floors;j++) {
- ast_cli(fd,"FloorID: %u, ", list_floor->floors[j].floorID);
- ast_cli(fd,"ChairID: %u", list_floor->floors[j].chairID);
+ ast_cli(fd, "floor: %u, ", list_floor->floors[j].floorID);
+ ast_cli(fd, "ChairID: %u", list_floor->floors[j].chairID);
if (list_floor->floors[j].floorState==0)
- ast_cli(fd," state: FREE\n");
+ ast_cli(fd, " state: FREE\n");
else if (list_floor->floors[j].floorState==1)
- ast_cli(fd," state: ACCEPTED\n");
+ ast_cli(fd, " state: ACCEPTED\n");
else if (list_floor->floors[j].floorState>=2)
- ast_cli(fd," state: GRANTED\n");
+ ast_cli(fd, " state: GRANTED\n");
else
- ast_cli(fd," state: error!\n");
- ast_cli(fd,"Number of simultaneous granted users: %d\n", list_floor->floors[j].limit_granted_floor-1);
+ ast_cli(fd, " state: error!\n");
+ ast_cli(fd, "Number of simultaneous granted users: %d\n", list_floor->floors[j].limit_granted_floor-1);
query= list_floor->floors[j].floorquery;
if (query!=NULL)
- ast_cli(fd,"QUERY LIST\n");
+ ast_cli(fd, "QUERY LIST\n");
while(query) {
- ast_cli(fd,"User: %i\n",query->userID);
+ ast_cli(fd, "User: %i\n",query->userID);
query=query->next;
}
}
@@ -1215,119 +1241,119 @@
list_user = list->list_conferences[i].user;
if (list_user !=NULL) {
user=list_user->users;
- ast_cli(fd,"Maximum number of request per floors in the conference: %d\n", list_user->max_number_floor_request);
- ast_cli(fd,"USERS\n");
+ ast_cli(fd, "Maximum number of request per floors in the conference: %d\n", list_user->max_number_floor_request);
+ ast_cli(fd, "USERS\n");
while(user){
- ast_cli(fd,"userID: %u (Display Name: %s, URI: %s)\n",
+ ast_cli(fd, "userID: %u (Display Name: %s, URI: %s)\n",
user->userID,
user->user_display_name ? user->user_display_name : "none",
user->user_URI ? user->user_URI : "none");
- ast_cli(fd,"\n");
+ ast_cli(fd, "\n");
user= user->next;
}
}
list_link = list->list_conferences[i].pending;
if (list_link !=NULL) {
node=list_link->head;
- if (node) ast_cli(fd,"PENDING LIST\n");
+ if (node) ast_cli(fd, "PENDING LIST\n");
while(node!=NULL) {
- ast_cli(fd,"FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
+ ast_cli(fd, "FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
if (node->beneficiaryID!=0)
- ast_cli(fd,"BeneficiaryID: %u", node->beneficiaryID);
- ast_cli(fd,"\n");
- FloorID=node->floorID;
- while(FloorID) {
- ast_cli(fd,"FloorID: %u ", FloorID->floorID);
- if (FloorID->chair_info!=NULL)
- ast_cli(fd,"chair_information: %s ", FloorID->chair_info);
- if (FloorID->status==0)
- ast_cli(fd," state: FREE\n");
- else if (FloorID->status==1)
- ast_cli(fd," state: ACCEPTED\n");
- else if (FloorID->status>=2)
- ast_cli(fd," state: GRANTED\n");
+ ast_cli(fd, "BeneficiaryID: %u", node->beneficiaryID);
+ ast_cli(fd, "\n");
+ floor=node->floor;
+ while(floor) {
+ ast_cli(fd, "floor: %u ", floor->floorID);
+ if (floor->chair_info!=NULL)
+ ast_cli(fd, "chair_information: %s ", floor->chair_info);
+ if (floor->status==0)
+ ast_cli(fd, " state: FREE\n");
+ else if (floor->status==1)
+ ast_cli(fd, " state: ACCEPTED\n");
+ else if (floor->status>=2)
+ ast_cli(fd, " state: GRANTED\n");
else
- ast_cli(fd," state: error!\n");
- FloorID= FloorID->next;
+ ast_cli(fd, " state: error!\n");
+ floor= floor->next;
}
query_floorrequest=node->floorrequest;
while(query_floorrequest) {
- ast_cli(fd,"Floor Request query: %u \n", query_floorrequest->userID);
+ ast_cli(fd, "Floor Request query: %u \n", query_floorrequest->userID);
query_floorrequest= query_floorrequest->next;
}
node= node->next;
- ast_cli(fd,"-----------------\n");
+ ast_cli(fd, "-----------------\n");
}
}
list_link = list->list_conferences[i].accepted;
if (list_link !=NULL) {
node=list_link->head;
if (node)
- ast_cli(fd,"ACCEPTED LIST\n");
+ ast_cli(fd, "ACCEPTED LIST\n");
while(node!=NULL) {
- ast_cli(fd,"FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
+ ast_cli(fd, "FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
if (node->beneficiaryID!=0)
- ast_cli(fd,"BeneficiaryID: %u", node->beneficiaryID);
- ast_cli(fd,"\n");
- FloorID=node->floorID;
- while(FloorID) {
- ast_cli(fd,"FloorID: %u ", FloorID->floorID);
- if (FloorID->chair_info!=NULL)
- ast_cli(fd,"chair_information: %s ", FloorID->chair_info);
- if (FloorID->status==0)
- ast_cli(fd," state: FREE\n");
- else if (FloorID->status==1)
- ast_cli(fd," state: ACCEPTED\n");
- else if (FloorID->status>=2)
- ast_cli(fd," state: GRANTED\n");
- else ast_cli(fd," state: error!\n");
- FloorID= FloorID->next;
+ ast_cli(fd, "BeneficiaryID: %u", node->beneficiaryID);
+ ast_cli(fd, "\n");
+ floor=node->floor;
+ while(floor) {
+ ast_cli(fd, "floor: %u ", floor->floorID);
+ if (floor->chair_info!=NULL)
+ ast_cli(fd, "chair_information: %s ", floor->chair_info);
+ if (floor->status==0)
+ ast_cli(fd, " state: FREE\n");
+ else if (floor->status==1)
+ ast_cli(fd, " state: ACCEPTED\n");
+ else if (floor->status>=2)
+ ast_cli(fd, " state: GRANTED\n");
+ else ast_cli(fd, " state: error!\n");
+ floor= floor->next;
}
query_floorrequest=node->floorrequest;
while(query_floorrequest) {
- ast_cli(fd,"Floor Request query: %u \n", query_floorrequest->userID);
+ ast_cli(fd, "Floor Request query: %u \n", query_floorrequest->userID);
query_floorrequest= query_floorrequest->next;
}
node= node->next;
- ast_cli(fd,"-----------------\n");
+ ast_cli(fd, "-----------------\n");
}
}
list_link = list->list_conferences[i].granted;
if (list_link !=NULL) {
node=list_link->head;
if (node)
- ast_cli(fd,"GRANTED LIST\n");
+ ast_cli(fd, "GRANTED LIST\n");
while(node!=NULL) {
- ast_cli(fd,"FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
+ ast_cli(fd, "FloorRequestID: %u userID: %u Priority: %u Queue_position: %u ", node->floorRequestID, node->userID, node->priority, node->queue_position);
if (node->beneficiaryID!=0)
- ast_cli(fd,"BeneficiaryID: %u", node->beneficiaryID);
- ast_cli(fd,"\n");
- FloorID=node->floorID;
- while(FloorID) {
- ast_cli(fd,"FloorID: %u ", FloorID->floorID);
- if (FloorID->chair_info!=NULL)
- ast_cli(fd,"chair_information: %s ", FloorID->chair_info);
- if (FloorID->status==0)
- ast_cli(fd," state: FREE\n");
- else if (FloorID->status==1)
- ast_cli(fd," state: ACCEPTED\n");
- else if (FloorID->status>=2)
- ast_cli(fd," state: GRANTED\n");
- else ast_cli(fd," state: error!\n");
- FloorID= FloorID->next;
+ ast_cli(fd, "BeneficiaryID: %u", node->beneficiaryID);
+ ast_cli(fd, "\n");
+ floor=node->floor;
+ while(floor) {
+ ast_cli(fd, "floor: %u ", floor->floorID);
+ if (floor->chair_info!=NULL)
+ ast_cli(fd, "chair_information: %s ", floor->chair_info);
+ if (floor->status==0)
+ ast_cli(fd, " state: FREE\n");
+ else if (floor->status==1)
+ ast_cli(fd, " state: ACCEPTED\n");
+ else if (floor->status>=2)
+ ast_cli(fd, " state: GRANTED\n");
+ else ast_cli(fd, " state: error!\n");
+ floor= floor->next;
}
query_floorrequest=node->floorrequest;
while(query_floorrequest) {
- ast_cli(fd,"Floor Request query: %u \n", query_floorrequest->userID);
+ ast_cli(fd, "Floor Request query: %u \n", query_floorrequest->userID);
query_floorrequest= query_floorrequest->next;
}
node= node->next;
- ast_cli(fd,"-----------------\n");
+ ast_cli(fd, "-----------------\n");
}
}
} else {
- ast_cli(fd," There is no active conference with ID %lu in the BFCP Server.\n",ID);
+ ast_cli(fd, "\tThere is no active conference with ID %lu in the BFCP Server.\n",ID);
return RESULT_FAILURE;
}
}
@@ -1346,7 +1372,7 @@
return RESULT_SHOWUSAGE;
if(AST_LIST_EMPTY(&confs)) {
- ast_cli(fd," There are no active conferences in the BFCP Server.\n");
+ ast_cli(fd, "\tThere are no active conferences in the BFCP Server.\n");
return RESULT_FAILURE;
}
@@ -1355,44 +1381,44 @@
if(cnf) {
AST_LIST_LOCK(&confs);
struct ast_conf_user *user;
- ast_cli(fd," Users in Conference %lu:\n",ID);
+ ast_cli(fd, "\tUsers in Conference %lu:\n",ID);
AST_LIST_TRAVERSE(&cnf->userlist, user, list) {
if(!user)
break;
user_count++;
- ast_cli(fd," %d: UserID %u (Display Name: %s, URI: %s)",
+ ast_cli(fd, "\t %d: UserID %u (Display Name: %s, URI: %s)",
user_count,
user->xconuserID,
user->xconuserdisplay ? user->xconuserdisplay : "none",
user->xconuseruri ? user->xconuseruri : "none");
if(cnf->audiofloorID)
- ast_cli(fd,", Audio %s", user->audiofloorstatus ? bfcp_status[user->audiofloorstatus-1].description : "NOT GRANTED");
+ ast_cli(fd, ", Audio %s", user->audiofloorstatus ? bfcp_status[user->audiofloorstatus-1].description : "NOT GRANTED");
if(cnf->videofloorID)
- ast_cli(fd,", Video %s", user->videofloorstatus ? bfcp_status[user->videofloorstatus-1].description : "NOT GRANTED");
- ast_cli(fd,"\n");
+ ast_cli(fd, ", Video %s", user->videofloorstatus ? bfcp_status[user->videofloorstatus-1].description : "NOT GRANTED");
+ ast_cli(fd, "\n");
}
if(!AST_LIST_EMPTY(&cnf->dconuserlist)) { /* There are remote users too */
struct dcon_user *dconuser;
- ast_cli(fd," Remote Users in Conference %lu:\n",ID);
+ ast_cli(fd, "\tRemote Users in Conference %lu:\n",ID);
AST_LIST_TRAVERSE(&cnf->dconuserlist, dconuser, list) {
if(!dconuser)
break;
user_count++;
- ast_cli(fd," %d: UserID %u (Display Name: %s, URI: %s)",
+ ast_cli(fd, "\t %d: UserID %u (Display Name: %s, URI: %s)",
user_count,
dconuser->xconuserID,
dconuser->xconuserdisplay ? dconuser->xconuserdisplay : "none",
dconuser->xconuseruri ? dconuser->xconuseruri : "none");
if(cnf->audiofloorID)
- ast_cli(fd,", Audio %s", dconuser->audiofloorstatus ? bfcp_status[dconuser->audiofloorstatus-1].description : "NOT GRANTED");
+ ast_cli(fd, ", Audio %s", dconuser->audiofloorstatus ? bfcp_status[dconuser->audiofloorstatus-1].description : "NOT GRANTED");
if(cnf->videofloorID)
- ast_cli(fd,", Video %s", dconuser->videofloorstatus ? bfcp_status[dconuser->videofloorstatus-1].description : "NOT GRANTED");
- ast_cli(fd," (REMOTE USER)\n");
+ ast_cli(fd, ", Video %s", dconuser->videofloorstatus ? bfcp_status[dconuser->videofloorstatus-1].description : "NOT GRANTED");
+ ast_cli(fd, " (REMOTE USER)\n");
}
}
AST_LIST_UNLOCK(&confs);
} else {
- ast_cli(fd," There is no active conference with ID %lu in the BFCP Server.\n",ID);
+ ast_cli(fd, "\tThere is no active conference with ID %lu in the BFCP Server.\n",ID);
return RESULT_FAILURE;
}
@@ -1413,7 +1439,7 @@
return RESULT_SHOWUSAGE;
if(AST_LIST_EMPTY(&confs)) {
- ast_cli(fd," There are no active conferences in the BFCP Server.\n");
+ ast_cli(fd, "\tThere are no active conferences in the BFCP Server.\n");
return RESULT_FAILURE;
}
@@ -1422,44 +1448,44 @@
AST_LIST_LOCK(&confs);
struct ast_conf_user *user = xcon_get_user(cnf, userID);
if(user) {
- ast_cli(fd," UserID %u (Display Name: %s, URI: %s)",
+ ast_cli(fd, "\tUserID %u (Display Name: %s, URI: %s)",
user->xconuserID,
user->xconuserdisplay ? user->xconuserdisplay : "none",
user->xconuseruri ? user->xconuseruri : "none");
if(cnf->audiofloorID)
- ast_cli(fd,", Audio %s", user->audiofloorstatus ? bfcp_status[user->audiofloorstatus-1].description : "NOT GRANTED");
+ ast_cli(fd, ", Audio %s", user->audiofloorstatus ? bfcp_status[user->audiofloorstatus-1].description : "NOT GRANTED");
if(cnf->videofloorID)
[... 34069 lines stripped ...]
More information about the svn-commits
mailing list