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_t * | switch_core_session_request_xml (switch_endpoint_interface_t *endpoint_interface, switch_memory_pool_t **pool, switch_xml_t xml) |
| 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 }
1.4.7