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

📄 silc.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	/* Get username, real name and local hostname for SILC library */	if (!purple_account_get_username(account))		purple_account_set_username(account, silc_get_username());	username = (char *)purple_account_get_username(account);	up = g_strsplit(username, "@", 2);	username = strdup(up[0]);	g_strfreev(up);	if (!purple_account_get_user_info(account)) {		purple_account_set_user_info(account, silc_get_real_name());		if (!purple_account_get_user_info(account))			purple_account_set_user_info(account,						     "John T. Noname");	}	realname = (char *)purple_account_get_user_info(account);	hostname = silc_net_localhost();	purple_connection_set_display_name(gc, username);	/* Register requested cipher and HMAC */	cipher = purple_account_get_string(account, "cipher",					   SILC_DEFAULT_CIPHER);	for (i = 0; silc_default_ciphers[i].name; i++)		if (!strcmp(silc_default_ciphers[i].name, cipher)) {			silc_cipher_register(&(silc_default_ciphers[i]));			break;		}	hmac = purple_account_get_string(account, "hmac", SILC_DEFAULT_HMAC);	for (i = 0; silc_default_hmacs[i].name; i++)		if (!strcmp(silc_default_hmacs[i].name, hmac)) {			silc_hmac_register(&(silc_default_hmacs[i]));			break;		}	/* Init SILC client */	if (!silc_client_init(client, username, hostname, realname,			      silcpurple_running, account)) {		gc->wants_to_die = TRUE;		purple_connection_error(gc, _("Cannot initialize SILC protocol"));		return;	}	/* Check the ~/.silc dir and create it, and new key pair if necessary. */	if (!silcpurple_check_silc_dir(gc)) {		gc->wants_to_die = TRUE;		purple_connection_error(gc, _("Error loading SILC key pair"));		return;	}	/* Schedule SILC using Glib's event loop */	scheduler = purple_timeout_add(300, (GSourceFunc)silcpurple_scheduler, client);	gc->proto_data = SILC_32_TO_PTR(scheduler);}static intsilcpurple_close_final(gpointer *context){	SilcPurple sg = (SilcPurple)context;	silc_client_stop(sg->client, NULL, NULL);	silc_client_free(sg->client);	if (sg->mimeass)		silc_mime_assembler_free(sg->mimeass);	silc_free(sg);	return 0;}static voidsilcpurple_close(PurpleConnection *gc){	SilcPurple sg = gc->proto_data;	g_return_if_fail(sg != NULL);	/* Send QUIT */	silc_client_command_call(sg->client, sg->conn, NULL,				 "QUIT", "Download Pidgin: " PURPLE_WEBSITE, NULL);	if (sg->conn)		silc_client_close_connection(sg->client, sg->conn);	purple_timeout_remove(sg->scheduler);	purple_timeout_add(1, (GSourceFunc)silcpurple_close_final, sg);}/****************************** Protocol Actions *****************************/static voidsilcpurple_attrs_cancel(PurpleConnection *gc, PurpleRequestFields *fields){	/* Nothing */}static voidsilcpurple_attrs_cb(PurpleConnection *gc, PurpleRequestFields *fields){	SilcPurple sg = gc->proto_data;	SilcClient client = sg->client;	SilcClientConnection conn = sg->conn;	PurpleRequestField *f;	char *tmp;	SilcUInt32 tmp_len, mask;	SilcAttributeObjService service;	SilcAttributeObjDevice dev;	SilcVCardStruct vcard;	const char *val;	sg = gc->proto_data;	if (!sg)		return;	memset(&service, 0, sizeof(service));	memset(&dev, 0, sizeof(dev));	memset(&vcard, 0, sizeof(vcard));	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_USER_INFO, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_SERVICE, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_STATUS_MOOD, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_STATUS_FREETEXT, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_STATUS_MESSAGE, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_PREFERRED_LANGUAGE, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_PREFERRED_CONTACT, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_TIMEZONE, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_GEOLOCATION, NULL);	silc_client_attribute_del(client, conn,				  SILC_ATTRIBUTE_DEVICE_INFO, NULL);	/* Set mood */	mask = 0;	f = purple_request_fields_get_field(fields, "mood_normal");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_NORMAL;	f = purple_request_fields_get_field(fields, "mood_happy");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_HAPPY;	f = purple_request_fields_get_field(fields, "mood_sad");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_SAD;	f = purple_request_fields_get_field(fields, "mood_angry");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_ANGRY;	f = purple_request_fields_get_field(fields, "mood_jealous");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_JEALOUS;	f = purple_request_fields_get_field(fields, "mood_ashamed");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_ASHAMED;	f = purple_request_fields_get_field(fields, "mood_invincible");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_INVINCIBLE;	f = purple_request_fields_get_field(fields, "mood_inlove");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_INLOVE;	f = purple_request_fields_get_field(fields, "mood_sleepy");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_SLEEPY;	f = purple_request_fields_get_field(fields, "mood_bored");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_BORED;	f = purple_request_fields_get_field(fields, "mood_excited");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_EXCITED;	f = purple_request_fields_get_field(fields, "mood_anxious");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_MOOD_ANXIOUS;	silc_client_attribute_add(client, conn,				  SILC_ATTRIBUTE_STATUS_MOOD,				  SILC_32_TO_PTR(mask),				  sizeof(SilcUInt32));	/* Set preferred contact */	mask = 0;	f = purple_request_fields_get_field(fields, "contact_chat");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_CHAT;	f = purple_request_fields_get_field(fields, "contact_email");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_EMAIL;	f = purple_request_fields_get_field(fields, "contact_call");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_CALL;	f = purple_request_fields_get_field(fields, "contact_sms");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_SMS;	f = purple_request_fields_get_field(fields, "contact_mms");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_MMS;	f = purple_request_fields_get_field(fields, "contact_video");	if (f && purple_request_field_bool_get_value(f))		mask |= SILC_ATTRIBUTE_CONTACT_VIDEO;	if (mask)		silc_client_attribute_add(client, conn,					  SILC_ATTRIBUTE_PREFERRED_CONTACT,					  SILC_32_TO_PTR(mask),					  sizeof(SilcUInt32));	/* Set status text */	val = NULL;	f = purple_request_fields_get_field(fields, "status_text");	if (f)		val = purple_request_field_string_get_value(f);	if (val && *val)		silc_client_attribute_add(client, conn,					  SILC_ATTRIBUTE_STATUS_FREETEXT,					  (void *)val, strlen(val));	/* Set vcard */	val = NULL;	f = purple_request_fields_get_field(fields, "vcard");	if (f)		val = purple_request_field_string_get_value(f);	if (val && *val) {		purple_account_set_string(sg->account, "vcard", val);		tmp = silc_file_readfile(val, &tmp_len);		if (tmp) {			tmp[tmp_len] = 0;			if (silc_vcard_decode((unsigned char *)tmp, tmp_len, &vcard))				silc_client_attribute_add(client, conn,							  SILC_ATTRIBUTE_USER_INFO,							  (void *)&vcard,							  sizeof(vcard));		}		silc_vcard_free(&vcard);		silc_free(tmp);	} else {		purple_account_set_string(sg->account, "vcard", "");	}#ifdef HAVE_SYS_UTSNAME_H	/* Set device info */	f = purple_request_fields_get_field(fields, "device");	if (f && purple_request_field_bool_get_value(f)) {		struct utsname u;		if (!uname(&u)) {			dev.type = SILC_ATTRIBUTE_DEVICE_COMPUTER;			dev.version = u.release;			dev.model = u.sysname;			silc_client_attribute_add(client, conn,						  SILC_ATTRIBUTE_DEVICE_INFO,						  (void *)&dev, sizeof(dev));		}	}#endif	/* Set timezone */	val = NULL;	f = purple_request_fields_get_field(fields, "timezone");	if (f)		val = purple_request_field_string_get_value(f);	if (val && *val)		silc_client_attribute_add(client, conn,					  SILC_ATTRIBUTE_TIMEZONE,					  (void *)val, strlen(val));}static voidsilcpurple_attrs(PurplePluginAction *action){	PurpleConnection *gc = (PurpleConnection *) action->context;	SilcPurple sg = gc->proto_data;	SilcClient client = sg->client;	SilcClientConnection conn = sg->conn;	PurpleRequestFields *fields;	PurpleRequestFieldGroup *g;	PurpleRequestField *f;	SilcHashTable attrs;	SilcAttributePayload attr;	gboolean mnormal = TRUE, mhappy = FALSE, msad = FALSE,		mangry = FALSE, mjealous = FALSE, mashamed = FALSE,		minvincible = FALSE, minlove = FALSE, msleepy = FALSE,		mbored = FALSE, mexcited = FALSE, manxious = FALSE;	gboolean cemail = FALSE, ccall = FALSE, csms = FALSE,		cmms = FALSE, cchat = TRUE, cvideo = FALSE;	gboolean device = TRUE;	char status[1024], tz[16];	sg = gc->proto_data;	if (!sg)		return;	memset(status, 0, sizeof(status));	attrs = silc_client_attributes_get(client, conn);	if (attrs) {		if (silc_hash_table_find(attrs,					 SILC_32_TO_PTR(SILC_ATTRIBUTE_STATUS_MOOD),					 NULL, (void *)&attr)) {			SilcUInt32 mood = 0;			silc_attribute_get_object(attr, &mood, sizeof(mood));			mnormal = !mood;			mhappy = (mood & SILC_ATTRIBUTE_MOOD_HAPPY);			msad = (mood & SILC_ATTRIBUTE_MOOD_SAD);			mangry = (mood & SILC_ATTRIBUTE_MOOD_ANGRY);			mjealous = (mood & SILC_ATTRIBUTE_MOOD_JEALOUS);			mashamed = (mood & SILC_ATTRIBUTE_MOOD_ASHAMED);			minvincible = (mood & SILC_ATTRIBUTE_MOOD_INVINCIBLE);			minlove = (mood & SILC_ATTRIBUTE_MOOD_INLOVE);			msleepy = (mood & SILC_ATTRIBUTE_MOOD_SLEEPY);			mbored = (mood & SILC_ATTRIBUTE_MOOD_BORED);			mexcited = (mood & SILC_ATTRIBUTE_MOOD_EXCITED);			manxious = (mood & SILC_ATTRIBUTE_MOOD_ANXIOUS);		}		if (silc_hash_table_find(attrs,					 SILC_32_TO_PTR(SILC_ATTRIBUTE_PREFERRED_CONTACT),					 NULL, (void *)&attr)) {			SilcUInt32 contact = 0;			silc_attribute_get_object(attr, &contact, sizeof(contact));			cemail = (contact & SILC_ATTRIBUTE_CONTACT_EMAIL);			ccall = (contact & SILC_ATTRIBUTE_CONTACT_CALL);			csms = (contact & SILC_ATTRIBUTE_CONTACT_SMS);			cmms = (contact & SILC_ATTRIBUTE_CONTACT_MMS);			cchat = (contact & SILC_ATTRIBUTE_CONTACT_CHAT);			cvideo = (contact & SILC_ATTRIBUTE_CONTACT_VIDEO);		}		if (silc_hash_table_find(attrs,					 SILC_32_TO_PTR(SILC_ATTRIBUTE_STATUS_FREETEXT),					 NULL, (void *)&attr))			silc_attribute_get_object(attr, &status, sizeof(status));		if (!silc_hash_table_find(attrs,					  SILC_32_TO_PTR(SILC_ATTRIBUTE_DEVICE_INFO),					  NULL, (void *)&attr))			device = FALSE;	}	fields = purple_request_fields_new();	g = purple_request_field_group_new(NULL);	f = purple_request_field_label_new("l3", _("Your Current Mood"));	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_normal", _("Normal"), mnormal);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_happy", _("Happy"), mhappy);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_sad", _("Sad"), msad);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_angry", _("Angry"), mangry);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_jealous", _("Jealous"), mjealous);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_ashamed", _("Ashamed"), mashamed);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_invincible", _("Invincible"), minvincible);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_inlove", _("In love"), minlove);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_sleepy", _("Sleepy"), msleepy);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_bored", _("Bored"), mbored);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_excited", _("Excited"), mexcited);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("mood_anxious", _("Anxious"), manxious);	purple_request_field_group_add_field(g, f);	f = purple_request_field_label_new("l4", _("\nYour Preferred Contact Methods"));	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_chat", _("Chat"), cchat);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_email", _("E-mail"), cemail);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_call", _("Phone"), ccall);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_sms", _("SMS"), csms);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_mms", _("MMS"), cmms);	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("contact_video", _("Video conferencing"), cvideo);	purple_request_field_group_add_field(g, f);	purple_request_fields_add_group(fields, g);	g = purple_request_field_group_new(NULL);	f = purple_request_field_string_new("status_text", _("Your Current Status"),					  status[0] ? status : NULL, TRUE);	purple_request_field_group_add_field(g, f);	purple_request_fields_add_group(fields, g);	g = purple_request_field_group_new(NULL);#if 0	f = purple_request_field_label_new("l2", _("Online Services"));	purple_request_field_group_add_field(g, f);	f = purple_request_field_bool_new("services",					_("Let others see what services you are using"),					TRUE);

⌨️ 快捷键说明

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