introspect
[service]

Collaboration diagram for introspect:

Detailed Description

Module for manage Introspection.

TO COMPLETE

Todo:

Introspect Meta Information

Contact:
Daniele Rondina aka Ge@@ru <geaaru@gmail.com>
Status:
EasyDbus Core Library
License:
GPL
Contributor(s):


Data Structures

struct  easydbus_introspect_arg_info
 easydbus_introspect_arg_info object Used for manage automatic creation of introspect method on an object More...
struct  introspect_objs_tree
 Introspect object tree that is used for create a tree of object managed from service. More...

Defines

#define EASYDBUS_INTROSPECT_ARG_DIRECTION_O   "direction=\""
#define EASYDBUS_INTROSPECT_ARG_DIRECTION_O_L   11
#define EASYDBUS_INTROSPECT_ARG_NAME_TAG_O   " <arg name=\""
#define EASYDBUS_INTROSPECT_ARG_NAME_TAG_O_L   15
#define EASYDBUS_INTROSPECT_ARG_SPACE   "\" "
#define EASYDBUS_INTROSPECT_ARG_SPACE_L   2
#define EASYDBUS_INTROSPECT_ARG_TYPE_TAG_O   "type=\""
#define EASYDBUS_INTROSPECT_ARG_TYPE_TAG_O_L   6
#define EASYDBUS_INTROSPECT_DIRECTION_IN   "in"
#define EASYDBUS_INTROSPECT_DIRECTION_IN_L   2
#define EASYDBUS_INTROSPECT_DIRECTION_OUT   "out"
#define EASYDBUS_INTROSPECT_DIRECTION_OUT_L   3
#define EASYDBUS_INTROSPECT_INTERFACE_TAG_C   " </interface>\n"
#define EASYDBUS_INTROSPECT_INTERFACE_TAG_C_L   15
#define EASYDBUS_INTROSPECT_INTERFACE_TAG_O   " <interface name=\""
#define EASYDBUS_INTROSPECT_INTERFACE_TAG_O_L   19
#define EASYDBUS_INTROSPECT_MEMCOPY(buf, offset, s, s_l)
 Macro for manage write of introspect buffer.
#define EASYDBUS_INTROSPECT_METHOD   "Introspect"
#define EASYDBUS_INTROSPECT_METHOD_TAG_C   " </method>\n"
#define EASYDBUS_INTROSPECT_METHOD_TAG_C_L   13
#define EASYDBUS_INTROSPECT_METHOD_TAG_O   " <method name=\""
#define EASYDBUS_INTROSPECT_METHOD_TAG_O_L   17
#define EASYDBUS_INTROSPECT_MSG   DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
#define EASYDBUS_INTROSPECT_MSG_COMMENT   "<!-- Created with EasyDbus Library by Ge@@ru -->\n"
#define EASYDBUS_INTROSPECT_NODE_TAG_C   "</node>\n"
#define EASYDBUS_INTROSPECT_NODE_TAG_C_L   8
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT   " <node name=\""
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT2   "<node name=\""
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT2_L   12
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_C   "\">\n"
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_C_L   3
#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_L   13
#define EASYDBUS_INTROSPECT_NODE_TAG_O   "<node>\n"
#define EASYDBUS_INTROSPECT_NODE_TAG_O_L   7
#define EASYDBUS_INTROSPECT_SIGNAL_TAG_C   " </signal>\n"
#define EASYDBUS_INTROSPECT_SIGNAL_TAG_C_L   13
#define EASYDBUS_INTROSPECT_SIGNAL_TAG_O   " <signal name=\""
#define EASYDBUS_INTROSPECT_SIGNAL_TAG_O_L   17
#define EASYDBUS_INTROSPECT_TAG_END   "\"/>\n"
#define EASYDBUS_INTROSPECT_TAG_END_L   4
#define EASYDBUS_INTROSPECT_XML_INTERFACE_DATA

Typedefs

typedef struct introspect_objs_tree introspect_objs_tree

Functions

int easydbus_add_info_field_on_register_method (EasyDbus_obj_method *method, unsigned char offset, char *name_field, unsigned char type,...)
 Add information for introspectable interface about EasyDbus_obj_method object of register method.
int easydbus_add_info_field_on_register_signal (EasyDbus_obj_signal *signal, unsigned char offset, char *name_field,...)
 Add information for introspectable interface about EasyDbus_obj_signal object of register signal.
