Core Library

Collaboration diagram for Core Library:

Modules

 Bitpacking
 Buffer Routines
 Caller Identity / Dialplan
 Channel Functions
 Config File Parser
 Media Bugs
 Port Allocation
 Startup/Shutdown
 Read/Write Locking
 State Handlers
 Memory Pooling/Allocation
 Session Creation / Management
 Hash Functions
 Timer Functions
 Codec Functions
 Database Functions
 File Functions
 ASR/TTS Functions
 Directory Service Functions
 Misc
 Eventing Engine
 IVR Library
 LIMIT code
 Loadable Module Functions
 Logger Routines
 NAT code
 Audio Resample Functions
 RTP (RealTime Transport Protocol)
 Scheduler
 STUN code
 XML Library Functions

Functions

void switch_core_memory_pool_tag (switch_memory_pool_t *pool, const char *tag)
switch_status_t switch_core_perform_new_memory_pool (_Out_ switch_memory_pool_t **pool, _In_z_ const char *file, _In_z_ const char *func, _In_ int line)
switch_core_session_tswitch_core_session_request_xml (switch_endpoint_interface_t *endpoint_interface, switch_memory_pool_t **pool, switch_xml_t xml)


Function Documentation

void switch_core_memory_pool_tag ( switch_memory_pool_t pool,
const char *  tag 
)

Definition at line 320 of file switch_core_memory.c.

Referenced by switch_core_session_thread().

00321 {
00322         apr_pool_tag(pool, tag);
00323 }

switch_status_t switch_core_perform_new_memory_pool ( _Out_ switch_memory_pool_t **  pool,
_In_z_ const char *  file,
_In_z_ const char *  func,
_In_ int  line 
)

switch_core_session_t* switch_core_session_request_xml ( switch_endpoint_interface_t endpoint_interface,
switch_memory_pool_t **  pool,
switch_xml_t  xml 
)

Definition at line 1589 of file switch_core_session.c.

References CC_FLAG_MAX, CF_ACCEPT_CNG, CF_ATTENDED_TRANSFER, CF_BLOCK_BROADCAST_UNTIL_MEDIA, CF_BLOCK_STATE, CF_BREAK, CF_BRIDGE_NOWRITE, CF_BRIDGED, CF_BROADCAST, CF_BROADCAST_DROP_MEDIA, CF_BYPASS_MEDIA_AFTER_BRIDGE, CF_CNG_PLC, CF_CONSUME_ON_ORIGINATE, CF_CONTROLLED, CF_DIALPLAN, CF_DISABLE_RINGBACK, CF_DIVERT_EVENTS, CF_EARLY_HANGUP, CF_EVENT_LOCK, CF_EVENT_LOCK_PRI, CF_EVENT_PARSE, CF_FLAG_MAX, CF_FS_RTP, CF_GEN_RINGBACK, CF_HOLD, CF_INNER_BRIDGE, CF_JITTERBUFFER, CF_JITTERBUFFER_PLC, CF_LAZY_ATTENDED_TRANSFER, CF_LEG_HOLDING, CF_MEDIA_ACK, CF_MEDIA_BRIDGE_TTL, CF_MEDIA_SET, CF_NOT_READY, CF_ORIGINATING, CF_ORIGINATOR, CF_PARK, CF_PASSTHRU_PTIME_MISMATCH, CF_PAUSE_BUGS, CF_RECOVERED, CF_REDIRECT, CF_REPORTING, CF_REQ_MEDIA, CF_RESET, CF_SERVICE, CF_SIGNAL_BRIDGE_TTL, CF_SIGNAL_DATA, CF_SIMPLIFY, CF_STOP_BROADCAST, CF_SUSPEND, CF_TAGGED, CF_THREAD_SLEEPING, CF_TIMESTAMP_SET, CF_TRANSFER, CF_UNICAST, CF_WINNER, CF_XFER_ZOMBIE, switch_xml::child, switch_xml::name, parse_array(), switch_xml::sibling, SOF_NO_LIMITS, SWITCH_CALL_DIRECTION_INBOUND, SWITCH_CALL_DIRECTION_OUTBOUND, switch_channel_set_cap_value(), switch_channel_set_flag_value(), switch_channel_set_name(), switch_channel_set_variable, switch_core_session_get_channel(), switch_core_session_request_uuid(), switch_url_decode(), switch_xml_child(), switch_xml::txt, and xml_find_var().

