mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-07 12:15:51 +00:00
1018 lines
33 KiB
C
1018 lines
33 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.
|
|
*/
|
|
|
|
/* Please leave outside of ifdef for window precompiled headers */
|
|
#include "xp.h"
|
|
#include "netutils.h"
|
|
#include "mkselect.h"
|
|
#include "mktcp.h"
|
|
#include "mkgeturl.h"
|
|
#include "prmem.h"
|
|
#include "plstr.h"
|
|
#include "net_xp_file.h"
|
|
|
|
#ifdef MOZILLA_CLIENT
|
|
|
|
|
|
#include "mkstream.h"
|
|
#include "cvextcon.h"
|
|
#include "mkformat.h"
|
|
#include "il_strm.h" /* Image Library stream converters. */
|
|
|
|
#include "mime.h"
|
|
#include "cvactive.h"
|
|
#include "cvunzip.h"
|
|
#include "cvchunk.h"
|
|
#include "gui.h"
|
|
#include "msgcom.h"
|
|
#include "msgnet.h"
|
|
#include "mkautocf.h" /* Proxy auto-config */
|
|
#include "cvjscfg.h" /* Javascript config */
|
|
#include "mkhelp.h"
|
|
|
|
#include "xlate.h" /* Text and PostScript converters */
|
|
#include "libi18n.h" /* For INTL_ConvCharCode() */
|
|
#include "edt.h"
|
|
#include "secnav.h"
|
|
#include "intl_csi.h"
|
|
|
|
|
|
#include "m_cvstrm.h"
|
|
#include "cvmime.h"
|
|
|
|
#include "mimeenc.h"
|
|
|
|
#include "xpgetstr.h"
|
|
extern int XP_EDITOR_NON_HTML;
|
|
|
|
#ifdef CRAWLER
|
|
/* crawler converters */
|
|
#include "pagescan.h"
|
|
#include "crawler.h"
|
|
#include "robotxt.h"
|
|
#endif
|
|
|
|
#ifdef MOZ_MAIL_NEWS
|
|
/* #### defined in libmsg/msgutils.c */
|
|
extern NET_StreamClass *
|
|
msg_MakeRebufferingStream (NET_StreamClass *next_stream,
|
|
URL_Struct *url,
|
|
MWContext *context);
|
|
#endif /* MOZ_MAIL_NEWS */
|
|
|
|
/* defined at the bottom of this file */
|
|
NET_StreamClass *
|
|
NET_PrintRawToDisk(int format_out,
|
|
void *data_obj,
|
|
URL_Struct *url_struct,
|
|
MWContext *context);
|
|
|
|
#ifdef MOZ_MAIL_NEWS
|
|
typedef struct MIME_DataObject {
|
|
MimeDecoderData *decoder; /* State used by the decoder */
|
|
NET_StreamClass *next_stream; /* Where the output goes */
|
|
PRBool partial_p; /* Whether we should close that stream */
|
|
} MIME_DataObject;
|
|
|
|
|
|
|
|
|
|
|
|
static int
|
|
net_mime_decoder_cb (const char *buf, int32 size, void *closure)
|
|
{
|
|
MIME_DataObject *obj = (MIME_DataObject *) closure;
|
|
NET_StreamClass *stream = (obj ? obj->next_stream : 0);
|
|
if (stream)
|
|
return stream->put_block (stream, (char *) buf, size);
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
net_MimeEncodingConverterWrite (NET_StreamClass *stream, CONST char* buffer,
|
|
int32 length)
|
|
{
|
|
MIME_DataObject *obj = (MIME_DataObject *) stream->data_object;
|
|
return MimeDecoderWrite (obj->decoder, (char *) buffer, length);
|
|
}
|
|
|
|
|
|
PRIVATE unsigned int net_MimeEncodingConverterWriteReady (NET_StreamClass *stream)
|
|
{
|
|
#if 1
|
|
return (MAX_WRITE_READY);
|
|
#else
|
|
MIME_DataObject *data = (MIME_DataObject *) stream->data_object;
|
|
if(data->next_stream)
|
|
return ((*data->next_stream->is_write_ready)
|
|
(data->next_stream));
|
|
else
|
|
return (MAX_WRITE_READY);
|
|
#endif
|
|
}
|
|
|
|
PRIVATE void net_MimeEncodingConverterComplete (NET_StreamClass *stream)
|
|
{
|
|
MIME_DataObject *data = (MIME_DataObject *) stream->data_object;
|
|
|
|
if (data->decoder)
|
|
{
|
|
MimeDecoderDestroy(data->decoder, PR_FALSE);
|
|
data->decoder = 0;
|
|
}
|
|
|
|
/* complete the next stream */
|
|
if (!data->partial_p && data->next_stream)
|
|
{
|
|
(*data->next_stream->complete) (data->next_stream);
|
|
PR_Free (data->next_stream);
|
|
}
|
|
PR_Free (data);
|
|
}
|
|
|
|
PRIVATE void net_MimeEncodingConverterAbort (NET_StreamClass *stream, int status)
|
|
{
|
|
MIME_DataObject *data = (MIME_DataObject *) stream->data_object;
|
|
|
|
if (data->decoder)
|
|
{
|
|
MimeDecoderDestroy(data->decoder, PR_TRUE);
|
|
data->decoder = 0;
|
|
}
|
|
|
|
/* abort the next stream */
|
|
if (!data->partial_p && data->next_stream)
|
|
{
|
|
(*data->next_stream->abort) (data->next_stream, status);
|
|
PR_Free (data->next_stream);
|
|
}
|
|
PR_Free (data);
|
|
}
|
|
#endif /* MOZ_MAIL_NEWS */
|
|
|
|
PRIVATE NET_StreamClass *
|
|
NET_MimeEncodingConverter_1 (int format_out,
|
|
void *data_obj,
|
|
URL_Struct *URL_s,
|
|
MWContext *window_id,
|
|
PRBool partial_p,
|
|
NET_StreamClass *next_stream)
|
|
{
|
|
#ifdef MOZ_MAIL_NEWS
|
|
MIME_DataObject* obj;
|
|
MimeDecoderData *(*fn) (int (*) (const char*, int32, void*), void*) = 0;
|
|
|
|
NET_StreamClass* stream;
|
|
char *type = (char *) data_obj;
|
|
|
|
TRACEMSG(("Setting up encoding stream. Have URL: %s\n", URL_s->address));
|
|
|
|
stream = PR_NEW(NET_StreamClass);
|
|
if(stream == NULL)
|
|
return(NULL);
|
|
|
|
memset(stream, 0, sizeof(NET_StreamClass));
|
|
|
|
obj = PR_NEW(MIME_DataObject);
|
|
if (obj == NULL)
|
|
return(NULL);
|
|
memset(obj, 0, sizeof(MIME_DataObject));
|
|
|
|
if (!PL_strcasecmp (type, ENCODING_QUOTED_PRINTABLE))
|
|
fn = &MimeQPDecoderInit;
|
|
else if (!PL_strcasecmp (type, ENCODING_BASE64))
|
|
fn = &MimeB64DecoderInit;
|
|
else if (!PL_strcasecmp (type, ENCODING_UUENCODE) ||
|
|
!PL_strcasecmp (type, ENCODING_UUENCODE2) ||
|
|
!PL_strcasecmp (type, ENCODING_UUENCODE3) ||
|
|
!PL_strcasecmp (type, ENCODING_UUENCODE4))
|
|
fn = &MimeUUDecoderInit;
|
|
else
|
|
abort ();
|
|
obj->decoder = fn (net_mime_decoder_cb, obj);
|
|
if (!obj->decoder)
|
|
{
|
|
PR_Free(obj);
|
|
return 0;
|
|
}
|
|
|
|
stream->put_block = net_MimeEncodingConverterWrite;
|
|
|
|
stream->name = "Mime Stream";
|
|
stream->complete = net_MimeEncodingConverterComplete;
|
|
stream->abort = net_MimeEncodingConverterAbort;
|
|
stream->is_write_ready = net_MimeEncodingConverterWriteReady;
|
|
stream->data_object = obj; /* document info object */
|
|
stream->window_id = window_id;
|
|
|
|
if (partial_p)
|
|
{
|
|
PR_ASSERT (next_stream);
|
|
obj->next_stream = next_stream;
|
|
TRACEMSG(("Using existing stream in NET_MimeEncodingConverter\n"));
|
|
}
|
|
else
|
|
{
|
|
PR_ASSERT (!next_stream);
|
|
|
|
/* open next stream
|
|
*/
|
|
PR_FREEIF (URL_s->content_encoding);
|
|
obj->next_stream = NET_StreamBuilder (format_out, URL_s, window_id);
|
|
|
|
if (!obj->next_stream)
|
|
return (NULL);
|
|
|
|
/* When uudecoding, we tend to come up with tiny chunks of data
|
|
at a time. Make a stream to put them back together, so that
|
|
we hand bigger pieces to the image library.
|
|
*/
|
|
{
|
|
NET_StreamClass *buffer =
|
|
msg_MakeRebufferingStream (obj->next_stream, URL_s, window_id);
|
|
if (buffer)
|
|
obj->next_stream = buffer;
|
|
}
|
|
|
|
TRACEMSG(("Returning stream from NET_MimeEncodingConverter\n"));
|
|
}
|
|
|
|
return stream;
|
|
#else
|
|
PR_ASSERT(0);
|
|
return(NULL);
|
|
#endif /* MOZ_MAIL_NEWS */
|
|
}
|
|
|
|
|
|
PUBLIC NET_StreamClass *
|
|
NET_MimeEncodingConverter (int format_out,
|
|
void *data_obj,
|
|
URL_Struct *URL_s,
|
|
MWContext *window_id)
|
|
{
|
|
return NET_MimeEncodingConverter_1 (format_out, data_obj, URL_s, window_id,
|
|
PR_FALSE, 0);
|
|
}
|
|
|
|
NET_StreamClass *
|
|
NET_MimeMakePartialEncodingConverterStream (int format_out,
|
|
void *data_obj,
|
|
URL_Struct *URL_s,
|
|
MWContext *window_id,
|
|
NET_StreamClass *next_stream)
|
|
{
|
|
return NET_MimeEncodingConverter_1 (format_out, data_obj, URL_s, window_id,
|
|
PR_TRUE, next_stream);
|
|
}
|
|
|
|
/* Registers the default things that should be registered cross-platform.
|
|
Really this doesn't belong in this file.
|
|
*/
|
|
|
|
|
|
PRIVATE
|
|
NET_StreamClass *
|
|
EDT_ErrorOut (int format_out,
|
|
void *data_obj,
|
|
URL_Struct *URL_s,
|
|
MWContext *window_id)
|
|
{
|
|
|
|
FE_Alert(window_id, XP_GetString(XP_EDITOR_NON_HTML));
|
|
|
|
return(NULL);
|
|
}
|
|
|
|
|
|
PRIVATE void
|
|
net_RegisterDefaultDecoders (void)
|
|
{
|
|
static PA_InitData parser_data;
|
|
|
|
#ifdef XP_UNIX
|
|
NET_ClearExternalViewerConverters ();
|
|
#endif /* XP_UNIX */
|
|
|
|
/* for the parser/layout functionality
|
|
*/
|
|
#ifdef EDITOR
|
|
parser_data.output_func = EDT_ProcessTag;
|
|
#else
|
|
parser_data.output_func = LO_ProcessTag;
|
|
#endif
|
|
|
|
/* Convert the charsets of HTML into the canonical internal form.
|
|
*/
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_PRESENT,
|
|
NULL, INTL_ConvCharCode);
|
|
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_PRESENT_INLINE,
|
|
NULL, INTL_ConvCharCode);
|
|
|
|
/* send all HTML to the editor, everything else as error
|
|
*/
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_EDIT,
|
|
NULL, INTL_ConvCharCode);
|
|
|
|
/* send file listings to html converter */
|
|
NET_RegisterContentTypeConverter (APPLICATION_HTTP_INDEX, FO_PRESENT,
|
|
NULL, NET_HTTPIndexFormatToHTMLConverter);
|
|
|
|
NET_RegisterContentTypeConverter ("*", FO_EDIT,
|
|
NULL, EDT_ErrorOut);
|
|
|
|
NET_RegisterContentTypeConverter("*", FO_LOAD_HTML_HELP_MAP_FILE,
|
|
NULL, NET_HTMLHelpMapToURL);
|
|
|
|
#ifdef CRAWLER
|
|
NET_RegisterContentTypeConverter(TEXT_HTML, FO_CRAWL_PAGE,
|
|
NULL, INTL_ConvCharCode);
|
|
|
|
NET_RegisterContentTypeConverter("*", FO_CRAWL_PAGE,
|
|
NULL, CRAWL_CrawlerConverter);
|
|
|
|
NET_RegisterContentTypeConverter("*", FO_CRAWL_RESOURCE,
|
|
NULL, CRAWL_CrawlerResourceConverter);
|
|
|
|
NET_RegisterContentTypeConverter("*", FO_ROBOTS_TXT,
|
|
NULL, CRAWL_RobotsTxtConverter);
|
|
#endif /* CRAWLER */
|
|
|
|
/* this should be windows and mac soon too... */
|
|
#ifdef XP_UNIX
|
|
/* the view source converter */
|
|
NET_RegisterContentTypeConverter ("*", FO_VIEW_SOURCE,
|
|
TEXT_PLAIN, net_ColorHTMLStream);
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_VIEW_SOURCE,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (MESSAGE_RFC822, FO_VIEW_SOURCE,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (MESSAGE_NEWS, FO_VIEW_SOURCE,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_VIEW_SOURCE,
|
|
TEXT_HTML, net_ColorHTMLStream);
|
|
NET_RegisterContentTypeConverter (APPLICATION_HTTP_INDEX, FO_VIEW_SOURCE,
|
|
NULL, NET_HTTPIndexFormatToHTMLConverter);
|
|
#endif /* XP_UNIX */
|
|
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_SAVE_AS_TEXT,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_QUOTE_MESSAGE,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (APPLICATION_HTTP_INDEX, FO_QUOTE_MESSAGE,
|
|
NULL, NET_HTTPIndexFormatToHTMLConverter);
|
|
NET_RegisterContentTypeConverter (APPLICATION_HTTP_INDEX, FO_SAVE_AS_TEXT,
|
|
NULL, NET_HTTPIndexFormatToHTMLConverter);
|
|
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (TEXT_HTML, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (APPLICATION_HTTP_INDEX,
|
|
FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, NET_HTTPIndexFormatToHTMLConverter);
|
|
#endif /* XP_UNIX */
|
|
|
|
/* And MDL too, sigh. */
|
|
NET_RegisterContentTypeConverter (TEXT_MDL, FO_PRESENT,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (TEXT_MDL, FO_SAVE_AS_TEXT,
|
|
NULL, INTL_ConvCharCode);
|
|
NET_RegisterContentTypeConverter (TEXT_MDL, FO_QUOTE_MESSAGE,
|
|
NULL, INTL_ConvCharCode);
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (TEXT_MDL, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, INTL_ConvCharCode);
|
|
#endif /* XP_UNIX */
|
|
|
|
/* Convert the charsets of plain text into the canonical internal form.
|
|
*/
|
|
NET_RegisterContentTypeConverter (TEXT_PLAIN, FO_PRESENT,
|
|
NULL, NET_PlainTextConverter);
|
|
NET_RegisterContentTypeConverter (TEXT_PLAIN, FO_EDIT,
|
|
NULL, NET_PlainTextConverter);
|
|
NET_RegisterContentTypeConverter (TEXT_PLAIN, FO_QUOTE_MESSAGE,
|
|
NULL, NET_PlainTextConverter);
|
|
/* don't register TEXT_PLAIN for FO_SAVE_AS_TEXT
|
|
* since it is already text
|
|
*/
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (TEXT_PLAIN, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, NET_PlainTextConverter);
|
|
#endif /* XP_UNIX */
|
|
|
|
/* always treat unknown content types as text/plain */
|
|
NET_RegisterContentTypeConverter (UNKNOWN_CONTENT_TYPE, FO_PRESENT,
|
|
NULL, NET_PlainTextConverter);
|
|
NET_RegisterContentTypeConverter (UNKNOWN_CONTENT_TYPE, FO_QUOTE_MESSAGE,
|
|
NULL, NET_PlainTextConverter);
|
|
/* let mail view forms sent via web browsers */
|
|
NET_RegisterContentTypeConverter (APPLICATION_WWW_FORM_URLENCODED,
|
|
FO_PRESENT,
|
|
NULL,
|
|
NET_PlainTextConverter);
|
|
|
|
#if defined(MOZ_MAIL_NEWS) || defined(MOZ_MAIL_COMPOSE)
|
|
#if defined(XP_MAC)
|
|
NET_RegisterContentTypeConverter (MULTIPART_APPLEDOUBLE, FO_SAVE_AS,
|
|
NULL, fe_MakeAppleDoubleDecodeStream_1);
|
|
NET_RegisterContentTypeConverter (APPLICATION_APPLEFILE, FO_SAVE_AS,
|
|
NULL, fe_MakeAppleSingleDecodeStream_1);
|
|
#endif
|
|
#if defined(XP_MAC) || defined(XP_UNIX) || defined(XP_PC) || defined(XP_BEOS)
|
|
/* the new apple single/double and binhex decode. 20oct95 */
|
|
NET_RegisterContentTypeConverter (APPLICATION_BINHEX, FO_PRESENT,
|
|
NULL, fe_MakeBinHexDecodeStream);
|
|
NET_RegisterContentTypeConverter (MULTIPART_APPLEDOUBLE, FO_PRESENT,
|
|
NULL, fe_MakeAppleDoubleDecodeStream_1);
|
|
NET_RegisterContentTypeConverter (MULTIPART_HEADER_SET, FO_PRESENT,
|
|
NULL, fe_MakeAppleDoubleDecodeStream_1);
|
|
NET_RegisterContentTypeConverter (APPLICATION_APPLEFILE, FO_PRESENT,
|
|
NULL, fe_MakeAppleSingleDecodeStream_1);
|
|
|
|
NET_RegisterContentTypeConverter (UUENCODE_APPLE_SINGLE, FO_PRESENT,
|
|
NULL, fe_MakeAppleSingleDecodeStream_1);
|
|
NET_RegisterContentTypeConverter (UUENCODE_APPLE_SINGLE, FO_SAVE_AS,
|
|
NULL, fe_MakeAppleSingleDecodeStream_1);
|
|
|
|
#endif /* XP_MAC || XP_UNIX */
|
|
#endif /* MOZ_MAIL_NEWS || MOZ_MAIL_COMPOSE */
|
|
/* don't register UNKNOWN_CONTENT_TYPE for FO_SAVE_AS_TEXT
|
|
* since it is already text
|
|
*/
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (UNKNOWN_CONTENT_TYPE,
|
|
FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, NET_PlainTextConverter);
|
|
#endif /* XP_UNIX */
|
|
|
|
|
|
/* Take the canonical internal form and do layout on it.
|
|
We do the same thing when the format_out is PRESENT or any of
|
|
the SAVE_AS types; the different behavior is gotten by the use
|
|
of a different context rather than a different stream.
|
|
*/
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_PRESENT,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_PRESENT_INLINE,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_SAVE_AS_TEXT,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_QUOTE_MESSAGE,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_SAVE_AS_POSTSCRIPT,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
#endif /* XP_UNIX */
|
|
|
|
/* one for the editor */
|
|
NET_RegisterContentTypeConverter (INTERNAL_PARSER, FO_EDIT,
|
|
(void *) &parser_data, PA_BeginParseMDL);
|
|
|
|
/* Note that we don't register a converter for "*" to FO_SAVE_AS,
|
|
because the FE needs to do that specially to set up an output file.
|
|
(The file I/O stuff for SAVE_AS_TEXT and SAVE_AS_POSTSCRIPT is dealt
|
|
with by libxlate.a, which could also handle SAVE_AS, but it's probably
|
|
not worth the effort.)
|
|
*/
|
|
|
|
|
|
/* Do the same for the internally-handled image types when the format_out
|
|
is SAVE_AS_POSTSCRIPT, because the TEXT->PS code can handle that. But
|
|
do not register converters to feed the image types to the HTML->TEXT
|
|
code, because that doesn't work.
|
|
*/
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter (IMAGE_GIF, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
NET_RegisterContentTypeConverter (IMAGE_JPG, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
NET_RegisterContentTypeConverter (IMAGE_PJPG, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
|
|
NET_RegisterContentTypeConverter (IMAGE_PNG, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
|
|
NET_RegisterContentTypeConverter (IMAGE_ART, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
NET_RegisterContentTypeConverter (IMAGE_ART2, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
|
|
NET_RegisterContentTypeConverter (IMAGE_XBM, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
NET_RegisterContentTypeConverter (IMAGE_XBM2, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
NET_RegisterContentTypeConverter (IMAGE_XBM3, FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, IL_ViewStream);
|
|
#endif /* XP_UNIX */
|
|
|
|
|
|
/* register default (non)decoders for the text printer
|
|
*/
|
|
NET_RegisterContentTypeConverter ("*", FO_SAVE_AS_TEXT,
|
|
NULL, NET_PrintRawToDisk);
|
|
NET_RegisterContentTypeConverter ("*", FO_QUOTE_MESSAGE,
|
|
NULL, NET_PrintRawToDisk);
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter ("*", FO_SAVE_AS_POSTSCRIPT,
|
|
NULL, NET_PrintRawToDisk);
|
|
#endif /* XP_UNIX */
|
|
|
|
/* cache things */
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_PRESENT,
|
|
NULL, NET_CacheConverter);
|
|
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_PRESENT_INLINE,
|
|
NULL, NET_CacheConverter);
|
|
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_ONLY,
|
|
NULL, NET_CacheConverter);
|
|
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_INTERNAL_IMAGE,
|
|
NULL, NET_CacheConverter);
|
|
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_SAVE_AS,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_SAVE_AS_TEXT,
|
|
NULL, NET_CacheConverter);
|
|
#ifdef XP_UNIX
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_SAVE_AS_POSTSCRIPT,
|
|
NULL, NET_CacheConverter);
|
|
#endif /* XP_UNIX */
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_QUOTE_MESSAGE,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_VIEW_SOURCE,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_MAIL_TO,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_EDIT,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_LOAD_HTML_HELP_MAP_FILE,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_SOFTUPDATE,
|
|
NULL, NET_CacheConverter);
|
|
#ifdef CRAWLER
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_CRAWL_PAGE,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_CRAWL_RESOURCE,
|
|
NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_ROBOTS_TXT,
|
|
NULL, NET_CacheConverter);
|
|
#endif /* CRAWLER */
|
|
|
|
|
|
#ifndef MCC_PROXY
|
|
NET_RegisterContentTypeConverter(APPLICATION_NS_PROXY_AUTOCONFIG,
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *)0, NET_ProxyAutoConfig);
|
|
NET_RegisterContentTypeConverter(APPLICATION_NS_PROXY_AUTOCONFIG,
|
|
FO_PRESENT,
|
|
(void *)0, NET_ProxyAutoConfig);
|
|
NET_RegisterContentTypeConverter(APPLICATION_NS_JAVASCRIPT_AUTOCONFIG,
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *)0, NET_JavascriptConfig);
|
|
NET_RegisterContentTypeConverter(APPLICATION_NS_JAVASCRIPT_AUTOCONFIG,
|
|
FO_PRESENT,
|
|
(void *)0, NET_JavascriptConfig);
|
|
#endif
|
|
|
|
/*
|
|
* call security library to register all security related content
|
|
* type converters.
|
|
*/
|
|
SECNAV_RegisterNetlibMimeConverters();
|
|
#ifdef JAVA
|
|
{ /* stuff from ns/sun-java/netscape/net/netStubs.c */
|
|
extern void NSN_RegisterJavaConverter(void);
|
|
NSN_RegisterJavaConverter();
|
|
}
|
|
#endif /* JAVA */
|
|
|
|
/* Register object data handler (see layobj.c) */
|
|
NET_RegisterContentTypeConverter("*", FO_OBJECT, NULL, LO_NewObjectStream);
|
|
NET_RegisterContentTypeConverter("*", FO_CACHE_AND_OBJECT, NULL, NET_CacheConverter);
|
|
|
|
#ifdef JAVA
|
|
/* Castanet stuff can't work in non-java enabled environments */
|
|
/* Register Marimba handler only if netcaster installed */
|
|
if (FE_IsNetcasterInstalled()) {
|
|
NET_RegisterContentTypeConverter(APPLICATION_MARIMBA,
|
|
FO_PRESENT,
|
|
NULL,
|
|
NET_DoMarimbaApplication);
|
|
|
|
NET_RegisterContentTypeConverter(APPLICATION_XMARIMBA,
|
|
FO_PRESENT,
|
|
NULL,
|
|
NET_DoMarimbaApplication);
|
|
}
|
|
#endif
|
|
|
|
/* RDF */
|
|
{
|
|
/* XXX - move these to a header file soon */
|
|
NET_StreamClass * rdf_Converter(FO_Present_Types format_out, void *data_object, URL_Struct *URL_s, MWContext *window_id);
|
|
NET_StreamClass * XML_XMLConverter(FO_Present_Types format_out, void *data_object, URL_Struct *URL_s, MWContext *window_id);
|
|
NET_StreamClass * XML_CSSConverter(FO_Present_Types format_out, void *data_object, URL_Struct *URL_s, MWContext *window_id);
|
|
NET_StreamClass * XML_HTMLConverter(FO_Present_Types format_out, void *data_object, URL_Struct *URL_s, MWContext *window_id);
|
|
|
|
NET_RegisterContentTypeConverter( "*", FO_CACHE_AND_RDF, NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter( "*", FO_RDF, NULL, rdf_Converter);
|
|
|
|
/* XML for direct presentation */
|
|
|
|
NET_RegisterContentTypeConverter (TEXT_XML, FO_CACHE_AND_PRESENT, NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter (TEXT_XML, FO_PRESENT, NULL, XML_XMLConverter);
|
|
NET_RegisterContentTypeConverter (TEXT_XML, FO_EDIT, NULL, XML_XMLConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_XMLHTML, NULL, XML_HTMLConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_XMLCSS, NULL, XML_CSSConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_XMLHTML, NULL, NET_CacheConverter);
|
|
NET_RegisterContentTypeConverter ("*", FO_CACHE_AND_XMLCSS, NULL, NET_CacheConverter);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
PRIVATE void
|
|
net_RegisterDefaultEncodingDecoders (void)
|
|
{
|
|
/* Register the decompression content-encoding converters for those
|
|
types which are displayed internally. */
|
|
NET_RegisterAllEncodingConverters (INTERNAL_PARSER, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (TEXT_HTML, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (TEXT_MDL, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (TEXT_PLAIN, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_GIF, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_JPG, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_PJPG, FO_PRESENT);
|
|
|
|
NET_RegisterAllEncodingConverters (IMAGE_PNG, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_ART, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_ART2, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_XBM, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_XBM2, FO_PRESENT);
|
|
NET_RegisterAllEncodingConverters (IMAGE_XBM3, FO_PRESENT);
|
|
/* always treat unknown content types as text/plain */
|
|
NET_RegisterAllEncodingConverters (UNKNOWN_CONTENT_TYPE, FO_PRESENT);
|
|
|
|
/* when displaying anything in a news mime-multipart image
|
|
* de compress it first
|
|
*/
|
|
NET_RegisterAllEncodingConverters ("*", FO_MULTIPART_IMAGE);
|
|
|
|
/* When saving anything as Text or PostScript, it's necessary to
|
|
uncompress it first. */
|
|
NET_RegisterAllEncodingConverters ("*", FO_SAVE_AS_TEXT);
|
|
# ifdef XP_UNIX
|
|
NET_RegisterAllEncodingConverters ("*", FO_SAVE_AS_POSTSCRIPT);
|
|
# endif /* XP_UNIX */
|
|
|
|
/* Whenever we save text or HTML to disk, we uncompress it first,
|
|
because the rules we decided upon is:
|
|
|
|
- When Netscape saves text/plain or text/html documents to a
|
|
user-specified file, they are always uncompressed first.
|
|
|
|
- When Netscape saves any other kind of document to a user-specified
|
|
file, it is always saved in its compressed state.
|
|
|
|
- When Netscape saves a document to a temporary file before handing
|
|
it off to an external viewer, it is always uncompressed first.
|
|
*/
|
|
NET_RegisterAllEncodingConverters (TEXT_HTML, FO_SAVE_AS);
|
|
NET_RegisterAllEncodingConverters (TEXT_MDL, FO_SAVE_AS);
|
|
NET_RegisterAllEncodingConverters (TEXT_PLAIN, FO_SAVE_AS);
|
|
NET_RegisterAllEncodingConverters (INTERNAL_PARSER, FO_SAVE_AS);
|
|
/* always treat unknown content types as text/plain */
|
|
NET_RegisterAllEncodingConverters (UNKNOWN_CONTENT_TYPE, FO_SAVE_AS);
|
|
}
|
|
|
|
|
|
PUBLIC void
|
|
NET_RegisterMIMEDecoders (void)
|
|
{
|
|
net_RegisterDefaultDecoders ();
|
|
|
|
NET_RegisterEncodingConverter (ENCODING_GZIP,
|
|
(void *) ENCODING_GZIP,
|
|
NET_UnZipConverter);
|
|
NET_RegisterEncodingConverter (ENCODING_GZIP2,
|
|
(void *) ENCODING_GZIP2,
|
|
NET_UnZipConverter);
|
|
NET_RegisterEncodingConverter (ENCODING_QUOTED_PRINTABLE,
|
|
(void *) ENCODING_QUOTED_PRINTABLE,
|
|
NET_MimeEncodingConverter);
|
|
NET_RegisterEncodingConverter (ENCODING_BASE64,
|
|
(void *) ENCODING_BASE64,
|
|
NET_MimeEncodingConverter);
|
|
#ifndef IRIX_STARTUP_SPEEDUPS
|
|
NET_RegisterEncodingConverter (ENCODING_UUENCODE,
|
|
(void *) ENCODING_UUENCODE,
|
|
NET_MimeEncodingConverter);
|
|
NET_RegisterEncodingConverter (ENCODING_UUENCODE2,
|
|
(void *) ENCODING_UUENCODE2,
|
|
NET_MimeEncodingConverter);
|
|
#endif
|
|
NET_RegisterEncodingConverter (ENCODING_UUENCODE3,
|
|
(void *) ENCODING_UUENCODE3,
|
|
NET_MimeEncodingConverter);
|
|
#ifndef IRIX_STARTUP_SPEEDUPS
|
|
NET_RegisterEncodingConverter (ENCODING_UUENCODE4,
|
|
(void *) ENCODING_UUENCODE4,
|
|
NET_MimeEncodingConverter);
|
|
#endif
|
|
|
|
#if defined(SMART_MAIL) || defined(XP_UNIX)
|
|
/* #### This should really be done all the time, because all versions of
|
|
Mozilla should be able to sensibly display documents of type
|
|
message/rfc822. But I don't know what Makefile arcanity has happened on
|
|
Windows, so for now, this only gets called if SMART_MAIL is defined, or
|
|
if we're on Unix. Someone please fix this on non-SmartMail Windows, and
|
|
on Mac.
|
|
*/
|
|
|
|
/* Decoders for libmime/mimemoz.c */
|
|
MIME_RegisterConverters();
|
|
#endif /* SMART_MAIL */
|
|
|
|
#if defined(MOZ_MAIL_NEWS) || defined(MOZ_MAIL_COMPOSE)
|
|
/* Decoders for libmsg/compose.c */
|
|
MSG_RegisterConverters ();
|
|
#endif
|
|
|
|
NET_RegisterUniversalEncodingConverter("chunked",
|
|
NULL,
|
|
NET_ChunkedDecoderStream);
|
|
|
|
NET_RegisterContentTypeConverter("multipart/x-mixed-replace",
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
NET_RegisterContentTypeConverter("multipart/x-mixed-replace",
|
|
FO_CACHE_AND_PRINT,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
NET_RegisterContentTypeConverter("multipart/x-mixed-replace",
|
|
FO_CACHE_AND_INTERNAL_IMAGE,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
NET_RegisterContentTypeConverter("multipart/x-byteranges",
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
NET_RegisterContentTypeConverter("multipart/byteranges",
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
NET_RegisterContentTypeConverter("multipart/mixed",
|
|
FO_CACHE_AND_PRESENT,
|
|
(void *) CVACTIVE_SIGNAL_AT_END_OF_MULTIPART,
|
|
CV_MakeMultipleDocumentStream);
|
|
|
|
net_RegisterDefaultEncodingDecoders ();
|
|
}
|
|
|
|
|
|
#if 0
|
|
void
|
|
main ()
|
|
{
|
|
unsigned char *s;
|
|
int32 i;
|
|
#define TEST(S) \
|
|
/*MIME_EncodeBase64String*/ \
|
|
MIME_EncodeQuotedPrintableString \
|
|
(S, strlen(S), &s, &i); \
|
|
printf ("---------\n" \
|
|
"%s\n" \
|
|
"---------\n" \
|
|
"%s\n" \
|
|
"---------\n", \
|
|
S, s); \
|
|
free(s)
|
|
|
|
TEST("ThisThisThisThis\n"
|
|
"This is a line with a c\238ntr\001l character in it.\n"
|
|
"This line has whitespace at EOL. \n"
|
|
"This is a long line. All work and no play makes Jack a dull boy. "
|
|
"All work and no play makes Jack a dull boy. "
|
|
"All work and no play makes Jack a dull boy. "
|
|
"All work and no play makes Jack a dull boy. \n"
|
|
"\n"
|
|
"Here's an equal sign: =\n"
|
|
"and here's a return\r..."
|
|
"Now make it realloc:"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
"\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"
|
|
);
|
|
}
|
|
#endif
|
|
|
|
typedef struct _NET_PrintRawToDiskStruct {
|
|
XP_File fp;
|
|
MWContext *context;
|
|
int32 content_length;
|
|
int32 bytes_read;
|
|
int16 mail_csid;
|
|
int16 win_csid;
|
|
CCCDataObject conv;
|
|
PRBool doConvert;
|
|
} NET_PrintRawToDiskStruct;
|
|
|
|
/* this converter uses the
|
|
* (context->prSetup->filename) variable to
|
|
* open the filename specified and save all data raw to
|
|
* the file.
|
|
*/
|
|
PRIVATE
|
|
int
|
|
net_PrintRawToDiskWrite (NET_StreamClass *stream, CONST char *str, int32 len)
|
|
{
|
|
NET_PrintRawToDiskStruct *obj = (NET_PrintRawToDiskStruct *) stream->data_object;
|
|
char *newStr = NULL;
|
|
int32 origLen = len;
|
|
int32 rv = 0;
|
|
|
|
if (obj->doConvert)
|
|
{
|
|
char *dupStr = (char *) PR_Malloc(len+1);
|
|
|
|
if (dupStr)
|
|
{
|
|
memcpy(dupStr, str, len);
|
|
*(dupStr + len) = 0;
|
|
newStr = (char *) INTL_CallCharCodeConverter(obj->conv,
|
|
(unsigned char *)dupStr,
|
|
len);
|
|
if (!newStr)
|
|
newStr = dupStr;
|
|
else if (newStr != dupStr)
|
|
PR_Free(dupStr);
|
|
|
|
if (newStr)
|
|
{
|
|
str = newStr;
|
|
len = INTL_GetCCCLen(obj->conv);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* int32 rv = fwrite ((char *) str, 1, len, obj->fp);*/
|
|
rv = NET_XP_FileWrite(str, len, obj->fp);
|
|
|
|
if (newStr)
|
|
PR_Free(newStr);
|
|
|
|
obj->bytes_read += origLen;
|
|
|
|
if (obj->content_length > 0)
|
|
FE_SetProgressBarPercent (obj->context,
|
|
(obj->bytes_read * 100) /
|
|
obj->content_length);
|
|
|
|
if(rv == len)
|
|
return(0);
|
|
else
|
|
return(-1);
|
|
}
|
|
|
|
PRIVATE unsigned int
|
|
net_PrintRawToDiskIsWriteReady (NET_StreamClass *stream)
|
|
{
|
|
return(MAX_WRITE_READY);
|
|
}
|
|
|
|
PRIVATE void
|
|
net_PrintRawToDiskComplete (NET_StreamClass *stream)
|
|
{
|
|
NET_PrintRawToDiskStruct *obj = (NET_PrintRawToDiskStruct *) stream->data_object;
|
|
|
|
if (obj->conv) {
|
|
INTL_DestroyCharCodeConverter(obj->conv);
|
|
obj->conv = NULL;
|
|
}
|
|
|
|
/* NET_XP_FileClose(obj->fp); DONT DO THIS the FE's do this */
|
|
}
|
|
|
|
PRIVATE void
|
|
net_PrintRawToDiskAbort (NET_StreamClass *stream, int status)
|
|
{
|
|
NET_PrintRawToDiskStruct *obj = (NET_PrintRawToDiskStruct *) stream->data_object;
|
|
|
|
if (obj->conv) {
|
|
INTL_DestroyCharCodeConverter(obj->conv);
|
|
obj->conv = NULL;
|
|
}
|
|
|
|
/* NET_XP_FileClose(obj->fp); DONT DO THIS the FE's do this */
|
|
}
|
|
|
|
/* this converter uses the
|
|
* (context->prSetup->out) file pointer variable to
|
|
* save all data raw to the file.
|
|
*/
|
|
PUBLIC NET_StreamClass *
|
|
NET_PrintRawToDisk(int format_out,
|
|
void *data_obj,
|
|
URL_Struct *url_struct,
|
|
MWContext *context)
|
|
{
|
|
NET_PrintRawToDiskStruct *obj = PR_NEW(NET_PrintRawToDiskStruct);
|
|
NET_StreamClass * stream;
|
|
INTL_CharSetInfo csi = NULL;
|
|
char *mime_charset = NULL;
|
|
|
|
if(!obj)
|
|
return(NULL);
|
|
|
|
memset(obj, 0, sizeof(NET_PrintRawToDiskStruct));
|
|
|
|
if(!context->prSetup || !context->prSetup->out)
|
|
{
|
|
PR_Free(obj);
|
|
return NULL;
|
|
}
|
|
|
|
#ifdef NOT /* file ptr should already be open in context->prSetup->out */
|
|
if(!(obj->fp = NET_XP_FileOpen(context->prSetup->filename,
|
|
xpTemporary,
|
|
XP_FILE_WRITE_BIN)))
|
|
{
|
|
PR_Free(obj);
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
obj->fp = context->prSetup->out;
|
|
|
|
obj->context = context;
|
|
obj->content_length = url_struct->content_length;
|
|
|
|
stream = (NET_StreamClass *) PR_NEW(NET_StreamClass);
|
|
if (!stream)
|
|
{
|
|
PR_Free(obj);
|
|
return NULL;
|
|
}
|
|
|
|
memset(stream, 0, sizeof(NET_StreamClass));
|
|
|
|
stream->name = "PrintRawToDisk";
|
|
stream->complete = net_PrintRawToDiskComplete;
|
|
stream->abort = net_PrintRawToDiskAbort;
|
|
stream->put_block = net_PrintRawToDiskWrite;
|
|
stream->is_write_ready = net_PrintRawToDiskIsWriteReady;
|
|
stream->data_object = obj;
|
|
stream->window_id = context;
|
|
|
|
csi = LO_GetDocumentCharacterSetInfo(context);
|
|
mime_charset = INTL_GetCSIMimeCharset(csi);
|
|
if (mime_charset && *(mime_charset))
|
|
{
|
|
obj->conv = INTL_CreateCharCodeConverter();
|
|
obj->mail_csid = INTL_CharSetNameToID(mime_charset);
|
|
obj->win_csid = INTL_DocToWinCharSetID(obj->mail_csid);
|
|
|
|
if (obj->conv)
|
|
obj->doConvert = INTL_GetCharCodeConverter(obj->mail_csid,
|
|
obj->win_csid,
|
|
obj->conv);
|
|
}
|
|
|
|
return(stream);
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* MOZILLA_CLIENT */
|