rdfTriplesSerializer.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "nsIOutputStream.h"
  6. #include "nsReadableUtils.h"
  7. #include "nsCRT.h"
  8. #include "nsCOMPtr.h"
  9. #include "nsString.h"
  10. #include "nsPrintfCString.h"
  11. #include "nsIBufferedStreams.h"
  12. #include "nsNetCID.h"
  13. #include "nsComponentManagerUtils.h"
  14. #include "rdfISerializer.h"
  15. #include "rdfIDataSource.h"
  16. #include "rdfITripleVisitor.h"
  17. #include "nsIRDFResource.h"
  18. #include "nsIRDFLiteral.h"
  19. #include "mozilla/Attributes.h"
  20. class TriplesVisitor final : public rdfITripleVisitor
  21. {
  22. public:
  23. explicit TriplesVisitor(nsIOutputStream* aOut) : mOut(aOut) {}
  24. NS_DECL_RDFITRIPLEVISITOR
  25. NS_DECL_ISUPPORTS
  26. protected:
  27. ~TriplesVisitor() {}
  28. nsresult writeResource(nsIRDFResource* aResource);
  29. nsIOutputStream* mOut;
  30. };
  31. NS_IMPL_ISUPPORTS(TriplesVisitor, rdfITripleVisitor)
  32. nsresult
  33. TriplesVisitor::writeResource(nsIRDFResource *aResource)
  34. {
  35. nsCString res;
  36. uint32_t writeCount, wroteCount;
  37. mOut->Write("<", 1, &wroteCount);
  38. NS_ENSURE_TRUE(wroteCount == 1, NS_ERROR_FAILURE);
  39. nsresult rv = aResource->GetValueUTF8(res);
  40. NS_ENSURE_SUCCESS(rv, rv);
  41. writeCount = res.Length();
  42. mOut->Write(res.get(), writeCount, &wroteCount);
  43. NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
  44. mOut->Write("> ", 2, &wroteCount);
  45. NS_ENSURE_TRUE(wroteCount == 2, NS_ERROR_FAILURE);
  46. return NS_OK;
  47. }
  48. NS_IMETHODIMP
  49. TriplesVisitor::Visit(nsIRDFNode *aSubject, nsIRDFResource *aPredicate,
  50. nsIRDFNode *aObject, bool aTruthValue)
  51. {
  52. nsCOMPtr<nsIRDFResource> subjectRes = do_QueryInterface(aSubject);
  53. nsresult rv = NS_OK;
  54. if (subjectRes) {
  55. rv = writeResource(subjectRes);
  56. }
  57. if (NS_FAILED(rv)) {
  58. return rv;
  59. }
  60. rv = writeResource(aPredicate);
  61. if (NS_FAILED(rv)) {
  62. return rv;
  63. }
  64. nsCOMPtr<nsIRDFResource> res = do_QueryInterface(aObject);
  65. nsCOMPtr<nsIRDFLiteral> lit;
  66. nsCOMPtr<nsIRDFInt> intLit;
  67. uint32_t wroteCount;
  68. if (res) {
  69. rv = writeResource(res);
  70. } else if ((lit = do_QueryInterface(aObject)) != nullptr) {
  71. const char16_t *value;
  72. lit->GetValueConst(&value);
  73. nsAutoCString object;
  74. object.Append('"');
  75. AppendUTF16toUTF8(value, object);
  76. object.AppendLiteral("\" ");
  77. uint32_t writeCount = object.Length();
  78. rv = mOut->Write(object.get(), writeCount, &wroteCount);
  79. NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
  80. } else if ((intLit = do_QueryInterface(aObject)) != nullptr) {
  81. int32_t value;
  82. intLit->GetValue(&value);
  83. nsPrintfCString
  84. object("\"%i\"^^<http://www.w3.org/2001/XMLSchema#integer> ",
  85. value);
  86. uint32_t writeCount = object.Length();
  87. rv = mOut->Write(object.get(), writeCount, &wroteCount);
  88. NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
  89. }
  90. NS_ENSURE_SUCCESS(rv, rv);
  91. return mOut->Write(".\n", 2, &wroteCount);
  92. }
  93. class rdfTriplesSerializer final : public rdfISerializer
  94. {
  95. public:
  96. NS_DECL_ISUPPORTS
  97. NS_DECL_RDFISERIALIZER
  98. rdfTriplesSerializer();
  99. private:
  100. ~rdfTriplesSerializer();
  101. };
  102. nsresult
  103. NS_NewTriplesSerializer(rdfISerializer** aResult)
  104. {
  105. NS_PRECONDITION(aResult != nullptr, "null ptr");
  106. if (! aResult)
  107. return NS_ERROR_NULL_POINTER;
  108. *aResult = new rdfTriplesSerializer();
  109. if (! *aResult)
  110. return NS_ERROR_OUT_OF_MEMORY;
  111. NS_ADDREF(*aResult);
  112. return NS_OK;
  113. }
  114. NS_IMPL_ISUPPORTS(rdfTriplesSerializer, rdfISerializer)
  115. rdfTriplesSerializer::rdfTriplesSerializer()
  116. {
  117. }
  118. rdfTriplesSerializer::~rdfTriplesSerializer()
  119. {
  120. }
  121. NS_IMETHODIMP
  122. rdfTriplesSerializer::Serialize(rdfIDataSource *aDataSource,
  123. nsIOutputStream *aOut)
  124. {
  125. nsresult rv;
  126. nsCOMPtr<nsIBufferedOutputStream> bufout =
  127. do_CreateInstance(NS_BUFFEREDOUTPUTSTREAM_CONTRACTID, &rv);
  128. NS_ENSURE_SUCCESS(rv, rv);
  129. rv = bufout->Init(aOut, 1024);
  130. NS_ENSURE_SUCCESS(rv, rv);
  131. nsCOMPtr<rdfITripleVisitor> tv = new TriplesVisitor(bufout);
  132. NS_ENSURE_TRUE(tv, NS_ERROR_OUT_OF_MEMORY);
  133. return aDataSource->VisitAllTriples(tv);
  134. }