changeset 627:330be61dbf43

Improvements to usability, still work ongoing
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 14 Dec 2010 11:53:24 +0900
parents e55d6ffd1a75
children e1c6f45f5fcd
files doc/dbg_interactive.py.sample
diffstat 1 files changed, 111 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- a/doc/dbg_interactive.py.sample	Tue Dec 14 11:53:03 2010 +0900
+++ b/doc/dbg_interactive.py.sample	Tue Dec 14 11:53:24 2010 +0900
@@ -5,93 +5,140 @@
 #
 # The adaptation layer between Python and C is provided by SWIG (http://swig.org). 
 # You may refer to SWIG documentation for more information on how the wrapper is generated and used.
-# Please note that the high-level wrapper file (python file) is not used in dbg_interactive at the moment,
-# but all symbols from the module are imported.
+# The name of the module wrapping freeDiameter framework is: _fDpy
 #
 # Similar to all freeDiameter extensions, an optional filename can be specified in the
 # main freeDiameter.conf configuration file for the dbg_interactive.fdx extension.
 # If such file is provided, it will be passed to the python interpreter as a python script
 # to execute. Otherwise, the interpreter will be interactive.
 #
-# Bellow are some example use of the python interpreter:
+# SWIG deals with structures as follow:
+# Given the structure:
+# struct foo { int a; }
+# The following functions are available to python (their C equivalent processing is given in [ ]):
+# 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)  ]
+#
+# In addition, thanks to the proxy (aka shadow) class, we can also do the more user-friendly:
+# s = foo()
+# s.a = 2
+# s.a
+# del s
+#
+
+# The remaining of this file gives some examples of how to use the python interpreter.
+# Note that the support is not yet totally usable. You'll probably have to extend some classes
+# or write some typemaps in the source code of the extension to do what you want.
 
 
+############# Compilation-time constants (from freeDiameter-host.h) ############
+
 # Display current version
-print FD_PROJECT_NAME, FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR, FD_PROJECT_VERSION_REV
+print "%s %d.%d.%d" % (FD_PROJECT_NAME, FD_PROJECT_VERSION_MAJOR, FD_PROJECT_VERSION_MINOR, FD_PROJECT_VERSION_REV)
 
 
+############# Debug ############
+
 # 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
+# Turn on debug for a specific function (if framework compiled with DEBUG support)
 cvar.fd_debug_one_function = "gc_th_fct"
 
 
 # Print messages to freeDiameter's debug facility
+# Note: the python version does not support printf-like argument list. The formating should be done in python.
+#       See SWIG documentation about varargs functions for more information.
 fd_log_debug("3 + 4 = %d\n" % (7))