01591 {
01592         switch_core_session_t *session;
01593         switch_channel_t *channel;
01594         switch_xml_t tag, tag2, tag3, vars, callflow;
01595         switch_call_direction_t direction = SWITCH_CALL_DIRECTION_OUTBOUND;
01596         char *flag_str = NULL, *cap_str = NULL, *direction_s = NULL, *uuid = NULL;
01597         uint32_t flags[CF_FLAG_MAX] = { 0 };
01598         uint32_t caps[CC_FLAG_MAX] = { 0 };
01599         int i;
01600 
01601         vars = switch_xml_child(xml, "variables");
01602         uuid = xml_find_var(vars, "uuid");
01603 
01604         if ((tag = switch_xml_child(xml, "channel_data"))) {
01605                 direction_s = xml_find_var(tag, "direction");
01606                 direction = !strcmp(direction_s, "outbound") ? SWITCH_CALL_DIRECTION_OUTBOUND : SWITCH_CALL_DIRECTION_INBOUND;
01607                 flag_str = xml_find_var(tag, "flags");
01608                 cap_str = xml_find_var(tag, "caps");
01609         }
01610 
01611         parse_array(flag_str, flags, CF_FLAG_MAX);
01612         parse_array(cap_str, caps, CC_FLAG_MAX);
01613 
01614         flags[CF_TRANSFER] = 0;
01615         flags[CF_ACCEPT_CNG] = 0;
01616         flags[CF_REDIRECT] = 0;
01617         flags[CF_BRIDGED] = 0;
01618         flags[CF_HOLD] = 0;
01619         flags[CF_SERVICE] = 0;
01620         flags[CF_TAGGED] = 0;
01621         flags[CF_WINNER] = 0;
01622         flags[CF_CONTROLLED] = 0;
01623         flags[CF_SUSPEND] = 0;
01624         flags[CF_EVENT_PARSE] = 0;
01625         flags[CF_GEN_RINGBACK] = 0;
01626         flags[CF_BREAK] = 0;
01627         flags[CF_BROADCAST] = 0;
01628         flags[CF_UNICAST] = 0;
01629         flags[CF_EVENT_LOCK] = 0;
01630         flags[CF_EVENT_LOCK_PRI] = 0;
01631         flags[CF_RESET] = 0;
01632         flags[CF_ORIGINATING] = 0;
01633         flags[CF_STOP_BROADCAST] = 0;
01634         flags[CF_INNER_BRIDGE] = 0;
01635         flags[CF_REQ_MEDIA] = 0;
01636         flags[CF_PAUSE_BUGS] = 0;
01637         flags[CF_DIVERT_EVENTS] = 0;
01638         flags[CF_BLOCK_STATE] = 0;
01639         flags[CF_FS_RTP] = 0;
01640         flags[CF_REPORTING] = 0;
01641         flags[CF_PARK] = 0;
01642         flags[CF_TIMESTAMP_SET] = 0;
01643         flags[CF_ORIGINATOR] = 0;
01644         flags[CF_XFER_ZOMBIE] = 0;
01645         flags[CF_MEDIA_ACK] = 0;
01646         flags[CF_THREAD_SLEEPING] = 0;
01647         flags[CF_DISABLE_RINGBACK] = 0;
01648         flags[CF_NOT_READY] = 0;
01649         flags[CF_SIGNAL_BRIDGE_TTL] = 0;
01650         flags[CF_MEDIA_BRIDGE_TTL] = 0;
01651         flags[CF_BYPASS_MEDIA_AFTER_BRIDGE] = 0;
01652         flags[CF_LEG_HOLDING] = 0;
01653         flags[CF_BROADCAST_DROP_MEDIA] = 0;
01654         flags[CF_EARLY_HANGUP] = 0;
01655         flags[CF_MEDIA_SET] = 0;
01656         flags[CF_CONSUME_ON_ORIGINATE] = 0;
01657         flags[CF_PASSTHRU_PTIME_MISMATCH] = 0;
01658         flags[CF_BRIDGE_NOWRITE] = 0;
01659         flags[CF_RECOVERED] = 0;
01660         flags[CF_JITTERBUFFER] = 0;
01661         flags[CF_JITTERBUFFER_PLC] = 0;
01662         flags[CF_DIALPLAN] = 0;
01663         flags[CF_BLOCK_BROADCAST_UNTIL_MEDIA] = 0;
01664         flags[CF_CNG_PLC] = 0;
01665         flags[CF_ATTENDED_TRANSFER] = 0;
01666         flags[CF_LAZY_ATTENDED_TRANSFER] = 0;
01667         flags[CF_SIGNAL_DATA] = 0;
01668         flags[CF_SIMPLIFY] = 0;
01669 
01670 
01671         if (!(session = switch_core_session_request_uuid(endpoint_interface, direction, SOF_NO_LIMITS, pool, uuid))) {
01672                 return NULL;
01673         }
01674 
01675         channel = switch_core_session_get_channel(session);
01676 
01677         for (i = 0; i < CF_FLAG_MAX; i++) {
01678                 if (flags[i]) {
01679                         switch_channel_set_flag_value(channel, i, flags[i]);
01680                 }
01681         }
01682 
01683         for (i = 0; i < CC_FLAG_MAX; i++) {
01684                 if (caps[i]) {
01685                         switch_channel_set_cap_value(channel, i, caps[i]);
01686                 }
01687         }
01688 
01689         if ((tag2 = switch_xml_child(xml, "variables"))) {
01690                 for (tag = tag2->child; tag; tag = tag->sibling) {
01691                         if (tag->name && tag->txt) {
01692                                 char *p = strdup(tag->txt);
01693                                 char *val = p;
01694                                 switch_url_decode(val);
01695                                 switch_channel_set_variable(channel, tag->name, val);
01696                                 if (!strcasecmp(tag->name, "channel_name")) {
01697                                         switch_channel_set_name(channel, val);
01698                                 }
01699                                 free(p);
01700                         }
01701                 }
01702         }
01703         
01704         if ((callflow = switch_xml_child(xml, "callflow"))) {
01705                 if ((tag2 = switch_xml_child(callflow, "caller_profile"))) {
01706                         switch_caller_profile_t *caller_profile;
01707                         char *tmp;
01708 
01709                         caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
01710                                                                                                            xml_find_var(tag2, "username"),
01711                                                                                                            xml_find_var(tag2, "dialplan"),
01712                                                                                                            xml_find_var(tag2, "caller_id_name"),
01713                                                                                                            xml_find_var(tag2, "caller_id_number"),
01714                                                                                                            xml_find_var(tag2, "network_addr"),
01715                                                                                                            xml_find_var(tag2, "ani"),
01716                                                                                                            xml_find_var(tag2, "aniii"),
01717                                                                                                            xml_find_var(tag2, "rdnis"),
01718                                                                                                            xml_find_var(tag2, "source"),
01719                                                                                                            xml_find_var(tag2, "context"), xml_find_var(tag2, "destination_number"));
01720 
01721                         if ((tmp = xml_find_var(tag2, "callee_id_name"))) {
01722                                 caller_profile->callee_id_name = switch_core_session_strdup(session, tmp);
01723                         }
01724 
01725                         if ((tmp = xml_find_var(tag2, "callee_id_number"))) {
01726                                 caller_profile->callee_id_number = switch_core_session_strdup(session, tmp);
01727                         }
01728 
01729                         if ((tag3 = switch_xml_child(callflow, "times"))) {
01730                                 caller_profile->times = (switch_channel_timetable_t *) switch_core_session_alloc(session, sizeof(*caller_profile->times));
01731 
01732                                 caller_profile->times->resurrected = switch_time_now();
01733 
01734                                 for (tag3 = tag3->child; tag3; tag3 = tag3->sibling) {
01735                                         int64_t v;
01736 
01737                                         if (tag3->name && tag3->txt) {
01738                                                 v = atoll(tag3->txt);
01739                                                 if (!strcmp(tag3->name, "created_time")) {
01740                                                         caller_profile->times->created = v;
01741                                                 } else if (!strcmp(tag3->name, "profile_created_time")) {
01742                                                         caller_profile->times->profile_created = v;
01743                                                 } else if (!strcmp(tag3->name, "progress_time")) {
01744                                                         caller_profile->times->progress = v;
01745                                                 } else if (!strcmp(tag3->name, "progress_media_time")) {
01746                                                         caller_profile->times->progress_media = v;
01747                                                 } else if (!strcmp(tag3->name, "answered_time")) {
01748                                                         caller_profile->times->answered = v;
01749                                                 } else if (!strcmp(tag3->name, "hangup_time")) {
01750                                                         caller_profile->times->hungup = v;
01751                                                 } else if (!strcmp(tag3->name, "transfer_time")) {
01752                                                         caller_profile->times->transferred = v;
01753                                                 }
01754                                         }
01755 
01756                                 }
01757                         }
01758 
01759                         switch_channel_set_caller_profile(channel, caller_profile);
01760                         if ((tag = switch_xml_child(tag2, "originator")) && (tag = tag->child)) {
01761                                 caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
01762                                                                                                                    xml_find_var(tag, "username"),
01763                                                                                                                    xml_find_var(tag, "dialplan"),
01764                                                                                                                    xml_find_var(tag, "caller_id_name"),
01765                                                                                                                    xml_find_var(tag, "caller_id_number"),
01766                                                                                                                    xml_find_var(tag, "network_addr"),
01767                                                                                                                    xml_find_var(tag, "ani"),
01768                                                                                                                    xml_find_var(tag, "aniii"),
01769                                                                                                                    xml_find_var(tag, "rdnis"),
01770                                                                                                                    xml_find_var(tag, "source"),
01771                                                                                                                    xml_find_var(tag, "context"), xml_find_var(tag, "destination_number"));
01772 
01773                                 switch_channel_set_originator_caller_profile(channel, caller_profile);
01774                         }
01775 
01776                         if ((tag = switch_xml_child(tag2, "originatee")) && (tag = tag->child)) {
01777                                 caller_profile = switch_caller_profile_new(switch_core_session_get_pool(session),
01778                                                                                                                    xml_find_var(tag, "username"),
01779                                                                                                                    xml_find_var(tag, "dialplan"),
01780                                                                                                                    xml_find_var(tag, "caller_id_name"),
01781                                                                                                                    xml_find_var(tag, "caller_id_number"),
01782                                                                                                                    xml_find_var(tag, "network_addr"),
01783                                                                                                                    xml_find_var(tag, "ani"),
01784                                                                                                                    xml_find_var(tag, "aniii"),
01785                                                                                                                    xml_find_var(tag, "rdnis"),
01786                                                                                                                    xml_find_var(tag, "source"),
01787                                                                                                                    xml_find_var(tag, "context"), xml_find_var(tag, "destination_number"));
01788 
01789                                 switch_channel_set_originatee_caller_profile(channel, caller_profile);
01790                         }
01791 
01792                 }
01793 
01794 
01795                 switch_channel_set_flag(channel, CF_RECOVERED);
01796         }
01797 
01798 
01799         if (!channel || !switch_channel_get_caller_profile(channel)) {
01800                 if (session) {
01801                         switch_core_session_destroy(&session);
01802                 }
01803         }
01804 
01805 
01806         return session;
01807 }


Generated on Wed May 16 04:00:18 2012 for FreeSWITCH API Documentation by  doxygen 1.4.7