changeset 623:fc4f5815f0aa

Continued work on dbg_interactive.fdx
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 07 Dec 2010 17:24:53 +0900
parents cfbf7ed5dccd
children a5682d003ed9
files doc/dbg_interactive.py.sample extensions/dbg_interactive/diwrap.i
diffstat 2 files changed, 118 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/doc/dbg_interactive.py.sample	Tue Dec 07 11:14:21 2010 +0900
+++ b/doc/dbg_interactive.py.sample	Tue Dec 07 17:24:53 2010 +0900
@@ -20,17 +20,27 @@
 print FD_PROJECT_NAME, FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR, FD_PROJECT_VERSION_REV
 
 
+# Change the global debug level of the framework (cvar contains all global variables)
+cvar.fd_g_debug_lvl = FULL
+
+
 # Turn on debug for a specific function
 cvar.fd_debug_one_function = "gc_th_fct"
 
 
-# Use freeDiameter's debug facility
+# Print messages to freeDiameter's debug facility
 fd_log_debug("3 + 4 = %d\n", 7)
 # Hum... Currently I get "3 + 4 = 0" output... need some fix...
 
 
-# Change the global debug level of the framework
-cvar.fd_g_debug_lvl = FULL
+# SWIG deals with structures as follow:
+# Take the structure:
+# struct foo { int a; }
+# The following functions are available to python:
+# s = new_foo()	   --> s = calloc(1, sizeof(struct foo))
+# foo_a_set(s, 2)  --> s->a = 2
+# foo_a_get(s)     --> returns s->a value
+# delete_foo(s)    --> free(s)
 
 
 # Display the local Diameter Identity:
@@ -55,19 +65,29 @@
 
 
 # Lists
-mylist = new_fd_list()
-fd_list_init(mylist, None)
+l1 = new_fd_list()
 l2 = new_fd_list()
-fd_list_init(l2, None)
-fd_list_insert_after(mylist, l2)
-fd_list_unlink(l2)
+fd_list_insert_after(l1, l2)
+fd_list_dump(l1)
+fd_list_dump(l2)
 delete_fd_list(l2)
-delete_fd_list(mylist)
+fd_list_dump(l1)
+delete_fd_list(l1)
+
 
 # Dictionary
 gdict = fd_config_cnf_dict_get(cvar.fd_g_config)
-@@@ fd_dict_search ( gdict, DICT_APPLICATION, APPLICATION_BY_ID, id, res, -1 )
+id = new_int_ptr()
+int_ptr_assign(id, 3)
+res = new_dict_object_ptr()
+err = fd_dict_search ( gdict, DICT_APPLICATION, APPLICATION_BY_ID, id, res, -1 )
+obj = dict_object_ptr_value(res)
+t = new_dict_object_type_ptr()
+err = fd_dict_gettype(obj, t)
+dict_object_type_ptr_dump(t)
+v = new_dict_application_data()
+err = fd_dict_getval(obj, v)
+dict_application_data_application_name_get(v)
 
 
 
-
--- a/extensions/dbg_interactive/diwrap.i	Tue Dec 07 11:14:21 2010 +0900
+++ b/extensions/dbg_interactive/diwrap.i	Tue Dec 07 17:24:53 2010 +0900
@@ -1,3 +1,6 @@
+/* This interface file is processed by SWIG to create a python wrapper interface to freeDiameter framework. */
+%module diwrap
+%begin %{
 /*********************************************************************************************************
 * Software License Agreement (BSD License)                                                               *
 * Author: Sebastien Decugis <sdecugis@nict.go.jp>							 *
@@ -32,12 +35,12 @@
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF   *
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.								 *
 *********************************************************************************************************/
+%}
 
-/* This interface file is processed by SWIG to create a python wrapper interface to freeDiameter framework. */
-%module diwrap
 
-/* Include standard types & functions used in freeDiameter headers */
-%include <stdint.i>
+%init %{
+/* TODO: How to load the proxy classes here? */
+%}
 
 %{
 /* Define types etc. */
@@ -45,26 +48,103 @@
 #include <freeDiameter/extension.h>
 %}
 
