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

📄 util.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}SilcAttributePayloadsilcpurple_get_attr(SilcDList attrs, SilcAttribute attribute){	SilcAttributePayload attr = NULL;	if (!attrs)		return NULL;	silc_dlist_start(attrs);	while ((attr = silc_dlist_get(attrs)) != SILC_LIST_END)		if (attribute == silc_attribute_get_attribute(attr))			break;	return attr;}void silcpurple_get_umode_string(SilcUInt32 mode, char *buf,				 SilcUInt32 buf_size){	memset(buf, 0, buf_size);	if ((mode & SILC_UMODE_SERVER_OPERATOR) ||	    (mode & SILC_UMODE_ROUTER_OPERATOR)) {		strcat(buf, (mode & SILC_UMODE_SERVER_OPERATOR) ?		       "[server operator] " :		       (mode & SILC_UMODE_ROUTER_OPERATOR) ?		       "[SILC operator] " : "[unknown mode] ");	}	if (mode & SILC_UMODE_GONE)		strcat(buf, "[away] ");	if (mode & SILC_UMODE_INDISPOSED)		strcat(buf, "[indisposed] ");	if (mode & SILC_UMODE_BUSY)		strcat(buf, "[busy] ");	if (mode & SILC_UMODE_PAGE)		strcat(buf, "[wake me up] ");	if (mode & SILC_UMODE_HYPER)		strcat(buf, "[hyperactive] ");	if (mode & SILC_UMODE_ROBOT)		strcat(buf, "[robot] ");	if (mode & SILC_UMODE_ANONYMOUS)		strcat(buf, "[anonymous] ");	if (mode & SILC_UMODE_BLOCK_PRIVMSG)		strcat(buf, "[blocks private messages] ");	if (mode & SILC_UMODE_DETACHED)		strcat(buf, "[detached] ");	if (mode & SILC_UMODE_REJECT_WATCHING)		strcat(buf, "[rejects watching] ");	if (mode & SILC_UMODE_BLOCK_INVITE)		strcat(buf, "[blocks invites] ");}void silcpurple_get_chmode_string(SilcUInt32 mode, char *buf,				  SilcUInt32 buf_size){	memset(buf, 0, buf_size);	if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH)		strcat(buf, "[permanent] ");	if (mode & SILC_CHANNEL_MODE_PRIVATE)		strcat(buf, "[private] ");	if (mode & SILC_CHANNEL_MODE_SECRET)		strcat(buf, "[secret] ");	if (mode & SILC_CHANNEL_MODE_PRIVKEY)		strcat(buf, "[private key] ");	if (mode & SILC_CHANNEL_MODE_INVITE)		strcat(buf, "[invite only] ");	if (mode & SILC_CHANNEL_MODE_TOPIC)		strcat(buf, "[topic restricted] ");	if (mode & SILC_CHANNEL_MODE_ULIMIT)		strcat(buf, "[user count limit] ");	if (mode & SILC_CHANNEL_MODE_PASSPHRASE)		strcat(buf, "[passphrase auth] ");	if (mode & SILC_CHANNEL_MODE_CHANNEL_AUTH)		strcat(buf, "[public key auth] ");	if (mode & SILC_CHANNEL_MODE_SILENCE_USERS)		strcat(buf, "[users silenced] ");	if (mode & SILC_CHANNEL_MODE_SILENCE_OPERS)		strcat(buf, "[operators silenced] ");}void silcpurple_get_chumode_string(SilcUInt32 mode, char *buf,				 SilcUInt32 buf_size){	memset(buf, 0, buf_size);	if (mode & SILC_CHANNEL_UMODE_CHANFO)		strcat(buf, "[founder] ");	if (mode & SILC_CHANNEL_UMODE_CHANOP)		strcat(buf, "[operator] ");	if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES)		strcat(buf, "[blocks messages] ");	if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_USERS)		strcat(buf, "[blocks user messages] ");	if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_ROBOTS)		strcat(buf, "[blocks robot messages] ");	if (mode & SILC_CHANNEL_UMODE_QUIET)		strcat(buf, "[quieted] ");}voidsilcpurple_parse_attrs(SilcDList attrs, char **moodstr, char **statusstr,		       char **contactstr, char **langstr, char **devicestr,		       char **tzstr, char **geostr){	SilcAttributePayload attr;	SilcAttributeMood mood = 0;	SilcAttributeContact contact;	SilcAttributeObjDevice device;	SilcAttributeObjGeo geo;	char tmp[1024];	GString *s;	*moodstr = NULL;	*statusstr = NULL;	*contactstr = NULL;	*langstr = NULL;	*devicestr = NULL;	*tzstr = NULL;	*geostr = NULL;	if (!attrs)		return;	s = g_string_new("");	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_STATUS_MOOD);	if (attr && silc_attribute_get_object(attr, &mood, sizeof(mood))) {		if (mood & SILC_ATTRIBUTE_MOOD_HAPPY)			g_string_append_printf(s, "[%s] ", _("Happy"));		if (mood & SILC_ATTRIBUTE_MOOD_SAD)			g_string_append_printf(s, "[%s] ", _("Sad"));		if (mood & SILC_ATTRIBUTE_MOOD_ANGRY)			g_string_append_printf(s, "[%s] ", _("Angry"));		if (mood & SILC_ATTRIBUTE_MOOD_JEALOUS)			g_string_append_printf(s, "[%s] ", _("Jealous"));		if (mood & SILC_ATTRIBUTE_MOOD_ASHAMED)			g_string_append_printf(s, "[%s] ", _("Ashamed"));		if (mood & SILC_ATTRIBUTE_MOOD_INVINCIBLE)			g_string_append_printf(s, "[%s] ", _("Invincible"));		if (mood & SILC_ATTRIBUTE_MOOD_INLOVE)			g_string_append_printf(s, "[%s] ", _("In Love"));		if (mood & SILC_ATTRIBUTE_MOOD_SLEEPY)			g_string_append_printf(s, "[%s] ", _("Sleepy"));		if (mood & SILC_ATTRIBUTE_MOOD_BORED)			g_string_append_printf(s, "[%s] ", _("Bored"));		if (mood & SILC_ATTRIBUTE_MOOD_EXCITED)			g_string_append_printf(s, "[%s] ", _("Excited"));		if (mood & SILC_ATTRIBUTE_MOOD_ANXIOUS)			g_string_append_printf(s, "[%s] ", _("Anxious"));	}	if (strlen(s->str)) {		*moodstr = s->str;		g_string_free(s, FALSE);	} else		g_string_free(s, TRUE);	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_STATUS_FREETEXT);	memset(tmp, 0, sizeof(tmp));	if (attr && silc_attribute_get_object(attr, tmp, sizeof(tmp)))		*statusstr = g_strdup(tmp);	s = g_string_new("");	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_PREFERRED_CONTACT);	if (attr && silc_attribute_get_object(attr, &contact, sizeof(contact))) {		if (contact & SILC_ATTRIBUTE_CONTACT_CHAT)			g_string_append_printf(s, "[%s] ", _("Chat"));		if (contact & SILC_ATTRIBUTE_CONTACT_EMAIL)			g_string_append_printf(s, "[%s] ", _("E-Mail"));		if (contact & SILC_ATTRIBUTE_CONTACT_CALL)			g_string_append_printf(s, "[%s] ", _("Phone"));		if (contact & SILC_ATTRIBUTE_CONTACT_PAGE)			g_string_append_printf(s, "[%s] ", _("Paging"));		if (contact & SILC_ATTRIBUTE_CONTACT_SMS)			g_string_append_printf(s, "[%s] ", _("SMS"));		if (contact & SILC_ATTRIBUTE_CONTACT_MMS)			g_string_append_printf(s, "[%s] ", _("MMS"));		if (contact & SILC_ATTRIBUTE_CONTACT_VIDEO)			g_string_append_printf(s, "[%s] ", _("Video Conferencing"));	}	if (strlen(s->str)) {		*contactstr = s->str;		g_string_free(s, FALSE);	} else		g_string_free(s, TRUE);	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_PREFERRED_LANGUAGE);	memset(tmp, 0, sizeof(tmp));	if (attr && silc_attribute_get_object(attr, tmp, sizeof(tmp)))		*langstr = g_strdup(tmp);	s = g_string_new("");	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_DEVICE_INFO);	memset(&device, 0, sizeof(device));	if (attr && silc_attribute_get_object(attr, &device, sizeof(device))) {		if (device.type == SILC_ATTRIBUTE_DEVICE_COMPUTER)			g_string_append_printf(s, "%s: ", _("Computer"));		if (device.type == SILC_ATTRIBUTE_DEVICE_MOBILE_PHONE)			g_string_append_printf(s, "%s: ", _("Mobile Phone"));		if (device.type == SILC_ATTRIBUTE_DEVICE_PDA)			g_string_append_printf(s, "%s: ", _("PDA"));		if (device.type == SILC_ATTRIBUTE_DEVICE_TERMINAL)			g_string_append_printf(s, "%s: ", _("Terminal"));		g_string_append_printf(s, "%s %s %s %s",				device.manufacturer ? device.manufacturer : "",				device.version ? device.version : "",				device.model ? device.model : "",				device.language ? device.language : "");	}	if (strlen(s->str)) {		*devicestr = s->str;		g_string_free(s, FALSE);	} else		g_string_free(s, TRUE);	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_TIMEZONE);	memset(tmp, 0, sizeof(tmp));	if (attr && silc_attribute_get_object(attr, tmp, sizeof(tmp)))		*tzstr = g_strdup(tmp);	attr = silcpurple_get_attr(attrs, SILC_ATTRIBUTE_GEOLOCATION);	memset(&geo, 0, sizeof(geo));	if (attr && silc_attribute_get_object(attr, &geo, sizeof(geo)))		*geostr = g_strdup_printf("%s %s %s (%s)",				geo.longitude ? geo.longitude : "",				geo.latitude ? geo.latitude : "",				geo.altitude ? geo.altitude : "",				geo.accuracy ? geo.accuracy : "");}/* Returns MIME type of filetype */char *silcpurple_file2mime(const char *filename){	const char *ct;	ct = strrchr(filename, '.');	if (!ct)		return NULL;	else if (!strcasecmp(".png", ct))		return strdup("image/png");	else if (!strcasecmp(".jpg", ct))		return strdup("image/jpeg");	else if (!strcasecmp(".jpeg", ct))		return strdup("image/jpeg");	else if (!strcasecmp(".gif", ct))		return strdup("image/gif");	else if (!strcasecmp(".tiff", ct))		return strdup("image/tiff");	return NULL;}/* Checks if message has images, and assembles MIME message if it has.   If only one image is present, creates simple MIME image message.  If   there are multiple images and/or text with images multipart MIME   message is created. */SilcDList silcpurple_image_message(const char *msg, SilcUInt32 *mflags){	SilcMime mime = NULL, p;	SilcDList list, parts = NULL;	const char *start, *end, *last;	GData *attribs;	char *type;	gboolean images = FALSE;	last = msg;	while (last && *last && purple_markup_find_tag("img", last, &start,						     &end, &attribs)) {		PurpleStoredImage *image = NULL;		const char *id;		/* Check if there is text before image */		if (start - last) {			char *text, *tmp;			p = silc_mime_alloc();			/* Add content type */			silc_mime_add_field(p, "Content-Type",					    "text/plain; charset=utf-8");			tmp = g_strndup(last, start - last);			text = purple_unescape_html(tmp);			g_free(tmp);			/* Add text */			silc_mime_add_data(p, (const unsigned char *)text, strlen(text));			g_free(text);			if (!parts)				parts = silc_dlist_init();			silc_dlist_add(parts, p);		}		id = g_datalist_get_data(&attribs, "id");		if (id && (image = purple_imgstore_find_by_id(atoi(id)))) {			unsigned long imglen = purple_imgstore_get_size(image);			gconstpointer img = purple_imgstore_get_data(image);			p = silc_mime_alloc();			/* Add content type */			type = silcpurple_file2mime(purple_imgstore_get_filename(image));			if (!type) {				g_datalist_clear(&attribs);				last = end + 1;				continue;			}			silc_mime_add_field(p, "Content-Type", type);			silc_free(type);			/* Add content transfer encoding */			silc_mime_add_field(p, "Content-Transfer-Encoding", "binary");			/* Add image data */			silc_mime_add_data(p, img, imglen);			if (!parts)				parts = silc_dlist_init();			silc_dlist_add(parts, p);			images = TRUE;		}		g_datalist_clear(&attribs);		/* Continue after tag */		last = end + 1;	}	/* Check for text after the image(s) */	if (images && last && *last) {		char *tmp = purple_unescape_html(last);		p = silc_mime_alloc();		/* Add content type */		silc_mime_add_field(p, "Content-Type",				    "text/plain; charset=utf-8");		/* Add text */		silc_mime_add_data(p, (const unsigned char *)tmp, strlen(tmp));		g_free(tmp);		if (!parts)			parts = silc_dlist_init();		silc_dlist_add(parts, p);	}	/* If there weren't any images, don't return anything. */	if (!images) {		if (parts)			silc_dlist_uninit(parts);		return NULL;	}	if (silc_dlist_count(parts) > 1) {		/* Multipart MIME message */		char b[32];		mime = silc_mime_alloc();		silc_mime_add_field(mime, "MIME-Version", "1.0");		g_snprintf(b, sizeof(b), "b%4X%4X",			   (unsigned int)time(NULL),			   silc_dlist_count(parts));		silc_mime_set_multipart(mime, "mixed", b);		silc_dlist_start(parts);		while ((p = silc_dlist_get(parts)) != SILC_LIST_END)			silc_mime_add_multipart(mime, p);	} else {		/* Simple MIME message */		silc_dlist_start(parts);		mime = silc_dlist_get(parts);		silc_mime_add_field(mime, "MIME-Version", "1.0");	}	*mflags &= ~SILC_MESSAGE_FLAG_UTF8;	*mflags |= SILC_MESSAGE_FLAG_DATA;	/* Encode message. Fragment if it is too large */	list = silc_mime_encode_partial(mime, 0xfc00);	silc_dlist_uninit(parts);	/* Added multiparts gets freed here */	silc_mime_free(mime);	return list;}

⌨️ 快捷键说明

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