rdf/base/src/rdfTriplesSerializer.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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"
     8 #include "nsCRT.h"
     9 #include "nsCOMPtr.h"
    10 #include "nsString.h"
    11 #include "nsPrintfCString.h"
    12 #include "nsIBufferedStreams.h"
    13 #include "nsNetCID.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
    25 {
    26 public:
    27     TriplesVisitor(nsIOutputStream* aOut) : mOut(aOut) {}
    28     NS_DECL_RDFITRIPLEVISITOR
    29     NS_DECL_ISUPPORTS
    30 protected:
    31     nsresult writeResource(nsIRDFResource* aResource);
    32     nsIOutputStream* mOut;
    33 };
    35 NS_IMPL_ISUPPORTS(TriplesVisitor, rdfITripleVisitor)
    37 nsresult
    38 TriplesVisitor::writeResource(nsIRDFResource *aResource)
    39 {
    40     nsCString res;
    41     uint32_t writeCount, wroteCount;
    42     mOut->Write("<", 1, &wroteCount);
    43     NS_ENSURE_TRUE(wroteCount == 1, NS_ERROR_FAILURE);
    44     nsresult rv = aResource->GetValueUTF8(res);
    45     NS_ENSURE_SUCCESS(rv, rv);
    46     writeCount = res.Length();
    47     mOut->Write(res.get(), writeCount, &wroteCount);
    48     NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
    49     mOut->Write("> ", 2, &wroteCount);
    50     NS_ENSURE_TRUE(wroteCount == 2, NS_ERROR_FAILURE);
    51     return NS_OK;
    52 }
    54 NS_IMETHODIMP
    55 TriplesVisitor::Visit(nsIRDFNode *aSubject, nsIRDFResource *aPredicate,
    56                       nsIRDFNode *aObject, bool aTruthValue)
    57 {
    58     nsCOMPtr<nsIRDFResource> subjectRes = do_QueryInterface(aSubject);
    59     nsresult rv = NS_OK;
    60     if (subjectRes) {
    61         rv = writeResource(subjectRes);
    62     }
    63     if (NS_FAILED(rv)) {
    64         return rv;
    65     }
    66     rv = writeResource(aPredicate);
    67     if (NS_FAILED(rv)) {
    68         return rv;
    69     }
    70     nsCOMPtr<nsIRDFResource> res = do_QueryInterface(aObject);
    71     nsCOMPtr<nsIRDFLiteral> lit;
    72     nsCOMPtr<nsIRDFInt> intLit;
    73     uint32_t wroteCount;
    74     if (res) {
    75         rv = writeResource(res);
    76     } else if ((lit = do_QueryInterface(aObject)) != nullptr) {
    77         const char16_t *value;
    78         lit->GetValueConst(&value);
    79         nsAutoCString object;
    80         object.AppendLiteral("\"");
    81         AppendUTF16toUTF8(value, object);
    82         object.AppendLiteral("\" ");
    83         uint32_t writeCount = object.Length();
    84         rv = mOut->Write(object.get(), writeCount, &wroteCount);
    85         NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
    86     } else if ((intLit = do_QueryInterface(aObject)) != nullptr) {
    87         int32_t value;
    88         intLit->GetValue(&value);
    89         nsPrintfCString
    90             object("\"%i\"^^<http://www.w3.org/2001/XMLSchema#integer> ",
    91                    value);
    92         uint32_t writeCount = object.Length();
    93         rv = mOut->Write(object.get(), writeCount, &wroteCount);
    94         NS_ENSURE_TRUE(writeCount == wroteCount, NS_ERROR_FAILURE);
    95     }
    96     NS_ENSURE_SUCCESS(rv, rv);
    97     return mOut->Write(".\n", 2, &wroteCount);
    98 }
   100 class rdfTriplesSerializer MOZ_FINAL : public rdfISerializer
   101 {
   102 public:
   103   NS_DECL_ISUPPORTS
   104   NS_DECL_RDFISERIALIZER
   106   rdfTriplesSerializer();
   108 private:
   109   ~rdfTriplesSerializer();
   111 };
   113 nsresult
   114 NS_NewTriplesSerializer(rdfISerializer** aResult)
   115 {
   116     NS_PRECONDITION(aResult != nullptr, "null ptr");
   117     if (! aResult)
   118         return NS_ERROR_NULL_POINTER;
   120     *aResult = new rdfTriplesSerializer();
   121     if (! *aResult)
   122         return NS_ERROR_OUT_OF_MEMORY;
   123     NS_ADDREF(*aResult);
   124     return NS_OK;
   125 }
   127 NS_IMPL_ISUPPORTS(rdfTriplesSerializer, rdfISerializer)
   129 rdfTriplesSerializer::rdfTriplesSerializer()
   130 {
   131 }
   133 rdfTriplesSerializer::~rdfTriplesSerializer()
   134 {
   135 }
   137 NS_IMETHODIMP
   138 rdfTriplesSerializer::Serialize(rdfIDataSource *aDataSource,
   139                                 nsIOutputStream *aOut)
   140 {
   141     nsresult rv;
   142     nsCOMPtr<nsIBufferedOutputStream> bufout = 
   143         do_CreateInstance(NS_BUFFEREDOUTPUTSTREAM_CONTRACTID, &rv);
   144     NS_ENSURE_SUCCESS(rv, rv);
   145     rv = bufout->Init(aOut, 1024);
   146     NS_ENSURE_SUCCESS(rv, rv);
   147     nsCOMPtr<rdfITripleVisitor> tv = new TriplesVisitor(bufout);
   148     NS_ENSURE_TRUE(tv, NS_ERROR_OUT_OF_MEMORY);
   149     return aDataSource->VisitAllTriples(tv);
   150 }

mercurial