mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 06:11:37 +00:00
157 lines
3.8 KiB
C
157 lines
3.8 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "mkutils.h"
|
|
#include "mkgeturl.h"
|
|
#include "cvmime.h"
|
|
#include "mkdaturl.h"
|
|
|
|
extern int MK_OUT_OF_MEMORY;
|
|
extern int MK_MALFORMED_URL_ERROR;
|
|
|
|
/* format of the DATA: URL
|
|
*
|
|
* data:[CONTENT-TYPE][;base64],DATA
|
|
*/
|
|
PRIVATE int32
|
|
net_DataURLLoad (ActiveEntry * ce)
|
|
{
|
|
char *data_buffer;
|
|
XP_Bool is_base64 = FALSE;
|
|
NET_StreamClass *stream;
|
|
char *comma;
|
|
|
|
ce->protocol = DATA_TYPE_URL;
|
|
|
|
/* we need a buffer equal to or smaller than the size of the URL
|
|
*/
|
|
data_buffer = (char *)XP_ALLOC(XP_STRLEN(ce->URL_s->address)+1);
|
|
|
|
if(!data_buffer)
|
|
return(MK_OUT_OF_MEMORY);
|
|
|
|
/* determine the content type */
|
|
|
|
/* find the first comma */
|
|
comma = XP_STRCHR(ce->URL_s->address, ',');
|
|
|
|
/* if no comma abort */
|
|
if(!comma)
|
|
{
|
|
ce->URL_s->error_msg = NET_ExplainErrorDetails(MK_MALFORMED_URL_ERROR, ce->URL_s->address);
|
|
return(MK_MALFORMED_URL_ERROR);
|
|
}
|
|
|
|
/* fill in default content type */
|
|
StrAllocCopy(ce->URL_s->content_type, TEXT_PLAIN);
|
|
|
|
/* check for a content type */
|
|
if(comma != ce->URL_s->address + XP_STRLEN("data:"))
|
|
{
|
|
*comma = '\0';
|
|
XP_STRCPY(data_buffer, ce->URL_s->address + XP_STRLEN("data:"));
|
|
*comma = ',';
|
|
|
|
/* check for base 64 encoding */
|
|
if(strcasestr(data_buffer, "base64"))
|
|
is_base64 = TRUE;
|
|
|
|
/* parse the rest as a content-type */
|
|
NET_ParseContentTypeHeader(ce->window_id, data_buffer, ce->URL_s, FALSE);
|
|
|
|
}
|
|
|
|
if(is_base64)
|
|
{
|
|
stream = NET_MimeEncodingConverter(ce->format_out, ENCODING_BASE64, ce->URL_s, ce->window_id);
|
|
}
|
|
else
|
|
{
|
|
/* open the outgoing stream
|
|
*/
|
|
stream = NET_StreamBuilder(ce->format_out, ce->URL_s, ce->window_id);
|
|
}
|
|
|
|
if(!stream)
|
|
{
|
|
ce->URL_s->error_msg = NET_ExplainErrorDetails(MK_UNABLE_TO_CONVERT);
|
|
ce->status = MK_UNABLE_TO_CONVERT;
|
|
return (ce->status);
|
|
}
|
|
|
|
/* @@@@ bug: ignore is_write_ready */
|
|
|
|
/* copy the data part of the URL into a scratch buffer */
|
|
XP_STRCPY(data_buffer, comma+1);
|
|
|
|
ce->status = (*stream->put_block)(stream,
|
|
data_buffer,
|
|
XP_STRLEN(data_buffer));
|
|
if(ce->status < 0)
|
|
{
|
|
(*stream->abort)(stream, ce->status);
|
|
return (ce->status);
|
|
}
|
|
|
|
(*stream->complete)(stream);
|
|
|
|
ce->status = MK_DATA_LOADED;
|
|
return(-1); /* all done */
|
|
|
|
}
|
|
|
|
/* called repeatedly from NET_ProcessNet to push all the
|
|
* data up the stream
|
|
*/
|
|
PRIVATE int32
|
|
net_ProcessDataURL (ActiveEntry * cur_entry)
|
|
{
|
|
XP_ASSERT(0);
|
|
return(-1);
|
|
}
|
|
|
|
/* called by functions in mkgeturl to interrupt the loading of
|
|
* an object. (Usually a user interrupt)
|
|
*/
|
|
PRIVATE int32
|
|
net_InterruptDataURL (ActiveEntry * cur_entry)
|
|
{
|
|
XP_ASSERT(0);
|
|
return(-1);
|
|
}
|
|
|
|
PRIVATE void
|
|
net_CleanupDataURL(void)
|
|
{
|
|
|
|
}
|
|
|
|
MODULE_PRIVATE void
|
|
NET_InitDataURLProtocol(void)
|
|
{
|
|
static NET_ProtoImpl dataurl_proto_impl;
|
|
|
|
dataurl_proto_impl.init = net_DataURLLoad;
|
|
dataurl_proto_impl.process = net_ProcessDataURL;
|
|
dataurl_proto_impl.interrupt = net_InterruptDataURL;
|
|
dataurl_proto_impl.cleanup = net_CleanupDataURL;
|
|
|
|
NET_RegisterProtocolImplementation(&dataurl_proto_impl, DATA_TYPE_URL);
|
|
}
|
|
|