| 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 { |