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/. */
6 #include "nsIOutputStream.h"
7 #include "nsReadableUtils.h"
11 #include "nsPrintfCString.h"
12 #include "nsIBufferedStreams.h"
14 #include "nsComponentManagerUtils.h"
16 #include "rdfISerializer.h"
17 #include "rdfIDataSource.h"
18 #include "rdfITripleVisitor.h"
20 #include "nsIRDFResource.h"
21 #include "nsIRDFLiteral.h"
22 #include "mozilla/Attributes.h"
24 class TriplesVisitor MOZ_FINAL
: public rdfITripleVisitor
27 TriplesVisitor(nsIOutputStream
* aOut
) : mOut(aOut
) {}
28 NS_DECL_RDFITRIPLEVISITOR
32 nsresult
writeResource(nsIRDFResource
* aResource
);
33 nsIOutputStream
* mOut
;
36 NS_IMPL_ISUPPORTS(TriplesVisitor
, rdfITripleVisitor
)
39 TriplesVisitor::writeResource(nsIRDFResource
*aResource
)
42 uint32_t writeCount
, wroteCount
;
43 mOut
->Write("<", 1, &wroteCount
);
44 NS_ENSURE_TRUE(wroteCount
== 1, NS_ERROR_FAILURE
);
45 nsresult rv
= aResource
->GetValueUTF8(res
);
46 NS_ENSURE_SUCCESS(rv
, rv
);
47 writeCount
= res
.Length();
48 mOut
->Write(res
.get(), writeCount
, &wroteCount
);
49 NS_ENSURE_TRUE(writeCount
== wroteCount
, NS_ERROR_FAILURE
);
50 mOut
->Write("> ", 2, &wroteCount
);
51 NS_ENSURE_TRUE(wroteCount
== 2, NS_ERROR_FAILURE
);
56 TriplesVisitor::Visit(nsIRDFNode
*aSubject
, nsIRDFResource
*aPredicate
,
57 nsIRDFNode
*aObject
, bool aTruthValue
)
59 nsCOMPtr
<nsIRDFResource
> subjectRes
= do_QueryInterface(aSubject
);
62 rv
= writeResource(subjectRes
);
67 rv
= writeResource(aPredicate
);
71 nsCOMPtr
<nsIRDFResource
> res
= do_QueryInterface(aObject
);
72 nsCOMPtr
<nsIRDFLiteral
> lit
;
73 nsCOMPtr
<nsIRDFInt
> intLit
;
76 rv
= writeResource(res
);
77 } else if ((lit
= do_QueryInterface(aObject
)) != nullptr) {
78 const char16_t
*value
;
79 lit
->GetValueConst(&value
);
82 AppendUTF16toUTF8(value
, object
);
83 object
.AppendLiteral("\" ");
84 uint32_t writeCount
= object
.Length();
85 rv
= mOut
->Write(object
.get(), writeCount
, &wroteCount
);
86 NS_ENSURE_TRUE(writeCount
== wroteCount
, NS_ERROR_FAILURE
);
87 } else if ((intLit
= do_QueryInterface(aObject
)) != nullptr) {
89 intLit
->GetValue(&value
);
91 object("\"%i\"^^<http://www.w3.org/2001/XMLSchema#integer> ",
93 uint32_t writeCount
= object
.Length();
94 rv
= mOut
->Write(object
.get(), writeCount
, &wroteCount
);
95 NS_ENSURE_TRUE(writeCount
== wroteCount
, NS_ERROR_FAILURE
);
97 NS_ENSURE_SUCCESS(rv
, rv
);
98 return mOut
->Write(".\n", 2, &wroteCount
);
101 class rdfTriplesSerializer MOZ_FINAL
: public rdfISerializer
105 NS_DECL_RDFISERIALIZER
107 rdfTriplesSerializer();
110 ~rdfTriplesSerializer();
115 NS_NewTriplesSerializer(rdfISerializer
** aResult
)
117 NS_PRECONDITION(aResult
!= nullptr, "null ptr");
119 return NS_ERROR_NULL_POINTER
;
121 *aResult
= new rdfTriplesSerializer();
123 return NS_ERROR_OUT_OF_MEMORY
;
128 NS_IMPL_ISUPPORTS(rdfTriplesSerializer
, rdfISerializer
)
130 rdfTriplesSerializer::rdfTriplesSerializer()
134 rdfTriplesSerializer::~rdfTriplesSerializer()
139 rdfTriplesSerializer::Serialize(rdfIDataSource
*aDataSource
,
140 nsIOutputStream
*aOut
)
143 nsCOMPtr
<nsIBufferedOutputStream
> bufout
=
144 do_CreateInstance(NS_BUFFEREDOUTPUTSTREAM_CONTRACTID
, &rv
);
145 NS_ENSURE_SUCCESS(rv
, rv
);
146 rv
= bufout
->Init(aOut
, 1024);
147 NS_ENSURE_SUCCESS(rv
, rv
);
148 nsCOMPtr
<rdfITripleVisitor
> tv
= new TriplesVisitor(bufout
);
149 NS_ENSURE_TRUE(tv
, NS_ERROR_OUT_OF_MEMORY
);
150 return aDataSource
->VisitAllTriples(tv
);