Module: sip-router
Branch: master
Commit: 86e03df9b1dbac5be70747bcd9f57a97fe5256c7
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=86e03df…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)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}
};