nsRDFXMLParser.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. #include "nsRDFXMLParser.h"
  7. #include "nsIComponentManager.h"
  8. #include "nsIParser.h"
  9. #include "nsCharsetSource.h"
  10. #include "nsIRDFContentSink.h"
  11. #include "nsParserCIID.h"
  12. #include "nsStringStream.h"
  13. #include "nsNetUtil.h"
  14. #include "nsNullPrincipal.h"
  15. static NS_DEFINE_CID(kParserCID, NS_PARSER_CID);
  16. NS_IMPL_ISUPPORTS(nsRDFXMLParser, nsIRDFXMLParser)
  17. nsresult
  18. nsRDFXMLParser::Create(nsISupports* aOuter, REFNSIID aIID, void** aResult)
  19. {
  20. if (aOuter)
  21. return NS_ERROR_NO_AGGREGATION;
  22. nsRDFXMLParser* result = new nsRDFXMLParser();
  23. if (! result)
  24. return NS_ERROR_OUT_OF_MEMORY;
  25. nsresult rv;
  26. NS_ADDREF(result);
  27. rv = result->QueryInterface(aIID, aResult);
  28. NS_RELEASE(result);
  29. return rv;
  30. }
  31. nsRDFXMLParser::nsRDFXMLParser()
  32. {
  33. MOZ_COUNT_CTOR(nsRDFXMLParser);
  34. }
  35. nsRDFXMLParser::~nsRDFXMLParser()
  36. {
  37. MOZ_COUNT_DTOR(nsRDFXMLParser);
  38. }
  39. NS_IMETHODIMP
  40. nsRDFXMLParser::ParseAsync(nsIRDFDataSource* aSink, nsIURI* aBaseURI, nsIStreamListener** aResult)
  41. {
  42. nsresult rv;
  43. nsCOMPtr<nsIRDFContentSink> sink =
  44. do_CreateInstance("@mozilla.org/rdf/content-sink;1", &rv);
  45. if (NS_FAILED(rv)) return rv;
  46. rv = sink->Init(aBaseURI);
  47. if (NS_FAILED(rv)) return rv;
  48. // We set the content sink's data source directly to our in-memory
  49. // store. This allows the initial content to be generated "directly".
  50. rv = sink->SetDataSource(aSink);
  51. if (NS_FAILED(rv)) return rv;
  52. nsCOMPtr<nsIParser> parser = do_CreateInstance(kParserCID, &rv);
  53. if (NS_FAILED(rv)) return rv;
  54. parser->SetDocumentCharset(NS_LITERAL_CSTRING("UTF-8"),
  55. kCharsetFromDocTypeDefault);
  56. parser->SetContentSink(sink);
  57. rv = parser->Parse(aBaseURI);
  58. if (NS_FAILED(rv)) return rv;
  59. return CallQueryInterface(parser, aResult);
  60. }
  61. NS_IMETHODIMP
  62. nsRDFXMLParser::ParseString(nsIRDFDataSource* aSink, nsIURI* aBaseURI, const nsACString& aString)
  63. {
  64. nsresult rv;
  65. nsCOMPtr<nsIRDFContentSink> sink =
  66. do_CreateInstance("@mozilla.org/rdf/content-sink;1", &rv);
  67. if (NS_FAILED(rv)) return rv;
  68. rv = sink->Init(aBaseURI);
  69. if (NS_FAILED(rv)) return rv;
  70. // We set the content sink's data source directly to our in-memory
  71. // store. This allows the initial content to be generated "directly".
  72. rv = sink->SetDataSource(aSink);
  73. if (NS_FAILED(rv)) return rv;
  74. nsCOMPtr<nsIParser> parser = do_CreateInstance(kParserCID, &rv);
  75. if (NS_FAILED(rv)) return rv;
  76. parser->SetDocumentCharset(NS_LITERAL_CSTRING("UTF-8"),
  77. kCharsetFromOtherComponent);
  78. parser->SetContentSink(sink);
  79. rv = parser->Parse(aBaseURI);
  80. if (NS_FAILED(rv)) return rv;
  81. nsCOMPtr<nsIStreamListener> listener =
  82. do_QueryInterface(parser);
  83. if (! listener)
  84. return NS_ERROR_FAILURE;
  85. nsCOMPtr<nsIInputStream> stream;
  86. rv = NS_NewCStringInputStream(getter_AddRefs(stream), aString);
  87. if (NS_FAILED(rv)) return rv;
  88. nsCOMPtr<nsIPrincipal> nullPrincipal = nsNullPrincipal::Create();
  89. // The following channel is never openend, so it does not matter what
  90. // securityFlags we pass; let's follow the principle of least privilege.
  91. nsCOMPtr<nsIChannel> channel;
  92. rv = NS_NewInputStreamChannel(getter_AddRefs(channel),
  93. aBaseURI,
  94. stream,
  95. nullPrincipal,
  96. nsILoadInfo::SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED,
  97. nsIContentPolicy::TYPE_OTHER,
  98. NS_LITERAL_CSTRING("text/xml"));
  99. if (NS_FAILED(rv)) return rv;
  100. listener->OnStartRequest(channel, nullptr);
  101. listener->OnDataAvailable(channel, nullptr, stream, 0, aString.Length());
  102. listener->OnStopRequest(channel, nullptr, NS_OK);
  103. return NS_OK;
  104. }