diff options
author | Kevin Rocard <kevinx.rocard@intel.com> | 2013-01-28 17:02:08 +0100 |
---|---|---|
committer | David Wagner <david.wagner@intel.com> | 2014-02-12 17:03:49 +0100 |
commit | 084cafba76fa5c987cdffeaaa7401202473554cb (patch) | |
tree | 0d389569389cfcd6b76aaa49fa65968578c7fdcf /parameter/Subsystem.cpp | |
parent | db43cf055f954efbaa50157637a034511eed2849 (diff) | |
download | external_parameter-framework-084cafba76fa5c987cdffeaaa7401202473554cb.zip external_parameter-framework-084cafba76fa5c987cdffeaaa7401202473554cb.tar.gz external_parameter-framework-084cafba76fa5c987cdffeaaa7401202473554cb.tar.bz2 |
PFW: Parameter bloc can handle any mapping depth
BZ: 85878
Needed for subsystem object definition enhancement.
In a PFW structure file, if a parameter bloc is defined in another
parameter bloc with context mapping only (no instanciable mapping),
the PFW will no longer stop diving on the first parameter bloc.
Change-Id: If4f704f01e20eb348d931c0baab1b85936fc75a4
Signed-off-by: Kevin Rocard <kevinx.rocard@intel.com>
Reviewed-on: http://android.intel.com:8080/88959
Reviewed-by: Dixon, CharlesX <charlesx.dixon@intel.com>
Tested-by: Dixon, CharlesX <charlesx.dixon@intel.com>
Reviewed-by: Boisnard, FredericX <fredericx.boisnard@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Diffstat (limited to 'parameter/Subsystem.cpp')
-rw-r--r-- | parameter/Subsystem.cpp | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/parameter/Subsystem.cpp b/parameter/Subsystem.cpp index a9115c8..f49ba64 100644 --- a/parameter/Subsystem.cpp +++ b/parameter/Subsystem.cpp @@ -233,10 +233,13 @@ bool CSubsystem::handleMappingContext(const CInstanceConfigurableElement* pInsta return true; } -// Creation handling -bool CSubsystem::handleSubsystemObjectCreation(CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError) +// Subsystem object creation handling +bool CSubsystem::handleSubsystemObjectCreation( + CInstanceConfigurableElement* pInstanceConfigurableElement, + CMappingContext& context, bool& bHasCreatedSubsystemObject, string& strError) { uint32_t uiItem; + bHasCreatedSubsystemObject = false; for (uiItem = 0; uiItem < _subsystemObjectCreatorArray.size(); uiItem++) { @@ -281,13 +284,16 @@ bool CSubsystem::handleSubsystemObjectCreation(CInstanceConfigurableElement* pIn // Do create object and keep its track _subsystemObjectList.push_back(pSubsystemObjectCreator->objectCreate(*pStrValue, pInstanceConfigurableElement, context)); - // Done - return true; + // Indicate subsytem creation to caller + bHasCreatedSubsystemObject = true; + + // The subsystem Object has been instantiated, no need to continue looking for an + // instantiation mapping + break; } } - getMappingError(strError, "Mapping key", "Not found", pInstanceConfigurableElement); - return false; + return true; } // Generic error handling from derived subsystem classes @@ -297,46 +303,64 @@ void CSubsystem::getMappingError(string& strError, const string& strKey, const s } // From IMapper -bool CSubsystem::mapBegin(CInstanceConfigurableElement* pInstanceConfigurableElement, bool& bKeepDiving, string& strError) +// Handle a configurable element mapping +bool CSubsystem::mapBegin(CInstanceConfigurableElement* pInstanceConfigurableElement, + bool& bKeepDiving, string& strError) { // Get current context CMappingContext context = _contextStack.top(); - switch(pInstanceConfigurableElement->getType()) { + // Add mapping in context + if (!handleMappingContext(pInstanceConfigurableElement, context, strError)) { - case CInstanceConfigurableElement::EComponent: + return false; + } - if (!handleMappingContext(pInstanceConfigurableElement, context, strError)) { + // Push context + _contextStack.push(context); - return false; - } + // Assume diving by default + bKeepDiving = true; - // Push context - _contextStack.push(context); + // Deal with ambiguous usage of parameter blocks + bool bShouldCreateSubsystemObject = true; - // Keep diving - bKeepDiving = true; + switch(pInstanceConfigurableElement->getType()) { - return true; + case CInstanceConfigurableElement::EComponent: + return true; - case CInstanceConfigurableElement::EParameterBlock: - case CInstanceConfigurableElement::EBitParameterBlock: - case CInstanceConfigurableElement::EParameter: - case CInstanceConfigurableElement::EStringParameter: + case CInstanceConfigurableElement::EParameterBlock: + // Subsystem object creation is optional in parameter blocks + bShouldCreateSubsystemObject = false; + // No break + case CInstanceConfigurableElement::EBitParameterBlock: + case CInstanceConfigurableElement::EParameter: + case CInstanceConfigurableElement::EStringParameter: - if (!handleSubsystemObjectCreation(pInstanceConfigurableElement, context, strError)) { + bool bHasCreatedSubsystemObject; - return false; - } + if (!handleSubsystemObjectCreation(pInstanceConfigurableElement, context, + bHasCreatedSubsystemObject, strError)) { + + return false; + } + // Check for creation error + if (bShouldCreateSubsystemObject && !bHasCreatedSubsystemObject) { - // Done - bKeepDiving = false; + getMappingError(strError, "Not found", + "Subsystem object mapping key is missing", + pInstanceConfigurableElement); + return false; + } + // Not created and no error, keep diving + bKeepDiving = !bHasCreatedSubsystemObject; - return true; + return true; - default: - assert(0); - return false; + default: + assert(0); + return false; } } |