From 9eb3a90df3681586b58146b47eea7f3848c348a0 Mon Sep 17 00:00:00 2001 From: Naveen Bobbili Date: Mon, 25 Feb 2019 17:24:29 -0800 Subject: Refactored VSHL into vshl-core and vshl-capabilities. vshl-core: This API is responsible for request arbitration. Verbs exposed are 1. startListening 2. cancelListening 3. subscribe 4. enumerateVoiceAgents 5. setDefaultVoiceAgent Used by applications to subscribe to dialog, connection and auth states of underlying low level voiceagent bindings. Used by applications to trigger voice recognition routine of the underlying low level voiceagent binding. vshl-capabilities: This API exposes publish and subscribe methods for all the speech framework domains/capabilities. For eg. navigation, phonecontrol etc. This API is used by apps and low level voice agent binding to subscribe and publish these capability messages whenever applicable. The code for this is agl-service-voice-high-capabilities repository. This specific commit is for vshl-core API. Change-Id: I1101db19b57ee918482a178843641b088508ac5d Signed-off-by: Naveen Bobbili --- src/plugins/CMakeLists.txt | 46 +- src/plugins/VshlApi.cpp | 607 --------------------- src/plugins/VshlApi.h | 46 -- src/plugins/VshlCoreApi.cpp | 348 ++++++++++++ src/plugins/VshlCoreApi.h | 40 ++ src/plugins/afb/AFBApiImpl.cpp | 20 +- src/plugins/afb/AFBApiImpl.h | 7 +- src/plugins/afb/AFBRequestImpl.cpp | 3 +- src/plugins/afb/AFBRequestImpl.h | 5 +- src/plugins/afb/include/AFBEventImpl.h | 16 +- src/plugins/afb/src/AFBEventImpl.cpp | 13 +- src/plugins/capabilities/CapabilitiesFactory.cpp | 57 -- src/plugins/capabilities/CapabilitiesFactory.h | 63 --- .../capabilities/CapabilityMessagingService.cpp | 117 ---- .../capabilities/CapabilityMessagingService.h | 82 --- .../communication/include/PhoneControlCapability.h | 52 -- .../communication/include/PhoneControlMessages.h | 128 ----- .../communication/src/PhoneControlCapability.cpp | 42 -- .../capabilities/core/include/MessageChannel.h | 68 --- .../capabilities/core/include/PublisherForwarder.h | 73 --- .../core/include/SubscriberForwarder.h | 84 --- .../capabilities/core/src/MessageChannel.cpp | 51 -- .../capabilities/core/src/PublisherForwarder.cpp | 69 --- .../capabilities/core/src/SubscriberForwarder.cpp | 139 ----- .../guimetadata/include/GuiMetadataCapability.h | 52 -- .../guimetadata/include/GuiMetadataMessages.h | 50 -- .../guimetadata/src/GuiMetadataCapability.cpp | 42 -- .../navigation/include/NavigationCapability.h | 52 -- .../navigation/include/NavigationMessages.h | 48 -- .../navigation/src/NavigationCapability.cpp | 42 -- .../test/CapabilityMessagingServiceTest.cpp | 96 ---- .../capabilities/test/PublisherForwarderTest.cpp | 116 ---- .../capabilities/test/SubscriberForwarderTest.cpp | 262 --------- src/plugins/core/VRRequestProcessor.h | 19 +- src/plugins/core/VRRequestProcessorImpl.cpp | 19 +- src/plugins/core/include/VRAgentsObserver.h | 17 +- src/plugins/core/include/VRRequest.h | 21 +- .../core/include/VRRequestProcessorDelegate.h | 23 +- src/plugins/core/src/VRAgentsObserverImpl.cpp | 15 +- src/plugins/core/src/VRRequestImpl.cpp | 19 +- .../core/src/VRRequestProcessorDelegateImpl.cpp | 23 +- src/plugins/core/test/VRRequestProcessorTest.cpp | 9 +- src/plugins/core/test/VRRequestTest.cpp | 9 +- src/plugins/interfaces/afb/IAFBApi.h | 2 +- src/plugins/interfaces/capabilities/ICapability.h | 58 -- .../interfaces/utilities/events/IEventFilter.h | 3 +- src/plugins/interfaces/utilities/logging/ILogger.h | 3 +- src/plugins/interfaces/voiceagents/IVoiceAgent.h | 3 +- .../voiceagents/IVoiceAgentsChangeObserver.h | 3 +- src/plugins/test/common/ConsoleLogger.cpp | 3 +- src/plugins/test/common/ConsoleLogger.h | 5 +- src/plugins/test/mocks/AFBApiMock.h | 5 +- src/plugins/test/mocks/AFBEventMock.h | 9 +- src/plugins/test/mocks/AFBRequestMock.h | 5 +- src/plugins/test/mocks/CapabilityMock.h | 35 -- .../test/mocks/VoiceAgentsChangeObserverMock.h | 17 +- src/plugins/utilities/events/EventRouter.cpp | 15 +- src/plugins/utilities/events/EventRouter.h | 15 +- src/plugins/utilities/logging/Logger.cpp | 3 +- src/plugins/utilities/logging/Logger.h | 5 +- src/plugins/utilities/uuid/UUIDGeneration.cpp | 3 +- src/plugins/utilities/uuid/UUIDGeneration.h | 3 +- src/plugins/voiceagents/VoiceAgentEventNames.h | 3 +- src/plugins/voiceagents/VoiceAgentsDataManager.h | 32 +- .../voiceagents/VoiceAgentsDataManagerImpl.cpp | 54 +- src/plugins/voiceagents/include/VoiceAgent.h | 11 +- .../voiceagents/include/VoiceAgentEventsHandler.h | 19 +- .../voiceagents/src/VoiceAgentEventsHandler.cpp | 19 +- src/plugins/voiceagents/src/VoiceAgentImpl.cpp | 11 +- src/plugins/voiceagents/test/VoiceAgentTest.cpp | 7 +- .../test/VoiceAgentsDataManagerTest.cpp | 9 +- src/plugins/voiceagents/test/VoiceAgentsTestData.h | 3 +- 72 files changed, 642 insertions(+), 2831 deletions(-) delete mode 100644 src/plugins/VshlApi.cpp delete mode 100644 src/plugins/VshlApi.h create mode 100644 src/plugins/VshlCoreApi.cpp create mode 100644 src/plugins/VshlCoreApi.h delete mode 100644 src/plugins/capabilities/CapabilitiesFactory.cpp delete mode 100644 src/plugins/capabilities/CapabilitiesFactory.h delete mode 100644 src/plugins/capabilities/CapabilityMessagingService.cpp delete mode 100644 src/plugins/capabilities/CapabilityMessagingService.h delete mode 100644 src/plugins/capabilities/communication/include/PhoneControlCapability.h delete mode 100644 src/plugins/capabilities/communication/include/PhoneControlMessages.h delete mode 100644 src/plugins/capabilities/communication/src/PhoneControlCapability.cpp delete mode 100644 src/plugins/capabilities/core/include/MessageChannel.h delete mode 100644 src/plugins/capabilities/core/include/PublisherForwarder.h delete mode 100644 src/plugins/capabilities/core/include/SubscriberForwarder.h delete mode 100644 src/plugins/capabilities/core/src/MessageChannel.cpp delete mode 100644 src/plugins/capabilities/core/src/PublisherForwarder.cpp delete mode 100644 src/plugins/capabilities/core/src/SubscriberForwarder.cpp delete mode 100644 src/plugins/capabilities/guimetadata/include/GuiMetadataCapability.h delete mode 100644 src/plugins/capabilities/guimetadata/include/GuiMetadataMessages.h delete mode 100644 src/plugins/capabilities/guimetadata/src/GuiMetadataCapability.cpp delete mode 100644 src/plugins/capabilities/navigation/include/NavigationCapability.h delete mode 100644 src/plugins/capabilities/navigation/include/NavigationMessages.h delete mode 100644 src/plugins/capabilities/navigation/src/NavigationCapability.cpp delete mode 100644 src/plugins/capabilities/test/CapabilityMessagingServiceTest.cpp delete mode 100644 src/plugins/capabilities/test/PublisherForwarderTest.cpp delete mode 100644 src/plugins/capabilities/test/SubscriberForwarderTest.cpp delete mode 100644 src/plugins/interfaces/capabilities/ICapability.h delete mode 100644 src/plugins/test/mocks/CapabilityMock.h (limited to 'src/plugins') diff --git a/src/plugins/CMakeLists.txt b/src/plugins/CMakeLists.txt index 06ef7a4..49c6a78 100644 --- a/src/plugins/CMakeLists.txt +++ b/src/plugins/CMakeLists.txt @@ -14,19 +14,18 @@ # limitations under the License. ########################################################################### -PROJECT_TARGET_ADD(vshl-api) +PROJECT_TARGET_ADD(vshl-core-api) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) - set(VSHL_LIB_SRC - ${CMAKE_CURRENT_SOURCE_DIR}/VshlApi.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/VshlApi.h + set(VSHL_CORE_LIB_SRC + ${CMAKE_CURRENT_SOURCE_DIR}/VshlCoreApi.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/VshlCoreApi.h # Interfaces ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/afb/IAFBApi.h - ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/capabilities/ICapability.h ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/utilities/events/IEventFilter.h ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/utilities/logging/ILogger.h ${CMAKE_CURRENT_SOURCE_DIR}/interfaces/voiceagents/IVoiceAgent.h @@ -59,27 +58,6 @@ PROJECT_TARGET_ADD(vshl-api) ${CMAKE_CURRENT_SOURCE_DIR}/core/include/VRRequestProcessorDelegate.h ${CMAKE_CURRENT_SOURCE_DIR}/core/src/VRRequestProcessorDelegateImpl.cpp - #Capabilities - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/CapabilitiesFactory.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/CapabilitiesFactory.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/CapabilityMessagingService.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/CapabilityMessagingService.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/include/MessageChannel.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/src/MessageChannel.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/include/PublisherForwarder.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/src/PublisherForwarder.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/include/SubscriberForwarder.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/core/src/SubscriberForwarder.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/communication/include/PhoneControlMessages.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/communication/include/PhoneControlCapability.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/communication/src/PhoneControlCapability.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/navigation/include/NavigationMessages.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/navigation/include/NavigationCapability.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/navigation/src/NavigationCapability.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/guimetadata/include/GuiMetadataMessages.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/guimetadata/include/GuiMetadataCapability.h - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/guimetadata/src/GuiMetadataCapability.cpp - #Utilities ${CMAKE_CURRENT_SOURCE_DIR}/utilities/events/EventRouter.h ${CMAKE_CURRENT_SOURCE_DIR}/utilities/events/EventRouter.cpp @@ -91,7 +69,7 @@ PROJECT_TARGET_ADD(vshl-api) # Define targets ADD_LIBRARY(${TARGET_NAME} MODULE - ${VSHL_LIB_SRC} + ${VSHL_CORE_LIB_SRC} ) # VSHL plugin properties @@ -129,8 +107,8 @@ PROJECT_TARGET_ADD(vshl-api) include(cmake/gtest.cmake) - set(VSHL_TEST_SRC ${VSHL_LIB_SRC}) - list(APPEND VSHL_TEST_SRC + set(VSHL_CORE_TEST_SRC ${VSHL_CORE_LIB_SRC}) + list(APPEND VSHL_CORE_TEST_SRC # Main ${CMAKE_CURRENT_SOURCE_DIR}/TestMain.cpp @@ -142,14 +120,8 @@ PROJECT_TARGET_ADD(vshl-api) ${CMAKE_CURRENT_SOURCE_DIR}/test/mocks/AFBApiMock.h ${CMAKE_CURRENT_SOURCE_DIR}/test/mocks/AFBEventMock.h ${CMAKE_CURRENT_SOURCE_DIR}/test/mocks/AFBRequestMock.h - ${CMAKE_CURRENT_SOURCE_DIR}/test/mocks/CapabilityMock.h ${CMAKE_CURRENT_SOURCE_DIR}/test/mocks/VoiceAgentsChangeObserverMock.h - # Capabilities - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/test/CapabilityMessagingServiceTest.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/test/PublisherForwarderTest.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/capabilities/test/SubscriberForwarderTest.cpp - # Core ${CMAKE_CURRENT_SOURCE_DIR}/core/test/VRRequestTest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/core/test/VRRequestProcessorTest.cpp @@ -160,7 +132,7 @@ PROJECT_TARGET_ADD(vshl-api) ) ADD_EXECUTABLE(${TARGET_NAME}_Test - ${VSHL_TEST_SRC} + ${VSHL_CORE_TEST_SRC} ) TARGET_INCLUDE_DIRECTORIES(${TARGET_NAME}_Test @@ -178,5 +150,5 @@ PROJECT_TARGET_ADD(vshl-api) ) ENABLE_TESTING() - ADD_TEST(VshlTest ${TARGET_NAME}_Test) + ADD_TEST(VshlCoreTest ${TARGET_NAME}_Test) endif() \ No newline at end of file diff --git a/src/plugins/VshlApi.cpp b/src/plugins/VshlApi.cpp deleted file mode 100644 index f2c7b7c..0000000 --- a/src/plugins/VshlApi.cpp +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "VshlApi.h" - -#include - -#include "afb/AFBApiImpl.h" -#include "afb/AFBRequestImpl.h" -#include "capabilities/CapabilitiesFactory.h" -#include "capabilities/CapabilityMessagingService.h" -#include "core/VRRequestProcessor.h" -#include "utilities/events/EventRouter.h" -#include "utilities/logging/Logger.h" -#include "voiceagents/VoiceAgentEventNames.h" -#include "voiceagents/VoiceAgentsDataManager.h" - -#include "json.hpp" - -using namespace std; - -CTLP_CAPI_REGISTER("vshl-api"); - -static std::string TAG = "vshl::plugins::VshlAPI"; - -static std::string VA_JSON_ATTR_DEFAULT = "default"; -static std::string VA_JSON_ATTR_AGENTS = "agents"; -static std::string VA_JSON_ATTR_ID = "id"; -static std::string VA_JSON_ATTR_NAME = "name"; -static std::string VA_JSON_ATTR_API = "api"; -static std::string VA_JSON_ATTR_ACTIVE = "active"; -static std::string VA_JSON_ATTR_WWS = "wakewords"; -static std::string VA_JSON_ATTR_ACTIVE_WW = "activewakeword"; -static std::string VA_JSON_ATTR_DESCRIPTION = "description"; -static std::string VA_JSON_ATTR_VENDOR = "vendor"; - -static std::string STARTLISTENING_JSON_ATTR_REQUEST = "request_id"; - -static std::string EVENTS_JSON_ATTR_VA_ID = "va_id"; -static std::string EVENTS_JSON_ATTR_EVENTS = "events"; - -static std::string CAPABILITIES_JSON_ATTR_ACTION = "action"; -static std::string CAPABILITIES_JSON_ATTR_ACTIONS = "actions"; -static std::string CAPABILITIES_JSON_ATTR_PAYLOAD = "payload"; - -static std::shared_ptr sLogger; -static std::shared_ptr sAfbApi; -static std::unique_ptr sCapabilitiesFactory; -static std::unique_ptr sCapabilityMessagingService; -static std::unique_ptr sVRRequestProcessor; -static std::unique_ptr sVoiceAgentsDataManager; -static std::unique_ptr sEventRouter; - -using json = nlohmann::json; -using Level = vshl::utilities::logging::Logger::Level; - -CTLP_ONLOAD(plugin, ret) { - if (plugin->api == nullptr) { - return -1; - } - - // Logger - sLogger = vshl::utilities::logging::Logger::create(plugin->api); - // sLogger->log(Level::INFO, TAG, "Vshl plugin loaded & initialized."); - - // AFB Wrapper - sAfbApi = vshl::afb::AFBApiImpl::create(plugin->api); - - // VRRequestProcessor - auto vrRequestProcessorDelegate = vshl::core::VRRequestProcessorDelegate::create(sLogger, sAfbApi); - sVRRequestProcessor = vshl::core::VRRequestProcessor::create(sLogger, vrRequestProcessorDelegate); - if (!sVRRequestProcessor) { - sLogger->log(Level::ERROR, TAG, "Failed to create VRRequestProcessor"); - return -1; - } - - // VoiceAgentDataManager - sVoiceAgentsDataManager = vshl::voiceagents::VoiceAgentsDataManager::create(sLogger, sAfbApi); - if (!sVoiceAgentsDataManager) { - sLogger->log(Level::ERROR, TAG, "Failed to create VoiceAgentsDataManager"); - return -1; - } - sVoiceAgentsDataManager->addVoiceAgentsChangeObserver(sVRRequestProcessor->getVoiceAgentsChangeObserver()); - - // EventRouter - sEventRouter = vshl::utilities::events::EventRouter::create(sLogger); - if (!sEventRouter) { - sLogger->log(Level::ERROR, TAG, "Failed to create EventRouter"); - return -1; - } - sEventRouter->addEventFilter(sVoiceAgentsDataManager->getEventFilter()); - - sCapabilitiesFactory = vshl::capabilities::CapabilitiesFactory::create(); - if (!sCapabilitiesFactory) { - sLogger->log(Level::ERROR, TAG, "Failed to create CapabilitiesFactory"); - return -1; - } - - sCapabilityMessagingService = vshl::capabilities::CapabilityMessagingService::create(sLogger, sAfbApi); - if (!sCapabilityMessagingService) { - sLogger->log(Level::ERROR, TAG, "Failed to create CapabilityMessagingService"); - return -1; - } - - return 0; -} - -CTLP_CAPI(onAuthStateEvent, source, argsJ, eventJ) { - if (sEventRouter == nullptr) { - return -1; - } - - string eventName = vshl::voiceagents::VSHL_EVENT_AUTH_STATE_EVENT; - json eventJson = json::parse(json_object_to_json_string(eventJ)); - if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { - sLogger->log(Level::ERROR, TAG, "onAuthStateEvent: No voiceagent id found."); - return -1; - } - std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); - - if (!sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ))) { - sLogger->log(Level::ERROR, TAG, "onAuthStateEvent: Failed to handle."); - return -1; - } - - return 0; -} - -CTLP_CAPI(onConnectionStateEvent, source, argsJ, eventJ) { - if (sEventRouter == nullptr) { - return -1; - } - - string eventName = vshl::voiceagents::VSHL_EVENT_CONNECTION_STATE_EVENT; - json eventJson = json::parse(json_object_to_json_string(eventJ)); - if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { - sLogger->log(Level::ERROR, TAG, "onConnectionStateEvent: No voiceagent id found."); - return -1; - } - std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); - - if (!sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ))) { - sLogger->log(Level::ERROR, TAG, "onConnectionStateEvent: Failed to handle."); - return -1; - } - - return 0; -} - -CTLP_CAPI(onDialogStateEvent, source, argsJ, eventJ) { - if (sEventRouter == nullptr) { - return -1; - } - - string eventName = vshl::voiceagents::VSHL_EVENT_DIALOG_STATE_EVENT; - json eventJson = json::parse(json_object_to_json_string(eventJ)); - if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { - sLogger->log(Level::ERROR, TAG, "onDialogStateEvent: No voiceagent id found."); - return -1; - } - std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); - - if (!sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ))) { - sLogger->log(Level::ERROR, TAG, "onDialogStateEvent: Failed to handle."); - return -1; - } - - return 0; -} - -CTLP_CAPI(loadVoiceAgentsConfig, source, argsJ, eventJ) { - if (sVoiceAgentsDataManager == nullptr) { - sLogger->log(Level::WARNING, TAG, "loadVoiceAgentsConfig: Voice service not initialized."); - return -1; - } - - if (argsJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "loadVoiceAgentsConfig: No arguments supplied."); - return -1; - } - - json agentsConfigJson = json::parse(json_object_to_json_string(argsJ)); - if (agentsConfigJson.find(VA_JSON_ATTR_AGENTS) == agentsConfigJson.end()) { - sLogger->log(Level::ERROR, TAG, "loadVoiceAgentsConfig: No agents object found in agents json"); - return -1; - } - - json agentsJson = agentsConfigJson[VA_JSON_ATTR_AGENTS]; - for (auto agentIt = agentsJson.begin(); agentIt != agentsJson.end(); ++agentIt) { - json agentJson = *agentIt; - - if (agentJson.find(VA_JSON_ATTR_ID) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_ACTIVE) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_NAME) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_API) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_WWS) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_ACTIVE_WW) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_DESCRIPTION) == agentJson.end() || - agentJson.find(VA_JSON_ATTR_VENDOR) == agentJson.end()) { - std::stringstream error; - error << "loadVoiceAgentsConfig: One or more missing params in agent " - "config " - << agentJson.dump(); - sLogger->log(Level::WARNING, TAG, error.str().c_str()); - continue; - } - - std::string id(agentJson[VA_JSON_ATTR_ID].get()); - std::string name(agentJson[VA_JSON_ATTR_NAME].get()); - std::string api(agentJson[VA_JSON_ATTR_API].get()); - std::string description(agentJson[VA_JSON_ATTR_DESCRIPTION].get()); - std::string vendor(agentJson[VA_JSON_ATTR_VENDOR].get()); - std::string activeWakeword(agentJson[VA_JSON_ATTR_ACTIVE_WW].get()); - bool isActive(agentJson[VA_JSON_ATTR_ACTIVE].get()); - - shared_ptr> wakewords = std::make_shared>(); - json wakewordsJson = agentJson[VA_JSON_ATTR_WWS]; - for (auto wwIt = wakewordsJson.begin(); wwIt != wakewordsJson.end(); ++wwIt) { - wakewords->insert(wwIt->get()); - } - - sVoiceAgentsDataManager->addNewVoiceAgent( - id, name, description, api, vendor, activeWakeword, isActive, wakewords); - } - - // Set the default agent. - if (agentsConfigJson.find(VA_JSON_ATTR_DEFAULT) == agentsConfigJson.end()) { - sLogger->log(Level::ERROR, TAG, "loadVoiceAgentsConfig: No default agent found in agents json"); - return -1; - } - std::string defaultAgentId(agentsConfigJson[VA_JSON_ATTR_DEFAULT].get()); - sVoiceAgentsDataManager->setDefaultVoiceAgent(defaultAgentId); - - return 0; -} - -CTLP_CAPI(startListening, source, argsJ, eventJ) { - if (sVRRequestProcessor == nullptr) { - return -1; - } - - int result = 0; - string requestId = sVRRequestProcessor->startListening(); - - if (!requestId.empty()) { - json responseJson; - responseJson[STARTLISTENING_JSON_ATTR_REQUEST] = requestId; - AFB_ReqSuccess(source->request, json_tokener_parse(responseJson.dump().c_str()), NULL); - } else { - AFB_ReqFail(source->request, NULL, "Failed to startListening..."); - } - - return 0; -} - -CTLP_CAPI(cancelListening, source, argsJ, eventJ) { - return 0; -} - -CTLP_CAPI(enumerateVoiceAgents, source, argsJ, eventJ) { - if (sVoiceAgentsDataManager == nullptr) { - return -1; - } - - auto agents = sVoiceAgentsDataManager->getAllVoiceAgents(); - std::string defaultAgentId(sVoiceAgentsDataManager->getDefaultVoiceAgent()); - - json responseJson; - json agentsJson = json::array(); - - for (auto agent : agents) { - json agentJson; - agentJson[VA_JSON_ATTR_ID] = agent->getId(); - agentJson[VA_JSON_ATTR_NAME] = agent->getName(); - agentJson[VA_JSON_ATTR_DESCRIPTION] = agent->getDescription(); - agentJson[VA_JSON_ATTR_API] = agent->getApi(); - agentJson[VA_JSON_ATTR_VENDOR] = agent->getVendor(); - agentJson[VA_JSON_ATTR_ACTIVE] = agent->isActive(); - agentJson[VA_JSON_ATTR_ACTIVE_WW] = agent->getActiveWakeword(); - - auto wakewords = agent->getWakeWords(); - if (wakewords != nullptr) { - json wakewordsJson; - for (auto wakeword : *wakewords) { - wakewordsJson.push_back(wakeword); - } - agentJson[VA_JSON_ATTR_WWS] = wakewordsJson; - } - - agentsJson.push_back(agentJson); - } - - responseJson[VA_JSON_ATTR_AGENTS] = agentsJson; - responseJson[VA_JSON_ATTR_DEFAULT] = defaultAgentId; - - AFB_ReqSuccess(source->request, json_tokener_parse(responseJson.dump().c_str()), NULL); - - return 0; -} - -CTLP_CAPI(subscribe, source, argsJ, eventJ) { - if (sVoiceAgentsDataManager == nullptr) { - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "subscribe: No arguments supplied."); - return -1; - } - - json subscribeJson = json::parse(json_object_to_json_string(eventJ)); - if (subscribeJson.find(EVENTS_JSON_ATTR_VA_ID) == subscribeJson.end()) { - sLogger->log(Level::ERROR, TAG, "subscribe: No voiceagent id found in subscribe json"); - return -1; - } - std::string voiceAgentId(subscribeJson[EVENTS_JSON_ATTR_VA_ID].get()); - - if (subscribeJson.find(EVENTS_JSON_ATTR_EVENTS) == subscribeJson.end()) { - sLogger->log(Level::ERROR, TAG, "subscribe: No events array found in subscribe json"); - return -1; - } - list events(subscribeJson[EVENTS_JSON_ATTR_EVENTS].get>()); - - // Subscribe this client for the listed events. - auto request = vshl::afb::AFBRequestImpl::create(source->request); - for (auto event : events) { - if (!sVoiceAgentsDataManager->subscribeToVshlEventFromVoiceAgent(*request, event, voiceAgentId)) { - sLogger->log(Level::ERROR, TAG, "subscribe: Failed to subscribe to event: " + event); - return -1; - } - } - - AFB_ReqSuccess(source->request, json_object_new_string("Subscription to events successfully completed."), NULL); - - return 0; -} - -CTLP_CAPI(setDefaultVoiceAgent, source, argsJ, eventJ) { - if (sVoiceAgentsDataManager == nullptr) { - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "setDefaultVoiceAgent: No arguments supplied."); - return -1; - } - - json jsonRequest = json::parse(json_object_to_json_string(eventJ)); - if (jsonRequest.find(VA_JSON_ATTR_ID) == jsonRequest.end()) { - sLogger->log(Level::ERROR, TAG, "setDefaultVoiceAgent: voice agent id not found in request json"); - return -1; - } - - std::string voiceAgentId(jsonRequest[VA_JSON_ATTR_ID].get()); - if (!sVoiceAgentsDataManager->setDefaultVoiceAgent(voiceAgentId)) { - sLogger->log(Level::ERROR, TAG, "setDefaultVoiceAgent: Failed to set default agent"); - return -1; - } - - AFB_ReqSuccess(source->request, NULL, NULL); - return 0; -} - -CTLP_CAPI(guiMetadataSubscribe, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr guMetadataCapability = sCapabilitiesFactory->getGuiMetadata(); - if (!guMetadataCapability) { - sLogger->log( - Level::WARNING, - TAG, - "guimetadataSubscribe: Failed to " - "fetch guimetadata capability " - "object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "guimetadataSubscribe: No arguments supplied."); - return -1; - } - - json subscribeJson = json::parse(json_object_to_json_string(eventJ)); - if (subscribeJson.find(CAPABILITIES_JSON_ATTR_ACTIONS) == subscribeJson.end()) { - sLogger->log(Level::ERROR, TAG, "guimetadataSubscribe: No events array found in subscribe json"); - return -1; - } - list events(subscribeJson[CAPABILITIES_JSON_ATTR_ACTIONS].get>()); - - // SUbscribe this client for the guimetadata events. - auto request = vshl::afb::AFBRequestImpl::create(source->request); - for (auto event : events) { - if (!sCapabilityMessagingService->subscribe(*request, guMetadataCapability, event)) { - sLogger->log(Level::ERROR, TAG, "guimetadataSubscribe: Failed to subscribe to event: " + event); - return -1; - } - } - - AFB_ReqSuccess( - source->request, json_object_new_string("Subscription to guimetadata events successfully completed."), NULL); - return 0; -} - -CTLP_CAPI(guiMetadataPublish, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr guMetadataCapability = sCapabilitiesFactory->getGuiMetadata(); - if (!guMetadataCapability) { - sLogger->log( - Level::WARNING, - TAG, - "guimetadataPublish: Failed to fetch " - "guimetadata capability object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "guimetadataPublish: No arguments supplied."); - return -1; - } - - json publishJson = json::parse(json_object_to_json_string(eventJ)); - if (publishJson.find(CAPABILITIES_JSON_ATTR_ACTION) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "guimetadataPublish: No action found in publish json"); - return -1; - } - std::string action(publishJson[CAPABILITIES_JSON_ATTR_ACTION].get()); - - if (publishJson.find(CAPABILITIES_JSON_ATTR_PAYLOAD) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "guimetadataPublish: No payload found in publish json"); - return -1; - } - std::string payload(publishJson[CAPABILITIES_JSON_ATTR_PAYLOAD].get()); - - if (!sCapabilityMessagingService->publish(guMetadataCapability, action, payload)) { - sLogger->log(Level::ERROR, TAG, "guimetadataPublish: Failed to publish message: " + action); - return -1; - } - - AFB_ReqSuccess(source->request, json_object_new_string("Successfully published guimetadata messages."), NULL); - return 0; -} - -CTLP_CAPI(phonecontrolSubscribe, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr phoneControlCapability = sCapabilitiesFactory->getPhoneControl(); - if (!phoneControlCapability) { - sLogger->log(Level::WARNING, TAG, "phoneControlSubscribe: Failed to fetch phone control capability object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "phoneControlSubscribe: No arguments supplied."); - return -1; - } - - json subscribeJson = json::parse(json_object_to_json_string(eventJ)); - if (subscribeJson.find(CAPABILITIES_JSON_ATTR_ACTIONS) == subscribeJson.end()) { - sLogger->log(Level::ERROR, TAG, "phoneControlSubscribe: No events array found in subscribe json"); - return -1; - } - list events(subscribeJson[CAPABILITIES_JSON_ATTR_ACTIONS].get>()); - - // SUbscribe this client for the phone call control events. - auto request = vshl::afb::AFBRequestImpl::create(source->request); - for (auto event : events) { - if (!sCapabilityMessagingService->subscribe(*request, phoneControlCapability, event)) { - sLogger->log(Level::ERROR, TAG, "phoneControlSubscribe: Failed to subscribe to event: " + event); - return -1; - } - } - - AFB_ReqSuccess( - source->request, json_object_new_string("Subscription to phone control events successfully completed."), NULL); - return 0; -} - -CTLP_CAPI(phonecontrolPublish, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr phoneControlCapability = sCapabilitiesFactory->getPhoneControl(); - if (!phoneControlCapability) { - sLogger->log(Level::WARNING, TAG, "phoneControlPublish: Failed to fetch navigation capability object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "phoneControlPublish: No arguments supplied."); - return -1; - } - - json publishJson = json::parse(json_object_to_json_string(eventJ)); - if (publishJson.find(CAPABILITIES_JSON_ATTR_ACTION) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "phoneControlPublish: No action found in publish json"); - return -1; - } - std::string action(publishJson[CAPABILITIES_JSON_ATTR_ACTION].get()); - - if (publishJson.find(CAPABILITIES_JSON_ATTR_PAYLOAD) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "phoneControlPublish: No payload found in publish json"); - return -1; - } - std::string payload(publishJson[CAPABILITIES_JSON_ATTR_PAYLOAD].get()); - - if (!sCapabilityMessagingService->publish(phoneControlCapability, action, payload)) { - sLogger->log(Level::ERROR, TAG, "phoneControlPublish: Failed to publish message: " + action); - return -1; - } - - AFB_ReqSuccess(source->request, json_object_new_string("Successfully published phone control messages."), NULL); - return 0; -} - -CTLP_CAPI(navigationSubscribe, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr navigationCapability = sCapabilitiesFactory->getNavigation(); - if (!navigationCapability) { - sLogger->log(Level::WARNING, TAG, "navigationSubscribe: Failed to fetch navigation capability object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "navigationSubscribe: No arguments supplied."); - return -1; - } - - json subscribeJson = json::parse(json_object_to_json_string(eventJ)); - if (subscribeJson.find(CAPABILITIES_JSON_ATTR_ACTIONS) == subscribeJson.end()) { - sLogger->log(Level::ERROR, TAG, "navigationSubscribe: No events array found in subscribe json"); - return -1; - } - list events(subscribeJson[CAPABILITIES_JSON_ATTR_ACTIONS].get>()); - - // SUbscribe this client for the navigation events. - auto request = vshl::afb::AFBRequestImpl::create(source->request); - for (auto event : events) { - if (!sCapabilityMessagingService->subscribe(*request, navigationCapability, event)) { - sLogger->log(Level::ERROR, TAG, "navigationSubscribe: Failed to subscribe to event: " + event); - return -1; - } - } - - AFB_ReqSuccess( - source->request, json_object_new_string("Subscription to navigation events successfully completed."), NULL); - return 0; -} - -CTLP_CAPI(navigationPublish, source, argsJ, eventJ) { - if (sCapabilitiesFactory == nullptr || sCapabilityMessagingService == nullptr) { - return -1; - } - - shared_ptr navigationCapability = sCapabilitiesFactory->getNavigation(); - if (!navigationCapability) { - sLogger->log(Level::WARNING, TAG, "navigationPublish: Failed to fetch navigation capability object."); - return -1; - } - - if (eventJ == nullptr) { - sLogger->log(Level::WARNING, TAG, "navigationPublish: No arguments supplied."); - return -1; - } - - json publishJson = json::parse(json_object_to_json_string(eventJ)); - if (publishJson.find(CAPABILITIES_JSON_ATTR_ACTION) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "navigationPublish: No action found in publish json"); - return -1; - } - std::string action(publishJson[CAPABILITIES_JSON_ATTR_ACTION].get()); - - if (publishJson.find(CAPABILITIES_JSON_ATTR_PAYLOAD) == publishJson.end()) { - sLogger->log(Level::ERROR, TAG, "navigationPublish: No payload found in publish json"); - return -1; - } - std::string payload(publishJson[CAPABILITIES_JSON_ATTR_PAYLOAD].get()); - - if (!sCapabilityMessagingService->publish(navigationCapability, action, payload)) { - sLogger->log(Level::ERROR, TAG, "navigationPublish: Failed to publish message: " + action); - return -1; - } - - AFB_ReqSuccess(source->request, json_object_new_string("Successfully published navigation messages."), NULL); - return 0; -} diff --git a/src/plugins/VshlApi.h b/src/plugins/VshlApi.h deleted file mode 100644 index f228943..0000000 --- a/src/plugins/VshlApi.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_API_INCLUDE -#define VSHL_API_INCLUDE - -#include "ctl-plugin.h" - -#ifdef __cplusplus -extern "C" { -#endif - -CTLP_ONLOAD(plugin, ret); -CTLP_INIT(plugin, ret); -int onAuthStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int onConnectionStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int onDialogStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int loadVoiceAgentsConfig(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int startListening(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int cancelListening(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int enumerateVoiceAgents(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int subscribe(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int setDefaultVoiceAgent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int guiMetadataSubscribe(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int guiMetadataPublish(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int phonecontrolSubscribe(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int phonecontrolPublish(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int navigationSubscribe(CtlSourceT* source, json_object* argsJ, json_object* queryJ); -int navigationPublish(CtlSourceT* source, json_object* argsJ, json_object* queryJ); - -#ifdef __cplusplus -} -#endif - -#endif // VSHL_API_INCLUDE diff --git a/src/plugins/VshlCoreApi.cpp b/src/plugins/VshlCoreApi.cpp new file mode 100644 index 0000000..a91ca3e --- /dev/null +++ b/src/plugins/VshlCoreApi.cpp @@ -0,0 +1,348 @@ +/* + * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file 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. + */ +#include "VshlCoreApi.h" + +#include + +#include "afb/AFBApiImpl.h" +#include "afb/AFBRequestImpl.h" +#include "core/VRRequestProcessor.h" +#include "utilities/events/EventRouter.h" +#include "utilities/logging/Logger.h" +#include "voiceagents/VoiceAgentEventNames.h" +#include "voiceagents/VoiceAgentsDataManager.h" + +#include "json.hpp" + +using namespace std; + +CTLP_CAPI_REGISTER("vshl-core-api"); + +static std::string TAG = "vshlcore::plugins::VshlCoreAPI"; + +static std::string VA_JSON_ATTR_DEFAULT = "default"; +static std::string VA_JSON_ATTR_AGENTS = "agents"; +static std::string VA_JSON_ATTR_ID = "id"; +static std::string VA_JSON_ATTR_NAME = "name"; +static std::string VA_JSON_ATTR_API = "api"; +static std::string VA_JSON_ATTR_ACTIVE = "active"; +static std::string VA_JSON_ATTR_WWS = "wakewords"; +static std::string VA_JSON_ATTR_ACTIVE_WW = "activewakeword"; +static std::string VA_JSON_ATTR_DESCRIPTION = "description"; +static std::string VA_JSON_ATTR_VENDOR = "vendor"; + +static std::string STARTLISTENING_JSON_ATTR_REQUEST = "request_id"; + +static std::string EVENTS_JSON_ATTR_VA_ID = "va_id"; +static std::string EVENTS_JSON_ATTR_EVENTS = "events"; + +static std::shared_ptr sLogger; +static std::shared_ptr sAfbApi; +static std::unique_ptr sVRRequestProcessor; +static std::unique_ptr sVoiceAgentsDataManager; +static std::unique_ptr sEventRouter; + +using json = nlohmann::json; +using Level = vshlcore::utilities::logging::Logger::Level; + +CTLP_ONLOAD(plugin, ret) { + if (plugin->api == nullptr) { + return -1; + } + + // Logger + sLogger = vshlcore::utilities::logging::Logger::create(plugin->api); + // sLogger->log(Level::INFO, TAG, "Vshl plugin loaded & initialized."); + + // AFB Wrapper + sAfbApi = vshlcore::afb::AFBApiImpl::create(plugin->api); + + // VRRequestProcessor + auto vrRequestProcessorDelegate = vshlcore::core::VRRequestProcessorDelegate::create(sLogger, sAfbApi); + sVRRequestProcessor = vshlcore::core::VRRequestProcessor::create(sLogger, vrRequestProcessorDelegate); + if (!sVRRequestProcessor) { + sLogger->log(Level::ERROR, TAG, "Failed to create VRRequestProcessor"); + return -1; + } + + // VoiceAgentDataManager + sVoiceAgentsDataManager = vshlcore::voiceagents::VoiceAgentsDataManager::create(sLogger, sAfbApi); + if (!sVoiceAgentsDataManager) { + sLogger->log(Level::ERROR, TAG, "Failed to create VoiceAgentsDataManager"); + return -1; + } + sVoiceAgentsDataManager->addVoiceAgentsChangeObserver(sVRRequestProcessor->getVoiceAgentsChangeObserver()); + + // EventRouter + sEventRouter = vshlcore::utilities::events::EventRouter::create(sLogger); + if (!sEventRouter) { + sLogger->log(Level::ERROR, TAG, "Failed to create EventRouter"); + return -1; + } + sEventRouter->addEventFilter(sVoiceAgentsDataManager->getEventFilter()); + + return 0; +} + +CTLP_CAPI(onAuthStateEvent, source, argsJ, eventJ) { + if (sEventRouter == nullptr) { + return -1; + } + + string eventName = vshlcore::voiceagents::VSHL_EVENT_AUTH_STATE_EVENT; + json eventJson = json::parse(json_object_to_json_string(eventJ)); + if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { + sLogger->log(Level::ERROR, TAG, "onAuthStateEvent: No voiceagent id found."); + return -1; + } + std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); + + sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ)); + + return 0; +} + +CTLP_CAPI(onConnectionStateEvent, source, argsJ, eventJ) { + if (sEventRouter == nullptr) { + return -1; + } + + string eventName = vshlcore::voiceagents::VSHL_EVENT_CONNECTION_STATE_EVENT; + json eventJson = json::parse(json_object_to_json_string(eventJ)); + if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { + sLogger->log(Level::ERROR, TAG, "onConnectionStateEvent: No voiceagent id found."); + return -1; + } + std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); + + sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ)); + + return 0; +} + +CTLP_CAPI(onDialogStateEvent, source, argsJ, eventJ) { + if (sEventRouter == nullptr) { + return -1; + } + + string eventName = vshlcore::voiceagents::VSHL_EVENT_DIALOG_STATE_EVENT; + json eventJson = json::parse(json_object_to_json_string(eventJ)); + if (eventJson.find(EVENTS_JSON_ATTR_VA_ID) == eventJson.end()) { + sLogger->log(Level::ERROR, TAG, "onDialogStateEvent: No voiceagent id found."); + return -1; + } + std::string voiceAgentId(eventJson[EVENTS_JSON_ATTR_VA_ID].get()); + + sEventRouter->handleIncomingEvent(eventName, voiceAgentId, json_object_to_json_string(eventJ)); + + return 0; +} + +CTLP_CAPI(loadVoiceAgentsConfig, source, argsJ, eventJ) { + if (sVoiceAgentsDataManager == nullptr) { + sLogger->log(Level::WARNING, TAG, "loadVoiceAgentsConfig: Voice service not initialized."); + return -1; + } + + if (argsJ == nullptr) { + sLogger->log(Level::WARNING, TAG, "loadVoiceAgentsConfig: No arguments supplied."); + return -1; + } + + json agentsConfigJson = json::parse(json_object_to_json_string(argsJ)); + if (agentsConfigJson.find(VA_JSON_ATTR_AGENTS) == agentsConfigJson.end()) { + sLogger->log(Level::ERROR, TAG, "loadVoiceAgentsConfig: No agents object found in agents json"); + return -1; + } + + json agentsJson = agentsConfigJson[VA_JSON_ATTR_AGENTS]; + for (auto agentIt = agentsJson.begin(); agentIt != agentsJson.end(); ++agentIt) { + json agentJson = *agentIt; + + if (agentJson.find(VA_JSON_ATTR_ID) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_ACTIVE) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_NAME) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_API) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_WWS) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_ACTIVE_WW) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_DESCRIPTION) == agentJson.end() || + agentJson.find(VA_JSON_ATTR_VENDOR) == agentJson.end()) { + std::stringstream error; + error << "loadVoiceAgentsConfig: One or more missing params in agent " + "config " + << agentJson.dump(); + sLogger->log(Level::WARNING, TAG, error.str().c_str()); + continue; + } + + std::string id(agentJson[VA_JSON_ATTR_ID].get()); + std::string name(agentJson[VA_JSON_ATTR_NAME].get()); + std::string api(agentJson[VA_JSON_ATTR_API].get()); + std::string description(agentJson[VA_JSON_ATTR_DESCRIPTION].get()); + std::string vendor(agentJson[VA_JSON_ATTR_VENDOR].get()); + std::string activeWakeword(agentJson[VA_JSON_ATTR_ACTIVE_WW].get()); + bool isActive(agentJson[VA_JSON_ATTR_ACTIVE].get()); + + shared_ptr> wakewords = std::make_shared>(); + json wakewordsJson = agentJson[VA_JSON_ATTR_WWS]; + for (auto wwIt = wakewordsJson.begin(); wwIt != wakewordsJson.end(); ++wwIt) { + wakewords->insert(wwIt->get()); + } + + sVoiceAgentsDataManager->addNewVoiceAgent( + id, name, description, api, vendor, activeWakeword, isActive, wakewords); + } + + // Set the default agent. + if (agentsConfigJson.find(VA_JSON_ATTR_DEFAULT) == agentsConfigJson.end()) { + sLogger->log(Level::ERROR, TAG, "loadVoiceAgentsConfig: No default agent found in agents json"); + return -1; + } + std::string defaultAgentId(agentsConfigJson[VA_JSON_ATTR_DEFAULT].get()); + sVoiceAgentsDataManager->setDefaultVoiceAgent(defaultAgentId); + + return 0; +} + +CTLP_CAPI(startListening, source, argsJ, eventJ) { + if (sVoiceAgentsDataManager == nullptr) { + return -1; + } + + if (sVRRequestProcessor == nullptr) { + return -1; + } + + int result = 0; + string requestId = sVRRequestProcessor->startListening(); + + if (!requestId.empty()) { + json responseJson; + responseJson[STARTLISTENING_JSON_ATTR_REQUEST] = requestId; + AFB_ReqSuccess(source->request, json_tokener_parse(responseJson.dump().c_str()), NULL); + } else { + AFB_ReqFail(source->request, NULL, "Failed to startListening..."); + } + + return 0; +} + +CTLP_CAPI(cancelListening, source, argsJ, eventJ) { + return 0; +} + +CTLP_CAPI(enumerateVoiceAgents, source, argsJ, eventJ) { + if (sVoiceAgentsDataManager == nullptr) { + return -1; + } + + auto agents = sVoiceAgentsDataManager->getAllVoiceAgents(); + std::string defaultAgentId(sVoiceAgentsDataManager->getDefaultVoiceAgent()); + + json responseJson; + json agentsJson = json::array(); + + for (auto agent : agents) { + json agentJson; + agentJson[VA_JSON_ATTR_ID] = agent->getId(); + agentJson[VA_JSON_ATTR_NAME] = agent->getName(); + agentJson[VA_JSON_ATTR_DESCRIPTION] = agent->getDescription(); + agentJson[VA_JSON_ATTR_API] = agent->getApi(); + agentJson[VA_JSON_ATTR_VENDOR] = agent->getVendor(); + agentJson[VA_JSON_ATTR_ACTIVE] = agent->isActive(); + agentJson[VA_JSON_ATTR_ACTIVE_WW] = agent->getActiveWakeword(); + + auto wakewords = agent->getWakeWords(); + if (wakewords != nullptr) { + json wakewordsJson; + for (auto wakeword : *wakewords) { + wakewordsJson.push_back(wakeword); + } + agentJson[VA_JSON_ATTR_WWS] = wakewordsJson; + } + + agentsJson.push_back(agentJson); + } + + responseJson[VA_JSON_ATTR_AGENTS] = agentsJson; + responseJson[VA_JSON_ATTR_DEFAULT] = defaultAgentId; + + AFB_ReqSuccess(source->request, json_tokener_parse(responseJson.dump().c_str()), NULL); + + return 0; +} + +CTLP_CAPI(subscribe, source, argsJ, eventJ) { + if (sVoiceAgentsDataManager == nullptr) { + return -1; + } + + if (eventJ == nullptr) { + sLogger->log(Level::WARNING, TAG, "subscribe: No arguments supplied."); + return -1; + } + + json subscribeJson = json::parse(json_object_to_json_string(eventJ)); + if (subscribeJson.find(EVENTS_JSON_ATTR_VA_ID) == subscribeJson.end()) { + sLogger->log(Level::ERROR, TAG, "subscribe: No voiceagent id found in subscribe json"); + return -1; + } + std::string voiceAgentId(subscribeJson[EVENTS_JSON_ATTR_VA_ID].get()); + + if (subscribeJson.find(EVENTS_JSON_ATTR_EVENTS) == subscribeJson.end()) { + sLogger->log(Level::ERROR, TAG, "subscribe: No events array found in subscribe json"); + return -1; + } + list events(subscribeJson[EVENTS_JSON_ATTR_EVENTS].get>()); + + // Subscribe this client for the listed events. + auto request = vshlcore::afb::AFBRequestImpl::create(source->request); + for (auto event : events) { + if (!sVoiceAgentsDataManager->subscribeToVshlEventFromVoiceAgent(*request, event, voiceAgentId)) { + sLogger->log(Level::ERROR, TAG, "subscribe: Failed to subscribe to event: " + event); + return -1; + } + } + + AFB_ReqSuccess(source->request, json_object_new_string("Subscription to events successfully completed."), NULL); + + return 0; +} + +CTLP_CAPI(setDefaultVoiceAgent, source, argsJ, eventJ) { + if (sVoiceAgentsDataManager == nullptr) { + return -1; + } + + if (eventJ == nullptr) { + sLogger->log(Level::WARNING, TAG, "setDefaultVoiceAgent: No arguments supplied."); + return -1; + } + + json jsonRequest = json::parse(json_object_to_json_string(eventJ)); + if (jsonRequest.find(VA_JSON_ATTR_ID) == jsonRequest.end()) { + sLogger->log(Level::ERROR, TAG, "setDefaultVoiceAgent: voice agent id not found in request json"); + return -1; + } + + std::string voiceAgentId(jsonRequest[VA_JSON_ATTR_ID].get()); + if (!sVoiceAgentsDataManager->setDefaultVoiceAgent(voiceAgentId)) { + sLogger->log(Level::ERROR, TAG, "setDefaultVoiceAgent: Failed to set default agent"); + return -1; + } + + AFB_ReqSuccess(source->request, NULL, NULL); + return 0; +} \ No newline at end of file diff --git a/src/plugins/VshlCoreApi.h b/src/plugins/VshlCoreApi.h new file mode 100644 index 0000000..557cecc --- /dev/null +++ b/src/plugins/VshlCoreApi.h @@ -0,0 +1,40 @@ +/* + * Copyright 2017-2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0/ + * + * or in the "license" file accompanying this file. This file 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. + */ +#ifndef VSHL_CORE_API_INCLUDE +#define VSHL_CORE_API_INCLUDE + +#include "ctl-plugin.h" + +#ifdef __cplusplus +extern "C" { +#endif + +CTLP_ONLOAD(plugin, ret); +CTLP_INIT(plugin, ret); +int onAuthStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int onConnectionStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int onDialogStateEvent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int loadVoiceAgentsConfig(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int startListening(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int cancelListening(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int enumerateVoiceAgents(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int subscribe(CtlSourceT* source, json_object* argsJ, json_object* queryJ); +int setDefaultVoiceAgent(CtlSourceT* source, json_object* argsJ, json_object* queryJ); + +#ifdef __cplusplus +} +#endif + +#endif // VSHL_CORE_API_INCLUDE diff --git a/src/plugins/afb/AFBApiImpl.cpp b/src/plugins/afb/AFBApiImpl.cpp index 88d1e7e..9af4fbc 100644 --- a/src/plugins/afb/AFBApiImpl.cpp +++ b/src/plugins/afb/AFBApiImpl.cpp @@ -20,29 +20,19 @@ extern "C" { #define AFB_BINDING_VERSION 3 -#define FREEIF(x) \ - if (!x) { \ - free(x); \ - } -#define BREAKIF(x) \ - if (x) { \ - result = false; \ - break; \ - } #include "afb-definitions.h" } -static std::string TAG = "vshl::afb::AFBApiImpl"; +static std::string TAG = "vshlcore::afb::AFBApiImpl"; /** * Specifies the severity level of a log message */ -using Level = vshl::common::interfaces::ILogger::Level; -using namespace vshl::common::interfaces; -using namespace vshl::utilities::logging; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +using namespace vshlcore::common::interfaces; +using namespace vshlcore::utilities::logging; +namespace vshlcore { namespace afb { std::unique_ptr AFBApiImpl::create(AFB_ApiT api) { diff --git a/src/plugins/afb/AFBApiImpl.h b/src/plugins/afb/AFBApiImpl.h index 74aa7ef..d6b7b31 100644 --- a/src/plugins/afb/AFBApiImpl.h +++ b/src/plugins/afb/AFBApiImpl.h @@ -25,11 +25,10 @@ extern "C" { #include "interfaces/utilities/logging/ILogger.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace afb { -class AFBApiImpl : public vshl::common::interfaces::IAFBApi { +class AFBApiImpl : public vshlcore::common::interfaces::IAFBApi { public: static std::unique_ptr create(AFB_ApiT api); @@ -52,7 +51,7 @@ private: AFB_ApiT mApi; // Logger - std::shared_ptr mLogger; + std::shared_ptr mLogger; }; } // namespace afb diff --git a/src/plugins/afb/AFBRequestImpl.cpp b/src/plugins/afb/AFBRequestImpl.cpp index 8ec5691..6e0f177 100644 --- a/src/plugins/afb/AFBRequestImpl.cpp +++ b/src/plugins/afb/AFBRequestImpl.cpp @@ -18,8 +18,7 @@ extern "C" { #include "afb-definitions.h" } - -namespace vshl { +namespace vshlcore { namespace afb { std::unique_ptr AFBRequestImpl::create(AFB_ReqT afbRequest) { diff --git a/src/plugins/afb/AFBRequestImpl.h b/src/plugins/afb/AFBRequestImpl.h index 2e6f3ab..82772fb 100644 --- a/src/plugins/afb/AFBRequestImpl.h +++ b/src/plugins/afb/AFBRequestImpl.h @@ -22,14 +22,13 @@ extern "C" { } #include "interfaces/afb/IAFBApi.h" - -namespace vshl { +namespace vshlcore { namespace afb { /** * AFB Request impl */ -class AFBRequestImpl : public vshl::common::interfaces::IAFBRequest { +class AFBRequestImpl : public vshlcore::common::interfaces::IAFBRequest { public: static std::unique_ptr create(AFB_ReqT afbRequest); diff --git a/src/plugins/afb/include/AFBEventImpl.h b/src/plugins/afb/include/AFBEventImpl.h index 45f85f9..924c966 100644 --- a/src/plugins/afb/include/AFBEventImpl.h +++ b/src/plugins/afb/include/AFBEventImpl.h @@ -28,15 +28,15 @@ extern "C" { using namespace std; -namespace vshl { +namespace vshlcore { namespace afb { /* * This class encapsulates AFB Event. */ -class AFBEventImpl : public vshl::common::interfaces::IAFBApi::IAFBEvent { +class AFBEventImpl : public vshlcore::common::interfaces::IAFBApi::IAFBEvent { public: static unique_ptr - create(shared_ptr logger, AFB_ApiT api, + create(shared_ptr logger, AFB_ApiT api, const string &eventName); // Destructor @@ -46,12 +46,12 @@ public: string getName() const override; bool isValid() override; int publishEvent(struct json_object *payload) override; - bool subscribe(vshl::common::interfaces::IAFBRequest &request) override; - bool unsubscribe(vshl::common::interfaces::IAFBRequest &request) override; + bool subscribe(vshlcore::common::interfaces::IAFBRequest &request) override; + bool unsubscribe(vshlcore::common::interfaces::IAFBRequest &request) override; /// @c IAFBEvent implementation } private: - AFBEventImpl(shared_ptr logger, + AFBEventImpl(shared_ptr logger, AFB_ApiT api, const string &eventName); // Make the event. This is a lazy make that happens @@ -68,10 +68,10 @@ private: string mEventName; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace afb -} // namespace vshl +} // namespace vshlcore #endif // VSHL_AFB_EVENT_H_ diff --git a/src/plugins/afb/src/AFBEventImpl.cpp b/src/plugins/afb/src/AFBEventImpl.cpp index e3c902d..b7837bb 100644 --- a/src/plugins/afb/src/AFBEventImpl.cpp +++ b/src/plugins/afb/src/AFBEventImpl.cpp @@ -14,23 +14,22 @@ */ #include "afb/include/AFBEventImpl.h" -static string TAG = "vshl::afb::Event"; +static string TAG = "vshlcore::afb::Event"; -using Level = vshl::common::interfaces::ILogger::Level; -using namespace vshl::common::interfaces; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +using namespace vshlcore::common::interfaces; +namespace vshlcore { namespace afb { unique_ptr AFBEventImpl::create( - shared_ptr logger, + shared_ptr logger, AFB_ApiT api, const string& eventName) { return unique_ptr(new AFBEventImpl(logger, api, eventName)); } AFBEventImpl::AFBEventImpl( - shared_ptr logger, + shared_ptr logger, AFB_ApiT api, const string& eventName) : mLogger(logger), diff --git a/src/plugins/capabilities/CapabilitiesFactory.cpp b/src/plugins/capabilities/CapabilitiesFactory.cpp deleted file mode 100644 index 2f92519..0000000 --- a/src/plugins/capabilities/CapabilitiesFactory.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ - -#include "capabilities/CapabilitiesFactory.h" - -#include "capabilities/communication/include/PhoneControlCapability.h" -#include "capabilities/guimetadata/include/GuiMetadataCapability.h" -#include "capabilities/navigation/include/NavigationCapability.h" - -static string TAG = "vshl::core::CapabilitiesFactory"; - -using Level = vshl::utilities::logging::Logger::Level; - -namespace vshl { -namespace capabilities { - -// Create CapabilitiesFactory -std::unique_ptr CapabilitiesFactory::create() { - auto capabilitiesFactory = std::unique_ptr(new CapabilitiesFactory()); - return capabilitiesFactory; -} - -std::shared_ptr CapabilitiesFactory::getGuiMetadata() { - if (!mGuiMetadata) { - mGuiMetadata = vshl::capabilities::guimetadata::GuiMetadata::create(); - } - return mGuiMetadata; -} - -std::shared_ptr CapabilitiesFactory::getPhoneControl() { - if (!mPhoneControl) { - mPhoneControl = vshl::capabilities::phonecontrol::PhoneControl::create(); - } - return mPhoneControl; -} - -std::shared_ptr CapabilitiesFactory::getNavigation() { - if (!mNavigation) { - mNavigation = vshl::capabilities::navigation::Navigation::create(); - } - return mNavigation; -} - -} // namespace capabilities -} // namespace vshl \ No newline at end of file diff --git a/src/plugins/capabilities/CapabilitiesFactory.h b/src/plugins/capabilities/CapabilitiesFactory.h deleted file mode 100644 index b73909b..0000000 --- a/src/plugins/capabilities/CapabilitiesFactory.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_CAPABILITIESFACTORY_H_ -#define VSHL_CAPABILITIES_CAPABILITIESFACTORY_H_ - -#include - -#include "interfaces/capabilities/ICapability.h" -#include "utilities/logging/Logger.h" - -using namespace std; - -namespace vshl { -namespace capabilities { -/* - * Factory for creating different capability objects. - */ -class CapabilitiesFactory { -public: - // Create CapabilitiesFactory - static std::unique_ptr create(); - - // GUI Metadata capability - std::shared_ptr getGuiMetadata(); - - // Phone call control capability - std::shared_ptr getPhoneControl(); - - // Navigation capability - std::shared_ptr getNavigation(); - - // Destructor - ~CapabilitiesFactory() = default; - -private: - // Constructor - CapabilitiesFactory() = default; - - // Capabilities - shared_ptr mGuiMetadata; - shared_ptr mPhoneControl; - shared_ptr mNavigation; - - // Logger - unique_ptr mLogger; -}; - -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_CAPABILITIESFACTORY_H_ diff --git a/src/plugins/capabilities/CapabilityMessagingService.cpp b/src/plugins/capabilities/CapabilityMessagingService.cpp deleted file mode 100644 index 91b5f2b..0000000 --- a/src/plugins/capabilities/CapabilityMessagingService.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/CapabilityMessagingService.h" - -#include "capabilities/core/include/PublisherForwarder.h" -#include "capabilities/core/include/SubscriberForwarder.h" - -static string TAG = "vshl::capabilities::CapabilityMessagingService"; - -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { -namespace capabilities { - -// Create a CapabilityMessagingService. -unique_ptr CapabilityMessagingService::create( - shared_ptr logger, - shared_ptr afbApi) { - if (logger == nullptr) { - return nullptr; - } - - if (afbApi == nullptr) { - logger->log(Level::ERROR, TAG, "Failed to create CapabilityMessagingService: AFB API null"); - return nullptr; - } - - auto capabilityMessageService = - std::unique_ptr(new CapabilityMessagingService(logger, afbApi)); - return capabilityMessageService; -} - -CapabilityMessagingService::~CapabilityMessagingService() { - mMessageChannelsMap.clear(); -} - -CapabilityMessagingService::CapabilityMessagingService( - shared_ptr logger, - shared_ptr afbApi) : - mAfbApi(afbApi), - mLogger(logger) { -} - -// Subscribe to capability specific messages. -bool CapabilityMessagingService::subscribe( - vshl::common::interfaces::IAFBRequest& request, - shared_ptr capability, - const string action) { - auto capabilityName = capability->getName(); - - if (capabilityName.empty()) { - mLogger->log(Level::ERROR, TAG, "Failed to subscribe to message. Invalid input."); - return false; - } - - auto messageChannel = getMessageChannel(capability); - return messageChannel->subscribe(request, action); -} - -// Publish capability messages. -bool CapabilityMessagingService::publish( - shared_ptr capability, - const string action, - const string payload) { - auto capabilityName = capability->getName(); - - if (capabilityName.empty()) { - mLogger->log(Level::ERROR, TAG, "Failed to publish message. Invalid input."); - return false; - } - - auto messageChannelIt = mMessageChannelsMap.find(capabilityName); - if (messageChannelIt == mMessageChannelsMap.end()) { - mLogger->log( - Level::ERROR, - TAG, - "Failed to publish message. Message channel doesn't exist for capability " + capabilityName); - return false; - } - - return messageChannelIt->second->publish(action, payload); -} - -shared_ptr CapabilityMessagingService::getMessageChannel( - shared_ptr capability) { - auto capabilityName = capability->getName(); - - if (capabilityName.empty()) { - mLogger->log(Level::ERROR, TAG, "Failed to create message channel. Invalid input."); - return nullptr; - } - - auto messageChannelIt = mMessageChannelsMap.find(capabilityName); - if (messageChannelIt == mMessageChannelsMap.end()) { - mLogger->log(Level::INFO, TAG, "Creating new message channel for capability: " + capabilityName); - auto messageChannel = vshl::capabilities::core::MessageChannel::create(mLogger, mAfbApi, capability); - mMessageChannelsMap.insert(make_pair(capabilityName, messageChannel)); - return messageChannel; - } - - return messageChannelIt->second; -} - -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/CapabilityMessagingService.h b/src/plugins/capabilities/CapabilityMessagingService.h deleted file mode 100644 index 535e806..0000000 --- a/src/plugins/capabilities/CapabilityMessagingService.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_CAPABILITYMESSAGINGSERVICE_H_ -#define VSHL_CAPABILITIES_CAPABILITYMESSAGINGSERVICE_H_ - -#include -#include -#include - -#include "capabilities/core/include/MessageChannel.h" -#include "interfaces/afb/IAFBApi.h" -#include "interfaces/capabilities/ICapability.h" -#include "interfaces/utilities/logging/ILogger.h" - -using namespace std; - -namespace vshl { -namespace capabilities { -/* - * This hosts service APIs that clients can use to subscribe and - * forward capability messages. Each capability has a name and - * direction (upstream/downstream). Upstream messages are from - * voiceagents to Apps and downstream messages are Apps to voiceagents. - * This class will use a factory to create publisher and subcribers for - * each capability and create assiociations between them. - */ -class CapabilityMessagingService { -public: - // Create a CapabilityMessagingService. - static std::unique_ptr - create(shared_ptr logger, - shared_ptr afbApi); - - // Subscribe to capability specific messages. - bool subscribe(vshl::common::interfaces::IAFBRequest &request, - shared_ptr capability, - const string action); - - // Publish capability messages. - bool publish(shared_ptr capability, - const string action, const string payload); - - // Destructor - ~CapabilityMessagingService(); - -private: - // Constructor - CapabilityMessagingService( - shared_ptr logger, - shared_ptr afbApi); - - // Binding API reference - shared_ptr mAfbApi; - - // Create a message channel for the capability. - shared_ptr - getMessageChannel(shared_ptr capability); - - // Map of capabilities to message channels. - unordered_map> - mMessageChannelsMap; - - // Logger - shared_ptr mLogger; -}; - -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_CAPABILITYMESSAGINGSERVICE_H_ diff --git a/src/plugins/capabilities/communication/include/PhoneControlCapability.h b/src/plugins/capabilities/communication/include/PhoneControlCapability.h deleted file mode 100644 index 55ada8d..0000000 --- a/src/plugins/capabilities/communication/include/PhoneControlCapability.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ - -#ifndef VSHL_CAPABILITIES_PHONECONTROL_CAPABILITY_H_ -#define VSHL_CAPABILITIES_PHONECONTROL_CAPABILITY_H_ - -#include - -#include "interfaces/capabilities/ICapability.h" - -namespace vshl { -namespace capabilities { -namespace phonecontrol { - -/* - * PhoneControl capability. Calls are initiated in the endpoint. - */ -class PhoneControl : public common::interfaces::ICapability { -public: - // Create a PhoneControl. - static std::shared_ptr create(); - - ~PhoneControl() = default; - -protected: - string getName() const override; - - list getUpstreamMessages() const override; - - list getDownstreamMessages() const override; - -private: - PhoneControl() = default; -}; - -} // namespace phonecontrol -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_PHONECONTROL_CAPABILITY_H_ diff --git a/src/plugins/capabilities/communication/include/PhoneControlMessages.h b/src/plugins/capabilities/communication/include/PhoneControlMessages.h deleted file mode 100644 index 4c68455..0000000 --- a/src/plugins/capabilities/communication/include/PhoneControlMessages.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_PHONECONTROL_MESSAGES_H_ -#define VSHL_CAPABILITIES_PHONECONTROL_MESSAGES_H_ - -#include -#include - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace phonecontrol { - -static string NAME = "phonecontrol"; - -// Supported actions from VA -> Apps -/* Dial message sent from VA to app handling the calling. - * - * Payload - * { - * "callId": "{{STRING}}", - * "callee": { - * "details": "{{STRING}}", - * "defaultAddress": { - * "protocol": "{{STRING}}", - * "format": "{{STRING}}", - * "value": "{{STRING}}" - * }, - * "alternativeAddresses": [{ - * "protocol": "{{STRING}}", - * "format": "{{STRING}}", - * "value": {{STRING}} - * }] - * } - * } - * } - * - * callId (required): A unique identifier for the call - * callee (required): The destination of the outgoing call - * callee.details (optional): Descriptive information about the callee - * callee.defaultAddress (required): The default address to use for calling the callee - * callee.alternativeAddresses (optional): An array of alternate addresses for the existing callee - * address.protocol (required): The protocol for this address of the callee (e.g. PSTN, SIP, H323, etc.) - * address.format (optional): The format for this address of the callee (e.g. E.164, E.163, E.123, DIN5008, etc.) - * address.value (required): The address of the callee. - * - */ -static string PHONECONTROL_DIAL = "dial"; - -// Supported actions from Apps -> VA -/* - * App notifies the voiceagents of a change in connection state of a calling device. - * - * Payload - * { - * "state" : "{{STRING}}" // CONNECTED or DISCONNECTED - * } - */ -static string PHONECONTROL_CONNECTIONSTATE_CHANGED = "connection_state_changed"; -/* - * App notifies the voiceagents that call is activated - * - * callId must match the one that is sent by VA with DIAL message above. - * - * Payload - * { - * "callId" : "{{STRING}}" - * } - */ -static string PHONECONTROL_CALL_ACTIVATED = "call_activated"; -/* - * App notifies the voiceagents of an error in initiating or maintaining a - * call on a calling device - * - * callId must match the one that is sent by VA with DIAL message above. - * error: below status codes. - * 4xx: Validation failure for the input from the DIAL message - * 500: Internal error on the platform unrelated to the cellular network - * 503: Error on the platform related to the cellular network - * - * Payload - * { - * "callId" : "{{STRING}}" - * "error" : "{{STRING}}" - * } - */ -static string PHONECONTROL_CALL_FAILED = "call_failed"; -/* - * App notifies the voiceagents that call is terminated - * - * callId must match the one that is sent by VA with DIAL message above. - * - * Payload - * { - * "callId" : "{{STRING}}" - * } - */ -static string PHONECONTROL_CALL_TERMINATED = "call_terminated"; - -// List of actions that are delivered from VA -> Apps -static list PHONECONTROL_UPSTREAM_ACTIONS = { - PHONECONTROL_DIAL, -}; - -// List of actions that are delivered from Apps -> VA -static list PHONECONTROL_DOWNSTREAM_ACTIONS = {PHONECONTROL_CONNECTIONSTATE_CHANGED, - PHONECONTROL_CALL_ACTIVATED, - PHONECONTROL_CALL_FAILED, - PHONECONTROL_CALL_TERMINATED}; - -} // namespace phonecontrol -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_PHONECONTROL_MESSAGES_H_ diff --git a/src/plugins/capabilities/communication/src/PhoneControlCapability.cpp b/src/plugins/capabilities/communication/src/PhoneControlCapability.cpp deleted file mode 100644 index 6a74d5a..0000000 --- a/src/plugins/capabilities/communication/src/PhoneControlCapability.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/communication/include/PhoneControlCapability.h" -#include "capabilities/communication/include/PhoneControlMessages.h" - -namespace vshl { -namespace capabilities { -namespace phonecontrol { - -// Create a phonecontrol. -shared_ptr PhoneControl::create() { - auto phonecontrol = std::shared_ptr(new PhoneControl()); - return phonecontrol; -} - -string PhoneControl::getName() const { - return NAME; -} - -list PhoneControl::getUpstreamMessages() const { - return PHONECONTROL_UPSTREAM_ACTIONS; -} - -list PhoneControl::getDownstreamMessages() const { - return PHONECONTROL_DOWNSTREAM_ACTIONS; -} - -} // namespace phonecontrol -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/core/include/MessageChannel.h b/src/plugins/capabilities/core/include/MessageChannel.h deleted file mode 100644 index 504e241..0000000 --- a/src/plugins/capabilities/core/include/MessageChannel.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_CORE_MESSAGECHANNEL_H_ -#define VSHL_CAPABILITIES_CORE_MESSAGECHANNEL_H_ - -#include - -#include "capabilities/core/include/PublisherForwarder.h" -#include "capabilities/core/include/SubscriberForwarder.h" -#include "interfaces/afb/IAFBApi.h" -#include "interfaces/capabilities/ICapability.h" -#include "interfaces/utilities/logging/ILogger.h" - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace core { -/* - * MessageChannel has one end as publisher forwarder and the other end - * as subscriber forwarder. - */ -class MessageChannel { -public: - // Create a MessageChannel. - static std::shared_ptr - create(shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability); - - // Sends the message - bool publish(const string action, const string payload); - - // Subscribe - bool subscribe(vshl::common::interfaces::IAFBRequest &request, - const string action); - - // Destructor - virtual ~MessageChannel() = default; - -private: - // Constructor - MessageChannel(shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability); - - // Forwarders - shared_ptr mPublisherForwarder; - shared_ptr mSubscriberForwarder; -}; - -} // namespace core -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_CORE_MESSAGECHANNEL_H_ diff --git a/src/plugins/capabilities/core/include/PublisherForwarder.h b/src/plugins/capabilities/core/include/PublisherForwarder.h deleted file mode 100644 index 9cc89b5..0000000 --- a/src/plugins/capabilities/core/include/PublisherForwarder.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_CORE_PUBLISHERFORWARDER_H_ -#define VSHL_CAPABILITIES_CORE_PUBLISHERFORWARDER_H_ - -#include - -#include "capabilities/core/include/SubscriberForwarder.h" - -#include "interfaces/afb/IAFBApi.h" -#include "interfaces/capabilities/ICapability.h" -#include "interfaces/utilities/logging/ILogger.h" - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace core { -/* - * This class is responsible for forwarding the messages to be published - * to subscriber forwarder. Subscriber forwarder will deliver the messages - * as AFB Events to all the subscribed clients. - * There is one PublisherForwarder and one SubscriberForwarder per capability. - */ -class PublisherForwarder { -public: - // Create a PublisherForwarder. - static std::shared_ptr create( - shared_ptr logger, - shared_ptr capability); - - // Connect a subscriber forwarder to this publisher forwarder - void setSubscriberForwarder(shared_ptr subscriberForwarder); - - // Forward message to the subscriber forwarder - bool forwardMessage(const string action, const string payload); - - // Destructor - ~PublisherForwarder(); - -private: - // Constructor - PublisherForwarder( - shared_ptr logger, - shared_ptr capability); - - // Subscriber forwarder connected to this publisher forwarder. - shared_ptr mSubscriberForwarder; - - // Capability - shared_ptr mCapability; - - // Logger - shared_ptr mLogger; -}; - -} // namespace core -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_CORE_PUBLISHERFORWARDER_H_ diff --git a/src/plugins/capabilities/core/include/SubscriberForwarder.h b/src/plugins/capabilities/core/include/SubscriberForwarder.h deleted file mode 100644 index 94c04bf..0000000 --- a/src/plugins/capabilities/core/include/SubscriberForwarder.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_CORE_SUBSCRIBERFORWARDER_H_ -#define VSHL_CAPABILITIES_CORE_SUBSCRIBERFORWARDER_H_ - -#include -#include -#include - -#include "interfaces/afb/IAFBApi.h" -#include "interfaces/capabilities/ICapability.h" -#include "interfaces/utilities/logging/ILogger.h" - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace core { -/* - * This class is responsible for forwarding the messages publishing - * to the actual clients using AFB. - */ -class SubscriberForwarder { -public: - // Create a SubscriberForwarder. - static std::shared_ptr - create(shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability); - - // Publish a capability message to the actual client. - bool forwardMessage(const string action, const string payload); - - // Subscribe - bool subscribe(vshl::common::interfaces::IAFBRequest &request, - const string action); - - // Destructor - ~SubscriberForwarder(); - -private: - // Constructor - SubscriberForwarder( - shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability); - - // Creates both upstream and downstream events - void createEvents(); - - // Binding API reference - shared_ptr mAfbApi; - - // Capability - shared_ptr mCapability; - - // Maps of capability action events to its corresponding Event object. - // Event name maps to Action Name - unordered_map> - mUpstreamEventsMap; - unordered_map> - mDownstreamEventsMap; - - // Logger - shared_ptr mLogger; -}; - -} // namespace core -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_CORE_SUBSCRIBERFORWARDER_H_ diff --git a/src/plugins/capabilities/core/src/MessageChannel.cpp b/src/plugins/capabilities/core/src/MessageChannel.cpp deleted file mode 100644 index eaa1349..0000000 --- a/src/plugins/capabilities/core/src/MessageChannel.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/core/include/MessageChannel.h" - -namespace vshl { -namespace capabilities { -namespace core { - -// Create a MessageChannel. -std::shared_ptr MessageChannel::create( - shared_ptr logger, - shared_ptr api, - shared_ptr capability) { - auto messageChannel = std::shared_ptr(new MessageChannel(logger, api, capability)); - return messageChannel; -} - -MessageChannel::MessageChannel( - shared_ptr logger, - shared_ptr api, - shared_ptr capability) { - // Subscriber forwarder - mSubscriberForwarder = SubscriberForwarder::create(logger, api, capability); - // Publisher forwarder - mPublisherForwarder = PublisherForwarder::create(logger, capability); - mPublisherForwarder->setSubscriberForwarder(mSubscriberForwarder); -} - -bool MessageChannel::publish(const string action, const string payload) { - return mPublisherForwarder->forwardMessage(action, payload); -} - -bool MessageChannel::subscribe(vshl::common::interfaces::IAFBRequest& request, const string action) { - return mSubscriberForwarder->subscribe(request, action); -} - -} // namespace core -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/core/src/PublisherForwarder.cpp b/src/plugins/capabilities/core/src/PublisherForwarder.cpp deleted file mode 100644 index 81de6a0..0000000 --- a/src/plugins/capabilities/core/src/PublisherForwarder.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/core/include/PublisherForwarder.h" - -static string TAG = "vshl::capabilities::PublisherForwarder"; - -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { -namespace capabilities { -namespace core { - -// Create a PublisherForwarder. -std::shared_ptr PublisherForwarder::create( - shared_ptr logger, - shared_ptr capability) { - if (logger == nullptr) { - return nullptr; - } - - if (capability == nullptr) { - logger->log(Level::ERROR, TAG, "Failed to create PublisherForwarder: Capability null"); - return nullptr; - } - - auto publisherForwarder = std::shared_ptr(new PublisherForwarder(logger, capability)); - return publisherForwarder; -} - -// Constructor -PublisherForwarder::PublisherForwarder( - shared_ptr logger, - shared_ptr capability) { - mCapability = capability; - mLogger = logger; -} - -// Destructor -PublisherForwarder::~PublisherForwarder() { -} - -void PublisherForwarder::setSubscriberForwarder(shared_ptr subscriberForwarder) { - mSubscriberForwarder = subscriberForwarder; -} - -bool PublisherForwarder::forwardMessage(const string action, const string payload) { - if (!mSubscriberForwarder) { - mLogger->log(Level::ERROR, TAG, "Failed to forward message for capability: " + mCapability->getName()); - return false; - } - - return mSubscriberForwarder->forwardMessage(action, payload); -} - -} // namespace core -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/core/src/SubscriberForwarder.cpp b/src/plugins/capabilities/core/src/SubscriberForwarder.cpp deleted file mode 100644 index ea42305..0000000 --- a/src/plugins/capabilities/core/src/SubscriberForwarder.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/core/include/SubscriberForwarder.h" - -static string TAG = "vshl::capabilities::SubscriberForwarder"; - -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { -namespace capabilities { -namespace core { - -// Create a SubscriberForwarder. -std::shared_ptr SubscriberForwarder::create( - shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability) { - if (logger == nullptr) { - return nullptr; - } - - if (afbApi == nullptr) { - logger->log(Level::ERROR, TAG, "Failed to create SubscriberForwarder: AFB API null"); - return nullptr; - } - - if (capability == nullptr) { - logger->log(Level::ERROR, TAG, "Failed to create SubscriberForwarder: Capability null"); - return nullptr; - } - - auto subscriberForwarder = - std::shared_ptr(new SubscriberForwarder(logger, afbApi, capability)); - return subscriberForwarder; -} - -SubscriberForwarder::SubscriberForwarder( - shared_ptr logger, - shared_ptr afbApi, - shared_ptr capability) : - mAfbApi(afbApi), - mLogger(logger), - mCapability(capability) { - createEvents(); -} - -SubscriberForwarder::~SubscriberForwarder() { - mUpstreamEventsMap.clear(); - mDownstreamEventsMap.clear(); -} - -void SubscriberForwarder::createEvents() { - if (!mCapability) { - mLogger->log(Level::NOTICE, TAG, "Create Events failed. No capability assigned."); - return; - } - - // Upstream events - auto upstreamEvents = mCapability->getUpstreamMessages(); - for (auto upstreamEventName : upstreamEvents) { - auto it = mUpstreamEventsMap.find(upstreamEventName); - if (it == mUpstreamEventsMap.end() && mAfbApi) { - // create a new event and add it to the map. - shared_ptr event = mAfbApi->createEvent(upstreamEventName); - if (event == nullptr) { - mLogger->log(Level::ERROR, TAG, "Failed to create upstream event: " + upstreamEventName); - } else { - mUpstreamEventsMap.insert(make_pair(upstreamEventName, event)); - } - } - } - - // Downstream events - auto downstreamEvents = mCapability->getDownstreamMessages(); - for (auto downstreamEventName : downstreamEvents) { - auto it = mDownstreamEventsMap.find(downstreamEventName); - if (it == mDownstreamEventsMap.end() && mAfbApi) { - // create a new event and add it to the map. - shared_ptr event = mAfbApi->createEvent(downstreamEventName); - if (event == nullptr) { - mLogger->log(Level::ERROR, TAG, "Failed to create downstream event: " + downstreamEventName); - } else { - mDownstreamEventsMap.insert(make_pair(downstreamEventName, event)); - } - } - } -} - -bool SubscriberForwarder::forwardMessage(const string action, const string payload) { - auto upstreamEventIt = mUpstreamEventsMap.find(action); - if (upstreamEventIt != mUpstreamEventsMap.end()) { - mLogger->log(Level::NOTICE, TAG, "Publishing upstream event: " + action); - upstreamEventIt->second->publishEvent(json_object_new_string(payload.c_str())); - return true; - } - - auto downstreamEventIt = mDownstreamEventsMap.find(action); - if (downstreamEventIt != mDownstreamEventsMap.end()) { - mLogger->log(Level::NOTICE, TAG, "Publishing downstream event: " + action); - downstreamEventIt->second->publishEvent(json_object_new_string(payload.c_str())); - return true; - } - - mLogger->log(Level::NOTICE, TAG, "Failed to publish upstream event: " + action); - return false; -} - -bool SubscriberForwarder::subscribe(vshl::common::interfaces::IAFBRequest& request, const string action) { - auto upstreamEventIt = mUpstreamEventsMap.find(action); - if (upstreamEventIt != mUpstreamEventsMap.end()) { - mLogger->log(Level::NOTICE, TAG, "Subscribing to upstream event: " + action); - return upstreamEventIt->second->subscribe(request); - } - - auto downstreamEventIt = mDownstreamEventsMap.find(action); - if (downstreamEventIt != mDownstreamEventsMap.end()) { - mLogger->log(Level::NOTICE, TAG, "Subscribing to downstream event: " + action); - return downstreamEventIt->second->subscribe(request); - } - - mLogger->log(Level::NOTICE, TAG, "Failed to subscribe to upstream event: " + action); - return false; -} - -} // namespace core -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/guimetadata/include/GuiMetadataCapability.h b/src/plugins/capabilities/guimetadata/include/GuiMetadataCapability.h deleted file mode 100644 index 199f49a..0000000 --- a/src/plugins/capabilities/guimetadata/include/GuiMetadataCapability.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ - -#ifndef VSHL_CAPABILITIES_GUIMETADATA_CAPABILITY_H_ -#define VSHL_CAPABILITIES_GUIMETADATA_CAPABILITY_H_ - -#include - -#include "interfaces/capabilities/ICapability.h" - -namespace vshl { -namespace capabilities { -namespace guimetadata { - -/* - * GuiMetadata capability - */ -class GuiMetadata : public common::interfaces::ICapability { -public: - // Create a GuiMetadata. - static std::shared_ptr create(); - - ~GuiMetadata() = default; - -protected: - string getName() const override; - - list getUpstreamMessages() const override; - - list getDownstreamMessages() const override; - -private: - GuiMetadata() = default; -}; - -} // namespace guimetadata -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_GUIMETADATA_CAPABILITY_H_ diff --git a/src/plugins/capabilities/guimetadata/include/GuiMetadataMessages.h b/src/plugins/capabilities/guimetadata/include/GuiMetadataMessages.h deleted file mode 100644 index 783b401..0000000 --- a/src/plugins/capabilities/guimetadata/include/GuiMetadataMessages.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_GUIMETADATA_ACTIONS_H_ -#define VSHL_CAPABILITIES_GUIMETADATA_ACTIONS_H_ - -#include -#include - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace guimetadata { - -static string NAME = "guimetadata"; - -// Supported actions from VA -> Apps -static string GUIMETADATA_RENDER_TEMPLATE = "render_template"; -static string GUIMETADATA_CLEAR_TEMPLATE = "clear_template"; -static string GUIMETADATA_RENDER_PLAYER_INFO = "render_player_info"; -static string GUIMETADATA_CLEAR_PLAYER_INFO = "clear_player_info"; - -// Supported actions from Apps -> VA - -// List of actions that are delivered from VA -> Apps -static list GUIMETADATA_UPSTREAM_ACTIONS = {GUIMETADATA_RENDER_TEMPLATE, - GUIMETADATA_CLEAR_TEMPLATE, - GUIMETADATA_RENDER_PLAYER_INFO, - GUIMETADATA_CLEAR_PLAYER_INFO}; - -// List of actions that are delivered from Apps -> VA -static list GUIMETADATA_DOWNSTREAM_ACTIONS = {}; - -} // namespace guimetadata -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_GUIMETADATA_ACTIONS_H_ diff --git a/src/plugins/capabilities/guimetadata/src/GuiMetadataCapability.cpp b/src/plugins/capabilities/guimetadata/src/GuiMetadataCapability.cpp deleted file mode 100644 index 106fe99..0000000 --- a/src/plugins/capabilities/guimetadata/src/GuiMetadataCapability.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/guimetadata/include/GuiMetadataCapability.h" -#include "capabilities/guimetadata/include/GuiMetadataMessages.h" - -namespace vshl { -namespace capabilities { -namespace guimetadata { - -// Create a GuiMetadata. -shared_ptr GuiMetadata::create() { - auto guiMetadata = std::shared_ptr(new GuiMetadata()); - return guiMetadata; -} - -string GuiMetadata::getName() const { - return NAME; -} - -list GuiMetadata::getUpstreamMessages() const { - return GUIMETADATA_UPSTREAM_ACTIONS; -} - -list GuiMetadata::getDownstreamMessages() const { - return GUIMETADATA_DOWNSTREAM_ACTIONS; -} - -} // namespace guimetadata -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/navigation/include/NavigationCapability.h b/src/plugins/capabilities/navigation/include/NavigationCapability.h deleted file mode 100644 index 66109d5..0000000 --- a/src/plugins/capabilities/navigation/include/NavigationCapability.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ - -#ifndef VSHL_CAPABILITIES_NAVIGATION_CAPABILITY_H_ -#define VSHL_CAPABILITIES_NAVIGATION_CAPABILITY_H_ - -#include - -#include "interfaces/capabilities/ICapability.h" - -namespace vshl { -namespace capabilities { -namespace navigation { - -/* - * Navigation capability - */ -class Navigation : public common::interfaces::ICapability { -public: - // Create a Navigation. - static std::shared_ptr create(); - - ~Navigation() = default; - -protected: - string getName() const override; - - list getUpstreamMessages() const override; - - list getDownstreamMessages() const override; - -private: - Navigation() = default; -}; - -} // namespace navigation -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_NAVIGATION_CAPABILITY_H_ diff --git a/src/plugins/capabilities/navigation/include/NavigationMessages.h b/src/plugins/capabilities/navigation/include/NavigationMessages.h deleted file mode 100644 index aed9b9e..0000000 --- a/src/plugins/capabilities/navigation/include/NavigationMessages.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_CAPABILITIES_NAVIGATION_ACTIONS_H_ -#define VSHL_CAPABILITIES_NAVIGATION_ACTIONS_H_ - -#include -#include - -using namespace std; - -namespace vshl { -namespace capabilities { -namespace navigation { - -static string NAME = "navigation"; - -// Supported actions from VA -> Apps -static string NAVIGATION_SET_DESTINATION = "set_destination"; -static string NAVIGATION_CANCEL = "cancel_navigation"; - -// Supported actions from Apps -> VA - -// List of actions that are delivered from VA -> Apps -static list NAVIGATION_UPSTREAM_ACTIONS = { - NAVIGATION_SET_DESTINATION, - NAVIGATION_CANCEL, -}; - -// List of actions that are delivered from Apps -> VA -static list NAVIGATION_DOWNSTREAM_ACTIONS = {}; - -} // namespace navigation -} // namespace capabilities -} // namespace vshl - -#endif // VSHL_CAPABILITIES_NAVIGATION_ACTIONS_H_ diff --git a/src/plugins/capabilities/navigation/src/NavigationCapability.cpp b/src/plugins/capabilities/navigation/src/NavigationCapability.cpp deleted file mode 100644 index d4a5119..0000000 --- a/src/plugins/capabilities/navigation/src/NavigationCapability.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include "capabilities/navigation/include/NavigationCapability.h" -#include "capabilities/navigation/include/NavigationMessages.h" - -namespace vshl { -namespace capabilities { -namespace navigation { - -// Create a Navigation. -shared_ptr Navigation::create() { - auto navigation = std::shared_ptr(new Navigation()); - return navigation; -} - -string Navigation::getName() const { - return NAME; -} - -list Navigation::getUpstreamMessages() const { - return NAVIGATION_UPSTREAM_ACTIONS; -} - -list Navigation::getDownstreamMessages() const { - return NAVIGATION_DOWNSTREAM_ACTIONS; -} - -} // namespace navigation -} // namespace capabilities -} // namespace vshl diff --git a/src/plugins/capabilities/test/CapabilityMessagingServiceTest.cpp b/src/plugins/capabilities/test/CapabilityMessagingServiceTest.cpp deleted file mode 100644 index 741a8aa..0000000 --- a/src/plugins/capabilities/test/CapabilityMessagingServiceTest.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include - -#include "capabilities/CapabilityMessagingService.h" - -#include "test/common/ConsoleLogger.h" -#include "test/mocks/AFBApiMock.h" -#include "test/mocks/AFBEventMock.h" -#include "test/mocks/AFBRequestMock.h" -#include "test/mocks/CapabilityMock.h" - -using namespace vshl::common::interfaces; -using namespace vshl::capabilities; -using namespace vshl::test::common; - -namespace vshl { -namespace test { - -class CapabilityMessagingServiceTest : public ::testing::Test { -protected: - void SetUp() override { - mConsoleLogger = std::make_shared(); - mAfbApi = std::make_shared<::testing::NiceMock>(); - } - - std::shared_ptr<::testing::NiceMock> mAfbApi; - std::shared_ptr mConsoleLogger; -}; - -TEST_F(CapabilityMessagingServiceTest, failsInitializationOnInvalidParams) { - auto service = CapabilityMessagingService::create(mConsoleLogger, nullptr); - ASSERT_EQ(service, nullptr); - - service = CapabilityMessagingService::create(nullptr, mAfbApi); - ASSERT_EQ(service, nullptr); -} - -TEST_F(CapabilityMessagingServiceTest, initializesSuccessfully) { - auto service = CapabilityMessagingService::create(mConsoleLogger, mAfbApi); - ASSERT_NE(service, nullptr); -} - -TEST_F(CapabilityMessagingServiceTest, canSubscribeAndPublishCapabilityEvents) { - auto service = CapabilityMessagingService::create(mConsoleLogger, mAfbApi); - - auto capability = std::make_shared<::testing::NiceMock>(); - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - std::string capabilityName = "weather"; - - ON_CALL(*capability, getName()).WillByDefault(::testing::Return(capabilityName)); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - // We don't care if and how many times subscribe method is called on event. - std::shared_ptr mockEvent(new ::testing::NiceMock()); - ON_CALL(*mockEvent, subscribe(::testing::_)).WillByDefault(::testing::Return(true)); - ON_CALL(*mockEvent, publishEvent(::testing::_)).WillByDefault(::testing::Return(true)); - auto eventCreator = [mockEvent](const std::string& eventName) -> std::shared_ptr { - mockEvent->setName(eventName); - return mockEvent; - }; - - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(eventCreator)); - - auto request = std::make_shared<::testing::StrictMock>(); - std::string payload = "The answer to life the universe and everything = 42"; - - bool result = service->publish(capability, *upstreamEvents.begin(), payload); - ASSERT_FALSE(result); // Without subscribing to the event. Publish should fail. - - result = service->subscribe(*request, capability, *upstreamEvents.begin()); - ASSERT_TRUE(result); - - result = service->subscribe(*request, capability, *downstreamEvents.begin()); - ASSERT_TRUE(result); - - result = service->publish(capability, *downstreamEvents.begin(), payload); - ASSERT_TRUE(result); -} - -} // namespace test -} // namespace vshl \ No newline at end of file diff --git a/src/plugins/capabilities/test/PublisherForwarderTest.cpp b/src/plugins/capabilities/test/PublisherForwarderTest.cpp deleted file mode 100644 index d0ba319..0000000 --- a/src/plugins/capabilities/test/PublisherForwarderTest.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include - -#include "capabilities/core/include/PublisherForwarder.h" -#include "capabilities/core/include/SubscriberForwarder.h" - -#include "test/common/ConsoleLogger.h" -#include "test/mocks/AFBApiMock.h" -#include "test/mocks/AFBEventMock.h" -#include "test/mocks/CapabilityMock.h" - -using namespace vshl::common::interfaces; -using namespace vshl::capabilities::core; -using namespace vshl::test::common; - -namespace vshl { -namespace test { - -class PublisherForwarderTest : public ::testing::Test { -protected: - void SetUp() override { - mConsoleLogger = std::make_shared(); - mAfbApi = std::make_shared<::testing::StrictMock>(); - - mEventCreatorFn = [](const std::string& eventName) -> std::shared_ptr { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - mockEvent->setName(eventName); - return mockEvent; - }; - } - - std::shared_ptr createSubscriberForwarder( - std::shared_ptr<::testing::StrictMock> capability) { - EXPECT_CALL(*capability, getUpstreamMessages()).Times(1); - EXPECT_CALL(*capability, getDownstreamMessages()).Times(1); - - return SubscriberForwarder::create(mConsoleLogger, mAfbApi, capability); - } - - std::shared_ptr createPublisherForwarder( - std::shared_ptr<::testing::StrictMock> capability) { - return PublisherForwarder::create(mConsoleLogger, capability); - } - - std::shared_ptr<::testing::StrictMock> mAfbApi; - std::shared_ptr mConsoleLogger; - std::function(const std::string&)> mEventCreatorFn; - std::shared_ptr<::testing::StrictMock> mAfbEventMock; -}; - -TEST_F(PublisherForwarderTest, failsInitializationOnInvalidParams) { - auto capability = std::make_shared<::testing::StrictMock>(); - - auto forwarder = PublisherForwarder::create(mConsoleLogger, nullptr); - ASSERT_EQ(forwarder, nullptr); - - forwarder = PublisherForwarder::create(nullptr, capability); - ASSERT_EQ(forwarder, nullptr); -} - -TEST_F(PublisherForwarderTest, initializesCorrectly) { - auto capability = std::make_shared<::testing::StrictMock>(); - auto forwarder = createPublisherForwarder(capability); - - ASSERT_NE(forwarder, nullptr); -} - -TEST_F(PublisherForwarderTest, canForwardMessages) { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - ON_CALL(*mockEvent, publishEvent(::testing::_)).WillByDefault(::testing::Return(true)); - EXPECT_CALL(*mockEvent, publishEvent(::testing::_)).Times(4); - auto eventCreator = [mockEvent](const std::string& eventName) -> std::shared_ptr { - return mockEvent; - }; - - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(eventCreator)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - auto capability = std::make_shared<::testing::StrictMock>(); - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto publisherForwarder = createPublisherForwarder(capability); - ASSERT_NE(publisherForwarder, nullptr); - - auto subscriberForwarder = createSubscriberForwarder(capability); - ASSERT_NE(subscriberForwarder, nullptr); - - std::string payload = "The answer to life the universe and everything = 42"; - publisherForwarder->setSubscriberForwarder(subscriberForwarder); - - auto itCapability = downstreamEvents.begin(); - ASSERT_TRUE(publisherForwarder->forwardMessage(*itCapability++, payload)); - ASSERT_TRUE(publisherForwarder->forwardMessage(*itCapability++, payload)); - itCapability = upstreamEvents.begin(); - ASSERT_TRUE(publisherForwarder->forwardMessage(*itCapability++, payload)); - ASSERT_TRUE(publisherForwarder->forwardMessage(*itCapability++, payload)); -} - -} // namespace test -} // namespace vshl \ No newline at end of file diff --git a/src/plugins/capabilities/test/SubscriberForwarderTest.cpp b/src/plugins/capabilities/test/SubscriberForwarderTest.cpp deleted file mode 100644 index ff438df..0000000 --- a/src/plugins/capabilities/test/SubscriberForwarderTest.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#include - -#include "capabilities/core/include/SubscriberForwarder.h" - -#include "test/common/ConsoleLogger.h" -#include "test/mocks/AFBApiMock.h" -#include "test/mocks/AFBEventMock.h" -#include "test/mocks/AFBRequestMock.h" -#include "test/mocks/CapabilityMock.h" - -using namespace vshl::common::interfaces; -using namespace vshl::capabilities::core; -using namespace vshl::test::common; - -namespace vshl { -namespace test { - -class SubscriberForwarderTest : public ::testing::Test { -protected: - void SetUp() override { - mConsoleLogger = std::make_shared(); - mAfbApi = std::make_shared<::testing::StrictMock>(); - - mEventCreatorFn = [](const std::string& eventName) -> std::shared_ptr { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - mockEvent->setName(eventName); - return mockEvent; - }; - } - - std::shared_ptr createSubscriberForwarder( - std::shared_ptr<::testing::StrictMock> capability) { - EXPECT_CALL(*capability, getUpstreamMessages()).Times(1); - EXPECT_CALL(*capability, getDownstreamMessages()).Times(1); - - return SubscriberForwarder::create(mConsoleLogger, mAfbApi, capability); - } - - std::shared_ptr<::testing::StrictMock> mAfbApi; - std::shared_ptr mConsoleLogger; - std::function(const std::string&)> mEventCreatorFn; - std::shared_ptr<::testing::StrictMock> mAfbEventMock; -}; - -TEST_F(SubscriberForwarderTest, failsInitializationOnInvalidParams) { - auto capability = std::make_shared<::testing::StrictMock>(); - - auto forwarder = SubscriberForwarder::create(mConsoleLogger, mAfbApi, nullptr); - ASSERT_EQ(forwarder, nullptr); - - forwarder = SubscriberForwarder::create(mConsoleLogger, nullptr, capability); - ASSERT_EQ(forwarder, nullptr); - - forwarder = SubscriberForwarder::create(nullptr, mAfbApi, capability); - ASSERT_EQ(forwarder, nullptr); -} - -TEST_F(SubscriberForwarderTest, initializesCorrectly) { - auto capability = std::make_shared<::testing::StrictMock>(); - auto forwarder = createSubscriberForwarder(capability); - - ASSERT_NE(forwarder, nullptr); -} - -TEST_F(SubscriberForwarderTest, createsEventsOnInitialization) { - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(mEventCreatorFn)); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto itCapability = upstreamEvents.begin(); - EXPECT_CALL(*mAfbApi, createEvent(*itCapability)).Times(1); - itCapability++; - EXPECT_CALL(*mAfbApi, createEvent(*itCapability)).Times(1); - - itCapability = downstreamEvents.begin(); - EXPECT_CALL(*mAfbApi, createEvent(*itCapability)).Times(1); - itCapability++; - EXPECT_CALL(*mAfbApi, createEvent(*itCapability)).Times(1); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); -} - -TEST_F(SubscriberForwarderTest, canNotSubscribeToNonExistentEvents) { - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(mEventCreatorFn)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto nonExistentEvents = std::list({"non", "existent", "events"}); - auto itCapability = nonExistentEvents.begin(); - auto request = std::make_shared<::testing::StrictMock>(); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); -} - -TEST_F(SubscriberForwarderTest, canNotSubscribeOnEventCreationFailure) { - // Fail the event creation and return null event. - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Return(nullptr)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto itCapability = downstreamEvents.begin(); - auto request = std::make_shared<::testing::StrictMock>(); - std::string payload = "The answer to life the universe and everything = 42"; - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); - itCapability = upstreamEvents.begin(); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_FALSE(forwarder->subscribe(*request, *itCapability++)); -} - -TEST_F(SubscriberForwarderTest, canSubscribeToEvents) { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - ON_CALL(*mockEvent, subscribe(::testing::_)).WillByDefault(::testing::Return(true)); - EXPECT_CALL(*mockEvent, subscribe(::testing::_)).Times(4); - auto eventCreator = [mockEvent](const std::string& eventName) -> std::shared_ptr { - return mockEvent; - }; - - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(eventCreator)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto itCapability = downstreamEvents.begin(); - auto request = std::make_shared<::testing::StrictMock>(); - ASSERT_TRUE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_TRUE(forwarder->subscribe(*request, *itCapability)); - itCapability = upstreamEvents.begin(); - ASSERT_TRUE(forwarder->subscribe(*request, *itCapability++)); - ASSERT_TRUE(forwarder->subscribe(*request, *itCapability)); -} - -TEST_F(SubscriberForwarderTest, canNotPublishNonExistentEvents) { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - EXPECT_CALL(*mockEvent, publishEvent(::testing::_)).Times(0); - auto eventCreator = [mockEvent](const std::string& eventName) -> std::shared_ptr { - return mockEvent; - }; - - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(eventCreator)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto nonExistentEvents = std::list({"non", "existent", "events"}); - auto itCapability = nonExistentEvents.begin(); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, "My-Payload")); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, "My-Payload")); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, "My-Payload")); -} - -TEST_F(SubscriberForwarderTest, canNotPublishOnEventCreationFailure) { - // Fail the event creation and return null event. - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Return(nullptr)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto itCapability = downstreamEvents.begin(); - std::string payload = "The answer to life the universe and everything = 42"; - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, payload)); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, payload)); - itCapability = upstreamEvents.begin(); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, payload)); - ASSERT_FALSE(forwarder->forwardMessage(*itCapability++, payload)); -} - -TEST_F(SubscriberForwarderTest, canPublishEvents) { - std::shared_ptr mockEvent(new ::testing::StrictMock()); - ON_CALL(*mockEvent, publishEvent(::testing::_)).WillByDefault(::testing::Return(true)); - EXPECT_CALL(*mockEvent, publishEvent(::testing::_)).Times(4); - auto eventCreator = [mockEvent](const std::string& eventName) -> std::shared_ptr { - return mockEvent; - }; - - ON_CALL(*mAfbApi, createEvent(::testing::_)).WillByDefault(::testing::Invoke(eventCreator)); - EXPECT_CALL(*mAfbApi, createEvent(::testing::_)).Times(4); - - std::list upstreamEvents({"up-ev1", "up-ev2"}); - std::list downstreamEvents({"down-ev1", "down-ev2"}); - - auto capability = std::make_shared<::testing::StrictMock>(); - ON_CALL(*capability, getUpstreamMessages()).WillByDefault(::testing::Return(upstreamEvents)); - ON_CALL(*capability, getDownstreamMessages()).WillByDefault(::testing::Return(downstreamEvents)); - - auto forwarder = createSubscriberForwarder(capability); - ASSERT_NE(forwarder, nullptr); - - auto itCapability = downstreamEvents.begin(); - std::string payload = "The answer to life the universe and everything = 42"; - ASSERT_TRUE(forwarder->forwardMessage(*itCapability++, payload)); - ASSERT_TRUE(forwarder->forwardMessage(*itCapability++, payload)); - itCapability = upstreamEvents.begin(); - ASSERT_TRUE(forwarder->forwardMessage(*itCapability++, payload)); - ASSERT_TRUE(forwarder->forwardMessage(*itCapability++, payload)); -} - -} // namespace test -} // namespace vshl \ No newline at end of file diff --git a/src/plugins/core/VRRequestProcessor.h b/src/plugins/core/VRRequestProcessor.h index c349a19..97e277a 100644 --- a/src/plugins/core/VRRequestProcessor.h +++ b/src/plugins/core/VRRequestProcessor.h @@ -25,8 +25,7 @@ #include "interfaces/voiceagents/IVoiceAgentsChangeObserver.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace core { /* * This class is the entry point for all the voice recognition request @@ -36,8 +35,8 @@ class VRRequestProcessor { public: // Create a VRRequestProcessor. static unique_ptr create( - shared_ptr logger, - shared_ptr delegate); + shared_ptr logger, + shared_ptr delegate); // Triggers a voiceagent to start listening to user speech input. // Returns the request ID. If start fails, then empty request ID @@ -48,7 +47,7 @@ public: void cancel(); // Returns the voiceagents observer that belongs to the core module. - shared_ptr getVoiceAgentsChangeObserver() const; + shared_ptr getVoiceAgentsChangeObserver() const; // Destructor ~VRRequestProcessor(); @@ -56,17 +55,17 @@ public: private: // Constructor VRRequestProcessor( - shared_ptr logger, - shared_ptr delegate); + shared_ptr logger, + shared_ptr delegate); // Voiceagents observer - shared_ptr mVoiceAgentsChangeObserver; + shared_ptr mVoiceAgentsChangeObserver; // Request Processor Delegate - shared_ptr mDelegate; + shared_ptr mDelegate; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace core diff --git a/src/plugins/core/VRRequestProcessorImpl.cpp b/src/plugins/core/VRRequestProcessorImpl.cpp index 7441a7d..c07f745 100644 --- a/src/plugins/core/VRRequestProcessorImpl.cpp +++ b/src/plugins/core/VRRequestProcessorImpl.cpp @@ -16,23 +16,22 @@ #include "core/include/VRAgentsObserver.h" -static string TAG = "vshl::core::VRRequestProcessor"; +static string TAG = "vshlcore::core::VRRequestProcessor"; -using Level = vshl::utilities::logging::Logger::Level; - -namespace vshl { +using Level = vshlcore::utilities::logging::Logger::Level; +namespace vshlcore { namespace core { // Create a VRRequestProcessor. unique_ptr VRRequestProcessor::create( - shared_ptr logger, - shared_ptr delegate) { + shared_ptr logger, + shared_ptr delegate) { auto processor = std::unique_ptr(new VRRequestProcessor(logger, delegate)); return processor; } VRRequestProcessor::VRRequestProcessor( - shared_ptr logger, - shared_ptr delegate) : + shared_ptr logger, + shared_ptr delegate) : mLogger(logger), mDelegate(delegate) { mVoiceAgentsChangeObserver = VRAgentsObserver::create(mDelegate); @@ -46,7 +45,7 @@ string VRRequestProcessor::startListening() { // Currently start is simply going to send the request to // the default voice agent as the wake word detection is not // enabled. - shared_ptr defaultVA = mDelegate->getDefaultVoiceAgent(); + shared_ptr defaultVA = mDelegate->getDefaultVoiceAgent(); if (!defaultVA) { mLogger->log(Level::ERROR, TAG, "Failed to start. No default voiceagent found."); return ""; @@ -63,7 +62,7 @@ void VRRequestProcessor::cancel() { mDelegate->cancelAllRequests(); } -shared_ptr VRRequestProcessor::getVoiceAgentsChangeObserver() +shared_ptr VRRequestProcessor::getVoiceAgentsChangeObserver() const { return mVoiceAgentsChangeObserver; } diff --git a/src/plugins/core/include/VRAgentsObserver.h b/src/plugins/core/include/VRAgentsObserver.h index d4c0c7b..ce1bd43 100644 --- a/src/plugins/core/include/VRAgentsObserver.h +++ b/src/plugins/core/include/VRAgentsObserver.h @@ -22,15 +22,14 @@ #include "utilities/logging/Logger.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace core { /* * This class will observe the changes to the voiceagents data and transfers * the actual handling responsibility to its delegate. */ class VRAgentsObserver - : public vshl::common::interfaces::IVoiceAgentsChangeObserver { + : public vshlcore::common::interfaces::IVoiceAgentsChangeObserver { public: // Create a VRAgentsObserver. static shared_ptr @@ -40,18 +39,18 @@ public: protected: void OnDefaultVoiceAgentChanged( - shared_ptr defaultVoiceAgent) + shared_ptr defaultVoiceAgent) override; void OnVoiceAgentAdded( - shared_ptr voiceAgent) override; + shared_ptr voiceAgent) override; void OnVoiceAgentRemoved( - shared_ptr voiceAgent) override; + shared_ptr voiceAgent) override; void OnVoiceAgentActiveWakeWordChanged( - shared_ptr voiceAgent) override; + shared_ptr voiceAgent) override; void OnVoiceAgentActivated( - shared_ptr voiceAgent) override; + shared_ptr voiceAgent) override; void OnVoiceAgentDeactivated( - shared_ptr voiceAgent) override; + shared_ptr voiceAgent) override; private: // Constructor diff --git a/src/plugins/core/include/VRRequest.h b/src/plugins/core/include/VRRequest.h index 522ec78..8b9e842 100644 --- a/src/plugins/core/include/VRRequest.h +++ b/src/plugins/core/include/VRRequest.h @@ -22,8 +22,7 @@ #include "interfaces/voiceagents/IVoiceAgent.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace core { /* * This class implements the notion of a Voice Recognition Request. @@ -37,10 +36,10 @@ public: // Create a VRRequest. static unique_ptr create( - shared_ptr logger, - shared_ptr afbApi, + shared_ptr logger, + shared_ptr afbApi, string requestId, - shared_ptr voiceAgent); + shared_ptr voiceAgent); // Destructor ~VRRequest(); @@ -56,22 +55,22 @@ public: private: // Constructor VRRequest( - shared_ptr logger, - shared_ptr afbApi, + shared_ptr logger, + shared_ptr afbApi, const string requestId, - shared_ptr voiceAgent); + shared_ptr voiceAgent); // Binding API reference. - shared_ptr mApi; + shared_ptr mApi; // Voice agent associated with this request - shared_ptr mVoiceAgent; + shared_ptr mVoiceAgent; // Request ID string mRequestId; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace core diff --git a/src/plugins/core/include/VRRequestProcessorDelegate.h b/src/plugins/core/include/VRRequestProcessorDelegate.h index 94b7304..2c36d38 100644 --- a/src/plugins/core/include/VRRequestProcessorDelegate.h +++ b/src/plugins/core/include/VRRequestProcessorDelegate.h @@ -25,8 +25,7 @@ #include "utilities/uuid/UUIDGeneration.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace core { /* * This is a delegate for VRRequestProcessor actions. @@ -39,22 +38,22 @@ class VRRequestProcessorDelegate { public: // create method static shared_ptr create( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); // Destructor ~VRRequestProcessorDelegate(); // Set default voiceagent - void setDefaultVoiceAgent(shared_ptr voiceAgent); + void setDefaultVoiceAgent(shared_ptr voiceAgent); // Get the default voiceagent - shared_ptr getDefaultVoiceAgent() const; + shared_ptr getDefaultVoiceAgent() const; // Add new request to the list and start processing it. // New request is created and startListening on the // voiceagent is called. - string startRequestForVoiceAgent(shared_ptr voiceAgent); + string startRequestForVoiceAgent(shared_ptr voiceAgent); // Cancel all requests void cancelAllRequests(); @@ -66,20 +65,20 @@ public: private: // Constructor VRRequestProcessorDelegate( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); // Binding API reference - shared_ptr mApi; + shared_ptr mApi; // Default voiceagent - shared_ptr mDefaultVoiceAgent; + shared_ptr mDefaultVoiceAgent; // A map of voiceagent IDs and their respective VR Request objects. unordered_map> mVRRequests; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace core diff --git a/src/plugins/core/src/VRAgentsObserverImpl.cpp b/src/plugins/core/src/VRAgentsObserverImpl.cpp index 7ee4a7e..b44a9a0 100644 --- a/src/plugins/core/src/VRAgentsObserverImpl.cpp +++ b/src/plugins/core/src/VRAgentsObserverImpl.cpp @@ -13,8 +13,7 @@ * permissions and limitations under the License. */ #include "core/include/VRAgentsObserver.h" - -namespace vshl { +namespace vshlcore { namespace core { shared_ptr VRAgentsObserver::create(weak_ptr delegate) { @@ -29,26 +28,26 @@ VRAgentsObserver::VRAgentsObserver(weak_ptr delegate VRAgentsObserver::~VRAgentsObserver() { } -void VRAgentsObserver::OnDefaultVoiceAgentChanged(shared_ptr defaultVoiceAgent) { +void VRAgentsObserver::OnDefaultVoiceAgentChanged(shared_ptr defaultVoiceAgent) { if (auto delegate = mWeakDelegate.lock()) { delegate->setDefaultVoiceAgent(defaultVoiceAgent); } } -void VRAgentsObserver::OnVoiceAgentAdded(shared_ptr voiceAgent) { +void VRAgentsObserver::OnVoiceAgentAdded(shared_ptr voiceAgent) { } -void VRAgentsObserver::OnVoiceAgentRemoved(shared_ptr voiceAgent) { +void VRAgentsObserver::OnVoiceAgentRemoved(shared_ptr voiceAgent) { } -void VRAgentsObserver::OnVoiceAgentActiveWakeWordChanged(shared_ptr voiceAgent) { +void VRAgentsObserver::OnVoiceAgentActiveWakeWordChanged(shared_ptr voiceAgent) { // Not Implemented } -void VRAgentsObserver::OnVoiceAgentActivated(shared_ptr voiceAgent) { +void VRAgentsObserver::OnVoiceAgentActivated(shared_ptr voiceAgent) { } -void VRAgentsObserver::OnVoiceAgentDeactivated(shared_ptr voiceAgent) { +void VRAgentsObserver::OnVoiceAgentDeactivated(shared_ptr voiceAgent) { } } // namespace core } // namespace vshl diff --git a/src/plugins/core/src/VRRequestImpl.cpp b/src/plugins/core/src/VRRequestImpl.cpp index 00adf96..63302d8 100644 --- a/src/plugins/core/src/VRRequestImpl.cpp +++ b/src/plugins/core/src/VRRequestImpl.cpp @@ -24,21 +24,20 @@ break; \ } -static string TAG = "vshl::core::VRRequest"; +static string TAG = "vshlcore::core::VRRequest"; -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +namespace vshlcore { namespace core { string VRRequest::VA_VERB_STARTLISTENING = "startListening"; string VRRequest::VA_VERB_CANCEL = "cancel"; unique_ptr VRRequest::create( - shared_ptr logger, - shared_ptr afbApi, + shared_ptr logger, + shared_ptr afbApi, const string requestId, - shared_ptr voiceAgent) { + shared_ptr voiceAgent) { if (logger == nullptr) { return nullptr; } @@ -53,10 +52,10 @@ unique_ptr VRRequest::create( } VRRequest::VRRequest( - shared_ptr logger, - shared_ptr afbApi, + shared_ptr logger, + shared_ptr afbApi, string requestId, - shared_ptr voiceAgent) : + shared_ptr voiceAgent) : mApi(afbApi), mRequestId(requestId), mVoiceAgent(voiceAgent), diff --git a/src/plugins/core/src/VRRequestProcessorDelegateImpl.cpp b/src/plugins/core/src/VRRequestProcessorDelegateImpl.cpp index e20b22e..78ef10a 100644 --- a/src/plugins/core/src/VRRequestProcessorDelegateImpl.cpp +++ b/src/plugins/core/src/VRRequestProcessorDelegateImpl.cpp @@ -14,22 +14,21 @@ */ #include "core/include/VRRequestProcessorDelegate.h" -static string TAG = "vshl::core::VRRequestProcessorDelegate"; +static string TAG = "vshlcore::core::VRRequestProcessorDelegate"; -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +namespace vshlcore { namespace core { shared_ptr VRRequestProcessorDelegate::create( - shared_ptr logger, - shared_ptr afbApi) { + shared_ptr logger, + shared_ptr afbApi) { auto delegate = std::shared_ptr(new VRRequestProcessorDelegate(logger, afbApi)); return delegate; } VRRequestProcessorDelegate::VRRequestProcessorDelegate( - shared_ptr logger, - shared_ptr afbApi) : + shared_ptr logger, + shared_ptr afbApi) : mApi(afbApi), mLogger(logger) { } @@ -39,14 +38,14 @@ VRRequestProcessorDelegate::~VRRequestProcessorDelegate() { } string VRRequestProcessorDelegate::startRequestForVoiceAgent( - shared_ptr voiceAgent) { + shared_ptr voiceAgent) { if (!mApi) { mLogger->log(Level::ERROR, TAG, "Failed to startRequestForVoiceAgent: " + voiceAgent->getId() + ", No API."); return ""; } // Generate a new request ID. - string newReqId = vshl::utilities::uuid::generateUUID(); + string newReqId = vshlcore::utilities::uuid::generateUUID(); // Create a new request and start listening. shared_ptr newRequest = VRRequest::create(mLogger, mApi, newReqId, voiceAgent); @@ -81,11 +80,11 @@ unordered_map> VRRequestProcessorDelegate::getAllR return mVRRequests; } -void VRRequestProcessorDelegate::setDefaultVoiceAgent(shared_ptr voiceAgent) { +void VRRequestProcessorDelegate::setDefaultVoiceAgent(shared_ptr voiceAgent) { mDefaultVoiceAgent = voiceAgent; } -shared_ptr VRRequestProcessorDelegate::getDefaultVoiceAgent() const { +shared_ptr VRRequestProcessorDelegate::getDefaultVoiceAgent() const { return mDefaultVoiceAgent; } diff --git a/src/plugins/core/test/VRRequestProcessorTest.cpp b/src/plugins/core/test/VRRequestProcessorTest.cpp index c1a37df..caa62b8 100644 --- a/src/plugins/core/test/VRRequestProcessorTest.cpp +++ b/src/plugins/core/test/VRRequestProcessorTest.cpp @@ -22,11 +22,10 @@ #include "test/common/ConsoleLogger.h" #include "test/mocks/AFBApiMock.h" -using namespace vshl::core; -using namespace vshl::voiceagents; -using namespace vshl::test::common; - -namespace vshl { +using namespace vshlcore::core; +using namespace vshlcore::voiceagents; +using namespace vshlcore::test::common; +namespace vshlcore { namespace test { class VRRequestProcessorTest : public ::testing::Test { diff --git a/src/plugins/core/test/VRRequestTest.cpp b/src/plugins/core/test/VRRequestTest.cpp index b1cd0a6..a7bb3db 100644 --- a/src/plugins/core/test/VRRequestTest.cpp +++ b/src/plugins/core/test/VRRequestTest.cpp @@ -22,11 +22,10 @@ #include "test/common/ConsoleLogger.h" #include "test/mocks/AFBApiMock.h" -using namespace vshl::core; -using namespace vshl::voiceagents; -using namespace vshl::test::common; - -namespace vshl { +using namespace vshlcore::core; +using namespace vshlcore::voiceagents; +using namespace vshlcore::test::common; +namespace vshlcore { namespace test { class VRRequestTest : public ::testing::Test { diff --git a/src/plugins/interfaces/afb/IAFBApi.h b/src/plugins/interfaces/afb/IAFBApi.h index cd98006..ba0de72 100644 --- a/src/plugins/interfaces/afb/IAFBApi.h +++ b/src/plugins/interfaces/afb/IAFBApi.h @@ -22,7 +22,7 @@ using namespace std; -namespace vshl { +namespace vshlcore { namespace common { namespace interfaces { diff --git a/src/plugins/interfaces/capabilities/ICapability.h b/src/plugins/interfaces/capabilities/ICapability.h deleted file mode 100644 index 4b134b7..0000000 --- a/src/plugins/interfaces/capabilities/ICapability.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ - -#ifndef VSHL_COMMON_INTERFACES_ICAPABILITY_H_ -#define VSHL_COMMON_INTERFACES_ICAPABILITY_H_ - -#include -#include - -using namespace std; - -namespace vshl { -namespace common { -namespace interfaces { - -/* - * This interface defines the structure for a specific voiceagent capability. - */ -class ICapability { -public: - /* - * Returns the capability's name. - */ - virtual string getName() const = 0; - - /* - * Returns the list of upstream messages. - */ - virtual list getUpstreamMessages() const = 0; - - /* - * Returns the list of downstream messages - */ - virtual list getDownstreamMessages() const = 0; - - /** - * Virtual destructor to assure proper cleanup of derived types. - */ - virtual ~ICapability() = default; -}; - -} // namespace interfaces -} // namespace common -} // namespace vshl - -#endif // VSHL_COMMON_INTERFACES_ICAPABILITY_H_ diff --git a/src/plugins/interfaces/utilities/events/IEventFilter.h b/src/plugins/interfaces/utilities/events/IEventFilter.h index 33d8202..3d99c87 100644 --- a/src/plugins/interfaces/utilities/events/IEventFilter.h +++ b/src/plugins/interfaces/utilities/events/IEventFilter.h @@ -18,8 +18,7 @@ #include using namespace std; - -namespace vshl { +namespace vshlcore { namespace common { namespace interfaces { /* diff --git a/src/plugins/interfaces/utilities/logging/ILogger.h b/src/plugins/interfaces/utilities/logging/ILogger.h index a2618bc..d8ae358 100644 --- a/src/plugins/interfaces/utilities/logging/ILogger.h +++ b/src/plugins/interfaces/utilities/logging/ILogger.h @@ -16,8 +16,7 @@ #define VSHL_COMMON_INTERFACES_LOGGER_H_ #include - -namespace vshl { +namespace vshlcore { namespace common { namespace interfaces { diff --git a/src/plugins/interfaces/voiceagents/IVoiceAgent.h b/src/plugins/interfaces/voiceagents/IVoiceAgent.h index 367ad72..6585c2b 100644 --- a/src/plugins/interfaces/voiceagents/IVoiceAgent.h +++ b/src/plugins/interfaces/voiceagents/IVoiceAgent.h @@ -21,8 +21,7 @@ #include using namespace std; - -namespace vshl { +namespace vshlcore { namespace common { namespace interfaces { diff --git a/src/plugins/interfaces/voiceagents/IVoiceAgentsChangeObserver.h b/src/plugins/interfaces/voiceagents/IVoiceAgentsChangeObserver.h index e552ab5..8697d51 100644 --- a/src/plugins/interfaces/voiceagents/IVoiceAgentsChangeObserver.h +++ b/src/plugins/interfaces/voiceagents/IVoiceAgentsChangeObserver.h @@ -22,8 +22,7 @@ #include "interfaces/voiceagents/IVoiceAgent.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace common { namespace interfaces { diff --git a/src/plugins/test/common/ConsoleLogger.cpp b/src/plugins/test/common/ConsoleLogger.cpp index d4f9eef..d6735f4 100644 --- a/src/plugins/test/common/ConsoleLogger.cpp +++ b/src/plugins/test/common/ConsoleLogger.cpp @@ -16,8 +16,7 @@ #include #include "test/common/ConsoleLogger.h" - -namespace vshl { +namespace vshlcore { namespace test { namespace common { diff --git a/src/plugins/test/common/ConsoleLogger.h b/src/plugins/test/common/ConsoleLogger.h index 11bc0d8..916b48f 100644 --- a/src/plugins/test/common/ConsoleLogger.h +++ b/src/plugins/test/common/ConsoleLogger.h @@ -18,12 +18,11 @@ #include "interfaces/utilities/logging/ILogger.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace test { namespace common { -class ConsoleLogger : public vshl::common::interfaces::ILogger { +class ConsoleLogger : public vshlcore::common::interfaces::ILogger { public: // ILogger interface void log(Level level, const std::string &tag, diff --git a/src/plugins/test/mocks/AFBApiMock.h b/src/plugins/test/mocks/AFBApiMock.h index 46e2e99..846468d 100644 --- a/src/plugins/test/mocks/AFBApiMock.h +++ b/src/plugins/test/mocks/AFBApiMock.h @@ -18,11 +18,10 @@ #include #include "interfaces/afb/IAFBApi.h" - -namespace vshl { +namespace vshlcore { namespace test { -class AFBApiMock : public vshl::common::interfaces::IAFBApi { +class AFBApiMock : public vshlcore::common::interfaces::IAFBApi { public: MOCK_METHOD1(createEvent, std::shared_ptr(const std::string& eventName)); MOCK_METHOD6( diff --git a/src/plugins/test/mocks/AFBEventMock.h b/src/plugins/test/mocks/AFBEventMock.h index 3d78e9f..0e47029 100644 --- a/src/plugins/test/mocks/AFBEventMock.h +++ b/src/plugins/test/mocks/AFBEventMock.h @@ -18,11 +18,10 @@ #include #include "interfaces/afb/IAFBApi.h" - -namespace vshl { +namespace vshlcore { namespace test { -class AFBEventMock : public vshl::common::interfaces::IAFBApi::IAFBEvent { +class AFBEventMock : public vshlcore::common::interfaces::IAFBApi::IAFBEvent { public: void setName(const std::string& name) { mName = name; @@ -34,8 +33,8 @@ public: MOCK_METHOD0(isValid, bool()); MOCK_METHOD1(publishEvent, int(struct json_object* payload)); - MOCK_METHOD1(subscribe, bool(vshl::common::interfaces::IAFBRequest& request)); - MOCK_METHOD1(unsubscribe, bool(vshl::common::interfaces::IAFBRequest& request)); + MOCK_METHOD1(subscribe, bool(vshlcore::common::interfaces::IAFBRequest& request)); + MOCK_METHOD1(unsubscribe, bool(vshlcore::common::interfaces::IAFBRequest& request)); private: std::string mName; diff --git a/src/plugins/test/mocks/AFBRequestMock.h b/src/plugins/test/mocks/AFBRequestMock.h index 5557565..02cc34e 100644 --- a/src/plugins/test/mocks/AFBRequestMock.h +++ b/src/plugins/test/mocks/AFBRequestMock.h @@ -18,11 +18,10 @@ #include #include "interfaces/afb/IAFBApi.h" - -namespace vshl { +namespace vshlcore { namespace test { -class AFBRequestMock : public vshl::common::interfaces::IAFBRequest { +class AFBRequestMock : public vshlcore::common::interfaces::IAFBRequest { public: MOCK_METHOD0(getNativeRequest, void*()); }; diff --git a/src/plugins/test/mocks/CapabilityMock.h b/src/plugins/test/mocks/CapabilityMock.h deleted file mode 100644 index a2201df..0000000 --- a/src/plugins/test/mocks/CapabilityMock.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0/ - * - * or in the "license" file accompanying this file. This file 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. - */ -#ifndef VSHL_TEST_MOCKS_CAPABILITYMOCK_H_ -#define VSHL_TEST_MOCKS_CAPABILITYMOCK_H_ - -#include - -#include "interfaces/capabilities/ICapability.h" - -namespace vshl { -namespace test { - -class CapabilityMock : public vshl::common::interfaces::ICapability { -public: - MOCK_CONST_METHOD0(getName, std::string()); - MOCK_CONST_METHOD0(getUpstreamMessages, std::list()); - MOCK_CONST_METHOD0(getDownstreamMessages, std::list()); -}; - -} // namespace test -} // namespace vshl - -#endif // VSHL_TEST_MOCKS_CAPABILITYMOCK_H_ \ No newline at end of file diff --git a/src/plugins/test/mocks/VoiceAgentsChangeObserverMock.h b/src/plugins/test/mocks/VoiceAgentsChangeObserverMock.h index 6edeea2..5935ab6 100644 --- a/src/plugins/test/mocks/VoiceAgentsChangeObserverMock.h +++ b/src/plugins/test/mocks/VoiceAgentsChangeObserverMock.h @@ -18,18 +18,17 @@ #include #include "interfaces/voiceagents/IVoiceAgentsChangeObserver.h" - -namespace vshl { +namespace vshlcore { namespace test { -class VoiceAgentsChangeObserverMock : public vshl::common::interfaces::IVoiceAgentsChangeObserver { +class VoiceAgentsChangeObserverMock : public vshlcore::common::interfaces::IVoiceAgentsChangeObserver { public: - MOCK_METHOD1(OnDefaultVoiceAgentChanged, void(shared_ptr defaultVoiceAgent)); - MOCK_METHOD1(OnVoiceAgentAdded, void(shared_ptr voiceAgent)); - MOCK_METHOD1(OnVoiceAgentRemoved, void(shared_ptr voiceAgent)); - MOCK_METHOD1(OnVoiceAgentActiveWakeWordChanged, void(shared_ptr voiceAgent)); - MOCK_METHOD1(OnVoiceAgentActivated, void(shared_ptr voiceAgent)); - MOCK_METHOD1(OnVoiceAgentDeactivated, void(shared_ptr voiceAgent)); + MOCK_METHOD1(OnDefaultVoiceAgentChanged, void(shared_ptr defaultVoiceAgent)); + MOCK_METHOD1(OnVoiceAgentAdded, void(shared_ptr voiceAgent)); + MOCK_METHOD1(OnVoiceAgentRemoved, void(shared_ptr voiceAgent)); + MOCK_METHOD1(OnVoiceAgentActiveWakeWordChanged, void(shared_ptr voiceAgent)); + MOCK_METHOD1(OnVoiceAgentActivated, void(shared_ptr voiceAgent)); + MOCK_METHOD1(OnVoiceAgentDeactivated, void(shared_ptr voiceAgent)); }; } // namespace test diff --git a/src/plugins/utilities/events/EventRouter.cpp b/src/plugins/utilities/events/EventRouter.cpp index 999c3dd..4564953 100644 --- a/src/plugins/utilities/events/EventRouter.cpp +++ b/src/plugins/utilities/events/EventRouter.cpp @@ -14,19 +14,18 @@ */ #include "utilities/events/EventRouter.h" -static string TAG = "vshl::utilities::events::EventRouter"; +static string TAG = "vshlcore::utilities::events::EventRouter"; -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +namespace vshlcore { namespace utilities { namespace events { -unique_ptr EventRouter::create(shared_ptr logger) { +unique_ptr EventRouter::create(shared_ptr logger) { return std::unique_ptr(new EventRouter(logger)); } -EventRouter::EventRouter(shared_ptr logger) : mLogger(logger) { +EventRouter::EventRouter(shared_ptr logger) : mLogger(logger) { } EventRouter::~EventRouter() { @@ -43,7 +42,7 @@ bool EventRouter::handleIncomingEvent(const string eventName, const string voice return false; } -bool EventRouter::addEventFilter(shared_ptr filter) { +bool EventRouter::addEventFilter(shared_ptr filter) { if (!filter) { mLogger->log(Level::ERROR, TAG, "Failed to add event filter. Invalid arguments."); return false; @@ -53,7 +52,7 @@ bool EventRouter::addEventFilter(shared_ptr filter) { +bool EventRouter::removeEventFilter(shared_ptr filter) { if (!filter) { mLogger->log(Level::ERROR, TAG, "Failed to add remove filter. Invalid arguments."); return false; diff --git a/src/plugins/utilities/events/EventRouter.h b/src/plugins/utilities/events/EventRouter.h index fd7f0c2..752973a 100644 --- a/src/plugins/utilities/events/EventRouter.h +++ b/src/plugins/utilities/events/EventRouter.h @@ -23,8 +23,7 @@ #include "interfaces/utilities/logging/ILogger.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace utilities { namespace events { /* @@ -34,29 +33,29 @@ namespace events { */ class EventRouter { public: - static unique_ptr create(shared_ptr logger); + static unique_ptr create(shared_ptr logger); // Destructor ~EventRouter(); // Add event filter as listerner. - bool addEventFilter(shared_ptr filter); + bool addEventFilter(shared_ptr filter); // Remove event filter as listerner. - bool removeEventFilter(shared_ptr filter); + bool removeEventFilter(shared_ptr filter); // This method is called by the controller for routing // the event to appropriate listener. bool handleIncomingEvent(const string eventName, const string voiceAgentId, const string payload); private: - EventRouter(shared_ptr logger); + EventRouter(shared_ptr logger); // set of event filters. - unordered_set> mEventFilters; + unordered_set> mEventFilters; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace events diff --git a/src/plugins/utilities/logging/Logger.cpp b/src/plugins/utilities/logging/Logger.cpp index 6374e19..b310695 100644 --- a/src/plugins/utilities/logging/Logger.cpp +++ b/src/plugins/utilities/logging/Logger.cpp @@ -13,8 +13,7 @@ * permissions and limitations under the License. */ #include "utilities/logging/Logger.h" - -namespace vshl { +namespace vshlcore { namespace utilities { namespace logging { diff --git a/src/plugins/utilities/logging/Logger.h b/src/plugins/utilities/logging/Logger.h index 79c89a5..d1d0196 100644 --- a/src/plugins/utilities/logging/Logger.h +++ b/src/plugins/utilities/logging/Logger.h @@ -26,12 +26,11 @@ extern "C" { #include "interfaces/utilities/logging/ILogger.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace utilities { namespace logging { -class Logger : public vshl::common::interfaces::ILogger { +class Logger : public vshlcore::common::interfaces::ILogger { public: static std::unique_ptr create(AFB_ApiT api); diff --git a/src/plugins/utilities/uuid/UUIDGeneration.cpp b/src/plugins/utilities/uuid/UUIDGeneration.cpp index bb03fc6..c006a0e 100644 --- a/src/plugins/utilities/uuid/UUIDGeneration.cpp +++ b/src/plugins/utilities/uuid/UUIDGeneration.cpp @@ -25,8 +25,7 @@ #include #include "utilities/uuid/UUIDGeneration.h" - -namespace vshl { +namespace vshlcore { namespace utilities { namespace uuid { diff --git a/src/plugins/utilities/uuid/UUIDGeneration.h b/src/plugins/utilities/uuid/UUIDGeneration.h index 7af9cb1..070c373 100644 --- a/src/plugins/utilities/uuid/UUIDGeneration.h +++ b/src/plugins/utilities/uuid/UUIDGeneration.h @@ -19,8 +19,7 @@ #define VSHL_UTILITIES_UUID_UUIDGENERATION_H_ #include - -namespace vshl { +namespace vshlcore { namespace utilities { namespace uuid { diff --git a/src/plugins/voiceagents/VoiceAgentEventNames.h b/src/plugins/voiceagents/VoiceAgentEventNames.h index 4575528..92cc8dc 100644 --- a/src/plugins/voiceagents/VoiceAgentEventNames.h +++ b/src/plugins/voiceagents/VoiceAgentEventNames.h @@ -19,8 +19,7 @@ #include using namespace std; - -namespace vshl { +namespace vshlcore { namespace voiceagents { static string VSHL_EVENT_AUTH_STATE_EVENT = "voice_authstate_event"; diff --git a/src/plugins/voiceagents/VoiceAgentsDataManager.h b/src/plugins/voiceagents/VoiceAgentsDataManager.h index a4c9143..a91d7eb 100644 --- a/src/plugins/voiceagents/VoiceAgentsDataManager.h +++ b/src/plugins/voiceagents/VoiceAgentsDataManager.h @@ -27,8 +27,7 @@ #include "interfaces/voiceagents/IVoiceAgentsChangeObserver.h" #include "voiceagents/include/VoiceAgent.h" #include "voiceagents/include/VoiceAgentEventsHandler.h" - -namespace vshl { +namespace vshlcore { namespace voiceagents { /* * This class implements the data model for voiceagents. @@ -39,8 +38,8 @@ class VoiceAgentsDataManager { public: // Create a VoiceAgentsDataManager. static std::unique_ptr create( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); /** * Activates the list of voiceagents. @@ -84,22 +83,22 @@ public: bool removeVoiceAgent(const string& voiceAgentId); // Returns the set of all voice agents in @c VoiceAgentsDataManger cache - std::set> getAllVoiceAgents(); + std::set> getAllVoiceAgents(); // Returns the event filter that belongs to the core module. - shared_ptr getEventFilter() const; + shared_ptr getEventFilter() const; // Subscribe to an event coming from the voiceagent. bool subscribeToVshlEventFromVoiceAgent( - vshl::common::interfaces::IAFBRequest& request, + vshlcore::common::interfaces::IAFBRequest& request, const string eventName, const string voiceagentId); // Adds a new voiceagent change observer. - bool addVoiceAgentsChangeObserver(shared_ptr observer); + bool addVoiceAgentsChangeObserver(shared_ptr observer); // Removes the voiceagent change observer from the list. - bool removeVoiceAgentsChangeObserver(shared_ptr observer); + bool removeVoiceAgentsChangeObserver(shared_ptr observer); // Destructor ~VoiceAgentsDataManager(); @@ -107,14 +106,17 @@ public: private: // Constructor VoiceAgentsDataManager( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); + + // Sets the voiceagent ID + bool sendVoiceAgentIdToVA(const shared_ptr& voiceAgent); // Binding API reference - shared_ptr mAfbApi; + shared_ptr mAfbApi; // A list of all the voiceagent change observers - unordered_set> mVoiceAgentChangeObservers; + unordered_set> mVoiceAgentChangeObservers; // A map of voiceagents grouped by ID unordered_map> mVoiceAgents; @@ -126,7 +128,9 @@ private: string mDefaultVoiceAgentId; // Logger - shared_ptr mLogger; + shared_ptr mLogger; + + bool mAlreadyPeformedSubscriptions; }; } // namespace voiceagents diff --git a/src/plugins/voiceagents/VoiceAgentsDataManagerImpl.cpp b/src/plugins/voiceagents/VoiceAgentsDataManagerImpl.cpp index 626a7fc..00f57e3 100644 --- a/src/plugins/voiceagents/VoiceAgentsDataManagerImpl.cpp +++ b/src/plugins/voiceagents/VoiceAgentsDataManagerImpl.cpp @@ -16,29 +16,30 @@ #include "voiceagents/include/VoiceAgentEventsHandler.h" -static string TAG = "vshl::voiceagents::VoiceAgentsDataManager"; +static string VA_VERB_SETVOICEAGENTID = "setVoiceAgentId"; +static string TAG = "vshlcore::voiceagents::VoiceAgentsDataManager"; /** * Specifies the severity level of a log message */ -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +namespace vshlcore { namespace voiceagents { std::unique_ptr VoiceAgentsDataManager::create( - shared_ptr logger, - shared_ptr afbApi) { + shared_ptr logger, + shared_ptr afbApi) { return std::unique_ptr(new VoiceAgentsDataManager(logger, afbApi)); } // Constructor VoiceAgentsDataManager::VoiceAgentsDataManager( - shared_ptr logger, - shared_ptr afbApi) : + shared_ptr logger, + shared_ptr afbApi) : mLogger(logger), mAfbApi(afbApi) { mVoiceAgentEventsHandler = VoiceAgentEventsHandler::create(mLogger, mAfbApi); + mAlreadyPeformedSubscriptions = false; } // Destructor @@ -178,6 +179,7 @@ bool VoiceAgentsDataManager::addNewVoiceAgent( } mVoiceAgents.insert(make_pair(voiceAgent->getId(), voiceAgent)); + sendVoiceAgentIdToVA(voiceAgent); // Notify the observers for (auto observer : mVoiceAgentChangeObservers) { @@ -218,8 +220,8 @@ bool VoiceAgentsDataManager::removeVoiceAgent(const string& voiceAgentId) { return true; } -std::set> VoiceAgentsDataManager::getAllVoiceAgents() { - std::set> voiceAgentsSet; +std::set> VoiceAgentsDataManager::getAllVoiceAgents() { + std::set> voiceAgentsSet; for (auto element : mVoiceAgents) { voiceAgentsSet.insert(element.second); } @@ -228,12 +230,12 @@ std::set> VoiceAgentsData } // Returns the event filter that belongs to the core module. -shared_ptr VoiceAgentsDataManager::getEventFilter() const { +shared_ptr VoiceAgentsDataManager::getEventFilter() const { return mVoiceAgentEventsHandler; } bool VoiceAgentsDataManager::subscribeToVshlEventFromVoiceAgent( - vshl::common::interfaces::IAFBRequest& request, + vshlcore::common::interfaces::IAFBRequest& request, const string eventName, const string voiceAgentId) { auto voiceAgentIt = mVoiceAgents.find(voiceAgentId); @@ -250,7 +252,7 @@ bool VoiceAgentsDataManager::subscribeToVshlEventFromVoiceAgent( } bool VoiceAgentsDataManager::addVoiceAgentsChangeObserver( - shared_ptr observer) { + shared_ptr observer) { if (!observer) { return false; } @@ -260,7 +262,7 @@ bool VoiceAgentsDataManager::addVoiceAgentsChangeObserver( } bool VoiceAgentsDataManager::removeVoiceAgentsChangeObserver( - shared_ptr observer) { + shared_ptr observer) { if (!observer) { return false; } @@ -268,5 +270,29 @@ bool VoiceAgentsDataManager::removeVoiceAgentsChangeObserver( mVoiceAgentChangeObservers.erase(observer); return true; } + +bool VoiceAgentsDataManager::sendVoiceAgentIdToVA(const shared_ptr& voiceAgent) { + if (!mAfbApi) { + mLogger->log( + Level::ERROR, TAG, "Failed to call sendVoiceAgentIdToVA on voicegent: " + voiceAgent->getId() + ", No API."); + return false; + } + + json_object* argsJ = json_object_new_object(); + json_object* idJ = json_object_new_string(voiceAgent->getId().c_str()); + json_object_object_add(argsJ, "va_id", idJ); + + std::string error, info; + json_object* resultJ; + + int rc = mAfbApi->callSync(voiceAgent->getApi(), VA_VERB_SETVOICEAGENTID, argsJ, &resultJ, error, info); + + if (resultJ) { + free(resultJ); + } + + return true; +} + } // namespace voiceagents } // namespace vshl diff --git a/src/plugins/voiceagents/include/VoiceAgent.h b/src/plugins/voiceagents/include/VoiceAgent.h index 4dd55d4..684baf0 100644 --- a/src/plugins/voiceagents/include/VoiceAgent.h +++ b/src/plugins/voiceagents/include/VoiceAgent.h @@ -22,17 +22,16 @@ #include "interfaces/voiceagents/IVoiceAgent.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace voiceagents { /* * Default implementation of IVoiceAgent interface. */ -class VoiceAgent : public vshl::common::interfaces::IVoiceAgent { +class VoiceAgent : public vshlcore::common::interfaces::IVoiceAgent { public: // Creates @c VoiceAgent instance static shared_ptr - create(shared_ptr logger, const string &id, + create(shared_ptr logger, const string &id, const string &name, const string &description, const string &api, const string &vendor, const string &activeWakeword, const bool isActive, @@ -55,14 +54,14 @@ public: private: // Constructor - VoiceAgent(shared_ptr logger, + VoiceAgent(shared_ptr logger, const string &id, const string &name, const string &description, const string &api, const string &vendor, const string &activeWakeword, const bool isActive, const shared_ptr> wakewords); // Logger - shared_ptr mLogger; + shared_ptr mLogger; // Id string mId; diff --git a/src/plugins/voiceagents/include/VoiceAgentEventsHandler.h b/src/plugins/voiceagents/include/VoiceAgentEventsHandler.h index 3c1ca6c..00acfe1 100644 --- a/src/plugins/voiceagents/include/VoiceAgentEventsHandler.h +++ b/src/plugins/voiceagents/include/VoiceAgentEventsHandler.h @@ -26,8 +26,7 @@ #include "voiceagents/include/VoiceAgent.h" using namespace std; - -namespace vshl { +namespace vshlcore { namespace voiceagents { /* * This class is reponsible for handling agent specific events @@ -35,12 +34,12 @@ namespace voiceagents { * This class also listen to the incoming events from voice agents * and implements propagation to application layer. */ -class VoiceAgentEventsHandler : public vshl::common::interfaces::IEventFilter { +class VoiceAgentEventsHandler : public vshlcore::common::interfaces::IEventFilter { public: // Create a VREventFilter. static shared_ptr create( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); // Creates all the vshl events for a specific voiceagent id. // For e.g if voiceagent is VA-001 then a new vshl event @@ -53,7 +52,7 @@ public: // Subscribe to a vshl event corresponding to a voiceagent. bool subscribeToVshlEventFromVoiceAgent( - vshl::common::interfaces::IAFBRequest& request, + vshlcore::common::interfaces::IAFBRequest& request, const string eventName, const shared_ptr voiceAgent); @@ -68,8 +67,8 @@ protected: private: // Constructor VoiceAgentEventsHandler( - shared_ptr logger, - shared_ptr afbApi); + shared_ptr logger, + shared_ptr afbApi); // Helper method to generate the event name with voiceagent Id // concatenated. @@ -80,13 +79,13 @@ private: bool callSubscribeVerb(const shared_ptr voiceAgent); // Binding API reference - shared_ptr mAfbApi; + shared_ptr mAfbApi; // A map of VSHL event ID to its Event object unordered_map> mEventsMap; // Logger - shared_ptr mLogger; + shared_ptr mLogger; }; } // namespace voiceagents diff --git a/src/plugins/voiceagents/src/VoiceAgentEventsHandler.cpp b/src/plugins/voiceagents/src/VoiceAgentEventsHandler.cpp index 4952721..3b55505 100644 --- a/src/plugins/voiceagents/src/VoiceAgentEventsHandler.cpp +++ b/src/plugins/voiceagents/src/VoiceAgentEventsHandler.cpp @@ -14,25 +14,24 @@ */ #include "voiceagents/include/VoiceAgentEventsHandler.h" -static string TAG = "vshl::voiceagents::VoiceAgentEventsHandler"; +static string TAG = "vshlcore::voiceagents::VoiceAgentEventsHandler"; static string VA_VERB_SUBSCRIBE = "subscribe"; -using Level = vshl::common::interfaces::ILogger::Level; -using namespace vshl::common::interfaces; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +using namespace vshlcore::common::interfaces; +namespace vshlcore { namespace voiceagents { shared_ptr VoiceAgentEventsHandler::create( - shared_ptr logger, - shared_ptr afbApi) { + shared_ptr logger, + shared_ptr afbApi) { auto eventFilter = std::shared_ptr(new VoiceAgentEventsHandler(logger, afbApi)); return eventFilter; } VoiceAgentEventsHandler::VoiceAgentEventsHandler( - shared_ptr logger, - shared_ptr afbApi) : + shared_ptr logger, + shared_ptr afbApi) : mAfbApi(afbApi), mLogger(logger) { } @@ -70,7 +69,7 @@ void VoiceAgentEventsHandler::removeVshlEventsForVoiceAgent(const string voiceAg } bool VoiceAgentEventsHandler::subscribeToVshlEventFromVoiceAgent( - vshl::common::interfaces::IAFBRequest& request, + vshlcore::common::interfaces::IAFBRequest& request, const string eventName, const shared_ptr voiceAgent) { auto supportedEventsIt = find(VSHL_EVENTS.begin(), VSHL_EVENTS.end(), eventName); diff --git a/src/plugins/voiceagents/src/VoiceAgentImpl.cpp b/src/plugins/voiceagents/src/VoiceAgentImpl.cpp index f2ef8a1..39a92c4 100644 --- a/src/plugins/voiceagents/src/VoiceAgentImpl.cpp +++ b/src/plugins/voiceagents/src/VoiceAgentImpl.cpp @@ -16,18 +16,17 @@ #include "voiceagents/include/VoiceAgent.h" -static string TAG = "vshl::voiceagents::VoiceAgent"; +static string TAG = "vshlcore::voiceagents::VoiceAgent"; /** * Specifies the severity level of a log message */ -using Level = vshl::common::interfaces::ILogger::Level; - -namespace vshl { +using Level = vshlcore::common::interfaces::ILogger::Level; +namespace vshlcore { namespace voiceagents { // Creates @c VoiceAgent instance shared_ptr VoiceAgent::create( - shared_ptr logger, + shared_ptr logger, const string& id, const string& name, const string& description, @@ -51,7 +50,7 @@ shared_ptr VoiceAgent::create( } VoiceAgent::VoiceAgent( - shared_ptr logger, + shared_ptr logger, const string& id, const string& name, const string& description, diff --git a/src/plugins/voiceagents/test/VoiceAgentTest.cpp b/src/plugins/voiceagents/test/VoiceAgentTest.cpp index e5ad15e..9730182 100644 --- a/src/plugins/voiceagents/test/VoiceAgentTest.cpp +++ b/src/plugins/voiceagents/test/VoiceAgentTest.cpp @@ -20,10 +20,9 @@ #include "voiceagents/test/VoiceAgentsTestData.h" #include "test/common/ConsoleLogger.h" -using namespace vshl::voiceagents; -using namespace vshl::test::common; - -namespace vshl { +using namespace vshlcore::voiceagents; +using namespace vshlcore::test::common; +namespace vshlcore { namespace test { class VoiceAgentTest : public ::testing::Test { diff --git a/src/plugins/voiceagents/test/VoiceAgentsDataManagerTest.cpp b/src/plugins/voiceagents/test/VoiceAgentsDataManagerTest.cpp index 58c62ed..9f63c73 100644 --- a/src/plugins/voiceagents/test/VoiceAgentsDataManagerTest.cpp +++ b/src/plugins/voiceagents/test/VoiceAgentsDataManagerTest.cpp @@ -22,12 +22,11 @@ #include "test/mocks/VoiceAgentsChangeObserverMock.h" #include "voiceagents/test/VoiceAgentsTestData.h" -using namespace vshl::common::interfaces; -using namespace vshl::voiceagents; +using namespace vshlcore::common::interfaces; +using namespace vshlcore::voiceagents; -using namespace vshl::test::common; - -namespace vshl { +using namespace vshlcore::test::common; +namespace vshlcore { namespace test { class VoiceAgentDataManagerTest : public ::testing::Test { diff --git a/src/plugins/voiceagents/test/VoiceAgentsTestData.h b/src/plugins/voiceagents/test/VoiceAgentsTestData.h index ced068f..104123b 100644 --- a/src/plugins/voiceagents/test/VoiceAgentsTestData.h +++ b/src/plugins/voiceagents/test/VoiceAgentsTestData.h @@ -17,8 +17,7 @@ #include #include #include - -namespace vshl { +namespace vshlcore { namespace test { typedef std::shared_ptr> WakeWords; -- cgit 1.2.3-korg