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

📄 oscar.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			&info, key);	purple_connection_update_progress(gc, _("Password sent"), 2, OSCAR_CONNECT_STEPS);	ck[2] = 0x6c;	return 1;}static intpurple_handle_redirect(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...){	PurpleConnection *gc = od->gc;	PurpleAccount *account = purple_connection_get_account(gc);	char *host, *separator;	int port;	FlapConnection *newconn;	va_list ap;	struct aim_redirect_data *redir;	va_start(ap, fr);	redir = va_arg(ap, struct aim_redirect_data *);	va_end(ap);	port = purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT);	separator = strchr(redir->ip, ':');	if (separator != NULL)	{		host = g_strndup(redir->ip, separator - redir->ip);		port = atoi(separator + 1);	}	else		host = g_strdup(redir->ip);	purple_debug_info("oscar", "Connecting to FLAP server %s:%d of type 0x%04hx\n",					host, port, redir->group);	newconn = flap_connection_new(od, redir->group);	newconn->cookielen = redir->cookielen;	newconn->cookie = g_memdup(redir->cookie, redir->cookielen);	if (newconn->type == SNAC_FAMILY_CHAT)	{		struct chat_connection *cc;		cc = g_new0(struct chat_connection, 1);		cc->conn = newconn;		cc->gc = gc;		cc->name = g_strdup(redir->chat.room);		cc->exchange = redir->chat.exchange;		cc->instance = redir->chat.instance;		cc->show = extract_name(redir->chat.room);		newconn->new_conn_data = cc;		purple_debug_info("oscar", "Connecting to chat room %s exchange %hu\n", cc->name, cc->exchange);	}	newconn->connect_data = purple_proxy_connect(NULL, account, host, port,			connection_established_cb, newconn);	if (newconn->connect_data == NULL)	{		flap_connection_schedule_destroy(newconn,				OSCAR_DISCONNECT_COULD_NOT_CONNECT,				_("Unable to initialize connection"));		purple_debug_error("oscar", "Unable to connect to FLAP server "				"of type 0x%04hx\n", redir->group);	}	g_free(host);	return 1;}static int purple_parse_oncoming(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...){	PurpleConnection *gc;	PurpleAccount *account;	PurplePresence *presence;	struct buddyinfo *bi;	time_t time_idle = 0, signon = 0;	int type = 0;	gboolean buddy_is_away = FALSE;	const char *status_id;	gboolean have_status_message = FALSE;	char *message = NULL;	va_list ap;	aim_userinfo_t *info;	gc = od->gc;	account = purple_connection_get_account(gc);	presence = purple_account_get_presence(account);	va_start(ap, fr);	info = va_arg(ap, aim_userinfo_t *);	va_end(ap);	g_return_val_if_fail(info != NULL, 1);	g_return_val_if_fail(info->sn != NULL, 1);	if (info->present & AIM_USERINFO_PRESENT_FLAGS) {		if (info->flags & AIM_FLAG_AWAY)			buddy_is_away = TRUE;	}	if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) {		type = info->icqinfo.status;		if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) &&		      (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) {			buddy_is_away = TRUE;		}	}	if (aim_sn_is_icq(info->sn)) {		if (type & AIM_ICQ_STATE_CHAT)			status_id = OSCAR_STATUS_ID_FREE4CHAT;		else if (type & AIM_ICQ_STATE_DND)			status_id = OSCAR_STATUS_ID_DND;		else if (type & AIM_ICQ_STATE_OUT)			status_id = OSCAR_STATUS_ID_NA;		else if (type & AIM_ICQ_STATE_BUSY)			status_id = OSCAR_STATUS_ID_OCCUPIED;		else if (type & AIM_ICQ_STATE_AWAY)			status_id = OSCAR_STATUS_ID_AWAY;		else if (type & AIM_ICQ_STATE_INVISIBLE)			status_id = OSCAR_STATUS_ID_INVISIBLE;		else			status_id = OSCAR_STATUS_ID_AVAILABLE;	} else {		if (buddy_is_away)			status_id = OSCAR_STATUS_ID_AWAY;		else			status_id = OSCAR_STATUS_ID_AVAILABLE;	}	/*	 * Handle the available message.  If info->status is NULL then the user	 * may or may not have an available message, so don't do anything.  If	 * info->status is set to the empty string, then the user's client DOES	 * support available messages and the user DOES NOT have one set.	 * Otherwise info->status contains the available message.	 */	if (info->status != NULL)	{		have_status_message = TRUE;		if (info->status[0] != '\0')			message = oscar_encoding_to_utf8(account, info->status_encoding,											 info->status, info->status_len);	}	if (info->flags & AIM_FLAG_WIRELESS)	{		purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_MOBILE, NULL);	} else {		purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE);	}	if (have_status_message)	{		if ((status_id == OSCAR_STATUS_ID_AVAILABLE) && (info->itmsurl != NULL))		{			char *itmsurl;			itmsurl = oscar_encoding_to_utf8(account, info->itmsurl_encoding,					info->itmsurl, info->itmsurl_len);			purple_prpl_got_user_status(account, info->sn, status_id,					"message", message, "itmsurl", itmsurl, NULL);			g_free(itmsurl);		}		else		{			purple_prpl_got_user_status(account, info->sn, status_id,					"message", message, NULL);		}		g_free(message);	}	else	{		PurpleBuddy *b = purple_find_buddy(account, info->sn);		PurpleStatus *status = NULL;		const char *active_status_id = NULL;		if (b != NULL) {			status = purple_presence_get_active_status(purple_buddy_get_presence(b));			active_status_id = purple_status_get_id(status);		}		if (!active_status_id || strcmp(active_status_id, status_id))			purple_prpl_got_user_status(account, info->sn, status_id, NULL);	}	/* Login time stuff */	if (info->present & AIM_USERINFO_PRESENT_ONLINESINCE)		signon = info->onlinesince;	else if (info->present & AIM_USERINFO_PRESENT_SESSIONLEN)		signon = time(NULL) - info->sessionlen;	if (!aim_sncmp(purple_account_get_username(account), info->sn)) {		purple_connection_set_display_name(gc, info->sn);	}	purple_prpl_got_user_login_time(account, info->sn, signon);	/* Idle time stuff */	/* info->idletime is the number of minutes that this user has been idle */	if (info->present & AIM_USERINFO_PRESENT_IDLE)		time_idle = time(NULL) - info->idletime * 60;	if (time_idle > 0)		purple_prpl_got_user_idle(account, info->sn, TRUE, time_idle);	else		purple_prpl_got_user_idle(account, info->sn, FALSE, 0);	/* Server stored icon stuff */	bi = g_hash_table_lookup(od->buddyinfo, purple_normalize(account, info->sn));	if (!bi) {		bi = g_new0(struct buddyinfo, 1);		g_hash_table_insert(od->buddyinfo, g_strdup(purple_normalize(account, info->sn)), bi);	}	bi->typingnot = FALSE;	bi->ico_informed = FALSE;	bi->ipaddr = info->icqinfo.ipaddr;	if (info->iconcsumlen) {		const char *saved_b16 = NULL;		char *b16 = NULL;		PurpleBuddy *b = NULL;		b16 = purple_base16_encode(info->iconcsum, info->iconcsumlen);		b = purple_find_buddy(account, info->sn);		if (b != NULL)			saved_b16 = purple_buddy_icons_get_checksum_for_user(b);		if (!b16 || !saved_b16 || strcmp(b16, saved_b16)) {			GSList *cur = od->requesticon;			while (cur && aim_sncmp((char *)cur->data, info->sn))				cur = cur->next;			if (!cur) {				od->requesticon = g_slist_append(od->requesticon, g_strdup(purple_normalize(account, info->sn)));				if (od->icontimer == 0)					od->icontimer = purple_timeout_add(500, purple_icon_timerfunc, gc);			}		}		g_free(b16);	}	return 1;}static void purple_check_comment(OscarData *od, const char *str) {	if ((str == NULL) || strcmp(str, (const char *)ck))		aim_locate_setcaps(od, purple_caps);	else		aim_locate_setcaps(od, purple_caps | OSCAR_CAPABILITY_SECUREIM);}static int purple_parse_offgoing(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) {	PurpleConnection *gc = od->gc;	PurpleAccount *account = purple_connection_get_account(gc);	va_list ap;	aim_userinfo_t *info;	va_start(ap, fr);	info = va_arg(ap, aim_userinfo_t *);	va_end(ap);	purple_prpl_got_user_status(account, info->sn, OSCAR_STATUS_ID_OFFLINE, NULL);	purple_prpl_got_user_status_deactive(account, info->sn, OSCAR_STATUS_ID_MOBILE);	g_hash_table_remove(od->buddyinfo, purple_normalize(gc->account, info->sn));	return 1;}static int incomingim_chan1(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) {	PurpleConnection *gc = od->gc;	PurpleAccount *account = purple_connection_get_account(gc);	PurpleMessageFlags flags = 0;	struct buddyinfo *bi;	PurpleStoredImage *img;	GString *message;	gchar *tmp;	aim_mpmsg_section_t *curpart;	const char *start, *end;	GData *attribs;	purple_debug_misc("oscar", "Received IM from %s with %d parts\n",					userinfo->sn, args->mpmsg.numparts);	if (args->mpmsg.numparts == 0)		return 1;	bi = g_hash_table_lookup(od->buddyinfo, purple_normalize(account, userinfo->sn));	if (!bi) {		bi = g_new0(struct buddyinfo, 1);		g_hash_table_insert(od->buddyinfo, g_strdup(purple_normalize(account, userinfo->sn)), bi);	}	if (args->icbmflags & AIM_IMFLAGS_AWAY)		flags |= PURPLE_MESSAGE_AUTO_RESP;	if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT)		bi->typingnot = TRUE;	else		bi->typingnot = FALSE;	if ((args->icbmflags & AIM_IMFLAGS_HASICON) && (args->iconlen) && (args->iconsum) && (args->iconstamp)) {		purple_debug_misc("oscar", "%s has an icon\n", userinfo->sn);		if ((args->iconlen != bi->ico_len) || (args->iconsum != bi->ico_csum) || (args->iconstamp != bi->ico_time)) {			bi->ico_need = TRUE;			bi->ico_len = args->iconlen;			bi->ico_csum = args->iconsum;			bi->ico_time = args->iconstamp;		}	}	img = purple_buddy_icons_find_account_icon(account);	if ((img != NULL) &&	    (args->icbmflags & AIM_IMFLAGS_BUDDYREQ) && !bi->ico_sent && bi->ico_informed) {		gconstpointer data = purple_imgstore_get_data(img);		size_t len = purple_imgstore_get_size(img);		purple_debug_info("oscar",				   "Sending buddy icon to %s (%d bytes)\n",				   userinfo->sn, len);		aim_im_sendch2_icon(od, userinfo->sn, data, len,			purple_buddy_icons_get_account_icon_timestamp(account),			aimutil_iconsum(data, len));	}	purple_imgstore_unref(img);	message = g_string_new("");	curpart = args->mpmsg.parts;	while (curpart != NULL) {		tmp = purple_plugin_oscar_decode_im_part(account, userinfo->sn, curpart->charset,				curpart->charsubset, curpart->data, curpart->datalen);		if (tmp != NULL) {			g_string_append(message, tmp);			g_free(tmp);		}		curpart = curpart->next;	}	tmp = g_string_free(message, FALSE);	/*	 * If the message is from an ICQ user and to an ICQ user then escape any HTML,	 * because HTML is not sent over ICQ as a means to format a message.	 * So any HTML we receive is intended to be displayed.  Also, \r\n must be	 * replaced with <br>	 *	 * Note: There *may* be some clients which send messages as HTML formatted -	 *       they need to be special-cased somehow.	 */	if (aim_sn_is_icq(purple_account_get_username(account)) && aim_sn_is_icq(userinfo->sn)) {		/* being recevied by ICQ from ICQ - escape HTML so it is displayed as sent */		gchar *tmp2 = g_markup_escape_text(tmp, -1);		g_free(tmp);		tmp = tmp2;		tmp2 = purple_strreplace(tmp, "\r\n", "<br>");		g_free(tmp);		tmp = tmp2;	}	/*	 * Convert iChat color tags to normal font tags.	 */	if (purple_markup_find_tag("body", tmp, &start, &end, &attribs))	{		const char *ichattextcolor, *ichatballooncolor;		ichattextcolor = g_datalist_get_data(&attribs, "ichattextcolor");		if (ichattextcolor != NULL)		{			gchar *tmp2;			tmp2 = g_strdup_printf("<font color=\"%s\">%s</font>", ichattextcolor, tmp);			g_free(tmp);			tmp = tmp2;		}		ichatballooncolor = g_datalist_get_data(&attribs, "ichatballooncolor");		if (ichatballooncolor != NULL)		{			gchar *tmp2;			tmp2 = g_strdup_printf("<font back=\"%s\">%s</font>", ichatballooncolor, tmp);			g_free(tmp);			tmp = tmp2;		}		g_datalist_clear(&attribs);	}	serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL));	g_free(tmp);	return 1;}static intincomingim_chan2(OscarData *od, FlapConnection *conn, aim_userinfo_t *userinfo, IcbmArgsCh2 *args){	PurpleConnection *gc;	PurpleAccount *account;	char *message = NULL;	g_return_val_if_fail(od != NULL, 0);	g_return_val_if_fail(od->gc != NULL, 0);	gc = od->gc;	account = purple_connection_get_account(gc);	od = gc->proto_data;	if (args == NULL)		return 0;	purple_debug_misc("oscar", "Incoming rendezvous message of type %u, "			"user %s, status %hu\n", args->type, userinfo->sn, args->status);	if (args->msg != NULL)	{		if (args->encoding != NULL)		{			char *encoding = NULL;			encoding = oscar_encoding_extract(args->encoding);

⌨️ 快捷键说明

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