Changeset 4684

Show
Ignore:
Timestamp:
02/22/07 18:02:28 (1 year ago)
Author:
morris
Message:

Match wired's p7 support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wire/branches/p7/wire/client.c

    r4674 r4684  
    4242#include "windows.h" 
    4343 
     44typedef void                                            wr_message_func_t(wi_p7_message_t *); 
     45 
     46 
    4447static wi_integer_t                                     wr_runloop_server_callback(wi_socket_t *); 
    4548 
    46 static uint32_t                                         wr_parse_message(wi_string_t *); 
    47  
    48 static void                                                     wr_msg_200(wi_array_t *); 
    49 static void                                                     wr_msg_201(wi_array_t *); 
    50 static void                                                     wr_msg_202(wi_array_t *); 
    51 static void                                                     wr_msg_300(wi_array_t *); 
    52 static void                                                     wr_msg_301(wi_array_t *); 
    53 static void                                                     wr_msg_302(wi_array_t *); 
    54 static void                                                     wr_msg_303(wi_array_t *); 
    55 static void                                                     wr_msg_304(wi_array_t *); 
    56 static void                                                     wr_msg_305(wi_array_t *); 
    57 static void                                                     wr_msg_306(wi_array_t *); 
    58 static void                                                     wr_msg_307(wi_array_t *); 
    59 static void                                                     wr_msg_308(wi_array_t *); 
    60 static void                                                     wr_msg_309(wi_array_t *); 
    61 static void                                                     wr_msg_310(wi_array_t *); 
    62 static void                                                     wr_msg_311(wi_array_t *); 
    63 static void                                                     wr_msg_320(wi_array_t *); 
    64 static void                                                     wr_msg_321(wi_array_t *); 
    65 static void                                                     wr_msg_322(wi_array_t *); 
    66 static void                                                     wr_msg_330(wi_array_t *); 
    67 static void                                                     wr_msg_331(wi_array_t *); 
    68 static void                                                     wr_msg_332(wi_array_t *); 
    69 static void                                                     wr_msg_341(wi_array_t *); 
    70 static void                                                     wr_msg_400(wi_array_t *); 
    71 static void                                                     wr_msg_401(wi_array_t *); 
    72 static void                                                     wr_msg_402(wi_array_t *); 
    73 static void                                                     wr_msg_410(wi_array_t *); 
    74 static void                                                     wr_msg_411(wi_array_t *); 
    75 static void                                                     wr_msg_420(wi_array_t *); 
    76 static void                                                     wr_msg_421(wi_array_t *); 
     49static void                                                     wr_message_login_reply(wi_p7_message_t *); 
     50static void                                                     wr_message_ping_reply(wi_p7_message_t *); 
     51static void                                                     wr_message_server_info(wi_p7_message_t *); 
    7752 
    7853 
     
    8762wi_string_t                                                     *wr_nick; 
    8863wi_string_t                                                     *wr_status; 
    89 wi_string_t                                                   *wr_icon; 
     64wi_data_t                                                     *wr_icon; 
    9065wi_string_t                                                     *wr_login; 
    9166wi_string_t                                                     *wr_password; 
     
    9368wi_string_t                                                     *wr_icon_path; 
    9469wi_string_t                                                     *wr_timestamp_format; 
     70 
     71wi_socket_t                                                     *wr_socket; 
     72wi_p7_socket_t                                          *wr_p7_socket; 
     73wi_address_t                                            *wr_address; 
     74 
     75uint64_t                                                        wr_received_bytes; 
     76uint64_t                                                        wr_transferred_bytes; 
     77 
     78wi_integer_t                                            wr_news_count; 
     79wi_integer_t                                            wr_news_limit; 
     80 
     81wi_time_interval_t                                      wr_ping_time; 
     82 
     83wi_boolean_t                                            wr_connected; 
     84wi_boolean_t                                            wr_logged_in; 
     85 
     86static wi_socket_context_t                      *wr_socket_context; 
     87 
     88static wi_hash_t                                        *wr_message_handlers; 
     89 
     90static wi_p7_spec_t                                     *wr_p7_spec; 
     91 
     92static wi_p7_uint32_t                           wr_transaction; 
    9593 
    9694static const char                                       wr_default_icon[] = 
     
    139137        "Vy/xW31D+jfvNtPdS+ASBQAAAABJRU5ErkJggg=="; 
    140138 
    141 static wi_socket_context_t                      *wr_socket_context; 
    142  
    143 static wi_p7_spec_t                                     *wr_p7_spec; 
    144  
    145 wi_socket_t                                                     *wr_socket; 
    146 wi_p7_socket_t                                          *wr_p7_socket; 
    147 wi_address_t                                            *wr_address; 
    148  
    149 uint64_t                                                        wr_received_bytes; 
    150 uint64_t                                                        wr_transferred_bytes; 
    151  
    152 wi_integer_t                                            wr_news_count; 
    153 wi_integer_t                                            wr_news_limit; 
    154  
    155 wi_time_interval_t                                      wr_ping_time; 
    156  
    157 wi_boolean_t                                            wr_connected; 
    158 wi_boolean_t                                            wr_logged_in; 
    159139 
    160140 
    161141void wr_client_init(void) { 
    162         wi_integer_t    options; 
    163          
     142        wi_hash_value_callbacks_t               value_callbacks = { 
     143                NULL, 
     144                NULL, 
     145                NULL, 
     146                NULL 
     147        }; 
     148 
    164149        wr_socket_context = wi_socket_context_init(wi_socket_context_alloc()); 
    165150         
    166 //      if(!wi_socket_context_set_ssl_type(wr_socket_context, WI_SOCKET_SSL_CLIENT)) 
    167 //              wi_log_err(WI_STR("Could not set SSL context: %m")); 
    168          
    169         options = WI_STRING_ENCODING_IGNORE | WI_STRING_ENCODING_TRANSLITERATE; 
    170          
    171151        wr_client_string_encoding = wi_string_encoding_init_with_charset(wi_string_encoding_alloc(), 
    172                                                                                                                                          WI_STR("ISO-8859-1"), 
    173                                                                                                                                          options); 
    174          
     152                WI_STR("ISO-8859-1"), WI_STRING_ENCODING_IGNORE | WI_STRING_ENCODING_TRANSLITERATE); 
    175153        wr_server_string_encoding = wi_string_encoding_init_with_charset(wi_string_encoding_alloc(), 
    176                                                                                                                                          WI_STR("UTF-8"), 
    177                                                                                                                                          options); 
    178          
    179         wr_icon = wi_string_init_with_cstring(wi_string_alloc(), wr_default_icon); 
     154                WI_STR("UTF-8"), WI_STRING_ENCODING_IGNORE | WI_STRING_ENCODING_TRANSLITERATE); 
     155         
     156        wr_message_handlers = wi_hash_init_with_capacity_and_callbacks(wi_hash_alloc(), 
     157                0, wi_hash_default_key_callbacks, value_callbacks); 
     158         
     159        wi_hash_set_data_for_key(wr_message_handlers, wr_message_login_reply, WI_STR("wired.login.reply")); 
     160        wi_hash_set_data_for_key(wr_message_handlers, wr_message_ping_reply, WI_STR("wired.ping.reply")); 
     161        wi_hash_set_data_for_key(wr_message_handlers, wr_message_server_info, WI_STR("wired.server_info")); 
     162 
     163        wr_icon = wi_data_init_with_base64(wi_data_alloc(), wi_string_with_cstring(wr_default_icon)); 
    180164         
    181165        wr_p7_spec = wi_p7_spec_init_with_file(wi_p7_spec_alloc(), WI_STR("wired.xml")); 
     
    235219                p7_socket = wi_autorelease(wi_p7_socket_init_with_socket(wi_p7_socket_alloc(), socket, wr_p7_spec)); 
    236220                 
    237 //              if(!wi_p7_socket_connect(p7_socket, 10.0, WI_P7_ENCRYPTION_RSA_AES_256 | WI_P7_COMPRESSION_DEFLATE, WI_P7_XML, login, password)) { 
    238                 if(!wi_p7_socket_connect(p7_socket, 10.0, WI_P7_ENCRYPTION_RSA_AES_256 | WI_P7_COMPRESSION_DEFLATE, WI_P7_BINARY, login, password)) { 
     221//              if(!wi_p7_socket_connect(p7_socket, 10.0, WI_P7_ENCRYPTION_RSA_AES256_SHA1 | WI_P7_COMPRESSION_DEFLATE, WI_P7_XML, login, password)) { 
     222                if(!wi_p7_socket_connect(p7_socket, 10.0, WI_P7_ENCRYPTION_RSA_AES256_SHA1 | WI_P7_COMPRESSION_DEFLATE, WI_P7_BINARY, login, password)) { 
    239223                        wr_printf_prefix(WI_STR("Could not connect to %@: %m"), ip); 
    240224 
     
    245229                 
    246230                if(cipher) { 
    247                         wr_printf_prefix(WI_STR("Connected using %@/%u bits, logging in..."), 
    248                                 wi_cipher_name(cipher), 
    249                                 wi_cipher_bits(cipher)); 
     231                        wr_printf_prefix(WI_STR("Connected using %u-bit %@, logging in..."), 
     232                                wi_cipher_bits(cipher), 
     233                                wi_cipher_name(cipher)); 
    250234                } else { 
    251235                        wr_printf_prefix(WI_STR("Connected, logging in...")); 
     
    264248                 
    265249                { 
    266                         wi_p7_message_t *message = wi_p7_message_with_name(WI_STR("wired.info"), wr_p7_socket); 
    267                         wi_p7_message_set_string_for_name(message, WI_STR("wire"), WI_STR("wired.info.application.name")); 
     250                        wi_p7_message_t *message = wr_message_with_name(WI_STR("wired.client_info")); 
     251                        wr_message_set_string_for_name(message, WI_STR("wire"), WI_STR("wired.info.application.name")); 
    268252                         
    269                         wi_p7_socket_write_message(wr_p7_socket, 0.0, message); 
     253                        wr_send_message(message); 
    270254                } 
    271255                 
     
    314298 
    315299static wi_integer_t wr_runloop_server_callback(wi_socket_t *socket) { 
    316         wi_string_t             *string; 
    317         uint32_t                message = 0; 
    318          
    319         string = wi_socket_read_to_string(wr_socket, 0.0, WI_STR(WR_MESSAGE_SEPARATOR_STR)); 
    320          
    321         if(string && wi_string_length(string) > 0) { 
    322                 message = wr_parse_message(string); 
     300        wi_p7_message_t         *message; 
     301        wr_message_func_t       *handler; 
     302         
     303        message = wi_p7_socket_read_message(wr_p7_socket, 0.0); 
     304         
     305        if(message) { 
     306                handler = wi_hash_data_for_key(wr_message_handlers, wi_p7_message_name(message)); 
     307                 
     308                if(handler) 
     309                        (*handler)(message); 
     310                else 
     311                        wr_printf_prefix(WI_STR("No handler for message %@"), wi_p7_message_name(message)); 
    323312        } else { 
    324                 if(!string) 
    325                         wr_printf_prefix(WI_STR("Could not read from server: %m")); 
     313                wr_printf_prefix(WI_STR("Could not read from server: %m")); 
    326314 
    327315                wr_disconnect(); 
    328316        } 
    329317         
    330         return message
     318        return 0
    331319} 
    332320 
     
    335323#pragma mark - 
    336324 
    337 static uint32_t wr_parse_message(wi_string_t *buffer) { 
     325/*static uint32_t wr_parse_message(wi_string_t *buffer) { 
    338326        wi_array_t              *arguments; 
    339327        wi_string_t             *string; 
     
    458446} 
    459447 
    460  
     448*/ 
    461449 
    462450wi_boolean_t wr_send_command(wi_string_t *fmt, ...) { 
     
    506494#pragma mark - 
    507495 
     496wi_p7_message_t * wr_message_with_name(wi_string_t *name) { 
     497        return wi_p7_message_with_name(name, wr_p7_socket); 
     498} 
     499 
     500 
     501 
     502void wr_message_set_string_for_name(wi_p7_message_t *message, wi_string_t *string, wi_string_t *name) { 
     503        wi_string_t             *converted_string; 
     504         
     505        converted_string = wi_string_by_converting_encoding(string, wr_client_string_encoding, wr_server_string_encoding); 
     506         
     507        wi_p7_message_set_string_for_name(message, converted_string, name); 
     508} 
     509 
     510 
     511 
     512wi_string_t * wr_message_string_for_name(wi_p7_message_t *message, wi_string_t *name) { 
     513        wi_string_t             *string; 
     514         
     515        string = wi_p7_message_string_for_name(message, name); 
     516         
     517        if(!string) 
     518                return NULL; 
     519         
     520        wi_string_convert_encoding(string, wr_server_string_encoding, wr_client_string_encoding); 
     521 
     522        return string; 
     523} 
     524 
     525 
     526 
     527#pragma mark - 
     528 
     529wi_boolean_t wr_send_message(wi_p7_message_t *message) { 
     530        wi_integer_t    result; 
     531         
     532        wi_p7_message_set_uint32_for_name(message, wr_transaction++, WI_STR("wired.transaction")); 
     533         
     534        result = wi_p7_socket_write_message(wr_p7_socket, 15.0, message); 
     535         
     536        if(result <= 0) 
     537                wr_printf_prefix(WI_STR("Could not write to server: %m")); 
     538         
     539        return (result > 0); 
     540} 
     541 
     542 
     543 
     544#pragma mark - 
     545 
     546static void wr_message_login_reply(wi_p7_message_t *reply) { 
     547        wi_p7_message_t         *message; 
     548 
     549        wr_wprintf_prefix(wr_console_window, WI_STR("Logged in, welcome to %@"), wr_server->name); 
     550         
     551        message = wr_message_with_name(WI_STR("wired.set_nick")); 
     552        wr_message_set_string_for_name(message, wr_nick, WI_STR("wired.user.nick")); 
     553        wr_send_message(message); 
     554         
     555        if(wr_status) { 
     556                message = wr_message_with_name(WI_STR("wired.set_status")); 
     557                wr_message_set_string_for_name(message, wr_status, WI_STR("wired.user.status")); 
     558                wr_send_message(message); 
     559        } 
     560         
     561        if(wr_icon) { 
     562                message = wr_message_with_name(WI_STR("wired.set_icon")); 
     563                wi_p7_message_set_data_for_name(message, wr_icon, WI_STR("wired.user.icon")); 
     564                wr_send_message(message); 
     565        } 
     566} 
     567 
     568 
     569 
     570static void wr_message_ping_reply(wi_p7_message_t *reply) { 
     571} 
     572 
     573 
     574 
     575static void wr_message_server_info(wi_p7_message_t *message) { 
     576        wi_p7_message_t         *reply; 
     577 
     578        wr_server = wr_server_init(wr_server_alloc()); 
     579        wr_server->name = wi_retain(wi_p7_message_string_for_name(message, WI_STR("wired.server_info.name"))); 
     580        wr_server->description = wi_retain(wi_p7_message_string_for_name(message, WI_STR("wired.server_info.description"))); 
     581        wr_server->startdate = wi_retain(wi_p7_message_string_for_name(message, WI_STR("wired.server_info.launch"))); 
     582//      wr_server->files = wi_string_uint32(WI_ARRAY(arguments, 4)); 
     583//      wr_server->size = wi_string_uint64(WI_ARRAY(arguments, 5)); 
     584 
     585        wr_draw_divider(); 
     586 
     587        if(!wr_logged_in) { 
     588                reply = wr_message_with_name(WI_STR("wired.login")); 
     589                wr_message_set_string_for_name(reply, wr_login, WI_STR("wired.user.login")); 
     590                wr_message_set_string_for_name(reply, wi_string_sha1(wr_password), WI_STR("wired.login.password")); 
     591                wr_send_message(reply); 
     592        } 
     593} 
     594 
     595 
     596 
     597#pragma mark - 
     598/* 
    508599static void wr_msg_200(wi_array_t *arguments) { 
    509600        double          protocol; 
     
    12121303                wr_print_files(); 
    12131304} 
     1305*/ 
  • wire/branches/p7/wire/client.h

    r4674 r4684  
    5555void                                                                    wr_disconnect(void); 
    5656 
     57wi_p7_message_t *                                               wr_message_with_name(wi_string_t *); 
     58void                                                                    wr_message_set_string_for_name(wi_p7_message_t *, wi_string_t *, wi_string_t *); 
     59wi_string_t *                                                   wr_message_string_for_name(wi_p7_message_t *, wi_string_t *); 
     60 
     61wi_boolean_t                                                    wr_send_message(wi_p7_message_t *); 
     62 
    5763wi_boolean_t                                                    wr_send_command(wi_string_t *, ...); 
    5864wi_boolean_t                                                    wr_send_command_on_socket(wi_socket_t *, wi_string_t *, ...); 
     
    6975extern wi_string_t                                              *wr_nick; 
    7076extern wi_string_t                                              *wr_status; 
    71 extern wi_string_t                                            *wr_icon; 
     77extern wi_data_t                                              *wr_icon; 
    7278extern wi_string_t                                              *wr_login; 
    7379extern wi_string_t                                              *wr_password; 
  • wire/branches/p7/wire/commands.c

    r4616 r4684  
    783783 
    784784static void wr_cmd_icon(wi_array_t *arguments) { 
    785         wi_string_t             *path, *string; 
     785        wi_string_t             *path; 
     786        wi_data_t               *data; 
    786787 
    787788        path = wi_string_by_normalizing_path(WI_ARRAY(arguments, 0)); 
    788         string = wi_string_init_with_contents_of_file(wi_string_alloc(), wi_string_by_normalizing_path(path)); 
    789          
    790         if(string) { 
     789        data = wi_data_init_with_contents_of_file(wi_data_alloc(), wi_string_by_normalizing_path(path)); 
     790         
     791        if(data) { 
    791792                wi_release(wr_icon_path); 
    792793                wr_icon_path = wi_retain(path); 
    793794                 
    794795                wi_release(wr_icon); 
    795                 wr_icon = wi_retain(wi_string_base64(string))
     796                wr_icon = data
    796797                 
    797798                if(wr_connected) 
    798799                        wr_send_command(WI_STR("ICON %u%c%#@"), 0, WR_FIELD_SEPARATOR, wr_icon); 
    799  
    800                 wi_release(string); 
    801800        } else { 
    802801                wr_printf_prefix(WI_STR("icon: %@: %m"), path); 
     
    11561155 
    11571156static void wr_cmd_nick(wi_array_t *arguments) { 
    1158         wi_string_t             *nick; 
     1157        wi_string_t                     *nick; 
     1158        wi_p7_message_t         *message; 
    11591159         
    11601160        nick = WI_ARRAY(arguments, 0); 
     
    11661166                wr_draw_divider(); 
    11671167                 
    1168                 if(wr_connected) 
    1169                         wr_send_command(WI_STR("NICK %#@"), wr_nick); 
     1168                if(wr_connected) { 
     1169                        message = wr_message_with_name(WI_STR("wired.set_nick")); 
     1170                        wr_message_set_string_for_name(message, wr_nick, WI_STR("wired.user.nick")); 
     1171                        wr_send_message(message); 
     1172                } 
    11701173        } 
    11711174} 
  • wire/branches/p7/wire/main.c

    r4674 r4684  
    342342                         
    343343                        if(interval - ping_interval > 60.0) { 
    344                                 wi_p7_message_t         *message; 
    345                                  
    346                                 message = wi_p7_message_with_name(WI_STR("wired.ping"), wr_p7_socket); 
    347                                  
    348                                 if(!wi_p7_socket_write_message(wr_p7_socket, 10.0, message)) 
    349                                         wr_printf_prefix(WI_STR("write: %m")); 
     344                                wr_send_message(wi_p7_message_with_name(WI_STR("wired.ping"), wr_p7_socket)); 
    350345                                 
    351346                                ping_interval = interval;