[project @ 2003-09-16 19:53:59 by jmb]
Streaming plugin support, beginnings of URL_Access support, fix codebase for ActiveX Flash objects svn path=/import/netsurf/; revision=293
This commit is contained in:
parent
ae62c55cec
commit
9a23a2bc77
|
@ -1860,6 +1860,8 @@ bool plugin_decode(struct content* content, char* url, struct box* box,
|
||||||
if(pp != 0)
|
if(pp != 0)
|
||||||
url = url_join(pp->value, po->basehref);
|
url = url_join(pp->value, po->basehref);
|
||||||
else return false;
|
else return false;
|
||||||
|
/* munge the codebase */
|
||||||
|
po->codebase = url_join("./", content->url);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG(("ActiveX object - n0"));
|
LOG(("ActiveX object - n0"));
|
||||||
|
|
208
riscos/plugin.c
208
riscos/plugin.c
|
@ -8,13 +8,10 @@
|
||||||
/*
|
/*
|
||||||
* TODO:
|
* TODO:
|
||||||
* - Reshaping plugin by request [Plugin_Reshape_Request (&4d545)]
|
* - Reshaping plugin by request [Plugin_Reshape_Request (&4d545)]
|
||||||
* - Finish off stream protocol implementation
|
* - Finish off stream protocol implementation (data from plugin)
|
||||||
* [Plugin_Stream_Write (&4d54a), Plugin_Stream_Written (&4d54b)]
|
|
||||||
* - Parse and act upon the rest of the Plugin_Opening flags
|
* - Parse and act upon the rest of the Plugin_Opening flags
|
||||||
* - Handle death of Plugin Task
|
|
||||||
* - Implement remaining messages [Plugin_URL_Access, Plugin_Focus,
|
* - Implement remaining messages [Plugin_URL_Access, Plugin_Focus,
|
||||||
* Plugin_Notify, Plugin_Busy, Plugin_Action, Plugin_Abort,
|
* Plugin_Busy, Plugin_Action, Plugin_Abort, Plugin_Inform(ed)?]
|
||||||
* Plugin_Inform(ed)?]
|
|
||||||
* - Handle standalone objects
|
* - Handle standalone objects
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -53,6 +50,7 @@ struct plugin_param_item *plugin_add_item_to_pilist(struct plugin_param_item *pi
|
||||||
/* stream handling */
|
/* stream handling */
|
||||||
void plugin_create_stream(struct browser_window *bw,
|
void plugin_create_stream(struct browser_window *bw,
|
||||||
struct object_params *params, struct content *c);
|
struct object_params *params, struct content *c);
|
||||||
|
void plugin_write_stream(struct browser_window *bw, struct object_params *params, struct content *c);
|
||||||
void plugin_write_stream_as_file(struct browser_window *bw,
|
void plugin_write_stream_as_file(struct browser_window *bw,
|
||||||
struct object_params *params,
|
struct object_params *params,
|
||||||
struct content *c);
|
struct content *c);
|
||||||
|
@ -81,6 +79,8 @@ void plugin_close(wimp_message *message);
|
||||||
void plugin_closed(wimp_message *message);
|
void plugin_closed(wimp_message *message);
|
||||||
void plugin_reshape_request(wimp_message *message);
|
void plugin_reshape_request(wimp_message *message);
|
||||||
void plugin_stream_new(wimp_message *message);
|
void plugin_stream_new(wimp_message *message);
|
||||||
|
void plugin_stream_written(wimp_message *message);
|
||||||
|
void plugin_url_access(wimp_message *message);
|
||||||
void plugin_status(wimp_message *message);
|
void plugin_status(wimp_message *message);
|
||||||
char *plugin_get_string_value(os_string_value string, char *msg);
|
char *plugin_get_string_value(os_string_value string, char *msg);
|
||||||
|
|
||||||
|
@ -140,15 +140,17 @@ void plugin_add_instance(struct content *c, struct browser_window *bw,
|
||||||
struct plugin_message *npm = xcalloc(1, sizeof(*npm));
|
struct plugin_message *npm = xcalloc(1, sizeof(*npm));
|
||||||
struct plugin_message *temp;
|
struct plugin_message *temp;
|
||||||
struct plugin_list *npl = xcalloc(1, sizeof(*npl));
|
struct plugin_list *npl = xcalloc(1, sizeof(*npl));
|
||||||
int offset;
|
|
||||||
unsigned char *pchar = (unsigned char*)&m.data;
|
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
if (params == 0) {
|
if (params == 0) {
|
||||||
fprintf(stderr,
|
/* create object_params struct */
|
||||||
"Cannot handle standalone objects at this time");
|
/* struct object_params *nparams = xcalloc(1, sizeof(*nparams));
|
||||||
|
params = nparams;
|
||||||
|
params->basehref = xstrdup(c->url);
|
||||||
|
*/ fprintf(stderr,
|
||||||
|
"Cannot handle standalone objects\n");
|
||||||
gui_window_set_status(bw->window,
|
gui_window_set_status(bw->window,
|
||||||
"Plugin Error: Cannot handle standalone objects at this time");
|
"Plugin Error: Cannot handle standalone objects");
|
||||||
xfree(npm);
|
xfree(npm);
|
||||||
xfree(npl);
|
xfree(npl);
|
||||||
return;
|
return;
|
||||||
|
@ -335,13 +337,15 @@ void plugin_remove_instance(struct content *c, struct browser_window *bw,
|
||||||
wimp_message m;
|
wimp_message m;
|
||||||
plugin_message_close *pmc;
|
plugin_message_close *pmc;
|
||||||
struct plugin_message *temp;
|
struct plugin_message *temp;
|
||||||
char *p, *filename = strdup(params->filename);
|
char *p, *filename;
|
||||||
|
|
||||||
if (params == 0) {
|
if (params == 0) {
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filename = strdup(params->filename);
|
||||||
|
|
||||||
pmc = (plugin_message_close*)&m.data;
|
pmc = (plugin_message_close*)&m.data;
|
||||||
pmc->flags = 0;
|
pmc->flags = 0;
|
||||||
pmc->plugin = (plugin_p)params->plugin;
|
pmc->plugin = (plugin_p)params->plugin;
|
||||||
|
@ -400,6 +404,10 @@ void plugin_reshape_instance(struct content *c, struct browser_window *bw,
|
||||||
os_box bbox;
|
os_box bbox;
|
||||||
unsigned long x, y;
|
unsigned long x, y;
|
||||||
|
|
||||||
|
if (params == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
box_coords(box, (unsigned long*)&x, (unsigned long*)&y);
|
box_coords(box, (unsigned long*)&x, (unsigned long*)&y);
|
||||||
bbox.x0 = ((int)x << 1);
|
bbox.x0 = ((int)x << 1);
|
||||||
bbox.y1 = -(((int)y << 1));
|
bbox.y1 = -(((int)y << 1));
|
||||||
|
@ -752,11 +760,9 @@ void plugin_create_stream(struct browser_window *bw, struct object_params *param
|
||||||
wimp_message m;
|
wimp_message m;
|
||||||
plugin_message_stream_new *pmsn;
|
plugin_message_stream_new *pmsn;
|
||||||
struct plugin_message *temp;
|
struct plugin_message *temp;
|
||||||
int offset = 0;
|
|
||||||
unsigned char *pchar = (unsigned char*)&m.data;
|
|
||||||
|
|
||||||
pmsn = (plugin_message_stream_new*)&m.data;
|
pmsn = (plugin_message_stream_new*)&m.data;
|
||||||
pmsn->flags = 2;
|
pmsn->flags = 0;
|
||||||
pmsn->plugin = (plugin_p)params->plugin;
|
pmsn->plugin = (plugin_p)params->plugin;
|
||||||
pmsn->browser = (plugin_b)params->browser;
|
pmsn->browser = (plugin_b)params->browser;
|
||||||
pmsn->stream = (plugin_s)0;
|
pmsn->stream = (plugin_s)0;
|
||||||
|
@ -788,7 +794,10 @@ void plugin_create_stream(struct browser_window *bw, struct object_params *param
|
||||||
params->browser_stream = params->browser;
|
params->browser_stream = params->browser;
|
||||||
params->plugin_stream = (int)pmsn->stream;
|
params->plugin_stream = (int)pmsn->stream;
|
||||||
|
|
||||||
if((pmsn->flags & 0x02) | (pmsn->flags & 0x03)) {
|
if((pmsn->flags == 0) || (pmsn->flags == 1) || (pmsn->flags == 2)) {
|
||||||
|
plugin_write_stream(bw, params, c);
|
||||||
|
}
|
||||||
|
else if((pmsn->flags == 3)) {
|
||||||
plugin_write_stream_as_file(bw, params, c);
|
plugin_write_stream_as_file(bw, params, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -797,6 +806,67 @@ void plugin_create_stream(struct browser_window *bw, struct object_params *param
|
||||||
plugin_remove_message_from_linked_list(temp);
|
plugin_remove_message_from_linked_list(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes to an open stream
|
||||||
|
*/
|
||||||
|
void plugin_write_stream(struct browser_window *bw, struct object_params *params, struct content *c) {
|
||||||
|
|
||||||
|
wimp_message m;
|
||||||
|
plugin_message_stream_write *pmsw;
|
||||||
|
plugin_message_stream_written *pmswt;
|
||||||
|
struct plugin_message *temp;
|
||||||
|
int consumed = 0;
|
||||||
|
|
||||||
|
pmsw = (plugin_message_stream_write*)&m.data;
|
||||||
|
|
||||||
|
pmsw->flags = 0;
|
||||||
|
pmsw->plugin = (plugin_p)params->plugin;
|
||||||
|
pmsw->browser = (plugin_b)params->browser;
|
||||||
|
pmsw->stream = (plugin_s)params->plugin_stream;
|
||||||
|
pmsw->browser_stream = (plugin_bs)params->browser_stream;
|
||||||
|
pmsw->url.pointer = c->url;
|
||||||
|
pmsw->end = c->data.plugin.length;
|
||||||
|
pmsw->last_modified_date = 0;
|
||||||
|
pmsw->notify_data = 0;
|
||||||
|
pmsw->offset = 0;
|
||||||
|
pmsw->length = c->data.plugin.length;
|
||||||
|
pmsw->data = (byte*)c->data.plugin.data;
|
||||||
|
|
||||||
|
m.size = 68;
|
||||||
|
m.your_ref = 0;
|
||||||
|
m.action = message_PLUG_IN_STREAM_WRITE;
|
||||||
|
|
||||||
|
while (consumed < c->data.plugin.length) {
|
||||||
|
|
||||||
|
pmsw->length = c->data.plugin.length;
|
||||||
|
|
||||||
|
temp = plugin_add_message_to_linked_list(pmsw->browser, pmsw->plugin, &m, 0);
|
||||||
|
|
||||||
|
LOG(("Sending message &4D54A"));
|
||||||
|
xwimp_send_message(wimp_USER_MESSAGE_RECORDED, &m, (wimp_t)params->plugin_task);
|
||||||
|
|
||||||
|
/* wait for wimp poll
|
||||||
|
TODO - we should probably give up after a short time
|
||||||
|
otherwise we'll be stuck in this loop forever
|
||||||
|
*/
|
||||||
|
while(temp->poll == 0)
|
||||||
|
gui_poll();
|
||||||
|
|
||||||
|
pmswt = (plugin_message_stream_written*)&temp->reply->m->data;
|
||||||
|
if(pmswt->length > 0) {
|
||||||
|
consumed += pmswt->length;
|
||||||
|
pmsw->offset += pmswt->length + 1;
|
||||||
|
plugin_remove_message_from_linked_list(temp->reply);
|
||||||
|
plugin_remove_message_from_linked_list(temp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
plugin_remove_message_from_linked_list(temp->reply);
|
||||||
|
plugin_remove_message_from_linked_list(temp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a stream as a file
|
* Writes a stream as a file
|
||||||
*/
|
*/
|
||||||
|
@ -804,9 +874,7 @@ void plugin_write_stream_as_file(struct browser_window *bw, struct object_params
|
||||||
|
|
||||||
wimp_message m;
|
wimp_message m;
|
||||||
plugin_message_stream_as_file *pmsaf;
|
plugin_message_stream_as_file *pmsaf;
|
||||||
int offset = 0;
|
|
||||||
unsigned int filetype;
|
unsigned int filetype;
|
||||||
unsigned char *pchar = (unsigned char*)&m.data;
|
|
||||||
char *filename = strdup(params->filename), *p;
|
char *filename = strdup(params->filename), *p;
|
||||||
|
|
||||||
pmsaf = (plugin_message_stream_as_file*)&m.data;
|
pmsaf = (plugin_message_stream_as_file*)&m.data;
|
||||||
|
@ -843,8 +911,6 @@ void plugin_destroy_stream(struct browser_window *bw, struct object_params *para
|
||||||
|
|
||||||
wimp_message m;
|
wimp_message m;
|
||||||
plugin_message_stream_destroy *pmsd;
|
plugin_message_stream_destroy *pmsd;
|
||||||
int offset = 0;
|
|
||||||
unsigned char *pchar = (unsigned char*)&m.data;
|
|
||||||
|
|
||||||
pmsd = (plugin_message_stream_destroy*)&m.data;
|
pmsd = (plugin_message_stream_destroy*)&m.data;
|
||||||
|
|
||||||
|
@ -1007,7 +1073,7 @@ void plugin_msg_parse(wimp_message *message, int ack)
|
||||||
// plugin_focus();
|
// plugin_focus();
|
||||||
break;
|
break;
|
||||||
case message_PLUG_IN_URL_ACCESS:
|
case message_PLUG_IN_URL_ACCESS:
|
||||||
// plugin_url_access();
|
plugin_url_access(message);
|
||||||
break;
|
break;
|
||||||
case message_PLUG_IN_STATUS:
|
case message_PLUG_IN_STATUS:
|
||||||
plugin_status(message);
|
plugin_status(message);
|
||||||
|
@ -1028,7 +1094,7 @@ void plugin_msg_parse(wimp_message *message, int ack)
|
||||||
// plugin_stream_write();
|
// plugin_stream_write();
|
||||||
break;
|
break;
|
||||||
case message_PLUG_IN_STREAM_WRITTEN:
|
case message_PLUG_IN_STREAM_WRITTEN:
|
||||||
// plugin_stream_written();
|
plugin_stream_written(message);
|
||||||
break;
|
break;
|
||||||
case message_PLUG_IN_STREAM_DESTROY:
|
case message_PLUG_IN_STREAM_DESTROY:
|
||||||
// plugin_stream_destroy();
|
// plugin_stream_destroy();
|
||||||
|
@ -1123,8 +1189,6 @@ void plugin_closed(wimp_message *message) {
|
||||||
}
|
}
|
||||||
/* This is not the result of a plugin_open message */
|
/* This is not the result of a plugin_open message */
|
||||||
else {
|
else {
|
||||||
LOG(("Plugin Closed without asking"));
|
|
||||||
LOG(("pmc->flags: %d", pmc->flags));
|
|
||||||
if(pmc->flags & 0x2) {
|
if(pmc->flags & 0x2) {
|
||||||
LOG(("Err Mess: %s", pmc->error_text));
|
LOG(("Err Mess: %s", pmc->error_text));
|
||||||
gui_window_set_status(npl->bw->window,
|
gui_window_set_status(npl->bw->window,
|
||||||
|
@ -1180,6 +1244,104 @@ void plugin_stream_new(wimp_message *message) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles receipt of plugin_stream_written messages
|
||||||
|
*/
|
||||||
|
void plugin_stream_written(wimp_message *message) {
|
||||||
|
|
||||||
|
struct plugin_message *npm = plugin_get_message_from_linked_list(message->your_ref);
|
||||||
|
struct plugin_message *reply;
|
||||||
|
plugin_message_stream_written *pmswt = (plugin_message_stream_written*)&message->data;
|
||||||
|
|
||||||
|
/* add this message to linked list */
|
||||||
|
reply = plugin_add_message_to_linked_list(pmswt->browser, pmswt->plugin, message, 0);
|
||||||
|
|
||||||
|
/* notify plugin_open message entry in list */
|
||||||
|
if(npm != NULL) {
|
||||||
|
|
||||||
|
npm->poll = 1;
|
||||||
|
npm->plugin = pmswt->plugin;
|
||||||
|
npm->reply = reply;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles plugin_url_access messages
|
||||||
|
*/
|
||||||
|
void plugin_url_access(wimp_message *message) {
|
||||||
|
|
||||||
|
wimp_message m;
|
||||||
|
struct plugin_list *npl;
|
||||||
|
plugin_message_url_access *pmua = (plugin_message_url_access*)&message->data;
|
||||||
|
plugin_message_notify *pmn = (plugin_message_notify*)&m.data;
|
||||||
|
int notify = 0, post = 0, file = 0;
|
||||||
|
char *url = plugin_get_string_value(pmua->url, (char*)pmua);
|
||||||
|
char *window;
|
||||||
|
|
||||||
|
npl = plugin_get_instance_from_list(pmua->browser, pmua->plugin);
|
||||||
|
|
||||||
|
if (pmua->flags & 0x01) notify = 1;
|
||||||
|
if (pmua->flags & 0x02) post = 1;
|
||||||
|
if (pmua->flags & 0x04) file = 1;
|
||||||
|
|
||||||
|
/* fetch url to window */
|
||||||
|
if (pmua->target_window.offset != 0 &&
|
||||||
|
pmua->target_window.pointer != 0) {
|
||||||
|
window = plugin_get_string_value(pmua->target_window,
|
||||||
|
(char*)pmua);
|
||||||
|
LOG(("flags: %d, url: %s, window: %s", pmua->flags, url, window));
|
||||||
|
/* TODO: proper _parent and _self support (needs frames)
|
||||||
|
* other window names
|
||||||
|
*/
|
||||||
|
if (!post) { /* GET request */
|
||||||
|
if (strcasecmp(window, "_self") == 0 ||
|
||||||
|
strcasecmp(window, "_parent") == 0 ||
|
||||||
|
strcasecmp(window, "_top") == 0 ||
|
||||||
|
strcasecmp(window, "") == 0) {
|
||||||
|
browser_window_open_location(npl->bw, url);
|
||||||
|
}
|
||||||
|
else if (strcasecmp(window, "_blank") == 0) {
|
||||||
|
struct browser_window *bwnew;
|
||||||
|
bwnew = create_browser_window(browser_TITLE
|
||||||
|
| browser_TOOLBAR | browser_SCROLL_X_ALWAYS
|
||||||
|
| browser_SCROLL_Y_ALWAYS, 640, 480);
|
||||||
|
gui_window_show(bwnew->window);
|
||||||
|
bwnew->url = xstrdup(url);
|
||||||
|
browser_window_open_location(bwnew, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else { /* POST request */
|
||||||
|
/* fetch URL */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* fetch data and stream to plugin */
|
||||||
|
else {
|
||||||
|
if (!post) { /* GET request */
|
||||||
|
/* fetch URL */
|
||||||
|
}
|
||||||
|
else { /* POST request */
|
||||||
|
/* fetch URL */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* stream data to plugin */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notify) {
|
||||||
|
/* send message_plugin_notify to plugin task */
|
||||||
|
pmn->flags = 0;
|
||||||
|
pmn->plugin = pmua->plugin;
|
||||||
|
pmn->browser = pmua->browser;
|
||||||
|
pmn->url.pointer = url;
|
||||||
|
pmn->reason = (plugin_notify_reason)0;
|
||||||
|
pmn->notify_data = pmua->notify_data;
|
||||||
|
|
||||||
|
m.size = 44;
|
||||||
|
m.your_ref = message->my_ref;
|
||||||
|
m.action = message_PLUG_IN_NOTIFY;
|
||||||
|
xwimp_send_message(wimp_USER_MESSAGE, &m, message->sender);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles receipt of plugin_status messages
|
* Handles receipt of plugin_status messages
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue