📄 silc.c
字号:
/* 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 + -