📄 silc.c
字号:
/* Send QUIT */ silc_client_command_call(sg->client, sg->conn, NULL, "QUIT", "Download this: " 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]; 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); purple_request_field_group_add_field(g, f);#endif#ifdef HAVE_SYS_UTSNAME_H f = purple_request_field_bool_new("device", _("Let others see what computer you are using"), device); purple_request_field_group_add_field(g, f);#endif purple_request_fields_add_group(fields, g); g = purple_request_field_group_new(NULL); f = purple_request_field_string_new("vcard", _("Your VCard File"), purple_account_get_string(sg->account, "vcard", ""), FALSE); purple_request_field_group_add_field(g, f);#ifdef _WIN32 f = purple_request_field_string_new("timezone", _("Timezone"), _tzname[0], FALSE);#else f = purple_request_field_string_new("timezone", _("Timezone"), tzname[0], FALSE);#endif purple_request_field_group_add_field(g, f); purple_request_fields_add_group(fields, g); purple_request_fields(gc, _("User Online Status Attributes"), _("User Online Status Attributes"), _("You can let other users see your online status information " "and your personal information. Please fill the information " "you would like other users to see about yourself."), fields, _("OK"), G_CALLBACK(silcpurple_attrs_cb), _("Cancel"), G_CALLBACK(silcpurple_attrs_cancel), gc->account, NULL, NULL, gc);}static voidsilcpurple_detach(PurplePluginAction *action){ PurpleConnection *gc = (PurpleConnection *) action->context; SilcPurple sg; if (!gc) return; sg = gc->proto_data; if (!sg) return; /* Call DETACH */ silc_client_command_call(sg->client, sg->conn, "DETACH"); sg->detaching = TRUE;}static voidsilcpurple_view_motd(PurplePluginAction *action){ PurpleConnection *gc = (PurpleConnection *) action->context; SilcPurple sg; char *tmp; if (!gc) return; sg = gc->proto_data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -