Changeset 4684
- Timestamp:
- 02/22/07 18:02:28 (1 year ago)
- Files:
-
- wire/branches/p7/wire/client.c (modified) (12 diffs)
- wire/branches/p7/wire/client.h (modified) (2 diffs)
- wire/branches/p7/wire/commands.c (modified) (3 diffs)
- wire/branches/p7/wire/main.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
wire/branches/p7/wire/client.c
r4674 r4684 42 42 #include "windows.h" 43 43 44 typedef void wr_message_func_t(wi_p7_message_t *); 45 46 44 47 static wi_integer_t wr_runloop_server_callback(wi_socket_t *); 45 48 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 *); 49 static void wr_message_login_reply(wi_p7_message_t *); 50 static void wr_message_ping_reply(wi_p7_message_t *); 51 static void wr_message_server_info(wi_p7_message_t *); 77 52 78 53 … … 87 62 wi_string_t *wr_nick; 88 63 wi_string_t *wr_status; 89 wi_ string_t *wr_icon;64 wi_data_t *wr_icon; 90 65 wi_string_t *wr_login; 91 66 wi_string_t *wr_password; … … 93 68 wi_string_t *wr_icon_path; 94 69 wi_string_t *wr_timestamp_format; 70 71 wi_socket_t *wr_socket; 72 wi_p7_socket_t *wr_p7_socket; 73 wi_address_t *wr_address; 74 75 uint64_t wr_received_bytes; 76 uint64_t wr_transferred_bytes; 77 78 wi_integer_t wr_news_count; 79 wi_integer_t wr_news_limit; 80 81 wi_time_interval_t wr_ping_time; 82 83 wi_boolean_t wr_connected; 84 wi_boolean_t wr_logged_in; 85 86 static wi_socket_context_t *wr_socket_context; 87 88 static wi_hash_t *wr_message_handlers; 89 90 static wi_p7_spec_t *wr_p7_spec; 91 92 static wi_p7_uint32_t wr_transaction; 95 93 96 94 static const char wr_default_icon[] = … … 139 137 "Vy/xW31D+jfvNtPdS+ASBQAAAABJRU5ErkJggg=="; 140 138 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;159 139 160 140 161 141 void 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 164 149 wr_socket_context = wi_socket_context_init(wi_socket_context_alloc()); 165 150 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 171 151 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); 175 153 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)); 180 164 181 165 wr_p7_spec = wi_p7_spec_init_with_file(wi_p7_spec_alloc(), WI_STR("wired.xml")); … … 235 219 p7_socket = wi_autorelease(wi_p7_socket_init_with_socket(wi_p7_socket_alloc(), socket, wr_p7_spec)); 236 220 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)) { 239 223 wr_printf_prefix(WI_STR("Could not connect to %@: %m"), ip); 240 224 … … 245 229 246 230 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)); 250 234 } else { 251 235 wr_printf_prefix(WI_STR("Connected, logging in...")); … … 264 248 265 249 { 266 wi_p7_message_t *message = w i_p7_message_with_name(WI_STR("wired.info"), wr_p7_socket);267 w i_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")); 268 252 269 w i_p7_socket_write_message(wr_p7_socket, 0.0,message);253 wr_send_message(message); 270 254 } 271 255 … … 314 298 315 299 static 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)); 323 312 } 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")); 326 314 327 315 wr_disconnect(); 328 316 } 329 317 330 return message;318 return 0; 331 319 } 332 320 … … 335 323 #pragma mark - 336 324 337 static uint32_t wr_parse_message(wi_string_t *buffer) {325 /*static uint32_t wr_parse_message(wi_string_t *buffer) { 338 326 wi_array_t *arguments; 339 327 wi_string_t *string; … … 458 446 } 459 447 460 448 */ 461 449 462 450 wi_boolean_t wr_send_command(wi_string_t *fmt, ...) { … … 506 494 #pragma mark - 507 495 496 wi_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 502 void 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 512 wi_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 529 wi_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 546 static 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 570 static void wr_message_ping_reply(wi_p7_message_t *reply) { 571 } 572 573 574 575 static 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 /* 508 599 static void wr_msg_200(wi_array_t *arguments) { 509 600 double protocol; … … 1212 1303 wr_print_files(); 1213 1304 } 1305 */ wire/branches/p7/wire/client.h
r4674 r4684 55 55 void wr_disconnect(void); 56 56 57 wi_p7_message_t * wr_message_with_name(wi_string_t *); 58 void wr_message_set_string_for_name(wi_p7_message_t *, wi_string_t *, wi_string_t *); 59 wi_string_t * wr_message_string_for_name(wi_p7_message_t *, wi_string_t *); 60 61 wi_boolean_t wr_send_message(wi_p7_message_t *); 62 57 63 wi_boolean_t wr_send_command(wi_string_t *, ...); 58 64 wi_boolean_t wr_send_command_on_socket(wi_socket_t *, wi_string_t *, ...); … … 69 75 extern wi_string_t *wr_nick; 70 76 extern wi_string_t *wr_status; 71 extern wi_ string_t *wr_icon;77 extern wi_data_t *wr_icon; 72 78 extern wi_string_t *wr_login; 73 79 extern wi_string_t *wr_password; wire/branches/p7/wire/commands.c
r4616 r4684 783 783 784 784 static void wr_cmd_icon(wi_array_t *arguments) { 785 wi_string_t *path, *string; 785 wi_string_t *path; 786 wi_data_t *data; 786 787 787 788 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) { 791 792 wi_release(wr_icon_path); 792 793 wr_icon_path = wi_retain(path); 793 794 794 795 wi_release(wr_icon); 795 wr_icon = wi_retain(wi_string_base64(string));796 wr_icon = data; 796 797 797 798 if(wr_connected) 798 799 wr_send_command(WI_STR("ICON %u%c%#@"), 0, WR_FIELD_SEPARATOR, wr_icon); 799 800 wi_release(string);801 800 } else { 802 801 wr_printf_prefix(WI_STR("icon: %@: %m"), path); … … 1156 1155 1157 1156 static void wr_cmd_nick(wi_array_t *arguments) { 1158 wi_string_t *nick; 1157 wi_string_t *nick; 1158 wi_p7_message_t *message; 1159 1159 1160 1160 nick = WI_ARRAY(arguments, 0); … … 1166 1166 wr_draw_divider(); 1167 1167 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 } 1170 1173 } 1171 1174 } wire/branches/p7/wire/main.c
r4674 r4684 342 342 343 343 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)); 350 345 351 346 ping_interval = interval;