+
+/* Include standard types & functions used in freeDiameter headers */
+%include <stdint.i>
+%include <cpointer.i>
+%include <typemaps.i>
+
 /* Some functions are not available through the wrapper */
 %ignore fd_lib_init;
 %ignore fd_lib_fini;
-%ignore fd_sess_start;
 
 /* Inline functions seems to give problems to SWIG -- just remove the inline definition */
 %define __inline__ 
 %enddef
 
-/* Make some global-variables read-only */
+/* Make some global-variables read-only (mainly to avoid warnings) */
 %immutable fd_g_config;
 %immutable peer_state_str;
 
-/* Overwrite a few functions prototypes for usability */
+/* Overwrite a few functions prototypes for usability: default parameters values, OUTPUT typemaps, ... */
 extern void fd_list_init ( struct fd_list * list, void * obj = NULL );
 
 
+/*
+extern int fd_dict_new ( struct dictionary * dict, enum dict_object_type type, void * data, struct dict_object * parent, struct dict_object ** OUTPUT );
+extern int fd_dict_search ( struct dictionary * dict, enum dict_object_type type, int criteria, void * what, struct dict_object ** OUTPUT, int retval );
+extern int fd_dict_get_error_cmd(struct dictionary * dict, struct dict_object ** OUTPUT);
+extern int fd_dict_getval ( struct dict_object * object, void * INOUT);
+//extern int fd_dict_gettype ( struct dict_object * object, enum dict_object_type * OUTPUT);
+extern int fd_dict_getdict ( struct dict_object * object, struct dictionary ** OUTPUT);
+*/
+
+
 /* Retrieve the compile-time definitions of freeDiameter */
 %include "freeDiameter/freeDiameter-host.h"
 %include "freeDiameter/libfreeDiameter.h"
 %include "freeDiameter/freeDiameter.h"
 
 
+/* Some pointer types that are useful */
+%pointer_class(int, int_ptr);
+%pointer_class(enum dict_object_type, dict_object_type_ptr);
+%pointer_functions(struct dict_object *, dict_object_ptr);
+%pointer_functions(struct session *, session_ptr);
+
+
+
+
+/* Extend some structures for usability/debug in python */
+%extend fd_list {
+	fd_list(void * o = NULL) {
+		struct fd_list * li;
+		li = (struct fd_list *) malloc(sizeof(struct fd_list));
+		if (!li) {
+			fd_log_debug("Out of memory!\n");
+			return NULL;
+		}
+		fd_list_init(li, o);
+		return li;
+	}
+	~fd_list() {
+		fd_list_unlink($self);
+		free($self);
+	}
+	void dump() {
+		fd_log_debug("list: %p\n", $self);
+		fd_log_debug("  - next: %p\n", $self->next);
+		fd_log_debug("  - prev: %p\n", $self->prev);
+		fd_log_debug("  - head: %p\n", $self->head);
+		fd_log_debug("  - o   : %p\n", $self->o);
+	}
+};
+
+%extend dict_object_type_ptr {
+	void dump() {
+		%#define CASE_STR(x)  case x: fd_log_debug(#x "\n"); break;
+		switch (*$self) {
+			CASE_STR(DICT_VENDOR)
+			CASE_STR(DICT_APPLICATION)
+			CASE_STR(DICT_TYPE)
+			CASE_STR(DICT_ENUMVAL)
+			CASE_STR(DICT_AVP)
+			CASE_STR(DICT_COMMAND)
+			CASE_STR(DICT_RULE)
+			default: fd_log_debug("Invalid value (%d)", *$self); break;
+		}
+	}
+}
+
+%inline %{ 
+void session_ptr_showsid(struct session * s) {
+	char * sid;
+	int ret = fd_sess_getsid ( s, &sid );
+	if (ret != 0) {
+		fd_log_debug("Error %d\n", ret);
+		/* throw an exception in SWIG? */
+		return;
+	}
+	fd_log_debug("%s\n", sid);
+}
+%}
"Welcome to our mercurial repository"