BitParameter.cpp revision 68a912857707864bbaaff9808717813105072a6e
168a912857707864bbaaff9808717813105072a6ePatrick Benavoli/* <auto_header>
268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * <FILENAME>
368a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * INTEL CONFIDENTIAL
568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Copyright © 2011 Intel
668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Corporation All Rights Reserved.
768a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * The source code contained or described herein and all documents related to
968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * the source code ("Material") are owned by Intel Corporation or its suppliers
1068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * or licensors. Title to the Material remains with Intel Corporation or its
1168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * suppliers and licensors. The Material contains trade secrets and proprietary
1268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * and confidential information of Intel or its suppliers and licensors. The
1368a912857707864bbaaff9808717813105072a6ePatrick Benavoli * Material is protected by worldwide copyright and trade secret laws and
1468a912857707864bbaaff9808717813105072a6ePatrick Benavoli * treaty provisions. No part of the Material may be used, copied, reproduced,
1568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * modified, published, uploaded, posted, transmitted, distributed, or
1668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * disclosed in any way without Intel’s prior express written permission.
1768a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
1868a912857707864bbaaff9808717813105072a6ePatrick Benavoli * No license under any patent, copyright, trade secret or other intellectual
1968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * property right is granted to or conferred upon you by disclosure or delivery
2068a912857707864bbaaff9808717813105072a6ePatrick Benavoli * of the Materials, either expressly, by implication, inducement, estoppel or
2168a912857707864bbaaff9808717813105072a6ePatrick Benavoli * otherwise. Any license under such intellectual property rights must be
2268a912857707864bbaaff9808717813105072a6ePatrick Benavoli * express and approved by Intel in writing.
2368a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
2468a912857707864bbaaff9808717813105072a6ePatrick Benavoli *  AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
2568a912857707864bbaaff9808717813105072a6ePatrick Benavoli * CREATED: 2011-06-01
2668a912857707864bbaaff9808717813105072a6ePatrick Benavoli * UPDATED: 2011-07-27
2768a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
2868a912857707864bbaaff9808717813105072a6ePatrick Benavoli *
2968a912857707864bbaaff9808717813105072a6ePatrick Benavoli * </auto_header>
3068a912857707864bbaaff9808717813105072a6ePatrick Benavoli */
3168a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameter.h"
3268a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterType.h"
3368a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterAccessContext.h"
3468a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ConfigurationAccessContext.h"
3568a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "ParameterBlackboard.h"
3668a912857707864bbaaff9808717813105072a6ePatrick Benavoli#include "BitParameterBlock.h"
3768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
3868a912857707864bbaaff9808717813105072a6ePatrick Benavoli#define base CInstanceConfigurableElement
3968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4068a912857707864bbaaff9808717813105072a6ePatrick BenavoliCBitParameter::CBitParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
4168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4268a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
4468a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Type
4568a912857707864bbaaff9808717813105072a6ePatrick BenavoliCInstanceConfigurableElement::Type CBitParameter::getType() const
4668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
4768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return EBitParameter;
4868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
4968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Size
5168a912857707864bbaaff9808717813105072a6ePatrick Benavoliuint32_t CBitParameter::getSize() const
5268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return static_cast<const CBitParameterBlock*>(getParent())->getSize();
5468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
5568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
5668a912857707864bbaaff9808717813105072a6ePatrick Benavoli// XML configuration settings parsing/composing
5768a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
5868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
5968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Handle access
6068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!configurationAccessContext.serializeOut()) {
6168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Write to blackboard
6368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        if (!doSetValue(xmlConfigurableElementSettingsElement.getTextContent(), getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext)) {
6468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6568a912857707864bbaaff9808717813105072a6ePatrick Benavoli            // Append parameter path to error
6668a912857707864bbaaff9808717813105072a6ePatrick Benavoli            configurationAccessContext.appendToError(" " + getPath());
6768a912857707864bbaaff9808717813105072a6ePatrick Benavoli
6868a912857707864bbaaff9808717813105072a6ePatrick Benavoli            return false;
6968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        }
7068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    } else {
7168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Get string value
7368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        string strValue;
7468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        doGetValue(strValue, getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext);
7668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
7768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Populate value into xml text node
7868a912857707864bbaaff9808717813105072a6ePatrick Benavoli        xmlConfigurableElementSettingsElement.setTextContent(strValue);
7968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
8068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Done
8268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
8368a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
8468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
8568a912857707864bbaaff9808717813105072a6ePatrick Benavoliuint32_t CBitParameter::getFootPrint() const
8668a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
8768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Allocation made on parent side
8868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return 0;
8968a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
9068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9168a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Dump
9268a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CBitParameter::logValue(string& strValue, CErrorContext& errorContext) const
9368a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
9468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
9568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
9668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Dump value
9768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    doGetValue(strValue, getOffset(), parameterContext);
9868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
9968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10068a912857707864bbaaff9808717813105072a6ePatrick Benavoli// Parameter Access
10168a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
10268a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
10368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Check path validity
10468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!checkPathExhausted(pathNavigator, errorContext)) {
10568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
10668a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
10768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
10868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Parameter context
10968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
11068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Set Value
11268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!doSetValue(strValue, getOffset(), parameterContext)) {
11368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11468a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Append parameter path to error
11568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        parameterContext.appendToError(" " + getPath());
11668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
11768a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
11868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
11968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Synchronize
12068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!sync(parameterContext)) {
12168a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12268a912857707864bbaaff9808717813105072a6ePatrick Benavoli        // Append parameter path to error
12368a912857707864bbaaff9808717813105072a6ePatrick Benavoli        parameterContext.appendToError(" " + getPath());
12468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
12568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
12668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
12768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
12868a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
12968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13068a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
13168a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
13268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Check path validity
13368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!checkPathExhausted(pathNavigator, errorContext)) {
13468a912857707864bbaaff9808717813105072a6ePatrick Benavoli
13568a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
13668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
13768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Parameter context
13868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
13968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Get Value
14168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    doGetValue(strValue, getOffset(), parameterContext);
14268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
14468a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
14568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
14668a912857707864bbaaff9808717813105072a6ePatrick Benavolibool CBitParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
14768a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
14868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiData = 0;
14968a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Read/modify/write
15168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
15268a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15368a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Beware this code works on little endian architectures only!
15468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
15568a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15668a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Convert
15768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    if (!static_cast<const CBitParameterType*>(getTypeElement())->asInteger(strValue, uiData, parameterAccessContext)) {
15868a912857707864bbaaff9808717813105072a6ePatrick Benavoli
15968a912857707864bbaaff9808717813105072a6ePatrick Benavoli        return false;
16068a912857707864bbaaff9808717813105072a6ePatrick Benavoli    }
16168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Write blackboard
16268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pBlackboard->write(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
16368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    return true;
16568a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
16668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
16768a912857707864bbaaff9808717813105072a6ePatrick Benavolivoid CBitParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
16868a912857707864bbaaff9808717813105072a6ePatrick Benavoli{
16968a912857707864bbaaff9808717813105072a6ePatrick Benavoli    uint32_t uiData = 0;
17068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17168a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Read blackboard
17268a912857707864bbaaff9808717813105072a6ePatrick Benavoli    CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
17368a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17468a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Beware this code works on little endian architectures only!
17568a912857707864bbaaff9808717813105072a6ePatrick Benavoli    pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
17668a912857707864bbaaff9808717813105072a6ePatrick Benavoli
17768a912857707864bbaaff9808717813105072a6ePatrick Benavoli    // Convert
17868a912857707864bbaaff9808717813105072a6ePatrick Benavoli    static_cast<const CBitParameterType*>(getTypeElement())->asString(uiData, strValue);
17968a912857707864bbaaff9808717813105072a6ePatrick Benavoli}
18068a912857707864bbaaff9808717813105072a6ePatrick Benavoli
181