blob: 13485481a5f3d123d16149f64189974e3c6c8a42 [file] [log] [blame]
Vova Sharaienko3092c962021-02-01 23:38:12 +00001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vova Sharaienko40dc2402023-01-28 05:51:00 +000017#define DEBUG false // STOPSHIP if true
Vova Sharaienko3092c962021-02-01 23:38:12 +000018#define LOG_TAG "StatsAidl"
19
Vova Sharaienko40dc2402023-01-28 05:51:00 +000020#include "StatsAidl.h"
21
Vova Sharaienko3092c962021-02-01 23:38:12 +000022#include <log/log.h>
23#include <statslog.h>
24
Vova Sharaienko3092c962021-02-01 23:38:12 +000025namespace aidl {
26namespace android {
27namespace frameworks {
28namespace stats {
29
Vova Sharaienko40dc2402023-01-28 05:51:00 +000030StatsHal::StatsHal() {
31}
Vova Sharaienko3092c962021-02-01 23:38:12 +000032
33ndk::ScopedAStatus StatsHal::reportVendorAtom(const VendorAtom& vendorAtom) {
Vova Sharaienko3092c962021-02-01 23:38:12 +000034 if (vendorAtom.atomId < 100000 || vendorAtom.atomId >= 200000) {
Vova Sharaienko40dc2402023-01-28 05:51:00 +000035 ALOGE("Atom ID %ld is not a valid vendor atom ID", (long)vendorAtom.atomId);
Vova Sharaienko3092c962021-02-01 23:38:12 +000036 return ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
Vova Sharaienko40dc2402023-01-28 05:51:00 +000037 -1, "Not a valid vendor atom ID");
Vova Sharaienko3092c962021-02-01 23:38:12 +000038 }
Vova Sharaienko5764fc12022-12-09 02:40:35 +000039 if (vendorAtom.reverseDomainName.length() > 50) {
40 ALOGE("Vendor atom reverse domain name %s is too long.",
Vova Sharaienko40dc2402023-01-28 05:51:00 +000041 vendorAtom.reverseDomainName.c_str());
Vova Sharaienko3092c962021-02-01 23:38:12 +000042 return ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
Vova Sharaienko40dc2402023-01-28 05:51:00 +000043 -1, "Vendor atom reverse domain name is too long");
Vova Sharaienko3092c962021-02-01 23:38:12 +000044 }
45 AStatsEvent* event = AStatsEvent_obtain();
46 AStatsEvent_setAtomId(event, vendorAtom.atomId);
47 AStatsEvent_writeString(event, vendorAtom.reverseDomainName.c_str());
48 for (const auto& atomValue : vendorAtom.values) {
49 switch (atomValue.getTag()) {
50 case VendorAtomValue::intValue:
Vova Sharaienko40dc2402023-01-28 05:51:00 +000051 AStatsEvent_writeInt32(event, atomValue.get<VendorAtomValue::intValue>());
Vova Sharaienko3092c962021-02-01 23:38:12 +000052 break;
53 case VendorAtomValue::longValue:
Vova Sharaienko40dc2402023-01-28 05:51:00 +000054 AStatsEvent_writeInt64(event, atomValue.get<VendorAtomValue::longValue>());
Vova Sharaienko3092c962021-02-01 23:38:12 +000055 break;
56 case VendorAtomValue::floatValue:
Vova Sharaienko40dc2402023-01-28 05:51:00 +000057 AStatsEvent_writeFloat(event, atomValue.get<VendorAtomValue::floatValue>());
Vova Sharaienko3092c962021-02-01 23:38:12 +000058 break;
59 case VendorAtomValue::stringValue:
60 AStatsEvent_writeString(event,
Vova Sharaienko40dc2402023-01-28 05:51:00 +000061 atomValue.get<VendorAtomValue::stringValue>().c_str());
Vova Sharaienko3092c962021-02-01 23:38:12 +000062 break;
Vova Sharaienko5540ebc2022-04-08 05:53:43 +000063 case VendorAtomValue::boolValue:
Vova Sharaienko40dc2402023-01-28 05:51:00 +000064 AStatsEvent_writeBool(event, atomValue.get<VendorAtomValue::boolValue>());
Vova Sharaienko5540ebc2022-04-08 05:53:43 +000065 break;
tsaichristine5f5f5792022-09-09 16:26:31 -070066 case VendorAtomValue::repeatedIntValue: {
67 const std::optional<std::vector<int>>& repeatedIntValue =
68 atomValue.get<VendorAtomValue::repeatedIntValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -070069 if (!repeatedIntValue) {
70 AStatsEvent_writeInt32Array(event, {}, 0);
71 break;
72 }
tsaichristine5f5f5792022-09-09 16:26:31 -070073 AStatsEvent_writeInt32Array(event, repeatedIntValue->data(),
74 repeatedIntValue->size());
75 break;
76 }
77 case VendorAtomValue::repeatedLongValue: {
78 const std::optional<std::vector<int64_t>>& repeatedLongValue =
79 atomValue.get<VendorAtomValue::repeatedLongValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -070080 if (!repeatedLongValue) {
81 AStatsEvent_writeInt64Array(event, {}, 0);
82 break;
83 }
tsaichristine5f5f5792022-09-09 16:26:31 -070084 AStatsEvent_writeInt64Array(event, repeatedLongValue->data(),
85 repeatedLongValue->size());
86 break;
87 }
88 case VendorAtomValue::repeatedFloatValue: {
89 const std::optional<std::vector<float>>& repeatedFloatValue =
90 atomValue.get<VendorAtomValue::repeatedFloatValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -070091 if (!repeatedFloatValue) {
92 AStatsEvent_writeFloatArray(event, {}, 0);
93 break;
94 }
tsaichristine5f5f5792022-09-09 16:26:31 -070095 AStatsEvent_writeFloatArray(event, repeatedFloatValue->data(),
96 repeatedFloatValue->size());
97 break;
98 }
99 case VendorAtomValue::repeatedStringValue: {
100 const std::optional<std::vector<std::optional<std::string>>>& repeatedStringValue =
101 atomValue.get<VendorAtomValue::repeatedStringValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -0700102 if (!repeatedStringValue) {
103 AStatsEvent_writeStringArray(event, {}, 0);
104 break;
105 }
tsaichristine5f5f5792022-09-09 16:26:31 -0700106 const std::vector<std::optional<std::string>>& repeatedStringVector =
107 *repeatedStringValue;
108 const char* cStringArray[repeatedStringVector.size()];
109
110 for (int i = 0; i < repeatedStringVector.size(); ++i) {
tsaichristinee83b5f22022-09-26 18:33:05 -0700111 cStringArray[i] = repeatedStringVector[i].has_value()
Vova Sharaienko40dc2402023-01-28 05:51:00 +0000112 ? repeatedStringVector[i]->c_str()
113 : "";
tsaichristine5f5f5792022-09-09 16:26:31 -0700114 }
115
116 AStatsEvent_writeStringArray(event, cStringArray, repeatedStringVector.size());
117 break;
118 }
119 case VendorAtomValue::repeatedBoolValue: {
120 const std::optional<std::vector<bool>>& repeatedBoolValue =
121 atomValue.get<VendorAtomValue::repeatedBoolValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -0700122 if (!repeatedBoolValue) {
123 AStatsEvent_writeBoolArray(event, {}, 0);
124 break;
125 }
tsaichristine5f5f5792022-09-09 16:26:31 -0700126 const std::vector<bool>& repeatedBoolVector = *repeatedBoolValue;
127 bool boolArray[repeatedBoolValue->size()];
128
129 for (int i = 0; i < repeatedBoolVector.size(); ++i) {
130 boolArray[i] = repeatedBoolVector[i];
131 }
132
133 AStatsEvent_writeBoolArray(event, boolArray, repeatedBoolVector.size());
134 break;
135 }
136 case VendorAtomValue::byteArrayValue: {
137 const std::optional<std::vector<uint8_t>>& byteArrayValue =
138 atomValue.get<VendorAtomValue::byteArrayValue>();
tsaichristinee83b5f22022-09-26 18:33:05 -0700139 if (!byteArrayValue) {
140 AStatsEvent_writeByteArray(event, {}, 0);
141 break;
142 }
tsaichristine5f5f5792022-09-09 16:26:31 -0700143 AStatsEvent_writeByteArray(event, byteArrayValue->data(), byteArrayValue->size());
144 break;
145 }
Vova Sharaienko3092c962021-02-01 23:38:12 +0000146 }
147 }
148 AStatsEvent_build(event);
149 const int ret = AStatsEvent_write(event);
150 AStatsEvent_release(event);
151
Vova Sharaienko40dc2402023-01-28 05:51:00 +0000152 return ret <= 0 ? ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(ret,
153 "report atom failed")
154 : ndk::ScopedAStatus::ok();
Vova Sharaienko3092c962021-02-01 23:38:12 +0000155}
156
157} // namespace stats
158} // namespace frameworks
159} // namespace android
160} // namespace aidl