⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yahoo_profile.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		}	}	if (p) {		for (strid = 0; profile_strings[strid].lang != XX; strid += 1) {			if (profile_strings[strid].lang == profile_langs[lang].lang) break;		}		strings = profile_strings + strid;		purple_debug_info("yahoo", "detected profile lang = %s (%d)\n", profile_strings[strid].lang_string, lang);	}	/* Every user may choose his/her own profile language, and this language	 * has nothing to do with the preferences of the user which looks at the	 * profile. We try to support all languages, but nothing is guaranteed.	 * If we cannot determine the language, it means either (1) the profile	 * is written in an unsupported language, (2) our language support is	 * out of date, or (3) the user is not found, or (4) Y! have changed their	 * webpage layout	 */	if (!p || strings->lang == XX) {		if (!strstr(url_text, "Yahoo! Member Directory - User not found")				&& !strstr(url_text, "was not found on this server.")				&& !strstr(url_text, "\xb8\xf8\xb3\xab\xa5\xd7\xa5\xed\xa5\xd5\xa5\xa3\xa1\xbc\xa5\xeb\xa4\xac\xb8\xab\xa4\xc4\xa4\xab\xa4\xea\xa4\xde\xa4\xbb\xa4\xf3")) {			profile_state = PROFILE_STATE_UNKNOWN_LANGUAGE;		} else {			profile_state = PROFILE_STATE_NOT_FOUND;		}	}#if PHOTO_SUPPORT	photo_url_text = yahoo_get_photo_url(url_text, info_data->name);#endif	url_buffer = g_strdup(url_text);	/*	 * purple_markup_strip_html() doesn't strip out character entities like &nbsp;	 * and &#183;	*/	yahoo_remove_nonbreaking_spaces(url_buffer);#if 1	while ((p = strstr(url_buffer, "&#183;")) != NULL) {		memmove(p, p + 6, strlen(p + 6));		url_buffer[strlen(url_buffer) - 6] = '\0';	}#endif	/* nuke the nasty \r's */	purple_str_strip_char(url_buffer, '\r');#if PHOTO_SUPPORT	/* Marshall the existing state */	info2_data = g_malloc(sizeof(YahooGetInfoStepTwoData));	info2_data->info_data = info_data;	info2_data->url_buffer = url_buffer;	info2_data->photo_url_text = photo_url_text;	info2_data->profile_url_text = profile_url_text;	info2_data->strings = strings;	info2_data->last_updated_string = last_updated_string;	info2_data->title = title;	info2_data->profile_state = profile_state;	info2_data->user_info = user_info;	/* Try to put the photo in there too, if there's one */	if (photo_url_text) {		PurpleUtilFetchUrlData *url_data;		/* User-uploaded photos use a different server that requires the Host		 * header, but Yahoo Japan will use the "chunked" content encoding if		 * we specify HTTP 1.1. So we have to specify 1.0 & fix purple_util_fetch_url		 */		url_data = purple_util_fetch_url(photo_url_text, FALSE, NULL,				FALSE, yahoo_got_photo, info2_data);		if (url_data != NULL)			yd->url_datas = g_slist_prepend(yd->url_datas, url_data);		else {			g_free(info2_data->info_data->name);			g_free(info2_data->info_data);			g_free(info2_data);		}	} else {		/* Emulate a callback */		yahoo_got_photo(NULL, info2_data, NULL, 0, NULL);	}}static voidyahoo_got_photo(PurpleUtilFetchUrlData *url_data, gpointer data,		const gchar *url_text, size_t len, const gchar *error_message){	YahooGetInfoStepTwoData *info2_data = (YahooGetInfoStepTwoData *)data;	struct yahoo_data *yd;	gboolean found = FALSE;	int id = -1;	/* Temporary variables */	char *p = NULL;	char *stripped;	int stripped_len;	char *last_updated_utf8_string = NULL;	char *tmp;	/* Unmarshall the saved state */	YahooGetInfoData *info_data = info2_data->info_data;	char *url_buffer = info2_data->url_buffer;	PurpleNotifyUserInfo *user_info = info2_data->user_info;	char *photo_url_text = info2_data->photo_url_text;	char *profile_url_text = info2_data->profile_url_text;	const profile_strings_node_t *strings = info2_data->strings;	const char *last_updated_string = info2_data->last_updated_string;	profile_state_t profile_state = info2_data->profile_state;	/* We continue here from yahoo_got_info, as if nothing has happened */#endif /* PHOTO_SUPPORT */	/* Jun 29 05 Bleeter: Y! changed their profile pages. Terminators now seem to be */	/* </dd> and not \n. The prpl's need to be audited before it can be moved */	/* in to purple_markup_strip_html*/	char *fudged_buffer;	yd = info_data->gc->proto_data;	yd->url_datas = g_slist_remove(yd->url_datas, url_data);	fudged_buffer = purple_strcasereplace(url_buffer, "</dd>", "</dd><br>");	/* nuke the html, it's easier than trying to parse the horrid stuff */	stripped = purple_markup_strip_html(fudged_buffer);	stripped_len = strlen(stripped);	purple_debug_misc("yahoo", "stripped = %p\n", stripped);	purple_debug_misc("yahoo", "url_buffer = %p\n", url_buffer);	/* convert to utf8 */	if (strings && strings->charset != XX) {		p = g_convert(stripped, -1, "utf-8", strings->charset,				NULL, NULL, NULL);		if (!p) {			p = g_locale_to_utf8(stripped, -1, NULL, NULL, NULL);			if (!p) {				p = g_convert(stripped, -1, "utf-8", "windows-1252",						NULL, NULL, NULL);			}		}		if (p) {			g_free(stripped);			stripped = purple_utf8_ncr_decode(p);			stripped_len = strlen(stripped);			g_free(p);		}	}	p = NULL;	/* "Last updated" should also be converted to utf8 and with &nbsp; killed */	if (strings && strings->charset != XX) {		last_updated_utf8_string = g_convert(last_updated_string, -1, "utf-8",				strings->charset, NULL, NULL, NULL);		yahoo_remove_nonbreaking_spaces(last_updated_utf8_string);		purple_debug_misc("yahoo", "after utf8 conversion: stripped = (%s)\n", stripped);	}	if (profile_state == PROFILE_STATE_DEFAULT) {#if 0	/* extract their Yahoo! ID and put it in. Don't bother marking has_info as	 * true, since the Yahoo! ID will always be there */	if (!purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->yahoo_id_string, (yd->jp ? 2 : 10), "\n", 0,			NULL, _("Yahoo! ID"), 0, NULL, NULL))		;#endif#if PHOTO_SUPPORT	/* Try to put the photo in there too, if there's one and is readable */	if (data && url_text && len != 0) {		if (strstr(url_text, "400 Bad Request")				|| strstr(url_text, "403 Forbidden")				|| strstr(url_text, "404 Not Found")) {			purple_debug_info("yahoo", "Error getting %s: %s\n",					photo_url_text, url_text);		} else {			purple_debug_info("yahoo", "%s is %d bytes\n", photo_url_text, len);			id = purple_imgstore_add_with_id(g_memdup(url_text, len), len, NULL);						tmp = g_strdup_printf("<img id=\"%d\"><br>", id);			purple_notify_user_info_add_pair(user_info, NULL, tmp);			g_free(tmp);		}	}#endif /* PHOTO_SUPPORT */	/* extract their Email address and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->my_email_string, (yd->jp ? 4 : 1), " ", 0,			strings->private_string, _("E-Mail"), 0, NULL, NULL);	/* extract the Nickname if it exists */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			"Nickname:", 1, "\n", '\n',			NULL, _("Nickname"), 0, NULL, NULL);	/* extract their RealName and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->realname_string, (yd->jp ? 3 : 1), "\n", '\n',			NULL, _("Real Name"), 0, NULL, NULL);	/* extract their Location and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->location_string, (yd->jp ? 4 : 2), "\n", '\n',			NULL, _("Location"), 0, NULL, NULL);	/* extract their Age and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->age_string, (yd->jp ? 2 : 3), "\n", '\n',			NULL, _("Age"), 0, NULL, NULL);	/* extract their MaritalStatus and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->maritalstatus_string, (yd->jp ? 2 : 3), "\n", '\n',			strings->no_answer_string, _("Marital Status"), 0, NULL, NULL);	/* extract their Gender and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->gender_string, (yd->jp ? 2 : 3), "\n", '\n',			strings->no_answer_string, _("Gender"), 0, NULL, NULL);	/* extract their Occupation and put it in */	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->occupation_string, 2, "\n", '\n',			NULL, _("Occupation"), 0, NULL, NULL);	/* Hobbies, Latest News, and Favorite Quote are a bit different, since	 * the values can contain embedded newlines... but any or all of them	 * can also not appear.  The way we delimit them is to successively	 * look for the next one that _could_ appear, and if all else fails,	 * we end the section by looking for the 'Links' heading, which is the	 * next thing to follow this bunch.  (For Yahoo Japan, we check for	 * the "Description" ("Self PR") heading instead of "Links".)	 */	if (!purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->hobbies_string, (yd->jp ? 3 : 1), strings->latest_news_string,			'\n', "\n", _("Hobbies"), 0, NULL, NULL))	{		if (!purple_markup_extract_info_field(stripped, stripped_len, user_info,				strings->hobbies_string, 1, strings->favorite_quote_string,				'\n', "\n", _("Hobbies"), 0, NULL, NULL))		{			found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,					strings->hobbies_string, 1, strings->links_string,					'\n', "\n", _("Hobbies"), 0, NULL, NULL);		}		else			found = TRUE;	}	else		found = TRUE;	if (!purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->latest_news_string, 1, strings->favorite_quote_string,			'\n', "\n", _("Latest News"), 0, NULL, NULL))	{		found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,				strings->latest_news_string, (yd->jp ? 2 : 1), strings->links_string,				'\n', "\n", _("Latest News"), 0, NULL, NULL);	}	else		found = TRUE;	found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,			strings->favorite_quote_string, 1, strings->links_string,			'\n', "\n", _("Favorite Quote"), 0, NULL, NULL);	/* Home Page will either be "No home page specified",	 * or "Home Page: " and a link.	 * For Yahoo! Japan, if there is no home page specified,	 * neither "No home page specified" nor "Home Page:" is shown.	 */	if (strings->home_page_string) {		p = !strings->no_home_page_specified_string? NULL:			strstr(stripped, strings->no_home_page_specified_string);		if(!p)		{			found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,					strings->home_page_string, 1, "\n", 0, NULL,					_("Home Page"), 1, NULL, NULL);		}	}	/* Cool Link {1,2,3} is also different.  If "No cool link specified"	 * exists, then we have none.  If we have one however, we'll need to	 * check and see if we have a second one.  If we have a second one,	 * we have to check to see if we have a third one.	 */	p = !strings->no_cool_link_specified_string? NULL:		strstr(stripped,strings->no_cool_link_specified_string);	if (!p)	{		if (purple_markup_extract_info_field(stripped, stripped_len, user_info,				strings->cool_link_1_string, 1, "\n", 0, NULL,				_("Cool Link 1"), 1, NULL, NULL))		{			found = TRUE;			if (purple_markup_extract_info_field(stripped, stripped_len, user_info,					strings->cool_link_2_string, 1, "\n", 0, NULL,					_("Cool Link 2"), 1, NULL, NULL))			{				purple_markup_extract_info_field(stripped, stripped_len, user_info,						strings->cool_link_3_string, 1, "\n", 0, NULL,						_("Cool Link 3"), 1, NULL, NULL);			}		}	}	if (last_updated_utf8_string != NULL) {		/* see if Member Since is there, and if so, extract it. */		found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,				"Member Since:", 1, last_updated_utf8_string,				'\n', NULL, _("Member Since"), 0, NULL, yahoo_info_date_reformat);		/* extract the Last Updated date and put it in */		found |= purple_markup_extract_info_field(stripped, stripped_len, user_info,				last_updated_utf8_string, (yd->jp ? 2 : 1), (yd->jp ? "\n" : " "), (yd->jp ? 0 : '\n'), NULL,				_("Last Update"), 0, NULL, (yd->jp ? NULL : yahoo_info_date_reformat));	}	} /* if (profile_state == PROFILE_STATE_DEFAULT) */	if(!found)	{		GString *str = g_string_new("");		g_string_append_printf(str, "<br><b>");		g_string_append_printf(str, _("User information for %s unavailable"),				info_data->name);		g_string_append_printf(str, "</b><br>");		if (profile_state == PROFILE_STATE_UNKNOWN_LANGUAGE) {			g_string_append_printf(str, "%s<br><br>",					_("Sorry, this profile seems to be in a language "					  "or format that is not supported at this time."));		} else if (profile_state == PROFILE_STATE_NOT_FOUND) {			PurpleBuddy *b = purple_find_buddy					(purple_connection_get_account(info_data->gc),							info_data->name);			YahooFriend *f = NULL;			if (b) {				/* Someone on the buddy list can be "not on server list",				 * in which case the user may or may not actually exist.				 * Hence this extra step.				 */				f = yahoo_friend_find(b->account->gc, b->name);			}			g_string_append_printf(str, "%s<br><br>",				f?  _("Could not retrieve the user's profile. "					  "This most likely is a temporary server-side problem. "					  "Please try again later."):					_("Could not retrieve the user's profile. "					  "This most likely means that the user does not exist; "					  "however, Yahoo! sometimes does fail to find a user's "					  "profile. If you know that the user exists, "					  "please try again later."));		} else {			g_string_append_printf(str, "%s<br><br>",					_("The user's profile is empty."));		}				purple_notify_user_info_add_pair(user_info, NULL, str->str);		g_string_free(str, TRUE);	}	/* put a link to the actual profile URL */	tmp = g_strdup_printf("<a href=\"%s\">%s</a>", profile_url_text, profile_url_text);	purple_notify_user_info_add_pair(user_info, _("Profile URL"), tmp);	g_free(tmp);	g_free(stripped);	/* show it to the user */	purple_notify_userinfo(info_data->gc, info_data->name,						  user_info, NULL, NULL);	purple_notify_user_info_destroy(user_info);	g_free(last_updated_utf8_string);	g_free(url_buffer);	g_free(fudged_buffer);	g_free(profile_url_text);	g_free(info_data->name);	g_free(info_data);#if PHOTO_SUPPORT	g_free(photo_url_text);	g_free(info2_data);	if (id != -1)		purple_imgstore_unref_by_id(id);#endif}void yahoo_get_info(PurpleConnection *gc, const char *name){	struct yahoo_data *yd = gc->proto_data;	YahooGetInfoData *data;	char *url;	PurpleUtilFetchUrlData *url_data;	data       = g_new0(YahooGetInfoData, 1);	data->gc   = gc;	data->name = g_strdup(name);	url = g_strdup_printf("%s%s",			(yd->jp ? YAHOOJP_PROFILE_URL : YAHOO_PROFILE_URL), name);	url_data = purple_util_fetch_url(url, TRUE, NULL, FALSE, yahoo_got_info, data);	if (url_data != NULL)		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);	else {		g_free(data->name);		g_free(data);	}	g_free(url);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -