📄 util.c
字号:
}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 + -