fune/rdf/base/rdfutil.cpp
Nicholas Nethercote f582d96b98 Bug 1390428 (part 9) - Remove nsXPIDLCString. r=erahm.
This is straightforward, with only two notable things.

- `#include "nsXPIDLString.h" is replaced with `#include "nsString.h"`
  throughout, because all nsXPIDLString.h did was include nsString.h. The
  exception is for files which already include nsString.h, in which case the
  patch just removes the nsXPIDLString.h inclusion.

- The patch removes the |xpidl_string| gtest, but improves the |voided| test to
  cover some of its ground, e.g. testing Adopt(nullptr).

--HG--
extra : rebase_source : 452cc4a08046a1adb1a8099a7e85a1917de5add8
2017-08-17 15:29:03 +10:00

110 lines
3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
Implementations for a bunch of useful RDF utility routines. Many of
these will eventually be exported outside of RDF.DLL via the
nsIRDFService interface.
TO DO
1) Make this so that it doesn't permanently leak the RDF service
object.
2) Make container functions thread-safe. They currently don't ensure
that the RDF:nextVal property is maintained safely.
*/
#include "nsCOMPtr.h"
#include "nsIRDFDataSource.h"
#include "nsIRDFNode.h"
#include "nsIRDFService.h"
#include "nsIServiceManager.h"
#include "nsIURL.h"
#include "nsIIOService.h"
#include "nsIURL.h"
#include "nsRDFCID.h"
#include "nsString.h"
#include "nsUnicharUtils.h"
#include "rdfutil.h"
#include "prtime.h"
////////////////////////////////////////////////////////////////////////
nsresult
rdf_MakeRelativeRef(const nsACString& aBaseURI, nsCString& aURI)
{
// This implementation is extremely simple: e.g., it can't compute
// relative paths, or anything fancy like that. If the context URI
// is not a prefix of the URI in question, we'll just bail.
uint32_t prefixLen = aBaseURI.Length();
if (prefixLen != 0 && StringBeginsWith(aURI, aBaseURI)) {
if (prefixLen < aURI.Length() && aURI.CharAt(prefixLen) == '/')
++prefixLen; // chop the leading slash so it's not `absolute'
aURI.Cut(0, prefixLen);
}
return NS_OK;
}
void
rdf_FormatDate(PRTime aTime, nsACString &aResult)
{
// Outputs Unixish date in GMT plus usecs; e.g.,
// Wed Jan 9 19:15:13 2002 +002441
//
PRExplodedTime t;
PR_ExplodeTime(aTime, PR_GMTParameters, &t);
char buf[256];
PR_FormatTimeUSEnglish(buf, sizeof buf, "%a %b %d %H:%M:%S %Y", &t);
aResult.Append(buf);
// usecs
aResult.AppendLiteral(" +");
int32_t usec = t.tm_usec;
for (int32_t digit = 100000; digit > 1; digit /= 10) {
aResult.Append(char('0' + (usec / digit)));
usec %= digit;
}
aResult.Append(char('0' + usec));
}
PRTime
rdf_ParseDate(const nsACString &aTime)
{
PRTime t;
PR_ParseTimeString(PromiseFlatCString(aTime).get(), true, &t);
int32_t usec = 0;
nsACString::const_iterator begin, digit, end;
aTime.BeginReading(begin);
aTime.EndReading(end);
// Walk backwards until we find a `+', run out of string, or a
// non-numeric character.
digit = end;
while (--digit != begin && *digit != '+') {
if (*digit < '0' || *digit > '9')
break;
}
if (digit != begin && *digit == '+') {
// There's a usec field specified (or, at least, something
// that looks close enough. Parse it, and add it to the time.
while (++digit != end) {
usec *= 10;
usec += *digit - '0';
}
t += usec;
}
return t;
}