Changeset 5251

Show
Ignore:
Timestamp:
02/11/08 14:58:22 (7 months ago)
Author:
morris
Message:

Add some compatibility for clients

Files:

Legend:

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

    r5245 r5251  
    5757 
    5858static wi_string_t *                                                            _wi_p7_message_field_string_value(wi_p7_message_t *, wi_string_t *, wi_p7_type_t); 
    59 static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_reading_for_id(wi_p7_message_t *, uint32_t, wi_p7_type_t, unsigned char **, uint32_t *); 
     59static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_reading_for_id(wi_p7_message_t *, uint32_t, unsigned char **, uint32_t *); 
    6060static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_reading_for_name(wi_p7_message_t *, wi_string_t *, unsigned char **, uint32_t *); 
     61static wi_boolean_t                                                                     _wi_p7_message_get_binary_buffer_for_writing_for_id(wi_p7_message_t *, uint32_t, uint32_t, unsigned char **); 
    6162static 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 *); 
    6263static void                                                                                     _wi_p7_message_set_xml_field(wi_p7_message_t *, wi_p7_type_t, wi_string_t *, wi_string_t *); 
     
    454455 
    455456 
    456 static wi_boolean_t _wi_p7_message_get_binary_buffer_for_reading_for_id(wi_p7_message_t *p7_message, uint32_t in_field_id, wi_p7_type_t in_type_id, unsigned char **out_buffer, uint32_t *out_field_size) { 
     457static 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) { 
    457458        unsigned char           *buffer, *start; 
    458459        uint32_t                        message_size, field_id, field_size; 
     
    474475                } 
    475476                 
    476                 if((in_field_id > 0 && field_id == in_field_id) || 
    477                    (in_type_id > 0 && wi_p7_spec_field_type(p7_message->spec, field_id) == in_type_id)) { 
     477                if(field_id == in_field_id) { 
    478478                        if(out_buffer) 
    479479                                *out_buffer = buffer; 
     
    505505        } 
    506506         
    507         return _wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, 0, out_buffer, out_field_size); 
    508 
    509  
    510  
    511  
    512 static 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) { 
    513         uint32_t                field_id, field_size, old_size, new_size; 
    514          
    515         field_id = wi_p7_spec_field_id(p7_message->spec, field_name); 
    516          
    517         if(field_id == WI_P7_SPEC_FIELD_ID_NULL) { 
    518                 wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
    519                         WI_STR("No id found for field \"%@\""), field_name); 
    520                  
    521                 return false; 
    522         } 
     507        return _wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, out_buffer, out_field_size); 
     508
     509 
     510 
     511 
     512static 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) { 
     513        uint32_t                field_size, old_size, new_size; 
    523514         
    524515        if(length > 0) 
     
    527518                field_size = wi_p7_spec_field_size(p7_message->spec, field_id); 
    528519         
    529         if(_wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, 0, out_buffer, &old_size)) { 
     520        if(_wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, out_buffer, &old_size)) { 
    530521                if(field_size == old_size) 
    531522                        return true; 
     
    545536                *out_buffer = p7_message->binary_buffer + p7_message->binary_size; 
    546537         
     538        p7_message->binary_size += new_size; 
     539         
     540        return true; 
     541} 
     542 
     543 
     544 
     545static 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) { 
     546        uint32_t                field_id; 
     547         
     548        field_id = wi_p7_spec_field_id(p7_message->spec, field_name); 
     549         
     550        if(field_id == WI_P7_SPEC_FIELD_ID_NULL) { 
     551                wi_error_set_libwired_p7_error(WI_ERROR_P7_UNKNOWNFIELD, 
     552                        WI_STR("No id found for field \"%@\""), field_name); 
     553                 
     554                return false; 
     555        } 
     556         
    547557        if(out_field_id) 
    548558                *out_field_id = field_id; 
    549          
    550         p7_message->binary_size += new_size; 
    551          
    552         return true; 
     559 
     560        return _wi_p7_message_get_binary_buffer_for_writing_for_id(p7_message, field_id, length, out_buffer); 
    553561} 
    554562 
     
    12231231                        return NULL; 
    12241232                 
    1225                 return wi_string_with_bytes_no_copy(binary, field_size, false); 
     1233                return wi_string_with_bytes_no_copy(binary, field_size - 1, false); 
    12261234        } else { 
    12271235                string = _wi_p7_message_xml_value_for_name(p7_message, field_name); 
     
    14341442                        return NULL; 
    14351443                 
    1436                 return wi_date_with_iso8601_string(wi_string_with_bytes_no_copy(binary, field_size, false)); 
     1444                return wi_date_with_iso8601_string(wi_string_with_bytes_no_copy(binary, field_size - 1, false)); 
    14371445        } else { 
    14381446                string = _wi_p7_message_xml_value_for_name(p7_message, field_name); 
     
    14471455} 
    14481456 
     1457 
     1458 
     1459#pragma mark - 
     1460 
     1461wi_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) { 
     1462        unsigned char   *binary; 
     1463         
     1464        if(p7_message->serialization != WI_P7_BINARY) 
     1465                return false; 
     1466         
     1467        if(!_wi_p7_message_get_binary_buffer_for_writing_for_id(p7_message, field_id, field_size, &binary)) 
     1468                return false; 
     1469 
     1470        wi_write_swap_host_to_big_int32(binary, 0, field_id); 
     1471 
     1472        if(wi_p7_spec_field_size(p7_message->spec, field_id) > 0) { 
     1473                memcpy(binary + 4, buffer, field_size); 
     1474        } else { 
     1475                wi_write_swap_host_to_big_int32(binary, 4, field_size); 
     1476                 
     1477                memcpy(binary + 8, buffer, field_size); 
     1478        } 
     1479 
     1480        return true; 
     1481} 
     1482 
     1483 
     1484 
     1485wi_boolean_t wi_p7_message_read_binary(wi_p7_message_t *p7_message, unsigned char **buffer, uint32_t *field_size, wi_uinteger_t field_id) { 
     1486        if(p7_message->serialization != WI_P7_BINARY) 
     1487                return false; 
     1488         
     1489        return _wi_p7_message_get_binary_buffer_for_reading_for_id(p7_message, field_id, buffer, field_size); 
     1490} 
     1491 
    14491492#endif 
  • libwired/trunk/libwired/p7/wi-p7-message.h

    r5244 r5251  
    112112WI_EXPORT wi_date_t *                           wi_p7_message_date_for_name(wi_p7_message_t *, wi_string_t *); 
    113113 
     114WI_EXPORT wi_boolean_t                          wi_p7_message_write_binary(wi_p7_message_t *, const void *, uint32_t, wi_uinteger_t); 
     115WI_EXPORT wi_boolean_t                          wi_p7_message_read_binary(wi_p7_message_t *, unsigned char **, uint32_t *, wi_uinteger_t); 
     116 
    114117#endif /* WI_P7_MESSAGE_H */ 
  • libwired/trunk/libwired/p7/wi-p7-socket.c

    r5247 r5251  
    13851385 
    13861386 
     1387void wi_p7_socket_close(wi_p7_socket_t *p7_socket) { 
     1388} 
     1389 
     1390 
     1391 
     1392#pragma mark - 
     1393 
    13871394wi_boolean_t wi_p7_socket_write_message(wi_p7_socket_t *p7_socket, wi_time_interval_t timeout, wi_p7_message_t *p7_message) { 
    13881395        wi_boolean_t    result; 
  • libwired/trunk/libwired/p7/wi-p7-socket.h

    r5234 r5251  
    7474WI_EXPORT wi_boolean_t                                                          wi_p7_socket_connect(wi_p7_socket_t *, wi_time_interval_t, wi_p7_options_t, wi_p7_serialization_t, wi_string_t *, wi_string_t *); 
    7575WI_EXPORT wi_boolean_t                                                          wi_p7_socket_accept(wi_p7_socket_t *, wi_time_interval_t, wi_p7_options_t); 
     76WI_EXPORT void                                                                          wi_p7_socket_close(wi_p7_socket_t *); 
     77 
    7678WI_EXPORT wi_boolean_t                                                          wi_p7_socket_write_message(wi_p7_socket_t *, wi_time_interval_t, wi_p7_message_t *); 
    7779WI_EXPORT wi_p7_message_t *                                                     wi_p7_socket_read_message(wi_p7_socket_t *, wi_time_interval_t); 
  • libwired/trunk/libwired/p7/wi-p7-spec.c

    r5242 r5251  
    12451245 
    12461246 
     1247wi_hash_t * wi_p7_spec_field_names_for_ids(wi_p7_spec_t *p7_spec) { 
     1248        wi_enumerator_t                 *enumerator; 
     1249        wi_hash_t                               *hash; 
     1250        _wi_p7_spec_field_t             *field; 
     1251         
     1252        hash = wi_hash_init_with_capacity_and_callbacks(wi_hash_alloc(), 
     1253                wi_hash_count(p7_spec->fields_name), wi_hash_null_key_callbacks, wi_hash_default_value_callbacks); 
     1254         
     1255        enumerator = wi_hash_data_enumerator(p7_spec->fields_name); 
     1256         
     1257        while((field = wi_enumerator_next_data(enumerator))) 
     1258                wi_hash_set_data_for_key(hash, field->name, (void *) field->id); 
     1259         
     1260        if(_wi_p7_spec_builtin_spec) { 
     1261                enumerator = wi_hash_data_enumerator(_wi_p7_spec_builtin_spec->fields_name); 
     1262                 
     1263                while((field = wi_enumerator_next_data(enumerator))) 
     1264                        wi_hash_set_data_for_key(hash, field->name, (void *) field->id); 
     1265        } 
     1266         
     1267        return wi_autorelease(hash); 
     1268} 
     1269 
     1270 
     1271 
    12471272wi_p7_type_t wi_p7_spec_field_type(wi_p7_spec_t *p7_spec, wi_uinteger_t field_id) { 
    12481273        _wi_p7_spec_field_t             *field; 
  • libwired/trunk/libwired/p7/wi-p7-spec.h

    r4696 r5251  
    5656WI_EXPORT wi_uinteger_t                                 wi_p7_spec_field_id(wi_p7_spec_t *, wi_string_t *); 
    5757WI_EXPORT wi_string_t *                                 wi_p7_spec_field_name(wi_p7_spec_t *, wi_uinteger_t); 
     58WI_EXPORT wi_hash_t *                                   wi_p7_spec_field_names_for_ids(wi_p7_spec_t *); 
    5859WI_EXPORT wi_p7_type_t                                  wi_p7_spec_field_type(wi_p7_spec_t *, wi_uinteger_t); 
    5960WI_EXPORT wi_uinteger_t                                 wi_p7_spec_field_size(wi_p7_spec_t *, wi_uinteger_t);