comparison libpurple/protocols/msn/notification.c @ 31130:1830fa548302

propagate from branch 'im.pidgin.pidgin' (head b0098e2250f135d121960d8152e144e7e344125e) to branch 'im.pidgin.cpw.qulogic.msnp16' (head 03b7207e3af73e90ff9aea7c633dec9dd9d3ed1a)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 06 Feb 2010 05:15:35 +0000
parents 4c8bd8efacb8 746bf7d8b34e
children 33b4ae796648
comparison
equal deleted inserted replaced
31129:b27d2e8f137e 31130:1830fa548302
1171 } 1171 }
1172 g_free(friendly); 1172 g_free(friendly);
1173 1173
1174 msn_user_set_object(user, msnobj); 1174 msn_user_set_object(user, msnobj);
1175 1175
1176 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE) || (user->phone.mobile && user->phone.mobile[0] == '+'); 1176 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE) || (user->extinfo && user->extinfo->phone_mobile && user->extinfo->phone_mobile[0] == '+');
1177 msn_user_set_clientid(user, clientid); 1177 msn_user_set_clientid(user, clientid);
1178 msn_user_set_extcaps(user, extcaps); 1178 msn_user_set_extcaps(user, extcaps);
1179 msn_user_set_network(user, networkid); 1179 msn_user_set_network(user, networkid);
1180 1180
1181 msn_user_set_state(user, state); 1181 msn_user_set_state(user, state);
1352 clientid = strtoul(cmd->params[4], &extcap_str, 10); 1352 clientid = strtoul(cmd->params[4], &extcap_str, 10);
1353 if (session->protocol_ver >= 16 && extcap_str && *extcap_str) 1353 if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
1354 extcaps = strtoul(extcap_str+1, NULL, 10); 1354 extcaps = strtoul(extcap_str+1, NULL, 10);
1355 else 1355 else
1356 extcaps = 0; 1356 extcaps = 0;
1357 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE) || (user->phone.mobile && user->phone.mobile[0] == '+'); 1357
1358 user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE) || (user->extinfo && user->extinfo->phone_mobile && user->extinfo->phone_mobile[0] == '+');
1358 1359
1359 msn_user_set_clientid(user, clientid); 1360 msn_user_set_clientid(user, clientid);
1360 msn_user_set_extcaps(user, extcaps); 1361 msn_user_set_extcaps(user, extcaps);
1361 msn_user_set_network(user, networkid); 1362 msn_user_set_network(user, networkid);
1362 1363
1707 } 1708 }
1708 } 1709 }
1709 } 1710 }
1710 } 1711 }
1711 1712
1713 static void parse_currentmedia(MsnUser *user, const char *cmedia)
1714 {
1715 char **cmedia_array;
1716 int strings = 0;
1717
1718 if (!cmedia || cmedia[0] == '\0') {
1719 purple_debug_info("msn", "No currentmedia string\n");
1720 return;
1721 }
1722
1723 purple_debug_info("msn", "Parsing currentmedia string: \"%s\"\n", cmedia);
1724
1725 cmedia_array = g_strsplit(cmedia, "\\0", 0);
1726
1727 /*
1728 * 0: Application
1729 * 1: 'Music'/'Games'/'Office'
1730 * 2: '1' if enabled, '0' if not
1731 * 3: Format (eg. {0} by {1})
1732 * 4: Title
1733 * If 'Music':
1734 * 5: Artist
1735 * 6: Album
1736 * 7: ?
1737 */
1738 #if GLIB_CHECK_VERSION(2,6,0)
1739 strings = g_strv_length(cmedia_array);
1740 #else
1741 while (cmedia_array[++strings] != NULL);
1742 #endif
1743
1744 if (strings >= 4 && !strcmp(cmedia_array[2], "1")) {
1745 if (user->extinfo == NULL)
1746 user->extinfo = g_new0(MsnUserExtendedInfo, 1);
1747 else {
1748 g_free(user->extinfo->media_album);
1749 g_free(user->extinfo->media_artist);
1750 g_free(user->extinfo->media_title);
1751 }
1752
1753 if (!strcmp(cmedia_array[1], "Music"))
1754 user->extinfo->media_type = CURRENT_MEDIA_MUSIC;
1755 else if (!strcmp(cmedia_array[1], "Games"))
1756 user->extinfo->media_type = CURRENT_MEDIA_GAMES;
1757 else if (!strcmp(cmedia_array[1], "Office"))
1758 user->extinfo->media_type = CURRENT_MEDIA_OFFICE;
1759 else
1760 user->extinfo->media_type = CURRENT_MEDIA_UNKNOWN;
1761
1762 user->extinfo->media_title = g_strdup(cmedia_array[strings == 4 ? 3 : 4]);
1763 user->extinfo->media_artist = strings > 5 ? g_strdup(cmedia_array[5]) : NULL;
1764 user->extinfo->media_album = strings > 6 ? g_strdup(cmedia_array[6]) : NULL;
1765 }
1766
1767 g_strfreev(cmedia_array);
1768 }
1769
1712 /* 1770 /*
1713 * Get the UBX's PSM info 1771 * Get the UBX's PSM info
1714 * Post it to the User status 1772 * Post it to the User status
1715 * Thanks for Chris <ukdrizzle@yahoo.co.uk>'s code 1773 * Thanks for Chris <ukdrizzle@yahoo.co.uk>'s code
1716 */ 1774 */
1722 PurpleAccount *account; 1780 PurpleAccount *account;
1723 MsnUser *user; 1781 MsnUser *user;
1724 const char *passport; 1782 const char *passport;
1725 xmlnode *payloadNode; 1783 xmlnode *payloadNode;
1726 char *psm_str, *str; 1784 char *psm_str, *str;
1727 CurrentMedia media = {CURRENT_MEDIA_UNKNOWN, NULL, NULL, NULL};
1728 1785
1729 session = cmdproc->session; 1786 session = cmdproc->session;
1730 account = session->account; 1787 account = session->account;
1731 1788
1732 passport = cmd->params[0]; 1789 passport = cmd->params[0];
1740 passport, str); 1797 passport, str);
1741 g_free(str); 1798 g_free(str);
1742 return; 1799 return;
1743 } 1800 }
1744 1801
1802 /* Free any existing media info for this user */
1803 if (user->extinfo) {
1804 g_free(user->extinfo->media_album);
1805 g_free(user->extinfo->media_artist);
1806 g_free(user->extinfo->media_title);
1807 user->extinfo->media_album = NULL;
1808 user->extinfo->media_artist = NULL;
1809 user->extinfo->media_title = NULL;
1810 }
1811
1745 if (len != 0) { 1812 if (len != 0) {
1746 payloadNode = xmlnode_from_str(payload, len); 1813 payloadNode = xmlnode_from_str(payload, len);
1747 if (!payloadNode) { 1814 if (!payloadNode) {
1748 purple_debug_error("msn", "UBX XML parse Error!\n"); 1815 purple_debug_error("msn", "UBX XML parse Error!\n");
1749 1816
1750 msn_user_set_statusline(user, NULL); 1817 msn_user_set_statusline(user, NULL);
1751 msn_user_set_currentmedia(user, NULL);
1752 1818
1753 msn_user_update(user); 1819 msn_user_update(user);
1754 return; 1820 return;
1755 } 1821 }
1756 1822
1757 psm_str = msn_get_psm(payloadNode); 1823 psm_str = msn_get_psm(payloadNode);
1758 msn_user_set_statusline(user, psm_str); 1824 msn_user_set_statusline(user, psm_str);
1759 g_free(psm_str); 1825 g_free(psm_str);
1760 1826
1761 str = msn_get_currentmedia(payloadNode); 1827 str = msn_get_currentmedia(payloadNode);
1762 if (msn_parse_currentmedia(str, &media)) 1828 parse_currentmedia(user, str);
1763 msn_user_set_currentmedia(user, &media);
1764 else
1765 msn_user_set_currentmedia(user, NULL);
1766 g_free(media.title);
1767 g_free(media.album);
1768 g_free(media.artist);
1769 g_free(str); 1829 g_free(str);
1770 1830
1771 parse_user_endpoints(user, payloadNode); 1831 parse_user_endpoints(user, payloadNode);
1772 1832
1773 xmlnode_free(payloadNode); 1833 xmlnode_free(payloadNode);
1774 1834
1775 } else { 1835 } else {
1776 msn_user_set_statusline(user, NULL); 1836 msn_user_set_statusline(user, NULL);
1777 msn_user_set_currentmedia(user, NULL);
1778 } 1837 }
1779 1838
1780 msn_user_update(user); 1839 msn_user_update(user);
1781 } 1840 }
1782 1841