浏览代码

dispatcher(k): exported inter-module API

Daniel-Constantin Mierla 15 年之前
父节点
当前提交
86e03df9b1
共有 3 个文件被更改,包括 91 次插入0 次删除
  1. 75 0
      modules_k/dispatcher/api.h
  2. 13 0
      modules_k/dispatcher/dispatch.c
  3. 3 0
      modules_k/dispatcher/dispatcher.c

+ 75 - 0
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
+

+ 13 - 0
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;
+}

+ 3 - 0
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}
 };