int easydbus_enable_introspect_check (EasyDbus_conn *data, EasyDbus_object *object, char *obj_path)
 Enable introspect method filter for automatic management and reply for message sent to Introspectable interface of an object.


Define Documentation

#define EASYDBUS_INTROSPECT_ARG_DIRECTION_O   "direction=\""

Definition at line 113 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_DIRECTION_O_L   11

Definition at line 115 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_NAME_TAG_O   " <arg name=\""

Definition at line 105 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_NAME_TAG_O_L   15

Definition at line 107 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_SPACE   "\" "

Definition at line 101 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_SPACE_L   2

Definition at line 103 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_TYPE_TAG_O   "type=\""

Definition at line 109 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_ARG_TYPE_TAG_O_L   6

Definition at line 111 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_DIRECTION_IN   "in"

Definition at line 117 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_DIRECTION_IN_L   2

Definition at line 119 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_DIRECTION_OUT   "out"

Definition at line 121 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_DIRECTION_OUT_L   3

Definition at line 123 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_INTERFACE_TAG_C   " </interface>\n"

Definition at line 81 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_INTERFACE_TAG_C_L   15

Definition at line 83 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_INTERFACE_TAG_O   " <interface name=\""

Definition at line 77 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_INTERFACE_TAG_O_L   19

Definition at line 79 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_MEMCOPY ( buf,
offset,
s,
s_l   ) 

Value:

{ \
   memcpy (&buf[offset], s, s_l); \
   offset += s_l; \
}
Macro for manage write of introspect buffer.

For internal use only.

