зеркало из https://github.com/mozilla/pjs.git
New I18N support and XP cleanup
This commit is contained in:
Родитель
564fb25410
Коммит
ae39d3b561
|
@ -30,7 +30,7 @@ extern "C" int
|
|||
mime_GrowBuffer (PRUint32 desired_size, PRUint32 element_size, PRUint32 quantum,
|
||||
char **buffer, PRInt32 *size)
|
||||
{
|
||||
if (*size <= desired_size)
|
||||
if ((PRUint32) *size <= desired_size)
|
||||
{
|
||||
char *new_buf;
|
||||
PRUint32 increment = desired_size - *size;
|
||||
|
@ -66,7 +66,7 @@ mime_ReBuffer (const char *net_buffer, PRInt32 net_buffer_size,
|
|||
{
|
||||
int status = 0;
|
||||
|
||||
if (desired_buffer_size >= (*buffer_sizeP))
|
||||
if (desired_buffer_size >= (PRUint32) (*buffer_sizeP))
|
||||
{
|
||||
status = mime_GrowBuffer (desired_buffer_size, sizeof(char), 1024,
|
||||
bufferP, buffer_sizeP);
|
||||
|
@ -161,8 +161,8 @@ mime_LineBuffer (const char *net_buffer, PRInt32 net_buffer_size,
|
|||
net_buffer_size > 0 && net_buffer[0] != LF) {
|
||||
/* The last buffer ended with a CR. The new buffer does not start
|
||||
with a LF. This old buffer should be shipped out and discarded. */
|
||||
PR_ASSERT(*buffer_sizeP > *buffer_fpP);
|
||||
if (*buffer_sizeP <= *buffer_fpP) return -1;
|
||||
PR_ASSERT((PRUint32) *buffer_sizeP > *buffer_fpP);
|
||||
if ((PRUint32) *buffer_sizeP <= *buffer_fpP) return -1;
|
||||
status = convert_and_send_buffer(*bufferP, *buffer_fpP,
|
||||
convert_newlines_p,
|
||||
per_line_fn, closure);
|
||||
|
@ -211,7 +211,7 @@ mime_LineBuffer (const char *net_buffer, PRInt32 net_buffer_size,
|
|||
const char *end = (newline ? newline : net_buffer_end);
|
||||
PRUint32 desired_size = (end - net_buffer) + (*buffer_fpP) + 1;
|
||||
|
||||
if (desired_size >= (*buffer_sizeP))
|
||||
if (desired_size >= (PRUint32) (*buffer_sizeP))
|
||||
{
|
||||
status = mime_GrowBuffer (desired_size, sizeof(char), 1024,
|
||||
bufferP, buffer_sizeP);
|
||||
|
|
|
@ -93,24 +93,7 @@
|
|||
|--- MimeExternalBody
|
||||
*/
|
||||
|
||||
/*
|
||||
* These are used by libmime to locate the plugins. It uses
|
||||
* a directory under the bin directory for libmime to contain
|
||||
* the plugins. This directory is defined by MIME_PLUGIN_DIR and
|
||||
* mime content handler plugins have a name prefixed by the
|
||||
* MIME_PLUGIN_PREFIX.
|
||||
*/
|
||||
#ifdef XP_WIN
|
||||
#define MIME_PLUGIN_PREFIX "mimect-"
|
||||
#else
|
||||
#define MIME_PLUGIN_PREFIX "libmimect-"
|
||||
#endif
|
||||
|
||||
#define MIME_PLUGIN_DIR "mimeplugins"
|
||||
|
||||
typedef struct {
|
||||
PRBool force_inline_display;
|
||||
} contentTypeHandlerInitStruct;
|
||||
#include "nsIMimeContentTypeHandler.h"
|
||||
|
||||
/*
|
||||
* These functions are exposed by libmime to be used by content type
|
||||
|
|
|
@ -28,6 +28,8 @@
|
|||
#include "plstr.h"
|
||||
#include "prio.h"
|
||||
#include "nsIPref.h"
|
||||
#include "msgCore.h"
|
||||
#include "nsCRT.h"
|
||||
|
||||
|
||||
#define HEADER_NNTP_POSTING_HOST "NNTP-Posting-Host"
|
||||
|
@ -231,7 +233,7 @@ static void mime_fix_up_html_address( char **addr)
|
|||
PR_ASSERT (*addr);
|
||||
lt = PL_strchr(*addr, '<');
|
||||
PR_ASSERT(lt);
|
||||
XP_MEMMOVE(lt+4, lt+1, newLen - 4 - (lt - *addr));
|
||||
nsCRT::memmove(lt+4, lt+1, newLen - 4 - (lt - *addr));
|
||||
*lt++ = '&';
|
||||
*lt++ = 'l';
|
||||
*lt++ = 't';
|
||||
|
@ -369,18 +371,18 @@ static void mime_insert_all_headers(char **body,
|
|||
|
||||
/* Back up over whitespace before the colon. */
|
||||
ocolon = colon;
|
||||
for (; colon > head && XP_IS_SPACE(colon[-1]); colon--)
|
||||
for (; colon > head && IS_SPACE(colon[-1]); colon--)
|
||||
;
|
||||
|
||||
contents = ocolon + 1;
|
||||
}
|
||||
|
||||
/* Skip over whitespace after colon. */
|
||||
while (contents <= end && XP_IS_SPACE(*contents))
|
||||
while (contents <= end && IS_SPACE(*contents))
|
||||
contents++;
|
||||
|
||||
/* Take off trailing whitespace... */
|
||||
while (end > contents && XP_IS_SPACE(end[-1]))
|
||||
while (end > contents && IS_SPACE(end[-1]))
|
||||
end--;
|
||||
|
||||
name = PR_MALLOC(colon - head + 1);
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include "nsMimeAddress.h"
|
||||
#include "comi18n.h"
|
||||
#include "nsMailHeaders.h"
|
||||
#include "msgCore.h"
|
||||
|
||||
extern "C" int MK_OUT_OF_MEMORY;
|
||||
extern "C" int MK_MSG_NO_HEADERS;
|
||||
|
@ -432,7 +433,7 @@ MimeHeaders_get (MimeHeaders *hdrs, const char *header_name,
|
|||
|
||||
/* Back up over whitespace before the colon. */
|
||||
ocolon = colon;
|
||||
for (; colon > head && XP_IS_SPACE(colon[-1]); colon--)
|
||||
for (; colon > head && IS_SPACE(colon[-1]); colon--)
|
||||
;
|
||||
|
||||
/* If the strings aren't the same length, it doesn't match. */
|
||||
|
@ -449,7 +450,7 @@ MimeHeaders_get (MimeHeaders *hdrs, const char *header_name,
|
|||
char *s;
|
||||
|
||||
/* Skip over whitespace after colon. */
|
||||
while (contents <= end && XP_IS_SPACE(*contents))
|
||||
while (contents <= end && IS_SPACE(*contents))
|
||||
contents++;
|
||||
|
||||
/* If we're supposed to strip at the frist token, pull `end' back to
|
||||
|
@ -458,7 +459,7 @@ MimeHeaders_get (MimeHeaders *hdrs, const char *header_name,
|
|||
if (strip_p)
|
||||
{
|
||||
for (s = contents;
|
||||
s <= end && *s != ';' && *s != ',' && !XP_IS_SPACE(*s);
|
||||
s <= end && *s != ';' && *s != ',' && !IS_SPACE(*s);
|
||||
s++)
|
||||
;
|
||||
end = s;
|
||||
|
@ -501,7 +502,7 @@ MimeHeaders_get (MimeHeaders *hdrs, const char *header_name,
|
|||
}
|
||||
|
||||
/* Take off trailing whitespace... */
|
||||
while (end > contents && XP_IS_SPACE(end[-1]))
|
||||
while (end > contents && IS_SPACE(end[-1]))
|
||||
end--;
|
||||
|
||||
if (end > contents)
|
||||
|
@ -556,7 +557,7 @@ MimeHeaders_get_parameter (const char *header_value, const char *parm_name,
|
|||
if (*str)
|
||||
str++;
|
||||
/* Skip over following whitespace */
|
||||
for (; *str && XP_IS_SPACE(*str); str++)
|
||||
for (; *str && IS_SPACE(*str); str++)
|
||||
;
|
||||
if (!*str)
|
||||
return 0;
|
||||
|
@ -568,24 +569,24 @@ MimeHeaders_get_parameter (const char *header_value, const char *parm_name,
|
|||
const char *value_start = str;
|
||||
const char *value_end = 0;
|
||||
|
||||
PR_ASSERT(!XP_IS_SPACE(*str)); /* should be after whitespace already */
|
||||
PR_ASSERT(!IS_SPACE(*str)); /* should be after whitespace already */
|
||||
|
||||
/* Skip forward to the end of this token. */
|
||||
for (; *str && !XP_IS_SPACE(*str) && *str != '=' && *str != ';'; str++)
|
||||
for (; *str && !IS_SPACE(*str) && *str != '=' && *str != ';'; str++)
|
||||
;
|
||||
token_end = str;
|
||||
|
||||
/* Skip over whitespace, '=', and whitespace */
|
||||
while (XP_IS_SPACE (*str)) str++;
|
||||
while (IS_SPACE (*str)) str++;
|
||||
if (*str == '=') str++;
|
||||
while (XP_IS_SPACE (*str)) str++;
|
||||
while (IS_SPACE (*str)) str++;
|
||||
|
||||
if (*str != '"')
|
||||
{
|
||||
/* The value is a token, not a quoted string. */
|
||||
value_start = str;
|
||||
for (value_end = str;
|
||||
*value_end && !XP_IS_SPACE (*value_end) && *value_end != ';';
|
||||
*value_end && !IS_SPACE (*value_end) && *value_end != ';';
|
||||
value_end++)
|
||||
;
|
||||
str = value_end;
|
||||
|
@ -711,9 +712,9 @@ MimeHeaders_get_parameter (const char *header_value, const char *parm_name,
|
|||
|
||||
/* str now points after the end of the value.
|
||||
skip over whitespace, ';', whitespace. */
|
||||
while (XP_IS_SPACE (*str)) str++;
|
||||
while (IS_SPACE (*str)) str++;
|
||||
if (*str == ';') str++;
|
||||
while (XP_IS_SPACE (*str)) str++;
|
||||
while (IS_SPACE (*str)) str++;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
@ -1199,7 +1200,7 @@ MimeHeaders_write_grouped_header_1 (MimeHeaders *hdrs, const char *name,
|
|||
|
||||
/* Skip over whitespace and commas. */
|
||||
while (this_start < data_end &&
|
||||
(XP_IS_SPACE (*this_start) || *this_start == ','))
|
||||
(IS_SPACE (*this_start) || *this_start == ','))
|
||||
this_start++;
|
||||
|
||||
this_end = this_start;
|
||||
|
@ -1522,7 +1523,7 @@ MimeHeaders_write_id_header_1 (MimeHeaders *hdrs, const char *name,
|
|||
while (this_end < data_end)
|
||||
{
|
||||
/* Skip over whitespace. */
|
||||
while (this_start < data_end && XP_IS_SPACE (*this_start))
|
||||
while (this_start < data_end && IS_SPACE (*this_start))
|
||||
this_start++;
|
||||
|
||||
this_end = this_start;
|
||||
|
@ -1616,7 +1617,7 @@ MimeHeaders_write_id_header_1 (MimeHeaders *hdrs, const char *name,
|
|||
else
|
||||
{
|
||||
char buf[50];
|
||||
XP_SPRINTF(buf, "%d", ++id_count);
|
||||
PR_snprintf(buf, sizeof(buf), "%d", ++id_count);
|
||||
s = PL_strdup(buf);
|
||||
if (!s)
|
||||
{
|
||||
|
@ -1942,18 +1943,18 @@ MimeHeaders_write_all_headers (MimeHeaders *hdrs, MimeDisplayOptions *opt, PRBoo
|
|||
|
||||
/* Back up over whitespace before the colon. */
|
||||
ocolon = colon;
|
||||
for (; colon > head && XP_IS_SPACE(colon[-1]); colon--)
|
||||
for (; colon > head && IS_SPACE(colon[-1]); colon--)
|
||||
;
|
||||
|
||||
contents = ocolon + 1;
|
||||
}
|
||||
|
||||
/* Skip over whitespace after colon. */
|
||||
while (contents <= end && XP_IS_SPACE(*contents))
|
||||
while (contents <= end && IS_SPACE(*contents))
|
||||
contents++;
|
||||
|
||||
/* Take off trailing whitespace... */
|
||||
while (end > contents && XP_IS_SPACE(end[-1]))
|
||||
while (end > contents && IS_SPACE(end[-1]))
|
||||
end--;
|
||||
|
||||
name = (char *)PR_MALLOC(colon - head + 1);
|
||||
|
@ -2078,7 +2079,7 @@ MimeHeaders_write_microscopic_headers (MimeHeaders *hdrs,
|
|||
|
||||
out = hdrs->obuffer;
|
||||
|
||||
XP_SPRINTF(out, "\
|
||||
PR_snprintf(out, sizeof(out), "\
|
||||
<TR><TD VALIGN=TOP BGCOLOR=\"#CCCCCC\" ALIGN=RIGHT><B>%s: </B></TD>\
|
||||
<TD VALIGN=TOP BGCOLOR=\"#CCCCCC\" width=100%%>\
|
||||
<table border=0 cellspacing=0 cellpadding=0 width=100%%><tr>\
|
||||
|
@ -2229,9 +2230,9 @@ MimeHeaders_write_citation_headers (MimeHeaders *hdrs, MimeDisplayOptions *opt)
|
|||
}
|
||||
|
||||
if (id)
|
||||
XP_SPRINTF(hdrs->obuffer, fmt, id, name);
|
||||
PR_snprintf(hdrs->obuffer, sizeof(hdrs->obuffer), fmt, id, name);
|
||||
else
|
||||
XP_SPRINTF(hdrs->obuffer, fmt, name);
|
||||
PR_snprintf(hdrs->obuffer, sizeof(hdrs->obuffer), fmt, name);
|
||||
|
||||
status = MimeHeaders_convert_rfc1522(opt, hdrs->obuffer,
|
||||
PL_strlen(hdrs->obuffer),
|
||||
|
@ -2414,7 +2415,7 @@ MimeHeaders_write_headers_html (MimeHeaders *hdrs, MimeDisplayOptions *opt, PRBo
|
|||
64 + /* 64 counts for two long number*/
|
||||
412); /* 412 counts for the following constant
|
||||
string. It is less than 412 */
|
||||
XP_SPRINTF(hdrs->obuffer + PL_strlen(hdrs->obuffer),
|
||||
PR_snprintf(hdrs->obuffer + PL_strlen(hdrs->obuffer), ( sizeof(hdrs->obuffer) - PL_strlen(hdrs->obuffer)),
|
||||
/* We set a CLIP=0,0,30,30 so that the attachment icon's layer cannot*/
|
||||
/* be exploited for header spoofing. This means that if the attachment */
|
||||
/* icon changes size, then we have to change this size too */
|
||||
|
@ -2449,7 +2450,7 @@ MimeHeaders_write_headers_html (MimeHeaders *hdrs, MimeDisplayOptions *opt, PRBo
|
|||
if (status >= 0) {
|
||||
#define MHTML_TITLE "<TITLE>%s</TITLE>\n"
|
||||
|
||||
XP_SPRINTF(hdrs->obuffer, MHTML_TITLE, t2);
|
||||
PR_snprintf(hdrs->obuffer, sizeof(hdrs->obuffer), MHTML_TITLE, t2);
|
||||
status = MimeHeaders_write(opt, hdrs->obuffer,
|
||||
PL_strlen(hdrs->obuffer));
|
||||
}
|
||||
|
@ -2521,7 +2522,7 @@ MIME_StripContinuations(char *original)
|
|||
{
|
||||
p2++;
|
||||
}
|
||||
while((*p2 == CR) || (*p2 == LF) || XP_IS_SPACE(*p2));
|
||||
while((*p2 == CR) || (*p2 == LF) || IS_SPACE(*p2));
|
||||
|
||||
if (*p2 == '\0') continue; /* drop out of loop at end of string*/
|
||||
}
|
||||
|
|
|
@ -50,10 +50,6 @@
|
|||
#include "mimetenr.h" /* | | | |--- MimeInlineTextEnriched */
|
||||
/* SUPPORTED VIA PLUGIN | | |--------- MimeInlineTextCalendar */
|
||||
|
||||
#ifdef RICHIE_VCARD
|
||||
#include "mimevcrd.h" /* | | |--------- MimeInlineTextVCard */
|
||||
#endif
|
||||
|
||||
#include "prefapi.h"
|
||||
#include "mimeiimg.h" /* | |--- MimeInlineImage */
|
||||
#include "mimeeobj.h" /* | |--- MimeExternalObject */
|
||||
|
@ -68,8 +64,12 @@
|
|||
#include "nsIPref.h"
|
||||
#include "nsCRT.h"
|
||||
#include "mimemoz2.h"
|
||||
#include "nsIMimeContentTypeHandler.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsVoidArray.h"
|
||||
|
||||
static NS_DEFINE_CID(kPrefCID, NS_PREF_CID);
|
||||
static NS_DEFINE_IID(kIMimeContentTypeHandlerIID, NS_IMIME_CONTENT_TYPE_HANDLER_IID);
|
||||
|
||||
/* ==========================================================================
|
||||
Allocation and destruction
|
||||
|
@ -82,229 +82,80 @@ static int mime_classinit(MimeObjectClass *clazz);
|
|||
* content type handlers in external plugins.
|
||||
*/
|
||||
typedef struct {
|
||||
char *content_type;
|
||||
char content_type[128];
|
||||
PRBool force_inline_display;
|
||||
char *file_name;
|
||||
PRLibrary *ct_handler;
|
||||
} cthandler_struct;
|
||||
|
||||
cthandler_struct *cthandler_list = NULL;
|
||||
PRInt32 plugin_count = -1;
|
||||
|
||||
/*
|
||||
* This will find the directory for content type handler plugins.
|
||||
*/
|
||||
PRBool
|
||||
find_plugin_directory(char *path, PRInt32 size)
|
||||
{
|
||||
#ifdef XP_PC
|
||||
char *ptr;
|
||||
|
||||
if (!GetModuleFileName(NULL, path, size))
|
||||
return PR_FALSE;
|
||||
ptr = PL_strrchr(path, '\\');
|
||||
if (ptr)
|
||||
*ptr = '\0';
|
||||
PL_strcat(path, "\\");
|
||||
PL_strcat(path, MIME_PLUGIN_DIR);
|
||||
return PR_TRUE;
|
||||
#else
|
||||
// First, find the home directory from the env.
|
||||
char *homedir = PR_GetEnv("MOZILLA_FIVE_HOME");
|
||||
if (homedir)
|
||||
{
|
||||
PL_strcat(path, homedir);
|
||||
PR_FREEIF(homedir);
|
||||
}
|
||||
else
|
||||
PL_strcat(path, ".");
|
||||
|
||||
PL_strcat(path, "/components");
|
||||
return PR_TRUE;
|
||||
#endif
|
||||
}
|
||||
nsVoidArray *ctHandlerList = NULL;
|
||||
PRBool foundIt = PR_FALSE;
|
||||
PRBool force_display = PR_FALSE;
|
||||
|
||||
PRBool
|
||||
create_file_name(const char *path, const char *name, char *fullName)
|
||||
EnumFunction(void* aElement, void *aData)
|
||||
{
|
||||
if ((!path) || (!name))
|
||||
cthandler_struct *ptr = (cthandler_struct *) aElement;
|
||||
char *ctPtr = (char *)aData;
|
||||
|
||||
if ( (!aElement) || (!aData) )
|
||||
return PR_TRUE;
|
||||
|
||||
if (PL_strcasecmp(ctPtr, ptr->content_type) == 0)
|
||||
{
|
||||
foundIt = PR_TRUE;
|
||||
force_display = ptr->force_inline_display;
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* This will return TRUE if the content_type is found in the
|
||||
* list, FALSE if it is not found.
|
||||
*/
|
||||
PRBool
|
||||
find_content_type_attribs(const char *content_type,
|
||||
PRBool *force_inline_display)
|
||||
{
|
||||
*force_inline_display = PR_FALSE;
|
||||
if (!ctHandlerList)
|
||||
return PR_FALSE;
|
||||
|
||||
#ifdef XP_PC
|
||||
PL_strcpy(fullName, path);
|
||||
PL_strcat(fullName, "\\");
|
||||
PL_strcat(fullName, name);
|
||||
return PR_TRUE;
|
||||
#else
|
||||
PL_strcpy(fullName, path);
|
||||
PL_strcat(fullName, "/");
|
||||
PL_strcat(fullName, name);
|
||||
return PR_TRUE;
|
||||
#endif
|
||||
foundIt = PR_FALSE;
|
||||
force_display = PR_FALSE;
|
||||
ctHandlerList->EnumerateForwards(EnumFunction, (void *)content_type);
|
||||
if (foundIt)
|
||||
*force_inline_display = force_display;
|
||||
|
||||
return (foundIt);
|
||||
}
|
||||
|
||||
/*
|
||||
* This will locate the number of content type handler plugins.
|
||||
*/
|
||||
PRInt32
|
||||
get_plugin_count(void)
|
||||
void
|
||||
add_content_type_attribs(const char *content_type,
|
||||
contentTypeHandlerInitStruct *ctHandlerInfo)
|
||||
{
|
||||
PRDirEntry *dirEntry;
|
||||
PRInt32 count = 0;
|
||||
PRDir *dir;
|
||||
char path[1024] = "";
|
||||
cthandler_struct *ptr = NULL;
|
||||
PRBool force_inline_display;
|
||||
|
||||
if (!find_plugin_directory(path, sizeof(path)))
|
||||
return 0;
|
||||
if (find_content_type_attribs(content_type, &force_inline_display))
|
||||
return;
|
||||
|
||||
dir = PR_OpenDir(path);
|
||||
if (!dir)
|
||||
return count;
|
||||
if ( (!content_type) || (!ctHandlerInfo) )
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
dirEntry = PR_ReadDir(dir, PR_SKIP_BOTH);
|
||||
if (!dirEntry)
|
||||
break;
|
||||
if (!ctHandlerList)
|
||||
ctHandlerList = new nsVoidArray();
|
||||
|
||||
if (PL_strncasecmp(MIME_PLUGIN_PREFIX, dirEntry->name, PL_strlen(MIME_PLUGIN_PREFIX)) == 0)
|
||||
++count;
|
||||
} while (dirEntry != NULL);
|
||||
if (!ctHandlerList)
|
||||
return;
|
||||
|
||||
PR_CloseDir(dir);
|
||||
return count;
|
||||
}
|
||||
ptr = (cthandler_struct *) PR_MALLOC(sizeof(cthandler_struct));
|
||||
if (!ptr)
|
||||
return;
|
||||
|
||||
char *
|
||||
get_content_type(cthandler_struct *ct)
|
||||
{
|
||||
mime_get_ct_fn_type getct_fn;
|
||||
|
||||
if (!ct)
|
||||
return NULL;
|
||||
|
||||
getct_fn = (mime_get_ct_fn_type) PR_FindSymbol(ct->ct_handler, "MIME_GetContentType");
|
||||
if (!getct_fn)
|
||||
return NULL;
|
||||
|
||||
return ( (getct_fn) () );
|
||||
}
|
||||
|
||||
MimeObjectClass *
|
||||
create_content_type_handler_class(cthandler_struct *ct)
|
||||
{
|
||||
contentTypeHandlerInitStruct ctHandlerInfo;
|
||||
mime_create_class_fn_type class_fn;
|
||||
MimeObjectClass *retClass = NULL;
|
||||
|
||||
if (!ct)
|
||||
return NULL;
|
||||
|
||||
class_fn = (mime_create_class_fn_type) PR_FindSymbol(ct->ct_handler, "MIME_CreateContentTypeHandlerClass");
|
||||
if (class_fn)
|
||||
{
|
||||
retClass = (class_fn)(ct->content_type, &ctHandlerInfo);
|
||||
ct->force_inline_display = ctHandlerInfo.force_inline_display;
|
||||
}
|
||||
|
||||
return retClass;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to initialize a table of external modules and
|
||||
* the content type that it will process. What we will do is check
|
||||
* the directory "mimeplugins" under the location where this DLL is
|
||||
* running. Any DLL in that directory will have the naming convention:
|
||||
*
|
||||
* mimect-mycontenttype.dll - where mycontenttype is the content type being
|
||||
* processed.
|
||||
*
|
||||
* This DLL will have specifically defined entry points to be used by
|
||||
* libmime for processing the data stream.
|
||||
*/
|
||||
PRInt32
|
||||
do_plugin_discovery(void)
|
||||
{
|
||||
PRDirEntry *dirEntry;
|
||||
PRInt32 count = 0;
|
||||
PRDir *dir;
|
||||
char path[1024] = "";
|
||||
char full_name[1024] = "";
|
||||
|
||||
if (!find_plugin_directory(path, sizeof(path)))
|
||||
return 0;
|
||||
|
||||
count = get_plugin_count();
|
||||
if (count <= 0)
|
||||
return 0;
|
||||
|
||||
cthandler_list = (cthandler_struct *) PR_MALLOC(count * sizeof(cthandler_struct));
|
||||
if (!cthandler_list)
|
||||
return 0;
|
||||
XP_MEMSET(cthandler_list, 0, (count * sizeof(cthandler_struct)));
|
||||
|
||||
dir = PR_OpenDir(path);
|
||||
if (!dir)
|
||||
return 0;
|
||||
|
||||
count = 0;
|
||||
do
|
||||
{
|
||||
dirEntry = PR_ReadDir(dir, PR_SKIP_BOTH );
|
||||
if (!dirEntry)
|
||||
break;
|
||||
|
||||
if (PL_strncasecmp(MIME_PLUGIN_PREFIX, dirEntry->name, PL_strlen(MIME_PLUGIN_PREFIX)) == 0)
|
||||
{
|
||||
if (!create_file_name(path, dirEntry->name, full_name))
|
||||
continue;
|
||||
|
||||
cthandler_list[count].ct_handler = PR_LoadLibrary(full_name);
|
||||
if (!cthandler_list[count].ct_handler)
|
||||
continue;
|
||||
|
||||
cthandler_list[count].file_name = PL_strdup(full_name);
|
||||
if (!cthandler_list[count].file_name)
|
||||
{
|
||||
PR_UnloadLibrary(cthandler_list[count].ct_handler);
|
||||
continue;
|
||||
}
|
||||
|
||||
cthandler_list[count].content_type = PL_strdup(get_content_type(&(cthandler_list[count])));
|
||||
if (!cthandler_list[count].content_type)
|
||||
{
|
||||
PR_UnloadLibrary(cthandler_list[count].ct_handler);
|
||||
PR_FREEIF(cthandler_list[count].file_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
++count;
|
||||
}
|
||||
} while (dirEntry != NULL);
|
||||
|
||||
PR_CloseDir(dir);
|
||||
return count;
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine will find all content type handler for a specifc content
|
||||
* type (if it exists)
|
||||
*/
|
||||
MimeObjectClass *
|
||||
mime_locate_external_content_handler(const char *content_type)
|
||||
{
|
||||
PRInt32 i;
|
||||
|
||||
if (plugin_count < 0)
|
||||
plugin_count = do_plugin_discovery();
|
||||
|
||||
for (i=0; i<plugin_count; i++)
|
||||
{
|
||||
if (PL_strcasecmp(content_type, cthandler_list[i].content_type) == 0)
|
||||
return( create_content_type_handler_class((&cthandler_list[i])) );
|
||||
}
|
||||
|
||||
return NULL;
|
||||
PL_strncpy(ptr->content_type, content_type, sizeof(ptr->content_type));
|
||||
ptr->force_inline_display = ctHandlerInfo->force_inline_display;
|
||||
ctHandlerList->AppendElement(ptr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -314,17 +165,40 @@ mime_locate_external_content_handler(const char *content_type)
|
|||
PRBool
|
||||
force_inline_display(const char *content_type)
|
||||
{
|
||||
PRInt32 i;
|
||||
PRBool force_inline_display;
|
||||
|
||||
for (i=0; i<plugin_count; i++)
|
||||
{
|
||||
if (PL_strcasecmp(content_type, cthandler_list[i].content_type) == 0)
|
||||
return( cthandler_list[i].force_inline_display );
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
find_content_type_attribs(content_type, &force_inline_display);
|
||||
return (force_inline_display);
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine will find all content type handler for a specifc content
|
||||
* type (if it exists) and is defined to the nsRegistry
|
||||
*/
|
||||
MimeObjectClass *
|
||||
mime_locate_external_content_handler(const char *content_type,
|
||||
contentTypeHandlerInitStruct *ctHandlerInfo)
|
||||
{
|
||||
MimeObjectClass *newObj = NULL;
|
||||
nsCID classID = {0};
|
||||
char lookupID[256];
|
||||
nsIMimeContentTypeHandler *ctHandler = NULL;
|
||||
|
||||
PR_snprintf(lookupID, sizeof(lookupID), "mimecth:%s", content_type);
|
||||
if (nsComponentManager::ProgIDToCLSID(lookupID, &classID) != NS_OK)
|
||||
return NULL;
|
||||
|
||||
nsComponentManager::CreateInstance(classID, (nsISupports *)nsnull, kIMimeContentTypeHandlerIID,
|
||||
(void **)&ctHandler);
|
||||
if (ctHandler == NULL)
|
||||
return NULL;
|
||||
|
||||
if (NS_OK != ctHandler->CreateContentTypeHandlerClass(content_type, ctHandlerInfo, &newObj))
|
||||
return NULL;
|
||||
|
||||
add_content_type_attribs(content_type, ctHandlerInfo);
|
||||
return newObj;
|
||||
}
|
||||
|
||||
/* This is necessary to expose the MimeObject method outside of this DLL */
|
||||
int
|
||||
|
@ -399,13 +273,13 @@ mime_free (MimeObject *object)
|
|||
PR_Free(object);
|
||||
}
|
||||
|
||||
|
||||
MimeObjectClass *
|
||||
mime_find_class (const char *content_type, MimeHeaders *hdrs,
|
||||
MimeDisplayOptions *opts, PRBool exact_match_p)
|
||||
{
|
||||
MimeObjectClass *clazz = 0;
|
||||
MimeObjectClass *tempClass = 0;
|
||||
contentTypeHandlerInitStruct ctHandlerInfo;
|
||||
|
||||
/*
|
||||
* What we do first is check for an external content handler plugin.
|
||||
|
@ -414,7 +288,7 @@ mime_find_class (const char *content_type, MimeHeaders *hdrs,
|
|||
* for specific content types. If one is not found, we will drop back
|
||||
* to the default handler.
|
||||
*/
|
||||
if ((tempClass = mime_locate_external_content_handler(content_type)) != NULL)
|
||||
if ((tempClass = mime_locate_external_content_handler(content_type, &ctHandlerInfo)) != NULL)
|
||||
{
|
||||
clazz = (MimeObjectClass *)tempClass;
|
||||
}
|
||||
|
@ -436,12 +310,6 @@ mime_find_class (const char *content_type, MimeHeaders *hdrs,
|
|||
clazz = (MimeObjectClass *)&mimeInlineTextRichtextClass;
|
||||
else if (!PL_strcasecmp(content_type+5, "plain"))
|
||||
clazz = (MimeObjectClass *)&mimeInlineTextPlainClass;
|
||||
|
||||
#ifdef RICHIE_VCARD
|
||||
else if (!PL_strcasecmp(content_type+5, "x-vcard"))
|
||||
clazz = (MimeObjectClass *)&mimeInlineTextVCardClass;
|
||||
#endif
|
||||
|
||||
else if (!exact_match_p)
|
||||
clazz = (MimeObjectClass *)&mimeInlineTextPlainClass;
|
||||
}
|
||||
|
@ -701,14 +569,6 @@ mime_create (const char *content_type, MimeHeaders *hdrs,
|
|||
|
||||
else
|
||||
{
|
||||
/* change content-Disposition for vcards to be inline so */
|
||||
/* we can see a nice html display */
|
||||
#ifdef RICHIE_VCARD
|
||||
if (mime_subclass_p(clazz,(MimeObjectClass *)&mimeInlineTextVCardClass))
|
||||
mime_SACopy(&content_disposition, "inline");
|
||||
else
|
||||
#endif
|
||||
|
||||
/* Check to see if the plugin should override the content disposition
|
||||
to make it appear inline. One example is a vcard which has a content
|
||||
disposition of an "attachment;" */
|
||||
|
@ -848,7 +708,7 @@ mime_part_address(MimeObject *obj)
|
|||
return 0;
|
||||
}
|
||||
|
||||
XP_SPRINTF(buf, "%ld", j);
|
||||
PR_snprintf(buf, sizeof(buf), "%ld", j);
|
||||
if (obj->parent->parent)
|
||||
{
|
||||
higher = mime_part_address(obj->parent);
|
||||
|
|
|
@ -198,8 +198,20 @@ mime_convert_rfc1522 (const char *input_line, PRInt32 input_length,
|
|||
|
||||
if (converted)
|
||||
{
|
||||
*output_ret = converted;
|
||||
*output_size_ret = PL_strlen(converted);
|
||||
char *convertedString = NULL;
|
||||
|
||||
PRInt32 res = MIME_ConvertString(charset, "UTF-8", converted, &convertedString);
|
||||
if ( (res != 0) || (!convertedString) )
|
||||
{
|
||||
*output_ret = converted;
|
||||
*output_size_ret = PL_strlen(converted);
|
||||
}
|
||||
else
|
||||
{
|
||||
PR_Free(converted);
|
||||
*output_ret = convertedString;
|
||||
*output_size_ret = PL_strlen(converted);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -973,16 +985,6 @@ extern int MIME_HasAttachments(MWContext *context)
|
|||
return (context->mime_data && context->mime_data->last_parsed_object->showAttachmentIcon);
|
||||
}
|
||||
|
||||
/* RICHIE
|
||||
* HOW WILL THIS BE HANDLED GOING FORWARD????
|
||||
*/
|
||||
PRBool
|
||||
ValidateDocData(MWContext *window_id)
|
||||
{
|
||||
printf("ValidateDocData not implemented, stubbed in webshell/tests/viewer/nsStubs.cpp\n");
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
/**************************************************************
|
||||
**************************************************************
|
||||
**************************************************************
|
||||
|
@ -1155,8 +1157,8 @@ mime_bridge_create_stream(MimePluginInstance *newPluginObj,
|
|||
msd->options->headers = MimeHeadersAll;
|
||||
|
||||
// Get the libmime prefs...
|
||||
MIME_NoInlineAttachments = PR_TRUE; // false - no attachment display
|
||||
// true - attachment display
|
||||
MIME_NoInlineAttachments = PR_TRUE; // false - display as links
|
||||
// true - display attachment
|
||||
if (msd->prefs)
|
||||
msd->prefs->GetBoolPref("mail.inline_attachments", &MIME_NoInlineAttachments);
|
||||
MIME_NoInlineAttachments = !MIME_NoInlineAttachments;
|
||||
|
@ -1267,6 +1269,27 @@ mime_bridge_create_stream(MimePluginInstance *newPluginObj,
|
|||
|
||||
msd->options->variable_width_plaintext_p = MIME_VariableWidthPlaintext;
|
||||
|
||||
//
|
||||
// Charset overrides takes place here
|
||||
//
|
||||
// We have a bool pref (mail.override_charset) to deal with incorrectly labeled mails.
|
||||
// 1) If false and the part header is specified then use the charset in the header.
|
||||
// 2) If false and the part header has no charset the use the charset in the pref.
|
||||
// We may also apply the charset detection.
|
||||
// 3) If false then only use the charset in pref and ignore all other information.
|
||||
//
|
||||
PRBool overrideCharset = FALSE;
|
||||
|
||||
msd->prefs->GetBoolPref("mail.force_charset", &overrideCharset);
|
||||
if (overrideCharset)
|
||||
{
|
||||
char charset[256];
|
||||
int length = sizeof(charset);
|
||||
|
||||
msd->prefs->GetCharPref("mail.charset", charset, &length);
|
||||
msd->options->override_charset = PL_strdup(charset);
|
||||
}
|
||||
|
||||
/* ### mwelch We want FO_EDT_SAVE_IMAGE to behave like *_SAVE_AS here
|
||||
because we're spooling untranslated raw data. */
|
||||
if (format_out == FO_SAVE_AS ||
|
||||
|
|
|
@ -92,10 +92,8 @@ MimeInlineText_initialize (MimeObject *obj)
|
|||
{
|
||||
if (obj->options && obj->options->default_charset)
|
||||
text->charset = PL_strdup(obj->options->default_charset);
|
||||
|
||||
/* Do not label US-ASCII if the app default charset is multibyte.
|
||||
Perhaps US-ASCII label should be removed for all cases.
|
||||
*/
|
||||
// Do not label US-ASCII if the app default charset is multibyte.
|
||||
// Perhaps US-ASCII label should be removed for all cases.
|
||||
else if (MULTIBYTE & INTL_DefaultDocCharSetID(0))
|
||||
;
|
||||
else
|
||||
|
|
|
@ -221,7 +221,9 @@ extern "C" NS_EXPORT nsresult NSRegisterSelf(nsISupports* aServMgr, const char *
|
|||
(nsISupports**)&compMgr);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("*** The NEW and Improved Mime being registered\n");
|
||||
#endif
|
||||
|
||||
// Content type handler object class access interface
|
||||
rv = compMgr->RegisterComponent(kCMimeMimeObjectClassAccessCID, NULL, NULL, path,
|
||||
|
|
Загрузка…
Ссылка в новой задаче