1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00
elinks/src/mime/backend/common.c
2005-10-21 09:14:07 +02:00

126 lines
2.4 KiB
C

/* MIME handling backends multiplexing */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "elinks.h"
#include "main/module.h"
#include "mime/backend/common.h"
#include "mime/mime.h"
#include "util/file.h"
#include "util/memory.h"
#include "util/string.h"
/* Backends dynamic area: */
#include "mime/backend/default.h"
#include "mime/backend/mailcap.h"
#include "mime/backend/mimetypes.h"
static struct mime_backend *mime_backends[] = {
&default_mime_backend,
#ifdef CONFIG_MAILCAP
&mailcap_mime_backend,
#endif
#ifdef CONFIG_MIMETYPES
&mimetypes_mime_backend,
#endif
NULL,
};
unsigned char *
get_content_type_backends(unsigned char *extension)
{
struct mime_backend *backend;
int i;
foreach_module (backend, mime_backends, i) {
if (backend->get_content_type) {
unsigned char *content_type;
content_type = backend->get_content_type(extension);
if (content_type) return content_type;
}
}
return NULL;
}
struct mime_handler *
get_mime_handler_backends(unsigned char *ctype, int have_x)
{
struct mime_backend *backend;
int i;
foreach_module (backend, mime_backends, i) {
if (backend->get_mime_handler) {
struct mime_handler *handler;
handler = backend->get_mime_handler(ctype, have_x);
if (handler) return handler;
}
}
return NULL;
}
unsigned char *
get_next_path_filename(unsigned char **path_ptr, unsigned char separator)
{
unsigned char *path = *path_ptr;
unsigned char *filename = path;
int filenamelen;
/* Extract file from path */
while (*path && *path != separator)
path++;
filenamelen = path - filename;
/* If not at end of string skip separator */
if (*path)
path++;
*path_ptr = path;
if (filenamelen > 0) {
unsigned char *tmp = memacpy(filename, filenamelen);
if (!tmp) return NULL;
filename = expand_tilde(tmp);
mem_free(tmp);
} else {
filename = NULL;
}
return filename;
}
struct mime_handler *
init_mime_handler(unsigned char *program, unsigned char *description,
unsigned char *backend_name, int ask, int block)
{
int programlen = strlen(program);
struct mime_handler *handler;
handler = mem_calloc(1, sizeof(*handler) + programlen);
if (!handler) return NULL;
memcpy(handler->program, program, programlen);
handler->description = empty_string_or_(description);
handler->backend_name = backend_name;
handler->block = block;
handler->ask = ask;
return handler;
}