1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "mozilla/glean/bindings/Denominator.h"
8 
9 #include "nsString.h"
10 #include "mozilla/Components.h"
11 #include "mozilla/ResultVariant.h"
12 #include "mozilla/glean/bindings/ScalarGIFFTMap.h"
13 #include "mozilla/glean/fog_ffi_generated.h"
14 #include "nsIClassInfoImpl.h"
15 
16 namespace mozilla::glean {
17 
18 namespace impl {
19 
Add(int32_t aAmount) const20 void DenominatorMetric::Add(int32_t aAmount) const {
21   auto scalarId = ScalarIdForMetric(mId);
22   if (scalarId && aAmount >= 0) {
23     Telemetry::ScalarAdd(scalarId.extract(), aAmount);
24   }
25   fog_denominator_add(mId, aAmount);
26 }
27 
TestGetValue(const nsACString & aPingName) const28 Result<Maybe<int32_t>, nsCString> DenominatorMetric::TestGetValue(
29     const nsACString& aPingName) const {
30   nsCString err;
31   if (fog_denominator_test_get_error(mId, &aPingName, &err)) {
32     return Err(err);
33   }
34   if (!fog_denominator_test_has_value(mId, &aPingName)) {
35     return Maybe<int32_t>();
36   }
37   return Some(fog_denominator_test_get_value(mId, &aPingName));
38 }
39 
40 }  // namespace impl
41 
42 NS_IMPL_CLASSINFO(GleanDenominator, nullptr, 0, {0})
NS_IMPL_ISUPPORTS_CI(GleanDenominator,nsIGleanDenominator)43 NS_IMPL_ISUPPORTS_CI(GleanDenominator, nsIGleanDenominator)
44 
45 NS_IMETHODIMP
46 GleanDenominator::Add(int32_t aAmount) {
47   mDenominator.Add(aAmount);
48   return NS_OK;
49 }
50 
51 NS_IMETHODIMP
TestGetValue(const nsACString & aStorageName,JS::MutableHandleValue aResult)52 GleanDenominator::TestGetValue(const nsACString& aStorageName,
53                                JS::MutableHandleValue aResult) {
54   auto result = mDenominator.TestGetValue(aStorageName);
55   if (result.isErr()) {
56     aResult.set(JS::UndefinedValue());
57     LogToBrowserConsole(nsIScriptError::errorFlag,
58                         NS_ConvertUTF8toUTF16(result.unwrapErr()));
59     return NS_ERROR_LOSS_OF_SIGNIFICANT_DATA;
60   }
61   auto optresult = result.unwrap();
62   if (optresult.isNothing()) {
63     aResult.set(JS::UndefinedValue());
64   } else {
65     aResult.set(JS::Int32Value(optresult.value()));
66   }
67   return NS_OK;
68 }
69 
70 }  // namespace mozilla::glean
71