From 707633d2ee4b27f2bd07e1f519e00ffd4a38ffe2 Mon Sep 17 00:00:00 2001 From: "rhp%netscape.com" Date: Tue, 11 May 1999 23:42:27 +0000 Subject: [PATCH] Changes for new URL parsing interface git-svn-id: svn://10.0.0.236/trunk@31174 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/mailnews/mime/src/Makefile.in | 1 + mozilla/mailnews/mime/src/makefile.win | 3 +- mozilla/mailnews/mime/src/mimehdrs.cpp | 17 +- mozilla/mailnews/mime/src/mimemrel.cpp | 38 +- mozilla/mailnews/mime/src/mimetpla.cpp | 15 +- mozilla/mailnews/mime/src/nsMimeFactory.cpp | 9 + .../mailnews/mime/src/nsMimeTransition.cpp | 767 ------------------ mozilla/mailnews/mime/src/nsMimeTransition.h | 7 - 8 files changed, 42 insertions(+), 815 deletions(-) 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_ */