/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * A simple nanoapp to echoes a message from the host. * * This nanoapp will send received messages back to the host endpoint with the * same message contents. */ #include <cinttypes> #include <cstdint> #include <cstring> #include <chre.h> #include <shared/nano_string.h> #include <shared/send_message.h> namespace chre { namespace { using nanoapp_testing::sendFatalFailureToHost; void messageFreeCallback(void *message, size_t size) { chreHeapFree(message); } extern "C" void nanoappHandleEvent(uint32_t senderInstanceId, uint16_t eventType, const void* eventData) { if (eventType == CHRE_EVENT_MESSAGE_FROM_HOST) { auto *msg = static_cast<const chreMessageFromHostData *>(eventData); if (senderInstanceId != CHRE_INSTANCE_ID) { sendFatalFailureToHost("Invalid sender instance ID:", &senderInstanceId); } uint8_t *messageBuffer = static_cast<uint8_t*>(chreHeapAlloc(msg->messageSize)); if (msg->messageSize != 0 && messageBuffer == nullptr) { sendFatalFailureToHost("Failed to allocate memory for message buffer"); } std::memcpy(static_cast<void*>(messageBuffer), const_cast<void*>(msg->message), msg->messageSize); if (!chreSendMessageToHostEndpoint( static_cast<void*>(messageBuffer), msg->messageSize, msg->messageType, msg->hostEndpoint, messageFreeCallback)) { sendFatalFailureToHost("Failed to send message to host"); } } } extern "C" bool nanoappStart(void) { return true; } extern "C" void nanoappEnd(void) { } } // anonymous namespace } // namespace chre