src/protocols/msn/slp.c

changeset 13126
afce0fe97885
parent 13028
fcd75318a565
child 13713
1ae8790174a4
equal deleted inserted replaced
13125:c5dab3b004ab 13126:afce0fe97885
29 29
30 #include "object.h" 30 #include "object.h"
31 #include "user.h" 31 #include "user.h"
32 #include "switchboard.h" 32 #include "switchboard.h"
33 33
34 /* ms to delay between sending buddy icon requests to the server. */
35 #define BUDDY_ICON_DELAY 20000
36
34 static void send_ok(MsnSlpCall *slpcall, const char *branch, 37 static void send_ok(MsnSlpCall *slpcall, const char *branch,
35 const char *type, const char *content); 38 const char *type, const char *content);
36 39
37 static void send_decline(MsnSlpCall *slpcall, const char *branch, 40 static void send_decline(MsnSlpCall *slpcall, const char *branch,
38 const char *type, const char *content); 41 const char *type, const char *content);
139 142
140 gaim_xfer_update_progress(xfer); 143 gaim_xfer_update_progress(xfer);
141 } 144 }
142 145
143 void 146 void
144 msn_xfer_end_cb(MsnSlpCall *slpcall) 147 msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session)
145 { 148 {
146 if ((gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_DONE) && 149 if ((gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_DONE) &&
147 (gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) && 150 (gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_CANCEL_REMOTE) &&
148 (gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_CANCEL_LOCAL)) 151 (gaim_xfer_get_status(slpcall->xfer) != GAIM_XFER_STATUS_CANCEL_LOCAL))
149 { 152 {
885 888
886 #ifdef MSN_DEBUG_UD 889 #ifdef MSN_DEBUG_UD
887 gaim_debug_info("msn", "Releasing buddy icon request\n"); 890 gaim_debug_info("msn", "Releasing buddy icon request\n");
888 #endif 891 #endif
889 892
890 while (userlist->buddy_icon_window > 0) 893 if (userlist->buddy_icon_window > 0)
891 { 894 {
892 GQueue *queue; 895 GQueue *queue;
893 GaimAccount *account; 896 GaimAccount *account;
894 const char *username; 897 const char *username;
895 898
896 queue = userlist->buddy_icon_requests; 899 queue = userlist->buddy_icon_requests;
897 900
898 if (g_queue_is_empty(userlist->buddy_icon_requests)) 901 if (g_queue_is_empty(userlist->buddy_icon_requests))
899 break; 902 return;
900 903
901 user = g_queue_pop_head(queue); 904 user = g_queue_pop_head(queue);
902 905
903 account = userlist->session->account; 906 account = userlist->session->account;
904 username = user->passport; 907 username = user->passport;
905 908
909 userlist->buddy_icon_window--;
906 msn_request_user_display(user); 910 msn_request_user_display(user);
907 userlist->buddy_icon_window--;
908 911
909 #ifdef MSN_DEBUG_UD 912 #ifdef MSN_DEBUG_UD
910 gaim_debug_info("msn", "msn_release_buddy_icon_request(): buddy_icon_window-- yields =%d\n", 913 gaim_debug_info("msn", "msn_release_buddy_icon_request(): buddy_icon_window-- yields =%d\n",
911 userlist->buddy_icon_window); 914 userlist->buddy_icon_window);
912 #endif 915 #endif
913 } 916 }
917 }
918
919 /*
920 * Called on a timeout from end_user_display(). Frees a buddy icon window slow and dequeues the next
921 * buddy icon request if there is one.
922 */
923 static gboolean
924 msn_release_buddy_icon_request_timeout(gpointer data)
925 {
926 MsnUserList *userlist = (MsnUserList *)data;
927
928 /* Free one window slot */
929 userlist->buddy_icon_window++;
930
931 /* Clear the tag for our former request timer */
932 userlist->buddy_icon_request_timer = 0;
933
934 msn_release_buddy_icon_request(userlist);
935
936 return FALSE;
914 } 937 }
915 938
916 void 939 void
917 msn_queue_buddy_icon_request(MsnUser *user) 940 msn_queue_buddy_icon_request(MsnUser *user)
918 { 941 {
952 975
953 userlist = user->userlist; 976 userlist = user->userlist;
954 queue = userlist->buddy_icon_requests; 977 queue = userlist->buddy_icon_requests;
955 978
956 #ifdef MSN_DEBUG_UD 979 #ifdef MSN_DEBUG_UD
957 gaim_debug_info("msn", "Queueing buddy icon request: %s\n", 980 gaim_debug_info("msn", "Queueing buddy icon request for %s (buddy_icon_window = %i)\n",
958 user->passport); 981 user->passport, userlist->buddy_icon_window);
959 #endif 982 #endif
960 983
961 g_queue_push_tail(queue, user); 984 g_queue_push_tail(queue, user);
962
963 #ifdef MSN_DEBUG_UD
964 gaim_debug_info("msn", "msn_queue_buddy_icon_request(): buddy_icon_window=%d\n",
965 userlist->buddy_icon_window);
966 #endif
967 985
968 if (userlist->buddy_icon_window > 0) 986 if (userlist->buddy_icon_window > 0)
969 msn_release_buddy_icon_request(userlist); 987 msn_release_buddy_icon_request(userlist);
970 } 988 }
971 } 989 }
981 999
982 g_return_if_fail(slpcall != NULL); 1000 g_return_if_fail(slpcall != NULL);
983 1001
984 info = slpcall->data_info; 1002 info = slpcall->data_info;
985 #ifdef MSN_DEBUG_UD 1003 #ifdef MSN_DEBUG_UD
986 gaim_debug_info("msn", "Got User Display: %s\n", info); 1004 gaim_debug_info("msn", "Got User Display: %s\n", slpcall->slplink->remote_user);
987 #endif 1005 #endif
988 1006
989 userlist = slpcall->slplink->session->userlist; 1007 userlist = slpcall->slplink->session->userlist;
990 account = slpcall->slplink->session->account; 1008 account = slpcall->slplink->session->account;
991 1009
1012 msn_release_buddy_icon_request(userlist); 1030 msn_release_buddy_icon_request(userlist);
1013 #endif 1031 #endif
1014 } 1032 }
1015 1033
1016 static void 1034 static void
1017 end_user_display(MsnSlpCall *slpcall) 1035 end_user_display(MsnSlpCall *slpcall, MsnSession *session)
1018 { 1036 {
1019 MsnUserList *userlist; 1037 MsnUserList *userlist;
1020 1038
1021 g_return_if_fail(slpcall != NULL); 1039 g_return_if_fail(session != NULL);
1022 1040
1023 #ifdef MSN_DEBUG_UD 1041 #ifdef MSN_DEBUG_UD
1024 gaim_debug_info("msn", "End User Display\n"); 1042 gaim_debug_info("msn", "End User Display\n");
1025 #endif 1043 #endif
1026 1044
1027 /* Maybe the slplink was destroyed. */ 1045 userlist = session->userlist;
1028 if (slpcall->slplink == NULL) { 1046
1029 #ifdef MSN_DEBUG_UD 1047 /* If the session is being destroyed we better stop doing anything. */
1030 gaim_debug_info("msn", "end_user_display(): returning because slpcall->slplink is NULL\n"); 1048 if (session->destroying)
1031 #endif
1032 return; 1049 return;
1033 } 1050
1034 1051 /* Delay before freeing a buddy icon window slot and requesting the next icon, if appropriate.
1035 userlist = slpcall->slplink->session->userlist; 1052 * If we don't delay, we'll rapidly hit the MSN equivalent of AIM's rate limiting; the server will
1036 1053 * send us an error 800 like so:
1037 /* If the session is being destroyed we better stop doing anything. */ 1054 *
1038 if (slpcall->slplink->session->destroying) { 1055 * C: NS 000: XFR 21 SB
1039 #ifdef MSN_DEBUG_UD 1056 * S: NS 000: 800 21
1040 gaim_debug_info("msn", "end_user_display(): returning because slpcall->slplink->session->destroying is TRUE\n"); 1057 */
1041 #endif 1058 if (userlist->buddy_icon_request_timer) {
1042 return; 1059 /* Free the window slot used by this previous request */
1043 } 1060 userlist->buddy_icon_window++;
1044 1061
1045 /* Free one window slot */ 1062 /* Clear our pending timeout */
1046 userlist->buddy_icon_window++; 1063 gaim_timeout_remove(userlist->buddy_icon_request_timer);
1047 1064 }
1048 #ifdef MSN_DEBUG_UD 1065
1049 gaim_debug_info("msn", "end_user_display(): buddy_icon_window++ yields =%d\n", 1066 /* Wait BUDDY_ICON_DELAY ms before freeing our window slot and requesting the next icon. */
1050 userlist->buddy_icon_window); 1067 userlist->buddy_icon_request_timer = gaim_timeout_add(BUDDY_ICON_DELAY,
1051 #endif 1068 msn_release_buddy_icon_request_timeout, userlist);
1052
1053 msn_release_buddy_icon_request(userlist);
1054 } 1069 }
1055 1070
1056 void 1071 void
1057 msn_request_user_display(MsnUser *user) 1072 msn_request_user_display(MsnUser *user)
1058 { 1073 {

mercurial