diff --git a/mozilla/mailnews/mime/src/Makefile.in b/mozilla/mailnews/mime/src/Makefile.in
index 1da94692d9a..2a388903341 100644
--- a/mozilla/mailnews/mime/src/Makefile.in
+++ b/mozilla/mailnews/mime/src/Makefile.in
@@ -45,6 +45,7 @@ EXPORTS =\
$(NULL)
CPPSRCS = \
+ nsMimeURLUtils.cpp \
nsMimeFactory.cpp \
nsMimeObjectClassAccess.cpp \
nsMimeConverter.cpp \
diff --git a/mozilla/mailnews/mime/src/makefile.win b/mozilla/mailnews/mime/src/makefile.win
index 50d630bdebf..a10b10c7ac9 100644
--- a/mozilla/mailnews/mime/src/makefile.win
+++ b/mozilla/mailnews/mime/src/makefile.win
@@ -42,7 +42,7 @@ DEPTH=..\..\..
MODULE = mime
REQUIRES=
#EXPORTS =\
-# $(NULL)
+# $(NULL)
#DEFINES= -DEBUG_rhp -DHAVE_MIME_DATA_SLOT -D_IMPL_NS_HTML
@@ -96,6 +96,7 @@ OBJS= \
.\$(OBJDIR)\mimecom.obj \
.\$(OBJDIR)\mimemoz2.obj \
.\$(OBJDIR)\nsMsgHeaderParser.obj \
+ .\$(OBJDIR)\nsMimeURLUtils.obj \
#
# THIS WILL NEED WORK AFTER WE GET A LIBMSG MORE XP-COM-afied
# .\$(OBJDIR)\mimedrft.obj \
diff --git a/mozilla/mailnews/mime/src/mimehdrs.cpp b/mozilla/mailnews/mime/src/mimehdrs.cpp
index 973a1acfe49..a96fe067823 100644
--- a/mozilla/mailnews/mime/src/mimehdrs.cpp
+++ b/mozilla/mailnews/mime/src/mimehdrs.cpp
@@ -38,6 +38,7 @@
#include "comi18n.h"
#include "nsMailHeaders.h"
#include "msgCore.h"
+#include "nsMimeURLUtils.h"
extern "C" int MK_OUT_OF_MEMORY;
extern "C" int MK_MSG_NO_HEADERS;
@@ -1041,11 +1042,21 @@ MimeHeaders_write_random_header_1 (MimeHeaders *hdrs,
Note: this function does no charset conversion; that has
already been done.
*/
+/*RICHIE
status = nsScanForURLs (
contents, contents_length, out,
hdrs->obuffer_size - (out - hdrs->obuffer) -10,
PR_TRUE);
if (status < 0) return status;
+*/
+ nsMimeURLUtils myUtil;
+
+ status = myUtil.ScanForURLs(contents, contents_length, out,
+ hdrs->obuffer_size - (out - hdrs->obuffer) -10,
+ PR_TRUE);
+ if (status != NS_OK)
+ return status;
+
out += PL_strlen(out);
PR_ASSERT(out < (hdrs->obuffer + hdrs->obuffer_size));
@@ -2112,11 +2123,13 @@ MimeHeaders_write_microscopic_headers (MimeHeaders *hdrs,
PL_strcpy(out, ":
");
out += PL_strlen(out);
if (subj) {
- status = nsScanForURLs(
+ nsMimeURLUtils myUtil;
+
+ status = myUtil.ScanForURLs(
subj, PL_strlen(subj), out,
hdrs->obuffer_size - (out - hdrs->obuffer) - 10,
PR_TRUE);
- if (status < 0) goto FAIL;
+ if (status != NS_OK) goto FAIL;
} else {
PL_strcpy(out, " ");
}
diff --git a/mozilla/mailnews/mime/src/mimemrel.cpp b/mozilla/mailnews/mime/src/mimemrel.cpp
index a43c21e72c1..494e37b2357 100644
--- a/mozilla/mailnews/mime/src/mimemrel.cpp
+++ b/mozilla/mailnews/mime/src/mimemrel.cpp
@@ -111,6 +111,7 @@
#include "nsCRT.h"
#include "msgCore.h"
#include "nsCOMPtr.h"
+#include "nsMimeURLUtils.h"
extern "C" int MK_UNABLE_TO_OPEN_TMP_FILE;
@@ -343,42 +344,13 @@ MimeThisIsStartPart(MimeObject *obj, MimeObject* child)
PUBLIC char *
MakeAbsoluteURL(char * absolute_url, char * relative_url)
{
- return nsMakeAbsoluteURL(absolute_url, relative_url);
+ nsMimeURLUtils myUtil;
+ char *retString;
- /***
-
- nsString aBaseURL(absolute_url);
- nsString aSpec(relative_url);
- nsString aResult;
- nsIURL *url = nsnull;
- char *retVal;
-
- nsCOMPtr tmpURL;
- nsresult rv = NS_NewURL(getter_AddRefs(tmpURL), aBaseURL);
- if (NS_FAILED(rv))
- return NULL;
-
- rv = NS_MakeAbsoluteURL(tmpURL, aBaseURL, aSpec, aResult);
-
- if (rv != NS_OK)
- return NULL;
+ if (myUtil.MakeAbsoluteURL(absolute_url, relative_url, &retString) == NS_OK)
+ return retString;
else
- return (aResult.ToNewCString());
-
- nsresult err = NS_NewURL(&url, aSpec, aBaseURL);
- if (err != NS_OK)
return NULL;
-
- if (NS_OK != url->GetSpec(&retVal))
- return NULL;
-
- return retVal;
-
- if (NS_OK != NS_MakeAbsoluteURL(nsnull, aBaseURL, aSpec, aResult))
- return NULL;
- else
- return (aResult.ToNewCString());
-*/
}
static PRBool
diff --git a/mozilla/mailnews/mime/src/mimetpla.cpp b/mozilla/mailnews/mime/src/mimetpla.cpp
index 6f32f034ada..200adf5fc46 100644
--- a/mozilla/mailnews/mime/src/mimetpla.cpp
+++ b/mozilla/mailnews/mime/src/mimetpla.cpp
@@ -21,6 +21,7 @@
#include "prmem.h"
#include "plstr.h"
#include "nsMimeTransition.h"
+#include "nsMimeURLUtils.h"
#define MIME_SUPERCLASS mimeInlineTextClass
MimeDefClass(MimeInlineTextPlain, MimeInlineTextPlainClass,
@@ -125,11 +126,15 @@ MimeInlineTextPlain_parse_line (char *line, PRInt32 length, MimeObject *obj)
been done.
*/
*obj->obuffer = 0;
- status = nsScanForURLs (
- line, length, obj->obuffer, obj->obuffer_size - 10,
- (obj->options ?
- obj->options->dont_touch_citations_p : PR_FALSE));
- if (status < 0) return status;
+
+ nsMimeURLUtils myUtil;
+
+ status = myUtil.ScanForURLs(line, length, obj->obuffer, obj->obuffer_size - 10,
+ (obj->options ?
+ obj->options->dont_touch_citations_p : PR_FALSE));
+ if (status != NS_OK)
+ return status;
+
PR_ASSERT(*line == 0 || *obj->obuffer);
return MimeObject_write(obj, obj->obuffer, PL_strlen(obj->obuffer), PR_TRUE);
}
diff --git a/mozilla/mailnews/mime/src/nsMimeFactory.cpp b/mozilla/mailnews/mime/src/nsMimeFactory.cpp
index 146a5048618..cfadf57e9b9 100644
--- a/mozilla/mailnews/mime/src/nsMimeFactory.cpp
+++ b/mozilla/mailnews/mime/src/nsMimeFactory.cpp
@@ -48,6 +48,9 @@ static NS_DEFINE_CID(kINetPluginMIMECID, NS_INET_PLUGIN_MIME_CID);
#include "nsMsgHeaderParser.h"
static NS_DEFINE_CID(kCMsgHeaderParserCID, NS_MSGHEADERPARSER_CID);
+#include "nsMimeURLUtils.h"
+static NS_DEFINE_CID(kCIMimeURLUtilsCID, NS_IMIME_URLUTILS_CID);
+
////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////
@@ -154,6 +157,12 @@ nsresult nsMimeFactory::CreateInstance(nsISupports *aOuter, const nsIID &aIID, v
{
res = NS_NewHeaderParser((nsIMsgHeaderParser **) &inst);
}
+ else if (mClassID.Equals(kCIMimeURLUtilsCID))
+ {
+ res = NS_NewMimeURLUtils((nsIMimeURLUtils **) &inst);
+ if (res != NS_OK) // was there a problem creating the object ?
+ return res;
+ }
// End of checking the interface ID code....
if (inst)
diff --git a/mozilla/mailnews/mime/src/nsMimeTransition.cpp b/mozilla/mailnews/mime/src/nsMimeTransition.cpp
index c754a287cf6..cdcc77f7ad0 100644
--- a/mozilla/mailnews/mime/src/nsMimeTransition.cpp
+++ b/mozilla/mailnews/mime/src/nsMimeTransition.cpp
@@ -89,770 +89,3 @@ NET_cinfo_find_info_by_type (char *uri)
{
return NULL;
}
-
-/* from libnet/mkutils.c */
-PRInt32
-URL_Type (const char *URL)
-{
- if (!URL || (URL && *URL == '\0'))
- return(PR_FALSE);
-
- switch(*URL) {
- case 'a':
- case 'A':
- if(!PL_strncasecmp(URL,"about:security", 14))
- return(SECURITY_TYPE_URL);
- else if(!PL_strncasecmp(URL,"about:",6))
- return(ABOUT_TYPE_URL);
- break;
- case 'f':
- case 'F':
- if(!PL_strncasecmp(URL,"ftp:",4))
- return(FTP_TYPE_URL);
- else if(!PL_strncasecmp(URL,"file:",5))
- return(FILE_TYPE_URL);
- break;
- case 'g':
- case 'G':
- if(!PL_strncasecmp(URL,"gopher:",7))
- return(GOPHER_TYPE_URL);
- break;
- case 'h':
- case 'H':
- if(!PL_strncasecmp(URL,"http:",5))
- return(HTTP_TYPE_URL);
- else if(!PL_strncasecmp(URL,"https:",6))
- return(SECURE_HTTP_TYPE_URL);
- break;
- case 'i':
- case 'I':
- if(!PL_strncasecmp(URL,"internal-gopher-",16))
- return(INTERNAL_IMAGE_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-news-",14))
- return(INTERNAL_IMAGE_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-edit-",14))
- return(INTERNAL_IMAGE_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-attachment-",20))
- return(INTERNAL_IMAGE_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-dialog-handler",23))
- return(HTML_DIALOG_HANDLER_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-panel-handler",22))
- return(HTML_PANEL_HANDLER_TYPE_URL);
- else if(!PL_strncasecmp(URL,"internal-security-",18))
- return(INTERNAL_SECLIB_TYPE_URL);
- else if(!PL_strncasecmp(URL,"IMAP:",5))
- return(IMAP_TYPE_URL);
- break;
- case 'j':
- case 'J':
- if(!PL_strncasecmp(URL, "javascript:",11))
- return(MOCHA_TYPE_URL);
- break;
- case 'l':
- case 'L':
- if(!PL_strncasecmp(URL, "livescript:",11))
- return(MOCHA_TYPE_URL);
- break;
- case 'm':
- case 'M':
- if(!PL_strncasecmp(URL,"mailto:",7))
- return(MAILTO_TYPE_URL);
- else if(!PL_strncasecmp(URL,"mailbox:",8))
- return(MAILBOX_TYPE_URL);
- else if(!PL_strncasecmp(URL, "mocha:",6))
- return(MOCHA_TYPE_URL);
- break;
- case 'n':
- case 'N':
- if(!PL_strncasecmp(URL,"news:",5))
- return(NEWS_TYPE_URL);
-#ifdef NFS_TYPE_URL
- else if(!PL_strncasecmp(URL,"nfs:",4))
- return(NFS_TYPE_URL);
-#endif /* NFS_TYPE_URL */
- break;
- case 'p':
- case 'P':
- if(!PL_strncasecmp(URL,"pop3:",5))
- return(POP3_TYPE_URL);
- break;
- case 'r':
- case 'R':
- if(!PL_strncasecmp(URL,"rlogin:",7))
- return(RLOGIN_TYPE_URL);
- break;
- case 's':
- case 'S':
- if(!PL_strncasecmp(URL,"snews:",6))
- return(NEWS_TYPE_URL);
- case 't':
- case 'T':
- if(!PL_strncasecmp(URL,"telnet:",7))
- return(TELNET_TYPE_URL);
- else if(!PL_strncasecmp(URL,"tn3270:",7))
- return(TN3270_TYPE_URL);
- break;
- case 'v':
- case 'V':
- if(!PL_strncasecmp(URL, VIEW_SOURCE_URL_PREFIX,
- sizeof(VIEW_SOURCE_URL_PREFIX)-1))
- return(VIEW_SOURCE_TYPE_URL);
- break;
- case 'w':
- case 'W':
- if(!PL_strncasecmp(URL,"wais:",5))
- return(WAIS_TYPE_URL);
- break;
- case 'u':
- case 'U':
- if(!PL_strncasecmp(URL,"URN:",4))
- return(URN_TYPE_URL);
- break;
-
- }
-
- /* no type match :( */
- return(0);
-}
-
-extern "C" int
-nsScanForURLs(const char *input, int32 input_size,
- char *output, int output_size, XP_Bool urls_only)
-{
- int col = 0;
- const char *cp;
- const char *end = input + input_size;
- char *output_ptr = output;
- char *end_of_buffer = output + output_size - 40; /* add safty zone :( */
- Bool line_is_citation = PR_FALSE;
- const char *cite_open1, *cite_close1;
- const char *cite_open2, *cite_close2;
- const char* color = NULL;
-
- if (urls_only)
- {
- cite_open1 = cite_close1 = "";
- cite_open2 = cite_close2 = "";
- }
- else
- {
- cite_open1 = "", cite_close1 = "";
- cite_open2 = cite_close2 = "";
-
-/********** RICHIE_CITATION
- MSG_Prefs* prefs;
- MSG_FONT font = MSG_ItalicFont;
- MSG_CITATION_SIZE size = MSG_NormalSize;
-
- if (pane) {
- prefs = MSG_GetPrefs(pane);
- MSG_GetCitationStyle(prefs, &font, &size, &color);
- }
- switch (font)
- {
- case MSG_PlainFont:
- cite_open1 = "", cite_close1 = "";
- break;
- case MSG_BoldFont:
- cite_open1 = "", cite_close1 = "";
- break;
- case MSG_ItalicFont:
- cite_open1 = "", cite_close1 = "";
- break;
- case MSG_BoldItalicFont:
- cite_open1 = "", cite_close1 = "";
- break;
- default:
- PR_ASSERT(0);
- cite_open1 = cite_close1 = "";
- break;
- }
-
- switch (size)
- {
- case MSG_NormalSize:
- cite_open2 = "", cite_close2 = "";
- break;
- case MSG_Bigger:
- cite_open2 = "", cite_close2 = "";
- break;
- case MSG_Smaller:
- cite_open2 = "", cite_close2 = "";
- break;
- default:
- PR_ASSERT(0);
- cite_open2 = cite_close2 = "";
- break;
- }
-**********************/
- }
-
- if (!urls_only)
- {
- /* Decide whether this line is a quotation, and should be italicized.
- This implements the following case-sensitive regular expression:
-
- ^[ \t]*[A-Z]*[]>]
-
- Which matches these lines:
-
- > blah blah blah
- > blah blah blah
- LOSER> blah blah blah
- LOSER] blah blah blah
- */
- const char *s = input;
- while (s < end && IS_SPACE (*s)) s++;
- while (s < end && *s >= 'A' && *s <= 'Z') s++;
-
- if (s >= end)
- ;
- else if (input_size >= 6 && *s == '>' &&
- !PL_strncmp (input, ">From ", 6)) /* #$%^ing sendmail... */
- ;
- else if (*s == '>' || *s == ']')
- {
- line_is_citation = PR_TRUE;
- PL_strcpy(output_ptr, cite_open1);
- output_ptr += PL_strlen(cite_open1);
- PL_strcpy(output_ptr, cite_open2);
- output_ptr += PL_strlen(cite_open2);
- if (color &&
- output_ptr + PL_strlen(color) + 20 < end_of_buffer) {
- PL_strcpy(output_ptr, "");
- output_ptr += PL_strlen(output_ptr);
- }
- }
- }
-
- /* Normal lines are scanned for buried references to URL's
- Unfortunately, it may screw up once in a while (nobody's perfect)
- */
- for(cp = input; cp < end && output_ptr < end_of_buffer; cp++)
- {
- /* if URL_Type returns true then it is most likely a URL
- But only match protocol names if at the very beginning of
- the string, or if the preceeding character was not alphanumeric;
- this lets us match inside "---HTTP://XXX" but not inside of
- things like "NotHTTP://xxx"
- */
- int type = 0;
- if(!IS_SPACE(*cp) &&
- (cp == input || (!IS_ALPHA(cp[-1]) && !IS_DIGIT(cp[-1]))) &&
- (type = URL_Type(cp)) != 0)
- {
- const char *cp2;
- for(cp2=cp; cp2 < end; cp2++)
- {
- /* These characters always mark the end of the URL. */
- if (IS_SPACE(*cp2) ||
- *cp2 == '<' || *cp2 == '>' ||
- *cp2 == '`' || *cp2 == ')' ||
- *cp2 == '\'' || *cp2 == '"' ||
- *cp2 == ']' || *cp2 == '}'
- )
- break;
-
- }
-
- /* Check for certain punctuation characters on the end, and strip
- them off. */
- while (cp2 > cp &&
- (cp2[-1] == '.' || cp2[-1] == ',' || cp2[-1] == '!' ||
- cp2[-1] == ';' || cp2[-1] == '-' || cp2[-1] == '?' ||
- cp2[-1] == '#'))
- cp2--;
-
- col += (cp2 - cp);
-
- /* if the url is less than 7 characters then we screwed up
- * and got a "news:" url or something which is worthless
- * to us. Exclude the A tag in this case.
- *
- * Also exclude any URL that ends in a colon; those tend
- * to be internal and magic and uninteresting.
- *
- * And also exclude the builtin icons, whose URLs look
- * like "internal-gopher-binary".
- */
- if (cp2-cp < 7 ||
- (cp2 > cp && cp2[-1] == ':') ||
- !PL_strncmp(cp, "internal-", 9))
- {
- nsCRT::memcpy(output_ptr, cp, cp2-cp);
- output_ptr += (cp2-cp);
- *output_ptr = 0;
- }
- else
- {
- char *quoted_url;
- PRInt32 size_left = output_size - (output_ptr-output);
-
- if(cp2-cp > size_left)
- return MK_OUT_OF_MEMORY;
-
- nsCRT::memcpy(output_ptr, cp, cp2-cp);
- output_ptr[cp2-cp] = 0;
- quoted_url = nsEscapeHTML(output_ptr);
- if (!quoted_url) return MK_OUT_OF_MEMORY;
- PR_snprintf(output_ptr, size_left,
- "%s",
- quoted_url,
- quoted_url);
- output_ptr += PL_strlen(output_ptr);
- PR_Free(quoted_url);
- output_ptr += PL_strlen(output_ptr);
- }
-
- cp = cp2-1; /* go to next word */
- }
- else
- {
- /* Make sure that special symbols don't screw up the HTML parser
- */
- if(*cp == '<')
- {
- PL_strcpy(output_ptr, "<");
- output_ptr += 4;
- col++;
- }
- else if(*cp == '>')
- {
- PL_strcpy(output_ptr, ">");
- output_ptr += 4;
- col++;
- }
- else if(*cp == '&')
- {
- PL_strcpy(output_ptr, "&");
- output_ptr += 5;
- col++;
- }
- else
- {
- *output_ptr++ = *cp;
- col++;
- }
- }
- }
-
- *output_ptr = 0;
-
- if (line_is_citation) /* Close off the highlighting */
- {
- if (color) {
- PL_strcpy(output_ptr, "");
- output_ptr += PL_strlen(output_ptr);
- }
-
- PL_strcpy(output_ptr, cite_close2);
- output_ptr += PL_strlen (cite_close2);
- PL_strcpy(output_ptr, cite_close1);
- output_ptr += PL_strlen (cite_close1);
- }
-
- return 0;
-}
-
-/* modifies a url of the form /foo/../foo1 -> /foo1
- *
- * it only operates on "file" "ftp" and "http" url's all others are returned
- * unmodified
- *
- * returns the modified passed in URL string
- */
-PRIVATE char *
-net_ReduceURL (char *url)
-{
- int url_type = URL_Type(url);
- char * fwd_ptr;
- char * url_ptr;
- char * path_ptr;
-
- if(!url)
- return(url);
-
- if(url_type == HTTP_TYPE_URL || url_type == FILE_TYPE_URL ||
- url_type == FTP_TYPE_URL ||
- url_type == SECURE_HTTP_TYPE_URL)
- {
-
- /* find the path so we only change that and not the host
- */
- path_ptr = PL_strchr(url, '/');
-
- if(!path_ptr)
- return(url);
-
- if(*(path_ptr+1) == '/')
- path_ptr = PL_strchr(path_ptr+2, '/');
-
- if(!path_ptr)
- return(url);
-
- fwd_ptr = path_ptr;
- url_ptr = path_ptr;
-
- for(; *fwd_ptr != '\0'; fwd_ptr++)
- {
-
- if(*fwd_ptr == '/' && *(fwd_ptr+1) == '.' && *(fwd_ptr+2) == '/')
- {
- /* remove ./
- */
- fwd_ptr += 1;
- }
- else if(*fwd_ptr == '/' && *(fwd_ptr+1) == '.' && *(fwd_ptr+2) == '.' &&
- (*(fwd_ptr+3) == '/' || *(fwd_ptr+3) == '\0'))
- {
- /* remove foo/..
- */
- /* reverse the url_ptr to the previous slash
- */
- if(url_ptr != path_ptr)
- url_ptr--; /* we must be going back at least one */
- for(;*url_ptr != '/' && url_ptr != path_ptr; url_ptr--)
- ; /* null body */
-
- /* forward the fwd_prt past the ../
- */
- fwd_ptr += 2;
- }
- else
- {
- /* copy the url incrementaly
- */
- *url_ptr++ = *fwd_ptr;
- }
- }
- *url_ptr = '\0'; /* terminate the url */
- }
-
- return(url);
-}
-
-/*
- * Makes a relative URL into an absolute one.
- *
- * If an absolute url is passed in it will be copied and returned.
- *
- * Always returns a malloc'd string or NULL on out of memory error
- */
-extern "C" char *
-nsMakeAbsoluteURL(char * absolute_url, char * relative_url)
-{
- char * ret_url=0;
- int new_length;
- char * cat_point=0;
- char cat_point_char;
- int url_type=0;
- int base_type;
-
- /* if either is NULL
- */
- if(!absolute_url || !relative_url)
- {
- mime_SACopy(&ret_url, relative_url);
- return(ret_url);
- }
-
- /* use the URL_Type function to figure
- * out if it's a recognized URL method
- */
- url_type = URL_Type(relative_url);
-
- /* there are some extra cases we need to catch
- */
- if(!url_type)
- {
- switch(*relative_url)
- {
- case 'i':
- if(!PL_strncmp(relative_url,"internal-icon-", 14)
- || !PL_strncmp(relative_url,"internal-external-reconnect:", 28)
- || !PL_strcmp(relative_url,"internal-external-plugin"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- break;
- case '/':
- if(!PL_strncasecmp(relative_url, "/mc-icons/", 10) ||
- !PL_strncasecmp(relative_url, "/ns-icons/", 10))
- {
- if(!PL_strcmp(relative_url+10, "menu.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "unknown.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "text.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "image.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "sound.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "binary.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- else if(!PL_strcmp(relative_url+10, "movie.gif"))
- url_type = INTERNAL_IMAGE_TYPE_URL;
- }
- break;
- }
- }
- else if(url_type == ABOUT_TYPE_URL)
- {
- /* don't allow about:cache in a document */
- if(!PL_strncasecmp(relative_url, "about:cache", 11)
- || !PL_strncasecmp(relative_url, "about:global", 12)
- || !PL_strncasecmp(relative_url, "about:image-cache", 17)
- || !PL_strncasecmp(relative_url, "about:memory-cache", 18))
- {
- return PL_strdup("");
- }
- }
-
- // RICHIE - NO LONGER APPLICABLE
- // if(!url_type)
- // url_type = net_CheckForExternalURLType(relative_url);
-
- if(url_type)
- {
- /* it's either an absolute url
- * or a messed up one of the type proto:/path
- * but notice the missing host.
- */
- char * colon = PL_strchr(relative_url, ':'); /* must be there */
-
- if( (colon && *(colon+1) == '/' && *(colon+2) == '/') ||
- (url_type != GOPHER_TYPE_URL
- && url_type != FTP_TYPE_URL
- && url_type != HTTP_TYPE_URL
- && url_type != SECURE_HTTP_TYPE_URL
- && url_type != RLOGIN_TYPE_URL
- && url_type != TELNET_TYPE_URL
- && url_type != TN3270_TYPE_URL
- && url_type != WAIS_TYPE_URL) )
- {
- /* it appears to have all it's parts. Assume it's completely
- * absolute
- */
- mime_SACopy(&ret_url, relative_url);
- return(ret_url);
- }
- else
- {
- /* it's a screwed up relative url of the form http:[relative url]
- * remove the stuff before and at the colon and treat it as a normal
- * relative url
- */
- char * colon = PL_strchr(relative_url, ':');
-
- relative_url = colon+1;
- }
- }
-
-
- /* At this point, we know that `relative_url' is not absolute.
- If the base URL, `absolute_url', is a "mailbox:" URL, then
- we should not allow relative expansion: that is,
- NET_MakeAbsoluteURL("mailbox:/A/B/C", "YYY") should not
- return "mailbox:/A/B/YYY".
-
- However, expansion of "#" and "?" parameters should work:
- NET_MakeAbsoluteURL("mailbox:/A/B/C?id=XXX", "#part2")
- should be allowed to expand to "mailbox:/A/B/C?id=XXX#part2".
-
- If you allow random HREFs in attached HTML to mail messages to
- expand to mailbox URLs, then bad things happen -- among other
- things, an entry will be automatically created in the folders
- list for each of these bogus non-files.
-
- It's an open question as to whether relative expansion should
- be allowed for news: and snews: URLs.
-
- Reasons to allow it:
-
- = ClariNet has been using it
-
- = (Their reason:) it's the only way for an HTML news message
- to refer to another HTML news message in a way which
- doesn't make assumptions about the name of the news host,
- and which also doesn't assume that the message is on the
- default news host.
-
- Reasons to disallow it:
-
- = Consistency with "mailbox:"
-
- = If there is a news message which has type text/html, and
- which has a relative URL like in it,
- but which has no tag, then we would expand that
- image to "news:foo.gif". Which would fail, of course,
- but which might annoy news admins by generating bogus
- references.
-
- So for now, let's allow
- NET_MakeAbsoluteURL("news:123@4", "456@7") => "news:456@7"; and
- NET_MakeAbsoluteURL("news://h/123@4", "456@7") => "news://h/456@7".
- */
- base_type = URL_Type(absolute_url);
- if ((base_type == MAILBOX_TYPE_URL || base_type == IMAP_TYPE_URL) &&
- *relative_url != '#' &&
- *relative_url != '?')
- {
- return PL_strdup("");
- }
-
- if(relative_url[0] == '/' && relative_url[1] == '/')
- {
- /* a host absolute URL
- */
-
- /* find the colon after the protocol
- */
- cat_point = PL_strchr(absolute_url, ':');
- if (cat_point && base_type == WYSIWYG_TYPE_URL)
- cat_point = PL_strchr(cat_point + 1, ':');
-
- /* append after the colon
- */
- if(cat_point)
- cat_point++;
-
- }
- else if(relative_url[0] == '/')
- {
- /* a path absolute URL
- * append at the slash after the host part
- */
-
- /* find the colon after the protocol
- */
- char *colon = PL_strchr(absolute_url, ':');
- if (colon && base_type == WYSIWYG_TYPE_URL)
- colon = PL_strchr(colon + 1, ':');
-
- if(colon)
- {
- if(colon[1] == '/' && colon[2] == '/')
- {
- /* find the next slash
- */
- cat_point = PL_strchr(colon+3, '/');
-
- if(!cat_point)
- {
- /* if there isn't another slash then the cat point is the very end
- */
- cat_point = &absolute_url[PL_strlen(absolute_url)];
- }
- }
- else
- {
- /* no host was given so the cat_point is right after the colon
- */
- cat_point = colon+1;
- }
-
-#if defined(XP_WIN) || defined(XP_OS2)
- /* this will allow drive letters to work right on windows
- */
- if(IS_ALPHA(*cat_point) && *(cat_point+1) == ':')
- cat_point += 2;
-#endif /* XP_WIN */
-
- }
- }
- else if(relative_url[0] == '#')
- {
- /* a positioning within the same document relative url
- *
- * add teh relative url to the full text of the absolute url minus
- * any # punctuation the url might have
- *
- */
- char * hash = PL_strchr(absolute_url, '#');
-
- if(hash)
- {
- char * ques_mark = PL_strchr(absolute_url, '?');
-
- if(ques_mark)
- {
- /* this is a hack.
- * copy things to try and make them more correct
- */
- *hash = '\0';
-
- mime_SACopy(&ret_url, absolute_url);
- mime_SACat(&ret_url, relative_url);
- mime_SACat(&ret_url, ques_mark);
-
- *hash = '#';
-
- return(net_ReduceURL(ret_url));
- }
-
- cat_point = hash;
- }
- else
- {
- cat_point = &absolute_url[PL_strlen(absolute_url)]; /* the end of the URL */
- }
- }
- else
- {
- /* a completely relative URL
- *
- * append after the last slash
- */
- char * ques = PL_strchr(absolute_url, '?');
- char * hash = PL_strchr(absolute_url, '#');
-
- if(ques)
- *ques = '\0';
-
- if(hash)
- *hash = '\0';
-
- cat_point = PL_strrchr(absolute_url, '/');
-
- /* if there are no slashes then append right after the colon after the protocol
- */
- if(!cat_point)
- cat_point = PL_strchr(absolute_url, ':');
-
- /* set the value back
- */
- if(ques)
- *ques = '?';
-
- if(hash)
- *hash = '#';
-
- if(cat_point)
- cat_point++; /* append right after the slash or colon not on it */
- }
-
- if(cat_point)
- {
- cat_point_char = *cat_point; /* save the value */
- *cat_point = '\0';
- new_length = PL_strlen(absolute_url) + PL_strlen(relative_url) + 1;
- ret_url = (char *) PR_MALLOC(new_length);
- if(!ret_url)
- return(NULL); /* out of memory */
-
- PL_strcpy(ret_url, absolute_url);
- PL_strcat(ret_url, relative_url);
- *cat_point = cat_point_char; /* set the absolute url back to its original state */
- }
- else
- {
- /* something went wrong. just return a copy of the relative url
- */
- mime_SACopy(&ret_url, relative_url);
- }
-
- return(net_ReduceURL(ret_url));
-}
diff --git a/mozilla/mailnews/mime/src/nsMimeTransition.h b/mozilla/mailnews/mime/src/nsMimeTransition.h
index 8dce8f816bf..ce8a5f357a0 100644
--- a/mozilla/mailnews/mime/src/nsMimeTransition.h
+++ b/mozilla/mailnews/mime/src/nsMimeTransition.h
@@ -73,11 +73,4 @@ NET_cinfo_find_type (char *uri);
extern "C" NET_cinfo *
NET_cinfo_find_info_by_type (char *uri);
-extern "C" int
-nsScanForURLs(const char *input, int32 input_size,
- char *output, int output_size, XP_Bool urls_only);
-
-extern "C" char *
-nsMakeAbsoluteURL(char * absolute_url, char * relative_url);
-
#endif /* nsMimeTransition_h_ */
|