Definition at line 129 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer(), easydbus_introspect_set_object_buffer(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_METHOD   "Introspect"

Definition at line 43 of file introspect_internal.h.

Referenced by easydbus_introspect_filter_func().

#define EASYDBUS_INTROSPECT_METHOD_TAG_C   " </method>\n"

Definition at line 89 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_METHOD_TAG_C_L   13

Definition at line 91 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_METHOD_TAG_O   " <method name=\""

Definition at line 85 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_METHOD_TAG_O_L   17

Definition at line 87 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_MSG   DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE

Definition at line 38 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_MSG_COMMENT   "<!-- Created with EasyDbus Library by Ge@@ru -->\n"

Definition at line 40 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_C   "</node>\n"

Definition at line 57 of file introspect_internal.h.

Referenced by easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_C_L   8

Definition at line 59 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT   " <node name=\""

Definition at line 61 of file introspect_internal.h.

Referenced by easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT2   "<node name=\""

Definition at line 65 of file introspect_internal.h.

Referenced by easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT2_L   12

Definition at line 67 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_C   "\">\n"

Definition at line 69 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_C_L   3

Definition at line 71 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), easydbus_introspect_get_reply_length(), easydbus_introspect_set_interface_buffer(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_INIT_L   13

Definition at line 63 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_O   "<node>\n"

Definition at line 53 of file introspect_internal.h.

Referenced by easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_NODE_TAG_O_L   7

Definition at line 55 of file introspect_internal.h.

Referenced by easydbus_introspect_get_reply_length(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_SIGNAL_TAG_C   " </signal>\n"

Definition at line 97 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_SIGNAL_TAG_C_L   13

Definition at line 99 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_SIGNAL_TAG_O   " <signal name=\""

Definition at line 93 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_SIGNAL_TAG_O_L   17

Definition at line 95 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), and easydbus_introspect_set_interface_buffer().

#define EASYDBUS_INTROSPECT_TAG_END   "\"/>\n"

Definition at line 73 of file introspect_internal.h.

Referenced by easydbus_introspect_set_interface_buffer(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_TAG_END_L   4

Definition at line 75 of file introspect_internal.h.

Referenced by easydbus_introspect_get_interface_string_length(), easydbus_introspect_get_reply_length(), easydbus_introspect_set_interface_buffer(), and easydbus_introspect_set_reply_buffer().

#define EASYDBUS_INTROSPECT_XML_INTERFACE_DATA

Value:

"  <interface name=\"org.freedesktop.DBus.Introspectable\">\n" \
        "   <method name=\"Introspect\">\n" \
   "     <arg name=\"data\" type=\"s\" direction=\"out\" />\n" \
        "   </method>\n" \
        "  </interface>\n"

Definition at line 45 of file introspect_internal.h.

Referenced by easydbus_introspect_get_obj_string_length(), and easydbus_introspect_set_object_buffer().


Typedef Documentation

typedef struct introspect_objs_tree introspect_objs_tree

typedef for struct instrospect_objs_tree

Definition at line 137 of file introspect_internal.h.


Function Documentation

int easydbus_add_info_field_on_register_method ( EasyDbus_obj_method method,
unsigned char  offset,
char *  name_field,
unsigned char  type,
  ... 
)

Add information for introspectable interface about EasyDbus_obj_method object of register method.

Parameters:
type 0 --> input, 1 --> output.
method method where add new info data.
offset offset of element on argument on method.
name_field arg name.
Returns:
-1 on error

0 ok

Definition at line 63 of file introspect.c.

References easydbus_add_elem_to_stack(), easydbus_add_new_field_to_list(), easydbus_create_arg_signature(), EASYDBUS_ELTYPE_INVALID, easydbus_free_elem_from_stack_list(), easydbus_free_introspect_info_arg(), EASYDBUS_MEMCOPY, EasyDbus_obj_method::input_info, easydbus_introspect_arg_info::name, easydbus_introspect_arg_info::next, easydbus_introspect_arg_info::offset, EasyDbus_obj_method::output_info, and easydbus_introspect_arg_info::signature.

00067 {
00068    struct easydbus_introspect_arg_info *el, *list;
00069    struct easydbus_signature_elem_stack *list_elem;
00070    enum el_type elem = EASYDBUS_ELTYPE_INVALID;
00071    int name_length = 0;
00072    va_list ap;
00073 
00074    if (method == NULL || name_field == NULL || type > 1)
00075       return -1;
00076 
00077    list = el = NULL;
00078    list_elem = NULL;
00079 
00080    if (type)
00081       list = method->output_info;
00082    else
00083       list = method->input_info;
00084 
00085    if (list != NULL) {
00086       // check if there is already a info about
00087       // a field with an offset == offset
00088       el = list;
00089       while (el != NULL) {
00090          if (el->offset == offset)
00091             return -1;
00092          el = el->next;
00093       }
00094    }
00095 
00096    el = (struct easydbus_introspect_arg_info *)
00097       malloc (sizeof (struct easydbus_introspect_arg_info));
00098    if (el == NULL)
00099       return -1;
00100 
00101    /* initialize new element */
00102    memset (el, 0,
00103            sizeof (struct easydbus_introspect_arg_info));
00104    el->name = el->signature = NULL;
00105    el->next = NULL;
00106 
00107    /* get elements list */
00108    va_start (ap, type);
00109 
00110    /* recover data from input params list */
00111    elem = va_arg (ap, enum el_type);
00112 
00113    while (elem != EASYDBUS_ELTYPE_INVALID) {
00114       list_elem =
00115          easydbus_add_elem_to_stack (elem, list_elem);
00116       elem = va_arg (ap, enum el_type);
00117    }
00118    va_end (ap);
00119 
00120    el->signature =
00121       easydbus_create_arg_signature (list_elem);
00122    if (el->signature == NULL)
00123       goto error;
00124    list_elem = NULL;
00125 
00126    name_length = strlen (name_field) + 1;
00127    el->name = (char *) malloc (name_length);
00128    if (el->name == NULL)
00129       goto error;
00130 
00131    EASYDBUS_MEMCOPY (el->name, name_field, name_length);
00132    el->offset = offset;
00133 
00134    if (easydbus_add_new_field_to_list (el, &list))
00135       goto error;
00136 
00137    if (type)
00138       method->output_info = list;
00139    else
00140       method->input_info = list;
00141 
00142 
00143    return 0;
00144 
00145  error:
00146    if (el != NULL)
00147       easydbus_free_introspect_info_arg (el);
00148 
00149    easydbus_free_elem_from_stack_list (list_elem);
00150 
00151    return -1;
00152 }

Here is the call graph for this function:

int easydbus_add_info_field_on_register_signal ( EasyDbus_obj_signal signal,
unsigned char  offset,
char *  name_field,
  ... 
)

Add information for introspectable interface about EasyDbus_obj_signal object of register signal.

Parameters:
signal signal where add new info data.
offset offset of element on argument on signal.
name_field arg name.
Returns:
-1 on error

0 ok

Definition at line 165 of file introspect.c.

References easydbus_add_elem_to_stack(), easydbus_add_new_field_to_list(), easydbus_create_arg_signature(), EASYDBUS_ELTYPE_INVALID, easydbus_free_elem_from_stack_list(), easydbus_free_introspect_info_arg(), EASYDBUS_MEMCOPY, easydbus_introspect_arg_info::name, easydbus_introspect_arg_info::next, easydbus_introspect_arg_info::offset, EasyDbus_obj_signal::output_info, and easydbus_introspect_arg_info::signature.

00168 {
00169    struct easydbus_introspect_arg_info *el = NULL;
00170    struct easydbus_signature_elem_stack *list_elem;
00171    enum el_type elem = EASYDBUS_ELTYPE_INVALID;
00172    int name_length = 0;
00173    va_list ap;
00174 
00175    if (signal == NULL || name_field == NULL)
00176       return -1;
00177 
00178    list_elem = NULL;
00179 
00180    if (signal->output_info != NULL) {
00181       // check if there is already a info about
00182       // a field with an offset == offset
00183       el = signal->output_info;
00184       while (el != NULL) {
00185          if (el->offset == offset)
00186             return -1;
00187          el = el->next;
00188       }
00189    }
00190 
00191    el = (struct easydbus_introspect_arg_info *)
00192       malloc (sizeof (struct easydbus_introspect_arg_info));
00193    if (el == NULL)
00194       return -1;
00195 
00196    /* initialize new element */
00197    memset (el, 0,
00198            sizeof (struct easydbus_introspect_arg_info));
00199    el->name = NULL;
00200    el->next = NULL;
00201 
00202    /* get elements list */
00203    va_start (ap, name_field);
00204 
00205    /* recover data from input params list */
00206    elem = va_arg (ap, enum el_type);
00207 
00208    while (elem != EASYDBUS_ELTYPE_INVALID) {
00209       list_elem =
00210          easydbus_add_elem_to_stack (elem, list_elem);
00211       elem = va_arg (ap, enum el_type);
00212    }
00213    va_end (ap);
00214 
00215    el->signature =
00216       easydbus_create_arg_signature (list_elem);
00217    if (el->signature == NULL)
00218       goto error;
00219    list_elem = NULL;
00220 
00221    name_length = strlen (name_field) + 1;
00222    el->name = (char *) malloc (name_length);
00223    if (el->name == NULL)
00224       goto error;
00225 
00226    EASYDBUS_MEMCOPY (el->name, name_field, name_length);
00227    el->offset = offset;
00228 
00229    if (easydbus_add_new_field_to_list
00230        (el, &signal->output_info))
00231       goto error;
00232 
00233    return 0;
00234 
00235  error:
00236    if (el != NULL)
00237       easydbus_free_introspect_info_arg (el);
00238 
00239    easydbus_free_elem_from_stack_list (list_elem);
00240 
00241    return -1;
00242 }

Here is the call graph for this function:

int easydbus_enable_introspect_check ( EasyDbus_conn data,
EasyDbus_object object,
char *  obj_path 
)

Enable introspect method filter for automatic management and reply for message sent to Introspectable interface of an object.

Note:
This function must be called before easydbus_register_object.
Returns:
-1 on error

0 ok

Definition at line 256 of file introspect.c.

References easydbus_introspect_create_reply_string(), easydbus_introspect_objs_tree_build(), easydbus_introspect_objs_tree_destroy(), and EasyDbus_core::handled_introspect.

00259 {
00260    struct EasyDbus_core *core =
00261       (struct EasyDbus_core *) data;
00262    char *introspect_string = NULL;
00263    introspect_objs_tree *t = NULL;
00264 
00265    if (!data || !object)
00266       return -1;
00267 
00268 
00269    t = easydbus_introspect_objs_tree_build ((struct EasyDbus_object_box *)
00270                                              object);
00271    if (!t) return -1;
00272 
00273    /* check if this is needed */
00274    introspect_string = 
00275       easydbus_introspect_create_reply_string (obj_path, t, 
00276                                                (struct EasyDbus_object_box *)
00277                                                 object);
00278 
00279    easydbus_introspect_objs_tree_destroy (t); 
00280 
00281    if (!introspect_string)
00282       return -1;
00283    free (introspect_string);
00284 
00285    core->handled_introspect = 1;
00286 
00287    return 0;
00288 }

Here is the call graph for this function:


Generated on Thu Apr 10 10:02:57 2008 for EasyDbus-0.2 by  doxygen 1.5.4