1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/rdf/base/src/rdfTriplesSerializer.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,150 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "nsIOutputStream.h" 1.10 +#include "nsReadableUtils.h" 1.11 +#include "nsCRT.h" 1.12 +#include "nsCOMPtr.h" 1.13 +#include "nsString.h" 1.14 +#include "nsPrintfCString.h" 1.15 +#include "nsIBufferedStreams.h" 1.16 +#include "nsNetCID.h" 1.17 +#include "nsComponentManagerUtils.h" 1.18 + 1.19 +#include "rdfISerializer.h" 1.20 +#include "rdfIDataSource.h" 1.21 +#include "rdfITripleVisitor.h" 1.22 + 1.23 +#include "nsIRDFResource.h" 1.24 +#include "nsIRDFLiteral.h" 1.25 +#include "mozilla/Attributes.h" 1.26 + 1.27 +class TriplesVisitor MOZ_FINAL : public rdfITripleVisitor 1.28 +{ 1.29 +public: 1.30 + TriplesVisitor(nsIOutputStream* aOut) : mOut(aOut) {} 1.31 + NS_DECL_RDFITRIPLEVISITOR 1.32 + NS_DECL_ISUPPORTS 1.33 +protected: 1.34 + nsresult writeResource(nsIRDFResource* aResource); 1.35 + nsIOutputStream* mOut; 1.36 +}; 1.37 + 1.38 +NS_IMPL_ISUPPORTS(TriplesVisitor, rdfITripleVisitor) 1.39 + 1.40 +nsresult 1.41 +TriplesVisitor::writeResource(nsIRDFResource *aResource) 1.42 +{ 1.43 + nsCString res; 1.44 + uint32_t writeCount, wroteCount; 1.45 + mOut->Write("<", 1, &wroteCount); 1.46 + NS_ENSURE_TRUE(wroteCount == 1, NS_ERROR_FAILURE); 1.47 + nsresult rv = aResource->GetValueUTF8(res); 1.48 + NS_ENSURE_SUCCESS(rv, rv); 1.49 + writeCount = res.Length(); 1.50 + mOut->Write(res.get(), writeCount, &wroteCount); 1.51 + NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE); 1.52 + mOut->Write("> ", 2, &wroteCount); 1.53 + NS_ENSURE_TRUE(wroteCount == 2, NS_ERROR_FAILURE); 1.54 + return NS_OK; 1.55 +} 1.56 + 1.57 +NS_IMETHODIMP 1.58 +TriplesVisitor::Visit(nsIRDFNode *aSubject, nsIRDFResource *aPredicate, 1.59 + nsIRDFNode *aObject, bool aTruthValue) 1.60 +{ 1.61 + nsCOMPtr<nsIRDFResource> subjectRes = do_QueryInterface(aSubject); 1.62 + nsresult rv = NS_OK; 1.63 + if (subjectRes) { 1.64 + rv = writeResource(subjectRes); 1.65 + } 1.66 + if (NS_FAILED(rv)) { 1.67 + return rv; 1.68 + } 1.69 + rv = writeResource(aPredicate); 1.70 + if (NS_FAILED(rv)) { 1.71 + return rv; 1.72 + } 1.73 + nsCOMPtr<nsIRDFResource> res = do_QueryInterface(aObject); 1.74 + nsCOMPtr<nsIRDFLiteral> lit; 1.75 + nsCOMPtr<nsIRDFInt> intLit; 1.76 + uint32_t wroteCount; 1.77 + if (res) { 1.78 + rv = writeResource(res); 1.79 + } else if ((lit = do_QueryInterface(aObject)) != nullptr) { 1.80 + const char16_t *value; 1.81 + lit->GetValueConst(&value); 1.82 + nsAutoCString object; 1.83 + object.AppendLiteral("\""); 1.84 + AppendUTF16toUTF8(value, object); 1.85 + object.AppendLiteral("\" "); 1.86 + uint32_t writeCount = object.Length(); 1.87 + rv = mOut->Write(object.get(), writeCount, &wroteCount); 1.88 + NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE); 1.89 + } else if ((intLit = do_QueryInterface(aObject)) != nullptr) { 1.90 + int32_t value; 1.91 + intLit->GetValue(&value); 1.92 + nsPrintfCString 1.93 + object("\"%i\"^^<http://www.w3.org/2001/XMLSchema#integer> ", 1.94 + value); 1.95 + uint32_t writeCount = object.Length(); 1.96 + rv = mOut->Write(object.get(), writeCount, &wroteCount); 1.97 + NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE); 1.98 + } 1.99 + NS_ENSURE_SUCCESS(rv, rv); 1.100 + return mOut->Write(".\n", 2, &wroteCount); 1.101 +} 1.102 + 1.103 +class rdfTriplesSerializer MOZ_FINAL : public rdfISerializer 1.104 +{ 1.105 +public: 1.106 + NS_DECL_ISUPPORTS 1.107 + NS_DECL_RDFISERIALIZER 1.108 + 1.109 + rdfTriplesSerializer(); 1.110 + 1.111 +private: 1.112 + ~rdfTriplesSerializer(); 1.113 + 1.114 +}; 1.115 + 1.116 +nsresult 1.117 +NS_NewTriplesSerializer(rdfISerializer** aResult) 1.118 +{ 1.119 + NS_PRECONDITION(aResult != nullptr, "null ptr"); 1.120 + if (! aResult) 1.121 + return NS_ERROR_NULL_POINTER; 1.122 + 1.123 + *aResult = new rdfTriplesSerializer(); 1.124 + if (! *aResult) 1.125 + return NS_ERROR_OUT_OF_MEMORY; 1.126 + NS_ADDREF(*aResult); 1.127 + return NS_OK; 1.128 +} 1.129 + 1.130 +NS_IMPL_ISUPPORTS(rdfTriplesSerializer, rdfISerializer) 1.131 + 1.132 +rdfTriplesSerializer::rdfTriplesSerializer() 1.133 +{ 1.134 +} 1.135 + 1.136 +rdfTriplesSerializer::~rdfTriplesSerializer() 1.137 +{ 1.138 +} 1.139 + 1.140 +NS_IMETHODIMP 1.141 +rdfTriplesSerializer::Serialize(rdfIDataSource *aDataSource, 1.142 + nsIOutputStream *aOut) 1.143 +{ 1.144 + nsresult rv; 1.145 + nsCOMPtr<nsIBufferedOutputStream> bufout = 1.146 + do_CreateInstance(NS_BUFFEREDOUTPUTSTREAM_CONTRACTID, &rv); 1.147 + NS_ENSURE_SUCCESS(rv, rv); 1.148 + rv = bufout->Init(aOut, 1024); 1.149 + NS_ENSURE_SUCCESS(rv, rv); 1.150 + nsCOMPtr<rdfITripleVisitor> tv = new TriplesVisitor(bufout); 1.151 + NS_ENSURE_TRUE(tv, NS_ERROR_OUT_OF_MEMORY); 1.152 + return aDataSource->VisitAllTriples(tv); 1.153 +}