void ro_uri_message_received(wimp_message *msg) { uri_full_message_process *uri_message = (uri_full_message_process *)msg; uri_h uri_handle; char* uri_requested; int uri_length; nsurl *url; nserror error; uri_handle = uri_message->handle; if (nsurl_create(uri_message->uri, &url) != NSERROR_OK) { return; } if (!fetch_can_fetch(url)) { nsurl_unref(url); return; } nsurl_unref(url); uri_message->your_ref = uri_message->my_ref; uri_message->action = message_URI_PROCESS_ACK; xwimp_send_message(wimp_USER_MESSAGE, (wimp_message*)uri_message, uri_message->sender); xuri_request_uri(0, 0, 0, uri_handle, &uri_length); uri_requested = calloc((unsigned int)uri_length, sizeof(char)); if (uri_requested == NULL) return; xuri_request_uri(0, uri_requested, uri_length, uri_handle, NULL); error = nsurl_create(uri_requested, &url); free(uri_requested); if (error == NSERROR_OK) { error = browser_window_create(BROWSER_WINDOW_VERIFIABLE | BROWSER_WINDOW_HISTORY, url, NULL, NULL, NULL); nsurl_unref(url); } if (error != NSERROR_OK) { warn_user(messages_get_errorcode(error), 0); } }
void ro_url_message_received(wimp_message *message) { char *url; int i; inetsuite_message_open_url *url_message = (inetsuite_message_open_url*) &message->data; os_error *error; nsurl *nsurl; nserror errorns; /* If the url_message->indirect.tag is non-zero, * then the message data is contained within the message block. */ if (url_message->indirect.tag != 0) { url = strndup(url_message->url, 236); if (!url) { warn_user("NoMemory", 0); return; } /* terminate at first control character */ for (i = 0; !iscntrl(url[i]); i++) ; url[i] = 0; } else { if (!url_message->indirect.url.offset) { LOG(("no URL in message")); return; } if (28 < message->size && url_message->indirect.body_file.offset) { LOG(("POST for URL message not implemented")); return; } if (url_message->indirect.url.offset < 28 || 236 <= url_message->indirect.url.offset) { LOG(("external pointers in URL message unimplemented")); /* these messages have never been seen in the wild, * and there is the problem of invalid addresses which * would cause an abort */ return; } url = strndup((char *) url_message + url_message->indirect.url.offset, 236 - url_message->indirect.url.offset); if (!url) { warn_user("NoMemory", 0); return; } for (i = 0; !iscntrl(url[i]); i++) ; url[i] = 0; } if (nsurl_create(url, &nsurl) != NSERROR_OK) { free(url); return; } if (!fetch_can_fetch(nsurl)) { nsurl_unref(nsurl); free(url); return; } free(url); /* send ack */ message->your_ref = message->my_ref; error = xwimp_send_message(wimp_USER_MESSAGE_ACKNOWLEDGE, message, message->sender); if (error) { LOG(("xwimp_send_message: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); } /* create new browser window */ errorns = browser_window_create(BW_CREATE_HISTORY, nsurl, NULL, NULL, NULL); nsurl_unref(nsurl); if (errorns != NSERROR_OK) { warn_user(messages_get_errorcode(errorns), 0); } }