bug 231548 remove nsRDFParserUtils. This means we no longer unescape strings in

RDF/XML files twice.
patch by Chase Tingley <tingley@sundell.net> / Rob Adams <readams@readams.net>
r=pike sr=shaver
This commit is contained in:
cbiesinger%web.de 2005-11-18 20:34:19 +00:00
Родитель 1c0aef9012
Коммит a3b4ff0954
6 изменённых файлов: 40 добавлений и 442 удалений

Просмотреть файл

@ -65,7 +65,6 @@ CPPSRCS = \
nsRDFContentSink.cpp \
nsRDFContainer.cpp \
nsRDFContainerUtils.cpp \
nsRDFParserUtils.cpp \
nsRDFService.cpp \
nsRDFXMLDataSource.cpp \
nsRDFXMLParser.cpp \

Просмотреть файл

@ -83,7 +83,6 @@
#include "nsIURL.h"
#include "nsIXMLContentSink.h"
#include "nsRDFCID.h"
#include "nsRDFParserUtils.h"
#include "nsVoidArray.h"
#include "nsXPIDLString.h"
#include "prlog.h"
@ -826,6 +825,14 @@ RDFContentSinkImpl::AddText(const PRUnichar* aText, PRInt32 aLength)
return NS_OK;
}
PRBool
rdf_RequiresAbsoluteURI(const nsString& uri)
{
// cheap shot at figuring out if this requires an absolute url translation
return !(StringBeginsWith(uri, NS_LITERAL_STRING("urn:")) ||
StringBeginsWith(uri, NS_LITERAL_STRING("chrome:")));
}
nsresult
RDFContentSinkImpl::GetIdAboutAttribute(const PRUnichar** aAttributes,
nsIRDFResource** aResource,
@ -834,10 +841,6 @@ RDFContentSinkImpl::GetIdAboutAttribute(const PRUnichar** aAttributes,
// This corresponds to the dirty work of production [6.5]
nsresult rv;
nsCAutoString docURI;
rv = mDocumentURL->GetSpec(docURI);
if (NS_FAILED(rv)) return rv;
nsCOMPtr<nsIAtom> localName;
for (; *aAttributes; aAttributes += 2) {
const nsDependentSubstring& nameSpaceURI =
@ -858,20 +861,21 @@ RDFContentSinkImpl::GetIdAboutAttribute(const PRUnichar** aAttributes,
if (aIsAnonymous)
*aIsAnonymous = PR_FALSE;
nsAutoString uri(aAttributes[1]);
nsRDFParserUtils::StripAndConvert(uri);
rdf_MakeAbsoluteURI(NS_ConvertUTF8toUCS2(docURI), uri);
return gRDFService->GetUnicodeResource(uri, aResource);
nsAutoString relURI(aAttributes[1]);
if (rdf_RequiresAbsoluteURI(relURI)) {
nsCAutoString uri;
rv = mDocumentURL->Resolve(NS_ConvertUCS2toUTF8(aAttributes[1]), uri);
if (NS_FAILED(rv)) return rv;
return gRDFService->GetResource(uri,
aResource);
}
return gRDFService->GetResource(NS_ConvertUCS2toUTF8(aAttributes[1]),
aResource);
}
else if (localName == kIdAtom) {
if (aIsAnonymous)
*aIsAnonymous = PR_FALSE;
nsAutoString name(aAttributes[1]);
nsRDFParserUtils::StripAndConvert(name);
// In the spirit of leniency, we do not bother trying to
// enforce that this be a valid "XML Name" (see
// http://www.w3.org/TR/REC-xml#NT-Nmtoken), as per
@ -880,11 +884,14 @@ RDFContentSinkImpl::GetIdAboutAttribute(const PRUnichar** aAttributes,
// Construct an in-line resource whose URI is the
// document's URI plus the XML name specified in the ID
// attribute.
name.Insert(PRUnichar('#'), 0);
rdf_MakeAbsoluteURI(NS_ConvertUTF8toUCS2(docURI), name);
nsCAutoString name;
nsCAutoString ref('#');
AppendUTF16toUTF8(aAttributes[1], ref);
return gRDFService->GetUnicodeResource(name, aResource);
rv = mDocumentURL->Resolve(ref, name);
if (NS_FAILED(rv)) return rv;
return gRDFService->GetResource(name, aResource);
}
else if (localName == kAboutEachAtom) {
// XXX we don't deal with aboutEach...
@ -923,17 +930,21 @@ RDFContentSinkImpl::GetResourceAttribute(const PRUnichar** aAttributes,
// first thing that was specified and ignore the other.
if (localName == kResourceAtom) {
nsAutoString uri(aAttributes[1]);
nsRDFParserUtils::StripAndConvert(uri);
// XXX Take the URI and make it fully qualified by
// sticking it into the document's URL. This may not be
// appropriate...
nsCAutoString documentURL;
mDocumentURL->GetSpec(documentURL);
rdf_MakeAbsoluteURI(NS_ConvertUTF8toUCS2(documentURL), uri);
nsAutoString relURI(aAttributes[1]);
if (rdf_RequiresAbsoluteURI(relURI)) {
nsresult rv;
nsCAutoString uri;
return gRDFService->GetUnicodeResource(uri, aResource);
rv = mDocumentURL->Resolve(NS_ConvertUCS2toUTF8(aAttributes[1]), uri);
if (NS_FAILED(rv)) return rv;
return gRDFService->GetResource(uri, aResource);
}
return gRDFService->GetResource(NS_ConvertUCS2toUTF8(aAttributes[1]),
aResource);
}
}
return NS_ERROR_FAILURE;
@ -977,9 +988,6 @@ RDFContentSinkImpl::AddProperties(const PRUnichar** aAttributes,
}
}
nsAutoString v(aAttributes[1]);
nsRDFParserUtils::StripAndConvert(v);
const char* attrName;
localName->GetUTF8String(&attrName);
@ -991,7 +999,8 @@ RDFContentSinkImpl::AddProperties(const PRUnichar** aAttributes,
gRDFService->GetResource(propertyStr, getter_AddRefs(property));
nsCOMPtr<nsIRDFLiteral> target;
gRDFService->GetLiteral(v.get(), getter_AddRefs(target));
gRDFService->GetLiteral(aAttributes[1],
getter_AddRefs(target));
mDataSource->Assert(aSubject, property, target, PR_TRUE);
}
@ -1007,8 +1016,7 @@ RDFContentSinkImpl::SetParseMode(const PRUnichar **aAttributes)
SplitExpatName(aAttributes[0], getter_AddRefs(localName));
if (localName == kParseTypeAtom) {
nsAutoString v(aAttributes[1]);
nsRDFParserUtils::StripAndConvert(v);
nsDependentString v(aAttributes[1]);
if (nameSpaceURI.IsEmpty() ||
nameSpaceURI.EqualsLiteral(RDF_NAMESPACE_URI)) {

Просмотреть файл

@ -1,256 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
Some useful parsing routines.
This isn't the best place for them: I wish that they'd go into some
shared area (like mozilla/base).
*/
#include <stdlib.h> // XXX for atoi(), maybe this should go into nsCRT?
#include "nsIURL.h"
#include "nsString.h"
#include "nsRDFParserUtils.h"
// XXX This totally sucks. I wish that mozilla/base had this code.
PRUnichar
nsRDFParserUtils::EntityToUnicode(const char* buf)
{
if ((buf[0] == 'g') &&
(buf[1] == 't') &&
(buf[2] == '\0'))
return PRUnichar('>');
if ((buf[0] == 'l') &&
(buf[1] == 't') &&
(buf[2] == '\0'))
return PRUnichar('<');
if ((buf[0] == 'a') &&
(buf[1] == 'm') &&
(buf[2] == 'p') &&
(buf[3] == '\0'))
return PRUnichar('&');
if ((buf[0] == 'a') &&
(buf[1] == 'p') &&
(buf[2] == 'o') &&
(buf[3] == 's') &&
(buf[4] == '\0'))
return PRUnichar('\'');
if ((buf[0] == 'q') &&
(buf[1] == 'u') &&
(buf[2] == 'o') &&
(buf[3] == 't') &&
(buf[4] == '\0'))
return PRUnichar('"');
NS_NOTYETIMPLEMENTED("look this up in the declared-entity table");
return PRUnichar('?');
}
// XXX Code copied from nsHTMLContentSink. It should be shared.
void
nsRDFParserUtils::StripAndConvert(nsString& aResult)
{
if ( !aResult.IsEmpty() ) {
// Strip quotes if present
PRUnichar first = aResult.First();
if ((first == '"') || (first == '\'')) {
if (aResult.Last() == first) {
aResult.Cut(0, 1);
PRInt32 pos = aResult.Length() - 1;
if (pos >= 0) {
aResult.Cut(pos, 1);
}
} else {
// Mismatched quotes - leave them in
}
}
}
// Reduce any entities
// XXX Note: as coded today, this will only convert well formed
// entities. This may not be compatible enough.
// XXX there is a table in navigator that translates some numeric entities
// should we be doing that? If so then it needs to live in two places (bad)
// so we should add a translate numeric entity method from the parser...
char cbuf[100];
PRUint32 i = 0;
while (i < aResult.Length()) {
// If we have the start of an entity (and it's not at the end of
// our string) then translate the entity into it's unicode value.
if ((aResult.CharAt(i++) == '&') && (i < aResult.Length())) {
PRInt32 start = i - 1;
PRUnichar e = aResult.CharAt(i);
if (e == '#') {
// Convert a numeric character reference
i++;
char* cp = cbuf;
char* limit = cp + sizeof(cbuf) - 1;
PRBool ok = PR_FALSE;
PRUint32 slen = aResult.Length();
while ((i < slen) && (cp < limit)) {
PRUnichar f = aResult.CharAt(i);
if (f == ';') {
i++;
ok = PR_TRUE;
break;
}
if ((f >= '0') && (f <= '9')) {
*cp++ = char(f);
i++;
continue;
}
break;
}
if (!ok || (cp == cbuf)) {
continue;
}
*cp = '\0';
if (cp - cbuf > 5) {
continue;
}
PRInt32 ch = PRInt32( ::atoi(cbuf) );
if (ch > 65535) {
continue;
}
// Remove entity from string and replace it with the integer
// value.
aResult.Cut(start, i - start);
aResult.Insert(PRUnichar(ch), start);
i = start + 1;
}
else if (((e >= 'A') && (e <= 'Z')) ||
((e >= 'a') && (e <= 'z'))) {
// Convert a named entity
i++;
char* cp = cbuf;
char* limit = cp + sizeof(cbuf) - 1;
*cp++ = char(e);
PRBool ok = PR_FALSE;
PRUint32 slen = aResult.Length();
while ((i < slen) && (cp < limit)) {
PRUnichar f = aResult.CharAt(i);
if (f == ';') {
i++;
ok = PR_TRUE;
break;
}
if (((f >= '0') && (f <= '9')) ||
((f >= 'A') && (f <= 'Z')) ||
((f >= 'a') && (f <= 'z'))) {
*cp++ = char(f);
i++;
continue;
}
break;
}
if (!ok || (cp == cbuf)) {
continue;
}
*cp = '\0';
PRInt32 ch;
// XXX Um, here's where we should be converting a
// named entity. I removed this to avoid a link-time
// dependency on core raptor.
ch = EntityToUnicode(cbuf);
if (ch < 0) {
continue;
}
// Remove entity from string and replace it with the integer
// value.
aResult.Cut(start, i - start);
aResult.Insert(PRUnichar(ch), start);
i = start + 1;
}
else if (e == '{') {
// Convert a script entity
// XXX write me!
NS_NOTYETIMPLEMENTED("convert a script entity");
}
}
}
}
nsresult
nsRDFParserUtils::GetQuotedAttributeValue(const nsString& aSource,
const nsString& aAttribute,
nsString& aValue)
{
static const char kQuote = '\"';
static const char kApostrophe = '\'';
PRInt32 offset;
PRInt32 endOffset = -1;
nsresult result = NS_OK;
offset = aSource.Find(aAttribute, 0);
if (-1 != offset) {
offset = aSource.FindChar('=', offset);
PRUnichar next = aSource.CharAt(++offset);
if (kQuote == next) {
endOffset = aSource.FindChar(kQuote, ++offset);
}
else if (kApostrophe == next) {
endOffset = aSource.FindChar(kApostrophe, ++offset);
}
if (-1 != endOffset) {
aSource.Mid(aValue, offset, endOffset-offset);
}
else {
// Mismatched quotes - return an error
result = NS_ERROR_FAILURE;
}
}
else {
aValue.Truncate();
}
return result;
}

Просмотреть файл

@ -1,62 +0,0 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Communicator client code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
Some useful parsing routines.
*/
#ifndef nsRDFParserUtils_h__
#define nsRDFParserUtils_h__
class nsRDFParserUtils {
public:
static PRUnichar
EntityToUnicode(const char* buf);
static void
StripAndConvert(nsString& aResult);
static nsresult
GetQuotedAttributeValue(const nsString& aSource,
const nsString& aAttribute,
nsString& aValue);
};
#endif // nsRDFPasrserUtils_h__

Просмотреть файл

@ -86,88 +86,6 @@ rdf_MakeRelativeRef(const nsCSubstring& aBaseURI, nsCString& aURI)
return NS_OK;
}
static PRBool
rdf_RequiresAbsoluteURI(const nsString& uri)
{
// cheap shot at figuring out if this requires an absolute url translation
return !(StringBeginsWith(uri, NS_LITERAL_STRING("urn:")) ||
StringBeginsWith(uri, NS_LITERAL_STRING("chrome:")) ||
StringBeginsWith(uri, NS_LITERAL_STRING("nc:"),
nsCaseInsensitiveStringComparator()));
}
nsresult
rdf_MakeAbsoluteURI(const nsString& aBaseURI, nsString& aURI)
{
nsresult rv;
nsAutoString result;
if (!rdf_RequiresAbsoluteURI(aURI))
return NS_OK;
nsCOMPtr<nsIURI> base;
rv = NS_NewURI(getter_AddRefs(base), aBaseURI);
if (NS_FAILED(rv)) return rv;
rv = NS_MakeAbsoluteURI(result, aURI, base);
if (NS_SUCCEEDED(rv)) {
aURI = result;
}
else {
// There are some ugly URIs (e.g., "NC:Foo") that netlib can't
// parse. If NS_MakeAbsoluteURL fails, then just punt and
// assume that aURI was already absolute.
}
return NS_OK;
}
nsresult
rdf_MakeAbsoluteURI(nsIURI* aBase, nsString& aURI)
{
nsresult rv;
if (!rdf_RequiresAbsoluteURI(aURI))
return NS_OK;
nsAutoString result;
rv = NS_MakeAbsoluteURI(result, aURI, aBase);
if (NS_SUCCEEDED(rv)) {
aURI = result;
}
else {
// There are some ugly URIs (e.g., "NC:Foo") that netlib can't
// parse. If NS_MakeAbsoluteURL fails, then just punt and
// assume that aURI was already absolute.
}
return NS_OK;
}
nsresult
rdf_MakeAbsoluteURI(nsIURI* aBase, nsCString& aURI)
{
nsresult rv;
nsXPIDLCString result;
rv = NS_MakeAbsoluteURI(getter_Copies(result), aURI.get(), aBase);
if (NS_SUCCEEDED(rv)) {
aURI.Assign(result);
}
else {
// There are some ugly URIs (e.g., "NC:Foo") that netlib can't
// parse. If NS_MakeAbsoluteURL fails, then just punt and
// assume that aURI was already absolute.
}
return NS_OK;
}
void
rdf_FormatDate(PRTime aTime, nsACString &aResult)
{

Просмотреть файл

@ -64,15 +64,6 @@ class nsIURI;
nsresult
rdf_MakeRelativeRef(const nsCSubstring& aBaseURI, nsCString& aURI);
nsresult
rdf_MakeAbsoluteURI(const nsString& aBaseURI, nsString& aURI);
nsresult
rdf_MakeAbsoluteURI(nsIURI* aBaseURL, nsString& aURI);
nsresult
rdf_MakeAbsoluteURI(nsIURI* aBaseURL, nsCString& aURI);
void
rdf_FormatDate(PRTime aTime, nsACString &aResult);