Changeset 5538

Show
Ignore:
Timestamp:
05/28/08 13:49:25 (4 months ago)
Author:
morris
Message:

Make messages, fields, types and parameters external types and provide API to introspect them

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libwired/trunk/libwired/p7/wi-p7-message.c

    r5453 r5538  
    5555static wi_string_t *                                                            _wi_p7_message_description(wi_runtime_instance_t *); 
    5656 
    57 static wi_string_t *                                                            _wi_p7_message_field_string_value(wi_p7_message_t *, wi_string_t *, wi_p7_type_t); 
     57static wi_string_t *                                                            _wi_p7_message_field_string_value(wi_p7_message_t *, wi_p7_spec_field_t *); 
    5858static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_reading_for_id(wi_p7_message_t *, uint32_t, unsigned char **, uint32_t *); 
    5959static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_reading_for_name(wi_p7_message_t *, wi_string_t *, unsigned char **, uint32_t *); 
    6060static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_writing_for_id(wi_p7_message_t *, uint32_t, uint32_t, unsigned char **); 
    6161static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_writing_for_name(wi_p7_message_t *, wi_string_t *, uint32_t, unsigned char **, uint32_t *); 
    62 static void                                                                                     _wi_p7_message_set_xml_field(wi_p7_message_t *, wi_p7_type_t, wi_string_t *, wi_string_t *); 
     62static void                                                                                     _wi_p7_message_set_xml_field(wi_p7_message_t *, wi_string_t *, wi_string_t *, wi_p7_spec_type_t *); 
    6363static xmlNodePtr                                                                       _wi_p7_message_xml_node_for_name(wi_p7_message_t *, const char *); 
    6464static wi_string_t *                                                            _wi_p7_message_xml_copy_value_for_name(wi_p7_message_t *, wi_string_t *); 
    65 static wi_p7_type_t                                                                   _wi_p7_message_xml_type_for_name(wi_p7_message_t *, wi_string_t *); 
     65static wi_p7_spec_type_t *                                                    _wi_p7_message_xml_type_for_name(wi_p7_message_t *, wi_string_t *); 
    6666 
    6767 
     
    203203 
    204204static wi_string_t * _wi_p7_message_description(wi_runtime_instance_t *instance) { 
    205         wi_p7_message_t         *p7_message = instance; 
    206         wi_string_t                     *description, *xml_string, *field_name, *type_name, *field_value; 
    207         xmlNodePtr                      node; 
    208         unsigned char           *buffer, *start; 
    209         wi_p7_type_t            type_id; 
    210         uint32_t                        message_size, field_id, field_size; 
    211          
     205        wi_p7_message_t                 *p7_message = instance; 
     206        wi_string_t                             *description, *xml_string, *field_name, *field_value; 
     207        wi_p7_spec_field_t              *field; 
     208        xmlNodePtr                              node; 
     209        unsigned char                   *buffer, *start; 
     210        uint32_t                                message_size, field_id, field_size; 
    212211         
    213212        description = wi_string_init_with_format(wi_string_alloc(), WI_STR("<%@ %p>{name = %@, serialization = %@"), 
     
    238237                        buffer += sizeof(field_id); 
    239238 
    240                         field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
     239                        field = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     240                        field_size = wi_p7_spec_field_size(field); 
    241241                         
    242242                        if(field_size == 0) { 
     
    246246                        } 
    247247                         
    248                         field_name              = wi_p7_spec_field_name(p7_message->spec, field_id); 
    249                         type_id                 = wi_p7_spec_field_type(p7_message->spec, field_id); 
    250                         field_value             = _wi_p7_message_field_string_value(p7_message, field_name, type_id); 
     248                        field_name              = wi_p7_spec_field_name(field); 
     249                        field_value             = _wi_p7_message_field_string_value(p7_message, field); 
    251250 
    252251                        wi_string_append_format(description, WI_STR("    %@ = %@\n"), 
     
    260259                                if(node->type == XML_ELEMENT_NODE) { 
    261260                                        field_name              = wi_autorelease(wi_p7_xml_copy_string_for_attribute(node, WI_STR("name"))); 
    262                                         type_name               = wi_autorelease(wi_p7_xml_copy_string_for_attribute(node, WI_STR("type"))); 
    263                                         type_id                 = wi_p7_spec_type_id(p7_message->spec, type_name); 
    264                                         field_value             = _wi_p7_message_field_string_value(p7_message, field_name, type_id); 
     261                                        field                   = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     262                                        field_value             = _wi_p7_message_field_string_value(p7_message, field); 
    265263                                         
    266264                                        wi_string_append_format(description, WI_STR("    %@ = %@\n"), 
     
    442440#pragma mark - 
    443441 
    444 static wi_string_t * _wi_p7_message_field_string_value(wi_p7_message_t *p7_message, wi_string_t *field_name, wi_p7_type_t type_id) { 
    445         wi_string_t                             *field_value = NULL; 
     442static wi_string_t * _wi_p7_message_field_string_value(wi_p7_message_t *p7_message, wi_p7_spec_field_t *field) { 
     443        wi_string_t                             *field_name, *field_value = NULL; 
    446444        wi_uuid_t                               *uuid; 
    447445        wi_date_t                               *date; 
     
    458456        wi_array_t                              *list; 
    459457         
    460         switch(type_id) { 
     458        field_name = wi_p7_spec_field_name(field); 
     459         
     460        switch(wi_p7_spec_type_id(wi_p7_spec_field_type(field))) { 
    461461                case WI_P7_BOOL: 
    462462                        if(wi_p7_message_get_bool_for_name(p7_message, &p7_bool, field_name)) 
     
    466466                case WI_P7_ENUM: 
    467467                        if(wi_p7_message_get_enum_for_name(p7_message, &p7_enum, field_name)) 
    468                                 field_value = wi_p7_spec_enum_name(p7_message->spec, wi_p7_spec_field_id(p7_message->spec, field_name), p7_enum); 
     468                                field_value = wi_hash_data_for_key(wi_p7_spec_field_enums_by_value(field), (void *) p7_enum); 
    469469                        break; 
    470470                         
     
    541541 
    542542static wi_boolean_t _wi_p7_message_get_binary_buffer_for_reading_for_id(wi_p7_message_t *p7_message, uint32_t in_field_id, unsigned char **out_buffer, uint32_t *out_field_size) { 
    543         unsigned char           *buffer, *start; 
    544         uint32_t                        message_size, field_id, field_size; 
     543        wi_p7_spec_field_t              *field; 
     544        unsigned char                   *buffer, *start; 
     545        uint32_t                                message_size, field_id, field_size; 
    545546         
    546547        message_size = p7_message->binary_size - WI_P7_MESSAGE_BINARY_HEADER_SIZE; 
     
    552553                buffer += sizeof(field_id); 
    553554 
    554                 field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
    555                  
     555                field = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     556                field_size = wi_p7_spec_field_size(field); 
     557         
    556558                if(field_size == 0) { 
    557559                        field_size = wi_read_swap_big_to_host_int32(buffer, 0); 
     
    579581 
    580582static wi_boolean_t _wi_p7_message_get_binary_buffer_for_reading_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name, unsigned char **out_buffer, uint32_t *out_field_size) { 
    581         uint32_t                field_id; 
    582          
    583         field_id = wi_p7_spec_field_id(p7_message->spec, field_name); 
    584          
    585         if(field_id == WI_P7_SPEC_FIELD_ID_NULL) { 
     583        wi_p7_spec_field_t      *field; 
     584        uint32_t                        field_id; 
     585         
     586        field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     587         
     588        if(!field) { 
    586589                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
    587590                        WI_STR("No id found for field \"%@\""), field_name); 
     
    593596        } 
    594597         
     598        field_id = wi_p7_spec_field_id(field); 
     599 
    595600        return _wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, out_buffer, out_field_size); 
    596601} 
     
    599604 
    600605static wi_boolean_t _wi_p7_message_get_binary_buffer_for_writing_for_id(wi_p7_message_t *p7_message, uint32_t field_id, uint32_t length, unsigned char **out_buffer) { 
    601         uint32_t                field_size, new_size; 
    602          
    603         new_size = sizeof(field_id); 
    604         field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
     606        wi_p7_spec_field_t      *field; 
     607        uint32_t                        field_size, new_size; 
     608         
     609        new_size        = sizeof(field_id); 
     610        field           = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     611        field_size      = wi_p7_spec_field_size(field); 
    605612         
    606613        if(field_size == 0) { 
     
    630637 
    631638static wi_boolean_t _wi_p7_message_get_binary_buffer_for_writing_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name, uint32_t length, unsigned char **out_buffer, uint32_t *out_field_id) { 
    632         uint32_t                field_id; 
    633          
    634         field_id = wi_p7_spec_field_id(p7_message->spec, field_name); 
    635          
    636         if(field_id == WI_P7_SPEC_FIELD_ID_NULL) { 
     639        wi_p7_spec_field_t      *field; 
     640        uint32_t                        field_id; 
     641         
     642        field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     643 
     644        if(!field) { 
    637645                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
    638646                        WI_STR("No id found for field \"%@\""), field_name); 
     
    644652        } 
    645653         
     654        field_id = wi_p7_spec_field_id(field); 
     655         
    646656        if(out_field_id) 
    647657                *out_field_id = field_id; 
     
    652662 
    653663 
    654 static void _wi_p7_message_set_xml_field(wi_p7_message_t *p7_message, wi_p7_type_t type_id, wi_string_t *field_name, wi_string_t *field_value) { 
     664static void _wi_p7_message_set_xml_field(wi_p7_message_t *p7_message, wi_string_t *field_name, wi_string_t *field_value, wi_p7_spec_type_t *type) { 
    655665        xmlNodePtr              node; 
    656666         
     
    660670                node = xmlNewNode(p7_message->xml_ns, (xmlChar *) "field"); 
    661671                xmlSetProp(node, (xmlChar *) "name", (xmlChar *) wi_string_cstring(field_name)); 
    662                 xmlSetProp(node, (xmlChar *) "type", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(p7_message->spec, type_id))); 
     672                xmlSetProp(node, (xmlChar *) "type", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(type))); 
    663673                xmlAddChild(p7_message->xml_root_node, node); 
    664674        } 
     
    713723 
    714724 
    715 static wi_p7_type_t _wi_p7_message_xml_type_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { 
    716         xmlNodePtr             node; 
    717         xmlChar                        *prop
    718         wi_p7_type_t   type = WI_P7_SPEC_TYPE_ID_NULL
     725static wi_p7_spec_type_t * _wi_p7_message_xml_type_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { 
     726        wi_p7_spec_type_t      *type; 
     727        xmlNodePtr                     node
     728        xmlChar                                *prop
    719729         
    720730        node = _wi_p7_message_xml_node_for_name(p7_message, wi_string_cstring(field_name)); 
    721731         
    722732        if(!node) 
    723                 return WI_P7_SPEC_TYPE_ID_NULL; 
     733                return NULL; 
    724734         
    725735        prop = xmlGetProp(node, (xmlChar *) "type"); 
    726736         
    727737        if(prop) { 
    728                 type = wi_p7_spec_type_id(p7_message->spec, wi_string_with_cstring_no_copy((char *) prop, false)); 
     738                type = wi_p7_spec_type_with_name(p7_message->spec, wi_string_with_cstring_no_copy((char *) prop, false)); 
    729739                 
    730740                xmlFree(prop); 
     
    733743        } 
    734744         
    735         return WI_P7_SPEC_TYPE_ID_NULL; 
     745        return NULL; 
    736746} 
    737747 
     
    742752void wi_p7_message_serialize(wi_p7_message_t *p7_message, wi_p7_serialization_t serialization) { 
    743753        xmlNodePtr                              listnode, itemnode; 
     754        wi_p7_spec_field_t              *field; 
     755        wi_p7_spec_type_t               *type, *listtype; 
    744756        wi_runtime_instance_t   *instance; 
    745757        wi_string_t                             *field_name, *field_value; 
     
    757769        wi_data_t                               *data; 
    758770        wi_array_t                              *list; 
    759         wi_p7_type_t                    type_id, listtype_id; 
    760771        wi_uinteger_t                   i, count; 
    761772        uint32_t                                message_size, field_id, field_size; 
     
    785796                         
    786797                        while((uint32_t) (buffer - start) < message_size) { 
    787                                 field_id = wi_read_swap_big_to_host_int32(buffer, 0); 
    788                                 buffer += sizeof(field_id); 
    789                                  
    790                                 field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
     798                                field_id               = wi_read_swap_big_to_host_int32(buffer, 0); 
     799                                buffer                 += sizeof(field_id); 
     800                                field                  = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     801                                field_size             = wi_p7_spec_field_size(field); 
    791802                                 
    792803                                if(field_size == 0) { 
     
    796807                                } 
    797808                                 
    798                                 field_name              = wi_p7_spec_field_name(p7_message->spec, field_id); 
    799                                 type_id                 = wi_p7_spec_field_type(p7_message->spec, field_id); 
     809                                field_name              = wi_p7_spec_field_name(field); 
    800810                                field_value             = NULL; 
    801  
    802                                 switch(type_id) { 
     811                                type                    = wi_p7_spec_field_type(field); 
     812 
     813                                switch(wi_p7_spec_type_id(type)) { 
    803814                                        case WI_P7_BOOL: 
    804815                                                if(wi_p7_message_get_bool_for_name(p7_message, &p7_bool, field_name)) 
     
    878889                                                         
    879890                                                        if(!listnode) { 
    880                                                                 listtype_id = wi_p7_spec_field_listtype(p7_message->spec, wi_p7_spec_field_id(p7_message->spec, field_name)); 
     891                                                                listtype = wi_p7_spec_field_listtype(field); 
    881892                                                                listnode = xmlNewNode(p7_message->xml_ns, (xmlChar *) "field"); 
    882893                                                                xmlSetProp(listnode, (xmlChar *) "name", (xmlChar *) wi_string_cstring(field_name)); 
    883                                                                 xmlSetProp(listnode, (xmlChar *) "type", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(p7_message->spec, type_id))); 
    884                                                                 xmlSetProp(listnode, (xmlChar *) "listtype", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(p7_message->spec, listtype_id))); 
     894                                                                xmlSetProp(listnode, (xmlChar *) "type", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(type))); 
     895                                                                xmlSetProp(listnode, (xmlChar *) "listtype", (xmlChar *) wi_string_cstring(wi_p7_spec_type_name(listtype))); 
    885896                                                                xmlAddChild(p7_message->xml_root_node, listnode); 
    886897                                                        } 
     
    902913                                 
    903914                                if(field_value) 
    904                                         _wi_p7_message_set_xml_field(p7_message, type_id, field_name, field_value); 
     915                                        _wi_p7_message_set_xml_field(p7_message, field_name, field_value, type); 
    905916                                 
    906917                                buffer += field_size; 
     
    917928 
    918929void wi_p7_message_deserialize(wi_p7_message_t *p7_message) { 
     930        wi_p7_spec_message_t            *message; 
     931         
    919932        if(p7_message->serialization == WI_P7_BINARY) { 
    920933                p7_message->binary_id = wi_read_swap_big_to_host_int32(p7_message->binary_buffer, 0); 
    921                 p7_message->name = wi_retain(wi_p7_spec_message_name(p7_message->spec, p7_message->binary_id)); 
     934                 
     935                message = wi_p7_spec_message_with_id(p7_message->spec, p7_message->binary_id); 
     936                 
     937                if(message) 
     938                        p7_message->name = wi_retain(wi_p7_spec_message_name(message)); 
    922939        } else { 
    923940                p7_message->xml_doc = xmlParseDoc((xmlChar *) wi_string_cstring(p7_message->xml_string)); 
     
    937954 
    938955wi_boolean_t wi_p7_message_set_name(wi_p7_message_t *p7_message, wi_string_t *name) { 
     956        wi_p7_spec_message_t            *message; 
     957         
    939958        if(p7_message->serialization == WI_P7_BINARY) { 
    940                 p7_message->binary_id = wi_p7_spec_message_id(p7_message->spec, name); 
    941                  
    942                 if(p7_message->binary_id == WI_P7_SPEC_MESSAGE_ID_NULL) { 
     959                message = wi_p7_spec_message_with_name(p7_message->spec, name); 
     960 
     961                if(!message) { 
    943962                        wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNMESSAGE, 
    944963                                WI_STR("No id found for message \"%@\""), name); 
     
    950969                } 
    951970                 
     971                p7_message->binary_id = wi_p7_spec_message_id(message); 
     972                 
    952973                wi_write_swap_host_to_big_int32(p7_message->binary_buffer, 0, p7_message->binary_id); 
    953974        } 
     
    978999 
    9791000wi_hash_t * wi_p7_message_fields(wi_p7_message_t *p7_message) { 
    980         wi_hash_t                      *fields
    981         wi_string_t                    *field_name, *type_name, *field_value
    982         xmlNodePtr                     node; 
    983         unsigned char          *buffer, *start
    984         wi_p7_type_t           type_id
    985         uint32_t                        message_size, field_id, field_size; 
     1001        wi_p7_spec_field_t             *field
     1002        wi_hash_t                              *fields
     1003        wi_string_t                            *field_name, *field_value; 
     1004        xmlNodePtr                             node
     1005        unsigned char                  *buffer, *start
     1006        uint32_t                               message_size, field_id, field_size; 
    9861007         
    9871008        fields = wi_hash_init(wi_hash_alloc()); 
     
    9921013                 
    9931014                while((uint32_t) (buffer - start) < message_size) { 
    994                         field_id = wi_read_swap_big_to_host_int32(buffer, 0); 
    995                         buffer += sizeof(field_id); 
    996  
    997                         field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
     1015                        field_id       = wi_read_swap_big_to_host_int32(buffer, 0); 
     1016                        buffer         += sizeof(field_id); 
     1017                        field           = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     1018                        field_size     = wi_p7_spec_field_size(field); 
    9981019                         
    9991020                        if(field_size == 0) { 
     
    10031024                        } 
    10041025                         
    1005                         field_name              = wi_p7_spec_field_name(p7_message->spec, field_id); 
    1006                         type_id                 = wi_p7_spec_field_type(p7_message->spec, field_id); 
    1007                         field_value             = _wi_p7_message_field_string_value(p7_message, field_name, type_id); 
     1026                        field_name              = wi_p7_spec_field_name(field); 
     1027                        field_value             = _wi_p7_message_field_string_value(p7_message, field); 
    10081028 
    10091029                        wi_hash_set_data_for_key(fields, field_value, field_name); 
     
    10161036                                if(node->type == XML_ELEMENT_NODE) { 
    10171037                                        field_name              = wi_autorelease(wi_p7_xml_copy_string_for_attribute(node, WI_STR("name"))); 
    1018                                         type_name               = wi_autorelease(wi_p7_xml_copy_string_for_attribute(node, WI_STR("type"))); 
    1019                                         type_id                 = wi_p7_spec_type_id(p7_message->spec, type_name); 
    1020                                         field_value             = _wi_p7_message_field_string_value(p7_message, field_name, type_id); 
     1038                                        field                   = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     1039                                        field_value             = _wi_p7_message_field_string_value(p7_message, field); 
    10211040                                         
    10221041                                        wi_hash_set_data_for_key(fields, field_value, field_name); 
     
    14731492 
    14741493wi_number_t * wi_p7_message_number_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { 
     1494        wi_p7_spec_field_t              *field; 
     1495        wi_p7_spec_type_t               *type; 
    14751496        wi_p7_boolean_t                 p7_bool; 
    14761497        wi_p7_int32_t                   p7_int32; 
     
    14791500        wi_p7_uint64_t                  p7_uint64; 
    14801501        wi_p7_double_t                  p7_double; 
    1481         wi_p7_type_t                    type_id; 
    1482         uint32_t                                field_id; 
    14831502         
    14841503        if(p7_message->serialization == WI_P7_BINARY) { 
    1485                 field_id = wi_p7_spec_field_id(p7_message->spec, field_name); 
    1486  
    1487                 if(field_id == WI_P7_SPEC_FIELD_ID_NULL
     1504                field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     1505                 
     1506                if(!field
    14881507                        return NULL; 
    14891508                 
    1490                 type_id = wi_p7_spec_field_type(p7_message->spec, field_id); 
    1491         } else { 
    1492                 type_id = _wi_p7_message_xml_type_for_name(p7_message, field_name); 
    1493         } 
    1494          
    1495         switch(type_id) { 
     1509                type = wi_p7_spec_field_type(field); 
     1510        } else { 
     1511                type = _wi_p7_message_xml_type_for_name(p7_message, field_name); 
     1512        } 
     1513         
     1514        if(!type) 
     1515                return NULL; 
     1516         
     1517        switch(wi_p7_spec_type_id(type)) { 
    14961518                case WI_P7_BOOL: 
    14971519                        if(wi_p7_message_get_bool_for_name(p7_message, &p7_bool, field_name)) 
     
    15341556 
    15351557wi_boolean_t wi_p7_message_set_enum_name_for_name(wi_p7_message_t *p7_message, wi_string_t *enum_name, wi_string_t *field_name) { 
     1558        wi_p7_spec_field_t      *field; 
     1559        wi_hash_t                       *enums; 
    15361560        wi_p7_enum_t            enum_value; 
    15371561         
    1538         enum_value = wi_p7_spec_enum_value(p7_message->spec, wi_p7_spec_field_id(p7_message->spec, field_name), enum_name); 
     1562        field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     1563         
     1564        if(!field) { 
     1565                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
     1566                        WI_STR("No id found for field \"%@\""), field_name); 
     1567                 
     1568                if(wi_p7_message_debug) 
     1569                        wi_log_debug(WI_STR("wi_p7_message_set_enum_name_for_name: %m")); 
     1570                 
     1571                return false; 
     1572        } 
     1573         
     1574        enums = wi_p7_spec_field_enums_by_name(field); 
     1575         
     1576        if(!wi_hash_contains_key(enums, enum_name)) { 
     1577                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
     1578                        WI_STR("No value found for enum \"%@\""), enum_name); 
     1579                 
     1580                if(wi_p7_message_debug) 
     1581                        wi_log_debug(WI_STR("wi_p7_message_set_enum_name_for_name: %m")); 
     1582                 
     1583                return false; 
     1584        } 
     1585         
     1586        enum_value = (wi_p7_enum_t) wi_hash_data_for_key(enums, enum_name); 
    15391587         
    15401588        return wi_p7_message_set_enum_for_name(p7_message, enum_value, field_name); 
     
    15441592 
    15451593wi_string_t * wi_p7_message_enum_name_for_name(wi_p7_message_t *p7_message, wi_string_t *field_name) { 
     1594        wi_p7_spec_field_t      *field; 
     1595        wi_hash_t                       *enums; 
    15461596        wi_p7_enum_t            enum_value; 
    15471597         
     
    15491599                return NULL; 
    15501600         
    1551         return wi_p7_spec_enum_name(p7_message->spec, wi_p7_spec_field_id(p7_message->spec, field_name), enum_value); 
     1601        field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     1602        enums = wi_p7_spec_field_enums_by_value(field); 
     1603         
     1604        if(!wi_hash_contains_key(enums, (void *) enum_value)) { 
     1605                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
     1606                        WI_STR("No name found for enum \"%u\""), enum_value); 
     1607                 
     1608                if(wi_p7_message_debug) 
     1609                        wi_log_debug(WI_STR("wi_p7_message_enum_name_for_name: %m")); 
     1610                 
     1611                return false; 
     1612        } 
     1613         
     1614        return wi_hash_data_for_key(enums, (void *) enum_value); 
    15521615} 
    15531616 
     
    17031766        xmlNodePtr                              listnode, itemnode; 
    17041767        xmlChar                                 *content; 
     1768        wi_p7_spec_field_t              *field; 
     1769        wi_p7_spec_type_t               *listtype; 
    17051770        wi_array_t                              *list; 
    17061771        wi_runtime_instance_t   *instance; 
    17071772        unsigned char                   *binary; 
    1708         wi_p7_type_t                    listtype
     1773        wi_p7_type_t                    listtype_id
    17091774        uint32_t                                field_size, list_size, string_size; 
    17101775         
    1711         listtype = wi_p7_spec_field_listtype(p7_message->spec, wi_p7_spec_field_id(p7_message->spec, field_name)); 
    1712  
    1713         if(listtype != WI_P7_STRING) { 
     1776        field = wi_p7_spec_field_with_name(p7_message->spec, field_name); 
     1777         
     1778        if(!field) { 
    17141779                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
    1715                         WI_STR("Unhandled type %@ in list"), wi_p7_spec_type_name(p7_message->spec, listtype)); 
     1780                        WI_STR("No id found for field \"%@\""), field_name); 
     1781                 
     1782                if(wi_p7_message_debug) 
     1783                        wi_log_debug(WI_STR("wi_p7_message_list_for_name: %m")); 
     1784                 
     1785                return NULL; 
     1786        } 
     1787         
     1788        listtype                = wi_p7_spec_field_listtype(field); 
     1789        listtype_id             = wi_p7_spec_type_id(listtype); 
     1790 
     1791        if(listtype_id != WI_P7_STRING) { 
     1792                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
     1793                        WI_STR("Unhandled type %@ in list"), wi_p7_spec_type_name(listtype)); 
    17161794                 
    17171795                if(wi_p7_message_debug) 
     
    17301808                 
    17311809                while(list_size < field_size) { 
    1732                         if(listtype == WI_P7_STRING) { 
     1810                        if(listtype_id == WI_P7_STRING) { 
    17331811                                string_size = wi_read_swap_big_to_host_int32(binary, list_size); 
    17341812                                 
     
    17521830                                        continue; 
    17531831                                 
    1754                                 if(listtype == WI_P7_STRING) 
     1832                                if(listtype_id == WI_P7_STRING) 
    17551833                                        instance = wi_string_with_cstring_no_copy((char *) content, true); 
    17561834                                 
     
    17681846 
    17691847wi_boolean_t wi_p7_message_write_binary(wi_p7_message_t *p7_message, const void *buffer, uint32_t field_size, wi_uinteger_t field_id) { 
    1770         unsigned char   *binary; 
     1848        wi_p7_spec_field_t      *field; 
     1849        unsigned char           *binary; 
    17711850         
    17721851        if(p7_message->serialization != WI_P7_BINARY) 
     
    17771856 
    17781857        wi_write_swap_host_to_big_int32(binary, 0, field_id); 
    1779  
    1780         if(wi_p7_spec_field_size(p7_message->spec, field_id) > 0) { 
     1858         
     1859        field = wi_p7_spec_field_with_id(p7_message->spec, field_id); 
     1860 
     1861        if(wi_p7_spec_field_size(field) > 0) { 
    17811862                memcpy(binary + 4, buffer, field_size); 
    17821863        } else { 
  • libwired/trunk/libwired/p7/wi-p7-socket.c

    r5535 r5538  
    166166        wi_uinteger_t                                                   oobdata_read_buffer_length; 
    167167         
     168        wi_p7_socket_message_callback_func_t    *read_message_callback; 
     169        void                                                                    *read_message_context; 
     170         
     171        wi_p7_socket_message_callback_func_t    *wrote_message_callback; 
     172        void                                                                    *wrote_message_context; 
     173         
    168174        uint64_t                                                                read_raw_bytes, read_processed_bytes; 
    169175        uint64_t                                                                sent_raw_bytes, sent_processed_bytes; 
     
    342348 
    343349 
     350void wi_p7_socket_set_read_message_callback(wi_p7_socket_t *p7_socket, wi_p7_socket_message_callback_func_t *callback, void *context) { 
     351        p7_socket->read_message_callback = callback; 
     352        p7_socket->read_message_context = context; 
     353} 
     354 
     355 
     356 
     357void wi_p7_socket_set_wrote_message_callback(wi_p7_socket_t *p7_socket, wi_p7_socket_message_callback_func_t *callback, void *context) { 
     358        p7_socket->wrote_message_callback = callback; 
     359        p7_socket->wrote_message_context = context; 
     360} 
     361 
     362 
     363 
    344364#pragma mark - 
    345365 
     
    15491569                        ((double) p7_socket->sent_processed_bytes / (double) p7_socket->sent_raw_bytes) * 100.0); 
    15501570        } 
     1571         
     1572        if(p7_socket->wrote_message_callback) 
     1573                (*p7_socket->wrote_message_callback)(p7_socket, p7_message, p7_socket->wrote_message_context); 
    15511574         
    15521575        return true; 
     
    16101633        } 
    16111634 
     1635        if(p7_socket->read_message_callback) 
     1636                (*p7_socket->read_message_callback)(p7_socket, p7_message, p7_socket->read_message_context); 
     1637 
    16121638        return p7_message; 
    16131639} 
  • libwired/trunk/libwired/p7/wi-p7-socket.h

    r5535 r5538  
    7373typedef enum _wi_p7_options                                                     wi_p7_options_t; 
    7474 
     75typedef void                                                                            wi_p7_socket_message_callback_func_t(wi_p7_socket_t *, wi_p7_message_t *, void *); 
     76 
    7577 
    7678typedef wi_string_t *                                                           wi_p7_socket_password_provider_func_t(wi_string_t *); 
     
    8890WI_EXPORT void                                                                          wi_p7_socket_set_tls(wi_p7_socket_t *, wi_socket_tls_t *); 
    8991WI_EXPORT wi_socket_tls_t *                                                     wi_p7_socket_tls(wi_p7_socket_t *); 
     92WI_EXPORT void                                                                          wi_p7_socket_set_read_message_callback(wi_p7_socket_t *, wi_p7_socket_message_callback_func_t *, void *); 
     93WI_EXPORT void                                                                          wi_p7_socket_set_wrote_message_callback(wi_p7_socket_t *, wi_p7_socket_message_callback_func_t *, void *); 
    9094 
    9195WI_EXPORT wi_socket_t *                                                         wi_p7_socket_socket(wi_p7_socket_t *); 
  • libwired/trunk/libwired/p7/wi-p7-spec.c

    r5532 r5538  
    5252#include <wired/wi-string.h> 
    5353 
    54 typedef struct _wi_p7_spec_type                         _wi_p7_spec_type_t; 
    55 typedef struct _wi_p7_spec_field                        _wi_p7_spec_field_t; 
    5654typedef struct _wi_p7_spec_collection           _wi_p7_spec_collection_t; 
    57 typedef struct _wi_p7_spec_message                      _wi_p7_spec_message_t; 
    58 typedef struct _wi_p7_spec_parameter            _wi_p7_spec_parameter_t; 
    5955typedef struct _wi_p7_spec_transaction          _wi_p7_spec_transaction_t; 
    6056typedef struct _wi_p7_spec_broadcast            _wi_p7_spec_broadcast_t; 
     
    7167}; 
    7268 
    73 static _wi_p7_spec_type_t *                                   _wi_p7_spec_type_with_node(wi_p7_spec_t *, xmlNodePtr); 
     69static wi_p7_spec_type_t *                                    _wi_p7_spec_type_with_node(wi_p7_spec_t *, xmlNodePtr); 
    7470static void                                                                     _wi_p7_spec_type_dealloc(wi_runtime_instance_t *); 
    7571static wi_string_t *                                            _wi_p7_spec_type_description(wi_runtime_instance_t *); 
     
    7773static wi_runtime_id_t                                          _wi_p7_spec_type_runtime_id = WI_RUNTIME_ID_NULL; 
    7874static wi_runtime_class_t                                       _wi_p7_spec_type_runtime_class = { 
    79     "_wi_p7_spec_type_t", 
     75    "wi_p7_spec_type_t", 
    8076    _wi_p7_spec_type_dealloc, 
    8177    NULL, 
     
    9288        wi_string_t                                                             *name; 
    9389        wi_uinteger_t                                                   id; 
    94         _wi_p7_spec_type_t                                            *type; 
    95         _wi_p7_spec_type_t                                            *listtype; 
     90        wi_p7_spec_type_t                                             *type; 
     91        wi_p7_spec_type_t                                             *listtype; 
    9692        wi_hash_t                                                               *enums_name; 
    97         wi_hash_t                                                               *enums_id
     93        wi_hash_t                                                               *enums_value
    9894}; 
    9995 
    100 static _wi_p7_spec_field_t *                          _wi_p7_spec_field_with_node(wi_p7_spec_t *, xmlNodePtr); 
     96static wi_p7_spec_field_t *                                   _wi_p7_spec_field_with_node(wi_p7_spec_t *, xmlNodePtr); 
    10197static void                                                                     _wi_p7_spec_field_dealloc(wi_runtime_instance_t *); 
    10298static wi_string_t *                                            _wi_p7_spec_field_description(wi_runtime_instance_t *); 
     
    104100static wi_runtime_id_t                                          _wi_p7_spec_field_runtime_id = WI_RUNTIME_ID_NULL; 
    105101static wi_runtime_class_t                                       _wi_p7_spec_field_runtime_class = { 
    106     "_wi_p7_spec_field_t", 
     102    "wi_p7_spec_field_t", 
    107103    _wi_p7_spec_field_dealloc, 
    108104    NULL, 
     
    148144}; 
    149145 
    150 static _wi_p7_spec_message_t *                                _wi_p7_spec_message_with_node(wi_p7_spec_t *, xmlNodePtr); 
     146static wi_p7_spec_message_t *                         _wi_p7_spec_message_with_node(wi_p7_spec_t *, xmlNodePtr); 
    151147static void                                                                     _wi_p7_spec_message_dealloc(wi_runtime_instance_t *); 
    152148static wi_string_t *                                            _wi_p7_spec_message_description(wi_runtime_instance_t *); 
     
    154150static wi_runtime_id_t                                          _wi_p7_spec_message_runtime_id = WI_RUNTIME_ID_NULL; 
    155151static wi_runtime_class_t                                       _wi_p7_spec_message_runtime_class = { 
    156     "_wi_p7_spec_message_t", 
     152    "wi_p7_spec_message_t", 
    157153    _wi_p7_spec_message_dealloc, 
    158154    NULL, 
     
    167163        wi_runtime_base_t                                               base; 
    168164         
    169         _wi_p7_spec_field_t                                           *field; 
     165        wi_p7_spec_field_t                                            *field; 
    170166        wi_boolean_t                                                    required; 
    171167}; 
    172168 
    173 static _wi_p7_spec_parameter_t *                       _wi_p7_spec_parameter_with_node(wi_p7_spec_t *, xmlNodePtr, _wi_p7_spec_message_t *); 
    174 static _wi_p7_spec_parameter_t *          &n