Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 : *
3 : * This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "nsRDFXMLParser.h"
8 :
9 : #include "mozilla/Encoding.h"
10 : #include "nsIComponentManager.h"
11 : #include "nsIParser.h"
12 : #include "nsCharsetSource.h"
13 : #include "nsIRDFContentSink.h"
14 : #include "nsParserCIID.h"
15 : #include "nsStringStream.h"
16 : #include "nsNetUtil.h"
17 : #include "NullPrincipal.h"
18 :
19 : static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
20 :
21 0 : NS_IMPL_ISUPPORTS(nsRDFXMLParser, nsIRDFXMLParser)
22 :
23 : nsresult
24 0 : nsRDFXMLParser::Create(nsISupports* aOuter, REFNSIID aIID, void** aResult)
25 : {
26 0 : if (aOuter)
27 0 : return NS_ERROR_NO_AGGREGATION;
28 :
29 0 : nsRDFXMLParser* result = new nsRDFXMLParser();
30 0 : if (! result)
31 0 : return NS_ERROR_OUT_OF_MEMORY;
32 :
33 : nsresult rv;
34 0 : NS_ADDREF(result);
35 0 : rv = result->QueryInterface(aIID, aResult);
36 0 : NS_RELEASE(result);
37 0 : return rv;
38 : }
39 :
40 0 : nsRDFXMLParser::nsRDFXMLParser()
41 : {
42 0 : }
43 :
44 0 : nsRDFXMLParser::~nsRDFXMLParser()
45 : {
46 0 : }
47 :
48 : NS_IMETHODIMP
49 0 : nsRDFXMLParser::ParseAsync(nsIRDFDataSource* aSink, nsIURI* aBaseURI, nsIStreamListener** aResult)
50 : {
51 : nsresult rv;
52 :
53 : nsCOMPtr<nsIRDFContentSink> sink =
54 0 : do_CreateInstance("@mozilla.org/rdf/content-sink;1", &rv);
55 :
56 0 : if (NS_FAILED(rv)) return rv;
57 :
58 0 : rv = sink->Init(aBaseURI);
59 0 : if (NS_FAILED(rv)) return rv;
60 :
61 : // We set the content sink's data source directly to our in-memory
62 : // store. This allows the initial content to be generated "directly".
63 0 : rv = sink->SetDataSource(aSink);
64 0 : if (NS_FAILED(rv)) return rv;
65 :
66 0 : nsCOMPtr<nsIParser> parser = do_CreateInstance(kParserCID, &rv);
67 0 : if (NS_FAILED(rv)) return rv;
68 :
69 0 : parser->SetDocumentCharset(UTF_8_ENCODING,
70 0 : kCharsetFromDocTypeDefault);
71 0 : parser->SetContentSink(sink);
72 :
73 0 : rv = parser->Parse(aBaseURI);
74 0 : if (NS_FAILED(rv)) return rv;
75 :
76 0 : return CallQueryInterface(parser, aResult);
77 : }
78 :
79 : NS_IMETHODIMP
80 0 : nsRDFXMLParser::ParseString(nsIRDFDataSource* aSink, nsIURI* aBaseURI, const nsACString& aString)
81 : {
82 : nsresult rv;
83 :
84 : nsCOMPtr<nsIRDFContentSink> sink =
85 0 : do_CreateInstance("@mozilla.org/rdf/content-sink;1", &rv);
86 :
87 0 : if (NS_FAILED(rv)) return rv;
88 :
89 0 : rv = sink->Init(aBaseURI);
90 0 : if (NS_FAILED(rv)) return rv;
91 :
92 : // We set the content sink's data source directly to our in-memory
93 : // store. This allows the initial content to be generated "directly".
94 0 : rv = sink->SetDataSource(aSink);
95 0 : if (NS_FAILED(rv)) return rv;
96 :
97 0 : nsCOMPtr<nsIParser> parser = do_CreateInstance(kParserCID, &rv);
98 0 : if (NS_FAILED(rv)) return rv;
99 :
100 0 : parser->SetDocumentCharset(UTF_8_ENCODING,
101 0 : kCharsetFromOtherComponent);
102 0 : parser->SetContentSink(sink);
103 :
104 0 : rv = parser->Parse(aBaseURI);
105 0 : if (NS_FAILED(rv)) return rv;
106 :
107 : nsCOMPtr<nsIStreamListener> listener =
108 0 : do_QueryInterface(parser);
109 :
110 0 : if (! listener)
111 0 : return NS_ERROR_FAILURE;
112 :
113 0 : nsCOMPtr<nsIInputStream> stream;
114 0 : rv = NS_NewCStringInputStream(getter_AddRefs(stream), aString);
115 0 : if (NS_FAILED(rv)) return rv;
116 :
117 0 : nsCOMPtr<nsIPrincipal> nullPrincipal = NullPrincipal::Create();
118 :
119 : // The following channel is never openend, so it does not matter what
120 : // securityFlags we pass; let's follow the principle of least privilege.
121 0 : nsCOMPtr<nsIChannel> channel;
122 0 : rv = NS_NewInputStreamChannel(getter_AddRefs(channel),
123 : aBaseURI,
124 : stream,
125 : nullPrincipal,
126 : nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED,
127 : nsIContentPolicy::TYPE_OTHER,
128 0 : NS_LITERAL_CSTRING("text/xml"));
129 0 : if (NS_FAILED(rv)) return rv;
130 :
131 0 : listener->OnStartRequest(channel, nullptr);
132 0 : listener->OnDataAvailable(channel, nullptr, stream, 0, aString.Length());
133 0 : listener->OnStopRequest(channel, nullptr, NS_OK);
134 :
135 0 : return NS_OK;
136 : }
|