summaryrefslogtreecommitdiffstats
path: root/dom/media/doctor/DDLogValue.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/media/doctor/DDLogValue.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/dom/media/doctor/DDLogValue.cpp b/dom/media/doctor/DDLogValue.cpp
new file mode 100644
index 0000000000..74044ca05a
--- /dev/null
+++ b/dom/media/doctor/DDLogValue.cpp
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et cindent: */
+/* 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/. */
+
+#include "DDLogValue.h"
+
+#include "mozilla/JSONWriter.h"
+
+namespace mozilla {
+
+struct LogValueMatcher {
+ nsCString& mString;
+
+ void operator()(const DDNoValue&) const {}
+ void operator()(const DDLogObject& a) const { a.AppendPrintf(mString); }
+ void operator()(const char* a) const { mString.AppendPrintf(R"("%s")", a); }
+ void operator()(const nsCString& a) const {
+ mString.AppendPrintf(R"(nsCString("%s"))", a.Data());
+ }
+ void operator()(bool a) const { mString.AppendPrintf(a ? "true" : "false"); }
+ void operator()(int8_t a) const {
+ mString.AppendPrintf("int8_t(%" PRIi8 ")", a);
+ }
+ void operator()(uint8_t a) const {
+ mString.AppendPrintf("uint8_t(%" PRIu8 ")", a);
+ }
+ void operator()(int16_t a) const {
+ mString.AppendPrintf("int16_t(%" PRIi16 ")", a);
+ }
+ void operator()(uint16_t a) const {
+ mString.AppendPrintf("uint16_t(%" PRIu16 ")", a);
+ }
+ void operator()(int32_t a) const {
+ mString.AppendPrintf("int32_t(%" PRIi32 ")", a);
+ }
+ void operator()(uint32_t a) const {
+ mString.AppendPrintf("uint32_t(%" PRIu32 ")", a);
+ }
+ void operator()(int64_t a) const {
+ mString.AppendPrintf("int64_t(%" PRIi64 ")", a);
+ }
+ void operator()(uint64_t a) const {
+ mString.AppendPrintf("uint64_t(%" PRIu64 ")", a);
+ }
+ void operator()(double a) const { mString.AppendPrintf("double(%f)", a); }
+ void operator()(const DDRange& a) const {
+ mString.AppendPrintf("%" PRIi64 "<=(%" PRIi64 "B)<%" PRIi64 "", a.mOffset,
+ a.mBytes, a.mOffset + a.mBytes);
+ }
+ void operator()(const nsresult& a) const {
+ nsCString name;
+ GetErrorName(a, name);
+ mString.AppendPrintf("nsresult(%s =0x%08" PRIx32 ")", name.get(),
+ static_cast<uint32_t>(a));
+ }
+ void operator()(const MediaResult& a) const {
+ nsCString name;
+ GetErrorName(a.Code(), name);
+ mString.AppendPrintf("MediaResult(%s =0x%08" PRIx32 ", \"%s\")", name.get(),
+ static_cast<uint32_t>(a.Code()), a.Message().get());
+ }
+};
+
+void AppendToString(const DDLogValue& aValue, nsCString& aString) {
+ aValue.match(LogValueMatcher{aString});
+}
+
+struct LogValueMatcherJson {
+ JSONWriter& mJW;
+ const Span<const char> mPropertyName;
+
+ void operator()(const DDNoValue&) const { mJW.NullProperty(mPropertyName); }
+ void operator()(const DDLogObject& a) const {
+ nsPrintfCString s(R"("%s[%p]")", a.TypeName(), a.Pointer());
+ mJW.StringProperty(mPropertyName, s);
+ }
+ void operator()(const char* a) const {
+ mJW.StringProperty(mPropertyName, MakeStringSpan(a));
+ }
+ void operator()(const nsCString& a) const {
+ mJW.StringProperty(mPropertyName, a);
+ }
+ void operator()(bool a) const { mJW.BoolProperty(mPropertyName, a); }
+ void operator()(int8_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(uint8_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(int16_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(uint16_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(int32_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(uint32_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(int64_t a) const { mJW.IntProperty(mPropertyName, a); }
+ void operator()(uint64_t a) const { mJW.DoubleProperty(mPropertyName, a); }
+ void operator()(double a) const { mJW.DoubleProperty(mPropertyName, a); }
+ void operator()(const DDRange& a) const {
+ mJW.StartArrayProperty(mPropertyName);
+ mJW.IntElement(a.mOffset);
+ mJW.IntElement(a.mOffset + a.mBytes);
+ mJW.EndArray();
+ }
+ void operator()(const nsresult& a) const {
+ nsCString name;
+ GetErrorName(a, name);
+ mJW.StringProperty(mPropertyName, name);
+ }
+ void operator()(const MediaResult& a) const {
+ nsCString name;
+ GetErrorName(a.Code(), name);
+ mJW.StringProperty(mPropertyName,
+ nsPrintfCString(R"lit("MediaResult(%s, %s)")lit",
+ name.get(), a.Message().get()));
+ }
+};
+
+void ToJSON(const DDLogValue& aValue, JSONWriter& aJSONWriter,
+ const char* aPropertyName) {
+ aValue.match(LogValueMatcherJson{aJSONWriter, MakeStringSpan(aPropertyName)});
+}
+
+} // namespace mozilla