/**
* @file nateon-utils.c Utility functions
*
* purple
*
* Purple is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "nateon.h"
#include "nateon-utils.h"
//void
//nateon_parse_format(const char *mime, char **pre_ret, char **post_ret)
char *
nateon_parse_format(const char *payload)
{
// char *cur;
char **split;
GString *pre = g_string_new(NULL);
GString *post = g_string_new(NULL);
unsigned int colors[3];
char *fontface;
char *fontcolor;
char *fonteffect;
char *body;
char *tmp;
// if (pre_ret != NULL) *pre_ret = NULL;
// if (post_ret != NULL) *post_ret = NULL;
purple_debug_info("nateon", "[%s], %s\n", __FUNCTION__, payload);
split = g_strsplit(payload, "%09", 0);
if (strstr(payload, "%09") == NULL)
{
fontface = g_strdup("굴림");
fontcolor = g_strdup("0");
fonteffect = g_strdup("");
body = split[0];
}
else
{
fontface = split[0];
fontcolor = g_strdup_printf("%06X", atoi(split[1]));
fonteffect = split[2];
body = split[3];
}
body = purple_strreplace(body, "%20", " ");
tmp = body;
body = purple_strreplace(tmp, "%0A", "
");
g_free(tmp);
tmp = body;
body = purple_strreplace(tmp, "%25", "%");
g_free(tmp);
purple_debug_info("nateon", "[%s], %s\n", __FUNCTION__, fontface);
purple_debug_info("nateon", "[%s], %d\n", __FUNCTION__, fontcolor);
purple_debug_info("nateon", "[%s], %s\n", __FUNCTION__, fonteffect);
purple_debug_info("nateon", "[%s], %s\n", __FUNCTION__, body);
// cur = strstr(mime, "FN=");
//
// if (cur && (*(cur = cur + 3) != ';'))
if (strcmp(fontface, ""))
{
pre = g_string_append(pre, "");
post = g_string_prepend(post, "");
}
// cur = strstr(mime, "EF=");
// if (cur && (*(cur = cur + 3) != ';'))
if (strcmp(fonteffect, ""))
{
char *effect = fonteffect;
while (*effect)
{
pre = g_string_append_c(pre, '<');
pre = g_string_append_c(pre, *effect);
pre = g_string_append_c(pre, '>');
post = g_string_prepend_c(post, '>');
post = g_string_prepend_c(post, *effect);
post = g_string_prepend_c(post, '/');
post = g_string_prepend_c(post, '<');
effect++;
}
}
// cur = strstr(mime, "CO=");
//
// if (cur && (*(cur = cur + 3) != ';'))
if (strcmp(fontcolor, ""))
{
int i;
i = sscanf(fontcolor, "%02x%02x%02x;", &colors[0], &colors[1], &colors[2]);
if (i > 0)
{
char tag[64];
if (i == 1)
{
colors[1] = 0;
colors[2] = 0;
}
else if (i == 2)
{
unsigned int temp = colors[0];
colors[0] = colors[1];
colors[1] = temp;
colors[2] = 0;
}
else if (i == 3)
{
unsigned int temp = colors[2];
colors[2] = colors[0];
colors[0] = temp;
}
g_snprintf(tag, sizeof(tag),
"",
colors[0], colors[1], colors[2]);
pre = g_string_append(pre, tag);
post = g_string_prepend(post, "");
}
}
//
// cur = strstr(mime, "RL=");
//
// if (cur && (*(cur = cur + 3) != ';'))
// {
// if (*cur == '1')
// {
// /* RTL text was received */
// pre = g_string_append(pre, "");
// post = g_string_prepend(post, "");
// }
// }
//
// cur = g_strdup(purple_url_decode(pre->str));
// g_string_free(pre, TRUE);
//
// if (pre_ret != NULL)
// *pre_ret = cur;
// else
// g_free(cur);
//
// cur = g_strdup(purple_url_decode(post->str));
// g_string_free(post, TRUE);
//
// if (post_ret != NULL)
// *post_ret = cur;
// else
// g_free(cur);
purple_debug_info("nateon", "[%s] %s\n", __FUNCTION__, pre->str);
purple_debug_info("nateon", "[%s] %s\n", __FUNCTION__, post->str);
return g_strdup_printf("%s%s%s", g_string_free(pre, FALSE), body, g_string_free(post, FALSE));
}
/*
* We need this because we're only supposed to encode spaces in the font
* names. purple_url_encode() isn't acceptable.
*/
const char *
encode_spaces(const char *str)
{
static char buf[BUF_LEN];
const char *c;
char *d;
g_return_val_if_fail(str != NULL, NULL);
for (c = str, d = buf; *c != '\0'; c++)
{
if (*c == ' ')
{
*d++ = '%';
*d++ = '2';
*d++ = '0';
}
else
*d++ = *c;
}
return buf;
}
/*
* Taken from the zephyr plugin.
* This parses HTML formatting (put out by one of the gtkimhtml widgets
* and converts it to nateon formatting. It doesn't deal with the tag closing,
* but gtkimhtml widgets give valid html.
* It currently deals properly with , , , ,
* , , .
* It ignores and
*/
//void
//nateon_import_html(const char *html, char **attributes, char **message)
char *
nateon_import_html(const char *html)
{
const char *c;
GString *msg = g_string_new(NULL);
char *fontface = NULL;
char fonteffect[4];
// char fontcolor[7];
int fontcolor = 0;
// char direction = '0';
char *attributes;
gboolean has_bold = FALSE;
gboolean has_italic = FALSE;
gboolean has_underline = FALSE;
gboolean has_strikethrough = FALSE;
// g_return_if_fail(html != NULL);
// memset(fontcolor, 0, sizeof(fontcolor));
// strcat(fontcolor, "0");
memset(fonteffect, 0, sizeof(fonteffect));
for (c = html; *c != '\0';)
{
if (*c == '%')
{
g_string_append(msg, "%25");
c ++;
}
else if (*c == ' ' || *c == '\t')
{
g_string_append(msg, "%20");
c ++;
}
else if (*c == '<')
{
if (!g_ascii_strncasecmp(c + 1, "br>", 3))
{
g_string_append(msg, "%0A");
c += 4;
}
else if (!g_ascii_strncasecmp(c + 1, "b>", 2))
{
if (!has_bold)
{
strcat(fonteffect, "B");
has_bold = TRUE;
}
c += 3;
}
else if (!g_ascii_strncasecmp(c + 1, "i>", 2))
{
if (!has_italic)
{
strcat(fonteffect, "I");
has_italic = TRUE;
}
c += 3;
}
else if (!g_ascii_strncasecmp(c + 1, "s>", 2))
{
if (!has_strikethrough)
{
strcat(fonteffect, "S");
has_strikethrough = TRUE;
}
c += 3;
}
else if (!g_ascii_strncasecmp(c + 1, "u>", 2))
{
if (!has_underline)
{
strcat(fonteffect, "U");
has_underline = TRUE;
}
c += 3;
}
// else if (!g_ascii_strncasecmp(c + 1, "a href=\"", 8))
// {
// c += 9;
//
// if (!g_ascii_strncasecmp(c, "mailto:", 7))
// c += 7;
//
// while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2))
// msg[retcount++] = *c++;
//
// if (*c != '\0')
// c += 2;
//
// /* ignore descriptive string */
// while ((*c != '\0') && g_ascii_strncasecmp(c, "", 4))
// c++;
//
// if (*c != '\0')
// c += 4;
// }
// else if (!g_ascii_strncasecmp(c + 1, "span", 4))
// {
// /* Bi-directional text support using CSS properties in span tags */
// c += 5;
//
// while (*c != '\0' && *c != '>')
// {
// while (*c == ' ')
// c++;
// if (!g_ascii_strncasecmp(c, "dir=\"rtl\"", 9))
// {
// c += 9;
// direction = '1';
// }
// else if (!g_ascii_strncasecmp(c, "style=\"", 7))
// {
// /* Parse inline CSS attributes */
// char *attributes;
// int attr_len = 0;
// c += 7;
// while (*(c + attr_len) != '\0' && *(c + attr_len) != '"')
// attr_len++;
// if (*(c + attr_len) == '"')
// {
// char *attr_dir;
// attributes = g_strndup(c, attr_len);
// attr_dir = purple_markup_get_css_property(attributes, "direction");
// if (attr_dir && (!g_ascii_strncasecmp(attr_dir, "RTL", 3)))
// direction = '1';
// g_free(attr_dir);
// g_free(attributes);
// }
//
// }
// else
// {
// c++;
// }
// }
// if (*c == '>')
// c++;
// }
else if (!g_ascii_strncasecmp(c + 1, "font", 4))
{
c += 5;
while ((*c != '\0') && !g_ascii_strncasecmp(c, " ", 1))
c++;
if (!g_ascii_strncasecmp(c, "color=\"#", 7))
{
char color[7] = {0};
c += 8;
color[0] = *(c + 4);
color[1] = *(c + 5);
color[2] = *(c + 2);
color[3] = *(c + 3);
color[4] = *c;
color[5] = *(c + 1);
sscanf(color, "%06X", &fontcolor);
c += 8;
}
else if (!g_ascii_strncasecmp(c, "face=\"", 6))
{
const char *end = NULL;
const char *comma = NULL;
unsigned int namelen = 0;
c += 6;
end = strchr(c, '\"');
comma = strchr(c, ',');
if (comma == NULL || comma > end)
namelen = (unsigned int)(end - c);
else
namelen = (unsigned int)(comma - c);
fontface = g_strndup(c, namelen);
c = end + 2;
}
else
{
/* Drop all unrecognized/misparsed font tags */
while ((*c != '\0') && g_ascii_strncasecmp(c, "\">", 2))
c++;
if (*c != '\0')
c += 2;
}
}
else
{
while ((*c != '\0') && (*c != '>'))
c++;
if (*c != '\0')
c++;
}
}
else if (*c == '&')
{
if (!g_ascii_strncasecmp(c, "<", 4))
{
g_string_append_c(msg, '<');
c += 4;
}
else if (!g_ascii_strncasecmp(c, ">", 4))
{
g_string_append_c(msg, '>');
c += 4;
}
else if (!g_ascii_strncasecmp(c, " ", 6))
{
g_string_append(msg, "%20");
c += 6;
}
else if (!g_ascii_strncasecmp(c, """, 6))
{
g_string_append_c(msg, '"');
c += 6;
}
else if (!g_ascii_strncasecmp(c, "&", 5))
{
g_string_append_c(msg, '&');
c += 5;
}
else if (!g_ascii_strncasecmp(c, "'", 6))
{
g_string_append_c(msg, '\'');
c += 6;
}
else
g_string_append_c(msg, *c++);
}
else
g_string_append_c(msg, *c++);
}
if (fontface == NULL)
fontface = g_strdup("굴림");
purple_debug_info("nateon", "FN=%s; EF=%s; CO=%d\n",
fontface, fonteffect, fontcolor);
attributes = g_strdup_printf("%s%%09%d%%09%s%%09",
encode_spaces(fontface), fontcolor, fonteffect);
g_string_prepend(msg, attributes);
g_free(fontface);
g_free(attributes);
return g_string_free(msg, FALSE);
}
//void
//nateon_parse_socket(const char *str, char **ret_host, int *ret_port)
//{
// char *host;
// char *c;
// int port;
//
// host = g_strdup(str);
//
// if ((c = strchr(host, ':')) != NULL)
// {
// *c = '\0';
// port = atoi(c + 1);
// }
// else
// port = 1863;
//
// *ret_host = host;
// *ret_port = port;
//}