summaryrefslogtreecommitdiff
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/content.c39
-rw-r--r--content/content.h4
-rw-r--r--content/fetchcache.c7
-rw-r--r--content/fetchcache.h5
4 files changed, 34 insertions, 21 deletions
diff --git a/content/content.c b/content/content.c
index 9b15a3b83..056fabdaa 100644
--- a/content/content.c
+++ b/content/content.c
@@ -28,10 +28,6 @@ struct mime_entry {
};
static const struct mime_entry mime_map[] = {
#ifdef riscos
- {"application/java-vm", CONTENT_PLUGIN},
- {"application/x-shockwave-flash", CONTENT_PLUGIN},
- {"audio/midi", CONTENT_PLUGIN},
- {"audio/x-midi", CONTENT_PLUGIN},
{"image/gif", CONTENT_GIF},
{"image/jpeg", CONTENT_JPEG},
{"image/png", CONTENT_PNG},
@@ -52,27 +48,31 @@ struct handler_entry {
void (*destroy)(struct content *c);
void (*redraw)(struct content *c, long x, long y,
unsigned long width, unsigned long height);
+ void (*add_user)(struct content *c, struct object_params *params);
+ void (*remove_user)(struct content *c, struct object_params *params);
};
static const struct handler_entry handler_map[] = {
{html_create, html_process_data, html_convert, html_revive,
- html_reformat, html_destroy, 0},
+ html_reformat, html_destroy, 0, 0, 0},
{textplain_create, textplain_process_data, textplain_convert,
- textplain_revive, textplain_reformat, textplain_destroy, 0},
+ textplain_revive, textplain_reformat, textplain_destroy, 0, 0, 0},
#ifdef riscos
{jpeg_create, jpeg_process_data, jpeg_convert, jpeg_revive,
- jpeg_reformat, jpeg_destroy, jpeg_redraw},
+ jpeg_reformat, jpeg_destroy, jpeg_redraw, 0, 0},
#endif
- {css_create, css_process_data, css_convert, css_revive, css_reformat, css_destroy, 0},
+ {css_create, css_process_data, css_convert, css_revive,
+ css_reformat, css_destroy, 0, 0, 0},
#ifdef riscos
{nspng_create, nspng_process_data, nspng_convert, nspng_revive,
- nspng_reformat, nspng_destroy, nspng_redraw},
+ nspng_reformat, nspng_destroy, nspng_redraw, 0, 0},
{nsgif_create, nsgif_process_data, nsgif_convert, nsgif_revive,
- nsgif_reformat, nsgif_destroy, nsgif_redraw},
+ nsgif_reformat, nsgif_destroy, nsgif_redraw, 0, 0},
{plugin_create, plugin_process_data, plugin_convert, plugin_revive,
- plugin_reformat, plugin_destroy, plugin_redraw},
+ plugin_reformat, plugin_destroy, plugin_redraw,
+ plugin_add_user, plugin_remove_user},
#endif
{other_create, other_process_data, other_convert, other_revive,
- other_reformat, other_destroy, 0}
+ other_reformat, other_destroy, 0, 0, 0}
};
#define HANDLER_MAP_COUNT (sizeof(handler_map) / sizeof(handler_map[0]))
@@ -86,8 +86,11 @@ content_type content_lookup(const char *mime_type)
struct mime_entry *m;
m = bsearch(mime_type, mime_map, MIME_MAP_COUNT, sizeof(mime_map[0]),
(int (*)(const void *, const void *)) strcmp);
- if (m == 0)
+ if (m == 0) {
+ if (plugin_handleable(mime_type))
+ return CONTENT_PLUGIN;
return CONTENT_OTHER;
+ }
return m->type;
}
@@ -126,6 +129,7 @@ void content_set_type(struct content *c, content_type type, char* mime_type)
assert(c->status == CONTENT_STATUS_TYPE_UNKNOWN);
assert(type < CONTENT_UNKNOWN);
LOG(("content %s, type %i", c->url, type));
+ /* TODO: call add_user on each existing user */
c->type = type;
c->mime_type = mime_type;
c->status = CONTENT_STATUS_LOADING;
@@ -241,7 +245,7 @@ void content_redraw(struct content *c, long x, long y,
void content_add_user(struct content *c,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2)
+ void *p1, void *p2, struct object_params *params)
{
struct content_user *user;
LOG(("content %s, user %p %p %p", c->url, callback, p1, p2));
@@ -251,6 +255,8 @@ void content_add_user(struct content *c,
user->p2 = p2;
user->next = c->user_list->next;
c->user_list->next = user;
+ if (c->type != CONTENT_UNKNOWN && handler_map[c->type].add_user != 0)
+ handler_map[c->type].add_user(c, params);
}
@@ -261,11 +267,14 @@ void content_add_user(struct content *c,
void content_remove_user(struct content *c,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2)
+ void *p1, void *p2, struct object_params *params)
{
struct content_user *user, *next;
LOG(("content %s, user %p %p %p", c->url, callback, p1, p2));
+ if (c->type != CONTENT_UNKNOWN && handler_map[c->type].remove_user != 0)
+ handler_map[c->type].remove_user(c, params);
+
/* user_list starts with a sentinel */
for (user = c->user_list; user->next != 0 &&
!(user->next->callback == callback &&
diff --git a/content/content.h b/content/content.h
index dd9b50592..1c033f8bc 100644
--- a/content/content.h
+++ b/content/content.h
@@ -201,11 +201,11 @@ void content_redraw(struct content *c, long x, long y,
void content_add_user(struct content *c,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2);
+ void *p1, void *p2, struct object_params *params);
void content_remove_user(struct content *c,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2);
+ void *p1, void *p2, struct object_params *params);
void content_broadcast(struct content *c, content_msg msg, char *error);
#endif
diff --git a/content/fetchcache.c b/content/fetchcache.c
index 844111376..23316b1b6 100644
--- a/content/fetchcache.c
+++ b/content/fetchcache.c
@@ -21,7 +21,8 @@ static void fetchcache_callback(fetch_msg msg, void *p, char *data, unsigned lon
struct content * fetchcache(const char *url0, char *referer,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2, unsigned long width, unsigned long height)
+ void *p1, void *p2, unsigned long width, unsigned long height,
+ struct object_params *object_params)
{
struct content *c;
char *url = xstrdup(url0);
@@ -35,12 +36,12 @@ struct content * fetchcache(const char *url0, char *referer,
c = cache_get(url);
if (c != 0) {
- content_add_user(c, callback, p1, p2);
+ content_add_user(c, callback, p1, p2, object_params);
return c;
}
c = content_create(url);
- content_add_user(c, callback, p1, p2);
+ content_add_user(c, callback, p1, p2, object_params);
cache_put(c);
c->fetch_size = 0;
c->width = width;
diff --git a/content/fetchcache.h b/content/fetchcache.h
index ddfc2fa76..1353f682d 100644
--- a/content/fetchcache.h
+++ b/content/fetchcache.h
@@ -10,9 +10,12 @@
#include "netsurf/content/content.h"
+struct object_params;
+
struct content * fetchcache(const char *url, char *referer,
void (*callback)(content_msg msg, struct content *c, void *p1,
void *p2, const char *error),
- void *p1, void *p2, unsigned long width, unsigned long height);
+ void *p1, void *p2, unsigned long width, unsigned long height,
+ struct object_params *object_params);
#endif