| 42 #include "yahoo_filexfer.h" |
42 #include "yahoo_filexfer.h" |
| 43 #include "md5.h" |
43 #include "md5.h" |
| 44 |
44 |
| 45 extern char *yahoo_crypt(const char *, const char *); |
45 extern char *yahoo_crypt(const char *, const char *); |
| 46 |
46 |
| |
47 #define YAHOO_ICON_CHECKSUM_KEY "icon_checksum" |
| 47 /* #define YAHOO_DEBUG */ |
48 /* #define YAHOO_DEBUG */ |
| 48 |
49 |
| 49 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *, GaimGroup *); |
50 static void yahoo_add_buddy(GaimConnection *gc, GaimBuddy *, GaimGroup *); |
| 50 static void yahoo_send_buddy_icon_request(GaimConnection *gc, const char *who); |
51 static void yahoo_send_buddy_icon_request(GaimConnection *gc, const char *who); |
| 51 |
52 |
| 396 gaim_debug_info("yahoo", "Got key 197, value = %s\n", tmp); |
397 gaim_debug_info("yahoo", "Got key 197, value = %s\n", tmp); |
| 397 g_free(tmp); |
398 g_free(tmp); |
| 398 } |
399 } |
| 399 g_free(decoded); |
400 g_free(decoded); |
| 400 } |
401 } |
| |
402 break; |
| |
403 } |
| |
404 case 192: /* Pictures, aka Buddy Icons, checksum */ |
| |
405 { |
| |
406 int cksum = strtol(pair->value, NULL, 10); |
| |
407 GaimBuddy *b; |
| |
408 |
| |
409 if (!name) |
| |
410 break; |
| |
411 |
| |
412 if (!cksum || (cksum == -1)) { |
| |
413 gaim_buddy_icons_set_for_user(gc->account, name, NULL, 0); |
| |
414 break; |
| |
415 } |
| |
416 |
| |
417 if (!f) |
| |
418 break; |
| |
419 b = gaim_find_buddy(gc->account, name); |
| |
420 yahoo_friend_set_buddy_icon_need_request(f, FALSE); |
| |
421 if (cksum != gaim_blist_node_get_int((GaimBlistNode*)b, YAHOO_ICON_CHECKSUM_KEY)) |
| |
422 yahoo_send_buddy_icon_request(gc, name); |
| |
423 |
| 401 break; |
424 break; |
| 402 } |
425 } |
| 403 case 16: /* Custom error message */ |
426 case 16: /* Custom error message */ |
| 404 { |
427 { |
| 405 char *tmp = yahoo_string_decode(gc, pair->value, TRUE); |
428 char *tmp = yahoo_string_decode(gc, pair->value, TRUE); |
| 1855 }; |
1878 }; |
| 1856 |
1879 |
| 1857 void yahoo_fetch_picture_cb(void *user_data, const char *pic_data, size_t len) |
1880 void yahoo_fetch_picture_cb(void *user_data, const char *pic_data, size_t len) |
| 1858 { |
1881 { |
| 1859 struct yahoo_fetch_picture_data *d = user_data; |
1882 struct yahoo_fetch_picture_data *d = user_data; |
| |
1883 GaimBuddy *b; |
| 1860 |
1884 |
| 1861 if (GAIM_CONNECTION_IS_VALID(d->gc) && len) { |
1885 if (GAIM_CONNECTION_IS_VALID(d->gc) && len) { |
| 1862 gaim_buddy_icons_set_for_user(gaim_connection_get_account(d->gc), d->who, pic_data, len); |
1886 gaim_buddy_icons_set_for_user(gaim_connection_get_account(d->gc), d->who, (void *)pic_data, len); |
| |
1887 b = gaim_find_buddy(gaim_connection_get_account(d->gc), d->who); |
| |
1888 if (b) |
| |
1889 gaim_blist_node_set_int((GaimBlistNode*)b, YAHOO_ICON_CHECKSUM_KEY, d->checksum); |
| 1863 } |
1890 } |
| 1864 |
1891 |
| 1865 g_free(d->who); |
1892 g_free(d->who); |
| 1866 g_free(d); |
1893 g_free(d); |
| 1867 } |
1894 } |
| 1870 { |
1897 { |
| 1871 GSList *l = pkt->hash; |
1898 GSList *l = pkt->hash; |
| 1872 char *who = NULL, *us = NULL; |
1899 char *who = NULL, *us = NULL; |
| 1873 gboolean got_icon_info = FALSE; |
1900 gboolean got_icon_info = FALSE; |
| 1874 char *url = NULL; |
1901 char *url = NULL; |
| 1875 int checksum = 0; /* ?? */ |
1902 int checksum = 0; |
| 1876 |
1903 |
| 1877 while (l) { |
1904 while (l) { |
| 1878 struct yahoo_pair *pair = l->data; |
1905 struct yahoo_pair *pair = l->data; |
| 1879 |
1906 |
| 1880 switch (pair->key) { |
1907 switch (pair->key) { |
| 1904 } |
1931 } |
| 1905 |
1932 |
| 1906 l = l->next; |
1933 l = l->next; |
| 1907 } |
1934 } |
| 1908 |
1935 |
| 1909 if (got_icon_info && url) { |
1936 if (who && got_icon_info && url) { |
| 1910 /* TODO: make this work p2p, try p2p before the url, check the checksum |
1937 /* TODO: make this work p2p, try p2p before the url */ |
| 1911 * (if that's what it is) before fetching the icon. |
1938 struct yahoo_fetch_picture_data *data; |
| 1912 */ |
1939 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
| 1913 struct yahoo_fetch_picture_data *data = g_new0(struct yahoo_fetch_picture_data, 1); |
1940 if (b && (checksum == gaim_blist_node_get_int((GaimBlistNode*)b, YAHOO_ICON_CHECKSUM_KEY))) |
| 1914 data->gc = gc; |
1941 return; |
| 1915 data->who = g_strdup(who); |
1942 |
| 1916 data->checksum = checksum; |
1943 data = g_new0(struct yahoo_fetch_picture_data, 1); |
| 1917 gaim_url_fetch(url, FALSE, "Mozilla/4.0 (compatible; MSIE 5.0)", FALSE, |
1944 data->gc = gc; |
| 1918 yahoo_fetch_picture_cb, data); |
1945 data->who = g_strdup(who); |
| 1919 } |
1946 data->checksum = checksum; |
| 1920 |
1947 gaim_url_fetch(url, FALSE, "Mozilla/4.0 (compatible; MSIE 5.0)", FALSE, |
| |
1948 yahoo_fetch_picture_cb, data); |
| |
1949 } |
| |
1950 |
| |
1951 } |
| |
1952 |
| |
1953 static void yahoo_process_picture_update(GaimConnection *gc, struct yahoo_packet *pkt) |
| |
1954 { |
| |
1955 GSList *l = pkt->hash; |
| |
1956 char *who = NULL; |
| |
1957 int icon = 0; |
| |
1958 |
| |
1959 while (l) { |
| |
1960 struct yahoo_pair *pair = l->data; |
| |
1961 |
| |
1962 switch (pair->key) { |
| |
1963 case 4: |
| |
1964 who = pair->value; |
| |
1965 break; |
| |
1966 case 5: |
| |
1967 /* us */ |
| |
1968 break; |
| |
1969 case 206: |
| |
1970 icon = strtol(pair->value, NULL, 10); |
| |
1971 break; |
| |
1972 } |
| |
1973 l = l->next; |
| |
1974 } |
| |
1975 |
| |
1976 if (who) { |
| |
1977 if (icon == 2) |
| |
1978 yahoo_send_buddy_icon_request(gc, who); |
| |
1979 else if (icon == 0) |
| |
1980 gaim_buddy_icons_set_for_user(gc->account, who, NULL, 0); |
| |
1981 } |
| |
1982 } |
| |
1983 |
| |
1984 static void yahoo_process_picture_checksum(GaimConnection *gc, struct yahoo_packet *pkt) |
| |
1985 { |
| |
1986 GSList *l = pkt->hash; |
| |
1987 char *who = NULL; |
| |
1988 int checksum = 0; |
| |
1989 |
| |
1990 while (l) { |
| |
1991 struct yahoo_pair *pair = l->data; |
| |
1992 |
| |
1993 switch (pair->key) { |
| |
1994 case 4: |
| |
1995 who = pair->value; |
| |
1996 break; |
| |
1997 case 5: |
| |
1998 /* us */ |
| |
1999 break; |
| |
2000 case 192: |
| |
2001 checksum = strtol(pair->value, NULL, 10); |
| |
2002 break; |
| |
2003 } |
| |
2004 l = l->next; |
| |
2005 } |
| |
2006 |
| |
2007 if (who) { |
| |
2008 GaimBuddy *b = gaim_find_buddy(gc->account, who); |
| |
2009 if (b && (checksum != gaim_blist_node_get_int((GaimBlistNode*)b, YAHOO_ICON_CHECKSUM_KEY))) |
| |
2010 yahoo_send_buddy_icon_request(gc, who); |
| |
2011 } |
| 1921 } |
2012 } |
| 1922 |
2013 |
| 1923 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
2014 static void yahoo_packet_process(GaimConnection *gc, struct yahoo_packet *pkt) |
| 1924 { |
2015 { |
| 1925 switch (pkt->service) { |
2016 switch (pkt->service) { |
| 2011 case YAHOO_SERVICE_PEEPTOPEER: |
2102 case YAHOO_SERVICE_PEEPTOPEER: |
| 2012 yahoo_process_p2p(gc, pkt); |
2103 yahoo_process_p2p(gc, pkt); |
| 2013 break; |
2104 break; |
| 2014 case YAHOO_SERVICE_PICTURE: |
2105 case YAHOO_SERVICE_PICTURE: |
| 2015 yahoo_process_picture(gc, pkt); |
2106 yahoo_process_picture(gc, pkt); |
| |
2107 break; |
| |
2108 case YAHOO_SERVICE_PICTURE_UPDATE: |
| |
2109 yahoo_process_picture_update(gc, pkt); |
| |
2110 break; |
| |
2111 case YAHOO_SERVICE_PICTURE_CHECKSUM: |
| |
2112 yahoo_process_picture_checksum(gc, pkt); |
| 2016 break; |
2113 break; |
| 2017 default: |
2114 default: |
| 2018 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
2115 gaim_debug(GAIM_DEBUG_ERROR, "yahoo", |
| 2019 "Unhandled service 0x%02x\n", pkt->service); |
2116 "Unhandled service 0x%02x\n", pkt->service); |
| 2020 break; |
2117 break; |