1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker *
4*84e33947SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker *
8*84e33947SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker *
10*84e33947SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker */
16*84e33947SAndroid Build Coastguard Worker
17*84e33947SAndroid Build Coastguard Worker #include "chre_host/host_protocol_host.h"
18*84e33947SAndroid Build Coastguard Worker
19*84e33947SAndroid Build Coastguard Worker #include <inttypes.h>
20*84e33947SAndroid Build Coastguard Worker #include <string.h>
21*84e33947SAndroid Build Coastguard Worker
22*84e33947SAndroid Build Coastguard Worker #include "chre_host/log.h"
23*84e33947SAndroid Build Coastguard Worker
24*84e33947SAndroid Build Coastguard Worker using flatbuffers::FlatBufferBuilder;
25*84e33947SAndroid Build Coastguard Worker using flatbuffers::Offset;
26*84e33947SAndroid Build Coastguard Worker
27*84e33947SAndroid Build Coastguard Worker // Aliased for consistency with the way these symbols are referenced in
28*84e33947SAndroid Build Coastguard Worker // CHRE-side code
29*84e33947SAndroid Build Coastguard Worker namespace fbs = ::chre::fbs;
30*84e33947SAndroid Build Coastguard Worker
31*84e33947SAndroid Build Coastguard Worker namespace android {
32*84e33947SAndroid Build Coastguard Worker namespace chre {
33*84e33947SAndroid Build Coastguard Worker
34*84e33947SAndroid Build Coastguard Worker // This is similar to getStringFromByteVector in host_protocol_chre.h. Ensure
35*84e33947SAndroid Build Coastguard Worker // that method's implementation is kept in sync with this.
getStringFromByteVector(const std::vector<int8_t> & vec)36*84e33947SAndroid Build Coastguard Worker const char *getStringFromByteVector(const std::vector<int8_t> &vec) {
37*84e33947SAndroid Build Coastguard Worker constexpr int8_t kNullChar = static_cast<int8_t>('\0');
38*84e33947SAndroid Build Coastguard Worker const char *str = nullptr;
39*84e33947SAndroid Build Coastguard Worker
40*84e33947SAndroid Build Coastguard Worker // Check that the vector is present, non-empty, and null-terminated
41*84e33947SAndroid Build Coastguard Worker if (vec.size() > 0 && vec[vec.size() - 1] == kNullChar) {
42*84e33947SAndroid Build Coastguard Worker str = reinterpret_cast<const char *>(vec.data());
43*84e33947SAndroid Build Coastguard Worker }
44*84e33947SAndroid Build Coastguard Worker
45*84e33947SAndroid Build Coastguard Worker return str;
46*84e33947SAndroid Build Coastguard Worker }
47*84e33947SAndroid Build Coastguard Worker
decodeMessageFromChre(const void * message,size_t messageLen,IChreMessageHandlers & handlers)48*84e33947SAndroid Build Coastguard Worker bool HostProtocolHost::decodeMessageFromChre(const void *message,
49*84e33947SAndroid Build Coastguard Worker size_t messageLen,
50*84e33947SAndroid Build Coastguard Worker IChreMessageHandlers &handlers) {
51*84e33947SAndroid Build Coastguard Worker bool success = verifyMessage(message, messageLen);
52*84e33947SAndroid Build Coastguard Worker if (success) {
53*84e33947SAndroid Build Coastguard Worker std::unique_ptr<fbs::MessageContainerT> container =
54*84e33947SAndroid Build Coastguard Worker fbs::UnPackMessageContainer(message);
55*84e33947SAndroid Build Coastguard Worker fbs::ChreMessageUnion &msg = container->message;
56*84e33947SAndroid Build Coastguard Worker
57*84e33947SAndroid Build Coastguard Worker switch (container->message.type) {
58*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::NanoappMessage:
59*84e33947SAndroid Build Coastguard Worker handlers.handleNanoappMessage(*msg.AsNanoappMessage());
60*84e33947SAndroid Build Coastguard Worker break;
61*84e33947SAndroid Build Coastguard Worker
62*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::HubInfoResponse:
63*84e33947SAndroid Build Coastguard Worker handlers.handleHubInfoResponse(*msg.AsHubInfoResponse());
64*84e33947SAndroid Build Coastguard Worker break;
65*84e33947SAndroid Build Coastguard Worker
66*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::NanoappListResponse:
67*84e33947SAndroid Build Coastguard Worker handlers.handleNanoappListResponse(*msg.AsNanoappListResponse());
68*84e33947SAndroid Build Coastguard Worker break;
69*84e33947SAndroid Build Coastguard Worker
70*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::LoadNanoappResponse:
71*84e33947SAndroid Build Coastguard Worker handlers.handleLoadNanoappResponse(*msg.AsLoadNanoappResponse());
72*84e33947SAndroid Build Coastguard Worker break;
73*84e33947SAndroid Build Coastguard Worker
74*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::UnloadNanoappResponse:
75*84e33947SAndroid Build Coastguard Worker handlers.handleUnloadNanoappResponse(*msg.AsUnloadNanoappResponse());
76*84e33947SAndroid Build Coastguard Worker break;
77*84e33947SAndroid Build Coastguard Worker
78*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::DebugDumpData:
79*84e33947SAndroid Build Coastguard Worker handlers.handleDebugDumpData(*msg.AsDebugDumpData());
80*84e33947SAndroid Build Coastguard Worker break;
81*84e33947SAndroid Build Coastguard Worker
82*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::DebugDumpResponse:
83*84e33947SAndroid Build Coastguard Worker handlers.handleDebugDumpResponse(*msg.AsDebugDumpResponse());
84*84e33947SAndroid Build Coastguard Worker break;
85*84e33947SAndroid Build Coastguard Worker
86*84e33947SAndroid Build Coastguard Worker case fbs::ChreMessage::SelfTestResponse:
87*84e33947SAndroid Build Coastguard Worker handlers.handleSelfTestResponse(*msg.AsSelfTestResponse());
88*84e33947SAndroid Build Coastguard Worker break;
89*84e33947SAndroid Build Coastguard Worker
90*84e33947SAndroid Build Coastguard Worker default:
91*84e33947SAndroid Build Coastguard Worker success = handlers.handleContextHubV4Message(msg);
92*84e33947SAndroid Build Coastguard Worker }
93*84e33947SAndroid Build Coastguard Worker }
94*84e33947SAndroid Build Coastguard Worker
95*84e33947SAndroid Build Coastguard Worker return success;
96*84e33947SAndroid Build Coastguard Worker }
97*84e33947SAndroid Build Coastguard Worker
encodeHubInfoRequest(FlatBufferBuilder & builder)98*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeHubInfoRequest(FlatBufferBuilder &builder) {
99*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateHubInfoRequest(builder);
100*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::HubInfoRequest, request.Union());
101*84e33947SAndroid Build Coastguard Worker }
102*84e33947SAndroid Build Coastguard Worker
encodeDebugConfiguration(FlatBufferBuilder & builder)103*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeDebugConfiguration(FlatBufferBuilder &builder) {
104*84e33947SAndroid Build Coastguard Worker #ifdef CHRE_HEALTH_MONITOR_CHECK_CRASH
105*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateDebugConfiguration(builder, true);
106*84e33947SAndroid Build Coastguard Worker #else
107*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateDebugConfiguration(builder, false);
108*84e33947SAndroid Build Coastguard Worker #endif // CHRE_HEALTH_MONITOR_CHECK_CRASH
109*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::DebugConfiguration, request.Union());
110*84e33947SAndroid Build Coastguard Worker }
111*84e33947SAndroid Build Coastguard Worker
encodeFragmentedLoadNanoappRequest(flatbuffers::FlatBufferBuilder & builder,const FragmentedLoadRequest & request,bool respondBeforeStart)112*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeFragmentedLoadNanoappRequest(
113*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder,
114*84e33947SAndroid Build Coastguard Worker const FragmentedLoadRequest &request, bool respondBeforeStart) {
115*84e33947SAndroid Build Coastguard Worker encodeLoadNanoappRequestForBinary(
116*84e33947SAndroid Build Coastguard Worker builder, request.transactionId, request.appId, request.appVersion,
117*84e33947SAndroid Build Coastguard Worker request.appFlags, request.targetApiVersion, request.binary,
118*84e33947SAndroid Build Coastguard Worker request.fragmentId, request.appTotalSizeBytes, respondBeforeStart);
119*84e33947SAndroid Build Coastguard Worker }
120*84e33947SAndroid Build Coastguard Worker
encodeNanoappListRequest(FlatBufferBuilder & builder)121*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeNanoappListRequest(FlatBufferBuilder &builder) {
122*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateNanoappListRequest(builder);
123*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::NanoappListRequest, request.Union());
124*84e33947SAndroid Build Coastguard Worker }
125*84e33947SAndroid Build Coastguard Worker
encodeUnloadNanoappRequest(FlatBufferBuilder & builder,uint32_t transactionId,uint64_t appId,bool allowSystemNanoappUnload)126*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeUnloadNanoappRequest(
127*84e33947SAndroid Build Coastguard Worker FlatBufferBuilder &builder, uint32_t transactionId, uint64_t appId,
128*84e33947SAndroid Build Coastguard Worker bool allowSystemNanoappUnload) {
129*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateUnloadNanoappRequest(builder, transactionId, appId,
130*84e33947SAndroid Build Coastguard Worker allowSystemNanoappUnload);
131*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::UnloadNanoappRequest, request.Union());
132*84e33947SAndroid Build Coastguard Worker }
133*84e33947SAndroid Build Coastguard Worker
encodeTimeSyncMessage(FlatBufferBuilder & builder,int64_t offset)134*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeTimeSyncMessage(FlatBufferBuilder &builder,
135*84e33947SAndroid Build Coastguard Worker int64_t offset) {
136*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateTimeSyncMessage(builder, offset);
137*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::TimeSyncMessage, request.Union());
138*84e33947SAndroid Build Coastguard Worker }
139*84e33947SAndroid Build Coastguard Worker
encodeDebugDumpRequest(FlatBufferBuilder & builder)140*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeDebugDumpRequest(FlatBufferBuilder &builder) {
141*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateDebugDumpRequest(builder);
142*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::DebugDumpRequest, request.Union());
143*84e33947SAndroid Build Coastguard Worker }
144*84e33947SAndroid Build Coastguard Worker
extractHostClientIdAndType(const void * message,size_t messageLen,uint16_t * hostClientId,::chre::fbs::ChreMessage * messageType)145*84e33947SAndroid Build Coastguard Worker bool HostProtocolHost::extractHostClientIdAndType(
146*84e33947SAndroid Build Coastguard Worker const void *message, size_t messageLen, uint16_t *hostClientId,
147*84e33947SAndroid Build Coastguard Worker ::chre::fbs::ChreMessage *messageType) {
148*84e33947SAndroid Build Coastguard Worker bool success = false;
149*84e33947SAndroid Build Coastguard Worker if (hostClientId != nullptr && messageType != nullptr) {
150*84e33947SAndroid Build Coastguard Worker success = verifyMessage(message, messageLen);
151*84e33947SAndroid Build Coastguard Worker
152*84e33947SAndroid Build Coastguard Worker if (success) {
153*84e33947SAndroid Build Coastguard Worker const fbs::MessageContainer *container =
154*84e33947SAndroid Build Coastguard Worker fbs::GetMessageContainer(message);
155*84e33947SAndroid Build Coastguard Worker // host_addr guaranteed to be non-null via verifyMessage (it's a required
156*84e33947SAndroid Build Coastguard Worker // field)
157*84e33947SAndroid Build Coastguard Worker *hostClientId = container->host_addr()->client_id();
158*84e33947SAndroid Build Coastguard Worker *messageType = container->message_type();
159*84e33947SAndroid Build Coastguard Worker }
160*84e33947SAndroid Build Coastguard Worker }
161*84e33947SAndroid Build Coastguard Worker
162*84e33947SAndroid Build Coastguard Worker return success;
163*84e33947SAndroid Build Coastguard Worker }
164*84e33947SAndroid Build Coastguard Worker
mutateHostClientId(void * message,size_t messageLen,uint16_t hostClientId)165*84e33947SAndroid Build Coastguard Worker bool HostProtocolHost::mutateHostClientId(void *message, size_t messageLen,
166*84e33947SAndroid Build Coastguard Worker uint16_t hostClientId) {
167*84e33947SAndroid Build Coastguard Worker bool success = verifyMessage(message, messageLen);
168*84e33947SAndroid Build Coastguard Worker
169*84e33947SAndroid Build Coastguard Worker if (!success) {
170*84e33947SAndroid Build Coastguard Worker LOGE("Message verification failed - can't mutate host ID");
171*84e33947SAndroid Build Coastguard Worker } else {
172*84e33947SAndroid Build Coastguard Worker fbs::MessageContainer *container = fbs::GetMutableMessageContainer(message);
173*84e33947SAndroid Build Coastguard Worker // host_addr guaranteed to be non-null via verifyMessage (it's a required
174*84e33947SAndroid Build Coastguard Worker // field)
175*84e33947SAndroid Build Coastguard Worker container->mutable_host_addr()->mutate_client_id(hostClientId);
176*84e33947SAndroid Build Coastguard Worker success = true;
177*84e33947SAndroid Build Coastguard Worker }
178*84e33947SAndroid Build Coastguard Worker
179*84e33947SAndroid Build Coastguard Worker return success;
180*84e33947SAndroid Build Coastguard Worker }
181*84e33947SAndroid Build Coastguard Worker
encodeLoadNanoappRequestForBinary(FlatBufferBuilder & builder,uint32_t transactionId,uint64_t appId,uint32_t appVersion,uint32_t appFlags,uint32_t targetApiVersion,const std::vector<uint8_t> & nanoappBinary,uint32_t fragmentId,size_t appTotalSizeBytes,bool respondBeforeStart)182*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeLoadNanoappRequestForBinary(
183*84e33947SAndroid Build Coastguard Worker FlatBufferBuilder &builder, uint32_t transactionId, uint64_t appId,
184*84e33947SAndroid Build Coastguard Worker uint32_t appVersion, uint32_t appFlags, uint32_t targetApiVersion,
185*84e33947SAndroid Build Coastguard Worker const std::vector<uint8_t> &nanoappBinary, uint32_t fragmentId,
186*84e33947SAndroid Build Coastguard Worker size_t appTotalSizeBytes, bool respondBeforeStart) {
187*84e33947SAndroid Build Coastguard Worker auto appBinary = builder.CreateVector(nanoappBinary);
188*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateLoadNanoappRequest(
189*84e33947SAndroid Build Coastguard Worker builder, transactionId, appId, appVersion, targetApiVersion, appBinary,
190*84e33947SAndroid Build Coastguard Worker fragmentId, appTotalSizeBytes, 0 /* app_binary_file_name */, appFlags,
191*84e33947SAndroid Build Coastguard Worker respondBeforeStart);
192*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::LoadNanoappRequest, request.Union());
193*84e33947SAndroid Build Coastguard Worker }
194*84e33947SAndroid Build Coastguard Worker
encodeLoadNanoappRequestForFile(flatbuffers::FlatBufferBuilder & builder,uint32_t transactionId,uint64_t appId,uint32_t appVersion,uint32_t targetApiVersion,const char * nanoappBinaryName)195*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeLoadNanoappRequestForFile(
196*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, uint32_t transactionId,
197*84e33947SAndroid Build Coastguard Worker uint64_t appId, uint32_t appVersion, uint32_t targetApiVersion,
198*84e33947SAndroid Build Coastguard Worker const char *nanoappBinaryName) {
199*84e33947SAndroid Build Coastguard Worker const std::vector<uint8_t> emptyAppBinary;
200*84e33947SAndroid Build Coastguard Worker auto appBinary = builder.CreateVector(emptyAppBinary);
201*84e33947SAndroid Build Coastguard Worker auto appBinaryName = addStringAsByteVector(builder, nanoappBinaryName);
202*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateLoadNanoappRequest(
203*84e33947SAndroid Build Coastguard Worker builder, transactionId, appId, appVersion, targetApiVersion, appBinary,
204*84e33947SAndroid Build Coastguard Worker 0 /* fragmentId */, 0 /* appTotalSizeBytes */, appBinaryName);
205*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::LoadNanoappRequest, request.Union());
206*84e33947SAndroid Build Coastguard Worker }
207*84e33947SAndroid Build Coastguard Worker
encodeSettingChangeNotification(flatbuffers::FlatBufferBuilder & builder,::chre::fbs::Setting setting,::chre::fbs::SettingState newState)208*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeSettingChangeNotification(
209*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, ::chre::fbs::Setting setting,
210*84e33947SAndroid Build Coastguard Worker ::chre::fbs::SettingState newState) {
211*84e33947SAndroid Build Coastguard Worker auto notification =
212*84e33947SAndroid Build Coastguard Worker fbs::CreateSettingChangeMessage(builder, setting, newState);
213*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::SettingChangeMessage,
214*84e33947SAndroid Build Coastguard Worker notification.Union());
215*84e33947SAndroid Build Coastguard Worker }
216*84e33947SAndroid Build Coastguard Worker
encodeSelfTestRequest(flatbuffers::FlatBufferBuilder & builder)217*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeSelfTestRequest(
218*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder) {
219*84e33947SAndroid Build Coastguard Worker auto request = fbs::CreateSelfTestRequest(builder);
220*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::SelfTestRequest, request.Union());
221*84e33947SAndroid Build Coastguard Worker }
222*84e33947SAndroid Build Coastguard Worker
encodeHostEndpointConnected(flatbuffers::FlatBufferBuilder & builder,uint16_t hostEndpointId,uint8_t type,const std::string & packageName,const std::string & attributionTag)223*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeHostEndpointConnected(
224*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, uint16_t hostEndpointId,
225*84e33947SAndroid Build Coastguard Worker uint8_t type, const std::string &packageName,
226*84e33947SAndroid Build Coastguard Worker const std::string &attributionTag) {
227*84e33947SAndroid Build Coastguard Worker std::vector<int8_t> packageNameVec(packageName.begin(), packageName.end());
228*84e33947SAndroid Build Coastguard Worker packageNameVec.push_back('\0');
229*84e33947SAndroid Build Coastguard Worker std::vector<int8_t> attributionTagVec(attributionTag.begin(),
230*84e33947SAndroid Build Coastguard Worker attributionTag.end());
231*84e33947SAndroid Build Coastguard Worker attributionTagVec.push_back('\0');
232*84e33947SAndroid Build Coastguard Worker
233*84e33947SAndroid Build Coastguard Worker auto message = fbs::CreateHostEndpointConnectedDirect(
234*84e33947SAndroid Build Coastguard Worker builder, hostEndpointId, type, &packageNameVec, &attributionTagVec);
235*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::HostEndpointConnected, message.Union());
236*84e33947SAndroid Build Coastguard Worker }
237*84e33947SAndroid Build Coastguard Worker
encodeHostEndpointDisconnected(flatbuffers::FlatBufferBuilder & builder,uint16_t hostEndpointId)238*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeHostEndpointDisconnected(
239*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, uint16_t hostEndpointId) {
240*84e33947SAndroid Build Coastguard Worker auto message = fbs::CreateHostEndpointDisconnected(builder, hostEndpointId);
241*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::HostEndpointDisconnected,
242*84e33947SAndroid Build Coastguard Worker message.Union());
243*84e33947SAndroid Build Coastguard Worker }
244*84e33947SAndroid Build Coastguard Worker
encodeNanconfigurationUpdate(flatbuffers::FlatBufferBuilder & builder,bool nanEnabled)245*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodeNanconfigurationUpdate(
246*84e33947SAndroid Build Coastguard Worker flatbuffers::FlatBufferBuilder &builder, bool nanEnabled) {
247*84e33947SAndroid Build Coastguard Worker auto message = fbs::CreateNanConfigurationUpdate(builder, nanEnabled);
248*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::NanConfigurationUpdate, message.Union());
249*84e33947SAndroid Build Coastguard Worker }
250*84e33947SAndroid Build Coastguard Worker
encodePulseRequest(FlatBufferBuilder & builder)251*84e33947SAndroid Build Coastguard Worker void HostProtocolHost::encodePulseRequest(FlatBufferBuilder &builder) {
252*84e33947SAndroid Build Coastguard Worker auto message = fbs::CreatePulseRequest(builder);
253*84e33947SAndroid Build Coastguard Worker finalize(builder, fbs::ChreMessage::PulseRequest, message.Union());
254*84e33947SAndroid Build Coastguard Worker }
255*84e33947SAndroid Build Coastguard Worker
256*84e33947SAndroid Build Coastguard Worker } // namespace chre
257*84e33947SAndroid Build Coastguard Worker } // namespace android
258