Module: sip-router Branch: master Commit: 86e03df9b1dbac5be70747bcd9f57a97fe5256c7 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=86e03df9...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sat Nov 27 00:04:17 2010 +0100
dispatcher(k): exported inter-module API
---
modules_k/dispatcher/api.h | 75 +++++++++++++++++++++++++++++++++++++ modules_k/dispatcher/dispatch.c | 13 ++++++ modules_k/dispatcher/dispatcher.c | 3 + 3 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/modules_k/dispatcher/api.h b/modules_k/dispatcher/api.h new file mode 100644 index 0000000..7171b0c --- /dev/null +++ b/modules_k/dispatcher/api.h @@ -0,0 +1,75 @@ +/** + * $Id$ + * + * dispatcher module + * + * Copyright (C) 2004-2006 FhG Fokus + * + * This file is part of Kamailio, a free SIP server. + * + * Kamailio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version + * + * Kamailio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! \file + * \ingroup dispatcher + * \brief Dispatcher :: API + */ + +#ifndef _DISPATCHER_API_H_ +#define _DISPATCHER_API_H_ + +#include "../../sr_module.h" + +typedef int (*ds_select_dst_f)(struct sip_msg *msg, int set, + int alg, int mode); +typedef int (*ds_next_dst_f)(struct sip_msg *msg, int mode); +typedef int (*ds_mark_dst_f)(struct sip_msg *msg, int mode); + +typedef int (*ds_is_from_list_f)(struct sip_msg *_m, int group); + +typedef struct dispatcher_api { + ds_select_dst_f select; + ds_next_dst_f next; + ds_mark_dst_f mark; + ds_is_from_list_f is_from; +} dispatcher_api_t; + +typedef int (*bind_dispatcher_f)(dispatcher_api_t* api); +int bind_dispatcher(dispatcher_api_t* api); + +/** + * @brief Load the dispatcher API + */ +static inline int dispatcher_load_api(dispatcher_api_t *api) +{ + bind_dispatcher_f binddispatcher; + + binddispatcher = (bind_dispatcher_f)find_export("bind_dispatcher", 0, 0); + if(binddispatcher == 0) { + LM_ERR("cannot find bind_dispatcher\n"); + return -1; + } + if(binddispatcher(api)<0) + { + LM_ERR("cannot bind dispatcher api\n"); + return -1; + } + return 0; +} + + +#endif + diff --git a/modules_k/dispatcher/dispatch.c b/modules_k/dispatcher/dispatch.c index 46b7b03..bcd7f7c 100644 --- a/modules_k/dispatcher/dispatch.c +++ b/modules_k/dispatcher/dispatch.c @@ -71,6 +71,7 @@ #include "../../str.h"
#include "ds_ht.h" +#include "api.h" #include "dispatch.h"
#define DS_TABLE_VERSION 1 @@ -2374,3 +2375,15 @@ void ds_ht_timer(unsigned int ticks, void *param) return; }
+int bind_dispatcher(dispatcher_api_t* api) +{ + if (!api) { + ERR("Invalid parameter value\n"); + return -1; + } + api->select = ds_select_dst; + api->next = ds_next_dst; + api->mark = ds_mark_dst; + api->is_from = ds_is_from_list; + return 0; +} diff --git a/modules_k/dispatcher/dispatcher.c b/modules_k/dispatcher/dispatcher.c index 59fe0bb..ab412a6 100644 --- a/modules_k/dispatcher/dispatcher.c +++ b/modules_k/dispatcher/dispatcher.c @@ -66,6 +66,7 @@ #include "ds_ht.h" #include "dispatch.h" #include "config.h" +#include "api.h"
MODULE_VERSION
@@ -180,6 +181,8 @@ static cmd_export_t cmds[]={ 0, 0, ANY_ROUTE}, {"ds_load_update", (cmd_function)w_ds_load_update, 0, 0, 0, ANY_ROUTE}, + {"bind_dispatcher", (cmd_function)bind_dispatcher, 0, + 0, 0, 0}, {0,0,0,0,0,0} };