diff options
18 files changed, 218 insertions, 157 deletions
diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_helpers.h b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_helpers.h index 2473909ce5..c73472d2a8 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_helpers.h +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/include/rc_rpc_plugin/mock/mock_rc_helpers.h @@ -84,6 +84,10 @@ class MockRCHelpers { std::vector<bool>(const smart_objects::SmartObject& consents)); MOCK_METHOD1(RemoveRedundantGPSDataFromIVDataMsg, void(smart_objects::SmartObject& msg_params)); + MOCK_METHOD2( + MergeModuleData, + smart_objects::SmartObject(const smart_objects::SmartObject& data1, + const smart_objects::SmartObject& data2)); static MockRCHelpers* rc_helpers_mock(); }; diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/mock_rc_helpers.cc b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/mock_rc_helpers.cc index d5c8d09ae9..3e60591c6b 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/mock_rc_helpers.cc +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/mock_rc_helpers.cc @@ -34,6 +34,12 @@ namespace rc_rpc_plugin { +smart_objects::SmartObject RCHelpers::MergeModuleData( + const smart_objects::SmartObject& data1, + const smart_objects::SmartObject& data2) { + return MockRCHelpers::rc_helpers_mock()->MergeModuleData(data1, data2); +} + const std::function<std::string(const std::string&)> rc_rpc_plugin::RCHelpers::GetModuleTypeToDataMapping() { return MockRCHelpers::rc_helpers_mock()->GetModuleTypeToDataMapping(); diff --git a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/resource_allocation_manager/CMakeLists.txt b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/resource_allocation_manager/CMakeLists.txt index c665e98448..4b10d34643 100644 --- a/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/resource_allocation_manager/CMakeLists.txt +++ b/src/components/application_manager/rpc_plugins/rc_rpc_plugin/test/resource_allocation_manager/CMakeLists.txt @@ -54,7 +54,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/resource_allocation_manager_impl_test.cc set(RC_COMMANDS_TEST_SOURCE_DIR ${COMPONENTS_DIR}/application_manager/rpc_plugins/rc_rpc_plugin/test/commands) set(RC_COMMANDS_SOURCE_DIR ${COMPONENTS_DIR}/application_manager/rpc_plugins/rc_rpc_plugin/src/commands) -collect_sources(COMMANDS_SOURCES "${RC_COMMANDS_TEST_DIR}" "${RC_COMMANDS_TEST_SOURCE_DIR}") +collect_sources(COMMANDS_SOURCES "${RC_COMMANDS_SOURCE_DIR}" "${RC_COMMANDS_TEST_SOURCE_DIR}") set(LIBRARIES ApplicationManager @@ -77,5 +77,7 @@ if(ENABLE_LOG) list(APPEND LIBRARIES expat -L${EXPAT_LIBS_DIRECTORY}) endif() -create_test("resource_allocation_manager_test" "${COMMANDS_SOURCES}" "${LIBRARIES}" "${RESOURCE_ALLOC_MANAGER_TEST_SOURCES}") +list(APPEND COMMANDS_SOURCES ${RESOURCE_ALLOC_MANAGER_TEST_SOURCES}) + +create_test("resource_allocation_manager_test" "${COMMANDS_SOURCES}" "${LIBRARIES}") diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_alert_request.cc index bf449db808..793e70d9e1 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_alert_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_alert_request.cc @@ -47,7 +47,11 @@ UIAlertRequest::UIAlertRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) {} + policy_handle) { + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::duration].asUInt(); + default_timeout_ += request_timeout; +} UIAlertRequest::~UIAlertRequest() {} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_perform_interaction_request.cc index aa5878590b..a07c72cbf4 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_perform_interaction_request.cc @@ -47,7 +47,11 @@ UIPerformInteractionRequest::UIPerformInteractionRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) {} + policy_handle) { + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::timeout].asUInt(); + default_timeout_ += request_timeout; +} UIPerformInteractionRequest::~UIPerformInteractionRequest() {} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_scrollable_message_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_scrollable_message_request.cc index de639420fb..cad68e23aa 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_scrollable_message_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_scrollable_message_request.cc @@ -47,7 +47,11 @@ UIScrollableMessageRequest::UIScrollableMessageRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) {} + policy_handle) { + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::timeout].asUInt(); + default_timeout_ += request_timeout; +} UIScrollableMessageRequest::~UIScrollableMessageRequest() {} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_slider_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_slider_request.cc index 56fca3d062..eae8cc523c 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_slider_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/ui_slider_request.cc @@ -47,7 +47,11 @@ UISliderRequest::UISliderRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) {} + policy_handle) { + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::timeout].asUInt(); + default_timeout_ += request_timeout; +} UISliderRequest::~UISliderRequest() {} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_perform_interaction_request.cc index ae94019b25..4257158f6a 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/hmi/vr_perform_interaction_request.cc @@ -47,7 +47,11 @@ VRPerformInteractionRequest::VRPerformInteractionRequest( application_manager, rpc_service, hmi_capabilities, - policy_handle) {} + policy_handle) { + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::timeout].asUInt(); + default_timeout_ += request_timeout; +} VRPerformInteractionRequest::~VRPerformInteractionRequest() {} diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc index 7a0fd79b08..57912e7087 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/alert_request.cc @@ -73,18 +73,15 @@ AlertRequest::~AlertRequest() {} bool AlertRequest::Init() { /* Timeout in milliseconds. - If omitted a standard value of 10000 milliseconds is used.*/ - if ((*message_)[strings::msg_params].keyExists(strings::duration)) { - default_timeout_ = - (*message_)[strings::msg_params][strings::duration].asUInt(); - } else { - const int32_t def_value = 5000; - default_timeout_ = def_value; - } + If omitted a standard value of 10000 milliseconds is used.*/ + auto& msg_params = (*message_)[strings::msg_params]; + uint32_t duration_timeout = msg_params[strings::duration].asUInt(); + + default_timeout_ += duration_timeout; // If soft buttons are present, SDL will not use initiate timeout tracking for // response. - if ((*message_)[strings::msg_params].keyExists(strings::soft_buttons)) { + if (msg_params.keyExists(strings::soft_buttons)) { LOG4CXX_INFO(logger_, "Request contains soft buttons - request timeout " "will be set to 0."); @@ -355,6 +352,10 @@ void AlertRequest::SendAlertRequest(int32_t app_id) { (*message_)[strings::msg_params][strings::soft_buttons]; MessageHelper::SubscribeApplicationToSoftButton( (*message_)[strings::msg_params], app, function_id()); + msg_params[strings::duration] = 0; + } else { + msg_params[strings::duration] = + (*message_)[strings::msg_params][strings::duration].asUInt(); } if ((*message_)[strings::msg_params].keyExists(strings::alert_icon)) { @@ -375,7 +376,6 @@ void AlertRequest::SendAlertRequest(int32_t app_id) { // app_id msg_params[strings::app_id] = app_id; - msg_params[strings::duration] = default_timeout_; // NAVI platform progressIndicator if ((*message_)[strings::msg_params].keyExists(strings::progress_indicator)) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_window_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_window_request.cc index 21b54b4e9f..b69b0ee801 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_window_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/create_window_request.cc @@ -307,7 +307,10 @@ bool CreateWindowRequest::DoesExceedMaxAllowedWindows( const auto window_type = static_cast<mobile_apis::WindowType::eType>( (*message_)[strings::msg_params][strings::window_type].asInt()); - const auto display_capabilities = app->display_capabilities(); + auto display_capabilities = hmi_capabilities_.system_display_capabilities(); + if (app->display_capabilities()) { + display_capabilities = app->display_capabilities(); + } if (!display_capabilities) { LOG4CXX_WARN(logger_, "Application has no capabilities"); @@ -333,7 +336,10 @@ bool CreateWindowRequest::DoesExceedMaxAllowedWindows( return false; }); - DCHECK(find_res != windowTypeSupported->end()); + if (find_res == windowTypeSupported->end()) { + LOG4CXX_WARN(logger_, "Requested Window Type is not supported by the HMI"); + return true; + } if (get_current_number_of_windows(window_type) + 1 > (*find_res)[strings::maximum_number_of_windows].asUInt()) { diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc index cc109afcf0..622f64f792 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/perform_interaction_request.cc @@ -82,17 +82,18 @@ PerformInteractionRequest::~PerformInteractionRequest() {} bool PerformInteractionRequest::Init() { /* Timeout in milliseconds. If omitted a standard value of 10000 milliseconds is used.*/ - if ((*message_)[strings::msg_params].keyExists(strings::timeout)) { - default_timeout_ = - (*message_)[strings::msg_params][strings::timeout].asUInt(); - } + const auto& msg_params = (*message_)[strings::msg_params]; + uint32_t request_timeout = msg_params[strings::timeout].asUInt(); interaction_mode_ = static_cast<mobile_apis::InteractionMode::eType>( - (*message_)[strings::msg_params][strings::interaction_mode].asInt()); + msg_params[strings::interaction_mode].asInt()); if (mobile_apis::InteractionMode::BOTH == interaction_mode_ || mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) { - default_timeout_ *= 2; + const uint32_t increase_value = 2; + default_timeout_ += request_timeout * increase_value; + } else { + default_timeout_ += request_timeout; } return true; } @@ -284,7 +285,7 @@ void PerformInteractionRequest::onTimeOut() { CommandRequestImpl::onTimeOut(); } else { application_manager_.updateRequestTimeout( - connection_key(), correlation_id(), default_timeout()); + connection_key(), correlation_id(), default_timeout_); } break; } @@ -341,7 +342,7 @@ bool PerformInteractionRequest::ProcessVRResponse( } LOG4CXX_DEBUG(logger_, "Update timeout for UI"); application_manager_.updateRequestTimeout( - connection_key(), correlation_id(), default_timeout()); + connection_key(), correlation_id(), default_timeout_); return false; } @@ -358,6 +359,13 @@ bool PerformInteractionRequest::ProcessVRResponse( msg_params[strings::choice_id] = choice_id; } + if (mobile_apis::InteractionMode::BOTH == interaction_mode_ || + mobile_apis::InteractionMode::MANUAL_ONLY == interaction_mode_) { + LOG4CXX_DEBUG(logger_, "Update timeout for UI"); + application_manager_.updateRequestTimeout( + connection_key(), correlation_id(), default_timeout_); + } + const bool is_vr_result_success = Compare<Common_Result::eType, EQ, ONE>( vr_result_code_, Common_Result::SUCCESS, Common_Result::WARNINGS); @@ -476,12 +484,8 @@ void PerformInteractionRequest::SendUIPerformInteractionRequest( } } - if (mobile_apis::InteractionMode::BOTH == mode || - mobile_apis::InteractionMode::MANUAL_ONLY == mode) { - msg_params[strings::timeout] = default_timeout_ / 2; - } else { - msg_params[strings::timeout] = default_timeout_; - } + msg_params[strings::timeout] = + (*message_)[strings::msg_params][strings::timeout].asUInt(); msg_params[strings::app_id] = app->app_id(); if (mobile_apis::InteractionMode::VR_ONLY != mode) { msg_params[strings::choice_set] = @@ -662,16 +666,9 @@ void PerformInteractionRequest::SendVRPerformInteractionRequest( return; } - mobile_apis::InteractionMode::eType mode = - static_cast<mobile_apis::InteractionMode::eType>( - (*message_)[strings::msg_params][strings::interaction_mode].asInt()); - - if (mobile_apis::InteractionMode::BOTH == mode || - mobile_apis::InteractionMode::MANUAL_ONLY == mode) { - msg_params[strings::timeout] = default_timeout_ / 2; - } else { - msg_params[strings::timeout] = default_timeout_; - } + msg_params[strings::timeout] = + (*message_)[strings::msg_params][strings::timeout].asUInt(); + ; msg_params[strings::app_id] = app->app_id(); StartAwaitForInterface(HmiInterfaces::HMI_INTERFACE_VR); SendHMIRequest( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_request.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_request.cc index 5bef1d56fc..90dbb91b5f 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_request.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/src/commands/mobile/scrollable_message_request.cc @@ -65,13 +65,9 @@ ScrollableMessageRequest::~ScrollableMessageRequest() {} bool ScrollableMessageRequest::Init() { /* Timeout in milliseconds. If omitted a standard value of 10000 milliseconds is used.*/ - if ((*message_)[strings::msg_params].keyExists(strings::timeout)) { - default_timeout_ = - (*message_)[strings::msg_params][strings::timeout].asUInt(); - } else { - const int32_t def_value = 30000; - default_timeout_ = def_value; - } + uint32_t request_timeout = + (*message_)[strings::msg_params][strings::timeout].asUInt(); + default_timeout_ += request_timeout; return true; } @@ -110,7 +106,8 @@ void ScrollableMessageRequest::Run() { msg_params[hmi_request::message_text][hmi_request::field_text] = (*message_)[strings::msg_params][strings::scroll_message_body]; msg_params[strings::app_id] = app->app_id(); - msg_params[strings::timeout] = default_timeout_; + msg_params[strings::timeout] = + (*message_)[strings::msg_params][strings::timeout].asUInt(); if ((*message_)[strings::msg_params].keyExists(strings::cancel_id)) { msg_params[strings::cancel_id] = diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_window_request_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_window_request_test.cc index 02a6591a2d..905c6ceb72 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_window_request_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/create_window_request_test.cc @@ -164,6 +164,9 @@ class CreateWindowRequestTest ON_CALL(*mock_app_, display_capabilities()) .WillByDefault(Return(display_capabilities_)); + ON_CALL(mock_hmi_capabilities_, system_display_capabilities()) + .WillByDefault(Return(display_capabilities_)); + window_params_map_lock_ptr_ = std::make_shared<sync_primitives::Lock>(); DataAccessor<am::WindowParamsMap> window_params_map( diff --git a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/scrollable_message_test.cc b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/scrollable_message_test.cc index 3820112ea5..6b17aa238d 100644 --- a/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/scrollable_message_test.cc +++ b/src/components/application_manager/rpc_plugins/sdl_rpc_plugin/test/commands/mobile/scrollable_message_test.cc @@ -175,7 +175,7 @@ TEST_F(ScrollableMessageRequestTest, Init_CorrectTimeout_SUCCESS) { mobile_apis::InteractionMode::MANUAL_ONLY; EXPECT_EQ(kDefaultTimeout_, command_->default_timeout()); command_->Init(); - EXPECT_EQ(kTimeOut, command_->default_timeout()); + EXPECT_EQ(kTimeOut + kDefaultTimeout_, command_->default_timeout()); } TEST_F(ScrollableMessageRequestTest, Init_CorrectTimeout_UNSUCCESS) { @@ -183,7 +183,7 @@ TEST_F(ScrollableMessageRequestTest, Init_CorrectTimeout_UNSUCCESS) { mobile_apis::InteractionMode::MANUAL_ONLY; EXPECT_EQ(kDefaultTimeout_, command_->default_timeout()); command_->Init(); - EXPECT_EQ(kTimeOut, command_->default_timeout()); + EXPECT_EQ(kDefaultTimeout_, command_->default_timeout()); } TEST_F(ScrollableMessageRequestTest, Run_ApplicationIsNotRegistered_UNSUCCESS) { diff --git a/src/components/interfaces/HMI_API.xml b/src/components/interfaces/HMI_API.xml index 8407d4aea4..9b385c97cd 100644 --- a/src/components/interfaces/HMI_API.xml +++ b/src/components/interfaces/HMI_API.xml @@ -611,12 +611,6 @@ <element name="menuTitle"> <description> Optional text to label an app menu button (for certain touchscreen platforms).</description> </element> - <element name="navigationText"> - <description>Navigation text for UpdateTurnList.</description> - </element> - <element name="notificationText"> - <description>Text of notification to be displayed on screen.</description> - </element> <element name="locationName"> <description> Optional name / title of intended location for SendLocation.</description> </element> @@ -632,6 +626,12 @@ <element name="timeToDestination"/> <!-- TO DO to be removed --> <element name="turnText"/> + <element name="navigationText"> + <description>Navigation text for UpdateTurnList.</description> + </element> + <element name="notificationText"> + <description>Text of notification to be displayed on screen.</description> + </element> </enum> <enum name="MetadataType"> @@ -4086,8 +4086,8 @@ <element name="VIDEO_STREAMING"/> <element name="REMOTE_CONTROL"/> <element name="APP_SERVICES" /> - <element name="DISPLAYS"/> <element name="SEAT_LOCATION"/> + <element name="DISPLAYS"/> </enum> <struct name="SystemCapability"> diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index 8927a46ffc..3ab704ddb0 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -139,7 +139,7 @@ <description>The data sent failed to pass CRC check in receiver end</description> </element> <element name="ENCRYPTION_NEEDED" since="6.0"> - <description>SDL receives an un-encrypted PRC request that needs protection. </description> + <description>SDL receives an un-encrypted RPC request that needs protection. </description> </element> </enum> @@ -923,7 +923,7 @@ </element> <element name="alertIcon" since="6.0"> - <description>The image field for Alert</description>> + <description>The image field for Alert</description> </element> </enum> @@ -1699,9 +1699,6 @@ </param> </struct> - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ --> - <!-- Ford Specific Data Items --> - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~ --> <enum name="FileType" since="2.0"> <description>Enumeration listing possible file types.</description> <element name="GRAPHIC_BMP" /> @@ -1890,10 +1887,6 @@ </param> </struct> - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ --> - <!-- / Ford Specific Data Items --> - <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~ --> - <enum name="VehicleDataResultCode" since="2.0"> <description>Enumeration that describes possible result codes of a vehicle data entry request.</description> <element name="SUCCESS" internal_name="VDRC_SUCCESS"> @@ -1903,7 +1896,7 @@ <description>DTC / DID request successful, however, not all active DTCs or full contents of DID location available</description> </element> <element name="DISALLOWED" internal_name="VDRC_DISALLOWED"> - <description>This vehicle data item is not allowed for this app by Ford.</description> + <description>This vehicle data item is not allowed for this app by the OEM/Manufactorer of the connected module.</description> </element> <element name="USER_DISALLOWED" internal_name="VDRC_USER_DISALLOWED"> <description>The user has not granted access to this type of vehicle data item at this time.</description> @@ -2253,7 +2246,7 @@ <history> <struct name="DisplayCapabilities" since="1.0" until="6.0"/> </history> - <description>Contains information about the display capabilities.</description> + <description>Contains information about the display capabilities. This struct is deprecated; please see the new SystemCapability DISPLAYS and corresponding struct DisplayCapability </description> <param name="displayType" type="DisplayType" mandatory="true" deprecated="true" since="5.0"> <description>The type of the display. See DisplayType</description> <history> @@ -2286,7 +2279,7 @@ </param> <!-- TODO: Add pixel density? --> </struct> - + <struct name="Grid" since="6.0"> <description>Describes a location (origin coordinates and span) of a vehicle component.</description> <param name="col" type="Integer" mandatory="true" minvalue="-1" maxvalue="100"> @@ -2302,7 +2295,7 @@ <param name="levelspan" type="Integer" mandatory="false" defvalue="1" minvalue="1" maxvalue="100"> </param> </struct> - + <struct name="ModuleInfo" since="6.0"> <description>Information about a RC module</description> <param name="moduleId" type="String" maxlength="100" mandatory="true"> @@ -2318,7 +2311,7 @@ <description>allow multiple users/apps to access the module or not </description> </param> </struct> - + <struct name="ButtonCapabilities" since="1.0"> <description>Contains information about a button's capabilities.</description> <param name="name" type="ButtonName" mandatory="true"> @@ -2390,8 +2383,9 @@ <struct name="WindowCapability" since="6.0"> <param name="windowID" type="Integer" mandatory="false"> <description> - The specified ID of the window. Can be set to a predefined window, - or omitted for the main window on the main display. + The specified ID of the window. This ID is either one used when sending the CreateWindow request, + or one of the predefined window ID values from the enum PredefinedWindows. If ommited, value is + assumed to be the main window on the main display. </description> </param> <param name="textFields" type="TextField" minsize="1" maxsize="100" array="true" mandatory="false"> @@ -3030,8 +3024,8 @@ <element name="VIDEO_STREAMING"/> <element name="REMOTE_CONTROL"/> <element name="APP_SERVICES" since="5.1"/> - <element name="DISPLAYS" since="6.0"/> <element name="SEAT_LOCATION" since="6.0"/> + <element name="DISPLAYS" since="6.0"/> </enum> <struct name="NavigationCapability" since="4.5"> @@ -3076,13 +3070,13 @@ <description>True if the system can utilize the haptic spatial data from the source being streamed. If not included, it can be assumed the module doesn't support haptic spatial data'. </description> </param> <param name="diagonalScreenSize" type="Float" minvalue="0" mandatory="false" since="6.0"> - <description>The diagonal screen size in inches.</description> + <description>The diagonal screen size in inches.</description> </param> <param name="pixelPerInch" type="Float" minvalue="0" mandatory="false" since="6.0"> - <description>PPI is the diagonal resolution in pixels divided by the diagonal screen size in inches.</description> + <description>PPI is the diagonal resolution in pixels divided by the diagonal screen size in inches.</description> </param> <param name="scale" type="Float" minvalue="1" maxvalue="10" mandatory="false" since="6.0"> - <description>The scaling factor the app should use to change the size of the projecting view.</description> + <description>The scaling factor the app should use to change the size of the projecting view.</description> </param> </struct> @@ -3209,6 +3203,7 @@ <param name="id" type="SupportedSeat" mandatory="true" since="5.0" until="6.0"/> </history> </param> + <param name="heatingEnabled" type="Boolean" mandatory="false"></param> <param name="coolingEnabled" type="Boolean" mandatory="false"></param> <param name="heatingLevel" type="Integer" minvalue="0" maxvalue="100" mandatory="false"></param> @@ -3415,6 +3410,7 @@ <description>value false means disabled, value true means enabled.</description> </param> <param name="climateEnable" type="Boolean" mandatory="false" since="6.0"> + <description>True if the climate module is on, false if the climate module is off</description> </param> </struct> @@ -4435,10 +4431,10 @@ <param name="appServicesCapabilities" type="AppServicesCapabilities" mandatory="false" since="5.1"> <description>An array of currently available services. If this is an update to the capability the affected services will include an update reason in that item</description> </param> - <param name="displayCapabilities" type="DisplayCapability" array="true" minsize="1" maxsize="1000" mandatory="false" since="6.0"/> <param name="seatLocationCapability" type="SeatLocationCapability" mandatory="false" since="6.0"> <description>Contains information about the locations of each seat</description> </param> + <param name="displayCapabilities" type="DisplayCapability" array="true" minsize="1" maxsize="1000" mandatory="false" since="6.0"/> </struct> <!-- Requests/Responses --> @@ -4455,7 +4451,7 @@ <param name="appName" type="String" maxlength="100" mandatory="true" since="1.0"> <description> - The mobile application name, e.g. "Ford Drive Green". + The mobile application name, e.g. "My SDL App". Needs to be unique over all applications from the same device. May not be empty. May not start with a new line character. @@ -4467,7 +4463,7 @@ <param name="ttsName" type="TTSChunk" minsize="1" maxsize="100" array="true" mandatory="false" since="2.0"> <description> - TTS string for VR recognition of the mobile application name, e.g. "Ford Drive Green". + TTS string for VR recognition of the mobile application name, e.g. "My S D L App". Meant to overcome any failing on speech engine in properly pronouncing / understanding app name. Needs to be unique over all applications from the same device. May not be empty. @@ -4619,7 +4615,7 @@ <param name="presetBankCapabilities" type="PresetBankCapabilities" mandatory="false" deprecated="true" since="6.0"> <description> If returned, the platform supports custom on-screen Presets; see PresetBankCapabilities. - This parameter is deprecated and replaced by SystemCapability using DISPLAYS. + This parameter is deprecated and replaced by SystemCapability using DISPLAYS. </description> <history> <param name="presetBankCapabilities" type="PresetBankCapabilities" mandatory="false" since="2.0" until="6.0"/> @@ -4661,7 +4657,7 @@ </param> <param name="hmiCapabilities" type="HMICapabilities" mandatory="false" since="3.0"> - <description>Specifies the HMI’s capabilities. See HMICapabilities.</description> + <description>Specifies the HMI's capabilities. See HMICapabilities.</description> </param> <param name="sdlVersion" type="String" maxlength="100" mandatory="false" platform="documentation" since="3.0"> @@ -4817,7 +4813,6 @@ <param name="userLocation" type="SeatLocation" mandatory="false" since="6.0"> <description>Location of the user's seat. Default is driver's seat location if it is not set yet.</description> </param> - <param name="helpPrompt" type="TTSChunk" minsize="1" maxsize="100" array="true" mandatory="false" since="1.0"> <description> The help prompt. @@ -5105,18 +5100,22 @@ <function name="ShowAppMenu" functionID="ShowAppMenuID" messagetype="request" since="6.0"> <description>Shows the built in menu view</description> + <param name="menuID" type="Integer" minvalue="1" maxvalue="2000000000" mandatory="false"> <description> If omitted the HMI opens the app's menu. If set to a sub-menu ID the HMI opens the corresponding sub-menu previously added using `AddSubMenu`. </description> </param> + </function> <function name="ShowAppMenu" functionID="ShowAppMenuID" messagetype="response" since="6.0"> + <param name="success" type="Boolean" platform="documentation" mandatory="true"> <description> true if successful; false, if failed </description> </param> + <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> <element name="SUCCESS"/> @@ -5129,9 +5128,11 @@ <element name="INVALID_ID"/> <element name="IN_USE"/> </param> + <param name="info" type="String" maxlength="1000" mandatory="false" platform="documentation"> <description>Provides additional human readable info regarding the result.</description> </param> + </function> <function name="CreateInteractionChoiceSet" functionID="CreateInteractionChoiceSetID" messagetype="request" since="1.0"> @@ -5230,10 +5231,10 @@ <param name="cancelID" type="Integer" mandatory="false" since="6.0"> <description> - An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. + An ID for this specific PerformInteraction to allow cancellation through the `CancelInteraction` RPC. </description> </param> - + </function> <function name="PerformInteraction" functionID="PerformInteractionID" messagetype="response" since="1.0"> @@ -5373,7 +5374,7 @@ If omitted on supported displays, no (or the default if applicable) icon should be displayed. </description> </param> - + <param name="cancelID" type="Integer" mandatory="false" since="6.0"> <description> An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. @@ -5508,9 +5509,11 @@ </param> <param name="metadataTags" type="MetadataTags" mandatory="false" since="4.5"> - <description>App defined metadata information. See MetadataStruct. Uses mainField1, mainField2, mainField3, mainField4. + <description> + App defined metadata information. See MetadataStruct. Uses mainField1, mainField2, mainField3, mainField4. If omitted on supported displays, the currently set metadata tags will not change. - If any text field contains no tags or the none tag, the metadata tag for that textfield should be removed.</description> + If any text field contains no tags or the none tag, the metadata tag for that textfield should be removed. + </description> </param> <param name="templateTitle" type="String" minlength="0" maxlength="100" mandatory="false" since="6.0"> @@ -5519,7 +5522,6 @@ How this will be displayed is dependent on the OEM design and implementation of the template. </description> </param> - <param name="windowID" type="Integer" mandatory="false" since="6.0" > <description> This is the unique ID assigned to the window that this RPC is intended. If this param is not included, @@ -5890,8 +5892,6 @@ <param name="cloudAppVehicleID" type="Boolean" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="Boolean" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -5907,9 +5907,6 @@ <param name="myKey" type="Boolean" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - - <!-- / Ford Specific Data Items --> - </function> <function name="SubscribeVehicleData" functionID="SubscribeVehicleDataID" messagetype="response" since="2.0"> @@ -6008,8 +6005,6 @@ <param name="cloudAppVehicleID" type="VehicleDataResult" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="VehicleDataResult" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -6025,8 +6020,6 @@ <param name="myKey" type="VehicleDataResult" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Data Items --> - </function> <function name="UnsubscribeVehicleData" functionID="UnsubscribeVehicleDataID" messagetype="request" since="2.0"> @@ -6104,8 +6097,6 @@ <param name="cloudAppVehicleID" type="Boolean" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="Boolean" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -6121,8 +6112,6 @@ <param name="myKey" type="Boolean" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Data Items --> - </function> <function name="UnsubscribeVehicleData" functionID="UnsubscribeVehicleDataID" messagetype="response" since="2.0"> @@ -6220,8 +6209,6 @@ <param name="cloudAppVehicleID" type="VehicleDataResult" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="VehicleDataResult" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -6237,8 +6224,6 @@ <param name="myKey" type="VehicleDataResult" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Data Items --> - </function> <function name="GetVehicleData" functionID="GetVehicleDataID" messagetype="request" since="2.0"> @@ -6319,8 +6304,6 @@ <param name="cloudAppVehicleID" type="Boolean" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="Boolean" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -6336,8 +6319,6 @@ <param name="myKey" type="Boolean" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Data Items --> - </function> <function name="GetVehicleData" functionID="GetVehicleDataID" messagetype="response" since="2.0"> @@ -6439,8 +6420,6 @@ <param name="cloudAppVehicleID" type="String" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Data Items --> <param name="eCallInfo" type="ECallInfo" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -6456,8 +6435,6 @@ <param name="myKey" type="MyKey" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Data Items --> - </function> <function name="ReadDID" functionID="ReadDIDID" messagetype="request" since="2.0"> @@ -6615,13 +6592,11 @@ If omitted on supported displays, only the system defined "Close" SoftButton will be displayed. </description> </param> - <param name="cancelID" type="Integer" mandatory="false" since="6.0"> <description> - An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. + An ID for this specific ScrollableMessage to allow cancellation through the `CancelInteraction` RPC. </description> </param> - </function> <function name="ScrollableMessage" functionID="ScrollableMessageID" messagetype="response" since="2.0"> @@ -6678,7 +6653,7 @@ </param> <param name="cancelID" type="Integer" mandatory="false" since="6.0"> <description> - An ID for this specific alert to allow cancellation through the `CancelInteraction` RPC. + An ID for this specific Slider to allow cancellation through the `CancelInteraction` RPC. </description> </param> </function> @@ -7186,6 +7161,9 @@ </function> <function name="SetDisplayLayout" functionID="SetDisplayLayoutID" messagetype="request" deprecated="true" since="6.0"> + <history> + <function name="SetDisplayLayout" functionID="SetDisplayLayoutID" messagetype="request" since="3.0" until="6.0"/> + </history> <description>This RPC is deprecated. Use Show RPC to change layout.</description> <param name="displayLayout" type="String" maxlength="500" mandatory="true"> <description> @@ -7200,6 +7178,9 @@ </function> <function name="SetDisplayLayout" functionID="SetDisplayLayoutID" messagetype="response" deprecated="true" since="6.0"> + <history> + <function name="SetDisplayLayout" functionID="SetDisplayLayoutID" messagetype="response" since="3.0" until="6.0"/> + </history> <description>This RPC is deprecated. Use Show RPC to change layout.</description> <param name="success" type="Boolean" platform="documentation" mandatory="true"> <description> true, if successful; false, if failed </description> @@ -7285,6 +7266,10 @@ <element name="TIMED_OUT"/> <element name="IGNORED"/> </param> + + <param name="info" type="String" maxlength="1000" mandatory="false" platform="documentation"> + <description>Provides additional human readable info regarding the result.</description> + </param> </function> <function name="SendLocation" functionID="SendLocationID" messagetype="request" since="3.0"> @@ -7476,20 +7461,19 @@ </description> </param> </function> + <function name="GetInteriorVehicleDataConsent" functionID="GetInteriorVehicleDataConsentID" messagetype="request" since="6.0"> <param name="moduleType" type="ModuleType" mandatory="true"> - <description>The module type that the app requests to control.</description> + <description>The module type that the app requests to control.</description> </param> <param name="moduleIds" type="String" maxlength="100" array="true" mandatory="true"> - <description>Ids of a module of same type, published by System Capability. </description> + <description>Ids of a module of same type, published by System Capability. </description> </param> </function> - + <function name="GetInteriorVehicleDataConsent" functionID="GetInteriorVehicleDataConsentID" messagetype="response" since="6.0"> - <param name="allowed" type="Boolean" array="true" mandatory="false"> - <description>This array has the same size as "moduleIds" in the request; each element corresponding to one moduleId - "true" - if SDL grants the permission for the requested module; - "false" - SDL denies the permission for the requested module.</description> + <param name="success" type="Boolean" platform="documentation" mandatory="true"> + <description> true if successful; false, if failed </description> </param> <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> @@ -7507,11 +7491,15 @@ </param> <param name="info" type="String" maxlength="1000" mandatory="false"> </param> - <param name="success" type="Boolean" platform="documentation" mandatory="true"> - <description> true if successful; false, if failed </description> + <param name="allowed" type="Boolean" array="true" mandatory="false"> + <description> + This array has the same size as "moduleIds" in the request and each element corresponds to one moduleId + If true, SDL grants the permission for the requested module + If false, SDL denies the permission for the requested module. + </description> </param> </function> - + <function name="ReleaseInteriorVehicleDataModule" functionID="ReleaseInteriorVehicleDataModuleID" messagetype="request" since="6.0"> <param name="moduleType" type="ModuleType" mandatory="true"> </param> @@ -7519,8 +7507,11 @@ <description>Id of a module, published by System Capability. </description> </param> </function> - + <function name="ReleaseInteriorVehicleDataModule" functionID="ReleaseInteriorVehicleDataModuleID" messagetype="response" since="6.0"> + <param name="success" type="Boolean" platform="documentation" mandatory="true"> + <description> true if successful; false, if failed </description> + </param> <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> <element name="SUCCESS"/> @@ -7536,9 +7527,6 @@ </param> <param name="info" type="String" maxlength="1000" mandatory="false"> </param> - <param name="success" type="Boolean" platform="documentation" mandatory="true"> - <description> true if successful; false, if failed </description> - </param> </function> <function name="SetInteriorVehicleData" functionID="SetInteriorVehicleDataID" messagetype="request" since="4.5"> @@ -7825,13 +7813,13 @@ <description> The ID of the service to be unpublished. </description> </param> </function> - + <function name="UnpublishAppService" functionID="UnpublishAppServiceID" messagetype="response" since="6.0"> <description> The response to UnpublishAppService </description> <param name="success" type="Boolean" platform="documentation" mandatory="true"> <description> true, if successful; false, if failed </description> </param> - + <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> <element name="SUCCESS"/> @@ -7955,10 +7943,17 @@ <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> <element name="SUCCESS"/> - <element name="DISALLOWED"/> + <element name="IGNORED"/> + <element name="INVALID_DATA"/> + <element name="OUT_OF_MEMORY"/> + <element name="TOO_MANY_PENDING_REQUESTS"/> <element name="APPLICATION_NOT_REGISTERED"/> <element name="GENERIC_ERROR"/> - <element name="IGNORED"/> + <element name="REJECTED"/> + <element name="DISALLOWED"/> + <element name="UNSUPPORTED_RESOURCE"/> + <element name="WARNINGS"/> + <element name="ABORTED"/> </param> <param name="info" type="String" maxlength="1000" mandatory="false" platform="documentation"> @@ -7974,7 +7969,7 @@ <param name="success" type="Boolean" platform="documentation" mandatory="true"> <description> true if successful; false, if failed </description> </param> - + <param name="resultCode" type="Result" platform="documentation" mandatory="true"> <description>See Result</description> <element name="SUCCESS"/> @@ -7983,7 +7978,7 @@ <element name="GENERIC_ERROR"/> <element name="IGNORED"/> </param> - + <param name="info" type="String" maxlength="1000" mandatory="false" platform="documentation"> <description>Provides additional human readable info regarding the result.</description> </param> @@ -8122,8 +8117,6 @@ <param name="cloudAppVehicleID" type="String" mandatory="false" since="5.1"> <description>Parameter used by cloud apps to identify a head unit</description> </param> - - <!-- Ford Specific Vehicle Data --> <param name="eCallInfo" type="ECallInfo" mandatory="false"> <description>Emergency Call notification and confirmation data</description> </param> @@ -8139,8 +8132,6 @@ <param name="myKey" type="MyKey" mandatory="false"> <description>Information related to the MyKey feature</description> </param> - <!-- / Ford Specific Vehicle Data --> - </function> <function name="OnCommand" functionID="OnCommandID" messagetype="notification" since="1.0"> diff --git a/src/components/media_manager/src/pipe_streamer_adapter.cc b/src/components/media_manager/src/pipe_streamer_adapter.cc index c692a0e266..bda106721f 100644 --- a/src/components/media_manager/src/pipe_streamer_adapter.cc +++ b/src/components/media_manager/src/pipe_streamer_adapter.cc @@ -82,7 +82,7 @@ PipeStreamerAdapter::PipeStreamer::~PipeStreamer() { bool PipeStreamerAdapter::PipeStreamer::Connect() { LOG4CXX_AUTO_TRACE(logger_); - pipe_fd_ = open(named_pipe_path_.c_str(), O_RDWR, 0); + pipe_fd_ = open(named_pipe_path_.c_str(), O_RDWR | O_NONBLOCK, 0); if (-1 == pipe_fd_) { LOG4CXX_ERROR(logger_, "Cannot open pipe for writing " << named_pipe_path_); return false; @@ -106,16 +106,51 @@ void PipeStreamerAdapter::PipeStreamer::Disconnect() { bool PipeStreamerAdapter::PipeStreamer::Send( protocol_handler::RawMessagePtr msg) { LOG4CXX_AUTO_TRACE(logger_); - ssize_t ret = write(pipe_fd_, msg->data(), msg->data_size()); - if (-1 == ret) { - LOG4CXX_ERROR(logger_, "Failed writing data to pipe " << named_pipe_path_); - return false; - } - - if (static_cast<uint32_t>(ret) != msg->data_size()) { - LOG4CXX_WARN(logger_, - "Couldn't write all the data to pipe " << named_pipe_path_); - } + fd_set wfds; + FD_ZERO(&wfds); + FD_SET(pipe_fd_, &wfds); + struct timeval tv; + tv.tv_sec = 10; + tv.tv_usec = 0; + ssize_t write_ret = 0; + bool data_remaining = false; + do { + int select_ret = select(pipe_fd_ + 1, NULL, &wfds, NULL, &tv); + // Most likely pipe closed, fail stream + if (select_ret == -1) { + LOG4CXX_ERROR(logger_, + "Failed writing data to pipe " + << named_pipe_path_ << ". Errno: " << strerror(errno)); + return false; + // Select success, attempt to write + } else if (select_ret) { + ssize_t temp_ret = write( + pipe_fd_, msg->data() + write_ret, msg->data_size() - write_ret); + if (-1 == temp_ret) { + LOG4CXX_ERROR(logger_, + "Failed writing data to pipe " + << named_pipe_path_ + << ". Errno: " << strerror(errno)); + return false; + } + write_ret += temp_ret; + // Select timed out, fail stream. + } else { + LOG4CXX_ERROR(logger_, + "Failed writing data to pipe " << named_pipe_path_ + << ". Error: TIMEOUT"); + return false; + } + // Check that all data was written to the pipe. + data_remaining = static_cast<uint32_t>(write_ret) != msg->data_size(); + if (data_remaining) { + LOG4CXX_WARN(logger_, + "Couldn't write all the data to pipe " + << named_pipe_path_ << ". " + << msg->data_size() - write_ret << " bytes remaining"); + } + // Loop to send remaining data if there is any. + } while (data_remaining); LOG4CXX_INFO(logger_, "Streamer::sent " << msg->data_size()); return true; diff --git a/tools/InterfaceGenerator/generator/parsers/RPCBase.py b/tools/InterfaceGenerator/generator/parsers/RPCBase.py index d11b9e8d0d..ac5bb4c858 100755 --- a/tools/InterfaceGenerator/generator/parsers/RPCBase.py +++ b/tools/InterfaceGenerator/generator/parsers/RPCBase.py @@ -904,7 +904,7 @@ class Parser(object): elif subelement.tag == "param" and parent.tag == "param": items.append(self._parse_function_param(subelement, prefix)) elif subelement.tag == "function" and parent.tag == "function": - items.append(self.__parse_function(subelement, prefix)) + items.append(self._parse_function(subelement, prefix)) else: raise ParseError("A history tag must be nested within the element it notes the history for. Fix item: '" + parent.attrib["name"] + "'") |