#include "asterisk.h"
#include "asterisk/channel.h"
#include "asterisk/linkedlists.h"
#include "asterisk/framehook.h"
#include "asterisk/frame.h"
Go to the source code of this file.
Data Structures | |
struct | ast_framehook |
struct | ast_framehook_list |
Functions | |
int | ast_framehook_attach (struct ast_channel *chan, struct ast_framehook_interface *i) |
Attach an framehook onto a channel for frame interception. | |
int | ast_framehook_detach (struct ast_channel *chan, int id) |
Detach an framehook from a channel. | |
int | ast_framehook_list_destroy (struct ast_channel *chan) |
This is used by the channel API to detach and destroy all framehooks on a channel during channel destruction. | |
int | ast_framehook_list_is_empty (struct ast_framehook_list *framehooks) |
Determine if an framehook list is empty or not. | |
ast_frame * | ast_framehook_list_read_event (struct ast_framehook_list *framehooks, struct ast_frame *frame) |
This is used by the channel API push a frame read event to a channel's framehook list. | |
ast_frame * | ast_framehook_list_write_event (struct ast_framehook_list *framehooks, struct ast_frame *frame) |
This is used by the channel API push a frame write event to a channel's framehook list. | |
static void | framehook_detach_and_destroy (struct ast_framehook *framehook) |
static struct ast_frame * | framehook_list_push_event (struct ast_framehook_list *framehooks, struct ast_frame *frame, enum ast_framehook_event event) |
Definition in file framehook.c.
int ast_framehook_attach | ( | struct ast_channel * | chan, | |
struct ast_framehook_interface * | i | |||
) |
Attach an framehook onto a channel for frame interception.
ast_channel,The | channel to attach the hook on to. | |
framehook | interface, The framehook's callback functions and stored data. |
On | success, positive id representing this hook on the channel | |
On | failure, -1 |
Definition at line 90 of file framehook.c.
References ast_calloc, AST_FRAMEHOOK_EVENT_ATTACHED, AST_FRAMEHOOK_INTERFACE_VERSION, ast_free, ast_frfree, AST_LIST_INSERT_TAIL, ast_log(), ast_framehook::chan, ast_framehook_interface::event_cb, ast_channel::framehooks, ast_framehook::i, ast_framehook_list::id_count, ast_framehook::list, ast_framehook_list::list, LOG_ERROR, and ast_framehook_interface::version.
Referenced by frame_trace_helper().
00091 { 00092 struct ast_framehook *framehook; 00093 struct ast_frame *frame; 00094 if (i->version != AST_FRAMEHOOK_INTERFACE_VERSION) { 00095 ast_log(LOG_ERROR, "Version '%hu' of framehook interface not what we compiled against (%hu)\n", 00096 i->version, AST_FRAMEHOOK_INTERFACE_VERSION); 00097 return -1; 00098 } 00099 if (!i->event_cb || !(framehook = ast_calloc(1, sizeof(*framehook)))) { 00100 return -1; 00101 } 00102 framehook->i = *i; 00103 framehook->chan = chan; 00104 00105 /* create the framehook list if it didn't already exist */ 00106 if (!chan->framehooks && !(chan->framehooks = ast_calloc(1, sizeof(*chan->framehooks)))) { 00107 ast_free(framehook); 00108 return -1; 00109 } 00110 00111 framehook->id = ++chan->framehooks->id_count; 00112 AST_LIST_INSERT_TAIL(&chan->framehooks->list, framehook, list); 00113 00114 /* Tell the event callback we're live and rocking */ 00115 frame = framehook->i.event_cb(framehook->chan, NULL, AST_FRAMEHOOK_EVENT_ATTACHED, framehook->i.data); 00116 00117 /* Never assume anything about this function. If you can return a frame during 00118 * the attached event, then assume someone will. */ 00119 if (frame) { 00120 ast_frfree(frame); 00121 } 00122 00123 return framehook->id; 00124 }
int ast_framehook_detach | ( | struct ast_channel * | chan, | |
int | framehook_id | |||
) |
Detach an framehook from a channel.
The | channel the framehook is attached to | |
The | framehook's id |
0 | success | |
-1 | framehook did not exist on the channel. This means the framehook either never existed on the channel, or was already detached. |
Definition at line 126 of file framehook.c.
References AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_framehook::chan, ast_framehook::detach_and_destroy_me, ast_channel::framehooks, ast_framehook::id, ast_framehook::list, and ast_framehook_list::list.
Referenced by frame_trace_helper().
00127 { 00128 struct ast_framehook *framehook; 00129 int res = -1; 00130 00131 if (!chan->framehooks) { 00132 return res; 00133 } 00134 00135 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->framehooks->list, framehook, list) { 00136 if (framehook->id == id) { 00137 /* we mark for detachment rather than doing explicitly here because 00138 * it needs to be safe for this function to be called within the 00139 * event callback. If we allowed the hook to actually be destroyed 00140 * immediately here, the event callback would crash on exit. */ 00141 framehook->detach_and_destroy_me = 1; 00142 res = 0; 00143 break; 00144 } 00145 } 00146 AST_LIST_TRAVERSE_SAFE_END; 00147 00148 return res; 00149 }
int ast_framehook_list_destroy | ( | struct ast_channel * | chan | ) |
This is used by the channel API to detach and destroy all framehooks on a channel during channel destruction.
channel | containing the framehook list to destroy. |
0 | success | |
-1 | failure |
Definition at line 151 of file framehook.c.
References ast_free, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_framehook::chan, framehook_detach_and_destroy(), ast_channel::framehooks, ast_framehook::list, and ast_framehook_list::list.
Referenced by ast_hangup().
00152 { 00153 struct ast_framehook *framehook; 00154 00155 if (!chan->framehooks) { 00156 return 0; 00157 } 00158 AST_LIST_TRAVERSE_SAFE_BEGIN(&chan->framehooks->list, framehook, list) { 00159 AST_LIST_REMOVE_CURRENT(list); 00160 framehook_detach_and_destroy(framehook); 00161 } 00162 AST_LIST_TRAVERSE_SAFE_END; 00163 ast_free(chan->framehooks); 00164 chan->framehooks = NULL; 00165 return 0; 00166 }
int ast_framehook_list_is_empty | ( | struct ast_framehook_list * | framehooks | ) |
Determine if an framehook list is empty or not.
the | framehook list |
0,not | empty | |
1,is | empty |
Definition at line 168 of file framehook.c.
References AST_LIST_EMPTY, and ast_framehook_list::list.
Referenced by ast_channel_bridge(), ast_indicate_data(), local_bridge_loop(), and remote_bridge_loop().
00169 { 00170 if (!framehooks) { 00171 return 1; 00172 } 00173 return AST_LIST_EMPTY(&framehooks->list) ? 1 : 0; 00174 }
struct ast_frame* ast_framehook_list_read_event | ( | struct ast_framehook_list * | framehooks, | |
struct ast_frame * | frame | |||
) |
This is used by the channel API push a frame read event to a channel's framehook list.
framehook | list to push event to. | |
frame | being pushed to the framehook list. |
Definition at line 181 of file framehook.c.
References AST_FRAMEHOOK_EVENT_READ, and framehook_list_push_event().
Referenced by __ast_read().
00182 { 00183 return framehook_list_push_event(framehooks, frame, AST_FRAMEHOOK_EVENT_READ); 00184 }
struct ast_frame* ast_framehook_list_write_event | ( | struct ast_framehook_list * | framehooks, | |
struct ast_frame * | frame | |||
) |
This is used by the channel API push a frame write event to a channel's framehook list.
framehook | list to push event to. | |
frame | being pushed to the framehook list. |
Definition at line 176 of file framehook.c.
References AST_FRAMEHOOK_EVENT_WRITE, and framehook_list_push_event().
Referenced by ast_indicate_data(), and ast_write().
00177 { 00178 return framehook_list_push_event(framehooks, frame, AST_FRAMEHOOK_EVENT_WRITE); 00179 }
static void framehook_detach_and_destroy | ( | struct ast_framehook * | framehook | ) | [static] |
Definition at line 52 of file framehook.c.
References AST_FRAMEHOOK_EVENT_DETACHED, ast_free, and ast_frfree.
Referenced by ast_framehook_list_destroy(), and framehook_list_push_event().
00053 { 00054 struct ast_frame *frame; 00055 frame = framehook->i.event_cb(framehook->chan, NULL, AST_FRAMEHOOK_EVENT_DETACHED, framehook->i.data); 00056 /* never assume anything about this function. If you can return a frame during 00057 * the detached event, then assume someone will. */ 00058 if (frame) { 00059 ast_frfree(frame); 00060 } 00061 framehook->chan = NULL; 00062 00063 if (framehook->i.destroy_cb) { 00064 framehook->i.destroy_cb(framehook->i.data); 00065 } 00066 ast_free(framehook); 00067 }
static struct ast_frame* framehook_list_push_event | ( | struct ast_framehook_list * | framehooks, | |
struct ast_frame * | frame, | |||
enum ast_framehook_event | event | |||
) | [static] |
Definition at line 69 of file framehook.c.
References AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, ast_framehook::chan, ast_framehook_interface::data, ast_framehook::detach_and_destroy_me, ast_framehook_interface::event_cb, framehook_detach_and_destroy(), ast_framehook::i, ast_framehook::list, and ast_framehook_list::list.
Referenced by ast_framehook_list_read_event(), and ast_framehook_list_write_event().
00070 { 00071 struct ast_framehook *framehook; 00072 00073 if (!framehooks) { 00074 return frame; 00075 } 00076 00077 AST_LIST_TRAVERSE_SAFE_BEGIN(&framehooks->list, framehook, list) { 00078 if (framehook->detach_and_destroy_me) { 00079 /* this guy is signaled for destruction */ 00080 AST_LIST_REMOVE_CURRENT(list); 00081 framehook_detach_and_destroy(framehook); 00082 } else { 00083 frame = framehook->i.event_cb(framehook->chan, frame, event, framehook->i.data); 00084 } 00085 } 00086 AST_LIST_TRAVERSE_SAFE_END; 00087 return frame; 00088 }