Mercurial > pidgin
comparison src/protocols/simple/simple.c @ 11341:3f0fda678686
[gaim-migrate @ 13555]
- small compatibility improvements for gizmo/linphone
- // -> /* */
- removed some mem leaks
committer: Tailor Script <tailor@pidgin.im>
author | Thomas Butter <tbutter> |
---|---|
date | Thu, 25 Aug 2005 06:59:20 +0000 |
parents | 1696caba7db2 |
children | 03d9507f05a9 |
comparison
equal
deleted
inserted
replaced
11340:e9d0d944b9d2 | 11341:3f0fda678686 |
---|---|
67 return "simple"; | 67 return "simple"; |
68 } | 68 } |
69 | 69 |
70 static void simple_keep_alive(GaimConnection *gc) { | 70 static void simple_keep_alive(GaimConnection *gc) { |
71 struct simple_account_data *sip = gc->proto_data; | 71 struct simple_account_data *sip = gc->proto_data; |
72 if(sip->udp) { // in case of UDP send a packet only with a 0 byte to | 72 if(sip->udp) { /* in case of UDP send a packet only with a 0 byte to |
73 // stay in the NAT table | 73 remain in the NAT table */ |
74 gchar buf[2]={0,0}; | 74 gchar buf[2]={0,0}; |
75 gaim_debug_info("simple", "sending keep alive\n"); | 75 gaim_debug_info("simple", "sending keep alive\n"); |
76 sendto(sip->fd, buf, 1, 0, (struct sockaddr*)&sip->serveraddr, sizeof(struct sockaddr_in)); | 76 sendto(sip->fd, buf, 1, 0, (struct sockaddr*)&sip->serveraddr, sizeof(struct sockaddr_in)); |
77 } | 77 } |
78 return; | 78 return; |
442 strlen(body), | 442 strlen(body), |
443 body); | 443 body); |
444 g_free(branch); | 444 g_free(branch); |
445 g_free(callid); | 445 g_free(callid); |
446 | 446 |
447 // add to running transactions | 447 /* add to ongoing transactions */ |
448 | 448 |
449 transactions_add_buf(sip, buf, tc); | 449 transactions_add_buf(sip, buf, tc); |
450 | 450 |
451 sendout_pkt(gc,buf); | 451 sendout_pkt(gc,buf); |
452 | 452 |
458 | 458 |
459 char *uri = g_strdup_printf("sip:%s",sip->servername); | 459 char *uri = g_strdup_printf("sip:%s",sip->servername); |
460 char *to = g_strdup_printf("sip:%s@%s",sip->username,sip->servername); | 460 char *to = g_strdup_printf("sip:%s@%s",sip->username,sip->servername); |
461 char *contact = g_strdup_printf("Contact: <sip:%s@%s:%d;transport=%s>;methods=\"MESSAGE, SUBSCRIBE, NOTIFY\"\r\nExpires: %d\r\n", sip->username, sip->ip, sip->listenport, sip->udp ? "udp" : "tcp", expire); | 461 char *contact = g_strdup_printf("Contact: <sip:%s@%s:%d;transport=%s>;methods=\"MESSAGE, SUBSCRIBE, NOTIFY\"\r\nExpires: %d\r\n", sip->username, sip->ip, sip->listenport, sip->udp ? "udp" : "tcp", expire); |
462 | 462 |
463 // allow one auth try per register | 463 /* allow one auth try per register */ |
464 sip->proxy.fouroseven = 0; | 464 sip->proxy.fouroseven = 0; |
465 sip->registrar.fouroseven = 0; | 465 sip->registrar.fouroseven = 0; |
466 | 466 |
467 if(expire) { | 467 if(expire) { |
468 sip->reregister = time(NULL) + expire - 50; | 468 sip->reregister = time(NULL) + expire - 50; |
469 } else { | 469 } else { |
470 sip->reregister = time(NULL) + 600; | 470 sip->reregister = time(NULL) + 600; |
471 } | 471 } |
472 send_sip_request(sip->gc,"REGISTER",uri,to, contact, "", NULL, process_register_response); | 472 send_sip_request(sip->gc,"REGISTER",uri,to, contact, "", NULL, process_register_response); |
473 g_free(contact); | |
473 g_free(uri); | 474 g_free(uri); |
474 g_free(to); | 475 g_free(to); |
475 } | 476 } |
476 | 477 |
477 static void do_register(struct simple_account_data *sip) { | 478 static void do_register(struct simple_account_data *sip) { |
484 | 485 |
485 if(!from) return NULL; | 486 if(!from) return NULL; |
486 gaim_debug_info("simple", "parsing address out of %s\n",from); | 487 gaim_debug_info("simple", "parsing address out of %s\n",from); |
487 tmp = strchr(from, '<'); | 488 tmp = strchr(from, '<'); |
488 | 489 |
489 // i hate the different SIP UA behaviours... | 490 /* i hate the different SIP UA behaviours... */ |
490 if(tmp) { // sip address in <...> | 491 if(tmp) { /* sip address in <...> */ |
491 from = tmp+1; | 492 from = tmp+1; |
492 tmp = strchr(from,'>'); | 493 tmp = strchr(from,'>'); |
493 if(tmp) { | 494 if(tmp) { |
494 from = g_strndup(from,tmp-from); | 495 from = g_strndup(from,tmp-from); |
495 } else { | 496 } else { |
505 gaim_debug_info("simple", "got %s\n",from); | 506 gaim_debug_info("simple", "got %s\n",from); |
506 return from; | 507 return from; |
507 } | 508 } |
508 | 509 |
509 static gboolean process_subscribe_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { | 510 static gboolean process_subscribe_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { |
510 gchar *to = parse_from(sipmsg_find_header(tc->msg,"To")); // cant be NULL since it is our own msg | 511 gchar *to = parse_from(sipmsg_find_header(tc->msg,"To")); /* cant be NULL since it is our own msg */ |
511 | 512 |
512 | 513 |
513 if(msg->response==200 || msg->response==202) { | 514 if(msg->response==200 || msg->response==202) { |
514 return TRUE; | 515 return TRUE; |
515 } | 516 } |
516 | 517 |
517 // we can not subscribe -> user is offline (TODO unknown status?) | 518 /* we can not subscribe -> user is offline (TODO unknown status?) */ |
518 | 519 |
519 gaim_prpl_got_user_status(sip->account, to, "offline", NULL); | 520 gaim_prpl_got_user_status(sip->account, to, "offline", NULL); |
520 g_free(to); | 521 g_free(to); |
521 return TRUE; | 522 return TRUE; |
522 } | 523 } |
523 | 524 |
524 static void simple_subscribe(struct simple_account_data *sip, struct simple_buddy *buddy) { | 525 static void simple_subscribe(struct simple_account_data *sip, struct simple_buddy *buddy) { |
525 gchar *contact = "Expires: 900\r\nAccept: application/pidf+xml\r\nEvent: presence\r\n"; | 526 gchar *contact = "Expires: 300\r\nAccept: application/pidf+xml\r\nEvent: presence\r\n"; |
526 gchar *to; | 527 gchar *to; |
527 if(strstr(buddy->name,"sip:")) to = g_strdup(buddy->name); | 528 if(strstr(buddy->name,"sip:")) to = g_strdup(buddy->name); |
528 else to = g_strdup_printf("sip:%s",buddy->name); | 529 else to = g_strdup_printf("sip:%s",buddy->name); |
529 // subscribe to buddy presence | 530 contact = g_strdup_printf("%sContact: <%s@%s>\r\n", contact, sip->username, sip->servername); |
530 // we dont need to know the status so we do not need a callback | 531 /* subscribe to buddy presence |
532 * we dont need to know the status so we do not need a callback */ | |
531 | 533 |
532 send_sip_request(sip->gc, "SUBSCRIBE",to, to, contact, "", NULL, process_subscribe_response); | 534 send_sip_request(sip->gc, "SUBSCRIBE",to, to, contact, "", NULL, process_subscribe_response); |
533 | 535 |
534 g_free(to); | 536 g_free(to); |
535 | 537 g_free(contact); |
536 // resubscribe before of subscription expires | 538 |
537 // add some jitter | 539 /* resubscribe before subscription expires */ |
538 buddy->resubscribe = time(NULL)+550+(rand()%50); | 540 /* add some jitter */ |
541 buddy->resubscribe = time(NULL)+250+(rand()%50); | |
539 } | 542 } |
540 | 543 |
541 static void simple_buddy_resub(char *name, struct simple_buddy *buddy, struct simple_account_data *sip) { | 544 static void simple_buddy_resub(char *name, struct simple_buddy *buddy, struct simple_account_data *sip) { |
542 time_t curtime = time(NULL); | 545 time_t curtime = time(NULL); |
543 | 546 gaim_debug_info("simple","buddy resub\n"); |
544 if(buddy->resubscribe < curtime) { | 547 if(buddy->resubscribe < curtime) { |
545 gaim_debug(GAIM_DEBUG_MISC, "simple", "simple_buddy_resub %s\n",name); | 548 gaim_debug(GAIM_DEBUG_MISC, "simple", "simple_buddy_resub %s\n",name); |
546 simple_subscribe(sip, buddy); | 549 simple_subscribe(sip, buddy); |
547 } | 550 } |
548 } | 551 } |
553 while(tmp) { | 556 while(tmp) { |
554 struct transaction *trans = tmp->data; | 557 struct transaction *trans = tmp->data; |
555 tmp = tmp->next; | 558 tmp = tmp->next; |
556 gaim_debug_info("simple", "have open transaction age: %d\n", currtime- trans->time); | 559 gaim_debug_info("simple", "have open transaction age: %d\n", currtime- trans->time); |
557 if((currtime - trans->time > 5) && trans->retries >= 1) { | 560 if((currtime - trans->time > 5) && trans->retries >= 1) { |
558 // TODO 408 | 561 /* TODO 408 */ |
559 } else { | 562 } else { |
560 if((currtime - trans->time > 2) && trans->retries == 0) { | 563 if((currtime - trans->time > 2) && trans->retries == 0) { |
561 trans->retries++; | 564 trans->retries++; |
562 sendout_sipmsg(sip, trans->msg); | 565 sendout_sipmsg(sip, trans->msg); |
563 } | 566 } |
567 } | 570 } |
568 | 571 |
569 static gboolean register_timeout(struct simple_account_data *sip) { | 572 static gboolean register_timeout(struct simple_account_data *sip) { |
570 GSList *tmp; | 573 GSList *tmp; |
571 time_t curtime = time(NULL); | 574 time_t curtime = time(NULL); |
572 // register again if first registration expires | 575 /* register again if first registration expires */ |
573 if(sip->reregister < curtime) { | 576 if(sip->reregister < curtime) { |
574 do_register(sip); | 577 do_register(sip); |
575 } | 578 } |
576 | 579 gaim_debug_info("simple","in register timeout\n"); |
577 // check for every subscription if we need to resubscribe | 580 /* check for every subscription if we need to resubscribe */ |
578 g_hash_table_foreach(sip->buddies, (GHFunc)simple_buddy_resub, (gpointer)sip); | 581 g_hash_table_foreach(sip->buddies, (GHFunc)simple_buddy_resub, (gpointer)sip); |
579 | 582 |
580 // remove a timed out suscriber | 583 /* remove a timed out suscriber */ |
581 | 584 |
582 tmp = sip->watcher; | 585 tmp = sip->watcher; |
583 while(tmp) { | 586 while(tmp) { |
584 struct simple_watcher *watcher = tmp->data; | 587 struct simple_watcher *watcher = tmp->data; |
585 if(watcher->expire < curtime) { | 588 if(watcher->expire < curtime) { |
691 gboolean process_register_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { | 694 gboolean process_register_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { |
692 gchar *tmp; | 695 gchar *tmp; |
693 gaim_debug(GAIM_DEBUG_MISC, "simple", "in process register response response: %d\n", msg->response); | 696 gaim_debug(GAIM_DEBUG_MISC, "simple", "in process register response response: %d\n", msg->response); |
694 switch (msg->response) { | 697 switch (msg->response) { |
695 case 200: | 698 case 200: |
696 if(sip->registerstatus<3) { // registered | 699 if(sip->registerstatus<3) { /* registered */ |
697 send_publish(sip); | 700 send_publish(sip); |
698 } | 701 } |
699 sip->registerstatus=3; | 702 sip->registerstatus=3; |
700 gaim_connection_set_state(sip->gc, GAIM_CONNECTED); | 703 gaim_connection_set_state(sip->gc, GAIM_CONNECTED); |
704 | |
705 /* get buddies from blist */ | |
706 simple_get_buddies(sip->gc); | |
707 | |
701 register_timeout(sip); | 708 register_timeout(sip); |
702 break; | 709 break; |
703 case 401: | 710 case 401: |
704 if(sip->registerstatus!=2) { | 711 if(sip->registerstatus!=2) { |
705 tmp = sipmsg_find_header(msg, "WWW-Authenticate"); | 712 tmp = sipmsg_find_header(msg, "WWW-Authenticate"); |
823 g_free(doc); | 830 g_free(doc); |
824 } | 831 } |
825 | 832 |
826 static gboolean process_publish_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { | 833 static gboolean process_publish_response(struct simple_account_data *sip, struct sipmsg *msg, struct transaction *tc) { |
827 if(msg->response != 200) { | 834 if(msg->response != 200) { |
828 // never send again | 835 /* never send again */ |
829 sip->republish = -1; | 836 sip->republish = -1; |
830 } | 837 } |
831 return TRUE; | 838 return TRUE; |
832 } | 839 } |
833 | 840 |
834 static void send_publish(struct simple_account_data *sip) { | 841 static void send_publish(struct simple_account_data *sip) { |
835 gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername); | 842 gchar *uri = g_strdup_printf("sip:%s@%s", sip->username, sip->servername); |
836 gchar *doc = gen_pidf(sip); | 843 gchar *doc = gen_pidf(sip); |
837 send_sip_request(sip->gc, "PUBLISH", uri, uri, "Expires: 600\r\nEvent: presence\r\nContent-Type: application/pidf+xml\r\nAccept: application/pidf+xml\r\n", doc, NULL, process_publish_response); | 844 send_sip_request(sip->gc, "PUBLISH", uri, uri, "Expires: 600\r\nEvent: presence\r\nContent-Type: application/pidf+xml\r\n", doc, NULL, process_publish_response); |
838 sip->republish = time(NULL) + 500; | 845 sip->republish = time(NULL) + 500; |
839 g_free(doc); | 846 g_free(doc); |
840 } | 847 } |
841 | 848 |
842 static void process_incoming_subscribe(struct simple_account_data *sip, struct sipmsg *msg) { | 849 static void process_incoming_subscribe(struct simple_account_data *sip, struct sipmsg *msg) { |
850 struct simple_watcher *watcher = watcher_find(sip, from); | 857 struct simple_watcher *watcher = watcher_find(sip, from); |
851 if(!ourtag) { | 858 if(!ourtag) { |
852 tagadded = TRUE; | 859 tagadded = TRUE; |
853 ourtag = gentag(); | 860 ourtag = gentag(); |
854 } | 861 } |
855 if(!watcher) { // new subscription | 862 if(!watcher) { /* new subscription */ |
856 watcher = watcher_create(sip, from, callid, ourtag, theirtag); | 863 watcher = watcher_create(sip, from, callid, ourtag, theirtag); |
857 } | 864 } |
858 if(tagadded) { | 865 if(tagadded) { |
859 gchar *to = g_strdup_printf("%s;tag=%s", sipmsg_find_header(msg, "To"), ourtag); | 866 gchar *to = g_strdup_printf("%s;tag=%s", sipmsg_find_header(msg, "To"), ourtag); |
860 sipmsg_remove_header(msg, "To"); | 867 sipmsg_remove_header(msg, "To"); |
873 send_notify(sip, watcher); | 880 send_notify(sip, watcher); |
874 } | 881 } |
875 | 882 |
876 static void process_input_message(struct simple_account_data *sip, struct sipmsg *msg) { | 883 static void process_input_message(struct simple_account_data *sip, struct sipmsg *msg) { |
877 int found = 0; | 884 int found = 0; |
878 if( msg->response == 0 ) { // request | 885 if( msg->response == 0 ) { /* request */ |
879 if(!strcmp(msg->method, "MESSAGE")) { | 886 if(!strcmp(msg->method, "MESSAGE")) { |
880 process_incoming_message(sip, msg); | 887 process_incoming_message(sip, msg); |
881 found = 1; | 888 found = 1; |
882 } | 889 } |
883 if(!strcmp(msg->method, "NOTIFY")) { | 890 if(!strcmp(msg->method, "NOTIFY")) { |
889 found = 1; | 896 found = 1; |
890 } | 897 } |
891 if(!found) { | 898 if(!found) { |
892 send_sip_response(sip->gc, msg, 501, "Not implemented", NULL); | 899 send_sip_response(sip->gc, msg, 501, "Not implemented", NULL); |
893 } | 900 } |
894 } else { // response | 901 } else { /* response */ |
895 struct transaction *trans = transactions_find(sip, msg); | 902 struct transaction *trans = transactions_find(sip, msg); |
896 if(trans) { | 903 if(trans) { |
897 if(msg->response == 407) { | 904 if(msg->response == 407) { |
898 if(sip->proxy.fouroseven>3) return; | 905 if(sip->proxy.fouroseven>3) return; |
899 sip->proxy.fouroseven++; | 906 sip->proxy.fouroseven++; |
900 // do proxy authentication | 907 /* do proxy authentication */ |
901 | 908 |
902 gchar *ptmp = sipmsg_find_header(msg,"Proxy-Authenticate"); | 909 gchar *ptmp = sipmsg_find_header(msg,"Proxy-Authenticate"); |
903 gchar *resend; | 910 gchar *resend; |
904 gchar *auth; | 911 gchar *auth; |
905 | 912 |
914 auth = g_strdup_printf("Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", nc=\"%s\", response=\"%s\"\r\n",sip->username, sip->proxy.realm, sip->proxy.nonce, trans->msg->target, noncecount, response); | 921 auth = g_strdup_printf("Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", nc=\"%s\", response=\"%s\"\r\n",sip->username, sip->proxy.realm, sip->proxy.nonce, trans->msg->target, noncecount, response); |
915 sipmsg_remove_header(msg, "Proxy-Authorization"); | 922 sipmsg_remove_header(msg, "Proxy-Authorization"); |
916 sipmsg_add_header(trans->msg, "Proxy-Authorization", auth); | 923 sipmsg_add_header(trans->msg, "Proxy-Authorization", auth); |
917 g_free(auth); | 924 g_free(auth); |
918 resend = sipmsg_to_string(trans->msg); | 925 resend = sipmsg_to_string(trans->msg); |
919 // resend request | 926 /* resend request */ |
920 sendout_pkt(sip->gc, resend); | 927 sendout_pkt(sip->gc, resend); |
921 g_free(resend); | 928 g_free(resend); |
922 } else { | 929 } else { |
923 sip->proxy.fouroseven = 0; | 930 sip->proxy.fouroseven = 0; |
924 if(msg->response == 401) sip->registrar.fouroseven++; | 931 if(msg->response == 401) sip->registrar.fouroseven++; |
925 else sip->registrar.fouroseven = 0; | 932 else sip->registrar.fouroseven = 0; |
926 if(trans->callback) { | 933 if(trans->callback) { |
927 // call the callback to process response | 934 /* call the callback to process response*/ |
928 (trans->callback)(sip, msg, trans); | 935 (trans->callback)(sip, msg, trans); |
929 } | 936 } |
930 transactions_remove(sip, trans); | 937 transactions_remove(sip, trans); |
931 } | 938 } |
932 found = 1; | 939 found = 1; |
946 struct sipmsg *msg; | 953 struct sipmsg *msg; |
947 int restlen; | 954 int restlen; |
948 | 955 |
949 cur = conn->inbuf; | 956 cur = conn->inbuf; |
950 | 957 |
951 // according to the RFC remove CRLF at the beginning | 958 /* according to the RFC remove CRLF at the beginning */ |
952 while(*cur == '\r' || *cur == '\n') { | 959 while(*cur == '\r' || *cur == '\n') { |
953 cur++; | 960 cur++; |
954 } | 961 } |
955 if(cur != conn->inbuf) { | 962 if(cur != conn->inbuf) { |
956 memmove(conn->inbuf, cur, conn->inbufused-(cur-conn->inbuf)); | 963 memmove(conn->inbuf, cur, conn->inbufused-(cur-conn->inbuf)); |
957 conn->inbufused=strlen(conn->inbuf); | 964 conn->inbufused=strlen(conn->inbuf); |
958 } | 965 } |
959 | 966 |
960 // Received a full Header? | 967 /* Received a full Header? */ |
961 if((cur = strstr(conn->inbuf, "\r\n\r\n"))!=NULL) { | 968 if((cur = strstr(conn->inbuf, "\r\n\r\n"))!=NULL) { |
962 time_t currtime = time(NULL); | 969 time_t currtime = time(NULL); |
963 cur += 2; | 970 cur += 2; |
964 cur[0] = '\0'; | 971 cur[0] = '\0'; |
965 gaim_debug_info("simple","\n\nreceived - %s\n######\n%s\n#######\n\n",ctime(&currtime), conn->inbuf); | 972 gaim_debug_info("simple","\n\nreceived - %s\n######\n%s\n#######\n\n",ctime(&currtime), conn->inbuf); |
977 conn->inbufused=strlen(conn->inbuf); | 984 conn->inbufused=strlen(conn->inbuf); |
978 } else { | 985 } else { |
979 sipmsg_free(msg); | 986 sipmsg_free(msg); |
980 return; | 987 return; |
981 } | 988 } |
982 // sipmsg_print(msg); | |
983 gaim_debug(GAIM_DEBUG_MISC, "simple", "in process response response: %d\n", msg->response); | 989 gaim_debug(GAIM_DEBUG_MISC, "simple", "in process response response: %d\n", msg->response); |
984 process_input_message(sip,msg); | 990 process_input_message(sip,msg); |
985 } else { | 991 } else { |
986 gaim_debug(GAIM_DEBUG_MISC, "simple", "received a incomplete sip msg: %s\n", conn->inbuf); | 992 gaim_debug(GAIM_DEBUG_MISC, "simple", "received a incomplete sip msg: %s\n", conn->inbuf); |
987 } | 993 } |
1020 | 1026 |
1021 if ((len = read(source, conn->inbuf + conn->inbufused, SIMPLE_BUF_INC - 1)) <= 0) { | 1027 if ((len = read(source, conn->inbuf + conn->inbufused, SIMPLE_BUF_INC - 1)) <= 0) { |
1022 gaim_debug_info("simple","simple_input_cb: read error\n"); | 1028 gaim_debug_info("simple","simple_input_cb: read error\n"); |
1023 connection_remove(sip, source); | 1029 connection_remove(sip, source); |
1024 if(sip->fd == source) sip->fd = -1; | 1030 if(sip->fd == source) sip->fd = -1; |
1025 // gaim_connection_error(gc, _("Read error")); | |
1026 return; | 1031 return; |
1027 } | 1032 } |
1028 if(len == 0) { | 1033 if(len == 0) { |
1029 // connection was closed | 1034 /* connection was closed */ |
1030 connection_remove(sip, source); | 1035 connection_remove(sip, source); |
1031 if(sip->fd == source) sip->fd = -1; | 1036 if(sip->fd == source) sip->fd = -1; |
1032 } | 1037 } |
1033 | 1038 |
1034 conn->inbufused += len; | 1039 conn->inbufused += len; |
1061 return; | 1066 return; |
1062 } | 1067 } |
1063 | 1068 |
1064 sip->fd = source; | 1069 sip->fd = source; |
1065 | 1070 |
1066 // get buddies from blist | |
1067 simple_get_buddies(gc); | |
1068 | 1071 |
1069 conn = connection_create(sip, source); | 1072 conn = connection_create(sip, source); |
1070 | 1073 |
1071 // get the local ip | 1074 /* get the local ip */ |
1072 sip->ip = g_strdup(gaim_network_get_my_ip(source)); | 1075 sip->ip = g_strdup(gaim_network_get_my_ip(source)); |
1073 | 1076 |
1074 do_register(sip); | 1077 do_register(sip); |
1075 | 1078 |
1076 conn->inputhandler = gaim_input_add(sip->fd, GAIM_INPUT_READ, simple_input_cb, gc); | 1079 conn->inputhandler = gaim_input_add(sip->fd, GAIM_INPUT_READ, simple_input_cb, gc); |
1129 hosttoconnect = g_strdup(sip->servername); | 1132 hosttoconnect = g_strdup(sip->servername); |
1130 } else { | 1133 } else { |
1131 hosttoconnect = g_strdup(gaim_account_get_string(account, "proxy", sip->servername)); | 1134 hosttoconnect = g_strdup(gaim_account_get_string(account, "proxy", sip->servername)); |
1132 } | 1135 } |
1133 | 1136 |
1134 // TCP case | 1137 /* TCP case */ |
1135 if(! sip->udp) { | 1138 if(! sip->udp) { |
1136 // search for SRV record | 1139 /* search for SRV record */ |
1137 serveradr = getserver(hosttoconnect, "_sip._tcp"); | 1140 serveradr = getserver(hosttoconnect, "_sip._tcp"); |
1138 gaim_debug_info("simple","connecting to %s port %d", serveradr->name, serveradr->port); | 1141 gaim_debug_info("simple","connecting to %s port %d", serveradr->name, serveradr->port); |
1139 | 1142 |
1140 // open tcp connection to the server | 1143 /* open tcp connection to the server */ |
1141 error = gaim_proxy_connect(account, serveradr->name, serveradr->port, login_cb, gc); | 1144 error = gaim_proxy_connect(account, serveradr->name, serveradr->port, login_cb, gc); |
1142 if(error) { | 1145 if(error) { |
1143 gaim_connection_error(gc, _("Couldn't create socket")); | 1146 gaim_connection_error(gc, _("Couldn't create socket")); |
1144 } | 1147 } |
1145 | 1148 |
1146 // create socket for incoming connections | 1149 /* create socket for incoming connections */ |
1147 sip->listenfd = gaim_network_listen_range(5060, 5080); | 1150 sip->listenfd = gaim_network_listen_range(5060, 5080); |
1148 if(sip->listenfd == -1) { | 1151 if(sip->listenfd == -1) { |
1149 gaim_connection_error(gc, _("Could not create listen socket")); | 1152 gaim_connection_error(gc, _("Could not create listen socket")); |
1150 return; | 1153 return; |
1151 } | 1154 } |
1152 sip->listenport = gaim_network_get_port_from_fd(sip->listenfd); | 1155 sip->listenport = gaim_network_get_port_from_fd(sip->listenfd); |
1153 gaim_input_add(sip->listenfd, GAIM_INPUT_READ, simple_newconn_cb, gc); | 1156 gaim_input_add(sip->listenfd, GAIM_INPUT_READ, simple_newconn_cb, gc); |
1154 } else { // UDP | 1157 } else { /* UDP */ |
1155 // search for SRV record | 1158 /* search for SRV record */ |
1156 struct sockaddr_in addr; | 1159 struct sockaddr_in addr; |
1157 struct hostent *h; | 1160 struct hostent *h; |
1158 | 1161 |
1159 serveradr = getserver(hosttoconnect, "_sip._udp"); | 1162 serveradr = getserver(hosttoconnect, "_sip._udp"); |
1160 gaim_debug_info("simple", "using udp with server %s and port %d", serveradr->name, serveradr->port); | 1163 gaim_debug_info("simple", "using udp with server %s and port %d", serveradr->name, serveradr->port); |
1168 } | 1171 } |
1169 sip->listenport = ntohs(addr.sin_port); | 1172 sip->listenport = ntohs(addr.sin_port); |
1170 sip->listenfd = sip->fd; | 1173 sip->listenfd = sip->fd; |
1171 | 1174 |
1172 gaim_input_add(sip->fd, GAIM_INPUT_READ, simple_udp_process, gc); | 1175 gaim_input_add(sip->fd, GAIM_INPUT_READ, simple_udp_process, gc); |
1173 // TODO - change to new SRV impl. | 1176 /* TODO - change to new SRV impl. */ |
1174 sip->serveraddr.sin_family = AF_INET; | 1177 sip->serveraddr.sin_family = AF_INET; |
1175 sip->serveraddr.sin_port = htons(serveradr->port); | 1178 sip->serveraddr.sin_port = htons(serveradr->port); |
1176 | 1179 |
1177 h = gethostbyname(serveradr->name); | 1180 h = gethostbyname(serveradr->name); |
1178 sip->serveraddr.sin_addr.s_addr = ((struct in_addr*)h->h_addr)->s_addr; | 1181 sip->serveraddr.sin_addr.s_addr = ((struct in_addr*)h->h_addr)->s_addr; |
1181 do_register(sip); | 1184 do_register(sip); |
1182 | 1185 |
1183 } | 1186 } |
1184 g_free(hosttoconnect); | 1187 g_free(hosttoconnect); |
1185 | 1188 |
1186 // register timeout callback for register / subscribe renewal | 1189 /* register timeout callback for register / subscribe renewal */ |
1187 sip->registertimeout = gaim_timeout_add((rand()%100)+10*1000, (GSourceFunc)register_timeout, sip); | 1190 sip->registertimeout = gaim_timeout_add((rand()%100)+10*1000, (GSourceFunc)register_timeout, sip); |
1188 } | 1191 } |
1189 | 1192 |
1190 static void simple_close(GaimConnection *gc) | 1193 static void simple_close(GaimConnection *gc) |
1191 { | 1194 { |
1192 struct simple_account_data *sip = gc->proto_data; | 1195 struct simple_account_data *sip = gc->proto_data; |
1193 | 1196 |
1194 // unregister | 1197 /* unregister */ |
1195 do_register_exp(sip, 0); | 1198 do_register_exp(sip, 0); |
1196 // if(sip) { | 1199 if(sip) { |
1197 if(0) { | |
1198 if(sip->servername) g_free(sip->servername); | 1200 if(sip->servername) g_free(sip->servername); |
1199 if(sip->username) g_free(sip->username); | 1201 if(sip->username) g_free(sip->username); |
1200 if(sip->password) g_free(sip->password); | 1202 if(sip->password) g_free(sip->password); |
1201 if(sip->registrar.nonce) g_free(sip->registrar.nonce); | 1203 if(sip->registrar.nonce) g_free(sip->registrar.nonce); |
1202 if(sip->registrar.realm) g_free(sip->registrar.nonce); | 1204 if(sip->registrar.realm) g_free(sip->registrar.realm); |
1203 if(sip->proxy.nonce) g_free(sip->proxy.nonce); | 1205 if(sip->proxy.nonce) g_free(sip->proxy.nonce); |
1204 if(sip->proxy.realm) g_free(sip->proxy.realm); | 1206 if(sip->proxy.realm) g_free(sip->proxy.realm); |
1205 // if(sip->registertimeout) gaim_timeout_remove(sip->registertimeout); | |
1206 if(sip->sendlater) g_free(sip->sendlater); | 1207 if(sip->sendlater) g_free(sip->sendlater); |
1207 if(sip->ip) g_free(sip->ip); | 1208 if(sip->ip) g_free(sip->ip); |
1208 sip->servername = sip->username = sip->password = sip->registrar.nonce = sip->registrar.realm = sip->proxy.nonce = sip->proxy.realm = sip->sendlater = sip->ip = 0; | 1209 sip->servername = sip->username = sip->password = sip->registrar.nonce = sip->registrar.realm = sip->proxy.nonce = sip->proxy.realm = sip->sendlater = sip->ip = NULL; |
1209 } | 1210 } |
1210 // if(gc->proto_data) g_free(gc->proto_data); | 1211 if(gc->proto_data) g_free(gc->proto_data); |
1211 // gc->proto_data = 0; | 1212 gc->proto_data = 0; |
1212 // TODO free connections | 1213 /* TODO free connections */ |
1213 } | 1214 } |
1214 | 1215 |
1215 static GaimPluginProtocolInfo prpl_info = | 1216 static GaimPluginProtocolInfo prpl_info = |
1216 { | 1217 { |
1217 0, | 1218 0, |
1315 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1316 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1316 option = gaim_account_option_bool_new(_("Use Proxy"), "useproxy", FALSE); | 1317 option = gaim_account_option_bool_new(_("Use Proxy"), "useproxy", FALSE); |
1317 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1318 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1318 option = gaim_account_option_string_new(_("Proxy"), "proxy", ""); | 1319 option = gaim_account_option_string_new(_("Proxy"), "proxy", ""); |
1319 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); | 1320 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1320 // _simple_plugin = plugin; | |
1321 } | 1321 } |
1322 | 1322 |
1323 GAIM_INIT_PLUGIN(simple, _init_plugin, info); | 1323 GAIM_INIT_PLUGIN(simple, _init_plugin, info); |