#ifndef KAZOO_EI_H #define KAZOO_EI_H #include #include #define MODNAME "mod_kazoo" #define BUNDLE "community" #define RELEASE "v1.5.0-1" #define VERSION "mod_kazoo v1.5.0-1 community" #define KZ_MAX_SEPARATE_STRINGS 10 #define HOSTNAME_MAX 1024 #define NODENAME_MAX 1024 typedef enum {KAZOO_FETCH_PROFILE, KAZOO_EVENT_PROFILE} kazoo_profile_type; typedef enum {ERLANG_TUPLE, ERLANG_MAP} kazoo_json_term; typedef struct ei_xml_agent_s ei_xml_agent_t; typedef ei_xml_agent_t *ei_xml_agent_ptr; typedef struct kazoo_event kazoo_event_t; typedef kazoo_event_t *kazoo_event_ptr; typedef struct kazoo_event_profile kazoo_event_profile_t; typedef kazoo_event_profile_t *kazoo_event_profile_ptr; typedef struct kazoo_fetch_profile kazoo_fetch_profile_t; typedef kazoo_fetch_profile_t *kazoo_fetch_profile_ptr; typedef struct kazoo_config_t kazoo_config; typedef kazoo_config *kazoo_config_ptr; #include "kazoo_fields.h" #include "kazoo_config.h" struct ei_send_msg_s { ei_x_buff buf; erlang_pid pid; }; typedef struct ei_send_msg_s ei_send_msg_t; struct ei_received_msg_s { ei_x_buff buf; erlang_msg msg; }; typedef struct ei_received_msg_s ei_received_msg_t; typedef struct ei_event_stream_s ei_event_stream_t; typedef struct ei_node_s ei_node_t; struct ei_event_binding_s { char id[SWITCH_UUID_FORMATTED_LENGTH + 1]; switch_event_node_t *node; switch_event_types_t type; const char *subclass_name; ei_event_stream_t* stream; kazoo_event_ptr event; struct ei_event_binding_s *next; }; typedef struct ei_event_binding_s ei_event_binding_t; struct ei_event_stream_s { switch_memory_pool_t *pool; ei_event_binding_t *bindings; switch_queue_t *queue; switch_socket_t *acceptor; switch_pollset_t *pollset; switch_pollfd_t *pollfd; switch_socket_t *socket; switch_mutex_t *socket_mutex; switch_bool_t connected; switch_time_t connected_time; char remote_ip[48]; uint16_t remote_port; char local_ip[48]; uint16_t local_port; erlang_pid pid; uint32_t flags; ei_node_t *node; short event_stream_framing; short event_stream_keepalive; switch_interval_time_t queue_timeout; struct ei_event_stream_s *next; }; struct ei_node_s { int nodefd; switch_atomic_t pending_bgapi; switch_atomic_t receive_handlers; switch_memory_pool_t *pool; ei_event_stream_t *event_streams; switch_mutex_t *event_streams_mutex; switch_queue_t *send_msgs; switch_queue_t *received_msgs; char *peer_nodename; switch_time_t created_time; switch_socket_t *socket; char remote_ip[48]; uint16_t remote_port; char local_ip[48]; uint16_t local_port; uint32_t flags; int legacy; short event_stream_framing; short event_stream_keepalive; switch_interval_time_t event_stream_queue_timeout; switch_interval_time_t receiver_queue_timeout; switch_interval_time_t sender_queue_timeout; struct ei_node_s *next; }; struct xml_fetch_reply_s { char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1]; char *xml_str; struct xml_fetch_reply_s *next; }; typedef struct xml_fetch_reply_s xml_fetch_reply_t; struct fetch_handler_s { erlang_pid pid; struct fetch_handler_s *next; }; typedef struct fetch_handler_s fetch_handler_t; struct ei_xml_client_s { ei_node_t *ei_node; fetch_handler_t *fetch_handlers; struct ei_xml_client_s *next; }; typedef struct ei_xml_client_s ei_xml_client_t; struct ei_xml_agent_s { switch_memory_pool_t *pool; switch_xml_section_t section; switch_thread_rwlock_t *lock; ei_xml_client_t *clients; switch_mutex_t *current_client_mutex; ei_xml_client_t *current_client; switch_mutex_t *replies_mutex; switch_thread_cond_t *new_reply; xml_fetch_reply_t *replies; kazoo_fetch_profile_ptr profile; }; struct kz_globals_s { switch_memory_pool_t *pool; switch_atomic_t threads; switch_socket_t *acceptor; struct ei_cnode_s ei_cnode; switch_thread_rwlock_t *ei_nodes_lock; ei_node_t *ei_nodes; switch_xml_binding_t *config_fetch_binding; switch_xml_binding_t *directory_fetch_binding; switch_xml_binding_t *dialplan_fetch_binding; switch_xml_binding_t *channels_fetch_binding; switch_xml_binding_t *languages_fetch_binding; switch_xml_binding_t *chatplan_fetch_binding; switch_hash_t *event_filter; int epmdfd; int node_worker_threads; switch_bool_t nat_map; switch_bool_t ei_shortname; int ei_compat_rel; char *ip; char *hostname; struct hostent* hostname_ent; char *ei_cookie; char *ei_nodename; uint32_t flags; int send_all_headers; int send_all_private_headers; int connection_timeout; int ei_receive_timeout; switch_interval_time_t node_sender_queue_timeout; switch_interval_time_t node_receiver_queue_timeout; int receive_msg_preallocate; int event_stream_preallocate; int send_msg_batch; short event_stream_framing; short event_stream_keepalive; switch_interval_time_t event_stream_queue_timeout; switch_port_t port; int config_fetched; int io_fault_tolerance; switch_interval_time_t io_fault_tolerance_sleep; kazoo_event_profile_ptr events; kazoo_config_ptr definitions; kazoo_config_ptr event_handlers; kazoo_config_ptr fetch_handlers; kazoo_json_term json_encoding; char **profile_vars_prefixes; char **kazoo_var_prefixes; int legacy_events; uint8_t tweaks[KZ_TWEAK_MAX]; switch_bool_t expand_headers_on_fetch; switch_interval_time_t delay_before_initial_fetch; }; typedef struct kz_globals_s kz_globals_t; extern kz_globals_t kazoo_globals; /* kazoo_event_stream.c */ ei_event_stream_t *find_event_stream(ei_event_stream_t *event_streams, const erlang_pid *from); //ei_event_stream_t *new_event_stream(ei_event_stream_t **event_streams, const erlang_pid *from); ei_event_stream_t *new_event_stream(ei_node_t *ei_node, const erlang_pid *from); switch_status_t remove_event_stream(ei_event_stream_t **event_streams, const erlang_pid *from); switch_status_t remove_event_streams(ei_event_stream_t **event_streams); unsigned long get_stream_port(const ei_event_stream_t *event_stream); switch_status_t add_event_binding(ei_event_stream_t *event_stream, const char *event_name); //switch_status_t add_event_binding(ei_event_stream_t *event_stream, const switch_event_types_t event_type, const char *subclass_name); switch_status_t remove_event_binding(ei_event_stream_t *event_stream, const switch_event_types_t event_type, const char *subclass_name); switch_status_t remove_event_bindings(ei_event_stream_t *event_stream); /* kazoo_node.c */ switch_status_t new_kazoo_node(int nodefd, ErlConnect *conn); /* kazoo_ei_utils.c */ void close_socket(switch_socket_t **sock); void close_socketfd(int *sockfd); switch_socket_t *create_socket_with_port(switch_memory_pool_t *pool, switch_port_t port); switch_socket_t *create_socket(switch_memory_pool_t *pool); switch_status_t create_ei_cnode(const char *ip_addr, const char *name, struct ei_cnode_s *ei_cnode); switch_status_t ei_compare_pids(const erlang_pid *pid1, const erlang_pid *pid2); void ei_encode_switch_event_headers(ei_x_buff *ebuf, switch_event_t *event); void ei_encode_switch_event_headers_2(ei_x_buff *ebuf, switch_event_t *event, int decode); void ei_encode_json(ei_x_buff *ebuf, cJSON *JObj); void ei_link(ei_node_t *ei_node, erlang_pid * from, erlang_pid * to); void ei_encode_switch_event(ei_x_buff * ebuf, switch_event_t *event); int ei_helper_send(ei_node_t *ei_node, erlang_pid* to, ei_x_buff *buf); int ei_decode_atom_safe(char *buf, int *index, char *dst); int ei_decode_string_or_binary_limited(char *buf, int *index, int maxsize, char *dst); int ei_decode_string_or_binary(char *buf, int *index, char **dst); switch_status_t create_acceptor(); switch_hash_t *create_default_filter(); void kz_erl_init(); void kz_erl_shutdown(); SWITCH_DECLARE(switch_status_t) ei_queue_pop(switch_queue_t *queue, void **data, switch_interval_time_t timeout); void fetch_config(); switch_status_t kazoo_load_config(); void kazoo_destroy_config(); void kz_set_hostname(); #define _ei_x_encode_string(buf, string) { ei_x_encode_binary(buf, string, strlen(string)); } /* kazoo_fetch_agent.c */ switch_status_t bind_fetch_agents(); switch_status_t unbind_fetch_agents(); switch_status_t remove_xml_clients(ei_node_t *ei_node); switch_status_t add_fetch_handler(ei_node_t *ei_node, erlang_pid *from, switch_xml_binding_t *binding); switch_status_t remove_fetch_handlers(ei_node_t *ei_node, erlang_pid *from); switch_status_t fetch_reply(char *uuid_str, char *xml_str, switch_xml_binding_t *binding); switch_status_t handle_api_command_streams(ei_node_t *ei_node, switch_stream_handle_t *stream); void bind_event_profiles(kazoo_event_ptr event); void rebind_fetch_profiles(kazoo_config_ptr fetch_handlers); switch_status_t kazoo_config_handlers(switch_xml_t cfg); /* runtime */ SWITCH_MODULE_RUNTIME_FUNCTION(mod_kazoo_runtime); #define kz_test_tweak(flag) (kazoo_globals.tweaks[flag] ? 1 : 0) #define kz_set_tweak(flag) kazoo_globals.tweaks[flag] = 1 #define kz_clear_tweak(flag) kazoo_globals.tweaks[flag] = 0 #endif /* KAZOO_EI_H */ /* For Emacs: * Local Variables: * mode:c * indent-tabs-mode:t * tab-width:4 * c-basic-offset:4 * End: * For VIM: * vim:set softtabstop=4 shiftwidth=4 tabstop=4: */