comparison libpurple/protocols/qq/buddy_opt.c @ 25298:e35115192593

Finished struct hiding in bonjour and qq
author Gary Kramlich <grim@reaperworld.com>
date Sun, 02 Nov 2008 10:21:19 +0000
parents 2a19984c0005
children 65cfc59858cf 367b3ddcf5c3
comparison
equal deleted inserted replaced
25297:b48f6d0ecdf7 25298:e35115192593
99 99
100 qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, guint32 uid) 100 qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, guint32 uid)
101 { 101 {
102 gchar *who; 102 gchar *who;
103 PurpleBuddy *buddy; 103 PurpleBuddy *buddy;
104 qq_buddy_data *bd;
104 105
105 g_return_val_if_fail(gc != NULL, NULL); 106 g_return_val_if_fail(gc != NULL, NULL);
106 107
107 who = uid_to_purple_name(uid); 108 who = uid_to_purple_name(uid);
108 if (who == NULL) return NULL; 109 if (who == NULL) return NULL;
111 112
112 if (buddy == NULL) { 113 if (buddy == NULL) {
113 purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid); 114 purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid);
114 return NULL; 115 return NULL;
115 } 116 }
116 if (buddy->proto_data == NULL) { 117
118 if ((bd = purple_buddy_get_protocol_data(buddy)) == NULL) {
117 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid); 119 purple_debug_error("QQ", "Can not find buddy data of %d\n", uid);
118 return NULL; 120 return NULL;
119 } 121 }
120 return (qq_buddy_data *)buddy->proto_data; 122 return bd;
121 } 123 }
122 124
123 void qq_buddy_data_free(qq_buddy_data *bd) 125 void qq_buddy_data_free(qq_buddy_data *bd)
124 { 126 {
125 g_return_if_fail(bd != NULL); 127 g_return_if_fail(bd != NULL);
148 150
149 who = uid_to_purple_name(uid); 151 who = uid_to_purple_name(uid);
150 152
151 purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who); 153 purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who);
152 buddy = purple_buddy_new(gc->account, who, NULL); /* alias is NULL */ 154 buddy = purple_buddy_new(gc->account, who, NULL); /* alias is NULL */
153 buddy->proto_data = NULL; 155 purple_buddy_set_protocol_data(buddy, NULL);
154 156
155 g_free(who); 157 g_free(who);
156 158
157 purple_blist_add_buddy(buddy, NULL, group, NULL); 159 purple_blist_add_buddy(buddy, NULL, group, NULL);
158 160
161 return buddy; 163 return buddy;
162 } 164 }
163 165
164 static void qq_buddy_free(PurpleBuddy *buddy) 166 static void qq_buddy_free(PurpleBuddy *buddy)
165 { 167 {
168 qq_buddy_data *bd;
169
166 g_return_if_fail(buddy); 170 g_return_if_fail(buddy);
167 if (buddy->proto_data) { 171
168 qq_buddy_data_free(buddy->proto_data); 172 if ((bd = purple_buddy_get_protocol_data(buddy)) != NULL) {
169 } 173 qq_buddy_data_free(bd);
170 buddy->proto_data = NULL; 174 }
175 purple_buddy_set_protocol_data(buddy, NULL);
171 purple_blist_remove_buddy(buddy); 176 purple_blist_remove_buddy(buddy);
172 } 177 }
173 178
174 PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid) 179 PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid)
175 { 180 {
185 } 190 }
186 191
187 PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid) 192 PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
188 { 193 {
189 PurpleBuddy *buddy; 194 PurpleBuddy *buddy;
195 qq_buddy_data *bd;
190 196
191 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); 197 g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
192 198
193 buddy = qq_buddy_find(gc, uid); 199 buddy = qq_buddy_find(gc, uid);
194 if (buddy == NULL) { 200 if (buddy == NULL) {
196 if (buddy == NULL) { 202 if (buddy == NULL) {
197 return NULL; 203 return NULL;
198 } 204 }
199 } 205 }
200 206
201 if (buddy->proto_data != NULL) { 207 if (purple_buddy_get_protocol_data(buddy) != NULL) {
202 return buddy; 208 return buddy;
203 } 209 }
204 210
205 buddy->proto_data = qq_buddy_data_new(uid); 211 bd = qq_buddy_data_new(uid);
212 purple_buddy_set_protocol_data(buddy, bd);
206 return buddy; 213 return buddy;
207 } 214 }
208 215
209 /* send packet to remove a buddy from my buddy list */ 216 /* send packet to remove a buddy from my buddy list */
210 static void request_remove_buddy(PurpleConnection *gc, guint32 uid) 217 static void request_remove_buddy(PurpleConnection *gc, guint32 uid)
689 696
690 qd = (qq_data *) gc->proto_data; 697 qd = (qq_data *) gc->proto_data;
691 if (!qd->is_login) 698 if (!qd->is_login)
692 return; /* IMPORTANT ! */ 699 return; /* IMPORTANT ! */
693 700
694 uid = purple_name_to_uid(buddy->name); 701 uid = purple_name_to_uid(purple_buddy_get_name(buddy));
695 if (uid > 0) { 702 if (uid > 0) {
696 if (qd->client_version > 2005) { 703 if (qd->client_version > 2005) {
697 request_add_buddy_no_auth_ex(gc, uid); 704 request_add_buddy_no_auth_ex(gc, uid);
698 } else { 705 } else {
699 request_add_buddy_no_auth(gc, uid); 706 request_add_buddy_no_auth(gc, uid);
780 { 787 {
781 qq_data *qd; 788 qq_data *qd;
782 gchar **segments; 789 gchar **segments;
783 gchar *dest_uid, *reply; 790 gchar *dest_uid, *reply;
784 PurpleBuddy *buddy; 791 PurpleBuddy *buddy;
792 qq_buddy_data *bd;
785 793
786 g_return_if_fail(data != NULL && data_len != 0); 794 g_return_if_fail(data != NULL && data_len != 0);
787 g_return_if_fail(uid != 0); 795 g_return_if_fail(uid != 0);
788 796
789 qd = (qq_data *) gc->proto_data; 797 qd = (qq_data *) gc->proto_data;
824 832
825 buddy = qq_buddy_find(gc, uid); 833 buddy = qq_buddy_find(gc, uid);
826 if (buddy == NULL) { 834 if (buddy == NULL) {
827 buddy = qq_buddy_new(gc, uid); 835 buddy = qq_buddy_new(gc, uid);
828 } 836 }
829 if (buddy != NULL && buddy->proto_data != NULL) { 837 if (buddy != NULL && (bd = purple_buddy_get_protocol_data(buddy)) != NULL) {
830 /* Not authorized now, free buddy data */ 838 /* Not authorized now, free buddy data */
831 qq_buddy_data_free(buddy->proto_data); 839 qq_buddy_data_free(bd);
832 buddy->proto_data = NULL; 840 purple_buddy_set_protocol_data(buddy, NULL);
833 } 841 }
834 842
835 add_buddy_authorize_input(gc, uid, NULL, 0); 843 add_buddy_authorize_input(gc, uid, NULL, 0);
836 g_strfreev(segments); 844 g_strfreev(segments);
837 } 845 }
903 911
904 /* remove a buddy and send packet to QQ server accordingly */ 912 /* remove a buddy and send packet to QQ server accordingly */
905 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 913 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
906 { 914 {
907 qq_data *qd; 915 qq_data *qd;
916 qq_buddy_data *bd;
908 guint32 uid; 917 guint32 uid;
909 918
910 g_return_if_fail(gc != NULL && gc->proto_data != NULL); 919 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
911 g_return_if_fail(buddy != NULL); 920 g_return_if_fail(buddy != NULL);
912 921
913 qd = (qq_data *) gc->proto_data; 922 qd = (qq_data *) gc->proto_data;
914 if (!qd->is_login) 923 if (!qd->is_login)
915 return; 924 return;
916 925
917 uid = purple_name_to_uid(buddy->name); 926 uid = purple_name_to_uid(purple_buddy_get_name(buddy));
918 if (uid > 0 && uid != qd->uid) { 927 if (uid > 0 && uid != qd->uid) {
919 if (qd->client_version > 2005) { 928 if (qd->client_version > 2005) {
920 qq_request_auth_code(gc, QQ_AUTH_INFO_BUDDY, QQ_AUTH_INFO_REMOVE_BUDDY, uid); 929 qq_request_auth_code(gc, QQ_AUTH_INFO_BUDDY, QQ_AUTH_INFO_REMOVE_BUDDY, uid);
921 } else { 930 } else {
922 request_remove_buddy(gc, uid); 931 request_remove_buddy(gc, uid);
923 request_buddy_remove_me(gc, uid); 932 request_buddy_remove_me(gc, uid);
924 } 933 }
925 } 934 }
926 935
927 if (buddy->proto_data) { 936 if ((bd = purple_buddy_get_protocol_data(buddy)) != NULL) {
928 qq_buddy_data_free(buddy->proto_data); 937 qq_buddy_data_free(bd);
929 buddy->proto_data = NULL; 938 purple_buddy_set_protocol_data(buddy, NULL);
930 } else { 939 } else {
931 purple_debug_warning("QQ", "Empty buddy data of %s\n", buddy->name); 940 purple_debug_warning("QQ", "Empty buddy data of %s\n", purple_buddy_get_name(buddy));
932 } 941 }
933 942
934 /* Do not call purple_blist_remove_buddy, 943 /* Do not call purple_blist_remove_buddy,
935 * otherwise purple segmentation fault */ 944 * otherwise purple segmentation fault */
936 } 945 }
1214 PurpleBuddy *buddy; 1223 PurpleBuddy *buddy;
1215 gchar *msg, *msg_utf8; 1224 gchar *msg, *msg_utf8;
1216 gint bytes; 1225 gint bytes;
1217 gchar **segments; 1226 gchar **segments;
1218 gchar *primary, *secondary; 1227 gchar *primary, *secondary;
1228 qq_buddy_data *bd;
1219 1229
1220 g_return_if_fail(from != NULL && to != NULL); 1230 g_return_if_fail(from != NULL && to != NULL);
1221 1231
1222 qq_show_packet("server_buddy_rejected_me", data, data_len); 1232 qq_show_packet("server_buddy_rejected_me", data, data_len);
1223 1233
1253 1263
1254 uid = strtol(from, NULL, 10); 1264 uid = strtol(from, NULL, 10);
1255 g_return_if_fail(uid != 0); 1265 g_return_if_fail(uid != 0);
1256 1266
1257 buddy = qq_buddy_find(gc, uid); 1267 buddy = qq_buddy_find(gc, uid);
1258 if (buddy != NULL && buddy->proto_data != NULL) { 1268 if (buddy != NULL && (bd = purple_buddy_get_protocol_data(buddy)) != NULL) {
1259 /* Not authorized now, free buddy data */ 1269 /* Not authorized now, free buddy data */
1260 qq_buddy_data_free(buddy->proto_data); 1270 qq_buddy_data_free(bd);
1261 buddy->proto_data = NULL; 1271 purple_buddy_set_protocol_data(buddy, NULL);
1262 } 1272 }
1263 } 1273 }
1264 1274
1265 void qq_process_buddy_from_server(PurpleConnection *gc, int funct, 1275 void qq_process_buddy_from_server(PurpleConnection *gc, int funct,
1266 gchar *from, gchar *to, guint8 *data, gint data_len) 1276 gchar *from, gchar *to, guint8 *data, gint data_len)