return FALSE;
}
- stat(tmpfilename, &statbuf);
+ g_stat(tmpfilename, &statbuf);
if (mimeinfo->tmp && (mimeinfo->data.filename != NULL))
claws_unlink(mimeinfo->data.filename);
g_free(mimeinfo->data.filename);
g_free(mimeinfo->data.mem);
}
- stat(tmpfilename, &statbuf);
+ g_stat(tmpfilename, &statbuf);
mimeinfo->content = MIMECONTENT_FILE;
mimeinfo->data.filename = tmpfilename;
mimeinfo->tmp = TRUE;
? forced_charset :
procmime_mimeinfo_get_parameter(mimeinfo, "charset");
+ if (!forced_charset && src_codeset && !strcasecmp(src_codeset, CS_ISO_8859_1))
+ src_codeset = CS_WINDOWS_1252;
+
if (mimeinfo->type == MIMETYPE_TEXT && !g_ascii_strcasecmp(mimeinfo->subtype, "html")) {
SC_HTMLParser *parser;
CodeConverter *conv;
gchar *procmime_get_mime_type(const gchar *filename)
{
- static GHashTable *mime_type_table = NULL;
- MimeType *mime_type;
const gchar *p;
gchar *ext = NULL;
gchar *base;
+#ifndef G_OS_WIN32
+ static GHashTable *mime_type_table = NULL;
+ MimeType *mime_type;
if (!mime_type_table) {
mime_type_table = procmime_get_mime_type_table();
if (!mime_type_table) return NULL;
}
+#endif
+
+ if (filename == NULL)
+ return NULL;
base = g_path_get_basename(filename);
if ((p = strrchr(base, '.')) != NULL)
ext = g_utf8_strdown(p + 1, -1);
g_free(base);
+#ifndef G_OS_WIN32
mime_type = g_hash_table_lookup(mime_type_table, ext);
- g_free(ext);
+
if (mime_type) {
gchar *str;
-
str = g_strconcat(mime_type->type, "/", mime_type->sub_type,
NULL);
+ debug_print("got type %s for %s\n", str, ext);
+ g_free(ext);
return str;
- }
-
+ }
return NULL;
+#else
+ gchar *str = get_content_type_from_registry_with_ext(ext);
+
+ g_free(ext);
+ return str;
+#endif
}
static guint procmime_str_hash(gconstpointer gptr)
MimeInfo *mimeinfo;
struct stat buf;
- stat(filename, &buf);
+ g_stat(filename, &buf);
mimeinfo = procmime_mimeinfo_new();
mimeinfo->content = MIMECONTENT_FILE;
ENC_AS_TOKEN,
ENC_AS_QUOTED_STRING,
ENC_AS_EXTENDED,
- ENC_TO_ASCII,
+ ENC_AS_ENCWORD
} EncodeAs;
typedef struct _ParametersData {
FILE *fp;
guint len;
- guint ascii_only;
gint error;
} ParametersData;
gchar *val = value, *valpos, *tmp;
ParametersData *pdata = (ParametersData *)user_data;
GString *buf = g_string_new("");
+ gint len;
EncodeAs encas = ENC_AS_TOKEN;
for (valpos = val; *valpos != 0; valpos++) {
- if (!IS_ASCII(*valpos) || *valpos == '"') {
- encas = ENC_AS_EXTENDED;
+ if (!IS_ASCII(*valpos)) {
+ encas = ENC_AS_ENCWORD;
break;
}
case ';':
case ':':
case '\\':
- case '\'':
+ case '"':
case '/':
case '[':
case ']':
}
}
- if (encas == ENC_AS_EXTENDED && pdata->ascii_only == TRUE)
- encas = ENC_TO_ASCII;
-
switch (encas) {
case ENC_AS_TOKEN:
g_string_append_printf(buf, "%s=%s", param, val);
break;
- case ENC_TO_ASCII:
- tmp = g_strdup(val);
- g_strcanon(tmp,
- " ()<>@,';:\\/[]?=.0123456789"
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz",
- '_');
- g_string_append_printf(buf, "%s=\"%s\"", param, tmp);
- g_free(tmp);
- break;
-
case ENC_AS_QUOTED_STRING:
g_string_append_printf(buf, "%s=\"%s\"", param, val);
break;
}
}
break;
+
+ case ENC_AS_ENCWORD:
+ len = MAX(strlen(val)*6, 512);
+ tmp = g_malloc(len+1);
+ codeconv_set_strict(TRUE);
+ conv_encode_header_full(tmp, len, val, pdata->len + strlen(param) + 4 , FALSE,
+ prefs_common.outgoing_charset);
+ codeconv_set_strict(FALSE);
+ if (!tmp || !*tmp) {
+ codeconv_set_strict(TRUE);
+ conv_encode_header_full(tmp, len, val, pdata->len + strlen(param) + 4 , FALSE,
+ conv_get_outgoing_charset_str());
+ codeconv_set_strict(FALSE);
+ }
+ if (!tmp || !*tmp) {
+ codeconv_set_strict(TRUE);
+ conv_encode_header_full(tmp, len, val, pdata->len + strlen(param) + 4 , FALSE,
+ CS_UTF_8);
+ codeconv_set_strict(FALSE);
+ }
+ if (!tmp || !*tmp) {
+ conv_encode_header_full(tmp, len, val, pdata->len + strlen(param) + 4 , FALSE,
+ CS_UTF_8);
+ }
+ g_string_append_printf(buf, "%s=\"%s\"", param, tmp);
+ g_free(tmp);
+ break;
+
}
if (buf->str && strlen(buf->str)) {
- if (pdata->len + strlen(buf->str) + 2 > 76) {
+ tmp = strstr(buf->str, "\n");
+ if (tmp)
+ len = (tmp - buf->str);
+ else
+ len = strlen(buf->str);
+ if (pdata->len + len > 76) {
if (fprintf(pdata->fp, ";\n %s", buf->str) < 0)
pdata->error = TRUE;
pdata->len = strlen(buf->str) + 1;
debug_print("procmime_write_mime_header\n");
pdata->fp = fp;
- pdata->ascii_only = FALSE;
pdata->error = FALSE;
for (type_table = mime_type_table; type_table->str != NULL; type_table++)
if (mimeinfo->type == type_table->type) {
return -1;
}
pdata->len = strlen(buf);
- pdata->ascii_only = TRUE;
g_free(buf);
break;
}
g_free(buf);
pdata->fp = fp;
- pdata->ascii_only = FALSE;
pdata->error = FALSE;
g_hash_table_foreach(mimeinfo->dispositionparameters, write_parameters, pdata);
if (pdata->error == TRUE) {