Mercurial > pidgin
comparison src/gtkutils.c @ 7712:2823111061ba
[gaim-migrate @ 8357]
I did a few things to my drag-and-drop patch. First, I moved the
application/x-im-contact parsing code into its own function, so we don't
have to duplicate stuff. The reason I did this is because Sean suggested
support for dragging x-im-contacts into conversation windows, which is
also implemented now, and it rocks. :)
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 03 Dec 2003 02:03:25 +0000 |
parents | 357eb1c39b72 |
children | db3bdae1761e |
comparison
equal
deleted
inserted
replaced
7711:ebd43be54140 | 7712:2823111061ba |
---|---|
1138 filename = g_build_filename(gaim_user_dir(), G_DIR_SEPARATOR_S, | 1138 filename = g_build_filename(gaim_user_dir(), G_DIR_SEPARATOR_S, |
1139 "accels", NULL); | 1139 "accels", NULL); |
1140 gtk_accel_map_load(filename); | 1140 gtk_accel_map_load(filename); |
1141 g_free(filename); | 1141 g_free(filename); |
1142 } | 1142 } |
1143 | |
1144 gboolean | |
1145 gaim_gtk_parse_x_im_contact(const char *msg, gboolean all_accounts, | |
1146 GaimAccount **ret_account, char **ret_protocol, | |
1147 char **ret_username, char **ret_alias) | |
1148 { | |
1149 char *protocol = NULL; | |
1150 char *username = NULL; | |
1151 char *alias = NULL; | |
1152 char *str; | |
1153 char *c, *s; | |
1154 gboolean valid; | |
1155 | |
1156 g_return_val_if_fail(msg != NULL, FALSE); | |
1157 g_return_val_if_fail(ret_protocol != NULL, FALSE); | |
1158 g_return_val_if_fail(ret_username != NULL, FALSE); | |
1159 | |
1160 s = str = g_strdup(msg); | |
1161 | |
1162 while (*s != '\r' && *s != '\n' && *s != '\0') | |
1163 { | |
1164 char *key, *value; | |
1165 | |
1166 key = s; | |
1167 | |
1168 /* Grab the key */ | |
1169 while (*s != '\r' && *s != '\n' && *s != '\0' && *s != ' ') | |
1170 s++; | |
1171 | |
1172 if (*s == '\r') s++; | |
1173 | |
1174 if (*s == '\n') | |
1175 { | |
1176 s++; | |
1177 continue; | |
1178 } | |
1179 | |
1180 if (*s != '\0') *s++ = '\0'; | |
1181 | |
1182 /* Clear past any whitespace */ | |
1183 while (*s != '\0' && *s == ' ') | |
1184 s++; | |
1185 | |
1186 /* Now let's grab until the end of the line. */ | |
1187 value = s; | |
1188 | |
1189 while (*s != '\r' && *s != '\n' && *s != '\0') | |
1190 s++; | |
1191 | |
1192 if (*s == '\r') *s++ = '\0'; | |
1193 if (*s == '\n') *s++ = '\0'; | |
1194 | |
1195 if ((c = strchr(key, ':')) != NULL) | |
1196 { | |
1197 if (!g_ascii_strcasecmp(key, "X-IM-Username:")) | |
1198 username = g_strdup(value); | |
1199 else if (!g_ascii_strcasecmp(key, "X-IM-Protocol:")) | |
1200 protocol = g_strdup(value); | |
1201 else if (!g_ascii_strcasecmp(key, "X-IM-Alias:")) | |
1202 alias = g_strdup(value); | |
1203 } | |
1204 } | |
1205 | |
1206 if (username != NULL && protocol != NULL) | |
1207 { | |
1208 valid = TRUE; | |
1209 | |
1210 *ret_username = username; | |
1211 *ret_protocol = protocol; | |
1212 | |
1213 if (ret_alias != NULL) | |
1214 *ret_alias = alias; | |
1215 | |
1216 /* Check for a compatible account. */ | |
1217 if (ret_account != NULL) | |
1218 { | |
1219 GList *list; | |
1220 GaimAccount *account = NULL; | |
1221 GList *l; | |
1222 const char *protoname; | |
1223 | |
1224 if (all_accounts) | |
1225 list = gaim_accounts_get_all(); | |
1226 else | |
1227 list = gaim_connections_get_all(); | |
1228 | |
1229 for (l = list; l != NULL; l = l->next) | |
1230 { | |
1231 GaimConnection *gc; | |
1232 GaimPluginProtocolInfo *prpl_info = NULL; | |
1233 GaimPlugin *plugin; | |
1234 | |
1235 if (all_accounts) | |
1236 { | |
1237 account = (GaimAccount *)l->data; | |
1238 | |
1239 plugin = gaim_plugins_find_with_id( | |
1240 gaim_account_get_protocol_id(account)); | |
1241 | |
1242 if (plugin == NULL) | |
1243 { | |
1244 account = NULL; | |
1245 | |
1246 continue; | |
1247 } | |
1248 | |
1249 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); | |
1250 } | |
1251 else | |
1252 { | |
1253 gc = (GaimConnection *)l->data; | |
1254 account = gaim_connection_get_account(gc); | |
1255 | |
1256 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1257 } | |
1258 | |
1259 protoname = prpl_info->list_icon(account, NULL); | |
1260 | |
1261 if (!strcmp(protoname, protocol)) | |
1262 break; | |
1263 | |
1264 account = NULL; | |
1265 } | |
1266 | |
1267 /* Special case for AIM and ICQ */ | |
1268 if (account == NULL && (!strcmp(protocol, "aim") || | |
1269 !strcmp(protocol, "icq"))) | |
1270 { | |
1271 for (l = list; l != NULL; l = l->next) | |
1272 { | |
1273 GaimConnection *gc; | |
1274 GaimPluginProtocolInfo *prpl_info = NULL; | |
1275 GaimPlugin *plugin; | |
1276 | |
1277 if (all_accounts) | |
1278 { | |
1279 account = (GaimAccount *)l->data; | |
1280 | |
1281 plugin = gaim_plugins_find_with_id( | |
1282 gaim_account_get_protocol_id(account)); | |
1283 | |
1284 if (plugin == NULL) | |
1285 { | |
1286 account = NULL; | |
1287 | |
1288 continue; | |
1289 } | |
1290 | |
1291 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(plugin); | |
1292 } | |
1293 else | |
1294 { | |
1295 gc = (GaimConnection *)l->data; | |
1296 account = gaim_connection_get_account(gc); | |
1297 | |
1298 prpl_info = GAIM_PLUGIN_PROTOCOL_INFO(gc->prpl); | |
1299 } | |
1300 | |
1301 protoname = prpl_info->list_icon(account, NULL); | |
1302 | |
1303 if (!strcmp(protoname, "aim") || !strcmp(protoname, "icq")) | |
1304 break; | |
1305 | |
1306 account = NULL; | |
1307 } | |
1308 } | |
1309 | |
1310 *ret_account = account; | |
1311 } | |
1312 } | |
1313 else | |
1314 { | |
1315 valid = FALSE; | |
1316 | |
1317 if (username != NULL) g_free(username); | |
1318 if (protocol != NULL) g_free(protocol); | |
1319 if (alias != NULL) g_free(alias); | |
1320 } | |
1321 | |
1322 g_free(str); | |
1323 | |
1324 return valid; | |
1325 } |