[commit] r3530 - freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference
Author: mikej Date: Mon Dec 4 02:24:45 2006 New Revision: 3530 Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Log: // => /* */ Modified: freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c ============================================================================== --- freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c (original) +++ freeswitch/branches/knhor/trunk/src/mod/applications/mod_conference/mod_conference.c Mon Dec 4 02:24:45 2006 @@ -51,8 +51,8 @@ #define MIN(a,b) ((a)<(b)?(a):(b)) #endif -// this doesn't work correctly yet, don't bother trying! -//#define OPTION_IVR_MENU_SUPPORT +/* this doesn't work correctly yet, don't bother trying! */ +//#define OPTION_IVR_MENU_SUPPORT */ typedef enum { FILE_STOP_CURRENT, @@ -88,7 +88,7 @@ CALLER_CONTROL_DIAL, } caller_control_t; -// forward declaration for conference_obj and caller_control +/* forward declaration for conference_obj and caller_control */ struct conference_member; typedef struct conference_member conference_member_t; @@ -233,7 +233,7 @@ switch_memory_pool_t *pool; } conference_record_t; -// API command parser +/* API command parser */ typedef struct api_command { char *pname; void *pfnapicmd; @@ -341,12 +341,13 @@ return rel; } -// traverse the conference member list for the specified member id and return it's pointer +/* traverse the conference member list for the specified member id and return it's pointer */ static conference_member_t *conference_member_get(conference_obj_t *conference, uint32_t id) { conference_member_t *member = NULL; for(member = conference->members; member; member = member->next) { + if (switch_test_flag(member, MFLAG_NOCHANNEL)) { continue; } @@ -359,7 +360,7 @@ return member; } -// stop the specified recording +/* stop the specified recording */ static int conference_record_stop(conference_obj_t *conference, char *path) { conference_member_t *member = NULL; @@ -433,6 +434,7 @@ member->energy_level = conference->energy_level; conference->members = member; + if (!switch_test_flag(member, MFLAG_NOCHANNEL)) { conference->count++; if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) { @@ -444,6 +446,7 @@ switch_event_fire(&event); } + if (conference->enter_sound) { conference_play_file(conference, conference->enter_sound, CONF_DEFAULT_LEADIN); } @@ -499,6 +502,7 @@ last = imember; } + member->conference = NULL; if (!switch_test_flag(member, MFLAG_NOCHANNEL)) { @@ -539,7 +543,10 @@ switch_mutex_unlock(member->audio_in_mutex); switch_mutex_unlock(conference->member_mutex); switch_mutex_unlock(conference->mutex); + + switch_thread_rwlock_unlock(conference->rwlock); + } /* Main monitor thread (1 per distinct conference room) */ @@ -750,12 +757,12 @@ if (!switch_test_flag(imember, MFLAG_NOCHANNEL)) { channel = switch_core_session_get_channel(imember->session); - // add this little bit to preserve the bridge cause code in case of an early media call that - // never answers + /* add this little bit to preserve the bridge cause code in case of an early media call that */ + /* never answers */ if (switch_test_flag(conference, CFLAG_ANSWERED)) { switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); } else { - // put actual cause code from outbound channel hangup here + /* put actual cause code from outbound channel hangup here */ switch_channel_hangup(channel, conference->bridge_hangup_cause); } } @@ -778,7 +785,7 @@ // this probably should be done, but doing it causes "shutdown" to hang until you kill it // XXX - i'll chase this down later -// switch_ivr_digit_stream_parser_destroy(&conference->dtmf_parser); + // switch_ivr_digit_stream_parser_destroy(&conference->dtmf_parser); if (conference->pool) { switch_memory_pool_t *pool = conference->pool; @@ -986,7 +993,7 @@ } } -// marshall frames from the call leg to the conference thread for muxing to other call legs +/* marshall frames from the call leg to the conference thread for muxing to other call legs */ static void *SWITCH_THREAD_FUNC conference_loop_input(switch_thread_t *thread, void *obj) { conference_member_t *member = obj; @@ -1028,8 +1035,8 @@ energy_level = member->energy_level; - // if the member can speak, compute the audio energy level and - // generate events when the level crosses the threshold + /* if the member can speak, compute the audio energy level and */ + /* generate events when the level crosses the threshold */ if (switch_test_flag(member, MFLAG_CAN_SPEAK) && energy_level) { uint32_t energy = 0, i = 0, samples = 0, j = 0, score = 0; int16_t *data; @@ -1119,7 +1126,7 @@ return NULL; } -// launch an input thread for the call leg +/* launch an input thread for the call leg */ static void launch_conference_loop_input(conference_member_t *member, switch_memory_pool_t *pool) { switch_thread_t *thread; @@ -1152,8 +1159,8 @@ }; #define CCFNTBL_QTY (sizeof(ccfntbl)/sizeof(ccfntbl[0])) -// marshall frames from the conference (or file or tts output) to the call leg -// NB. this starts the input thread after some initial setup for the call leg +/* marshall frames from the conference (or file or tts output) to the call leg */ +/* NB. this starts the input thread after some initial setup for the call leg */ static void conference_loop_output(conference_member_t *member) { switch_channel_t *channel; @@ -1189,11 +1196,11 @@ switch_channel_answer(channel); } - // Start the input thread + /* Start the input thread */ launch_conference_loop_input(member, switch_core_session_get_pool(member->session)); - // Fair WARNING, If you expect the caller to hear anything or for digit handling to be proccessed, - // you better not block this thread loop for more than the duration of member->conference->timer_name! + /* Fair WARNING, If you expect the caller to hear anything or for digit handling to be proccessed, */ + /* you better not block this thread loop for more than the duration of member->conference->timer_name! */ while(switch_test_flag(member, MFLAG_RUNNING) && switch_test_flag(member, MFLAG_ITHREAD) && switch_channel_ready(channel)) { char dtmf[128] = ""; uint8_t file_frame[CONF_BUFFER_SIZE] = {0}; @@ -1224,6 +1231,7 @@ } if (switch_channel_test_flag(channel, CF_OUTBOUND)) { + /* test to see if outbound channel has answered */ if (switch_channel_test_flag(channel, CF_ANSWERED) && !switch_test_flag(member->conference, CFLAG_ANSWERED)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Outbound conference channel answered, setting CFLAG_ANSWERED"); switch_set_flag(member->conference, CFLAG_ANSWERED); @@ -1235,7 +1243,7 @@ } } - // if we have caller digits, feed them to the parser to find an action + /* if we have caller digits, feed them to the parser to find an action */ if (switch_channel_has_dtmf(channel)) { switch_channel_dequeue_dtmf(channel, dtmf, sizeof(dtmf)); @@ -1245,12 +1253,12 @@ caller_action = (caller_control_action_t *)switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, *digit); } } - // otherwise, clock the parser so that it can handle digit timeout detection + /* otherwise, clock the parser so that it can handle digit timeout detection */ } else if(member->conference->dtmf_parser != NULL) { caller_action = (caller_control_action_t *)switch_ivr_digit_stream_parser_feed(member->conference->dtmf_parser, '\0'); } - // if a caller action has been detected, handle it + /* if a caller action has been detected, handle it */ if (caller_action != NULL && caller_action->fndesc != NULL && caller_action->fndesc->handler != NULL) { switch_channel_t *channel = switch_core_session_get_channel(member->session); switch_caller_profile_t *profile = switch_channel_get_caller_profile(channel); @@ -1267,13 +1275,13 @@ ); caller_action->fndesc->handler(member,caller_action->data); - // set up for next pass + /* set up for next pass */ caller_action = NULL; } - // handle file and TTS frames + /* handle file and TTS frames */ if (member->fnode) { - // if we are done, clean it up + /* if we are done, clean it up */ if (member->fnode->done) { confernce_file_node_t *fnode; switch_memory_pool_t *pool; @@ -1295,10 +1303,10 @@ switch_core_destroy_memory_pool(&pool); } else { - // skip this frame until leadin time has expired + /* skip this frame until leadin time has expired */ if (member->fnode->leadin) { member->fnode->leadin--; - } else { // send the node frame instead of the conference frame to the call leg + } else { /* send the node frame instead of the conference frame to the call leg */ if (member->fnode->type == NODE_TYPE_SPEECH) { switch_speech_flag_t flags = SWITCH_SPEECH_FLAG_BLOCKING; uint32_t rate = member->conference->rate; @@ -1337,7 +1345,7 @@ switch_core_timer_next(&timer); } } - } else { // send the conferecne frame to the call leg + } else { /* send the conferecne frame to the call leg */ switch_buffer_t *use_buffer = NULL; uint32_t mux_used = (uint32_t)switch_buffer_inuse(member->mux_buffer); @@ -1373,7 +1381,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Channel leaving conference, cause: %s\n", switch_channel_cause2str(switch_channel_get_cause(channel))); - // if it's an outbound channel, store the release cause in the conference struct, we might need it + /* if it's an outbound channel, store the release cause in the conference struct, we might need it */ if (switch_channel_test_flag(channel, CF_OUTBOUND)) { member->conference->bridge_hangup_cause = switch_channel_get_cause(channel); } @@ -1516,7 +1524,7 @@ return count; } -// stop playing a file for the member of the conference +/* stop playing a file for the member of the conference */ static uint32_t conference_member_stop_file(conference_member_t *member, file_stop_t stop) { confernce_file_node_t *nptr; @@ -1791,7 +1799,7 @@ return SWITCH_STATUS_SUCCESS; } -// execute a callback for every member of the conference +/* execute a callback for every member of the conference */ static void conference_member_itterator(conference_obj_t *conference, switch_stream_handle_t *stream, conf_api_member_cmd_t pfncallback, void *data) { conference_member_t *member = NULL; @@ -2436,12 +2444,12 @@ channel = switch_core_session_get_channel(member->session); - // build a new conference if it doesn't exist + /* build a new conference if it doesn't exist */ if (!(new_conference = (conference_obj_t *) switch_core_hash_find(globals.conference_hash, argv[3]))) { switch_memory_pool_t *pool; char *conf_name; - // Setup a memory pool to use. + /* Setup a memory pool to use. */ if (switch_core_new_memory_pool(&pool) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "Pool Failure\n"); goto done; @@ -2452,7 +2460,7 @@ if ((profile_name = strchr(conf_name, '@'))) { *profile_name++ = '\0'; - // Open the config from the xml registry + /* Open the config from the xml registry */ if (!(cxml = switch_xml_open_cfg(global_cf_name, &cfg, NULL))) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", global_cf_name); goto done; @@ -2463,13 +2471,13 @@ } } - // Release the config registry handle + /* Release the config registry handle */ if (cxml) { switch_xml_free(cxml); cxml = NULL; } - // Create the conference object. + /* Create the conference object. */ new_conference = conference_new(conf_name, profile, pool); if (!new_conference) { @@ -2477,23 +2485,23 @@ goto done; } - // Set the minimum number of members (once you go above it you cannot go below it) + /* Set the minimum number of members (once you go above it you cannot go below it) */ new_conference->min = 1; - // Indicate the conference is dynamic + /* Indicate the conference is dynamic */ switch_set_flag_locked(new_conference, CFLAG_DYNAMIC); - // Start the conference thread for this conference + /* Start the conference thread for this conference */ launch_conference_thread(new_conference); } - // move the member from the old conference to the new one + /* move the member from the old conference to the new one */ conference_del_member(member->last_conference, member); conference_add_member(new_conference, member); stream->write_function(stream, "OK Member %u sent to conference %s.\n", id, argv[3]); - // tell them what happened + /* tell them what happened */ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, CONF_EVENT_MAINT) == SWITCH_STATUS_SUCCESS) { switch_channel_event_set_data(channel, event); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Member-ID", "%u", member->id); @@ -2598,7 +2606,7 @@ memset(argv,0,sizeof(argv)); argc = switch_separate_string(lbuf, ' ', argv, (sizeof(argv) / sizeof(argv[0]))); - // try to find a command to execute + /* try to find a command to execute */ if (argc) { int i,found=0; uint32_t cnum = atoi(argv[0]); @@ -2607,24 +2615,24 @@ if(cnum == 0 || (cnum != 0 && conference != NULL && argc >= 3)) { int argn = (cnum != 0 ? 1 : 0); - // loop through the command table to find a match + /* loop through the command table to find a match */ for (i=0; i<CONFFUNCAPISIZE && !found; i++) { if (strcasecmp(argv[argn],conf_api_sub_commands[i].pname) == 0) { found = 1; switch(conf_api_sub_commands[i].fntype) { - // commands that we've broken the command line into arguments for + /* commands that we've broken the command line into arguments for */ case CONF_API_SUB_ARGS_SPLIT: { conf_api_args_cmd_t pfn = (conf_api_args_cmd_t)conf_api_sub_commands[i].pfnapicmd; if (pfn(conference, stream, argc, &argv[0]) != 0) { - // command returned error, so show syntax usage + /* command returned error, so show syntax usage */ stream->write_function(stream,conf_api_sub_commands[i].psyntax); } } break; - // member specific command that can be itteratted + /* member specific command that can be itteratted */ case CONF_API_SUB_MEMBER_TARGET: { uint32_t id = atoi(argv[argn+1]); @@ -2639,7 +2647,7 @@ switch_mutex_lock(conference->member_mutex); - // find last (oldest) member + /* find last (oldest) member */ member = conference->members; while (member != NULL) { if (last_member == NULL || member->id > last_member->id) { @@ -2648,7 +2656,7 @@ member = member->next; } - // exec functio on last (oldest) member + /* exec functio on last (oldest) member */ if (last_member != NULL) { conf_api_member_cmd_t pfn = (conf_api_member_cmd_t)conf_api_sub_commands[i].pfnapicmd; pfn(last_member, stream, argv[argn+2]); @@ -2672,19 +2680,19 @@ } break; - // commands that deals with all text after command + /* commands that deals with all text after command */ case CONF_API_SUB_ARGS_AS_ONE: { conf_api_text_cmd_t pfn = (conf_api_text_cmd_t)conf_api_sub_commands[i].pfnapicmd; char *pstr = lbuf+strlen(conf_api_sub_commands[i].pname)+1; - // advance past all leading white space after command + /* advance past all leading white space after command */ while(*pstr == ' ' || *pstr == '\t') { pstr++; } - // call the command handler + /* call the command handler */ if (pfn(conference, stream, pstr) != 0) { - // command returned error, so show syntax usage + /* command returned error, so show syntax usage */ stream->write_function(stream,conf_api_sub_commands[i].psyntax); } } @@ -2693,7 +2701,7 @@ } } - // no command found + /* no command found */ if(!found) { stream->write_function(stream, "Confernece command '%s' not found.\nTry 'help conference'\n", argv[argn]); } @@ -2715,9 +2723,10 @@ } return status; + } -// outbound call bridge progress call state callback handler +/* outbound call bridge progress call state callback handler */ static switch_status_t audio_bridge_on_ring(switch_core_session_t *session) { switch_channel_t *channel = NULL; @@ -2729,7 +2738,6 @@ /* put the channel in a passive state so we can loop audio to it */ switch_channel_set_state(channel, CS_TRANSMIT); - return SWITCH_STATUS_FALSE; } @@ -2743,7 +2751,7 @@ /*.on_hold */ NULL, }; -// generate an outbound call from the conference +/* generate an outbound call from the conference */ static switch_status_t conference_outcall(conference_obj_t *conference, switch_core_session_t *session, char *bridgeto, @@ -2770,7 +2778,7 @@ } - // establish an outbound call leg + /* establish an outbound call leg */ if (switch_ivr_originate(session, &peer_session, &cause, @@ -2788,10 +2796,11 @@ goto done; } + peer_channel = switch_core_session_get_channel(peer_session); assert(peer_channel != NULL); - // make sure the conference still exists + /* make sure the conference still exists */ if (!switch_test_flag(conference, CFLAG_RUNNING)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Conference is gone now, nevermind..\n"); if (caller_channel) { @@ -2805,17 +2814,16 @@ switch_channel_answer(caller_channel); } - // if the outbound call leg is ready + /* if the outbound call leg is ready */ if (switch_channel_test_flag(peer_channel, CF_ANSWERED) || switch_channel_test_flag(peer_channel, CF_EARLY_MEDIA)) { switch_caller_extension_t *extension = NULL; - // build an extension name object + /* build an extension name object */ if ((extension = switch_caller_extension_new(peer_session, conference->name, conference->name)) == 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_CRIT, "memory error!\n"); status = SWITCH_STATUS_MEMERR; goto done; } - /* add them to the conference */ if (flags) { snprintf(appdata, sizeof(appdata), "%s +flags{%s}", conference->name, flags); @@ -2826,6 +2834,7 @@ switch_channel_set_caller_extension(peer_channel, extension); switch_channel_set_state(peer_channel, CS_EXECUTE); + } else { switch_channel_hangup(peer_channel, SWITCH_CAUSE_NO_ANSWER); status = SWITCH_STATUS_FALSE; @@ -2843,7 +2852,7 @@ uint32_t x = 0; switch_status_t status = SWITCH_STATUS_SUCCESS; - // generate some space infront of the file to be played + /* generate some space infront of the file to be played */ for (x = 0; x < leadin; x++) { switch_frame_t *read_frame; switch_status_t status = switch_core_session_read_frame(session, &read_frame, 1000, 0); @@ -2853,7 +2862,7 @@ } } - // if all is well, really play the file + /* if all is well, really play the file */ if (status == SWITCH_STATUS_SUCCESS) { status = switch_ivr_play_file(session, NULL, path, NULL, NULL, NULL, 0); } @@ -2897,7 +2906,7 @@ return; } - // Start the conference muted or deaf ? + /* Start the conference muted or deaf ? */ if ((flags_str=strstr(mydata, flags_prefix))) { char *p; @@ -2914,7 +2923,7 @@ } } - // is this a bridging conference ? + /* is this a bridging conference ? */ if (!strncasecmp(mydata, bridge_prefix, strlen(bridge_prefix))) { isbr = 1; mydata += strlen(bridge_prefix); @@ -2928,12 +2937,12 @@ conf_name = mydata; - // is there a conference pin ? + /* is there a conference pin ? */ if ((dpin = strchr(conf_name, '+'))) { *dpin++ = '\0'; } - // is there profile specification ? + /* is there profile specification ? */ if ((profile_name = strchr(conf_name, '@'))) { *profile_name++ = '\0'; @@ -2948,8 +2957,8 @@ } } - // if this is a bridging call, and it's not a duplicate, build a - // conference object, and skip pin handling, and locked checking + /* if this is a bridging call, and it's not a duplicate, build a */ + /* conference object, and skip pin handling, and locked checking */ if (isbr) { char *uuid = switch_core_session_get_uuid(session); @@ -2973,7 +2982,7 @@ /* Set the minimum number of members (once you go above it you cannot go below it) */ conference->min = 2; - // if the dialplan specified a pin, override the profile's value + /* if the dialplan specified a pin, override the profile's value */ if (dpin) { conference->pin = switch_core_strdup(conference->pool, dpin); } @@ -2985,10 +2994,10 @@ launch_conference_thread(conference); } else { - // if the conference exists, get the pointer to it + /* if the conference exists, get the pointer to it */ if ((conference = (conference_obj_t *) switch_core_hash_find(globals.conference_hash, conf_name))) { freepool = pool; - // couldn't find the conference, create one + /* couldn't find the conference, create one */ } else { conference = conference_new(conf_name, profile, pool); @@ -2997,7 +3006,7 @@ goto done; } - // if the dialplan specified a pin, override the profile's value + /* if the dialplan specified a pin, override the profile's value */ if (dpin) { conference->pin = switch_core_strdup(conference->pool, dpin); } @@ -3012,10 +3021,10 @@ launch_conference_thread(conference); } - // if this is not an outbound call, deal with conference pins + /* if this is not an outbound call, deal with conference pins */ if (!switch_channel_test_flag(channel, CF_OUTBOUND) && conference->pin) { char pin_buf[80] = ""; - int pin_retries = 3; // XXX - this should be configurable - i'm too lazy to do it right now... + int pin_retries = 3; /* XXX - this should be configurable - i'm too lazy to do it right now... */ int pin_valid = 0; switch_status_t status = SWITCH_STATUS_SUCCESS; @@ -3024,11 +3033,11 @@ while(!pin_valid && pin_retries && status == SWITCH_STATUS_SUCCESS) { - // be friendly + /* be friendly */ if (conference->pin_sound) { conference_local_play_file(session, conference->pin_sound, 20, pin_buf, sizeof(pin_buf)); } - // wait for them if neccessary + /* wait for them if neccessary */ if (strlen(pin_buf) < strlen(conference->pin)) { char *buf = pin_buf + strlen(pin_buf); char term = '\0'; @@ -3042,10 +3051,10 @@ pin_valid = (status == SWITCH_STATUS_SUCCESS && strcmp(pin_buf, conference->pin) == 0); if (!pin_valid) { - // zero the collected pin + /* zero the collected pin */ memset(pin_buf,0,sizeof(pin_buf)); - // more friendliness + /* more friendliness */ if (conference->bad_pin_sound) { conference_local_play_file(session, conference->bad_pin_sound, 20, pin_buf, sizeof(pin_buf)); } @@ -3058,7 +3067,7 @@ } } - // don't allow more callers if the conference is locked, unless we invited them + /* don't allow more callers if the conference is locked, unless we invited them */ if (switch_test_flag(conference, CFLAG_LOCKED) && !switch_channel_test_flag(channel, CF_OUTBOUND)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Conference %s is locked.\n", conf_name); if (conference->locked_sound) { @@ -3076,14 +3085,14 @@ cxml = NULL; } - // if we're using "bridge:" make an outbound call and bridge it in + /* if we're using "bridge:" make an outbound call and bridge it in */ if (!switch_strlen_zero(bridgeto) && strcasecmp(bridgeto, "none")) { if (conference_outcall(conference, session, bridgeto, 60, NULL, NULL, NULL) != SWITCH_STATUS_SUCCESS) { goto done; } } else { - // if we're not using "bridge:" set the conference answered flag - // and this isn't an outbound channel, answer the call + /* if we're not using "bridge:" set the conference answered flag */ + /* and this isn't an outbound channel, answer the call */ if (!switch_channel_test_flag(channel, CF_OUTBOUND)) switch_set_flag(conference, CFLAG_ANSWERED); } @@ -3096,9 +3105,7 @@ if (switch_core_codec_init(&member.read_codec, "L16", NULL, - //conference->rate, read_codec->implementation->samples_per_second, - //conference->interval, read_codec->implementation->microseconds_per_frame / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, @@ -3135,9 +3142,7 @@ "L16", NULL, conference->rate, - //read_codec->implementation->samples_per_second, conference->interval, - //read_codec->implementation->microseconds_per_frame / 1000, 1, SWITCH_CODEC_FLAG_ENCODE | SWITCH_CODEC_FLAG_DECODE, NULL, @@ -3282,7 +3287,7 @@ /*.interface_name */ "conference", /*.desc */ "Conference module commands", /*.function */ conf_api_main, - /*.syntax */ // see switch_module_load + /*.syntax */ /* see switch_module_load, this is built on the fly */ /*.next */ }; @@ -3332,6 +3337,7 @@ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invaid Chat Interface [%s]!\n", proto); } + if ((p = strchr(to, '@'))) { switch_copy_string(name, to, ++p-to); } else { @@ -3354,12 +3360,15 @@ ci->chat_send(CONF_CHAT_PROTO, to, from, "", stream.data, NULL); switch_safe_free(stream.data); + + return SWITCH_STATUS_SUCCESS; } static const switch_chat_interface_t conference_chat_interface = { /*.name */ CONF_CHAT_PROTO, /*.chat_send */ chat_send, + }; static switch_loadable_module_interface_t conference_module_interface = { @@ -3389,12 +3398,12 @@ if (action_name != NULL) { char *sep = (action_name != NULL ? strchr(action_name,' ') : NULL); - // split the action from any parameters + /* split the action from any parameters */ if (sep != NULL) { *sep ='\0'; } - // find and execute the caller control handler + /* find and execute the caller control handler */ for(i=0,found=0; !found && i<CCFNTBL_QTY; i++) { found = (ccfntbl[i].action != CALLER_CONTROL_MENU && strcasecmp(ccfntbl[i].key,action_name) == 0); if (found) { @@ -3453,30 +3462,30 @@ switch_xml_t xml_menus = switch_xml_child(profile, "menus"); switch_xml_t xml_menu = (xml_menus != NULL ? switch_xml_find_child(xml_menus, "menu", "name", menu_name) : NULL); - // if we found the requested menu in our profile + /* if we found the requested menu in our profile */ if (xml_menu != NULL && xml_menu != NULL) { *ctx = (caller_control_menu_ctx_t *)switch_core_alloc(conference->pool,sizeof(caller_control_menu_ctx_t)); if (*ctx != NULL) { memset(*ctx,0,sizeof(caller_control_menu_ctx_t)); - // setup an xml parser context, and a menu stack context for the specified menu in our memory pool + /* setup an xml parser context, and a menu stack context for the specified menu in our memory pool */ status = switch_ivr_menu_stack_xml_init(&(*ctx)->xml_ctx, conference->pool); if (status == SWITCH_STATUS_SUCCESS) { (*ctx)->name = switch_core_strdup(conference->pool,menu_name); - // add our xml menu handler to the xml stack parser + /* add our xml menu handler to the xml stack parser */ status = switch_ivr_menu_stack_xml_add_custom((*ctx)->xml_ctx, "control", &conference_caller_control_menu_handler); if (status != SWITCH_STATUS_SUCCESS) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unable to add custom xml handler\n"); - // parse the xml stack to build the menu stack + /* parse the xml stack to build the menu stack */ status = switch_ivr_menu_stack_xml_build((*ctx)->xml_ctx, &(*ctx)->menu_stack, xml_menus, xml_menu, conference->timer_name); if (status != SWITCH_STATUS_SUCCESS) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unable to build xml menu stack\n"); /* - // instruct ivr menu to use our file play and tts routines + /* instruct ivr menu to use our file play and tts routines */ status = switch_ivr_menu_set_fileplay_callback((*ctx)->menu_stack, &ivr_menu_callback_play_file); if (status != SWITCH_STATUS_SUCCESS) switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "unable to set file play calback\n"); @@ -3540,7 +3549,7 @@ if (conference != NULL && profile != NULL && xml_controls != NULL) { switch_xml_t xml_kvp; - // parse the controls tree for caller control digit strings + /* parse the controls tree for caller control digit strings */ for (xml_kvp = switch_xml_child(xml_controls, "control"); xml_kvp; xml_kvp = xml_kvp->next) { char *key = (char *) switch_xml_attr(xml_kvp, "action"); char *val = (char *) switch_xml_attr(xml_kvp, "digits"); @@ -3549,9 +3558,9 @@ if(!switch_strlen_zero(key) && !switch_strlen_zero(val)) { int i; - // scan through all of the valid actions, and if found, - // set the new caller control action digit string, then - // stop scanning the table, and go to the next xml kvp. + /* scan through all of the valid actions, and if found, */ + /* set the new caller control action digit string, then */ + /* stop scanning the table, and go to the next xml kvp. */ for(i=0,status=SWITCH_STATUS_NOOP; i<CCFNTBL_QTY && status == SWITCH_STATUS_NOOP; i++) { if(strcasecmp(ccfntbl[i].key,key) == 0) { @@ -3628,13 +3637,13 @@ uint32_t rate = 8000, interval = 20; switch_status_t status; - // Validate the conference name + /* Validate the conference name */ if (switch_strlen_zero(name)) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid Record! no name.\n"); return NULL; } - // parse the profile tree for param values + /* parse the profile tree for param values */ for (xml_kvp = switch_xml_child(profile, "param"); xml_kvp; xml_kvp = xml_kvp->next) { char *var = (char *) switch_xml_attr_soft(xml_kvp, "name"); char *val = (char *) switch_xml_attr_soft(xml_kvp, "value"); @@ -3745,7 +3754,7 @@ return NULL; } - // initialize the conference object with settings from the specified profile + /* initialize the conference object with settings from the specified profile */ conference->pool = pool; conference->timer_name = switch_core_strdup(conference->pool, timer_name); conference->tts_engine = switch_core_strdup(conference->pool, tts_engine); @@ -3815,18 +3824,18 @@ conference->rate = rate; conference->interval = interval; - // caller control configuration chores + /* caller control configuration chores */ xml_controls = switch_xml_child(profile, "controls"); controls_set = (xml_controls != NULL ? (char *) switch_xml_attr_soft(xml_controls, "set") : NULL); - // if no controls specified in the config, assume all should be specified + /* if no controls specified in the config, assume all should be specified */ if (xml_controls == NULL) { status = conference_new_install_caller_controls_default(conference); } else if (xml_controls != NULL && controls_set != NULL && strcasecmp(controls_set,"none") != 0) { - // try to build caller control if the set has been specified and != "none" + /* try to build caller control if the set has been specified and != "none" */ if(switch_ivr_digit_stream_parser_new(conference->pool,&conference->dtmf_parser) == SWITCH_STATUS_SUCCESS) { - // map in the default control handler strings if specified + /* map in the default control handler strings if specified */ if (strcasecmp(controls_set,"default") == 0) { status = conference_new_install_caller_controls_default(conference); } else if (strcasecmp(controls_set,"custom") == 0) { @@ -3861,7 +3870,7 @@ memset(&globals, 0, sizeof(globals)); - // build api interface help ".syntax" field string + /* build api interface help ".syntax" field string */ p=strdup("list\n"); for (i=0; i<CONFFUNCAPISIZE; i++) { nl=strlen(conf_api_sub_commands[i].psyntax)+4; @@ -3876,14 +3885,14 @@ } } - // install api interface help ".syntax" field string + /* install api interface help ".syntax" field string */ if(p != NULL) conf_api_interface.syntax = p; /* Connect my internal structure to the blank pointer passed to me */ *module_interface = &conference_module_interface; - // create/register custom event message type + /* create/register custom event message type */ if (switch_event_reserve_subclass(CONF_EVENT_MAINT) != SWITCH_STATUS_SUCCESS) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!", CONF_EVENT_MAINT); return SWITCH_STATUS_TERM; @@ -3911,15 +3920,15 @@ if (globals.running) { - // signal all threads to shutdown + /* signal all threads to shutdown */ globals.running = 0; - // wait for all threads + /* wait for all threads */ while (globals.threads) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Waiting for %d threads\n", globals.threads); switch_yield(100000); } - // free api interface help ".syntax" field string + /* free api interface help ".syntax" field string */ if (conf_api_interface.syntax != NULL) free((char *)conf_api_interface.syntax); }
participants (1)
-
Freeswitch SVN