-# See SWIG documentation about varargs functions for more information
+
+
+# Display some framework state information
+r = fd_event_send(cvar.fd_g_config.cnf_main_ev, FDEV_DUMP_PEERS, 0, None)
+r = fd_event_send(cvar.fd_g_config.cnf_main_ev, FDEV_DUMP_SERV, 0, None)
+r = fd_event_send(cvar.fd_g_config.cnf_main_ev, FDEV_DUMP_EXT, 0, None)
 
 
-# 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)
-#
-# In addition, thanks to proxy (aka shadow) class, we can also do:
-# s = foo()
-# s.a = 2
-# s.a
-# del s
+############# Global variables ############
+
+# Display the local Diameter Identity:
+print "Local Diameter Identity:", cvar.fd_g_config.cnf_diamid
+# Display realm, without using the low-level functions (skip proxy classe definitions):
+print "Realm:", _fDpy.fd_config_cnf_diamrlm_get(_fDpy.cvar.fd_g_config)
+
 
 
-# Display the local Diameter Identity:
-print "Local Diameter Identity:", fd_config_cnf_diamid_get(cvar.fd_g_config)
-print "Realm:", fd_config_cnf_diamrlm_get(cvar.fd_g_config)
+############# Lists ############
+l1 = fd_list()   # The creator has an implicit fd_list_init call
+l2 = fd_list()
+fd_list_insert_after(l1, l2)
+l1.dump()
+del l2		 # The destructor has an implicit fd_list_unlink call
+l1.dump()
+del l1
 
 
-# Display some states information
-evl = fd_config_cnf_main_ev_get(cvar.fd_g_config)
-r = fd_event_send(evl, FDEV_DUMP_PEERS, 0, None)
-r = fd_event_send(evl, FDEV_DUMP_SERV, 0, None)
-r = fd_event_send(evl, FDEV_DUMP_EXT, 0, None)
+############# Hash ############
+hex(fd_hash("hello world"))	# A typemap is applied to accept binary data
 
 
-# Create a new peer_info structure and add the peer to the framework.
-mypeer = new_peer_info()
-peer_info_pi_diamid_set( mypeer, "nas.testbed.aaa" )
-myconfig = peer_info_config_get(mypeer)
-mypicflag = peer_info_config_pic_flags_get(myconfig)
-peer_info_config_pic_flags_pro4_set(mypicflag, 1)   # 1 for TCP
-fd_peer_add(mypeer, "python", None, None)
-delete_peer_info(mypeer)
+############# Dictionary ############
+
+# Create a dedicated dictionary for our tests
+d = dictionary()
+d.dump()
+
+# New vendor
+v = dict_vendor_data()
+v.vendor_id = 123
+v.vendor_name = "My test vendor"
+r, my_vendor = fd_dict_new(d, DICT_VENDOR, v, None)
+del v
+d.dump()
+d.vendors_list()
+
+# New application
+a = dict_application_data()
+a.application_id = 99
+a.application_name = "My test appl"
+r, my_appl = fd_dict_new(d, DICT_APPLICATION, a, my_vendor)
+del a
+
+# New type (callbacks are not supported yet...)
+t = dict_type_data()
+t.type_base = AVP_TYPE_INTEGER32
+t.type_name = "My integer AVP"
+r, my_type_int = fd_dict_new(d, DICT_TYPE, t, my_appl)
+t.type_base = AVP_TYPE_OCTETSTRING
+t.type_name = "My binary buffer AVP"
+r, my_type_os = fd_dict_new(d, DICT_TYPE, t, my_appl)
+del t
+
+# Constants
+c = dict_enumval_data()
+c.enum_name = "AVP_VALUE_TROIS"
+c.enum_value.i32 = 3
+fd_dict_new(d, DICT_ENUMVAL, c, my_type_int)
+
+c.enum_name = "A_BUFFER_CONSTANT"
+osval = avp_value_os("This is a very long AVP value that we prefer to represent as a constant")
+c.enum_value.os = osval
+c.enum_value.os.dump()
+del d
+
+c = dict_enumval_data()
+c.enum_value.os = "coucou"
+c.enum_value.os.dump()
 
 
-# Lists
-l1 = new_fd_list()
-l2 = new_fd_list()
-fd_list_insert_after(l1, l2)
-fd_list_dump(l1)
-fd_list_dump(l2)
-delete_fd_list(l2)
-fd_list_dump(l1)
-delete_fd_list(l1)
-
+gdict = cvar.fd_g_config.cnf_dict
+r, obj = fd_dict_search ( gdict, DICT_APPLICATION, APPLICATION_BY_ID, 3, -1 )
+obj.dump()
+r, obj = fd_dict_search( gdict, DICT_AVP, AVP_BY_NAME, "Origin-Host", -1)
+obj.dump()
 
-# Dictionary
-gdict = fd_config_cnf_dict_get(cvar.fd_g_config)
-
-id = new_int_ptr()
-int_ptr_assign(id, 3)
-pobj = new_dict_object_pptr()
-fd_dict_search ( gdict, DICT_APPLICATION, APPLICATION_BY_ID, id, pobj, -1 )
-delete_int_ptr(id)
-obj = dict_object_pptr_value(pobj)
-delete_dict_object_pptr(pobj)
 t = new_dict_object_type_ptr()
 fd_dict_gettype(obj, t)
 dict_object_type_ptr_dump(t)
@@ -181,3 +228,11 @@
 fd_msg_free(msg)
 delete_avp_pptr(pavp)
 
+
+# Create a new peer_info structure and add the peer to the framework.
+mypeer = peer_info()
+mypeer.pi_diamid = "nas.testbed.aaa"
+mypeer.config.pic_flags.pro4 = 1   # 1 for TCP, for some reason PI_P4_TCP is not defined
+fd_peer_add(mypeer, "python", None, None)
+del mypeer
+
"Welcome to our mercurial repository"