summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Android.mk5
-rw-r--r--parameter-connector-test/Android.mk34
-rw-r--r--parameter-connector-test/ExamplePlatform.cpp123
-rw-r--r--parameter-connector-test/ExamplePlatform.h77
-rw-r--r--parameter-connector-test/main.cpp78
-rw-r--r--parameter-test/Android.mk34
-rw-r--r--parameter-test/Test.txt8
-rw-r--r--parameter-test/main.cpp204
-rw-r--r--parameter/Android.mk127
-rw-r--r--parameter/AreaConfiguration.cpp165
-rw-r--r--parameter/AreaConfiguration.h90
-rw-r--r--parameter/ArrayParameter.cpp282
-rw-r--r--parameter/ArrayParameter.h65
-rw-r--r--parameter/AutoLog.cpp49
-rw-r--r--parameter/AutoLog.h47
-rw-r--r--parameter/BackSynchronizer.cpp39
-rw-r--r--parameter/BackSynchronizer.h55
-rw-r--r--parameter/BinarySerializableElement.cpp71
-rw-r--r--parameter/BinarySerializableElement.h47
-rw-r--r--parameter/BinaryStream.cpp173
-rw-r--r--parameter/BinaryStream.h78
-rw-r--r--parameter/BitParameter.cpp180
-rw-r--r--parameter/BitParameter.h66
-rw-r--r--parameter/BitParameterBlock.cpp71
-rw-r--r--parameter/BitParameterBlock.h52
-rw-r--r--parameter/BitParameterBlockType.cpp70
-rw-r--r--parameter/BitParameterBlockType.h56
-rw-r--r--parameter/BitParameterType.cpp136
-rw-r--r--parameter/BitParameterType.h68
-rw-r--r--parameter/BooleanParameterType.cpp73
-rw-r--r--parameter/BooleanParameterType.h44
-rw-r--r--parameter/Component.cpp44
-rw-r--r--parameter/Component.h44
-rw-r--r--parameter/ComponentInstance.cpp102
-rw-r--r--parameter/ComponentInstance.h58
-rw-r--r--parameter/ComponentLibrary.cpp53
-rw-r--r--parameter/ComponentLibrary.h49
-rw-r--r--parameter/ComponentType.cpp122
-rw-r--r--parameter/ComponentType.h60
-rw-r--r--parameter/CompoundRule.cpp87
-rw-r--r--parameter/CompoundRule.h57
-rw-r--r--parameter/ComputedSizeParameter.cpp90
-rw-r--r--parameter/ComputedSizeParameter.h51
-rw-r--r--parameter/ComputedSizeParameterType.cpp88
-rw-r--r--parameter/ComputedSizeParameterType.h54
-rw-r--r--parameter/ConfigurableDomain.cpp922
-rw-r--r--parameter/ConfigurableDomain.h146
-rw-r--r--parameter/ConfigurableDomains.cpp428
-rw-r--r--parameter/ConfigurableDomains.h89
-rw-r--r--parameter/ConfigurableElement.cpp539
-rw-r--r--parameter/ConfigurableElement.h120
-rw-r--r--parameter/ConfigurableElementAggregator.cpp79
-rw-r--r--parameter/ConfigurableElementAggregator.h61
-rw-r--r--parameter/ConfigurationAccessContext.cpp54
-rw-r--r--parameter/ConfigurationAccessContext.h54
-rw-r--r--parameter/DomainConfiguration.cpp285
-rw-r--r--parameter/DomainConfiguration.h102
-rw-r--r--parameter/Element.cpp649
-rw-r--r--parameter/Element.h145
-rw-r--r--parameter/ElementBuilder.cpp44
-rw-r--r--parameter/ElementBuilder.h46
-rw-r--r--parameter/ElementBuilderTemplate.h46
-rw-r--r--parameter/ElementLibrary.cpp75
-rw-r--r--parameter/ElementLibrary.h64
-rw-r--r--parameter/ElementLibrarySet.cpp58
-rw-r--r--parameter/ElementLibrarySet.h45
-rw-r--r--parameter/ElementLocator.cpp85
-rw-r--r--parameter/ElementLocator.h50
-rw-r--r--parameter/ErrorContext.cpp52
-rw-r--r--parameter/ErrorContext.h51
-rw-r--r--parameter/FixedPointParameterType.cpp173
-rw-r--r--parameter/FixedPointParameterType.h61
-rw-r--r--parameter/FrameworkConfigurationGroup.cpp43
-rw-r--r--parameter/FrameworkConfigurationGroup.h42
-rw-r--r--parameter/FrameworkConfigurationLocation.cpp109
-rw-r--r--parameter/FrameworkConfigurationLocation.h49
-rw-r--r--parameter/HardwareBackSynchronizer.cpp55
-rw-r--r--parameter/HardwareBackSynchronizer.h52
-rw-r--r--parameter/InstanceConfigurableElement.cpp171
-rw-r--r--parameter/InstanceConfigurableElement.h87
-rw-r--r--parameter/InstanceDefinition.cpp61
-rw-r--r--parameter/InstanceDefinition.h46
-rw-r--r--parameter/IntegerParameterType.cpp160
-rw-r--r--parameter/IntegerParameterType.h61
-rw-r--r--parameter/KindElement.cpp42
-rw-r--r--parameter/KindElement.h44
-rw-r--r--parameter/KindElementBuilderTemplate.h45
-rw-r--r--parameter/Mapper.h44
-rw-r--r--parameter/MappingContext.cpp100
-rw-r--r--parameter/MappingContext.h67
-rw-r--r--parameter/MappingData.cpp89
-rw-r--r--parameter/MappingData.h55
-rw-r--r--parameter/NamedElementBuilderTemplate.h45
-rw-r--r--parameter/Parameter.cpp213
-rw-r--r--parameter/Parameter.h74
-rw-r--r--parameter/ParameterAccessContext.cpp87
-rw-r--r--parameter/ParameterAccessContext.h69
-rw-r--r--parameter/ParameterBlackboard.cpp139
-rw-r--r--parameter/ParameterBlackboard.h66
-rw-r--r--parameter/ParameterBlock.cpp42
-rw-r--r--parameter/ParameterBlock.h43
-rw-r--r--parameter/ParameterBlockType.cpp86
-rw-r--r--parameter/ParameterBlockType.h51
-rw-r--r--parameter/ParameterFrameworkConfiguration.cpp47
-rw-r--r--parameter/ParameterFrameworkConfiguration.h44
-rw-r--r--parameter/ParameterMgr.cpp1740
-rw-r--r--parameter/ParameterMgr.h318
-rw-r--r--parameter/ParameterMgrLogger.cpp42
-rw-r--r--parameter/ParameterMgrLogger.h49
-rw-r--r--parameter/ParameterMgrPlatformConnector.cpp101
-rw-r--r--parameter/ParameterMgrPlatformConnector.h70
-rw-r--r--parameter/ParameterType.cpp97
-rw-r--r--parameter/ParameterType.h76
-rw-r--r--parameter/PathNavigator.cpp88
-rw-r--r--parameter/PathNavigator.h57
-rw-r--r--parameter/Rule.cpp38
-rw-r--r--parameter/Rule.h43
-rw-r--r--parameter/SelectionCriteria.cpp80
-rw-r--r--parameter/SelectionCriteria.h66
-rw-r--r--parameter/SelectionCriteriaDefinition.cpp72
-rw-r--r--parameter/SelectionCriteriaDefinition.h55
-rw-r--r--parameter/SelectionCriterion.cpp93
-rw-r--r--parameter/SelectionCriterion.h73
-rw-r--r--parameter/SelectionCriterionDefinition.cpp40
-rw-r--r--parameter/SelectionCriterionDefinition.h43
-rw-r--r--parameter/SelectionCriterionInterface.h35
-rw-r--r--parameter/SelectionCriterionLibrary.cpp52
-rw-r--r--parameter/SelectionCriterionLibrary.h46
-rw-r--r--parameter/SelectionCriterionObserver.h39
-rw-r--r--parameter/SelectionCriterionRule.cpp150
-rw-r--r--parameter/SelectionCriterionRule.h76
-rw-r--r--parameter/SelectionCriterionType.cpp93
-rw-r--r--parameter/SelectionCriterionType.h59
-rw-r--r--parameter/SelectionCriterionTypeInterface.h34
-rw-r--r--parameter/SimulatedBackSynchronizer.cpp55
-rw-r--r--parameter/SimulatedBackSynchronizer.h49
-rw-r--r--parameter/Subsystem.cpp341
-rw-r--r--parameter/Subsystem.h113
-rw-r--r--parameter/SubsystemElementBuilder.cpp41
-rw-r--r--parameter/SubsystemElementBuilder.h47
-rw-r--r--parameter/SubsystemLibrary.cpp47
-rw-r--r--parameter/SubsystemLibrary.h44
-rw-r--r--parameter/SubsystemObject.cpp97
-rw-r--r--parameter/SubsystemObject.h64
-rw-r--r--parameter/SubsystemObjectCreator.cpp47
-rw-r--r--parameter/SubsystemObjectCreator.h57
-rw-r--r--parameter/Syncer.h43
-rw-r--r--parameter/SyncerSet.cpp75
-rw-r--r--parameter/SyncerSet.h59
-rw-r--r--parameter/SystemClass.cpp177
-rw-r--r--parameter/SystemClass.h62
-rw-r--r--parameter/SystemClassConfiguration.cpp63
-rw-r--r--parameter/SystemClassConfiguration.h54
-rw-r--r--parameter/TypeElement.cpp126
-rw-r--r--parameter/TypeElement.h75
-rw-r--r--parameter/XmlDomainSerializingContext.cpp66
-rw-r--r--parameter/XmlDomainSerializingContext.h64
-rw-r--r--parameter/XmlElementSerializingContext.cpp65
-rw-r--r--parameter/XmlElementSerializingContext.h57
-rw-r--r--parameter/XmlFileIncluderElement.cpp111
-rw-r--r--parameter/XmlFileIncluderElement.h46
-rw-r--r--parameter/XmlParameterSerializingContext.cpp50
-rw-r--r--parameter/XmlParameterSerializingContext.h47
-rwxr-xr-xparameter/parameter2
-rw-r--r--remote-process/Android.mk32
-rw-r--r--remote-process/main.cpp111
-rw-r--r--remote-processor-test/Android.mk32
-rw-r--r--remote-processor-test/main.cpp69
-rw-r--r--remote-processor/Android.mk39
-rw-r--r--remote-processor/AnswerMessage.cpp85
-rw-r--r--remote-processor/AnswerMessage.h59
-rw-r--r--remote-processor/ConnectionSocket.cpp73
-rw-r--r--remote-processor/ConnectionSocket.h47
-rw-r--r--remote-processor/ListeningSocket.cpp92
-rw-r--r--remote-processor/ListeningSocket.h46
-rw-r--r--remote-processor/Message.cpp267
-rw-r--r--remote-processor/Message.h81
-rw-r--r--remote-processor/RemoteCommand.h46
-rw-r--r--remote-processor/RemoteCommandHandler.h41
-rw-r--r--remote-processor/RemoteProcessorProtocol.h40
-rw-r--r--remote-processor/RemoteProcessorServer.cpp203
-rw-r--r--remote-processor/RemoteProcessorServer.h72
-rw-r--r--remote-processor/RemoteProcessorServerBuilder.cpp41
-rw-r--r--remote-processor/RemoteProcessorServerInterface.h43
-rw-r--r--remote-processor/RequestMessage.cpp137
-rw-r--r--remote-processor/RequestMessage.h68
-rw-r--r--remote-processor/Socket.cpp139
-rw-r--r--remote-processor/Socket.h66
-rw-r--r--utility/Android.mk29
-rw-r--r--utility/Tokenizer.cpp125
-rw-r--r--utility/Tokenizer.h56
-rw-r--r--xmlparser-test/Android.mk33
-rw-r--r--xmlparser-test/main.cpp210
-rw-r--r--xmlserializer/Android.mk38
l---------xmlserializer/XML1
-rw-r--r--xmlserializer/XmlComposer.cpp111
-rw-r--r--xmlserializer/XmlComposer.h55
-rw-r--r--xmlserializer/XmlElement.cpp235
-rw-r--r--xmlserializer/XmlElement.h93
-rw-r--r--xmlserializer/XmlParser.cpp162
-rw-r--r--xmlserializer/XmlParser.h54
-rw-r--r--xmlserializer/XmlSerializer.cpp89
-rw-r--r--xmlserializer/XmlSerializer.h74
-rw-r--r--xmlserializer/XmlSerializingContext.cpp51
-rw-r--r--xmlserializer/XmlSerializingContext.h49
-rw-r--r--xmlserializer/XmlSink.h40
-rw-r--r--xmlserializer/XmlSource.h40
l---------xmlserializer/parameter1
l---------xmlserializer/parameter-connector-test1
l---------xmlserializer/parameter-test1
l---------xmlserializer/remote-process1
l---------xmlserializer/remote-processor1
l---------xmlserializer/remote-processor-test1
l---------xmlserializer/utility1
l---------xmlserializer/xmlparser-test1
215 files changed, 20128 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..f5f1064
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,5 @@
+# Recursive call sub-folder Android.mk
+#
+
+include $(call all-subdir-makefiles)
+
diff --git a/parameter-connector-test/Android.mk b/parameter-connector-test/Android.mk
new file mode 100644
index 0000000..b3b52a2
--- /dev/null
+++ b/parameter-connector-test/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH :=
+
+
+LOCAL_SRC_FILES:= \
+ main.cpp \
+ ExamplePlatform.cpp
+
+
+LOCAL_MODULE:= parameter-connector-test
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ external/webkit/WebCore/icu/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../parameter
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc libparameter
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_LDLIBS +=
+LOCAL_LDFLAGS +=
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/parameter-connector-test/ExamplePlatform.cpp b/parameter-connector-test/ExamplePlatform.cpp
new file mode 100644
index 0000000..0e51cfb
--- /dev/null
+++ b/parameter-connector-test/ExamplePlatform.cpp
@@ -0,0 +1,123 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ExamplePlatform.h"
+#include "ParameterMgrPlatformConnector.h"
+#include <iostream>
+
+// Logger
+class CParameterMgrPlatformConnectorLogger : public CParameterMgrPlatformConnector::ILogger
+{
+public:
+ CParameterMgrPlatformConnectorLogger() {}
+
+ virtual void log(const std::string& strLog)
+ {
+ cout << strLog << endl;
+ }
+};
+
+// CExamplePlatform Implementation
+CExamplePlatform::CExamplePlatform(const string& strClass) : _pParameterMgrPlatformConnector(new CParameterMgrPlatformConnector(strClass)), _pParameterMgrPlatformConnectorLogger(new CParameterMgrPlatformConnectorLogger)
+{
+ // Logger
+ _pParameterMgrPlatformConnector->setLogger(_pParameterMgrPlatformConnectorLogger);
+
+ /// Criteria Types
+ // Mode
+ _pModeType = _pParameterMgrPlatformConnector->createSelectionCriterionType();
+ _pModeType->addValuePair(0, "Normal");
+ _pModeType->addValuePair(1, "InCsvCall");
+ _pModeType->addValuePair(2, "InVoipCall");
+ _pModeType->addValuePair(3, "RingTone");
+
+ // InputDevice
+ _pInputDeviceType = _pParameterMgrPlatformConnector->createSelectionCriterionType(true);
+ _pInputDeviceType->addValuePair(0x1, "BuiltIn");
+ _pInputDeviceType->addValuePair(0x2, "Headset");
+ _pInputDeviceType->addValuePair(0x4, "BluetoothHeadsetSCO");
+ _pInputDeviceType->addValuePair(0x8, "VoiceCall");
+
+ // OutputDevice
+ _pOutputDeviceType = _pParameterMgrPlatformConnector->createSelectionCriterionType(true);
+ _pOutputDeviceType->addValuePair(0x1, "Headphones");
+ _pOutputDeviceType->addValuePair(0x2, "Headset");
+ _pOutputDeviceType->addValuePair(0x4, "Earpiece");
+ _pOutputDeviceType->addValuePair(0x8, "IHF");
+ _pOutputDeviceType->addValuePair(0x10, "BluetoothSCO");
+ _pOutputDeviceType->addValuePair(0x20, "BluetoothHeadsetSCO");
+ _pOutputDeviceType->addValuePair(0x40, "BluetoothCarKitSCO");
+ _pOutputDeviceType->addValuePair(0x80, "BluetoothA2DP");
+
+ /// Criteria
+ _pMode = _pParameterMgrPlatformConnector->createSelectionCriterion("Mode", _pModeType);
+ _pSelectedInputDevice = _pParameterMgrPlatformConnector->createSelectionCriterion("SelectedInputDevice", _pInputDeviceType);
+ _pSelectedOutputDevice = _pParameterMgrPlatformConnector->createSelectionCriterion("SelectedOutputDevice", _pOutputDeviceType);
+
+ // Init state
+ setState(EInitState);
+}
+
+CExamplePlatform::~CExamplePlatform()
+{
+ delete _pParameterMgrPlatformConnectorLogger;
+ delete _pParameterMgrPlatformConnector;
+}
+
+// Start
+bool CExamplePlatform::start(string& strError)
+{
+ return _pParameterMgrPlatformConnector->start(strError);
+}
+
+// State
+void CExamplePlatform::setState(CExamplePlatform::State eState)
+{
+ switch(eState) {
+ case EInitState:
+ _pMode->setCriterionState(0, false);
+ _pSelectedInputDevice->setCriterionState(0, false);
+ _pSelectedOutputDevice->setCriterionState(0x4);
+ break;
+ case EState1:
+ _pMode->setCriterionState(0, false);
+ _pSelectedInputDevice->setCriterionState(0, false);
+ // Select Headset
+ _pSelectedOutputDevice->setCriterionState(0x1);
+ break;
+ case EState2:
+ break;
+ case EState3:
+ break;
+ default:
+ break;
+ }
+}
+
diff --git a/parameter-connector-test/ExamplePlatform.h b/parameter-connector-test/ExamplePlatform.h
new file mode 100644
index 0000000..bf821e8
--- /dev/null
+++ b/parameter-connector-test/ExamplePlatform.h
@@ -0,0 +1,77 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+class CParameterMgrPlatformConnector;
+class CParameterMgrPlatformConnectorLogger;
+class ISelectionCriterionTypeInterface;
+class ISelectionCriterionInterface;
+
+class CExamplePlatform
+{
+public:
+ enum State {
+ EInitState,
+ EState1,
+ EState2,
+ EState3,
+
+ ENbStates
+ };
+
+ CExamplePlatform(const string& strClass);
+ ~CExamplePlatform();
+
+ // Start
+ bool start(string& strError);
+
+ // State
+ void setState(State eState);
+
+private:
+ // The connector
+ CParameterMgrPlatformConnector* _pParameterMgrPlatformConnector;
+ // Logger
+ CParameterMgrPlatformConnectorLogger* _pParameterMgrPlatformConnectorLogger;
+ // Criteria Types
+ ISelectionCriterionTypeInterface* _pModeType;
+ ISelectionCriterionTypeInterface* _pInputDeviceType;
+ ISelectionCriterionTypeInterface* _pOutputDeviceType;
+
+ // Criteria
+ ISelectionCriterionInterface* _pMode;
+ ISelectionCriterionInterface* _pSelectedInputDevice;
+ ISelectionCriterionInterface* _pSelectedOutputDevice;
+};
diff --git a/parameter-connector-test/main.cpp b/parameter-connector-test/main.cpp
new file mode 100644
index 0000000..2fb8218
--- /dev/null
+++ b/parameter-connector-test/main.cpp
@@ -0,0 +1,78 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include <iostream>
+#include <semaphore.h>
+#include "ExamplePlatform.h"
+#include <semaphore.h>
+
+using namespace std;
+
+#ifdef SIMULATION
+const char* gpcParameterFrameworkConfigurationFolderPath = "/home/pat/projects/qt/parameter-framework/XML";
+#else
+const char* gpcParameterFrameworkConfigurationFolderPath = "/etc/parameter-framework";
+#endif
+
+int main(int argc, char *argv[])
+{
+ if (argc < 2) {
+
+ cerr << "Missing arguments" << endl;
+
+ return -1;
+ }
+
+ string strError;
+
+ // Create param mgr
+ CExamplePlatform examplePlatform(argv[1]);
+
+ // Start platformmgr
+ if (!examplePlatform.start(strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Change criteria
+
+ // Block here
+ sem_t sem;
+
+ sem_init(&sem, false, 0);
+
+ sem_wait(&sem);
+
+ sem_destroy(&sem);
+
+ return 0;
+}
diff --git a/parameter-test/Android.mk b/parameter-test/Android.mk
new file mode 100644
index 0000000..88c66e4
--- /dev/null
+++ b/parameter-test/Android.mk
@@ -0,0 +1,34 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH :=
+
+
+LOCAL_SRC_FILES:= \
+ main.cpp
+
+
+LOCAL_MODULE:= parameter-test
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ external/libxml2/include/ \
+ external/webkit/WebCore/icu/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../parameter $(LOCAL_PATH)/../xmlserializer/ $(LOCAL_PATH)/../remote-processor/
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc libparameter libxmlserializer
+LOCAL_STATIC_LIBRARIES := libxml2
+
+LOCAL_LDLIBS += -Lexternal/libxml2/lib
+LOCAL_LDFLAGS +=
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/parameter-test/Test.txt b/parameter-test/Test.txt
new file mode 100644
index 0000000..cae237e
--- /dev/null
+++ b/parameter-test/Test.txt
@@ -0,0 +1,8 @@
+/home/pat/projects/qt/XML/AudioStructure/ParameterFrameworkConfiguration.xml
+/Audio/LPE/HSEP_PATH/STEREO_EQ/ENABLE 1
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/FIR/COEFFS/TAPS 0
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/FIR/COEFF_SIZE 18
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/FIR/COEFFS/TAPS 1.3
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/IIR/COEFFS/SECTIONS/0/SN_SHIFT1 -9
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/FIR/COEFFS/TAPS/1 -0.3
+/Audio/LPE/HSEP_PATH/STEREO_EQ/LEFT_EQ/FIR/COEFFS/TAPS/100 -0.3 => out of range
diff --git a/parameter-test/main.cpp b/parameter-test/main.cpp
new file mode 100644
index 0000000..a0d30a0
--- /dev/null
+++ b/parameter-test/main.cpp
@@ -0,0 +1,204 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include <iostream>
+#include "ParameterMgr.h"
+#include "ParameterMgrPlatformConnector.h"
+#include <semaphore.h>
+
+using namespace std;
+
+#ifdef SIMULATION
+const char* gpcParameterFrameworkConfigurationFolderPath = "/home/pat/projects/qt/parameter-framework/XML";
+#else
+const char* gpcParameterFrameworkConfigurationFolderPath = "/etc/parameter-framework";
+#endif
+
+//#define SIMPLE_TEST
+
+int main(int argc, char *argv[])
+{
+#ifndef SIMPLE_TEST
+ if (argc != 4) {
+
+ cerr << "Wrong number of arguments" << endl;
+
+ return -1;
+ }
+#else
+ if (argc < 2) {
+
+ cerr << "Missing arguments" << endl;
+
+ return -1;
+ }
+#endif
+ string strError;
+
+ //CParameterMgrPlatformConnector parameterMgrPlatformConnector(argv[1]);
+ CParameterMgr parameterMgr(gpcParameterFrameworkConfigurationFolderPath, argv[1]);
+
+ // Load data structure
+ if (!parameterMgr.load(strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Init flow
+ if (!parameterMgr.init(strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+#ifndef SIMPLE_TEST
+ // Set Tuning Mode on
+ if (!parameterMgr.setTuningMode(true, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Restore some configuration
+ if (!parameterMgr.restoreConfiguration("Multimedia.OutputDevice.Private.Selected", "Earpiece", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+ // Save some configuration
+ if (!parameterMgr.saveConfiguration("Multimedia.OutputDevice.Public.Selected", "IHF", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Log content
+ string strContent;
+ parameterMgr.logStructureContent(strContent);
+
+ cout << strContent;
+
+ //parameterMgr.setValueSpaceRaw(true);
+
+ string strValue;
+ if (!parameterMgr.getValue(argv[2], strValue, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+ cout << "Before setting: " << strValue << endl;
+
+ if (!parameterMgr.setValue(argv[2], argv[3], strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ if (!parameterMgr.getValue(argv[2], strValue, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+ cout << "After setting: " << strValue << endl;
+
+ // Save some configuration
+ if (!parameterMgr.saveConfiguration("Multimedia.OutputDevice.Private.Selected", "WiredSpeakers", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Save some configuration
+ if (!parameterMgr.saveConfiguration("Multimedia.OutputDevice.Private.Selected", "BluetoothSCO", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+ // Export configurations
+ if (!parameterMgr.exportDomainsXml(string(gpcParameterFrameworkConfigurationFolderPath) + "/Settings/Audio/AudioSettingsExport.xml", true, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+ // Import configurations
+ if (!parameterMgr.importDomainsXml(string(gpcParameterFrameworkConfigurationFolderPath) + "/Settings/Audio/AudioSettingsExport.xml", true, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Export configuration as binary
+ if (!parameterMgr.exportDomainsBinary(string(gpcParameterFrameworkConfigurationFolderPath) + "/Settings/Audio/AudioSettingsExport.bin", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Import configuration as binary
+ if (!parameterMgr.importDomainsBinary(string(gpcParameterFrameworkConfigurationFolderPath) + "/Settings/Audio/AudioSettingsExport.bin", strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+
+ // Set Tuning Mode off
+ if (!parameterMgr.setTuningMode(false, strError)) {
+
+ cerr << strError << endl;
+
+ return -1;
+ }
+#endif
+ // Block here
+ sem_t sem;
+
+ sem_init(&sem, false, 0);
+
+ sem_wait(&sem);
+
+ sem_destroy(&sem);
+
+ return 0;
+}
+
diff --git a/parameter/Android.mk b/parameter/Android.mk
new file mode 100644
index 0000000..8db8179
--- /dev/null
+++ b/parameter/Android.mk
@@ -0,0 +1,127 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
+
+LOCAL_COPY_HEADERS_TO := parameter
+
+LOCAL_COPY_HEADERS := \
+ ParameterMgrPlatformConnector.h \
+ SelectionCriterionTypeInterface.h \
+ SelectionCriterionInterface.h
+
+LOCAL_SRC_FILES:= \
+ Subsystem.cpp \
+ PathNavigator.cpp \
+ Element.cpp \
+ SystemClass.cpp \
+ ElementBuilder.cpp \
+ Component.cpp \
+ ParameterMgr.cpp \
+ SelectionCriteria.cpp \
+ SelectionCriterionLibrary.cpp \
+ SelectionCriteriaDefinition.cpp \
+ SelectionCriterionType.cpp \
+ ElementLibrary.cpp \
+ SelectionCriterionDefinition.cpp \
+ SubsystemElementBuilder.cpp \
+ SubsystemLibrary.cpp \
+ SelectionCriterion.cpp \
+ ComponentLibrary.cpp \
+ ParameterBlock.cpp \
+ ConfigurableElement.cpp \
+ MappingData.cpp \
+ ParameterBlackboard.cpp \
+ ComponentType.cpp \
+ TypeElement.cpp \
+ InstanceConfigurableElement.cpp \
+ ComponentInstance.cpp \
+ ParameterBlockType.cpp \
+ ParameterType.cpp \
+ Parameter.cpp \
+ BooleanParameterType.cpp \
+ IntegerParameterType.cpp \
+ ArrayParameter.cpp \
+ InstanceDefinition.cpp \
+ ParameterMgrPlatformConnector.cpp \
+ ComputedSizeParameterType.cpp \
+ ComputedSizeParameter.cpp \
+ FixedPointParameterType.cpp \
+ ParameterAccessContext.cpp \
+ XmlFileIncluderElement.cpp \
+ ParameterFrameworkConfiguration.cpp \
+ FrameworkConfigurationGroup.cpp \
+ FrameworkConfigurationLocation.cpp \
+ KindElement.cpp \
+ ElementLibrarySet.cpp \
+ ErrorContext.cpp \
+ SystemClassConfiguration.cpp \
+ AreaConfiguration.cpp \
+ DomainConfiguration.cpp \
+ ConfigurableDomain.cpp \
+ SyncerSet.cpp \
+ ConfigurableDomains.cpp \
+ BinaryStream.cpp \
+ ConfigurationAccessContext.cpp \
+ XmlElementSerializingContext.cpp \
+ XmlParameterSerializingContext.cpp \
+ XmlDomainSerializingContext.cpp \
+ BinarySerializableElement.cpp \
+ BitParameterBlockType.cpp \
+ BitParameterBlock.cpp \
+ BitParameterType.cpp \
+ BitParameter.cpp \
+ ElementLocator.cpp \
+ ParameterMgrLogger.cpp \
+ AutoLog.cpp \
+ Rule.cpp \
+ CompoundRule.cpp \
+ SelectionCriterionRule.cpp \
+ ConfigurableElementAggregator.cpp \
+ BackSynchronizer.cpp \
+ HardwareBackSynchronizer.cpp \
+ SimulatedBackSynchronizer.cpp \
+ MappingContext.cpp \
+ SubsystemObject.cpp \
+ SubsystemObjectCreator.cpp
+
+
+LOCAL_MODULE:= libparameter
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../utility/ $(LOCAL_PATH)/../xmlserializer/ $(LOCAL_PATH)/../remote-processor/
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_SHARED_LIBRARIES := libstlport libdl libxmlserializer
+LOCAL_STATIC_LIBRARIES := libutility
+
+LOCAL_LDLIBS +=
+LOCAL_LDFLAGS +=
+
+include $(BUILD_SHARED_LIBRARY)
+
+# ==== export parameter script ========================
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := parameter
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE_CLASS := EXECUTABLES
+
+# This will install the file in /system/bin
+LOCAL_MODULE_PATH := $(TARGET_OUT_EXECUTABLES)
+
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+
+include $(BUILD_PREBUILT)
diff --git a/parameter/AreaConfiguration.cpp b/parameter/AreaConfiguration.cpp
new file mode 100644
index 0000000..ecc84a7
--- /dev/null
+++ b/parameter/AreaConfiguration.cpp
@@ -0,0 +1,165 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "AreaConfiguration.h"
+#include "ConfigurableElement.h"
+#include "ConfigurationAccessContext.h"
+#include "BinaryStream.h"
+#include <assert.h>
+
+CAreaConfiguration::CAreaConfiguration(const CConfigurableElement* pConfigurableElement) : _pConfigurableElement(pConfigurableElement), _bValid(false)
+{
+ _blackboard.setSize(_pConfigurableElement->getFootPrint());
+}
+
+// Save data from current
+void CAreaConfiguration::save(const CParameterBlackboard* pMainBlackboard)
+{
+ pMainBlackboard->saveTo(&_blackboard, _pConfigurableElement->getOffset());
+}
+
+// Apply data to current
+void CAreaConfiguration::restore(CParameterBlackboard* pMainBlackboard) const
+{
+ assert(_bValid);
+
+ pMainBlackboard->restoreFrom(&_blackboard, _pConfigurableElement->getOffset());
+}
+
+// Ensure validity
+void CAreaConfiguration::validate(const CParameterBlackboard* pMainBlackboard)
+{
+ if (!_bValid) {
+
+ // Saving from blackboard make area configuration valid
+ save(pMainBlackboard);
+
+ _bValid = true;
+ }
+}
+
+// Return validity
+bool CAreaConfiguration::isValid() const
+{
+ return _bValid;
+}
+
+// Ensure validity against given valid area configuration
+void CAreaConfiguration::validateAgainst(const CAreaConfiguration* pValidAreaConfiguration)
+{
+ // Should be called on purpose
+ assert(!_bValid);
+
+ // Check proper against area given
+ assert(pValidAreaConfiguration->isValid());
+
+ // Check compatibility
+ assert(_pConfigurableElement == pValidAreaConfiguration->_pConfigurableElement);
+
+ // Copy
+ _blackboard.restoreFrom(&pValidAreaConfiguration->_blackboard, 0);
+
+ // Set as valid
+ _bValid = true;
+}
+
+// XML configuration settings parsing
+bool CAreaConfiguration::serializeXmlSettings(CXmlElement& xmlConfigurationSettingsElement, CConfigurationAccessContext& configurationAccessContext)
+{
+ // Assign blackboard to configuration context
+ configurationAccessContext.setParameterBlackboard(&_blackboard);
+
+ // Assign base offset to configuration context
+ configurationAccessContext.setBaseOffset(_pConfigurableElement->getOffset());
+
+ // Parse configuration settings
+ if (_pConfigurableElement->serializeXmlSettings(xmlConfigurationSettingsElement, configurationAccessContext)) {
+
+ if (!configurationAccessContext.serializeOut()) {
+
+ // Serialized in areas are valid
+ _bValid = true;
+ }
+ return true;
+ }
+ return false;
+}
+
+// Compound handling
+const CConfigurableElement* CAreaConfiguration::getConfigurableElement() const
+{
+ return _pConfigurableElement;
+}
+
+// Configuration merging (we assume from element is descendant of this)
+void CAreaConfiguration::copyFromInner(const CAreaConfiguration* pFromAreaConfiguration)
+{
+ assert(pFromAreaConfiguration->getConfigurableElement()->isDescendantOf(_pConfigurableElement));
+
+ _blackboard.restoreFrom(&pFromAreaConfiguration->_blackboard, pFromAreaConfiguration->getConfigurableElement()->getOffset() - _pConfigurableElement->getOffset());
+}
+
+// Configuration splitting
+void CAreaConfiguration::copyToInner(CAreaConfiguration* pToAreaConfiguration) const
+{
+ assert(pToAreaConfiguration->getConfigurableElement()->isDescendantOf(_pConfigurableElement));
+
+ _blackboard.saveTo(&pToAreaConfiguration->_blackboard, pToAreaConfiguration->getConfigurableElement()->getOffset() - _pConfigurableElement->getOffset());
+
+ // Inner becomes valid
+ pToAreaConfiguration->setValid(true);
+}
+
+// Serialization
+void CAreaConfiguration::serialize(CBinaryStream& binaryStream)
+{
+ // Delegate to blackboard
+ _blackboard.serialize(binaryStream);
+
+ if (!binaryStream.isOut()) {
+
+ // Serialized in areas are valid
+ _bValid = true;
+ }
+}
+
+// Data size
+uint32_t CAreaConfiguration::getSize() const
+{
+ return _blackboard.getSize();
+}
+
+// Store validity
+void CAreaConfiguration::setValid(bool bValid)
+{
+ _bValid = bValid;
+}
+
+
diff --git a/parameter/AreaConfiguration.h b/parameter/AreaConfiguration.h
new file mode 100644
index 0000000..4e7e2f0
--- /dev/null
+++ b/parameter/AreaConfiguration.h
@@ -0,0 +1,90 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterBlackboard.h"
+#include "BinaryStream.h"
+
+using namespace std;
+
+class CConfigurableElement;
+class CXmlElement;
+class CConfigurationAccessContext;
+
+class CAreaConfiguration
+{
+public:
+ CAreaConfiguration(const CConfigurableElement* pConfigurableElement);
+
+ // Save data from current
+ void save(const CParameterBlackboard* pMainBlackboard);
+
+ // Apply data to current
+ void restore(CParameterBlackboard* pMainBlackboard) const;
+
+ // Ensure validity
+ void validate(const CParameterBlackboard* pMainBlackboard);
+
+ // Return validity
+ bool isValid() const;
+
+ // Ensure validity against given valid area configuration
+ void validateAgainst(const CAreaConfiguration* pValidAreaConfiguration);
+
+ // Compound handling
+ const CConfigurableElement* getConfigurableElement() const;
+
+ // Configuration merging
+ void copyFromInner(const CAreaConfiguration* pFromAreaConfiguration);
+
+ // Configuration splitting
+ void copyToInner(CAreaConfiguration* pToAreaConfiguration) const;
+
+ // XML configuration settings parsing/composing
+ bool serializeXmlSettings(CXmlElement& xmlConfigurationSettingsElement, CConfigurationAccessContext& configurationAccessContext);
+
+ // Serialization
+ void serialize(CBinaryStream& binaryStream);
+
+ // Data size
+ uint32_t getSize() const;
+private:
+ // Associated configurable element
+ const CConfigurableElement* _pConfigurableElement;
+ // Store validity
+ void setValid(bool bValid);
+
+ // Configurable element settings
+ CParameterBlackboard _blackboard;
+ // Area configuration validity (invalid area configurations can't be restored)
+ bool _bValid;
+};
+
diff --git a/parameter/ArrayParameter.cpp b/parameter/ArrayParameter.cpp
new file mode 100644
index 0000000..2cdae2f
--- /dev/null
+++ b/parameter/ArrayParameter.cpp
@@ -0,0 +1,282 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ArrayParameter.h"
+#include <sstream> // for istringstream
+#include "Tokenizer.h"
+#include "ParameterType.h"
+#include "ParameterAccessContext.h"
+#include "ConfigurationAccessContext.h"
+#include "ParameterBlackboard.h"
+
+#define base CParameter
+
+CArrayParameter::CArrayParameter(const string& strName, const CTypeElement* pTypeElement, uint32_t uiLength) : base(strName, pTypeElement), _uiLength(uiLength)
+{
+}
+
+uint32_t CArrayParameter::getFootPrint() const
+{
+ return getSize() * _uiLength;
+}
+
+// XML configuration settings parsing
+bool CArrayParameter::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Check for value space
+ handleValueSpaceAttribute(xmlConfigurableElementSettingsElement, configurationAccessContext);
+
+ // Handle access
+ if (!configurationAccessContext.serializeOut()) {
+
+ // Actually set values to blackboard
+ if (!setValues(0, configurationAccessContext.getBaseOffset(), xmlConfigurableElementSettingsElement.getTextContent(), configurationAccessContext)) {
+
+ return false;
+ }
+ } else {
+
+ // Get string value
+ string strValue;
+
+ // Whole array requested
+ getValues(configurationAccessContext.getBaseOffset(), strValue, configurationAccessContext);
+
+ // Populate value into xml text node
+ xmlConfigurableElementSettingsElement.setTextContent(strValue);
+ }
+
+ // Done
+ return true;
+}
+
+// User set/get
+bool CArrayParameter::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ uint32_t uiStartIndex;
+
+ if (!getIndex(pathNavigator, uiStartIndex, parameterContext)) {
+
+ return false;
+ }
+
+ if (uiStartIndex == (uint32_t)-1) {
+
+ // No index provided, start with 0
+ uiStartIndex = 0;
+ }
+
+ // Actually set values
+ if (!setValues(uiStartIndex, 0, strValue, parameterContext)) {
+
+ return false;
+ }
+
+ // Synchronize
+ if (parameterContext.getAutoSync() && !sync(parameterContext)) {
+
+ // Append parameter path to error
+ errorContext.appendToError(" " + getPath());
+
+ return false;
+ }
+
+ return true;
+}
+
+bool CArrayParameter::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+ uint32_t uiIndex;
+
+ if (!getIndex(pathNavigator, uiIndex, parameterContext)) {
+
+ return false;
+ }
+ if (uiIndex == (uint32_t)-1) {
+
+ // Whole array requested
+ getValues(0, strValue, parameterContext);
+
+ } else {
+ // Scalar requested
+ doGetValue(strValue, getOffset() + uiIndex * getSize(), parameterContext);
+ }
+
+ return true;
+}
+
+void CArrayParameter::logValue(string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Dump values
+ getValues(0, strValue, parameterContext);
+
+ // Prepend unit if any
+ prependUnit(strValue);
+}
+
+// Used for simulation only
+void CArrayParameter::setDefaultValues(CParameterAccessContext& parameterAccessContext) const
+{
+ // Get default value from type
+ uint32_t uiDefaultValue = static_cast<const CParameterType*>(getTypeElement())->getDefaultValue();
+
+ // Write blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Process
+ uint32_t uiValueIndex;
+ uint32_t uiSize = getSize();
+ uint32_t uiOffset = getOffset();
+ bool bSubsystemIsBigEndian = parameterAccessContext.isBigEndianSubsystem();
+
+ for (uiValueIndex = 0; uiValueIndex < _uiLength; uiValueIndex++) {
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->write(&uiDefaultValue, uiSize, uiOffset, bSubsystemIsBigEndian);
+
+ uiOffset += uiSize;
+ }
+}
+
+// Index from path
+bool CArrayParameter::getIndex(CPathNavigator& pathNavigator, uint32_t& uiIndex, CErrorContext& errorContext) const
+{
+ uiIndex = (uint32_t)-1;
+
+ string* pStrChildName = pathNavigator.next();
+
+ if (pStrChildName) {
+
+ // Check index is numeric
+ istringstream iss(*pStrChildName);
+
+ iss >> uiIndex;
+
+ if (!iss) {
+
+ errorContext.setError("Expected numerical expression as last item in " + pathNavigator.getCurrentPath());
+
+ return false;
+ }
+
+ if (uiIndex >= _uiLength) {
+ ostringstream oss;
+
+ oss << "Provided index out of range (max is " << _uiLength - 1 << ")";
+
+ errorContext.setError(oss.str());
+
+ return false;
+ }
+
+ // Check no other item provided in path
+ pStrChildName = pathNavigator.next();
+
+ if (pStrChildName) {
+
+ // Should be leaf element
+ errorContext.setError("Path not found: " + pathNavigator.getCurrentPath());
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// Common set value processing
+bool CArrayParameter::setValues(uint32_t uiStartIndex, uint32_t uiBaseOffset, const string& strValue, CParameterAccessContext& parameterContext) const
+{
+ // Deal with value(s)
+ Tokenizer tok(strValue);
+
+ vector<string> astrValues = tok.split();
+ uint32_t uiNbValues = astrValues.size();
+
+ // Check number of provided values
+ if (uiNbValues + uiStartIndex > _uiLength) {
+
+ // Out of bounds
+ parameterContext.setError("Too many values provided");
+
+ return false;
+ }
+
+ // Process
+ uint32_t uiValueIndex;
+ uint32_t uiSize = getSize();
+ uint32_t uiOffset = getOffset() + uiStartIndex * uiSize - uiBaseOffset;
+
+ for (uiValueIndex = 0; uiValueIndex < uiNbValues; uiValueIndex++) {
+
+ if (!doSetValue(astrValues[uiValueIndex], uiOffset, parameterContext)) {
+
+ // Append parameter path to error
+ parameterContext.appendToError(" " + getPath() + "/" + getIndexAsString(uiValueIndex + uiStartIndex));
+
+ return false;
+ }
+
+ uiOffset += uiSize;
+ }
+ return true;
+}
+
+// Common get value processing
+void CArrayParameter::getValues(uint32_t uiBaseOffset, string& strValues, CParameterAccessContext& parameterContext) const
+{
+ uint32_t uiValueIndex;
+ uint32_t uiSize = getSize();
+ uint32_t uiOffset = getOffset() - uiBaseOffset;
+
+ for (uiValueIndex = 0; uiValueIndex < _uiLength; uiValueIndex++) {
+ string strReadValue;
+
+ doGetValue(strReadValue, uiOffset, parameterContext);
+
+ strValues += strReadValue + " ";
+
+ uiOffset += uiSize;
+ }
+}
+
+string CArrayParameter::getIndexAsString(uint32_t uiIndex)
+{
+ ostringstream strStream;
+
+ strStream << uiIndex;
+
+ return strStream.str();
+}
diff --git a/parameter/ArrayParameter.h b/parameter/ArrayParameter.h
new file mode 100644
index 0000000..b102d06
--- /dev/null
+++ b/parameter/ArrayParameter.h
@@ -0,0 +1,65 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Parameter.h"
+
+class CArrayParameter : public CParameter
+{
+public:
+ CArrayParameter(const string& strName, const CTypeElement* pTypeElement, uint32_t uiLength);
+
+ // Instantiation, allocation
+ virtual uint32_t getFootPrint() const;
+
+ // XML configuration settings parsing
+ virtual bool serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+protected:
+ // User set/get
+ virtual bool setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const;
+ virtual bool getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const;
+ virtual void logValue(string& strValue, CErrorContext& errorContext) const;
+ // Used for simulation only
+ virtual void setDefaultValues(CParameterAccessContext& parameterAccessContext) const;
+
+private:
+ // Common set value processing
+ bool setValues(uint32_t uiStartIndex, uint32_t uiBaseOffset, const string& strValue, CParameterAccessContext& parameterContext) const;
+ // Log / get values common
+ void getValues(uint32_t uiBaseOffset, string& strValues, CParameterAccessContext& parameterContext) const;
+ // Index retrieval from user set/get request
+ bool getIndex(CPathNavigator& pathNavigator, uint32_t& uiIndex, CErrorContext& errorContext) const;
+ // Int to string conversion utility
+ static string getIndexAsString(uint32_t uiIndex);
+
+ // Array length
+ uint32_t _uiLength;
+};
diff --git a/parameter/AutoLog.cpp b/parameter/AutoLog.cpp
new file mode 100644
index 0000000..b01c444
--- /dev/null
+++ b/parameter/AutoLog.cpp
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "AutoLog.h"
+
+CAutoLog::CAutoLog(const CElement* pElement, const string& strContext) : _pElement(pElement), _strContext(strContext)
+{
+ // Log
+ _pElement->doLog(_strContext + " {");
+
+ // Nest
+ _pElement->nestLog();
+}
+
+CAutoLog::~CAutoLog()
+{
+ // Unnest
+ _pElement->unnestLog();
+
+ // Log
+ _pElement->doLog( "} " + _strContext);
+}
diff --git a/parameter/AutoLog.h b/parameter/AutoLog.h
new file mode 100644
index 0000000..cdbc769
--- /dev/null
+++ b/parameter/AutoLog.h
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CAutoLog
+{
+public:
+ CAutoLog(const CElement* pElement, const string& strContext);
+ ~CAutoLog();
+
+private:
+ // Logger element
+ const CElement* _pElement;
+ // Context
+ string _strContext;
+};
+
diff --git a/parameter/BackSynchronizer.cpp b/parameter/BackSynchronizer.cpp
new file mode 100644
index 0000000..6c46170
--- /dev/null
+++ b/parameter/BackSynchronizer.cpp
@@ -0,0 +1,39 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BackSynchronizer.h"
+#include "ConfigurableElement.h"
+
+CBackSynchronizer::CBackSynchronizer(const CConfigurableElement* pConfigurableElement)
+ : _configurableElementAggregator(_needingBackSyncList, &CConfigurableElement::hasNoValidDomainAssociated)
+{
+ // Aggegate elements
+ _configurableElementAggregator.aggegate(pConfigurableElement);
+}
diff --git a/parameter/BackSynchronizer.h b/parameter/BackSynchronizer.h
new file mode 100644
index 0000000..56caf94
--- /dev/null
+++ b/parameter/BackSynchronizer.h
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ConfigurableElementAggregator.h"
+#include <string>
+
+using namespace std;
+
+class CParameterBlackboard;
+
+class CBackSynchronizer
+{
+public:
+ CBackSynchronizer(const CConfigurableElement* pConfigurableElement);
+
+ // Back synchronization
+ virtual bool sync() = 0;
+
+protected:
+ // Aggegate list
+ list<const CConfigurableElement*> _needingBackSyncList;
+private:
+ // Aggegator
+ CConfigurableElementAggregator _configurableElementAggregator;
+};
+
diff --git a/parameter/BinarySerializableElement.cpp b/parameter/BinarySerializableElement.cpp
new file mode 100644
index 0000000..718ba4a
--- /dev/null
+++ b/parameter/BinarySerializableElement.cpp
@@ -0,0 +1,71 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BinarySerializableElement.h"
+
+#define base CElement
+
+CBinarySerializableElement::CBinarySerializableElement(const string& strName) : base(strName)
+{
+}
+
+// Binary Serialization
+void CBinarySerializableElement::binarySerialize(CBinaryStream& binaryStream)
+{
+ // Propagate
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ CBinarySerializableElement* pChild = static_cast<CBinarySerializableElement*>(getChild(uiChild));
+
+ pChild->binarySerialize(binaryStream);
+ }
+}
+
+// Data size
+uint32_t CBinarySerializableElement::getDataSize() const
+{
+ // Propagate
+ uint32_t uiDataSize = 0;
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CBinarySerializableElement* pChild = static_cast<const CBinarySerializableElement*>(getChild(uiChild));
+
+ uiDataSize += pChild->getDataSize();
+ }
+
+ return uiDataSize;
+}
+
diff --git a/parameter/BinarySerializableElement.h b/parameter/BinarySerializableElement.h
new file mode 100644
index 0000000..bf27789
--- /dev/null
+++ b/parameter/BinarySerializableElement.h
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include "BinaryStream.h"
+
+class CBinarySerializableElement : public CElement
+{
+public:
+ CBinarySerializableElement(const string& strName);
+
+ // Serialization
+ virtual void binarySerialize(CBinaryStream& binaryStream);
+
+ // Data size
+ virtual uint32_t getDataSize() const;
+protected:
+};
diff --git a/parameter/BinaryStream.cpp b/parameter/BinaryStream.cpp
new file mode 100644
index 0000000..ee3beb1
--- /dev/null
+++ b/parameter/BinaryStream.cpp
@@ -0,0 +1,173 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BinaryStream.h"
+#include <string.h>
+#include <assert.h>
+
+using namespace std;
+
+CBinaryStream::CBinaryStream(const string& strFileName, bool bOut, uint32_t uiDataSize, uint8_t uiStructureChecksum) :
+ _strFileName(strFileName),
+ _bOut(bOut),
+ _uiDataSize(uiDataSize),
+ _uiStructureChecksum(uiStructureChecksum),
+ _puiData(new uint8_t[uiDataSize]),
+ _uiPos(0),
+ _bOpen(false)
+{
+}
+
+CBinaryStream::~CBinaryStream()
+{
+ delete [] _puiData;
+
+ if (_bOpen) {
+
+ close();
+ }
+}
+
+bool CBinaryStream::open(string& strError)
+{
+ assert(!_bOpen);
+
+ _fileStream.open(_strFileName.c_str(), (_bOut ? ios::out : ios::in|ios::ate)|ios::binary);
+
+ if (!_fileStream.is_open() || !_fileStream.good()) {
+
+ strError = string("Failed to ") + (_bOut ? "write" : "read") + "-open";
+
+ return false;
+ }
+ if (!_bOut) {
+
+ // Get file size
+ ifstream::pos_type uiFileSize = _fileStream.tellg();
+
+ // Validate file size
+ if (_uiDataSize + sizeof(_uiStructureChecksum) != (uint32_t)uiFileSize) {
+
+ // Size different from expected
+ strError = "Unexpected file size";
+
+ return false;
+ }
+
+ // Back to beginning of file
+ _fileStream.seekg(0, ios::beg);
+
+ // Get data
+ _fileStream.read((char*)_puiData, _uiDataSize);
+
+ // File checksum
+ uint8_t uiFileChecksum;
+ _fileStream.read((char*)&uiFileChecksum, sizeof(uiFileChecksum));
+
+ // Data checksum
+ uint8_t uiDataChecksum = computeChecksum();
+
+ // Validate checksum
+ if (uiDataChecksum != uiFileChecksum) {
+
+ strError = "Integrity checks failed";
+
+ return false;
+ }
+ }
+
+ // Keep track
+ _bOpen = true;
+
+ return true;
+}
+
+void CBinaryStream::close()
+{
+ assert(_bOpen);
+
+ if (_bOut) {
+
+ // Get data
+ _fileStream.write((const char*)_puiData, _uiDataSize);
+
+ // Compute checksum
+ uint8_t uiDataChecksum = computeChecksum();
+
+ // Write checksum
+ _fileStream.write((const char*)&uiDataChecksum, sizeof(uiDataChecksum));
+ }
+
+ // Keep track
+ _bOpen = false;
+
+ // Close file
+ _fileStream.close();
+}
+
+void CBinaryStream::reset()
+{
+ _uiPos = 0;
+}
+
+void CBinaryStream::write(const uint8_t* puiData, uint32_t uiSize)
+{
+ assert(_uiPos + uiSize <= _uiDataSize);
+
+ memcpy(&_puiData[_uiPos], puiData, uiSize);
+
+ _uiPos += uiSize;
+}
+
+void CBinaryStream::read(uint8_t* puiData, uint32_t uiSize)
+{
+ assert(_uiPos + uiSize <= _uiDataSize);
+
+ memcpy(puiData, &_puiData[_uiPos], uiSize);
+
+ _uiPos += uiSize;
+}
+
+uint8_t CBinaryStream::computeChecksum() const
+{
+ uint32_t uiIndex;
+ uint8_t uiDataChecksum = _uiStructureChecksum;
+
+ for (uiIndex = 0; uiIndex < _uiDataSize; uiIndex++) {
+
+ uiDataChecksum += _puiData[uiIndex];
+ }
+ return uiDataChecksum;
+}
+
+bool CBinaryStream::isOut() const
+{
+ return _bOut;
+}
diff --git a/parameter/BinaryStream.h b/parameter/BinaryStream.h
new file mode 100644
index 0000000..fdac4eb
--- /dev/null
+++ b/parameter/BinaryStream.h
@@ -0,0 +1,78 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <string>
+#include <fstream>
+
+using namespace std;
+
+class CBinaryStream
+{
+public:
+ CBinaryStream(const string& strFileName, bool bOut, uint32_t uiDataSize, uint8_t uiStructureChecksum);
+ ~CBinaryStream();
+
+ // Open close
+ bool open(string& strError);
+ void close();
+
+ // Seek
+ void reset();
+
+ // Read/Write
+ void write(const uint8_t* puiData, uint32_t uiSize);
+ void read(uint8_t* puiData, uint32_t uiSize);
+
+ // Direction
+ bool isOut() const;
+private:
+ // Checksum
+ uint8_t computeChecksum() const;
+
+ // File name
+ string _strFileName;
+ // Serialization direction
+ bool _bOut;
+ uint32_t _uiDataSize;
+ // System structure checksum
+ uint8_t _uiStructureChecksum;
+ // Read/Write data
+ uint8_t* _puiData;
+ // File
+ fstream _fileStream;
+ // Ops in faile
+ uint32_t _uiPos;
+ // File state
+ bool _bOpen;
+};
+
diff --git a/parameter/BitParameter.cpp b/parameter/BitParameter.cpp
new file mode 100644
index 0000000..f687544
--- /dev/null
+++ b/parameter/BitParameter.cpp
@@ -0,0 +1,180 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BitParameter.h"
+#include "BitParameterType.h"
+#include "ParameterAccessContext.h"
+#include "ConfigurationAccessContext.h"
+#include "ParameterBlackboard.h"
+#include "BitParameterBlock.h"
+
+#define base CInstanceConfigurableElement
+
+CBitParameter::CBitParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
+{
+}
+
+// Type
+CInstanceConfigurableElement::Type CBitParameter::getType() const
+{
+ return EBitParameter;
+}
+
+// Size
+uint32_t CBitParameter::getSize() const
+{
+ return static_cast<const CBitParameterBlock*>(getParent())->getSize();
+}
+
+// XML configuration settings parsing/composing
+bool CBitParameter::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Handle access
+ if (!configurationAccessContext.serializeOut()) {
+
+ // Write to blackboard
+ if (!doSetValue(xmlConfigurableElementSettingsElement.getTextContent(), getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext)) {
+
+ // Append parameter path to error
+ configurationAccessContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ } else {
+
+ // Get string value
+ string strValue;
+
+ doGetValue(strValue, getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext);
+
+ // Populate value into xml text node
+ xmlConfigurableElementSettingsElement.setTextContent(strValue);
+ }
+
+ // Done
+ return true;
+}
+
+uint32_t CBitParameter::getFootPrint() const
+{
+ // Allocation made on parent side
+ return 0;
+}
+
+// Dump
+void CBitParameter::logValue(string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Dump value
+ doGetValue(strValue, getOffset(), parameterContext);
+}
+
+// Parameter Access
+bool CBitParameter::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
+{
+ // Check path validity
+ if (!checkPathExhausted(pathNavigator, errorContext)) {
+
+ return false;
+ }
+ // Parameter context
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Set Value
+ if (!doSetValue(strValue, getOffset(), parameterContext)) {
+
+ // Append parameter path to error
+ parameterContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ // Synchronize
+ if (!sync(parameterContext)) {
+
+ // Append parameter path to error
+ parameterContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ return true;
+}
+
+bool CBitParameter::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
+{
+ // Check path validity
+ if (!checkPathExhausted(pathNavigator, errorContext)) {
+
+ return false;
+ }
+ // Parameter context
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Get Value
+ doGetValue(strValue, getOffset(), parameterContext);
+
+ return true;
+}
+
+bool CBitParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
+{
+ uint32_t uiData = 0;
+
+ // Read/modify/write
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
+
+ // Convert
+ if (!static_cast<const CBitParameterType*>(getTypeElement())->asInteger(strValue, uiData, parameterAccessContext)) {
+
+ return false;
+ }
+ // Write blackboard
+ pBlackboard->write(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
+
+ return true;
+}
+
+void CBitParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
+{
+ uint32_t uiData = 0;
+
+ // Read blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
+
+ // Convert
+ static_cast<const CBitParameterType*>(getTypeElement())->asString(uiData, strValue);
+}
+
diff --git a/parameter/BitParameter.h b/parameter/BitParameter.h
new file mode 100644
index 0000000..15be074
--- /dev/null
+++ b/parameter/BitParameter.h
@@ -0,0 +1,66 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+
+#include "InstanceConfigurableElement.h"
+
+class CParameterAccessContext;
+class CConfigurationAccessContext;
+
+class CBitParameter : public CInstanceConfigurableElement
+{
+public:
+ CBitParameter(const string& strName, const CTypeElement* pTypeElement);
+
+ // Instantiation, allocation
+ virtual uint32_t getFootPrint() const;
+
+ // Type
+ virtual Type getType() const;
+
+ // XML configuration settings parsing/composing
+ virtual bool serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+protected:
+ // Parameter Access
+ virtual bool setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const;
+ virtual bool getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const;
+ virtual void logValue(string& strValue, CErrorContext& errorContext) const;
+private:
+ // Size
+ uint32_t getSize() const;
+
+ // Actual Access
+ bool doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const;
+ void doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const;
+
+};
diff --git a/parameter/BitParameterBlock.cpp b/parameter/BitParameterBlock.cpp
new file mode 100644
index 0000000..61a38c9
--- /dev/null
+++ b/parameter/BitParameterBlock.cpp
@@ -0,0 +1,71 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BitParameterBlock.h"
+#include "BitParameterBlockType.h"
+#include "ParameterAccessContext.h"
+#include "ParameterBlackboard.h"
+
+#define base CInstanceConfigurableElement
+
+CBitParameterBlock::CBitParameterBlock(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
+{
+}
+
+CInstanceConfigurableElement::Type CBitParameterBlock::getType() const
+{
+ return EBitParameterBlock;
+}
+
+// Instantiation, allocation
+uint32_t CBitParameterBlock::getFootPrint() const
+{
+ return getSize();
+}
+
+// Size
+uint32_t CBitParameterBlock::getSize() const
+{
+ return static_cast<const CBitParameterBlockType*>(getTypeElement())->getSize();
+}
+
+// Used for simulation only
+void CBitParameterBlock::setDefaultValues(CParameterAccessContext& parameterAccessContext) const
+{
+ // Get default value from type
+ uint32_t uiDefaultValue = 0;
+
+ // Write blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->write(&uiDefaultValue, getSize(), getOffset(), parameterAccessContext.isBigEndianSubsystem());
+}
+
diff --git a/parameter/BitParameterBlock.h b/parameter/BitParameterBlock.h
new file mode 100644
index 0000000..c58859f
--- /dev/null
+++ b/parameter/BitParameterBlock.h
@@ -0,0 +1,52 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "InstanceConfigurableElement.h"
+
+class CBitParameterBlock : public CInstanceConfigurableElement
+{
+public:
+ CBitParameterBlock(const string& strName, const CTypeElement* pTypeElement);
+
+ // Instantiation, allocation
+ virtual uint32_t getFootPrint() const;
+
+ // Type
+ virtual Type getType() const;
+
+ // Size
+ uint32_t getSize() const;
+
+ // Used for simulation only
+ virtual void setDefaultValues(CParameterAccessContext& parameterAccessContext) const;
+};
+
diff --git a/parameter/BitParameterBlockType.cpp b/parameter/BitParameterBlockType.cpp
new file mode 100644
index 0000000..fa4be1b
--- /dev/null
+++ b/parameter/BitParameterBlockType.cpp
@@ -0,0 +1,70 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BitParameterBlockType.h"
+#include "BitParameterBlock.h"
+
+#define base CTypeElement
+
+CBitParameterBlockType::CBitParameterBlockType(const string& strName) : base(strName), _uiSize(0)
+{
+}
+
+string CBitParameterBlockType::getKind() const
+{
+ return "BitParameterBlock";
+}
+
+bool CBitParameterBlockType::childrenAreDynamic() const
+{
+ return true;
+}
+
+// Size
+uint32_t CBitParameterBlockType::getSize() const
+{
+ return _uiSize;
+}
+
+// From IXmlSink
+bool CBitParameterBlockType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Size
+ _uiSize = xmlElement.getAttributeInteger("Size") / 8;
+
+ // Base
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+// Instantiation
+CInstanceConfigurableElement* CBitParameterBlockType::doInstantiate() const
+{
+ return new CBitParameterBlock(getName(), this);
+}
diff --git a/parameter/BitParameterBlockType.h b/parameter/BitParameterBlockType.h
new file mode 100644
index 0000000..586aee6
--- /dev/null
+++ b/parameter/BitParameterBlockType.h
@@ -0,0 +1,56 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "TypeElement.h"
+
+class CBitParameterBlockType : public CTypeElement
+{
+public:
+ CBitParameterBlockType(const string& strName);
+
+ // Size
+ uint32_t getSize() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // CElement
+ virtual string getKind() const;
+private:
+ virtual bool childrenAreDynamic() const;
+ // Instantiation
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+
+ // Size in bytes
+ uint32_t _uiSize;
+};
+
diff --git a/parameter/BitParameterType.cpp b/parameter/BitParameterType.cpp
new file mode 100644
index 0000000..e12cd60
--- /dev/null
+++ b/parameter/BitParameterType.cpp
@@ -0,0 +1,136 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BitParameterType.h"
+#include "BitParameter.h"
+#include <stdlib.h>
+#include <sstream>
+#include "ParameterAccessContext.h"
+#include "BitParameterBlockType.h"
+
+#define base CTypeElement
+
+CBitParameterType::CBitParameterType(const string& strName) : base(strName), _uiBitPos(0), _uiBitSize(0)
+{
+}
+
+// CElement
+string CBitParameterType::getKind() const
+{
+ return "BitParameter";
+}
+
+// From IXmlSink
+bool CBitParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Pos
+ _uiBitPos = xmlElement.getAttributeInteger("Pos");
+
+ // Size
+ _uiBitSize = xmlElement.getAttributeInteger("Size");
+
+ // TODO: Validate bit pos and size still fit into parent type
+ const CBitParameterBlockType* pBitParameterBlockType = static_cast<const CBitParameterBlockType*>(getParent());
+
+ uint32_t uiParentBlockBitSize = pBitParameterBlockType->getSize() << 3;
+
+ if (_uiBitPos + _uiBitSize > uiParentBlockBitSize) {
+
+ // Range exceeded
+ ostringstream strStream;
+
+ strStream << "Pos and Size attributes inconsistent with maximum container element size (" << uiParentBlockBitSize << " bits) for " + getKind();
+
+ serializingContext.setError(strStream.str());
+
+ return false;
+ }
+
+ // Base
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+// Conversion
+bool CBitParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const
+{
+ uint32_t uiConvertedValue = strtoul(strValue.c_str(), NULL, 0);
+
+ if (uiConvertedValue > getMaxValue()) {
+
+ // Range exceeded
+ ostringstream strStream;
+
+ strStream << strValue << " value out of range [0, " << getMaxValue() << "] for " + getKind();
+
+ parameterAccessContext.setError(strStream.str());
+
+ return false;
+ }
+
+ // Do bitwise operation
+ uiValue = (uiValue & ~getMask()) | (uiConvertedValue << _uiBitPos);
+
+ return true;
+}
+
+void CBitParameterType::asString(const uint32_t& uiValue, string& strValue) const
+{
+ uint32_t uiConvertedValue = (uiValue & getMask()) >> _uiBitPos;
+
+ // Format
+ ostringstream strStream;
+
+ strStream << uiConvertedValue;
+
+ strValue = strStream.str();
+}
+
+// Bit Size
+uint32_t CBitParameterType::getBitSize() const
+{
+ return _uiBitSize;
+}
+
+CInstanceConfigurableElement* CBitParameterType::doInstantiate() const
+{
+ return new CBitParameter(getName(), this);
+}
+
+// Max value
+uint32_t CBitParameterType::getMaxValue() const
+{
+ return (1 << _uiBitSize) - 1;
+}
+
+// Biwise mask
+uint32_t CBitParameterType::getMask() const
+{
+ return getMaxValue() << _uiBitPos;
+}
diff --git a/parameter/BitParameterType.h b/parameter/BitParameterType.h
new file mode 100644
index 0000000..2a94922
--- /dev/null
+++ b/parameter/BitParameterType.h
@@ -0,0 +1,68 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+
+#include "TypeElement.h"
+
+class CParameterAccessContext;
+
+class CBitParameterType : public CTypeElement
+{
+public:
+ CBitParameterType(const string& strName);
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Conversion
+ bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
+ void asString(const uint32_t& uiValue, string& strValue) const;
+
+ // Bit Size
+ uint32_t getBitSize() const;
+
+ // CElement
+ virtual string getKind() const;
+private:
+ // Instantiation
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+ // Max value
+ uint32_t getMaxValue() const;
+ // Biwise mask
+ uint32_t getMask() const;
+
+ // Pos in bits
+ uint32_t _uiBitPos;
+ // Size in bits
+ uint32_t _uiBitSize;
+};
diff --git a/parameter/BooleanParameterType.cpp b/parameter/BooleanParameterType.cpp
new file mode 100644
index 0000000..d84d683
--- /dev/null
+++ b/parameter/BooleanParameterType.cpp
@@ -0,0 +1,73 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "BooleanParameterType.h"
+#include "ParameterAccessContext.h"
+
+#define base CParameterType
+
+CBooleanParameterType::CBooleanParameterType(const string& strName) : base(strName)
+{
+ setSize(1);
+}
+
+CBooleanParameterType::~CBooleanParameterType()
+{
+}
+
+string CBooleanParameterType::getKind() const
+{
+ return "BooleanParameter";
+}
+
+bool CBooleanParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const
+{
+ if (strValue == "1") {
+
+ uiValue = true;
+ } else if (strValue == "0") {
+
+ uiValue = false;
+ } else {
+
+ parameterAccessContext.setError(strValue + " value not part of numerical space {0, 1} for " + getKind());
+
+ return false;
+ }
+
+ return true;
+}
+
+void CBooleanParameterType::asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const
+{
+ (void)parameterAccessContext;
+
+ strValue = uiValue ? "1" : "0";
+}
diff --git a/parameter/BooleanParameterType.h b/parameter/BooleanParameterType.h
new file mode 100644
index 0000000..1bf0a5a
--- /dev/null
+++ b/parameter/BooleanParameterType.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterType.h"
+
+class CBooleanParameterType : public CParameterType
+{
+public:
+ CBooleanParameterType(const string& strName);
+ virtual ~CBooleanParameterType();
+
+ virtual string getKind() const;
+ virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
+ virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const;
+};
diff --git a/parameter/Component.cpp b/parameter/Component.cpp
new file mode 100644
index 0000000..66c9893
--- /dev/null
+++ b/parameter/Component.cpp
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Component.h"
+#include "ComponentLibrary.h"
+#include "Mapper.h"
+
+#define base CParameterBlock
+
+CComponent::CComponent(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
+{
+}
+
+CInstanceConfigurableElement::Type CComponent::getType() const
+{
+ return EComponent;
+}
diff --git a/parameter/Component.h b/parameter/Component.h
new file mode 100644
index 0000000..d43e6e8
--- /dev/null
+++ b/parameter/Component.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterBlock.h"
+
+class CComponent : public CParameterBlock
+{
+public:
+ CComponent(const string& strName, const CTypeElement* pTypeElement);
+
+ // Type
+ virtual Type getType() const;
+private:
+};
+
diff --git a/parameter/ComponentInstance.cpp b/parameter/ComponentInstance.cpp
new file mode 100644
index 0000000..12566d5
--- /dev/null
+++ b/parameter/ComponentInstance.cpp
@@ -0,0 +1,102 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ComponentInstance.h"
+#include "ComponentLibrary.h"
+#include "ComponentType.h"
+#include "Component.h"
+#include "XmlParameterSerializingContext.h"
+
+#define base CTypeElement
+
+CComponentInstance::CComponentInstance(const string& strName) : base(strName), _pComponentType(NULL)
+{
+}
+
+string CComponentInstance::getKind() const
+{
+ return "Component";
+}
+
+bool CComponentInstance::childrenAreDynamic() const
+{
+ return true;
+}
+
+bool CComponentInstance::getMappingData(const string& strKey, string& strValue) const
+{
+ // Try myself first then associated component type
+ return base::getMappingData(strKey, strValue) || (_pComponentType && _pComponentType->getMappingData(strKey, strValue));
+}
+
+bool CComponentInstance::hasMappingData() const
+{
+ // Try myself first then extended component type
+ return base::hasMappingData() || (_pComponentType && _pComponentType->hasMappingData());
+}
+
+bool CComponentInstance::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ CXmlParameterSerializingContext& parameterBuildContext = static_cast<CXmlParameterSerializingContext&>(serializingContext);
+
+ const CComponentLibrary* pComponentLibrary = parameterBuildContext.getComponentLibrary();
+
+ string strComponentType = xmlElement.getAttributeString("Type");
+
+ _pComponentType = pComponentLibrary->getComponentType(strComponentType);
+
+ if (!_pComponentType) {
+
+ serializingContext.setError("Unable to create Component " + xmlElement.getPath() + ". ComponentType " + strComponentType + " not found!");
+
+ return false;
+ }
+ if (_pComponentType == getParent()) {
+
+ serializingContext.setError("Recursive definition of " + _pComponentType->getName() + " due to " + xmlElement.getPath() + " referring to one of its own type.");
+
+ return false;
+ }
+
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+CInstanceConfigurableElement* CComponentInstance::doInstantiate() const
+{
+ return new CComponent(getName(), this);
+}
+
+void CComponentInstance::populate(CElement* pElement) const
+{
+ base::populate(pElement);
+
+ _pComponentType->populate(static_cast<CComponent*>(pElement));
+}
diff --git a/parameter/ComponentInstance.h b/parameter/ComponentInstance.h
new file mode 100644
index 0000000..dffab7f
--- /dev/null
+++ b/parameter/ComponentInstance.h
@@ -0,0 +1,58 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "TypeElement.h"
+
+class CComponentType;
+
+class CComponentInstance : public CTypeElement
+{
+public:
+ CComponentInstance(const string& strName);
+
+ // Mapping info
+ virtual bool getMappingData(const string& strKey, string& strValue) const;
+ virtual bool hasMappingData() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // CElement
+ virtual string getKind() const;
+private:
+ virtual bool childrenAreDynamic() const;
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+ virtual void populate(CElement* pElement) const;
+
+ const CComponentType* _pComponentType;
+};
+
diff --git a/parameter/ComponentLibrary.cpp b/parameter/ComponentLibrary.cpp
new file mode 100644
index 0000000..f29f2d7
--- /dev/null
+++ b/parameter/ComponentLibrary.cpp
@@ -0,0 +1,53 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ComponentLibrary.h"
+#include "ComponentType.h"
+#include <assert.h>
+
+CComponentLibrary::CComponentLibrary()
+{
+}
+
+bool CComponentLibrary::childrenAreDynamic() const
+{
+ return true;
+}
+
+string CComponentLibrary::getKind() const
+{
+ return "ComponentLibrary";
+}
+
+const CComponentType* CComponentLibrary::getComponentType(const string& strName) const
+{
+ return static_cast<const CComponentType*>(findChild(strName));
+}
+
diff --git a/parameter/ComponentLibrary.h b/parameter/ComponentLibrary.h
new file mode 100644
index 0000000..e5c246e
--- /dev/null
+++ b/parameter/ComponentLibrary.h
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElement.h"
+#include "Element.h"
+#include "Component.h"
+
+class CComponentType;
+
+class CComponentLibrary : public CElement
+{
+public:
+ CComponentLibrary();
+
+ const CComponentType* getComponentType(const string& strName) const;
+
+ virtual string getKind() const;
+private:
+ virtual bool childrenAreDynamic() const;
+};
diff --git a/parameter/ComponentType.cpp b/parameter/ComponentType.cpp
new file mode 100644
index 0000000..ee83464
--- /dev/null
+++ b/parameter/ComponentType.cpp
@@ -0,0 +1,122 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ComponentType.h"
+#include "ComponentLibrary.h"
+#include "TypeElement.h"
+#include "XmlParameterSerializingContext.h"
+#include <assert.h>
+
+#define base CTypeElement
+
+CComponentType::CComponentType(const string& strName) : base(strName), _pExtendsComponentType(NULL)
+{
+}
+
+string CComponentType::getKind() const
+{
+ return "ComponentType";
+}
+
+bool CComponentType::childrenAreDynamic() const
+{
+ return true;
+}
+
+bool CComponentType::getMappingData(const string& strKey, string& strValue) const
+{
+ // Try myself first then extended component type
+ return base::getMappingData(strKey, strValue) || (_pExtendsComponentType && _pExtendsComponentType->getMappingData(strKey, strValue));
+}
+
+bool CComponentType::hasMappingData() const
+{
+ // Try myself first then extended component type
+ return base::hasMappingData() || (_pExtendsComponentType && _pExtendsComponentType->hasMappingData());
+}
+
+bool CComponentType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ CXmlParameterSerializingContext& parameterBuildContext = static_cast<CXmlParameterSerializingContext&>(serializingContext);
+
+ const CComponentLibrary* pComponentLibrary = parameterBuildContext.getComponentLibrary();
+
+ // Populate children
+ if (!base::fromXml(xmlElement, serializingContext)) {
+
+ return false;
+ }
+
+ // Check for Extends attribute (extensions will be populated after and not before)
+ if (xmlElement.hasAttribute("Extends")) {
+
+ string strExtendsType = xmlElement.getAttributeString("Extends");
+
+ _pExtendsComponentType = pComponentLibrary->getComponentType(strExtendsType);
+
+ if (!_pExtendsComponentType) {
+
+ serializingContext.setError("ComponentType " + strExtendsType + " referred to by " + xmlElement.getPath() + " not found!");
+
+ return false;
+ }
+
+ if (_pExtendsComponentType == this) {
+
+ serializingContext.setError("Recursive ComponentType definition of " + xmlElement.getPath());
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void CComponentType::populate(CElement* pElement) const
+{
+ // Populate children
+ base::populate(pElement);
+
+ // Manage extended type
+ if (_pExtendsComponentType) {
+
+ // Populate from extended type
+ _pExtendsComponentType->populate(pElement);
+ }
+}
+
+CInstanceConfigurableElement* CComponentType::doInstantiate() const
+{
+ // Not supposed to be called directly (instantiation made through CComponentInstance object)
+ assert(0);
+
+ return NULL;
+}
diff --git a/parameter/ComponentType.h b/parameter/ComponentType.h
new file mode 100644
index 0000000..0bd311b
--- /dev/null
+++ b/parameter/ComponentType.h
@@ -0,0 +1,60 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "TypeElement.h"
+
+class CInstanceConfigurableElement;
+
+class CComponentType : public CTypeElement
+{
+public:
+ CComponentType(const string& strName);
+
+ void populate(CElement* pElement) const;
+
+ // Mapping info
+ virtual bool getMappingData(const string& strKey, string& strValue) const;
+ virtual bool hasMappingData() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+ // CElement
+ virtual string getKind() const;
+private:
+ // CElement
+ virtual bool childrenAreDynamic() const;
+ // Component creation
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+
+ // Ref
+ const CComponentType* _pExtendsComponentType;
+};
diff --git a/parameter/CompoundRule.cpp b/parameter/CompoundRule.cpp
new file mode 100644
index 0000000..6078a2d
--- /dev/null
+++ b/parameter/CompoundRule.cpp
@@ -0,0 +1,87 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "CompoundRule.h"
+
+#define base CRule
+
+CCompoundRule::CCompoundRule() : _bTypeAll(false)
+{
+}
+
+// Class kind
+string CCompoundRule::getKind() const
+{
+ return "CompoundRule";
+}
+
+// Returns true if children dynamic creation is to be dealt with
+bool CCompoundRule::childrenAreDynamic() const
+{
+ return true;
+}
+
+// Rule check
+bool CCompoundRule::matches() const
+{
+ uint32_t uiChild;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CRule* pRule = static_cast<const CRule*>(getChild(uiChild));
+
+ if (pRule->matches() ^ _bTypeAll) {
+
+ return !_bTypeAll;
+ }
+ }
+ return _bTypeAll;
+}
+
+// From IXmlSink
+bool CCompoundRule::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Get type
+ _bTypeAll = xmlElement.getAttributeBoolean("Type", "All");
+
+ // Base
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+// From IXmlSource
+void CCompoundRule::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Set type
+ xmlElement.setAttributeString("Type", _bTypeAll ? "All" : "Any");
+
+ // Base
+ base::toXml(xmlElement, serializingContext);
+}
diff --git a/parameter/CompoundRule.h b/parameter/CompoundRule.h
new file mode 100644
index 0000000..9012a05
--- /dev/null
+++ b/parameter/CompoundRule.h
@@ -0,0 +1,57 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Rule.h"
+
+class CCompoundRule : public CRule
+{
+public:
+ CCompoundRule();
+
+ // Rule check
+ virtual bool matches() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // From IXmlSource
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
+ // Class kind
+ virtual string getKind() const;
+private:
+ // Returns true if children dynamic creation is to be dealt with
+ virtual bool childrenAreDynamic() const;
+
+ // Type
+ bool _bTypeAll;
+};
diff --git a/parameter/ComputedSizeParameter.cpp b/parameter/ComputedSizeParameter.cpp
new file mode 100644
index 0000000..4d263da
--- /dev/null
+++ b/parameter/ComputedSizeParameter.cpp
@@ -0,0 +1,90 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ComputedSizeParameter.h"
+#include "ConfigurableElement.h"
+#include "ParameterType.h"
+#include "InstanceConfigurableElement.h"
+#include "ComputedSizeParameterType.h"
+#include <assert.h>
+#include <sstream>
+#include "ParameterAccessContext.h"
+
+#define base CParameter
+
+CComputedSizeParameter::CComputedSizeParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement), _pReferredElement(NULL)
+{
+}
+
+uint32_t CComputedSizeParameter::getFootPrint() const
+{
+ // Virtual parameter
+ return 0;
+}
+
+bool CComputedSizeParameter::init(string& strError)
+{
+ // Seek referred parameter in parent hierarchy
+ const CElement* pParent = getParent();
+
+ assert(pParent);
+
+ _pReferredElement = static_cast<const CConfigurableElement*>(pParent->findChild(static_cast<const CComputedSizeParameterType*>(getTypeElement())->getReferredElementName()));
+
+ if (!_pReferredElement) {
+
+ strError = "Could not find referred Parameter " + getTypeElement()->getName() + " from " + getKind() + " " + getPath();
+
+ return false;
+ }
+
+ return true;
+}
+
+bool CComputedSizeParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext)
+{
+ // Read only kind of parameter, can't be set!
+ (void)strValue;
+ (void)uiOffset;
+
+ parameterAccessContext.setError("Read only parameter");
+
+ return false;
+}
+
+void CComputedSizeParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
+{
+ assert(_pReferredElement);
+ // Parameter can't be an array
+ assert(uiOffset == getOffset());
+
+ static_cast<const CParameterType*>(getTypeElement())->asString(_pReferredElement->getFootPrint(), strValue, parameterAccessContext);
+}
+
diff --git a/parameter/ComputedSizeParameter.h b/parameter/ComputedSizeParameter.h
new file mode 100644
index 0000000..99c1ad2
--- /dev/null
+++ b/parameter/ComputedSizeParameter.h
@@ -0,0 +1,51 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Parameter.h"
+
+class CConfigurableElement;
+
+class CComputedSizeParameter : public CParameter
+{
+public:
+ CComputedSizeParameter(const string& strName, const CTypeElement* pTypeElement);
+
+ virtual bool init(string& strError);
+
+ virtual uint32_t getFootPrint() const;
+protected:
+ virtual bool doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext);
+ virtual void doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const;
+private:
+ const CConfigurableElement* _pReferredElement;
+};
+
diff --git a/parameter/ComputedSizeParameterType.cpp b/parameter/ComputedSizeParameterType.cpp
new file mode 100644
index 0000000..02daf79
--- /dev/null
+++ b/parameter/ComputedSizeParameterType.cpp
@@ -0,0 +1,88 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ComputedSizeParameterType.h"
+#include "ComputedSizeParameter.h"
+#include <sstream>
+#include <stdlib.h>
+
+#define base CParameterType
+
+CComputedSizeParameterType::CComputedSizeParameterType(const string& strName) : base(strName)
+{
+}
+
+string CComputedSizeParameterType::getKind() const
+{
+ return "ComputedSizeParameter";
+}
+
+bool CComputedSizeParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Size
+ setSize(xmlElement.getAttributeInteger("Size") / 8);
+
+ _strReferredElementName = xmlElement.getAttributeString("Parameter");
+
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+bool CComputedSizeParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const
+{
+ (void)parameterAccessContext;
+
+ uiValue = strtoul(strValue.c_str(), NULL, 0);
+
+ return true;
+}
+
+void CComputedSizeParameterType::asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const
+{
+ (void)parameterAccessContext;
+
+ // Format
+ ostringstream strStream;
+
+ strStream << uiValue;
+
+ strValue = strStream.str();
+}
+
+const string& CComputedSizeParameterType::getReferredElementName() const
+{
+ return _strReferredElementName;
+}
+
+CInstanceConfigurableElement* CComputedSizeParameterType::doInstantiate() const
+{
+ // Scalar parameter
+ return new CComputedSizeParameter(getName(), this);
+}
+
diff --git a/parameter/ComputedSizeParameterType.h b/parameter/ComputedSizeParameterType.h
new file mode 100644
index 0000000..63ae6b3
--- /dev/null
+++ b/parameter/ComputedSizeParameterType.h
@@ -0,0 +1,54 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterType.h"
+
+class CComputedSizeParameterType : public CParameterType
+{
+public:
+ CComputedSizeParameterType(const string& strName);
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
+ virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const;
+ virtual string getKind() const;
+
+ const string& getReferredElementName() const;
+
+private:
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+
+ string _strReferredElementName;
+};
+
diff --git a/parameter/ConfigurableDomain.cpp b/parameter/ConfigurableDomain.cpp
new file mode 100644
index 0000000..807171f
--- /dev/null
+++ b/parameter/ConfigurableDomain.cpp
@@ -0,0 +1,922 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConfigurableDomain.h"
+#include "DomainConfiguration.h"
+#include "ConfigurableElement.h"
+#include "ConfigurationAccessContext.h"
+#include "Subsystem.h"
+#include "XmlDomainSerializingContext.h"
+#include <assert.h>
+
+#define base CBinarySerializableElement
+
+CConfigurableDomain::CConfigurableDomain(const string& strName) : base(strName), _pLastAppliedConfiguration(NULL)
+{
+}
+
+CConfigurableDomain::~CConfigurableDomain()
+{
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements for their syncers
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ CConfigurableElement* pConfigurableElement = *it;
+
+ // Remove from configurable element
+ pConfigurableElement->removeAttachedConfigurableDomain(this);
+ }
+}
+
+string CConfigurableDomain::getKind() const
+{
+ return "ConfigurableDomain";
+}
+
+bool CConfigurableDomain::childrenAreDynamic() const
+{
+ return true;
+}
+
+// From IXmlSource
+void CConfigurableDomain::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Configurations
+ composeDomainConfigurations(xmlElement, serializingContext);
+
+ // Configurable Elements
+ composeConfigurableElements(xmlElement, serializingContext);
+}
+
+// XML composing
+void CConfigurableDomain::composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Create Configurations element
+ CXmlElement xmlConfigurationsElement;
+
+ xmlElement.createChild(xmlConfigurationsElement, "Configurations");
+
+ // Delegate to base
+ base::toXml(xmlConfigurationsElement, serializingContext);
+}
+
+void CConfigurableDomain::composeConfigurableElements(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Context
+ const CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<const CXmlDomainSerializingContext&>(serializingContext);
+
+ // Create ConfigurableElements element
+ CXmlElement xmlConfigurableElementsElement;
+
+ xmlElement.createChild(xmlConfigurableElementsElement, "ConfigurableElements");
+
+ // Serialize out all configurable elements settings
+ ConfigurableElementListIterator it;
+
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ // Create corresponding XML child element
+ CXmlElement xmlChildConfigurableElement;
+
+ xmlConfigurableElementsElement.createChild(xmlChildConfigurableElement, "ConfigurableElement");
+
+ // Set Path attribute
+ xmlChildConfigurableElement.setAttributeString("Path", pConfigurableElement->getPath());
+
+ if (xmlDomainSerializingContext.withSettings()) {
+
+ // Compose configurations for that configurable element
+ composeConfigurableElementConfigurations(pConfigurableElement, xmlChildConfigurableElement, serializingContext);
+ }
+ }
+}
+
+// Serialize configurations for one configurable element
+void CConfigurableDomain::composeConfigurableElementConfigurations(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurableElementElement, CXmlSerializingContext& serializingContext) const
+{
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChildConfiguration;
+
+ for (uiChildConfiguration = 0; uiChildConfiguration < uiNbConfigurations; uiChildConfiguration++) {
+
+ const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChildConfiguration));
+
+ // Create child xml element for that configuration
+ CXmlElement xmlConfigurationSettingsElement;
+
+ xmlConfigurableElementElement.createChild(xmlConfigurationSettingsElement, pDomainConfiguration->getKind());
+
+ // Set its name attribute
+ xmlConfigurationSettingsElement.setNameAttribute(pDomainConfiguration->getName());
+
+ // Have domain configuration serialize settings for configurable element
+ ((CConfigurableDomain&)(*this)).serializeConfigurableElementConfiguration((CDomainConfiguration*)pDomainConfiguration, pConfigurableElement, xmlConfigurationSettingsElement, serializingContext, true);
+ }
+}
+
+// From IXmlSink
+bool CConfigurableDomain::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Local parsing. Do not dig
+ return parseDomainConfigurations(xmlElement, serializingContext) && parseConfigurableElements(xmlElement, serializingContext);
+}
+
+// XML parsing
+bool CConfigurableDomain::parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // We're supposedly clean
+ assert(_configurableElementList.empty());
+
+ // Get Configurations element
+ CXmlElement xmlConfigurationsElement;
+
+ xmlElement.getChildElement("Configurations", xmlConfigurationsElement);
+
+ // Parse it and create domain configuration objects
+ return base::fromXml(xmlConfigurationsElement, serializingContext);
+}
+
+// Parse configurable elements
+bool CConfigurableDomain::parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ const CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<const CXmlDomainSerializingContext&>(serializingContext);
+
+ // Get System Class Element
+ CElement* pRootElement = getRoot();
+
+ CElement* pSystemClassElement = pRootElement->findChildOfKind("SystemClass");
+
+ assert(pSystemClassElement);
+
+ // Get ConfigurableElements element
+ CXmlElement xmlConfigurableElementsElement;
+ xmlElement.getChildElement("ConfigurableElements", xmlConfigurableElementsElement);
+
+ // Parse it and associate found configurable elements to it
+ CXmlElement::CChildIterator it(xmlConfigurableElementsElement);
+
+ CXmlElement xmlConfigurableElementElement;
+
+ while (it.next(xmlConfigurableElementElement)) {
+
+ // Locate configurable element
+ string strConfigurableElementPath = xmlConfigurableElementElement.getAttributeString("Path");
+
+ CPathNavigator pathNavigator(strConfigurableElementPath);
+
+ string* pStrChildName = pathNavigator.next();
+
+ // Is there an element and does it match system class name?
+ if (!pStrChildName || *pStrChildName != pSystemClassElement->getName()) {
+
+ serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName());
+
+ return false;
+ }
+
+ // Browse system class for configurable element
+ CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(pSystemClassElement->findDescendant(pathNavigator));
+
+ if (!pConfigurableElement) {
+
+ serializingContext.setError("Could not find configurable element of path " + strConfigurableElementPath + " from ConfigurableDomain description " + getName());
+
+ return false;
+ }
+ // Add found element to domain
+ string strError;
+ if (!addConfigurableElement(pConfigurableElement, NULL, strError)) {
+
+ serializingContext.setError(strError);
+
+ return false;
+ }
+
+ // Check we need to parse configuration settings
+ if (xmlDomainSerializingContext.withSettings()) {
+
+ // Make Domain configuration parse associated configuration nodes if any
+ if (!parseConfigurableElementConfigurations(pConfigurableElement, xmlConfigurableElementElement, serializingContext)) {
+
+ return false;
+ }
+ }
+ }
+ // All provided configurations are parsed
+ // Attempt validation on areas of non provided configurations for all configurable elements
+ autoValidateAll();
+
+ return true;
+}
+
+// Parse configurations for one configurable element
+bool CConfigurableDomain::parseConfigurableElementConfigurations(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurableElementElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
+
+ // Parse configurable element's configuration settings
+ CXmlElement::CChildIterator it(xmlConfigurableElementElement);
+
+ CXmlElement xmlConfigurationSettingsElement;
+
+ while (it.next(xmlConfigurationSettingsElement)) {
+ // Get domain configuration
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(xmlConfigurationSettingsElement.getNameAttribute()));
+
+ if (!pDomainConfiguration) {
+
+ xmlDomainSerializingContext.setError("Could not find domain configuration referred to by configurable element of path " + xmlConfigurableElementElement.getPath() + " from ConfigurableDomain description " + getName());
+
+ return false;
+ }
+ // Have domain configuration parse settings for configurable element
+ if (!serializeConfigurableElementConfiguration(pDomainConfiguration, pConfigurableElement, xmlConfigurationSettingsElement, xmlDomainSerializingContext, false)) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// Serialize one configuration for one configurable element
+bool CConfigurableDomain::serializeConfigurableElementConfiguration(CDomainConfiguration* pDomainConfiguration, const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext, bool bSerializeOut)
+{
+ // Actual XML context
+ CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
+
+ // Change context type for parameter settings access
+ string strError;
+
+ // Create configuration access context
+ CConfigurationAccessContext configurationAccessContext(strError, bSerializeOut);
+
+ // Provide current value space
+ configurationAccessContext.setValueSpaceRaw(xmlDomainSerializingContext.valueSpaceIsRaw());
+
+ // Get subsystem
+ const CSubsystem* pSubsystem = pConfigurableElement->getBelongingSubsystem();
+
+ if (pSubsystem && pSubsystem != pConfigurableElement) {
+
+ // Element is a descendant of subsystem
+
+ // Deal with Endianness
+ configurationAccessContext.setBigEndianSubsystem(pSubsystem->isBigEndian());
+ }
+
+ // Have domain configuration parse settings for configurable element
+ if (!pDomainConfiguration->serializeXmlSettings(pConfigurableElement, xmlConfigurationSettingsElement, configurationAccessContext)) {
+
+ // Forward error
+ xmlDomainSerializingContext.setError(strError);
+
+ return false;
+ }
+ return true;
+}
+
+// Configurable elements association
+bool CConfigurableDomain::addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Already associated?
+ if (containsConfigurableElement(pConfigurableElement)) {
+
+ strError = "Configurable element " + pConfigurableElement->getPath() + " already associated to configuration domain " + getName();
+
+ return false;
+ }
+
+ // Already owned?
+ if (pConfigurableElement->belongsTo(this)) {
+
+ strError = "Configurable element " + pConfigurableElement->getPath() + " already owned by configuration domain " + getName();
+
+ return false;
+ }
+ log("Adding configurable element \"%s\" into domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
+
+ // Do add
+ doAddConfigurableElement(pConfigurableElement);
+
+ // Ensure area validity for that configurable element (if main blackboard provided)
+ if (pMainBlackboard) {
+
+ // Need to validate against main blackboard
+ validateAreas(pConfigurableElement, pMainBlackboard);
+ }
+
+ return true;
+}
+
+bool CConfigurableDomain::removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError)
+{
+ // Not associated?
+ if (!containsConfigurableElement(pConfigurableElement)) {
+
+ strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName();
+
+ return false;
+ }
+ log("Removing configurable element \"%s\" from domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
+
+ // Do remove
+ doRemoveConfigurableElement(pConfigurableElement, true);
+
+ return true;
+}
+
+// Domain splitting
+bool CConfigurableDomain::split(CConfigurableElement* pConfigurableElement, string& strError)
+{
+ // Not associated?
+ if (!containsConfigurableElement(pConfigurableElement)) {
+
+ strError = "Configurable element " + pConfigurableElement->getPath() + " not associated to configuration domain " + getName();
+
+ return false;
+ }
+ log("Splitting configurable element \"%s\" domain \"%s\"", pConfigurableElement->getPath().c_str(), getName().c_str());
+
+ // Create sub domain areas for all configurable element's children
+ uint32_t uiNbConfigurableElementChildren = pConfigurableElement->getNbChildren();
+
+ if (!uiNbConfigurableElementChildren) {
+
+ strError = "Configurable element " + pConfigurableElement->getPath() + " has no children to split configurable domain to";
+
+ return false;
+ }
+
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
+
+ CConfigurableElement* pChildConfigurableElement = static_cast<CConfigurableElement*>(pConfigurableElement->getChild(uiChild));
+
+ doAddConfigurableElement(pChildConfigurableElement);
+ }
+
+ // Delegate to configurations
+ uint32_t uiNbConfigurations = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ pDomainConfiguration->split(pConfigurableElement);
+ }
+
+ // Remove given configurable element from this domain
+ // Note: we shouldn't need to recompute the sync set in that case, as the splitted element should include the syncers of its children elements
+ doRemoveConfigurableElement(pConfigurableElement, false);
+
+ return true;
+}
+
+// Configuration application if required
+void CConfigurableDomain::apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet& syncerSet, bool bForce)
+{
+ if (bForce) {
+ // Force a configuration restore by forgetting about last applied configuration
+ _pLastAppliedConfiguration = NULL;
+ }
+ const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration();
+
+ if (pApplicableDomainConfiguration) {
+
+ // Check not the last one before applying
+ if (!_pLastAppliedConfiguration || _pLastAppliedConfiguration != pApplicableDomainConfiguration) {
+
+ log("Applying configuration \"%s\" from domain \"%s\"", pApplicableDomainConfiguration->getName().c_str(), getName().c_str());
+
+ // Do the restore
+ pApplicableDomainConfiguration->restore(pParameterBlackboard);
+
+ // Record last applied configuration
+ _pLastAppliedConfiguration = pApplicableDomainConfiguration;
+
+ // Since we applied changes, add our own sync set to the given one
+ syncerSet += _syncerSet;
+ }
+ }
+}
+
+// Return applicable configuration validity for given configurable element
+bool CConfigurableDomain::isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const
+{
+ const CDomainConfiguration* pApplicableDomainConfiguration = findApplicableDomainConfiguration();
+
+ return pApplicableDomainConfiguration && pApplicableDomainConfiguration->isValid(pConfigurableElement);
+}
+
+// Presence of application condition on any configuration
+bool CConfigurableDomain::hasRules() const
+{
+ // Delegate to configurations
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
+
+ if (pDomainConfiguration->hasRule()) {
+
+ return true;
+ }
+ }
+ return false;
+}
+
+// In case configurable element was removed
+void CConfigurableDomain::computeSyncSet()
+{
+ // Clean sync set first
+ _syncerSet.clear();
+
+ // Browse all configurable elements for their syncers
+ ConfigurableElementListIterator it;
+
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ pConfigurableElement->fillSyncerSet(_syncerSet);
+ }
+}
+
+// Configuration Management
+bool CConfigurableDomain::createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Already exists?
+ if (findChild(strName)) {
+
+ strError = "Already existing configuration";
+
+ return false;
+ }
+ log("Creating domain configuration \"%s\" into domain \"%s\"", strName.c_str(), getName().c_str());
+
+ // Creation
+ CDomainConfiguration* pDomainConfiguration = new CDomainConfiguration(strName);
+
+ // Configurable elements association
+ ConfigurableElementListIterator it;
+
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ pDomainConfiguration->addConfigurableElement(*it);
+ }
+
+ // Hierarchy
+ addChild(pDomainConfiguration);
+
+ // Ensure validity of fresh new domain configuration
+ // Attempt auto validation, so that the user gets his/her own settings by defaults
+ if (!autoValidateConfiguration(pDomainConfiguration)) {
+
+ // No valid configuration found to copy in from, validate againt main blackboard (will concerned remaining invalid parts)
+ pDomainConfiguration->validate(pMainBlackboard);
+ }
+
+ return true;
+}
+
+bool CConfigurableDomain::deleteConfiguration(const string& strName, string& strError)
+{
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strName));
+
+ if (!pDomainConfiguration) {
+
+ strError = "Configuration not found";
+
+ return false;
+ }
+
+ // Check configuration has no rule (prevent accidental loss of data)
+ if (pDomainConfiguration->hasRule()) {
+
+ strError = "Deletion of configuration containing application rules is not supported to prevent any accitental loss of data.\nPlease consider a direct modification of the XML file.";
+
+ return false;
+ }
+
+ log("Deleting configuration \"%s\" from domain \"%s\"", strName.c_str(), getName().c_str());
+
+ // Was the last applied?
+ if (pDomainConfiguration == _pLastAppliedConfiguration) {
+
+ // Forget about it
+ _pLastAppliedConfiguration = NULL;
+ }
+
+ // Hierarchy
+ removeChild(pDomainConfiguration);
+
+ // Destroy
+ delete pDomainConfiguration;
+
+ return true;
+}
+
+void CConfigurableDomain::listAssociatedToElements(string& strResult) const
+{
+ strResult = "\n";
+
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ strResult += pConfigurableElement->getPath() + "\n";
+ }
+}
+
+bool CConfigurableDomain::renameConfiguration(const string& strName, const string& strNewName, string& strError)
+{
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strName));
+
+ if (!pDomainConfiguration) {
+
+ strError = "Configuration not found";
+
+ return false;
+ }
+ log("Renaming domain \"%s\"'s configuration \"%s\" to \"%s\"", getName().c_str(), strName.c_str(), strNewName.c_str());
+
+ // Rename
+ return pDomainConfiguration->rename(strNewName, strError);
+}
+
+bool CConfigurableDomain::restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, string& strError)
+{
+ // Find Domain configuration
+ const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(findChild(strName));
+
+ if (!pDomainConfiguration) {
+
+ strError = "Domain configuration " + strName + " not found";
+
+ return false;
+ }
+ log("Restoring domain \"%s\"'s configuration \"%s\" to parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str());
+
+ // Delegate
+ pDomainConfiguration->restore(pMainBlackboard);
+
+ // Record last applied configuration
+ _pLastAppliedConfiguration = pDomainConfiguration;
+
+ // Synchronize
+ return !bAutoSync || _syncerSet.sync(*pMainBlackboard, false, strError);
+}
+
+bool CConfigurableDomain::saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Find Domain configuration
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(findChild(strName));
+
+ if (!pDomainConfiguration) {
+
+ strError = "Domain configuration " + strName + " not found";
+
+ return false;
+ }
+ log("Saving domain \"%s\"'s configuration \"%s\" from parameter blackboard", getName().c_str(), pDomainConfiguration->getName().c_str());
+
+ // Delegate
+ pDomainConfiguration->save(pMainBlackboard);
+
+ return true;
+}
+
+// Last applied configuration
+string CConfigurableDomain::getLastAppliedConfigurationName() const
+{
+ if (_pLastAppliedConfiguration) {
+
+ return _pLastAppliedConfiguration->getName();
+ }
+ return "<none>";
+}
+
+// Ensure validity on whole domain from main blackboard
+void CConfigurableDomain::validate(const CParameterBlackboard* pMainBlackboard)
+{
+ log("Validating whole domain \"" + getName() + "\" against main blackboard");
+
+ // Propagate
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ pDomainConfiguration->validate(pMainBlackboard);
+ }
+}
+
+// Ensure validity on areas related to configurable element
+void CConfigurableDomain::validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
+{
+ log("Validating domain \"" + getName() + "\" against main blackboard for configurable element \"" + pConfigurableElement->getPath() + "\"");
+
+ // Propagate
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ pDomainConfiguration->validate(pConfigurableElement, pMainBlackboard);
+ }
+}
+
+// Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain
+void CConfigurableDomain::autoValidateAll()
+{
+ // Validate
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements for configuration validation
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ // Auto validate element
+ autoValidateAreas(pConfigurableElement);
+ }
+}
+
+// Attempt validation for configurable element's areas, relying on already existing valid configuration inside domain
+void CConfigurableDomain::autoValidateAreas(const CConfigurableElement* pConfigurableElement)
+{
+ // Find first valid configuration for given configurable element
+ const CDomainConfiguration* pValidDomainConfiguration = findValidDomainConfiguration(pConfigurableElement);
+
+ // No valid configuration found, give up
+ if (!pValidDomainConfiguration) {
+
+ return;
+ }
+
+ log("Auto validating domain \"" + getName() + "\" against configuration \"" + pValidDomainConfiguration->getName() + "\" for configurable element " + pConfigurableElement->getPath());
+
+ // Validate all other configurations against found one, if any
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ if (pDomainConfiguration != pValidDomainConfiguration && !pDomainConfiguration->isValid(pConfigurableElement)) {
+ // Validate
+ pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement);
+ }
+ }
+}
+
+// Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain
+bool CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration)
+{
+ // Find another configuration than this one, that ought to be valid!
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ const CDomainConfiguration* pPotententialValidDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
+
+ if (pPotententialValidDomainConfiguration != pDomainConfiguration) {
+
+ // Validate against it
+ pDomainConfiguration->validateAgainst(pPotententialValidDomainConfiguration);
+
+ return true;
+ }
+ }
+ return false;
+}
+#if 0
+void CConfigurableDomain::autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration)
+{
+ // Validate
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements for configuration validation
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ // Find first valid configuration for given configurable element
+ const CDomainConfiguration* pValidDomainConfiguration = findValidDomainConfiguration(pConfigurableElement);
+
+ // Check valid configuration exists for that configurable element
+ if (pValidDomainConfiguration) {
+
+ // Called on purpose
+ assert(pValidDomainConfiguration != pDomainConfiguration);
+
+ // Validate
+ pDomainConfiguration->validateAgainst(pValidDomainConfiguration, pConfigurableElement);
+ }
+ }
+}
+#endif
+// Search for a valid configuration for given configurable element
+const CDomainConfiguration* CConfigurableDomain::findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const
+{
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
+
+ if (pDomainConfiguration->isValid(pConfigurableElement)) {
+
+ return pDomainConfiguration;
+ }
+ }
+ return NULL;
+}
+
+// Search for an applicable configuration
+const CDomainConfiguration* CConfigurableDomain::findApplicableDomainConfiguration() const
+{
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ const CDomainConfiguration* pDomainConfiguration = static_cast<const CDomainConfiguration*>(getChild(uiChild));
+
+ if (pDomainConfiguration->isApplicable()) {
+
+ return pDomainConfiguration;
+ }
+ }
+ return NULL;
+}
+
+// Gather set of configurable elements
+void CConfigurableDomain::gatherConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const
+{
+ // Insert all configurable elements
+ configurableElementSet.insert(_configurableElementList.begin(), _configurableElementList.end());
+}
+
+// Check configurable element already attached
+bool CConfigurableDomain::containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const
+{
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements for comparison
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ if (pConfigurableCandidateElement == *it) {
+
+ return true;
+ }
+ }
+ return false;
+}
+
+// Merge any descended configurable element to this one with this one
+void CConfigurableDomain::mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement)
+{
+ list<CConfigurableElement*> mergedConfigurableElementList;
+
+ ConfigurableElementListIterator it;
+
+ // Browse all configurable elements (new one not yet in the list!)
+ for (it = _configurableElementList.begin(); it != _configurableElementList.end(); ++it) {
+
+ CConfigurableElement* pConfigurablePotentialDescendantElement = *it;
+
+ if (pConfigurablePotentialDescendantElement->isDescendantOf(pNewConfigurableElement)) {
+
+ log("In domain \"%s\", merging descendant configurable element's configurations \"%s\" into its ascendant \"%s\" ones", getName().c_str(), pConfigurablePotentialDescendantElement->getName().c_str(), pNewConfigurableElement->getName().c_str());
+
+ // Merge configuration data
+ mergeConfigurations(pNewConfigurableElement, pConfigurablePotentialDescendantElement);
+
+ // Keep track for removal
+ mergedConfigurableElementList.push_back(pConfigurablePotentialDescendantElement);
+ }
+ }
+
+ // Remove all merged elements (new one not yet in the list!)
+ for (it = mergedConfigurableElementList.begin(); it != mergedConfigurableElementList.end(); ++it) {
+
+ CConfigurableElement* pMergedConfigurableElement = *it;
+
+ // Remove merged from configurable element from internal tracking list
+ // Note: we shouldn't need to recompute the sync set in that case, as the merged to element should include the syncers of merged from elements
+ doRemoveConfigurableElement(pMergedConfigurableElement, false);
+ }
+}
+
+void CConfigurableDomain::mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
+{
+ // Propagate to domain configurations
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ // Do the merge.
+ pDomainConfiguration->merge(pToConfigurableElement, pFromConfigurableElement);
+ }
+}
+
+// Configurable elements association
+void CConfigurableDomain::doAddConfigurableElement(CConfigurableElement* pConfigurableElement)
+{
+ // Inform configurable element
+ pConfigurableElement->addAttachedConfigurableDomain(this);
+
+ // Inform configurations
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ pDomainConfiguration->addConfigurableElement(pConfigurableElement);
+ }
+ // Add to our own sync set the configurable element one
+ pConfigurableElement->fillSyncerSet(_syncerSet);
+
+ // Already associated descended configurable elements need a merge of their configuration data
+ mergeAlreadyAssociatedDescendantConfigurableElements(pConfigurableElement);
+
+ // Add to list
+ _configurableElementList.push_back(pConfigurableElement);
+}
+
+void CConfigurableDomain::doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet)
+{
+ // Remove from list
+ _configurableElementList.remove(pConfigurableElement);
+
+ // Inform configurable element
+ pConfigurableElement->removeAttachedConfigurableDomain(this);
+
+ // Inform configurations
+ uint32_t uiNbConfigurations = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurations; uiChild++) {
+
+ CDomainConfiguration* pDomainConfiguration = static_cast<CDomainConfiguration*>(getChild(uiChild));
+
+ pDomainConfiguration->removeConfigurableElement(pConfigurableElement);
+ }
+ // Recompute our sync set if needed
+ if (bRecomputeSyncSet) {
+
+ computeSyncSet();
+ }
+}
diff --git a/parameter/ConfigurableDomain.h b/parameter/ConfigurableDomain.h
new file mode 100644
index 0000000..0438009
--- /dev/null
+++ b/parameter/ConfigurableDomain.h
@@ -0,0 +1,146 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "BinarySerializableElement.h"
+#include "SyncerSet.h"
+#include <list>
+#include <set>
+
+class CConfigurableElement;
+class CDomainConfiguration;
+class CParameterBlackboard;
+
+class CConfigurableDomain : public CBinarySerializableElement
+{
+ typedef list<CConfigurableElement*>::const_iterator ConfigurableElementListIterator;
+public:
+ CConfigurableDomain(const string& strName);
+ virtual ~CConfigurableDomain();
+
+ // Configuration Management
+ bool createConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError);
+ bool deleteConfiguration(const string& strName, string& strError);
+ bool renameConfiguration(const string& strName, const string& strNewName, string& strError);
+ bool restoreConfiguration(const string& strName, CParameterBlackboard* pMainBlackboard, bool bAutoSync, string& strError);
+ bool saveConfiguration(const string& strName, const CParameterBlackboard* pMainBlackboard, string& strError);
+
+ // Last applied configuration
+ string getLastAppliedConfigurationName() const;
+
+ // Associated Configurable elements
+ void gatherConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const;
+ void listAssociatedToElements(string& strResult) const;
+
+ // Configurable elements association
+ bool addConfigurableElement(CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError);
+ bool removeConfigurableElement(CConfigurableElement* pConfigurableElement, string& strError);
+
+ // Domain splitting
+ bool split(CConfigurableElement* pConfigurableElement, string& strError);
+
+ // Ensure validity on whole domain from main blackboard
+ void validate(const CParameterBlackboard* pMainBlackboard);
+
+ // Configuration application if required
+ void apply(CParameterBlackboard* pParameterBlackboard, CSyncerSet& syncerSet, bool bForced);
+
+ // Return applicable configuration validity for given configurable element
+ bool isApplicableConfigurationValid(const CConfigurableElement* pConfigurableElement) const;
+
+ // Presence of application condition on any configuration
+ bool hasRules() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // From IXmlSource
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
+ // Class kind
+ virtual string getKind() const;
+private:
+ // Returns true if children dynamic creation is to be dealt with (here, will allow child deletion upon clean)
+ virtual bool childrenAreDynamic() const;
+
+ // Ensure validity on areas related to configurable element
+ void validateAreas(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard);
+
+ // Attempt validation for all configurable element's areas, relying on already existing valid configuration inside domain
+ void autoValidateAll();
+
+ // Attempt validation for one configurable element's areas, relying on already existing valid configuration inside domain
+ void autoValidateAreas(const CConfigurableElement* pConfigurableElement);
+
+ // Attempt configuration validation for all configurable elements' areas, relying on already existing valid configuration inside domain
+ bool autoValidateConfiguration(CDomainConfiguration* pDomainConfiguration);
+
+ // Search for a valid configuration for given configurable element
+ const CDomainConfiguration* findValidDomainConfiguration(const CConfigurableElement* pConfigurableElement) const;
+
+ // Search for an applicable configuration
+ const CDomainConfiguration* findApplicableDomainConfiguration() const;
+
+ // In case configurable element was removed
+ void computeSyncSet();
+
+ // Check configurable element already attached
+ bool containsConfigurableElement(const CConfigurableElement* pConfigurableCandidateElement) const;
+
+ // Merge any descended configurable element to this one
+ void mergeAlreadyAssociatedDescendantConfigurableElements(CConfigurableElement* pNewConfigurableElement);
+ void mergeConfigurations(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement);
+
+ // Configurable elements association
+ void doAddConfigurableElement(CConfigurableElement* pConfigurableElement);
+ void doRemoveConfigurableElement(CConfigurableElement* pConfigurableElement, bool bRecomputeSyncSet);
+
+ // XML parsing
+ bool parseDomainConfigurations(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+ bool parseConfigurableElements(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+ bool parseConfigurableElementConfigurations(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurableElementElement, CXmlSerializingContext& serializingContext);
+ bool serializeConfigurableElementConfiguration(CDomainConfiguration* pDomainConfiguration, const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurationSettingsElement, CXmlSerializingContext& serializingContext, bool bSerializeOut);
+
+ // XML composing
+ void composeDomainConfigurations(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+ void composeConfigurableElements(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+ void composeConfigurableElementConfigurations(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurableElementElement, CXmlSerializingContext& serializingContext) const;
+
+ // Configurable elements
+ list<CConfigurableElement*> _configurableElementList;
+
+ // Syncer set used to ensure propoer synchronization of restored configurable elements
+ CSyncerSet _syncerSet;
+
+ // Last applied configuration
+ const CDomainConfiguration* _pLastAppliedConfiguration;
+};
+
diff --git a/parameter/ConfigurableDomains.cpp b/parameter/ConfigurableDomains.cpp
new file mode 100644
index 0000000..1961b2f
--- /dev/null
+++ b/parameter/ConfigurableDomains.cpp
@@ -0,0 +1,428 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConfigurableDomains.h"
+#include "ConfigurableDomain.h"
+#include "ConfigurableElement.h"
+#include "BinaryStream.h"
+
+#define base CBinarySerializableElement
+
+CConfigurableDomains::CConfigurableDomains(const string& strSystemClassName) : base(strSystemClassName)
+{
+}
+
+string CConfigurableDomains::getKind() const
+{
+ return "ConfigurableDomains";
+}
+
+bool CConfigurableDomains::childrenAreDynamic() const
+{
+ return true;
+}
+
+// Ensure validity on whole domains from main blackboard
+void CConfigurableDomains::validate(const CParameterBlackboard* pMainBlackboard)
+{
+ // Delegate to domains
+ uint32_t uiChild;
+ uint32_t uiNbConfigurableDomains = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
+
+ CConfigurableDomain* pChildConfigurableDomain = static_cast<CConfigurableDomain*>(getChild(uiChild));
+
+ pChildConfigurableDomain->validate(pMainBlackboard);
+ }
+}
+
+// Configuration application if required
+bool CConfigurableDomains::apply(CParameterBlackboard* pParameterBlackboard, bool bForce, string& strError)
+{
+ log("Applying configurations");
+
+ // Syncer set
+ CSyncerSet syncerSet;
+
+ // Delegate to domains
+ uint32_t uiChild;
+ uint32_t uiNbConfigurableDomains = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
+
+ CConfigurableDomain* pChildConfigurableDomain = static_cast<CConfigurableDomain*>(getChild(uiChild));
+
+ pChildConfigurableDomain->apply(pParameterBlackboard, syncerSet, bForce);
+ }
+ // Synchronize
+ return syncerSet.sync(*pParameterBlackboard, false, strError);
+}
+
+// From IXmlSource
+void CConfigurableDomains::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Set attribute
+ xmlElement.setAttributeString("SystemClassName", getName());
+
+ base::toXml(xmlElement, serializingContext);
+}
+
+// Configuration/Domains handling
+/// Domains
+bool CConfigurableDomains::createDomain(const string& strName, string& strError)
+{
+ // Already exists?
+ if (findChild(strName)) {
+
+ strError = "Already existing configurable domain";
+
+ return false;
+ }
+
+ log("Creating configurable domain \"%s\"", strName.c_str());
+
+ // Creation/Hierarchy
+ addChild(new CConfigurableDomain(strName));
+
+ return true;
+}
+
+bool CConfigurableDomains::deleteDomain(const string& strName, string& strError)
+{
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strName));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain not found";
+
+ return false;
+ }
+
+ // Check domain has no rule (prevent accidental loss of data)
+ if (pConfigurableDomain->hasRules()) {
+
+ strError = "Deletion of domain containing configurations with application rules is not supported to prevent any accitental loss of data.\nPlease consider a direct modification of the XML file.";
+
+ return false;
+ }
+
+ log("Deleting configurable domain \"%s\"", strName.c_str());
+
+ // Hierarchy
+ removeChild(pConfigurableDomain);
+
+ // Destroy
+ delete pConfigurableDomain;
+
+ return true;
+}
+
+bool CConfigurableDomains::renameDomain(const string& strName, const string& strNewName, string& strError)
+{
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strName));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain not found";
+
+ return false;
+ }
+
+ log("Renaming configurable domain \"%s\" to \"%s\"", strName.c_str(), strNewName.c_str());
+
+ // Rename
+ return pConfigurableDomain->rename(strNewName, strError);
+}
+
+/// Configurations
+bool CConfigurableDomains::listConfigurations(const string& strDomain, string& strResult) const
+{
+ const CElement* pConfigurableDomain = findChild(strDomain);
+
+ if (!pConfigurableDomain) {
+
+ strResult = "Configurable domain not found";
+
+ return false;
+ }
+ // delegate
+ pConfigurableDomain->listChildren(strResult);
+
+ return true;
+}
+
+bool CConfigurableDomains::createConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->createConfiguration(strConfiguration, pMainBlackboard, strError);
+}
+
+bool CConfigurableDomains::deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->deleteConfiguration(strConfiguration, strError);
+}
+
+bool CConfigurableDomains::renameConfiguration(const string& strDomain, const string& strConfigurationName, const string& strNewConfigurationName, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->renameConfiguration(strConfigurationName, strNewConfigurationName, strError);
+}
+
+bool CConfigurableDomains::listDomainElements(const string& strDomain, string& strResult) const
+{
+ // Find domain
+ const CConfigurableDomain* pConfigurableDomain = static_cast<const CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strResult = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ pConfigurableDomain->listAssociatedToElements(strResult);
+
+ return true;
+}
+
+bool CConfigurableDomains::split(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ pConfigurableDomain->split(pConfigurableElement, strError);
+
+ return true;
+}
+
+void CConfigurableDomains::listAssociatedElements(string& strResult) const
+{
+ strResult = "\n";
+
+ set<const CConfigurableElement*> configurableElementSet;
+
+ // Get all owned configurable elements
+ gatherAllOwnedConfigurableElements(configurableElementSet);
+
+ // Fill result
+ set<const CConfigurableElement*>::const_iterator it;
+
+ for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ string strAssociatedDomainList;
+
+ pConfigurableElement->listAssociatedDomains(strAssociatedDomainList, false);
+
+ strResult += pConfigurableElement->getPath() + " [" + strAssociatedDomainList + "]\n";
+ }
+}
+
+void CConfigurableDomains::listConflictingElements(string& strResult) const
+{
+ strResult = "\n";
+
+ set<const CConfigurableElement*> configurableElementSet;
+
+ // Get all owned configurable elements
+ gatherAllOwnedConfigurableElements(configurableElementSet);
+
+ // Fill result
+ set<const CConfigurableElement*>::const_iterator it;
+
+ for (it = configurableElementSet.begin(); it != configurableElementSet.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ if (pConfigurableElement->getBelongingDomainCount() > 1) {
+
+ string strBelongingDomainList;
+
+ pConfigurableElement->listBelongingDomains(strBelongingDomainList, false);
+
+ strResult += pConfigurableElement->getPath() + " contained in multiple domains: " + strBelongingDomainList + "\n";
+ }
+ }
+}
+
+// Gather configurable elements owned by any domain
+void CConfigurableDomains::gatherAllOwnedConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const
+{
+ // Delegate to domains
+ uint32_t uiChild;
+ uint32_t uiNbConfigurableDomains = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
+
+ const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
+
+ pChildConfigurableDomain->gatherConfigurableElements(configurableElementSet);
+ }
+}
+
+// Config restore
+bool CConfigurableDomains::restoreConfiguration(const string& strDomain, const string& strConfiguration, CParameterBlackboard* pMainBlackboard, bool bAutoSync, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->restoreConfiguration(strConfiguration, pMainBlackboard, bAutoSync, strError);
+}
+
+// Config save
+bool CConfigurableDomains::saveConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->saveConfiguration(strConfiguration, pMainBlackboard, strError);
+}
+
+// Last applied configurations
+void CConfigurableDomains::listLastAppliedConfigurations(string& strResult) const
+{
+ strResult = "\n";
+
+ // Browse domains
+ uint32_t uiChild;
+ uint32_t uiNbConfigurableDomains = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbConfigurableDomains; uiChild++) {
+
+ const CConfigurableDomain* pChildConfigurableDomain = static_cast<const CConfigurableDomain*>(getChild(uiChild));
+
+ strResult += pChildConfigurableDomain->getName() + ": " + pChildConfigurableDomain->getLastAppliedConfigurationName() + "\n";
+ }
+}
+
+// Configurable element - domain association
+bool CConfigurableDomains::addConfigurableElementToDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->addConfigurableElement(pConfigurableElement, pMainBlackboard, strError);
+}
+
+bool CConfigurableDomains::removeConfigurableElementFromDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError)
+{
+ // Find domain
+ CConfigurableDomain* pConfigurableDomain = static_cast<CConfigurableDomain*>(findChild(strDomain));
+
+ if (!pConfigurableDomain) {
+
+ strError = "Configurable domain " + strDomain + " not found";
+
+ return false;
+ }
+ // Delegate
+ return pConfigurableDomain->removeConfigurableElement(pConfigurableElement, strError);
+}
+
+// Binary settings load/store
+bool CConfigurableDomains::serializeSettings(const string& strBinarySettingsFilePath, bool bOut, uint8_t uiStructureChecksum, string& strError)
+{
+ // Instantiate byte stream
+ CBinaryStream binarySettingsStream(strBinarySettingsFilePath, bOut, getDataSize(), uiStructureChecksum);
+
+ // Open file
+ if (!binarySettingsStream.open(strError)) {
+
+ strError = "Unable to open binary settings file " + strBinarySettingsFilePath + ": " + strError;
+
+ return false;
+ }
+
+ // Serialize
+ binarySerialize(binarySettingsStream);
+
+ // Close stream
+ binarySettingsStream.close();
+
+ return true;
+}
diff --git a/parameter/ConfigurableDomains.h b/parameter/ConfigurableDomains.h
new file mode 100644
index 0000000..134667f
--- /dev/null
+++ b/parameter/ConfigurableDomains.h
@@ -0,0 +1,89 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "BinarySerializableElement.h"
+#include <set>
+
+class CParameterBlackboard;
+class CConfigurableElement;
+class CSyncerSet;
+
+class CConfigurableDomains : public CBinarySerializableElement
+{
+public:
+ CConfigurableDomains(const string& strSystemClassName);
+
+ // Configuration/Domains handling
+ /// Domains
+ bool createDomain(const string& strName, string& strError);
+ bool deleteDomain(const string& strName, string& strError);
+ bool renameDomain(const string& strName, const string& strNewName, string& strError);
+ bool listDomainElements(const string& strDomain, string& strResult) const;
+ bool split(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError);
+ void listAssociatedElements(string& strResult) const;
+ void listConflictingElements(string& strResult) const;
+ /// Configurations
+ bool listConfigurations(const string& strDomain, string& strResult) const;
+ bool createConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError);
+ bool deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError);
+ bool renameConfiguration(const string& strDomain, const string& strConfigurationName, const string& strNewConfigurationName, string& strError);
+ bool restoreConfiguration(const string& strDomain, const string& strConfiguration, CParameterBlackboard* pMainBlackboard, bool bAutoSync, string& strError);
+ bool saveConfiguration(const string& strDomain, const string& strConfiguration, const CParameterBlackboard* pMainBlackboard, string& strError);
+
+ // Last applied configurations
+ void listLastAppliedConfigurations(string& strResult) const;
+
+ // Configurable element - domain association
+ bool addConfigurableElementToDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard, string& strError);
+ bool removeConfigurableElementFromDomain(const string& strDomain, CConfigurableElement* pConfigurableElement, string& strError);
+
+ // Binary settings load/store
+ bool serializeSettings(const string& strBinarySettingsFilePath, bool bOut, uint8_t uiStructureChecksum, string& strError);
+
+ // From IXmlSource
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
+ // Ensure validity on whole domains from main blackboard
+ void validate(const CParameterBlackboard* pMainBlackboard);
+
+ // Configuration application if required
+ bool apply(CParameterBlackboard* pParameterBlackboard, bool bForce, string& strError);
+
+ // Class kind
+ virtual string getKind() const;
+private:
+ // Returns true if children dynamic creation is to be dealt with
+ virtual bool childrenAreDynamic() const;
+ // Gather owned configurable elements owned by any domain
+ void gatherAllOwnedConfigurableElements(set<const CConfigurableElement*>& configurableElementSet) const;
+};
+
diff --git a/parameter/ConfigurableElement.cpp b/parameter/ConfigurableElement.cpp
new file mode 100644
index 0000000..9707fb2
--- /dev/null
+++ b/parameter/ConfigurableElement.cpp
@@ -0,0 +1,539 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConfigurableElement.h"
+#include "MappingData.h"
+#include "SyncerSet.h"
+#include "ConfigurableDomain.h"
+#include "ConfigurationAccessContext.h"
+#include "ConfigurableElementAggregator.h"
+#include <assert.h>
+
+#define base CElement
+
+CConfigurableElement::CConfigurableElement(const string& strName) : base(strName), _uiOffset(0)
+{
+}
+
+CConfigurableElement::~CConfigurableElement()
+{
+}
+
+// XML configuration settings parsing
+bool CConfigurableElement::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ if (!configurationAccessContext.serializeOut()) {
+ // Just do basic checks and propagate to children
+ CXmlElement::CChildIterator it(xmlConfigurableElementSettingsElement);
+
+ CXmlElement xmlChildConfigurableElementSettingsElement;
+
+ // Propagate to children
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ // Get child
+ const CConfigurableElement* pChildConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ if (!it.next(xmlChildConfigurableElementSettingsElement)) {
+
+ // Structure error
+ configurationAccessContext.setError("Configuration settings parsing: Settings don't conform to structure of configurable element " + getName());
+
+ return false;
+ }
+
+ // Check element type matches in type
+ if (xmlChildConfigurableElementSettingsElement.getType() != pChildConfigurableElement->getKind()) {
+
+ // Type error
+ configurationAccessContext.setError("Configuration settings parsing: Settings for configurable element " + pChildConfigurableElement->getName() + " does not match expected type: " + xmlChildConfigurableElementSettingsElement.getType() + " instead of " + pChildConfigurableElement->getKind());
+
+ return false;
+ }
+
+ // Check element type matches in name
+ if (xmlChildConfigurableElementSettingsElement.getNameAttribute() != pChildConfigurableElement->getName()) {
+
+ // Name error
+ configurationAccessContext.setError("Configuration settings parsing: Under configurable elememnt " + getName() + ", expected element name " + pChildConfigurableElement->getName() + " but found " + xmlChildConfigurableElementSettingsElement.getNameAttribute() + " instead");
+
+ return false;
+ }
+
+ // Parse child configurable element's settings
+ if (!pChildConfigurableElement->serializeXmlSettings(xmlChildConfigurableElementSettingsElement, configurationAccessContext)) {
+
+ return false;
+ }
+ }
+ // There should remain no configurable element to parse
+ if (it.next(xmlChildConfigurableElementSettingsElement)) {
+
+ // Structure error
+ configurationAccessContext.setError("Configuration settings parsing: Settings don't conform to structure of configurable element " + getName());
+
+ return false;
+ }
+ } else {
+ // Propagate to children
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pChildConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ // Create corresponding child element
+ CXmlElement xmlChildConfigurableElementSettingsElement;
+
+ xmlConfigurableElementSettingsElement.createChild(xmlChildConfigurableElementSettingsElement, pChildConfigurableElement->getKind());
+
+ // Handle element name attribute
+ xmlChildConfigurableElementSettingsElement.setNameAttribute(pChildConfigurableElement->getName());
+
+ // Propagate
+ pChildConfigurableElement->serializeXmlSettings(xmlChildConfigurableElementSettingsElement, configurationAccessContext);
+ }
+ }
+ // Done
+ return true;
+}
+
+#if 0
+bool CConfigurableElement::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ if (!configurationAccessContext.serializeOut()) {
+ // Just do basic checks and propagate to children
+ CXmlElement::CChildIterator it(xmlConfigurableElementSettingsElement);
+
+ CXmlElement xmlChildConfigurableElementSettingsElement;
+
+ while (it.next(xmlChildConfigurableElementSettingsElement)) {
+
+ // Find child configurable element
+ const CConfigurableElement* pChildConfigurableElement = static_cast<const CConfigurableElement*>(findChild(xmlChildConfigurableElementSettingsElement.getNameAttribute()));
+
+ if (!pChildConfigurableElement) {
+
+ configurationAccessContext.setError("Configuration settings parsing: Unable to find configurable element " + xmlChildConfigurableElementSettingsElement.getNameAttribute() + " under configurable element " + getName());
+
+ return false;
+ }
+
+ // Check element type matches
+ if (xmlChildConfigurableElementSettingsElement.getType() != pChildConfigurableElement->getKind()) {
+
+ configurationAccessContext.setError("Settings for configurable element " + pChildConfigurableElement->getName() + " does not match expected type: " + xmlChildConfigurableElementSettingsElement.getType() + " instead of " + pChildConfigurableElement->getKind());
+
+ return false;
+ }
+
+ // Parse child configurable element's settings
+ if (!pChildConfigurableElement->serializeXmlSettings(xmlChildConfigurableElementSettingsElement, configurationAccessContext)) {
+
+ return false;
+ }
+ }
+ } else {
+ // Propagate to children
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pChildConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ // Create corresponding child element
+ CXmlElement xmlChildConfigurableElementSettingsElement;
+
+ xmlConfigurableElementSettingsElement.createChild(xmlChildConfigurableElementSettingsElement, pChildConfigurableElement->getKind());
+
+ // Handle element name attribute
+ xmlChildConfigurableElementSettingsElement.setNameAttribute(pChildConfigurableElement->getName());
+
+ // Propagate
+ pChildConfigurableElement->serializeXmlSettings(xmlChildConfigurableElementSettingsElement, configurationAccessContext);
+ }
+ }
+ // Done
+ return true;
+}
+#endif
+
+// Parameter access
+bool CConfigurableElement::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
+{
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ errorContext.setError("Non settable element");
+
+ return false;
+ }
+
+ const CConfigurableElement* pChild = static_cast<const CConfigurableElement*>(findChild(*pStrChildName));
+
+ if (!pChild) {
+
+ errorContext.setError("Path not found: " + pathNavigator.getCurrentPath());
+
+ return false;
+ }
+
+ return pChild->setValue(pathNavigator, strValue, errorContext);
+}
+
+bool CConfigurableElement::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
+{
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ errorContext.setError("Non gettable element");
+
+ return false;
+ }
+
+ const CConfigurableElement* pChild = static_cast<const CConfigurableElement*>(findChild(*pStrChildName));
+
+ if (!pChild) {
+
+ errorContext.setError("Path not found: " + pathNavigator.getCurrentPath());
+
+ return false;
+ }
+
+ return pChild->getValue(pathNavigator, strValue, errorContext);
+}
+
+// Used for simulation only
+void CConfigurableElement::setDefaultValues(CParameterAccessContext& parameterAccessContext) const
+{
+ // Propagate to children
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ pConfigurableElement->setDefaultValues(parameterAccessContext);
+ }
+}
+
+// Offset
+void CConfigurableElement::setOffset(uint32_t uiOffset)
+{
+ // Assign offset locally
+ _uiOffset = uiOffset;
+
+ // Propagate to children
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ CConfigurableElement* pConfigurableElement = static_cast<CConfigurableElement*>(getChild(uiIndex));
+
+ pConfigurableElement->setOffset(uiOffset);
+
+ uiOffset += pConfigurableElement->getFootPrint();
+ }
+}
+
+uint32_t CConfigurableElement::getOffset() const
+{
+ return _uiOffset;
+}
+
+// Memory
+uint32_t CConfigurableElement::getFootPrint() const
+{
+ uint32_t uiSize = 0;
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ uiSize += pConfigurableElement->getFootPrint();
+ }
+
+ return uiSize;
+}
+
+// Browse parent path to find syncer
+ISyncer* CConfigurableElement::getSyncer() const
+{
+ // Check parent
+ const CElement* pParent = getParent();
+
+ if (isOfConfigurableElementType(pParent)) {
+
+ return static_cast<const CConfigurableElement*>(pParent)->getSyncer();
+ }
+ return false;
+}
+
+// Syncer set (me, ascendant or descendant ones)
+void CConfigurableElement::fillSyncerSet(CSyncerSet& syncerSet) const
+{
+ // Try me or ascendants
+ ISyncer* pMineOrAscendantSyncer = getSyncer();
+
+ if (pMineOrAscendantSyncer) {
+
+ // Provide found syncer object
+ syncerSet += pMineOrAscendantSyncer;
+
+ // Done
+ return;
+ }
+ // Fetch descendant ones
+ fillSyncerSetFromDescendant(syncerSet);
+}
+
+// Syncer set (descendant)
+void CConfigurableElement::fillSyncerSetFromDescendant(CSyncerSet& syncerSet) const
+{
+ // Dig
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(getChild(uiIndex));
+
+ pConfigurableElement->fillSyncerSetFromDescendant(syncerSet);
+ }
+}
+
+// Configurable domain association
+void CConfigurableElement::addAttachedConfigurableDomain(const CConfigurableDomain* pConfigurableDomain)
+{
+ _configurableDomainList.push_back(pConfigurableDomain);
+}
+
+void CConfigurableElement::removeAttachedConfigurableDomain(const CConfigurableDomain* pConfigurableDomain)
+{
+ _configurableDomainList.remove(pConfigurableDomain);
+}
+
+// Belonging domain
+bool CConfigurableElement::belongsTo(const CConfigurableDomain* pConfigurableDomain) const
+{
+ if (containsConfigurableDomain(pConfigurableDomain)) {
+
+ return true;
+ }
+ return belongsToDomainAscending(pConfigurableDomain);
+}
+
+// Belonging domains
+void CConfigurableElement::getBelongingDomains(list<const CConfigurableDomain*>& configurableDomainList) const
+{
+ configurableDomainList.insert(configurableDomainList.end(), _configurableDomainList.begin(), _configurableDomainList.end());
+
+ // Check parent
+ const CElement* pParent = getParent();
+
+ if (isOfConfigurableElementType(pParent)) {
+
+ static_cast<const CConfigurableElement*>(pParent)->getBelongingDomains(configurableDomainList);
+ }
+}
+
+void CConfigurableElement::listBelongingDomains(string& strResult, bool bVertical) const
+{
+ // Get belonging domain list
+ list<const CConfigurableDomain*> configurableDomainList;
+
+ getBelongingDomains(configurableDomainList);
+
+ // Fill list
+ listDomains(configurableDomainList, strResult, bVertical);
+}
+
+// Elements with no domains
+void CConfigurableElement::listRogueElements(string& strResult) const
+{
+ strResult = "\n";
+
+ // Get rogue element aggregate list (no associated domain)
+ list<const CConfigurableElement*> rogueElementList;
+
+ CConfigurableElementAggregator configurableElementAggregator(rogueElementList, &CConfigurableElement::hasNoDomainAssociated);
+
+ configurableElementAggregator.aggegate(this);
+
+ // Build list as string
+ list<const CConfigurableElement*>::const_iterator it;
+
+ for (it = rogueElementList.begin(); it != rogueElementList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ strResult += pConfigurableElement->getPath() + "\n";
+ }
+}
+
+// Matching check for no domain association
+bool CConfigurableElement::hasNoDomainAssociated() const
+{
+ return _configurableDomainList.empty();
+}
+
+// Matching check for no valid associated domains
+bool CConfigurableElement::hasNoValidDomainAssociated() const
+{
+ if (_configurableDomainList.empty()) {
+
+ // No domains associated
+ return true;
+ }
+
+ ConfigurableDomainListConstIterator it;
+
+ // Browse all configurable domains for validity checking
+ for (it = _configurableDomainList.begin(); it != _configurableDomainList.end(); ++it) {
+
+ const CConfigurableDomain* pConfigurableDomain = *it;
+
+ if (pConfigurableDomain->isApplicableConfigurationValid(this)) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// Owning domains
+void CConfigurableElement::listAssociatedDomains(string& strResult, bool bVertical) const
+{
+ // Fill list
+ listDomains(_configurableDomainList, strResult, bVertical);
+}
+
+uint32_t CConfigurableElement::getBelongingDomainCount() const
+{
+ // Get belonging domain list
+ list<const CConfigurableDomain*> configurableDomainList;
+
+ getBelongingDomains(configurableDomainList);
+
+ return configurableDomainList.size();
+}
+
+void CConfigurableElement::listDomains(const list<const CConfigurableDomain*>& configurableDomainList, string& strResult, bool bVertical) const
+{
+ if (bVertical && configurableDomainList.empty()) {
+
+ strResult = "\n";
+ }
+
+ // Fill list
+ ConfigurableDomainListConstIterator it;
+ bool bFirst = true;
+
+ // Browse all configurable domains for comparison
+ for (it = configurableDomainList.begin(); it != configurableDomainList.end(); ++it) {
+
+ const CConfigurableDomain* pConfigurableDomain = *it;
+
+ if (!bVertical && !bFirst) {
+
+ strResult += ", ";
+ }
+
+ strResult += pConfigurableDomain->getName();
+
+ if (bVertical) {
+
+ strResult += "\n";
+ } else {
+
+ bFirst = false;
+ }
+ }
+}
+
+bool CConfigurableElement::containsConfigurableDomain(const CConfigurableDomain* pConfigurableDomain) const
+{
+ ConfigurableDomainListConstIterator it;
+
+ // Browse all configurable domains for comparison
+ for (it = _configurableDomainList.begin(); it != _configurableDomainList.end(); ++it) {
+
+ if (pConfigurableDomain == *it) {
+
+ return true;
+ }
+ }
+ return false;
+}
+
+// Belonging domain ascending search
+bool CConfigurableElement::belongsToDomainAscending(const CConfigurableDomain* pConfigurableDomain) const
+{
+ // Check parent
+ const CElement* pParent = getParent();
+
+ if (isOfConfigurableElementType(pParent)) {
+
+ return static_cast<const CConfigurableElement*>(pParent)->belongsTo(pConfigurableDomain);
+ }
+ return false;
+}
+
+// Belonging subsystem
+const CSubsystem* CConfigurableElement::getBelongingSubsystem() const
+{
+ const CElement* pParent = getParent();
+
+ // Stop at sytem class
+ if (!pParent->getParent()) {
+
+ return NULL;
+ }
+
+ return static_cast<const CConfigurableElement*>(pParent)->getBelongingSubsystem();
+}
+
+// Check parent is still of current type (by structure knowledge)
+bool CConfigurableElement::isOfConfigurableElementType(const CElement* pParent) const
+{
+ assert(pParent);
+
+ // Up to system class
+ return !!pParent->getParent();
+}
diff --git a/parameter/ConfigurableElement.h b/parameter/ConfigurableElement.h
new file mode 100644
index 0000000..5b61d3b
--- /dev/null
+++ b/parameter/ConfigurableElement.h
@@ -0,0 +1,120 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+#include <list>
+
+class CConfigurableDomain;
+class CSyncerSet;
+class ISyncer;
+class CSubsystem;
+class CConfigurationAccessContext;
+class CParameterAccessContext;
+
+class CConfigurableElement : public CElement
+{
+ friend class CConfigurableDomain;
+ typedef list<const CConfigurableDomain*>::const_iterator ConfigurableDomainListConstIterator;
+public:
+ CConfigurableElement(const string& strName);
+ virtual ~CConfigurableElement();
+
+ // Offset in main blackboard
+ void setOffset(uint32_t uiOffset);
+ uint32_t getOffset() const;
+
+ // Allocation
+ virtual uint32_t getFootPrint() const;
+
+ // Syncer set (me, ascendant or descendant ones)
+ void fillSyncerSet(CSyncerSet& syncerSet) const;
+
+ // Belonging domain
+ bool belongsTo(const CConfigurableDomain* pConfigurableDomain) const;
+
+ // Belonging domains
+ void listBelongingDomains(string& strResult, bool bVertical = true) const;
+
+ // Matching check for domain association
+ bool hasNoDomainAssociated() const;
+
+ // Matching check for no valid associated domains
+ bool hasNoValidDomainAssociated() const;
+
+ // Owning domains
+ void listAssociatedDomains(string& strResult, bool bVertical = true) const;
+ uint32_t getBelongingDomainCount() const;
+
+ // Elements with no domains
+ void listRogueElements(string& strResult) const;
+
+ // Parameter access
+ virtual bool setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const;
+ virtual bool getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const;
+ // Used for simulation only
+ virtual void setDefaultValues(CParameterAccessContext& parameterAccessContext) const;
+
+ // XML configuration settings parsing
+ virtual bool serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+protected:
+ // Syncer (me or ascendant)
+ virtual ISyncer* getSyncer() const;
+ // Syncer set (descendant)
+ virtual void fillSyncerSetFromDescendant(CSyncerSet& syncerSet) const;
+ // Configuration Domain local search
+ bool containsConfigurableDomain(const CConfigurableDomain* pConfigurableDomain) const;
+private:
+ // Configurable domain association
+ void addAttachedConfigurableDomain(const CConfigurableDomain* pConfigurableDomain);
+ void removeAttachedConfigurableDomain(const CConfigurableDomain* pConfigurableDomain);
+
+ // Belonging domain ascending search
+ bool belongsToDomainAscending(const CConfigurableDomain* pConfigurableDomain) const;
+
+ // Belonging domains
+ void getBelongingDomains(list<const CConfigurableDomain*>& configurableDomainList) const;
+ void listDomains(const list<const CConfigurableDomain*>& configurableDomainList, string& strResult, bool bVertical) const;
+
+ // Belonging subsystem
+ virtual const CSubsystem* getBelongingSubsystem() const;
+
+ // Check parent is still of current type (by structure knowledge)
+ bool isOfConfigurableElementType(const CElement* pParent) const;
+
+ // Offset in main blackboard
+ uint32_t _uiOffset;
+
+ // Associated configurable domains
+ list<const CConfigurableDomain*> _configurableDomainList;
+};
+
diff --git a/parameter/ConfigurableElementAggregator.cpp b/parameter/ConfigurableElementAggregator.cpp
new file mode 100644
index 0000000..a24c074
--- /dev/null
+++ b/parameter/ConfigurableElementAggregator.cpp
@@ -0,0 +1,79 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConfigurableElementAggregator.h"
+#include "ConfigurableElement.h"
+
+CConfigurableElementAggregator::CConfigurableElementAggregator(list<const CConfigurableElement*>& aggregateList, MatchesAggregationCriterion pfnMatchesAggregationCriterion)
+ : _aggregateList(aggregateList), _pfnMatchesAggregationCriterion(pfnMatchesAggregationCriterion)
+{
+}
+
+// Aggregate
+void CConfigurableElementAggregator::aggegate(const CConfigurableElement* pConfigurableElement)
+{
+ doAggregate(pConfigurableElement, _aggregateList);
+}
+
+// Recursive aggregate
+bool CConfigurableElementAggregator::doAggregate(const CConfigurableElement* pConfigurableElement, list<const CConfigurableElement*>& aggregateList)
+{
+ if (!(pConfigurableElement->*_pfnMatchesAggregationCriterion)()) {
+
+ // Not a candidate for aggregation
+ return false;
+ }
+ // Check children
+ list<const CConfigurableElement*> childAggregateElementList;
+
+ uint32_t uiIndex;
+ uint32_t uiNbChildren = pConfigurableElement->getNbChildren();
+ uint32_t uiNbMatchingChildren = 0;
+
+ for (uiIndex = 0; uiIndex < uiNbChildren; uiIndex++) {
+
+ const CConfigurableElement* pChildConfigurableElement = static_cast<const CConfigurableElement*>(pConfigurableElement->getChild(uiIndex));
+
+ uiNbMatchingChildren += doAggregate(pChildConfigurableElement, childAggregateElementList);
+ }
+
+ if (uiNbMatchingChildren == uiNbChildren) {
+
+ // All children match => self is a match
+ aggregateList.push_back(pConfigurableElement);
+
+ return true;
+ } else {
+ // Add rogue children if any
+ aggregateList.insert(aggregateList.end(), childAggregateElementList.begin(), childAggregateElementList.end());
+
+ return false;
+ }
+}
diff --git a/parameter/ConfigurableElementAggregator.h b/parameter/ConfigurableElementAggregator.h
new file mode 100644
index 0000000..58b0481
--- /dev/null
+++ b/parameter/ConfigurableElementAggregator.h
@@ -0,0 +1,61 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <list>
+
+using namespace std;
+
+class CConfigurableElement;
+
+class CConfigurableElementAggregator
+{
+public:
+ // Matching check method type
+ typedef bool (CConfigurableElement::*MatchesAggregationCriterion)() const;
+
+ // Constructor
+ CConfigurableElementAggregator(list<const CConfigurableElement*>& aggregateList, MatchesAggregationCriterion pfnMatchesAggregationCriterion);
+
+ // Aggregate
+ void aggegate(const CConfigurableElement* pConfigurableElement);
+
+private:
+ // Recursive aggregate
+ bool doAggregate(const CConfigurableElement* pConfigurableElement, list<const CConfigurableElement*>& aggregateList);
+
+ // Aggegate list
+ list<const CConfigurableElement*>& _aggregateList;
+
+ // Matching check method
+ MatchesAggregationCriterion _pfnMatchesAggregationCriterion;
+};
+
diff --git a/parameter/ConfigurationAccessContext.cpp b/parameter/ConfigurationAccessContext.cpp
new file mode 100644
index 0000000..4b97eff
--- /dev/null
+++ b/parameter/ConfigurationAccessContext.cpp
@@ -0,0 +1,54 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConfigurationAccessContext.h"
+
+#define base CParameterAccessContext
+
+CConfigurationAccessContext::CConfigurationAccessContext(string& strError, bool bSerializeOut) : base(strError), _bSerializeOut(bSerializeOut), _uiBaseOffset(0)
+{
+}
+
+// Serialization direction
+bool CConfigurationAccessContext::serializeOut() const
+{
+ return _bSerializeOut;
+}
+
+// Base offset for blackboard access
+void CConfigurationAccessContext::setBaseOffset(uint32_t uiBaseOffset)
+{
+ _uiBaseOffset = uiBaseOffset;
+}
+
+uint32_t CConfigurationAccessContext::getBaseOffset() const
+{
+ return _uiBaseOffset;
+}
diff --git a/parameter/ConfigurationAccessContext.h b/parameter/ConfigurationAccessContext.h
new file mode 100644
index 0000000..0f2966a
--- /dev/null
+++ b/parameter/ConfigurationAccessContext.h
@@ -0,0 +1,54 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterAccessContext.h"
+#include <stdint.h>
+
+class CConfigurationAccessContext : public CParameterAccessContext
+{
+public:
+ CConfigurationAccessContext(string& strError, bool bSerializeOut);
+
+ // Serialization direction
+ bool serializeOut() const;
+
+ // Base offset for blackboard access
+ void setBaseOffset(uint32_t uiBaseOffset);
+ uint32_t getBaseOffset() const;
+
+private:
+ // Serialization direction
+ bool _bSerializeOut;
+ // Base offset where parameters are stored in configuration blackboards
+ uint32_t _uiBaseOffset;
+};
+
diff --git a/parameter/DomainConfiguration.cpp b/parameter/DomainConfiguration.cpp
new file mode 100644
index 0000000..4ab5f1d
--- /dev/null
+++ b/parameter/DomainConfiguration.cpp
@@ -0,0 +1,285 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "DomainConfiguration.h"
+#include "AreaConfiguration.h"
+#include "ConfigurableElement.h"
+#include "CompoundRule.h"
+#include <assert.h>
+
+#define base CBinarySerializableElement
+
+CDomainConfiguration::CDomainConfiguration(const string& strName) : base(strName)
+{
+}
+
+CDomainConfiguration::~CDomainConfiguration()
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ delete *it;
+ }
+}
+
+// Class kind
+string CDomainConfiguration::getKind() const
+{
+ return "Configuration";
+}
+
+// Child dynamic creation
+bool CDomainConfiguration::childrenAreDynamic() const
+{
+ return true;
+}
+
+// XML configuration settings parsing
+bool CDomainConfiguration::serializeXmlSettings(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurationSettingsElement, CConfigurationAccessContext& configurationAccessContext)
+{
+ // Find related AreaConfiguration
+ CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
+
+ assert(pAreaConfiguration);
+
+ // Delegate to corresponding area configuration
+ return pAreaConfiguration->serializeXmlSettings(xmlConfigurationSettingsElement, configurationAccessContext);
+}
+
+// Configurable Elements association
+void CDomainConfiguration::addConfigurableElement(const CConfigurableElement* pConfigurableElement)
+{
+ _areaConfigurationList.push_back(new CAreaConfiguration(pConfigurableElement));
+}
+
+void CDomainConfiguration::removeConfigurableElement(const CConfigurableElement* pConfigurableElement)
+{
+ CAreaConfiguration* pAreaConfigurationToRemove = getAreaConfiguration(pConfigurableElement);
+
+ _areaConfigurationList.remove(pAreaConfigurationToRemove);
+
+ delete pAreaConfigurationToRemove;
+}
+
+// Save data from current
+void CDomainConfiguration::save(const CParameterBlackboard* pMainBlackboard)
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->save(pMainBlackboard);
+ }
+}
+
+// Apply data to current
+void CDomainConfiguration::restore(CParameterBlackboard* pMainBlackboard) const
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ const CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->restore(pMainBlackboard);
+ }
+}
+
+// Ensure validity for configurable element area configuration
+void CDomainConfiguration::validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard)
+{
+ CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
+
+ // Delegate
+ pAreaConfigurationToValidate->validate(pMainBlackboard);
+}
+
+// Ensure validity of all area configurations
+void CDomainConfiguration::validate(const CParameterBlackboard* pMainBlackboard)
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->validate(pMainBlackboard);
+ }
+}
+
+// Return configuration validity for given configurable element
+bool CDomainConfiguration::isValid(const CConfigurableElement* pConfigurableElement) const
+{
+ // Get child configurable elemnt's area configuration
+ CAreaConfiguration* pAreaConfiguration = getAreaConfiguration(pConfigurableElement);
+
+ assert(pAreaConfiguration);
+
+ return pAreaConfiguration->isValid();
+}
+
+// Ensure validity of configurable element's area configuration by copying in from a valid one
+void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement)
+{
+ // Retrieve related area configurations
+ CAreaConfiguration* pAreaConfigurationToValidate = getAreaConfiguration(pConfigurableElement);
+ const CAreaConfiguration* pAreaConfigurationToValidateAgainst = pValidDomainConfiguration->getAreaConfiguration(pConfigurableElement);
+
+ // Delegate to area
+ pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
+}
+
+// Ensure validity of all configurable element's area configuration by copying in from a valid ones
+void CDomainConfiguration::validateAgainst(const CDomainConfiguration* pValidDomainConfiguration)
+{
+ // Copy in configuration data from against domain
+ AreaConfigurationListIterator it, itAgainst;
+
+ for (it = _areaConfigurationList.begin(), itAgainst = pValidDomainConfiguration->_areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it, ++itAgainst) {
+
+ CAreaConfiguration* pAreaConfigurationToValidate = *it;
+ const CAreaConfiguration* pAreaConfigurationToValidateAgainst = *itAgainst;
+
+ // Delegate to area
+ pAreaConfigurationToValidate->validateAgainst(pAreaConfigurationToValidateAgainst);
+ }
+}
+
+// Dynamic data application
+bool CDomainConfiguration::isApplicable() const
+{
+ const CCompoundRule* pRule = getRule();
+
+ return pRule && pRule->matches();
+}
+
+// Merge existing configurations to given configurable element ones
+void CDomainConfiguration::merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement)
+{
+ // Retrieve related area configurations
+ CAreaConfiguration* pAreaConfigurationToMergeTo = getAreaConfiguration(pToConfigurableElement);
+ const CAreaConfiguration* pAreaConfigurationToMergeFrom = getAreaConfiguration(pFromConfigurableElement);
+
+ // Do the merge
+ pAreaConfigurationToMergeTo->copyFromInner(pAreaConfigurationToMergeFrom);
+}
+
+// Domain splitting
+void CDomainConfiguration::split(CConfigurableElement* pFromConfigurableElement)
+{
+ // Retrieve related area configuration
+ const CAreaConfiguration* pAreaConfigurationToSplitFrom = getAreaConfiguration(pFromConfigurableElement);
+
+ // Go through children areas to copy configuration data to them
+ uint32_t uiNbConfigurableElementChildren = pFromConfigurableElement->getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbConfigurableElementChildren; uiChild++) {
+
+ CConfigurableElement* pToChildConfigurableElement = static_cast<CConfigurableElement*>(pFromConfigurableElement->getChild(uiChild));
+
+ // Get child configurable elemnt's area configuration
+ CAreaConfiguration* pChildAreaConfiguration = getAreaConfiguration(pToChildConfigurableElement);
+
+ // Do the copy
+ pAreaConfigurationToSplitFrom->copyToInner(pChildAreaConfiguration);
+ }
+}
+
+// AreaConfiguration retrieval from configurable element
+CAreaConfiguration* CDomainConfiguration::getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const
+{
+ AreaConfigurationListIterator it;
+
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ if (pAreaConfiguration->getConfigurableElement() == pConfigurableElement) {
+
+ return pAreaConfiguration;
+ }
+ }
+ // Not found?
+ assert(0);
+
+ return NULL;
+}
+
+// Presence of application condition
+bool CDomainConfiguration::hasRule() const
+{
+ return !!getRule();
+}
+
+// Rule
+const CCompoundRule* CDomainConfiguration::getRule() const
+{
+ if (getNbChildren()) {
+ // Rule created
+ return static_cast<const CCompoundRule*>(getChild(ECompoundRule));
+ }
+ return NULL;
+}
+
+// Serialization
+void CDomainConfiguration::binarySerialize(CBinaryStream& binaryStream)
+{
+ AreaConfigurationListIterator it;
+
+ // Just propagate to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ CAreaConfiguration* pAreaConfiguration = *it;
+
+ pAreaConfiguration->serialize(binaryStream);
+ }
+}
+
+// Data size
+uint32_t CDomainConfiguration::getDataSize() const
+{
+ uint32_t uiDataSize = 0;
+ AreaConfigurationListIterator it;
+
+ // Just propagate request to areas
+ for (it = _areaConfigurationList.begin(); it != _areaConfigurationList.end(); ++it) {
+
+ const CAreaConfiguration* pAreaConfiguration = *it;
+
+ uiDataSize += pAreaConfiguration->getSize();
+ }
+ return uiDataSize;
+}
diff --git a/parameter/DomainConfiguration.h b/parameter/DomainConfiguration.h
new file mode 100644
index 0000000..27779ec
--- /dev/null
+++ b/parameter/DomainConfiguration.h
@@ -0,0 +1,102 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "BinarySerializableElement.h"
+#include <list>
+
+class CConfigurableElement;
+class CAreaConfiguration;
+class CParameterBlackboard;
+class CConfigurationAccessContext;
+class CCompoundRule;
+
+class CDomainConfiguration : public CBinarySerializableElement
+{
+ enum ChildElementType {
+ ECompoundRule
+ };
+ typedef list<CAreaConfiguration*>::const_iterator AreaConfigurationListIterator;
+public:
+ CDomainConfiguration(const string& strName);
+ virtual ~CDomainConfiguration();
+
+ // Configurable Elements association
+ void addConfigurableElement(const CConfigurableElement* pConfigurableElement);
+ void removeConfigurableElement(const CConfigurableElement* pConfigurableElement);
+
+ // Save data from current
+ void save(const CParameterBlackboard* pMainBlackboard);
+ // Apply data to current
+ void restore(CParameterBlackboard* pMainBlackboard) const;
+ // Ensure validity for configurable element area configuration
+ void validate(const CConfigurableElement* pConfigurableElement, const CParameterBlackboard* pMainBlackboard);
+ // Ensure validity of all area configurations
+ void validate(const CParameterBlackboard* pMainBlackboard);
+ // Return configuration validity for given configurable element
+ bool isValid(const CConfigurableElement* pConfigurableElement) const;
+ // Ensure validity of configurable element's area configuration by copying in from a valid one
+ void validateAgainst(const CDomainConfiguration* pValidDomainConfiguration, const CConfigurableElement* pConfigurableElement);
+ // Ensure validity of all configurable element's area configuration by copying in from a valid ones
+ void validateAgainst(const CDomainConfiguration* pValidDomainConfiguration);
+ // Applicability checking
+ bool isApplicable() const;
+ // Merge existing configurations to given configurable element ones
+ void merge(CConfigurableElement* pToConfigurableElement, CConfigurableElement* pFromConfigurableElement);
+ // Domain splitting
+ void split(CConfigurableElement* pFromConfigurableElement);
+
+ // XML configuration settings parsing/composing
+ bool serializeXmlSettings(const CConfigurableElement* pConfigurableElement, CXmlElement& xmlConfigurationSettingsElement, CConfigurationAccessContext& configurationAccessContext);
+
+ // Presence of application condition
+ bool hasRule() const;
+
+ // Serialization
+ virtual void binarySerialize(CBinaryStream& binaryStream);
+
+ // Data size
+ virtual uint32_t getDataSize() const;
+
+ // Class kind
+ virtual string getKind() const;
+private:
+ // Returns true if children dynamic creation is to be dealt with (here, will allow child deletion upon clean)
+ virtual bool childrenAreDynamic() const;
+ // AreaConfiguration retrieval from configurable element
+ CAreaConfiguration* getAreaConfiguration(const CConfigurableElement* pConfigurableElement) const;
+
+ // Rule
+ const CCompoundRule* getRule() const;
+
+ // AreaConfigurations
+ list<CAreaConfiguration*> _areaConfigurationList;
+};
diff --git a/parameter/Element.cpp b/parameter/Element.cpp
new file mode 100644
index 0000000..8cc6783
--- /dev/null
+++ b/parameter/Element.cpp
@@ -0,0 +1,649 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Element.h"
+#include <assert.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include "XmlElementSerializingContext.h"
+#include "ElementLibrary.h"
+#include "ErrorContext.h"
+
+CElement::CElement(const string& strName) : _strName(strName), _pParent(NULL)
+{
+}
+
+CElement::~CElement()
+{
+ removeChildren();
+}
+
+// Logging
+void CElement::log(const string& strMessage, ...) const
+{
+ char acBuffer[512];
+ va_list listPointer;
+
+ va_start(listPointer, strMessage);
+
+ vsnprintf(acBuffer, sizeof(acBuffer), strMessage.c_str(), listPointer);
+
+ va_end(listPointer);
+
+ doLog(acBuffer);
+}
+
+void CElement::doLog(const string& strLog) const
+{
+ assert(_pParent);
+
+ // Propagate till root
+ _pParent->doLog(strLog);
+}
+
+void CElement::nestLog() const
+{
+ assert(_pParent);
+
+ // Propagate till root
+ _pParent->nestLog();
+}
+
+void CElement::unnestLog() const
+{
+ assert(_pParent);
+
+ // Propagate till root
+ _pParent->unnestLog();
+}
+
+
+void CElement::setDescription(const string& strDescription)
+{
+ _strDescription = strDescription;
+}
+
+const string& CElement::getDescription() const
+{
+ return _strDescription;
+}
+
+bool CElement::childrenAreDynamic() const
+{
+ // By default, children are searched and not created during xml parsing
+ return false;
+}
+
+bool CElement::init(string& strError)
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ CElement* pElement = _childArray[uiIndex];;
+
+ if (!pElement->init(strError)) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void CElement::dumpContent(string& strContent, CErrorContext& errorContext, const uint32_t uiDepth) const
+{
+ string strIndent;
+
+ // Level
+ uint32_t uiNbIndents = uiDepth;
+
+ while (uiNbIndents--) {
+
+ strIndent += " ";
+ }
+ // Type
+ strContent += strIndent + "- " + getKind();
+
+ // Name
+ if (!_strName.empty()) {
+
+ strContent += ": " + getName();
+ }
+
+ // Value
+ string strValue;
+ logValue(strValue, errorContext);
+
+ if (!strValue.empty()) {
+
+ strContent += " = " + strValue;
+ }
+
+ strContent += "\n";
+
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ _childArray[uiIndex]->dumpContent(strContent, errorContext, uiDepth + 1);
+ }
+}
+
+void CElement::logValue(string& strValue, CErrorContext& errorContext) const
+{
+ (void)strValue;
+ (void)errorContext;
+}
+
+// From IXmlSink
+bool CElement::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Propagate through children
+ CXmlElement::CChildIterator childIterator(xmlElement);
+
+ // Context
+ CXmlElementSerializingContext& elementSerializingContext = static_cast<CXmlElementSerializingContext&>(serializingContext);
+
+ CXmlElement childElement;
+
+ while (childIterator.next(childElement)) {
+
+ CElement* pChild;
+
+ if (!childrenAreDynamic()) {
+
+ pChild = findChildOfKind(childElement.getType());
+
+ if (!pChild) {
+
+ elementSerializingContext.setError("XML Path not found: " + xmlElement.getPath());
+
+ return false;
+ }
+
+ } else {
+ // Child needs creation
+ pChild = elementSerializingContext.getElementLibrary()->createElement(childElement);
+
+ if (pChild) {
+
+ // Store created child!
+ addChild(pChild);
+ } else {
+
+ elementSerializingContext.setError("Unable to create XML element " + childElement.getPath());
+
+ return false;
+ }
+ }
+
+ // Dig
+ if (!pChild->fromXml(childElement, elementSerializingContext)) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// From IXmlSource
+void CElement::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ // Browse children and propagate
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CElement* pChild = _childArray[uiChild];
+
+ // Create corresponding child element
+ CXmlElement xmlChildElement;
+
+ xmlElement.createChild(xmlChildElement, pChild->getKind());
+
+ // Set attributes
+ pChild->setXmlNameAttribute(xmlChildElement);
+
+
+ // Propagate
+ pChild->toXml(xmlChildElement, serializingContext);
+ }
+}
+
+void CElement::setXmlNameAttribute(CXmlElement& xmlElement) const
+{
+ // By default, set Name attribute if any
+ string strName = getName();
+
+ if (!strName.empty()) {
+
+ xmlElement.setNameAttribute(strName);
+ }
+}
+
+// Name
+void CElement::setName(const string& strName)
+{
+ _strName = strName;
+}
+
+const string& CElement::getName() const
+{
+ return _strName;
+}
+
+bool CElement::rename(const string& strName, string& strError)
+{
+ // Check for conflict with brotherhood if relevant
+ if (_pParent && _pParent->childrenAreDynamic()) {
+
+ uint32_t uiParentChild;
+ uint32_t uiParentNbChildren = _pParent->getNbChildren();
+
+ for (uiParentChild = 0; uiParentChild < uiParentNbChildren; uiParentChild++) {
+
+ const CElement* pParentChild = _pParent->getChild(uiParentChild);
+
+ if (pParentChild != this && pParentChild->getName() == strName) {
+
+ // Conflict
+ strError = "Name conflicts with brother element";
+
+ return false;
+ }
+ }
+ }
+ // Change name
+ setName(strName);
+
+ return true;
+}
+
+string CElement::getPathName() const
+{
+ if (!_strName.empty()) {
+
+ return _strName;
+ } else {
+
+ return getKind();
+ }
+}
+
+void CElement::addChild(CElement* pChild)
+{
+ _childArray.push_back(pChild);
+
+ pChild->_pParent = this;
+}
+
+CElement* CElement::getChild(uint32_t uiIndex)
+{
+ assert(uiIndex <= _childArray.size());
+
+ return _childArray[uiIndex];
+}
+
+const CElement* CElement::getChild(uint32_t uiIndex) const
+{
+ assert(uiIndex <= _childArray.size());
+
+ return _childArray[uiIndex];
+}
+
+CElement* CElement::getLastChild()
+{
+ uint32_t uiNbChildren = getNbChildren();
+
+ assert(uiNbChildren);
+
+ return _childArray[uiNbChildren - 1];
+}
+
+bool CElement::removeChild(CElement* pChild)
+{
+ ChildArrayIterator it;
+
+ for (it = _childArray.begin(); it != _childArray.end(); ++it) {
+
+ CElement* pElement = *it;
+
+ if (pElement == pChild) {
+
+ _childArray.erase(it);
+
+ return true;
+ }
+ }
+ return false;
+}
+
+void CElement::listChildren(string& strChildList) const
+{
+ strChildList = "\n";
+
+ // Get list of children names
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CElement* pChild = _childArray[uiChild];
+
+ strChildList += pChild->getName() + "\n";
+ }
+}
+
+string CElement::listQualifiedPaths(bool bDive, uint32_t uiLevel) const
+{
+ string strResult = getQualifiedPath() + "\n";
+
+ if (bDive || !uiLevel) {
+ // Get list of children paths
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CElement* pChild = _childArray[uiChild];
+
+ strResult += pChild->listQualifiedPaths(bDive, uiLevel + 1);
+ }
+ }
+ return strResult;
+}
+
+void CElement::listChildrenPaths(string& strChildList) const
+{
+ strChildList = "\n";
+
+ // Get list of children paths
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CElement* pChild = _childArray[uiChild];
+
+ strChildList += pChild->getPath() + "\n";
+ }
+}
+
+uint32_t CElement::getNbChildren() const
+{
+ return _childArray.size();
+}
+
+const CElement* CElement::getParent() const
+{
+ return _pParent;
+}
+
+CElement* CElement::getParent()
+{
+ return _pParent;
+}
+
+void CElement::clean()
+{
+ if (childrenAreDynamic()) {
+
+ removeChildren();
+ } else {
+ // Just propagate
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ _childArray[uiIndex]->clean();
+ }
+ }
+}
+
+void CElement::removeChildren()
+{
+ // Delete in reverse order
+ ChildArrayReverseIterator it;
+
+ for (it = _childArray.rbegin(); it != _childArray.rend(); ++it) {
+
+ delete *it;
+ }
+ _childArray.clear();
+}
+
+const CElement* CElement::findDescendant(CPathNavigator& pathNavigator) const
+{
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ return this;
+ }
+
+ const CElement* pChild = findChild(*pStrChildName);
+
+ if (!pChild) {
+
+ return NULL;
+ }
+
+ return pChild->findDescendant(pathNavigator);
+}
+
+CElement* CElement::findDescendant(CPathNavigator& pathNavigator)
+{
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ return this;
+ }
+
+ CElement* pChild = findChild(*pStrChildName);
+
+ if (!pChild) {
+
+ return NULL;
+ }
+
+ return pChild->findDescendant(pathNavigator);
+}
+
+bool CElement::isDescendantOf(const CElement* pCandidateAscendant) const
+{
+ if (!_pParent) {
+
+ return false;
+ }
+ if (_pParent == pCandidateAscendant) {
+
+ return true;
+ }
+ return _pParent->isDescendantOf(pCandidateAscendant);
+}
+
+CElement* CElement::findAscendantOfKind(const string& strKind)
+{
+ if (!_pParent) {
+
+ return NULL;
+ }
+
+ if (_pParent->getKind() == strKind) {
+
+ return _pParent;
+ }
+ return _pParent->findAscendantOfKind(strKind);
+}
+
+CElement* CElement::findChild(const string& strName)
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ CElement* pElement = _childArray[uiIndex];
+
+ if (pElement->getPathName() == strName) {
+
+ return pElement;
+ }
+ }
+
+ return NULL;
+}
+
+const CElement* CElement::findChild(const string& strName) const
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ const CElement* pElement = _childArray[uiIndex];
+
+ if (pElement->getPathName() == strName) {
+
+ return pElement;
+ }
+ }
+
+ return NULL;
+}
+
+CElement* CElement::findChildOfKind(const string& strKind)
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ CElement* pElement = _childArray[uiIndex];
+
+ if (pElement->getKind() == strKind) {
+
+ return pElement;
+ }
+ }
+
+ return NULL;
+}
+
+const CElement* CElement::findChildOfKind(const string& strKind) const
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ const CElement* pElement = _childArray[uiIndex];;
+
+ if (pElement->getKind() == strKind) {
+
+ return pElement;
+ }
+ }
+
+ return NULL;
+}
+
+CElement* CElement::getRoot()
+{
+ if (!_pParent) {
+
+ return this;
+ }
+ return _pParent->getRoot();
+}
+
+const CElement* CElement::getRoot() const
+{
+ if (!_pParent) {
+
+ return this;
+ }
+ return _pParent->getRoot();
+}
+
+string CElement::getPath() const
+{
+ // Take out root element from the path
+ if (_pParent && _pParent->_pParent) {
+
+ return _pParent->getPath() + "/" + getPathName();
+ }
+ return "/" + getPathName();
+}
+
+string CElement::getQualifiedPath() const
+{
+ return getPath() + " [" + getKind() + "]";
+}
+
+uint32_t CElement::getDepth() const
+{
+ if (_pParent) {
+
+ return _pParent->getDepth() + 1;
+ }
+
+ return 0;
+}
+
+// Checksum for integrity checks
+uint8_t CElement::computeStructureChecksum() const
+{
+ // Base checksum computation on element kind
+ string strKind = getKind();
+
+ // Get element kind
+ const char* pcData = strKind.c_str();
+
+ // Cumulate
+ uint8_t uiChecksum = 0;
+
+ while (*pcData) {
+
+ uiChecksum += *pcData++;
+ }
+
+ // Propagate
+ uint32_t uiIndex;
+ for (uiIndex = 0; uiIndex < _childArray.size(); uiIndex++) {
+
+ const CElement* pChild = _childArray[uiIndex];
+
+ uiChecksum += pChild->computeStructureChecksum();
+ }
+
+ return uiChecksum;
+}
+
diff --git a/parameter/Element.h b/parameter/Element.h
new file mode 100644
index 0000000..b3c3060
--- /dev/null
+++ b/parameter/Element.h
@@ -0,0 +1,145 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+#include <vector>
+#include <stdint.h>
+#include "XmlSink.h"
+#include "XmlSource.h"
+
+#include "PathNavigator.h"
+
+using namespace std;
+
+class CXmlElementSerializingContext;
+class CErrorContext;
+
+class CElement : public IXmlSink, public IXmlSource
+{
+ friend class CAutoLog;
+public:
+ CElement(const string& strName = "");
+ virtual ~CElement();
+
+ // Logging
+ void log(const string& strMessage, ...) const;
+
+ // Description
+ void setDescription(const string& strDescription);
+ const string& getDescription() const;
+
+ // Name / Path
+ const string& getName() const;
+ bool rename(const string& strName, string& strError);
+ string getPath() const;
+ string getQualifiedPath() const;
+
+ // Creation / build
+ virtual bool init(string& strError);
+ virtual void clean();
+
+ // Children management
+ void addChild(CElement* pChild);
+ bool removeChild(CElement* pChild);
+ void listChildren(string& strChildList) const;
+ string listQualifiedPaths(bool bDive, uint32_t uiLevel = 0) const;
+ void listChildrenPaths(string& strChildPathList) const;
+
+ // Hierarchy query
+ uint32_t getNbChildren() const;
+ CElement* findChildOfKind(const string& strKind);
+ const CElement* findChildOfKind(const string& strKind) const;
+ const CElement* getParent() const;
+ const CElement* getChild(uint32_t uiIndex) const;
+ CElement* getChild(uint32_t uiIndex);
+ const CElement* findChild(const string& strName) const;
+ CElement* findChild(const string& strName);
+ const CElement* findDescendant(CPathNavigator& pathNavigator) const;
+ CElement* findDescendant(CPathNavigator& pathNavigator);
+ bool isDescendantOf(const CElement* pCandidateAscendant) const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // From IXmlSource
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
+ // Content structure dump
+ void dumpContent(string& strContent, CErrorContext& errorContext, const uint32_t uiDepth = 0) const;
+
+ // Checksum for integrity checks
+ uint8_t computeStructureChecksum() const;
+
+ // Class kind
+ virtual string getKind() const = 0;
+protected:
+ // Content dumping
+ virtual void logValue(string& strValue, CErrorContext& errorContext) const;
+ // Name setting
+ void setName(const string& strName);
+
+ // Hierarchy
+ CElement* getLastChild();
+ CElement* getParent();
+ CElement* findAscendantOfKind(const string& strKind);
+ CElement* getRoot();
+ const CElement* getRoot() const;
+private:
+ // Logging (done by root)
+ virtual void doLog(const string& strLog) const;
+ virtual void nestLog() const;
+ virtual void unnestLog() const;
+ // Returns Name or Kind if no Name
+ string getPathName() const;
+ // Returns true if children dynamic creation is to be dealt with
+ virtual bool childrenAreDynamic() const;
+ // House keeping
+ void removeChildren();
+ // For logging
+ uint32_t getDepth() const;
+ // Fill XmlElement during XML composing
+ void setXmlNameAttribute(CXmlElement& xmlElement) const;
+
+ // Name
+ string _strName;
+
+ // Description
+ string _strDescription;
+
+ // Child iterators
+ typedef vector<CElement*>::iterator ChildArrayIterator;
+ typedef vector<CElement*>::reverse_iterator ChildArrayReverseIterator;
+ // Children
+ vector<CElement*> _childArray;
+ // Parent
+ CElement* _pParent;
+};
diff --git a/parameter/ElementBuilder.cpp b/parameter/ElementBuilder.cpp
new file mode 100644
index 0000000..2b52692
--- /dev/null
+++ b/parameter/ElementBuilder.cpp
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ElementBuilder.h"
+
+CElementBuilder::CElementBuilder(const string& strType) : _strType(strType)
+{
+}
+
+CElementBuilder::~CElementBuilder()
+{
+}
+
+const string& CElementBuilder::getType() const
+{
+ return _strType;
+}
diff --git a/parameter/ElementBuilder.h b/parameter/ElementBuilder.h
new file mode 100644
index 0000000..da3a276
--- /dev/null
+++ b/parameter/ElementBuilder.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CElementBuilder
+{
+public:
+ CElementBuilder(const string& strType);
+ virtual ~CElementBuilder();
+
+ const string& getType() const;
+
+ virtual CElement* createElement(const CXmlElement& xmlElement) const = 0;
+private:
+ string _strType;
+};
diff --git a/parameter/ElementBuilderTemplate.h b/parameter/ElementBuilderTemplate.h
new file mode 100644
index 0000000..3a1c968
--- /dev/null
+++ b/parameter/ElementBuilderTemplate.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ElementBuilder.h"
+
+template <class ElementType>
+class CElementBuilderTemplate : public CElementBuilder
+{
+public:
+ CElementBuilderTemplate(const string& strType) : CElementBuilder(strType) {}
+
+ virtual CElement* createElement(const CXmlElement& xmlElement) const
+ {
+ (void)xmlElement;
+ return new ElementType;
+ }
+};
diff --git a/parameter/ElementLibrary.cpp b/parameter/ElementLibrary.cpp
new file mode 100644
index 0000000..8b3ab8a
--- /dev/null
+++ b/parameter/ElementLibrary.cpp
@@ -0,0 +1,75 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ElementLibrary.h"
+#include "ElementBuilder.h"
+
+
+CElementLibrary::CElementLibrary()
+{
+}
+
+CElementLibrary::~CElementLibrary()
+{
+ clean();
+}
+
+void CElementLibrary::clean()
+{
+ ElementBuilderMapIterator it;
+
+ for (it = _elementBuilderMap.begin(); it != _elementBuilderMap.end(); ++it) {
+
+ delete it->second;
+ }
+ _elementBuilderMap.clear();
+}
+
+CElement* CElementLibrary::createElement(const CXmlElement& xmlElement) const
+{
+ ElementBuilderMapConstIterator it = _elementBuilderMap.find(getBuilderType(xmlElement));
+
+ if (it != _elementBuilderMap.end()) {
+
+ return it->second->createElement(xmlElement);
+ }
+ return NULL;
+}
+
+void CElementLibrary::addElementBuilder(CElementBuilder* pElementBuilder)
+{
+ _elementBuilderMap[pElementBuilder->getType()] = pElementBuilder;
+}
+
+string CElementLibrary::getBuilderType(const CXmlElement& xmlElement) const
+{
+ // Defaulting to xml element name
+ return xmlElement.getType();
+}
diff --git a/parameter/ElementLibrary.h b/parameter/ElementLibrary.h
new file mode 100644
index 0000000..d41bf09
--- /dev/null
+++ b/parameter/ElementLibrary.h
@@ -0,0 +1,64 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <map>
+#include <string>
+
+#include "Element.h"
+
+using namespace std;
+
+class CElementBuilder;
+
+class CElementLibrary
+{
+ typedef map<string, CElementBuilder*>::iterator ElementBuilderMapIterator;
+ typedef map<string, CElementBuilder*>::const_iterator ElementBuilderMapConstIterator;
+
+public:
+ CElementLibrary();
+ virtual ~CElementLibrary();
+
+ // Filling
+ void addElementBuilder(CElementBuilder* pElementBuilder);
+ void clean();
+
+ // Instantiation
+ CElement* createElement(const CXmlElement& xmlElement) const;
+
+private:
+ // Builder type
+ virtual string getBuilderType(const CXmlElement& xmlElement) const;
+
+ // Builders
+ map<string, CElementBuilder*> _elementBuilderMap;
+};
diff --git a/parameter/ElementLibrarySet.cpp b/parameter/ElementLibrarySet.cpp
new file mode 100644
index 0000000..5bb6fe4
--- /dev/null
+++ b/parameter/ElementLibrarySet.cpp
@@ -0,0 +1,58 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ElementLibrarySet.h"
+#include <assert.h>
+
+CElementLibrarySet::CElementLibrarySet()
+{
+}
+
+CElementLibrarySet::~CElementLibrarySet()
+{
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _elementLibraryArray.size(); uiIndex++) {
+
+ delete _elementLibraryArray[uiIndex];
+ }
+}
+
+void CElementLibrarySet::addElementLibrary(CElementLibrary* pElementLibrary)
+{
+ _elementLibraryArray.push_back(pElementLibrary);
+}
+
+CElementLibrary* CElementLibrarySet::getElementLibrary(uint32_t uiIndex) const
+{
+ assert(uiIndex <= _elementLibraryArray.size());
+
+ return _elementLibraryArray[uiIndex];
+}
diff --git a/parameter/ElementLibrarySet.h b/parameter/ElementLibrarySet.h
new file mode 100644
index 0000000..8ff625d
--- /dev/null
+++ b/parameter/ElementLibrarySet.h
@@ -0,0 +1,45 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ElementLibrary.h"
+
+class CElementLibrarySet
+{
+public:
+ CElementLibrarySet();
+ ~CElementLibrarySet();
+
+ void addElementLibrary(CElementLibrary* pElementLibrary);
+ CElementLibrary* getElementLibrary(uint32_t uiIndex) const;
+
+private:
+ typedef vector<CElementLibrary*>::iterator CElementLibraryArrayIterator;
+ vector<CElementLibrary*> _elementLibraryArray;
+};
diff --git a/parameter/ElementLocator.cpp b/parameter/ElementLocator.cpp
new file mode 100644
index 0000000..71ed5ad
--- /dev/null
+++ b/parameter/ElementLocator.cpp
@@ -0,0 +1,85 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ElementLocator.h"
+#include "PathNavigator.h"
+
+CElementLocator::CElementLocator(CElement* pSubRootElement, bool bStrict) : _pSubRootElement(pSubRootElement), _bStrict(bStrict)
+{
+}
+
+
+// Locate element
+bool CElementLocator::locate(const string& strPath, CElement** ppElement, string& strError)
+{
+ CPathNavigator pathNavigator(strPath);
+
+ if (!pathNavigator.isPathValid()) {
+
+ strError = "Invalid Path";
+
+ return false;
+ }
+
+ // Sub root element?
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ if (_bStrict) {
+
+ strError = "Path not found";
+
+ return false;
+ }
+ // Empty path
+ return true;
+ }
+
+ if (*pStrChildName != _pSubRootElement->getName()) {
+
+ strError = "Path not found";
+
+ return false;
+ }
+
+ // Find in tree
+ *ppElement = _pSubRootElement->findDescendant(pathNavigator);
+
+ if (!*ppElement) {
+
+ strError = "Path not found";
+
+ return false;
+ }
+
+ return true;
+}
+
diff --git a/parameter/ElementLocator.h b/parameter/ElementLocator.h
new file mode 100644
index 0000000..27757bf
--- /dev/null
+++ b/parameter/ElementLocator.h
@@ -0,0 +1,50 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CElementLocator
+{
+public:
+ CElementLocator(CElement* pSubRootElement, bool bStrict = true);
+
+ // Locate element
+ bool locate(const string& strPath, CElement** ppElement, string& strError);
+
+private:
+ // Subroot element
+ CElement* _pSubRootElement;
+
+ // Strict means empty path will cause path not found error to be returned
+ bool _bStrict;
+};
+
diff --git a/parameter/ErrorContext.cpp b/parameter/ErrorContext.cpp
new file mode 100644
index 0000000..06ccf39
--- /dev/null
+++ b/parameter/ErrorContext.cpp
@@ -0,0 +1,52 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ErrorContext.h"
+
+CErrorContext::CErrorContext(string& strError) : _strError(strError)
+{
+}
+
+// Error
+void CErrorContext::setError(const string& strError)
+{
+ _strError = strError;
+}
+
+void CErrorContext::appendToError(const string& strAppend)
+{
+ _strError += strAppend;
+}
+
+const string& CErrorContext::getError() const
+{
+ return _strError;
+}
+
diff --git a/parameter/ErrorContext.h b/parameter/ErrorContext.h
new file mode 100644
index 0000000..919a226
--- /dev/null
+++ b/parameter/ErrorContext.h
@@ -0,0 +1,51 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+class CErrorContext
+{
+public:
+ CErrorContext(string& strError);
+
+ // Error
+ void setError(const string& strError);
+ void appendToError(const string& strAppend);
+ const string& getError() const;
+
+private:
+ // Error reference
+ string& _strError;
+};
+
diff --git a/parameter/FixedPointParameterType.cpp b/parameter/FixedPointParameterType.cpp
new file mode 100644
index 0000000..86c9053
--- /dev/null
+++ b/parameter/FixedPointParameterType.cpp
@@ -0,0 +1,173 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "FixedPointParameterType.h"
+#include <stdlib.h>
+#include <sstream>
+#include "Parameter.h"
+#include "ParameterAccessContext.h"
+#include "ConfigurationAccessContext.h"
+
+#define base CParameterType
+
+CFixedPointParameterType::CFixedPointParameterType(const string& strName) : base(strName), _uiIntegral(0), _uiFractional(0)
+{
+}
+
+string CFixedPointParameterType::getKind() const
+{
+ return "FixedPointParameter";
+}
+
+// XML Serialization value space handling
+// Value space handling for configuration import
+void CFixedPointParameterType::handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Direction?
+ if (!configurationAccessContext.serializeOut()) {
+
+ // Get Value space from XML
+ if (xmlConfigurableElementSettingsElement.hasAttribute("ValueSpace")) {
+
+ configurationAccessContext.setValueSpaceRaw(xmlConfigurableElementSettingsElement.getAttributeBoolean("ValueSpace", "Raw"));
+ } else {
+
+ configurationAccessContext.setValueSpaceRaw(false);
+ }
+ } else {
+ // Provide value space only if not the default one
+ if (configurationAccessContext.valueSpaceIsRaw()) {
+
+ xmlConfigurableElementSettingsElement.setAttributeString("ValueSpace", "Raw");
+ }
+ }
+}
+
+bool CFixedPointParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Size
+ uint32_t uiSizeInBits = xmlElement.getAttributeInteger("Size");
+
+ // Q notation
+ _uiIntegral = xmlElement.getAttributeInteger("Integral");
+ _uiFractional = xmlElement.getAttributeInteger("Fractional");
+
+ // Size vs. Q notation integrity check
+ if (uiSizeInBits < getUtilSizeInBits()) {
+
+ serializingContext.setError("Inconsistent Size vs. Q notation for " + getKind() + " " + xmlElement.getPath() + ": Summing (Integral + _uiFractional + 1) should be less than given Size (" + xmlElement.getAttributeString("Size") + ")");
+
+ return false;
+ }
+
+ // Set the size
+ setSize(uiSizeInBits / 8);
+
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+bool CFixedPointParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const
+{
+ int32_t iData;
+
+ if (parameterAccessContext.valueSpaceIsRaw()) {
+
+ iData = strtol(strValue.c_str(), NULL, 0);
+
+ } else {
+ double dData = strtod(strValue.c_str(), NULL);
+
+ // Do the conversion
+ iData = (int32_t)(dData * (1UL << _uiFractional) + 0.5F - (double)(dData < 0));
+ }
+
+ // Check for admitted range: [-2^m, 2^m - 2^n]
+ uint32_t uiSizeInBits = getUtilSizeInBits();
+
+ int32_t iMin = ((int32_t)1 << 31) >> (32 - uiSizeInBits);
+ int32_t iMax = -iMin - 1;
+
+ if (iData < iMin || iData > iMax) {
+ ostringstream strStream;
+
+ strStream << "Value " << strValue << " standing out of admitted ";
+
+ if (!parameterAccessContext.valueSpaceIsRaw()) {
+
+ strStream << "real range [" << (double)iMin / (1UL << _uiFractional) << ", "<< (double)iMax / (1UL << _uiFractional) << "]";
+ } else {
+
+ strStream << "raw range [" << iMin << ", " << iMax << "]";
+ }
+ strStream << " for " << getKind();
+
+ parameterAccessContext.setError(strStream.str());
+
+ return false;
+ }
+
+ uiValue = (uint32_t)iData;
+
+ return true;
+}
+
+void CFixedPointParameterType::asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const
+{
+ int32_t iData = (int32_t)uiValue;
+
+ // Sign extend
+ uint32_t uiShift = 32 - getUtilSizeInBits();
+
+ if (uiShift) {
+
+ iData = (iData << uiShift) >> uiShift;
+ }
+
+ // Format
+ ostringstream strStream;
+
+ if (parameterAccessContext.valueSpaceIsRaw()) {
+
+ strStream << iData;
+ } else {
+
+ double dData = (double)iData / (1UL << _uiFractional);
+
+ strStream << dData;
+ }
+
+ strValue = strStream.str();
+}
+
+// Util size
+uint32_t CFixedPointParameterType::getUtilSizeInBits() const
+{
+ return _uiIntegral + _uiFractional + 1;
+}
diff --git a/parameter/FixedPointParameterType.h b/parameter/FixedPointParameterType.h
new file mode 100644
index 0000000..4aaf5a0
--- /dev/null
+++ b/parameter/FixedPointParameterType.h
@@ -0,0 +1,61 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterType.h"
+
+class CFixedPointParameterType : public CParameterType
+{
+public:
+ CFixedPointParameterType(const string& strName);
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // XML Serialization value space handling
+ // Value space handling for configuration import
+ virtual void handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+
+ // Conversion
+ virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
+ virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const;
+
+ // CElement
+ virtual string getKind() const;
+private:
+ // Util size
+ uint32_t getUtilSizeInBits() const;
+
+ // Integral part in Q notation
+ uint32_t _uiIntegral;
+ // Fractional part in Q notation
+ uint32_t _uiFractional;
+};
diff --git a/parameter/FrameworkConfigurationGroup.cpp b/parameter/FrameworkConfigurationGroup.cpp
new file mode 100644
index 0000000..6e99369
--- /dev/null
+++ b/parameter/FrameworkConfigurationGroup.cpp
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "FrameworkConfigurationGroup.h"
+
+#define base CKindElement
+
+CFrameworkConfigurationGroup::CFrameworkConfigurationGroup(const string& strName, const string& strKind) : base(strName, strKind)
+{
+}
+
+bool CFrameworkConfigurationGroup::childrenAreDynamic() const
+{
+ return true;
+}
+
diff --git a/parameter/FrameworkConfigurationGroup.h b/parameter/FrameworkConfigurationGroup.h
new file mode 100644
index 0000000..a8a5dd3
--- /dev/null
+++ b/parameter/FrameworkConfigurationGroup.h
@@ -0,0 +1,42 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "KindElement.h"
+
+class CFrameworkConfigurationGroup : public CKindElement
+{
+public:
+ CFrameworkConfigurationGroup(const string& strName, const string& strKind);
+
+private:
+ virtual bool childrenAreDynamic() const;
+};
diff --git a/parameter/FrameworkConfigurationLocation.cpp b/parameter/FrameworkConfigurationLocation.cpp
new file mode 100644
index 0000000..77c8d71
--- /dev/null
+++ b/parameter/FrameworkConfigurationLocation.cpp
@@ -0,0 +1,109 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "FrameworkConfigurationLocation.h"
+#include <assert.h>
+
+#define base CKindElement
+
+CFrameworkConfigurationLocation::CFrameworkConfigurationLocation(const string& strName, const string& strKind) : base(strName, strKind)
+{
+}
+
+// From IXmlSink
+bool CFrameworkConfigurationLocation::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ _strPath = xmlElement.getAttributeString("Path");
+
+ if (_strPath.empty()) {
+
+ serializingContext.setError("Empty Path attribute in elememnt " + xmlElement.getPath());
+
+ return false;
+ }
+ return true;
+}
+
+string CFrameworkConfigurationLocation::getFilePath(const string& strBaseFolder) const
+{
+ if (isPathRelative()) {
+
+ return strBaseFolder + "/" + _strPath;
+ }
+ return _strPath;
+}
+
+bool CFrameworkConfigurationLocation::isPathRelative() const
+{
+ return _strPath[0] != '/';
+}
+
+string CFrameworkConfigurationLocation::getFolderPath(const string& strBaseFolder) const
+{
+ uint32_t uiSlashPos = _strPath.rfind('/', -1);
+
+ string strFolderPath = ".";
+
+ if (isPathRelative()) {
+
+ if (uiSlashPos != (uint32_t)-1) {
+
+ strFolderPath = _strPath.substr(0, uiSlashPos);
+
+ return strBaseFolder + "/" + strFolderPath;
+
+ } else {
+
+ return strBaseFolder;
+ }
+ } else {
+
+ assert(uiSlashPos != (uint32_t)-1);
+
+ strFolderPath = _strPath.substr(0, uiSlashPos);
+
+ return strFolderPath;
+ }
+}
+
+#if 0
+string CFrameworkConfigurationLocation::getFileName() const
+{
+ uint32_t uiSlashPos = _strPath.rfind('/', -1);
+
+ if (uiSlashPos != (uint32_t)-1) {
+
+ return _strPath.substr(uiSlashPos + 1, _strPath.size() - uiSlashPos - 1);
+ } else {
+
+ return _strPath;
+ }
+}
+#endif
diff --git a/parameter/FrameworkConfigurationLocation.h b/parameter/FrameworkConfigurationLocation.h
new file mode 100644
index 0000000..2b3bd9a
--- /dev/null
+++ b/parameter/FrameworkConfigurationLocation.h
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "KindElement.h"
+
+class CFrameworkConfigurationLocation : public CKindElement
+{
+public:
+ CFrameworkConfigurationLocation(const string& strName, const string& strKind);
+
+ string getFilePath(const string& strBaseFolder) const;
+ string getFolderPath(const string& strBaseFolder) const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+private:
+ bool isPathRelative() const;
+
+ string _strPath;
+};
diff --git a/parameter/HardwareBackSynchronizer.cpp b/parameter/HardwareBackSynchronizer.cpp
new file mode 100644
index 0000000..df2b41d
--- /dev/null
+++ b/parameter/HardwareBackSynchronizer.cpp
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "HardwareBackSynchronizer.h"
+#include "ConfigurableElement.h"
+
+#define base CBackSynchronizer
+
+CHardwareBackSynchronizer::CHardwareBackSynchronizer(const CConfigurableElement* pConfigurableElement, string& strError, CParameterBlackboard* pParameterBlackboard)
+ : base(pConfigurableElement), _strError(strError), _pParameterBlackboard(pParameterBlackboard)
+{
+ // Fill back syncer set
+ list<const CConfigurableElement*>::const_iterator it;
+
+ for (it = _needingBackSyncList.begin(); it != _needingBackSyncList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ pConfigurableElement->fillSyncerSet(_backSyncerSet);
+ }
+}
+
+// Back synchronization
+bool CHardwareBackSynchronizer::sync()
+{
+ // Perform back synchronization
+ return _backSyncerSet.sync(*_pParameterBlackboard, true, _strError);
+}
diff --git a/parameter/HardwareBackSynchronizer.h b/parameter/HardwareBackSynchronizer.h
new file mode 100644
index 0000000..f2259b4
--- /dev/null
+++ b/parameter/HardwareBackSynchronizer.h
@@ -0,0 +1,52 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "BackSynchronizer.h"
+#include "SyncerSet.h"
+
+class CHardwareBackSynchronizer : public CBackSynchronizer
+{
+public:
+ CHardwareBackSynchronizer(const CConfigurableElement* pConfigurableElement, string& strError, CParameterBlackboard* pParameterBlackboard);
+
+ // Back synchronization
+ virtual bool sync();
+
+private:
+ // Back syncer set
+ CSyncerSet _backSyncerSet;
+ // Error
+ string& _strError;
+ // Parameter blackboard
+ CParameterBlackboard* _pParameterBlackboard;
+};
+
diff --git a/parameter/InstanceConfigurableElement.cpp b/parameter/InstanceConfigurableElement.cpp
new file mode 100644
index 0000000..9dcc2ef
--- /dev/null
+++ b/parameter/InstanceConfigurableElement.cpp
@@ -0,0 +1,171 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "InstanceConfigurableElement.h"
+#include "Mapper.h"
+#include "SyncerSet.h"
+#include "Syncer.h"
+#include "TypeElement.h"
+#include "ParameterAccessContext.h"
+#include <assert.h>
+
+#define base CConfigurableElement
+
+CInstanceConfigurableElement::CInstanceConfigurableElement(const string& strName, const CTypeElement* pTypeElement) : base(strName), _pTypeElement(pTypeElement), _pSyncer(NULL)
+{
+}
+
+string CInstanceConfigurableElement::getKind() const
+{
+ // Delegate
+ return getTypeElement()->getKind();
+}
+
+// Type element
+const CTypeElement* CInstanceConfigurableElement::getTypeElement() const
+{
+ return _pTypeElement;
+}
+
+// Mapping
+bool CInstanceConfigurableElement::getMappingData(const string& strKey, string& strValue) const
+{
+ // Delegate
+ return getTypeElement()->getMappingData(strKey, strValue);
+}
+
+bool CInstanceConfigurableElement::map(IMapper& mapper, string& strError)
+{
+ bool bHasMappingData = getTypeElement()->hasMappingData();
+
+ // Begin
+ if (bHasMappingData) {
+
+ if (!mapper.mapBegin(this, strError)) {
+
+ return false;
+ }
+ }
+
+ // Map children
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ CInstanceConfigurableElement* pInstanceConfigurableChildElement = static_cast<CInstanceConfigurableElement*>(getChild(uiChild));
+
+ if (!pInstanceConfigurableChildElement->map(mapper, strError)) {
+
+ return false;
+ }
+ }
+
+ // End
+ if (bHasMappingData) {
+
+ mapper.mapEnd();
+ }
+ return true;
+}
+
+// Sync to HW
+void CInstanceConfigurableElement::setSyncer(ISyncer* pSyncer)
+{
+ assert(!_pSyncer);
+
+ _pSyncer = pSyncer;
+}
+
+void CInstanceConfigurableElement::unsetSyncer()
+{
+ _pSyncer = NULL;
+}
+
+// Syncer
+ISyncer* CInstanceConfigurableElement::getSyncer() const
+{
+ if (_pSyncer) {
+
+ return _pSyncer;
+ }
+ // Check parent
+ return base::getSyncer();
+}
+
+// Syncer set (descendant)
+void CInstanceConfigurableElement::fillSyncerSetFromDescendant(CSyncerSet& syncerSet) const
+{
+ if (_pSyncer) {
+
+ syncerSet += _pSyncer;
+ } else {
+ // Continue digging
+ base::fillSyncerSetFromDescendant(syncerSet);
+ }
+}
+
+// Sync
+bool CInstanceConfigurableElement::sync(CParameterAccessContext& parameterAccessContext) const
+{
+ ISyncer* pSyncer = getSyncer();
+
+ if (!pSyncer) {
+
+ parameterAccessContext.setError("Unable to synchronize modification. No Syncer object assiciated to configurable element " + getPath());
+
+ return false;
+ }
+ string strError;
+
+ if (!pSyncer->sync(*parameterAccessContext.getParameterBlackboard(), false, strError)) {
+
+ parameterAccessContext.setError(strError);
+
+ return false;
+ }
+ return true;
+}
+
+// Check parameter access path well formed for leaf elements
+bool CInstanceConfigurableElement::checkPathExhausted(CPathNavigator& pathNavigator, CErrorContext& errorContext)
+{
+ string* pStrChildName = pathNavigator.next();
+
+ if (pStrChildName) {
+
+ // Should be leaf element
+ errorContext.setError("Path not found: " + pathNavigator.getCurrentPath());
+
+ return false;
+ }
+ return true;
+}
+
diff --git a/parameter/InstanceConfigurableElement.h b/parameter/InstanceConfigurableElement.h
new file mode 100644
index 0000000..517646c
--- /dev/null
+++ b/parameter/InstanceConfigurableElement.h
@@ -0,0 +1,87 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ConfigurableElement.h"
+#include "TypeElement.h"
+
+class IMapper;
+class CParameterBlackboard;
+class CParameterAccessContext;
+
+class CInstanceConfigurableElement : public CConfigurableElement
+{
+public:
+ enum Type {
+ EBitParameter,
+ EBitParameterBlock,
+ EParameter,
+ EParameterBlock,
+ EComponent
+ };
+
+ CInstanceConfigurableElement(const string& strName, const CTypeElement* pTypeElement);
+
+ // Instantiated type
+ const CTypeElement* getTypeElement() const;
+
+ // Mapping info
+ bool getMappingData(const string& strKey, string& strValue) const;
+
+ // From CElement
+ virtual string getKind() const;
+
+ // Syncer to/from HW
+ void setSyncer(ISyncer* pSyncer);
+ void unsetSyncer();
+
+ // Type
+ virtual Type getType() const = 0;
+
+ // Mapping execution
+ bool map(IMapper& mapper, string& strError);
+protected:
+ // Syncer
+ virtual ISyncer* getSyncer() const;
+ // Syncer set (descendant)
+ virtual void fillSyncerSetFromDescendant(CSyncerSet& syncerSet) const;
+ // Sync
+ bool sync(CParameterAccessContext& parameterAccessContext) const;
+ // Check parameter access path well formed for leaf elements
+ static bool checkPathExhausted(CPathNavigator& pathNavigator, CErrorContext& errorContext);
+private:
+ // Type Element
+ const CTypeElement* _pTypeElement;
+
+ // Sync to HW
+ ISyncer* _pSyncer;
+};
+
diff --git a/parameter/InstanceDefinition.cpp b/parameter/InstanceDefinition.cpp
new file mode 100644
index 0000000..46f52b0
--- /dev/null
+++ b/parameter/InstanceDefinition.cpp
@@ -0,0 +1,61 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "InstanceDefinition.h"
+#include <assert.h>
+
+#define base CTypeElement
+
+CInstanceDefinition::CInstanceDefinition()
+{
+}
+
+string CInstanceDefinition::getKind() const
+{
+ return "InstanceDefinition";
+}
+
+bool CInstanceDefinition::childrenAreDynamic() const
+{
+ return true;
+}
+
+CInstanceConfigurableElement* CInstanceDefinition::doInstantiate() const
+{
+ // Element not supposed to be instantiated direcly
+ assert(0);
+
+ return NULL;
+}
+
+void CInstanceDefinition::createInstances(CElement* pFatherElement)
+{
+ populate(pFatherElement);
+}
diff --git a/parameter/InstanceDefinition.h b/parameter/InstanceDefinition.h
new file mode 100644
index 0000000..98cba40
--- /dev/null
+++ b/parameter/InstanceDefinition.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "TypeElement.h"
+
+class CInstanceDefinition : public CTypeElement
+{
+public:
+ CInstanceDefinition();
+
+ void createInstances(CElement* pFatherElement);
+
+ virtual string getKind() const;
+private:
+ virtual bool childrenAreDynamic() const;
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+};
diff --git a/parameter/IntegerParameterType.cpp b/parameter/IntegerParameterType.cpp
new file mode 100644
index 0000000..14093ff
--- /dev/null
+++ b/parameter/IntegerParameterType.cpp
@@ -0,0 +1,160 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "IntegerParameterType.h"
+#include <stdlib.h>
+#include <sstream>
+#include "ParameterAccessContext.h"
+
+#define base CParameterType
+
+CIntegerParameterType::CIntegerParameterType(const string& strName) : base(strName), _uiMin(0), _uiMax(uint32_t(-1))
+{
+}
+
+string CIntegerParameterType::getKind() const
+{
+ return "IntegerParameter";
+}
+
+bool CIntegerParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Sign
+ _bSigned = xmlElement.getAttributeBoolean("Signed");
+
+ // Size
+ setSize(xmlElement.getAttributeInteger("Size") / 8);
+
+ // Min / Max
+ if (_bSigned) {
+ if (xmlElement.hasAttribute("Min")) {
+
+ _uiMin = (uint32_t)xmlElement.getAttributeSignedInteger("Min");
+ } else {
+
+ _uiMin = 1UL << 31;
+ }
+ if (xmlElement.hasAttribute("Max")) {
+
+ _uiMax = (uint32_t)xmlElement.getAttributeSignedInteger("Max");
+ } else {
+
+ _uiMax = (1UL << 31) - 1;
+ }
+ } else {
+ if (xmlElement.hasAttribute("Min")) {
+
+ _uiMin = xmlElement.getAttributeInteger("Min");
+ } else {
+
+ _uiMin = 0;
+ }
+ if (xmlElement.hasAttribute("Max")) {
+
+ _uiMax = xmlElement.getAttributeInteger("Max");
+ } else {
+
+ _uiMax = (uint32_t)-1;
+ }
+ }
+
+ // Base
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+bool CIntegerParameterType::asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const
+{
+ uiValue = strtoul(strValue.c_str(), NULL, 0);
+
+ // Check against Min / Max
+ if (_bSigned) {
+
+ if (!checkValueAgainstRange<int32_t>(uiValue, parameterAccessContext)) {
+
+ return false;
+ }
+ } else {
+
+ if (!checkValueAgainstRange<uint32_t>(uiValue, parameterAccessContext)) {
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void CIntegerParameterType::asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const
+{
+ (void)parameterAccessContext;
+
+ // Format
+ ostringstream strStream;
+
+ if (_bSigned) {
+ // Sign extend
+ uint32_t uiShift = (4 - getSize()) << 3;
+
+ int32_t iValue = (int32_t)uiValue;
+
+ if (uiShift) {
+
+ iValue = (iValue << uiShift) >> uiShift;
+ }
+
+ strStream << iValue;
+ } else {
+
+ strStream << uiValue;
+ }
+
+ strValue = strStream.str();
+}
+
+// Default value handling (simulation only)
+uint32_t CIntegerParameterType::getDefaultValue() const
+{
+ return _uiMin;
+}
+
+// Range checking
+template <class type> bool CIntegerParameterType::checkValueAgainstRange(type value, CParameterAccessContext& parameterAccessContext) const
+{
+ if ((type)value < (type)_uiMin || (type)value > (type)_uiMax) {
+ ostringstream strStream;
+
+ strStream << "Value " << value << " standing out of admitted range: [" << (type)_uiMin << ", " << (type)_uiMax << "] for " << getKind();
+
+ parameterAccessContext.setError(strStream.str());
+
+ return false;
+ }
+ return true;
+}
diff --git a/parameter/IntegerParameterType.h b/parameter/IntegerParameterType.h
new file mode 100644
index 0000000..f1b3e64
--- /dev/null
+++ b/parameter/IntegerParameterType.h
@@ -0,0 +1,61 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterType.h"
+
+class CIntegerParameterType : public CParameterType
+{
+public:
+ CIntegerParameterType(const string& strName);
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Conversion
+ virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const;
+ virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const;
+
+ // Default value handling (simulation only)
+ virtual uint32_t getDefaultValue() const;
+
+ // CElement
+ virtual string getKind() const;
+private:
+ // Range checking
+ template <class type> bool checkValueAgainstRange(type value, CParameterAccessContext& parameterAccessContext) const;
+
+ // Signing
+ bool _bSigned;
+ // Range
+ uint32_t _uiMin;
+ uint32_t _uiMax;
+};
diff --git a/parameter/KindElement.cpp b/parameter/KindElement.cpp
new file mode 100644
index 0000000..3a538f5
--- /dev/null
+++ b/parameter/KindElement.cpp
@@ -0,0 +1,42 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "KindElement.h"
+
+#define base CElement
+
+CKindElement::CKindElement(const string& strName, const string& strKind) : base(strName), _strKind(strKind)
+{
+}
+
+string CKindElement::getKind() const
+{
+ return _strKind;
+}
diff --git a/parameter/KindElement.h b/parameter/KindElement.h
new file mode 100644
index 0000000..3f1e75f
--- /dev/null
+++ b/parameter/KindElement.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CKindElement : public CElement
+{
+public:
+ CKindElement(const string& strName, const string& strKind);
+
+ virtual string getKind() const;
+private:
+
+ string _strKind;
+};
diff --git a/parameter/KindElementBuilderTemplate.h b/parameter/KindElementBuilderTemplate.h
new file mode 100644
index 0000000..3f6677b
--- /dev/null
+++ b/parameter/KindElementBuilderTemplate.h
@@ -0,0 +1,45 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ElementBuilder.h"
+
+template <class ElementType>
+class CKindElementBuilderTemplate : public CElementBuilder
+{
+public:
+ CKindElementBuilderTemplate(const string& strType) : CElementBuilder(strType) {}
+
+ virtual CElement* createElement(const CXmlElement& xmlElement) const
+ {
+ return new ElementType(xmlElement.getNameAttribute(), xmlElement.getType());
+ }
+};
diff --git a/parameter/Mapper.h b/parameter/Mapper.h
new file mode 100644
index 0000000..4f32ca8
--- /dev/null
+++ b/parameter/Mapper.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+class CInstanceConfigurableElement;
+
+class IMapper
+{
+public:
+ virtual bool mapBegin(CInstanceConfigurableElement* pInstanceConfigurableElement, string& strError) = 0;
+ virtual void mapEnd() = 0;
+};
diff --git a/parameter/MappingContext.cpp b/parameter/MappingContext.cpp
new file mode 100644
index 0000000..2f36c97
--- /dev/null
+++ b/parameter/MappingContext.cpp
@@ -0,0 +1,100 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "MappingContext.h"
+#include <string.h>
+#include <stdlib.h>
+
+CMappingContext::CMappingContext(uint32_t uiNbItems) : _pstItemArray(new CMappingContext::SItem[uiNbItems]), _uiNbItems(uiNbItems)
+{
+ // Clear items
+ memset(_pstItemArray, 0, sizeof(*_pstItemArray) * uiNbItems);
+}
+
+CMappingContext::~CMappingContext()
+{
+ delete [] _pstItemArray;
+}
+
+// Copy constructor
+CMappingContext::CMappingContext(const CMappingContext& from) : _pstItemArray(new CMappingContext::SItem[from._uiNbItems]), _uiNbItems(from._uiNbItems)
+{
+ // Copy content items
+ memcpy(_pstItemArray, from._pstItemArray, sizeof(*_pstItemArray) * _uiNbItems);
+}
+
+// Affectation
+const CMappingContext& CMappingContext::operator=(const CMappingContext& right)
+{
+ if (&right != this) {
+
+ // Size
+ _uiNbItems = right._uiNbItems;
+
+ // Content
+ // Delete previous array
+ delete [] _pstItemArray;
+
+ // Reallocate it
+ _pstItemArray = new CMappingContext::SItem[_uiNbItems];
+
+ // Copy content items
+ memcpy(_pstItemArray, right._pstItemArray, sizeof(*_pstItemArray) * _uiNbItems);
+ }
+ return *this;
+}
+
+// Item access
+bool CMappingContext::setItem(uint32_t uiItemType, const string& strItem)
+{
+ // Do some checks
+ if (_pstItemArray[uiItemType].bSet) {
+
+ // Already set!
+ return false;
+ }
+ // Get item value
+ _pstItemArray[uiItemType].uiItem = strtoul(strItem.c_str(), NULL, 0);
+
+ // Now is set
+ _pstItemArray[uiItemType].bSet = true;
+
+ return true;
+}
+
+uint32_t CMappingContext::getItem(uint32_t uiItemType) const
+{
+ return _pstItemArray[uiItemType].uiItem;
+}
+
+bool CMappingContext::iSet(uint32_t uiItemType) const
+{
+ return _pstItemArray[uiItemType].bSet;
+}
diff --git a/parameter/MappingContext.h b/parameter/MappingContext.h
new file mode 100644
index 0000000..aca9349
--- /dev/null
+++ b/parameter/MappingContext.h
@@ -0,0 +1,67 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <string>
+
+using namespace std;
+
+class CMappingContext
+{
+ // Item structure
+ struct SItem {
+ uint32_t uiItem;
+ bool bSet;
+ };
+
+public:
+ // Regular Constructor
+ CMappingContext(uint32_t uiNbItems);
+ ~CMappingContext();
+
+ // Copy constructor
+ CMappingContext(const CMappingContext& from);
+
+ // Affectation
+ const CMappingContext& operator=(const CMappingContext& right);
+
+ // Item access
+ bool setItem(uint32_t uiItemType, const string& strItem);
+ uint32_t getItem(uint32_t uiItemType) const;
+ bool iSet(uint32_t uiItemType) const;
+private:
+ // Item array
+ SItem* _pstItemArray;
+ // Items array size
+ uint32_t _uiNbItems;
+};
+
diff --git a/parameter/MappingData.cpp b/parameter/MappingData.cpp
new file mode 100644
index 0000000..7975eb8
--- /dev/null
+++ b/parameter/MappingData.cpp
@@ -0,0 +1,89 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "MappingData.h"
+#include "Tokenizer.h"
+#include <assert.h>
+
+CMappingData::CMappingData()
+{
+}
+
+bool CMappingData::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ assert(xmlElement.hasAttribute("Mapping"));
+
+ string strMapping = xmlElement.getAttributeString("Mapping");
+
+ Tokenizer mappingTok(strMapping, ", ");
+
+ string strMappingElement;
+
+ while (!(strMappingElement = mappingTok.next()).empty()) {
+
+ Tokenizer keyValueTok(strMappingElement, ":");
+
+ string strKey = keyValueTok.next();
+ string strValue = keyValueTok.next();
+
+ if (!addValue(strKey, strValue)) {
+
+ serializingContext.setError("Duplicate Mapping data: Unable to process Mapping element key = " + strKey + ", value = " + strValue + " from XML element " + xmlElement.getPath());
+
+ return false;
+ }
+ }
+ return true;
+}
+
+bool CMappingData::getValue(const string& strkey, string& strValue) const
+{
+ KeyToValueMapConstIterator it = _keyToValueMap.find(strkey);
+
+ if (it != _keyToValueMap.end()) {
+
+ strValue = it->second;
+
+ return true;
+ }
+ return false;
+}
+
+bool CMappingData::addValue(const string& strkey, const string& strValue)
+{
+ if (_keyToValueMap.find(strkey) != _keyToValueMap.end()) {
+
+ return false;
+ }
+ _keyToValueMap[strkey] = strValue;
+
+ return true;
+}
+
diff --git a/parameter/MappingData.h b/parameter/MappingData.h
new file mode 100644
index 0000000..99be431
--- /dev/null
+++ b/parameter/MappingData.h
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlSink.h"
+#include <string>
+#include <map>
+
+using namespace std;
+
+class CMappingData : public IXmlSink
+{
+ typedef map<string, string>::const_iterator KeyToValueMapConstIterator;
+public:
+ CMappingData();
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Query
+ bool getValue(const string& strkey, string& strValue) const;
+
+private:
+ bool addValue(const string& strkey, const string& strValue);
+
+ map<string, string> _keyToValueMap;
+};
diff --git a/parameter/NamedElementBuilderTemplate.h b/parameter/NamedElementBuilderTemplate.h
new file mode 100644
index 0000000..82bf2e1
--- /dev/null
+++ b/parameter/NamedElementBuilderTemplate.h
@@ -0,0 +1,45 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ElementBuilder.h"
+
+template <class ElementType>
+class CNamedElementBuilderTemplate : public CElementBuilder
+{
+public:
+ CNamedElementBuilderTemplate(const string& strType) : CElementBuilder(strType) {}
+
+ virtual CElement* createElement(const CXmlElement& xmlElement) const
+ {
+ return new ElementType(xmlElement.getNameAttribute());
+ }
+};
diff --git a/parameter/Parameter.cpp b/parameter/Parameter.cpp
new file mode 100644
index 0000000..5f1f389
--- /dev/null
+++ b/parameter/Parameter.cpp
@@ -0,0 +1,213 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Parameter.h"
+#include "ParameterType.h"
+#include "ParameterAccessContext.h"
+#include "ConfigurationAccessContext.h"
+#include "ParameterBlackboard.h"
+
+#define base CInstanceConfigurableElement
+
+CParameter::CParameter(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
+{
+}
+
+CParameter::~CParameter()
+{
+}
+
+CInstanceConfigurableElement::Type CParameter::getType() const
+{
+ return EParameter;
+}
+
+// XML configuration settings parsing/composing
+bool CParameter::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Check for value space
+ handleValueSpaceAttribute(xmlConfigurableElementSettingsElement, configurationAccessContext);
+
+ // Handle access
+ if (!configurationAccessContext.serializeOut()) {
+
+ // Write to blackboard
+ if (!doSetValue(xmlConfigurableElementSettingsElement.getTextContent(), getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext)) {
+
+ // Append parameter path to error
+ configurationAccessContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ } else {
+
+ // Get string value
+ string strValue;
+
+ doGetValue(strValue, getOffset() - configurationAccessContext.getBaseOffset(), configurationAccessContext);
+
+ // Populate value into xml text node
+ xmlConfigurableElementSettingsElement.setTextContent(strValue);
+ }
+
+ // Done
+ return true;
+}
+
+// Value space handling for configuration import
+void CParameter::handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Delegate to type
+ static_cast<const CParameterType*>(getTypeElement())->handleValueSpaceAttribute(xmlConfigurableElementSettingsElement, configurationAccessContext);
+}
+
+uint32_t CParameter::getFootPrint() const
+{
+ return getSize();
+}
+
+uint32_t CParameter::getSize() const
+{
+ return static_cast<const CParameterType*>(getTypeElement())->getSize();
+}
+
+// Dump
+void CParameter::logValue(string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Dump value
+ doGetValue(strValue, getOffset(), parameterContext);
+
+ // Prepend unit if any
+ prependUnit(strValue);
+}
+
+// Used for simulation only
+void CParameter::setDefaultValues(CParameterAccessContext& parameterAccessContext) const
+{
+ // Get default value from type
+ uint32_t uiDefaultValue = static_cast<const CParameterType*>(getTypeElement())->getDefaultValue();
+
+ // Write blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->write(&uiDefaultValue, getSize(), getOffset(), parameterAccessContext.isBigEndianSubsystem());
+}
+
+// Unit
+void CParameter::prependUnit(string& strValue) const
+{
+ string strUnit = static_cast<const CParameterType*>(getTypeElement())->getUnit();
+
+ if (!strUnit.empty()) {
+
+ strValue = "(" + strUnit + ") " + strValue;
+ }
+}
+
+// Parameter Access
+bool CParameter::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
+{
+ // Check path validity
+ if (!checkPathExhausted(pathNavigator, errorContext)) {
+
+ return false;
+ }
+ // Parameter context
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Set Value
+ if (!doSetValue(strValue, getOffset(), parameterContext)) {
+
+ // Append parameter path to error
+ parameterContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ // Synchronize
+ if (parameterContext.getAutoSync() && !sync(parameterContext)) {
+
+ // Append parameter path to error
+ parameterContext.appendToError(" " + getPath());
+
+ return false;
+ }
+ return true;
+}
+
+bool CParameter::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
+{
+ // Check path validity
+ if (!checkPathExhausted(pathNavigator, errorContext)) {
+
+ return false;
+ }
+ // Parameter context
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Get Value
+ doGetValue(strValue, getOffset(), parameterContext);
+
+ return true;
+}
+
+bool CParameter::doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
+{
+ uint32_t uiData;
+
+ if (!static_cast<const CParameterType*>(getTypeElement())->asInteger(strValue, uiData, parameterAccessContext)) {
+
+ return false;
+ }
+
+ // Write blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->write(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
+
+ return true;
+}
+
+void CParameter::doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const
+{
+ uint32_t uiData = 0;
+
+ // Read blackboard
+ CParameterBlackboard* pBlackboard = parameterAccessContext.getParameterBlackboard();
+
+ // Beware this code works on little endian architectures only!
+ pBlackboard->read(&uiData, getSize(), uiOffset, parameterAccessContext.isBigEndianSubsystem());
+
+ static_cast<const CParameterType*>(getTypeElement())->asString(uiData, strValue, parameterAccessContext);
+}
+
diff --git a/parameter/Parameter.h b/parameter/Parameter.h
new file mode 100644
index 0000000..dcb535f
--- /dev/null
+++ b/parameter/Parameter.h
@@ -0,0 +1,74 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+
+#include "InstanceConfigurableElement.h"
+
+class CParameterAccessContext;
+class CConfigurationAccessContext;
+
+class CParameter : public CInstanceConfigurableElement
+{
+public:
+ CParameter(const string& strName, const CTypeElement* pTypeElement);
+ virtual ~CParameter();
+
+ // Instantiation, allocation
+ virtual uint32_t getFootPrint() const;
+
+ // Type
+ virtual Type getType() const;
+
+ // XML configuration settings parsing/composing
+ virtual bool serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+protected:
+ // Parameter Access
+ virtual bool setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const;
+ virtual bool getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const;
+ virtual void logValue(string& strValue, CErrorContext& errorContext) const;
+ // Used for simulation only
+ virtual void setDefaultValues(CParameterAccessContext& parameterAccessContext) const;
+
+ // To be implemented by derived
+ virtual bool doSetValue(const string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const;
+ virtual void doGetValue(string& strValue, uint32_t uiOffset, CParameterAccessContext& parameterAccessContext) const;
+
+ // Value space handling for configuration import
+ void handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+
+ // Size
+ uint32_t getSize() const;
+
+ // Unit
+ void prependUnit(string& strValue) const;
+};
diff --git a/parameter/ParameterAccessContext.cpp b/parameter/ParameterAccessContext.cpp
new file mode 100644
index 0000000..1508d73
--- /dev/null
+++ b/parameter/ParameterAccessContext.cpp
@@ -0,0 +1,87 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterAccessContext.h"
+
+#define base CErrorContext
+
+CParameterAccessContext::CParameterAccessContext(string& strError, CParameterBlackboard* pParameterBlackboard, bool bValueSpaceIsRaw) :
+ base(strError), _pParameterBlackboard(pParameterBlackboard), _bValueSpaceIsRaw(bValueSpaceIsRaw), _bBigEndianSubsystem(false), _bAutoSync(true)
+{
+}
+
+CParameterAccessContext::CParameterAccessContext(string& strError) :
+ base(strError), _pParameterBlackboard(NULL), _bValueSpaceIsRaw(false), _bBigEndianSubsystem(false), _bAutoSync(true)
+{
+}
+
+// ParameterBlackboard
+CParameterBlackboard* CParameterAccessContext::getParameterBlackboard()
+{
+ return _pParameterBlackboard;
+}
+
+void CParameterAccessContext::setParameterBlackboard(CParameterBlackboard* pBlackboard)
+{
+ _pParameterBlackboard = pBlackboard;
+}
+
+// Value Space
+void CParameterAccessContext::setValueSpaceRaw(bool bIsRaw)
+{
+ _bValueSpaceIsRaw = bIsRaw;
+}
+
+bool CParameterAccessContext::valueSpaceIsRaw() const
+{
+ return _bValueSpaceIsRaw;
+}
+
+// Endianness
+void CParameterAccessContext::setBigEndianSubsystem(bool bBigEndian)
+{
+ _bBigEndianSubsystem = bBigEndian;
+}
+
+bool CParameterAccessContext::isBigEndianSubsystem() const
+{
+ return _bBigEndianSubsystem;
+}
+
+// Automatic synchronization to HW
+void CParameterAccessContext::setAutoSync(bool bAutoSync)
+{
+ _bAutoSync = bAutoSync;
+}
+
+bool CParameterAccessContext::getAutoSync() const
+{
+ return _bAutoSync;
+}
diff --git a/parameter/ParameterAccessContext.h b/parameter/ParameterAccessContext.h
new file mode 100644
index 0000000..dbeb730
--- /dev/null
+++ b/parameter/ParameterAccessContext.h
@@ -0,0 +1,69 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ErrorContext.h"
+
+class CParameterBlackboard;
+
+class CParameterAccessContext : public CErrorContext
+{
+public:
+ CParameterAccessContext(string& strError, CParameterBlackboard* pParameterBlackboard, bool bValueSpaceIsRaw);
+ CParameterAccessContext(string& strError);
+
+ // ParameterBlackboard
+ CParameterBlackboard* getParameterBlackboard();
+ void setParameterBlackboard(CParameterBlackboard* pBlackboard);
+
+ // Value interpretation as Real or Raw (usefull for Fixed point parameters)
+ void setValueSpaceRaw(bool bIsRaw);
+ bool valueSpaceIsRaw() const;
+
+ // Endianness
+ void setBigEndianSubsystem(bool bBigEndian);
+ bool isBigEndianSubsystem() const;
+
+ // Automatic synchronization to HW
+ void setAutoSync(bool bAutoSync);
+ bool getAutoSync() const;
+
+private:
+ // Blackboard
+ CParameterBlackboard* _pParameterBlackboard;
+ // Value space
+ bool _bValueSpaceIsRaw;
+ // Subsystem Endianness
+ bool _bBigEndianSubsystem;
+ // Automatic synchronization to HW
+ bool _bAutoSync;
+};
+
diff --git a/parameter/ParameterBlackboard.cpp b/parameter/ParameterBlackboard.cpp
new file mode 100644
index 0000000..ecf4476
--- /dev/null
+++ b/parameter/ParameterBlackboard.cpp
@@ -0,0 +1,139 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterBlackboard.h"
+#include <string.h>
+#include <assert.h>
+
+CParameterBlackboard::CParameterBlackboard() : _puiData(NULL), _uiSize(0)
+{
+}
+
+CParameterBlackboard::~CParameterBlackboard()
+{
+ delete [] _puiData;
+}
+
+// Size
+void CParameterBlackboard::setSize(uint32_t uiSize)
+{
+ if (_puiData) {
+
+ delete [] _puiData;
+ }
+
+ _puiData = new uint8_t[uiSize];
+
+ memset(_puiData, 0, uiSize);
+
+ _uiSize = uiSize;
+}
+
+uint32_t CParameterBlackboard::getSize() const
+{
+ return _uiSize;
+}
+
+// Single parameter access
+void CParameterBlackboard::write(const void* pvSrcData, uint32_t uiSize, uint32_t uiOffset, bool bBigEndian)
+{
+ assert(uiSize + uiOffset <= _uiSize);
+
+ if (!bBigEndian) {
+
+ memcpy(_puiData + uiOffset, pvSrcData, uiSize);
+ } else {
+
+ uint32_t uiIndex;
+ const uint8_t* puiSrcData = (const uint8_t*)pvSrcData;
+
+ for (uiIndex = 0; uiIndex < uiSize; uiIndex++) {
+
+ _puiData[uiIndex + uiOffset] = puiSrcData[uiSize - uiIndex - 1];
+ }
+ }
+}
+
+void CParameterBlackboard::read(void* pvDstData, uint32_t uiSize, uint32_t uiOffset, bool bBigEndian) const
+{
+ assert(uiSize + uiOffset <= _uiSize);
+
+ if (!bBigEndian) {
+
+ memcpy(pvDstData, _puiData + uiOffset, uiSize);
+ } else {
+
+ uint32_t uiIndex;
+ uint8_t* puiDstData = (uint8_t*)pvDstData;
+
+ for (uiIndex = 0; uiIndex < uiSize; uiIndex++) {
+
+ puiDstData[uiSize - uiIndex - 1] = _puiData[uiIndex + uiOffset];
+ }
+ }
+}
+
+// Access from/to subsystems
+void CParameterBlackboard::rawRead(void* pvDstData, uint32_t uiSize, uint32_t uiOffset) const
+{
+ assert(uiSize + uiOffset <= _uiSize);
+
+ memcpy(pvDstData, _puiData + uiOffset, uiSize);
+}
+
+void CParameterBlackboard::rawWrite(const void* pvDstData, uint32_t uiSize, uint32_t uiOffset)
+{
+ assert(uiSize + uiOffset <= _uiSize);
+
+ memcpy(_puiData + uiOffset, pvDstData, uiSize);
+}
+
+// Configuration handling
+void CParameterBlackboard::restoreFrom(const CParameterBlackboard* pFromBlackboard, uint32_t uiOffset)
+{
+ memcpy(_puiData + uiOffset, pFromBlackboard->_puiData, pFromBlackboard->_uiSize);
+}
+
+void CParameterBlackboard::saveTo(CParameterBlackboard* pToBlackboard, uint32_t uiOffset) const
+{
+ memcpy(pToBlackboard->_puiData, _puiData + uiOffset, pToBlackboard->_uiSize);
+}
+
+// Serialization
+void CParameterBlackboard::serialize(CBinaryStream& binaryStream)
+{
+ if (binaryStream.isOut()) {
+
+ binaryStream.write(_puiData, _uiSize);
+ } else {
+
+ binaryStream.read(_puiData, _uiSize);
+ }
+}
diff --git a/parameter/ParameterBlackboard.h b/parameter/ParameterBlackboard.h
new file mode 100644
index 0000000..5812d0b
--- /dev/null
+++ b/parameter/ParameterBlackboard.h
@@ -0,0 +1,66 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include "BinaryStream.h"
+
+using namespace std;
+
+class CParameterBlackboard
+{
+public:
+ CParameterBlackboard();
+ ~CParameterBlackboard();
+
+ // Size
+ void setSize(uint32_t uiSize);
+ uint32_t getSize() const;
+
+ // Single parameter access
+ void write(const void* pvSrcData, uint32_t uiSize, uint32_t uiOffset, bool bBigEndian);
+ void read(void* pvDstData, uint32_t uiSize, uint32_t uiOffset, bool bBigEndian) const;
+
+ // Access from/to subsystems
+ void rawRead(void* pvDstData, uint32_t uiSize, uint32_t uiOffset) const;
+ void rawWrite(const void* pvDstData, uint32_t uiSize, uint32_t uiOffset);
+
+ // Configuration handling
+ void restoreFrom(const CParameterBlackboard* pFromBlackboard, uint32_t uiOffset);
+ void saveTo(CParameterBlackboard* pToBlackboard, uint32_t uiOffset) const;
+
+ // Serialization
+ void serialize(CBinaryStream& binaryStream);
+private:
+ uint8_t* _puiData;
+ uint32_t _uiSize;
+};
+
diff --git a/parameter/ParameterBlock.cpp b/parameter/ParameterBlock.cpp
new file mode 100644
index 0000000..7b1bc64
--- /dev/null
+++ b/parameter/ParameterBlock.cpp
@@ -0,0 +1,42 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterBlock.h"
+
+#define base CInstanceConfigurableElement
+
+CParameterBlock::CParameterBlock(const string& strName, const CTypeElement* pTypeElement) : base(strName, pTypeElement)
+{
+}
+
+CInstanceConfigurableElement::Type CParameterBlock::getType() const
+{
+ return EParameterBlock;
+}
diff --git a/parameter/ParameterBlock.h b/parameter/ParameterBlock.h
new file mode 100644
index 0000000..f2a8000
--- /dev/null
+++ b/parameter/ParameterBlock.h
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "InstanceConfigurableElement.h"
+
+class CParameterBlock : public CInstanceConfigurableElement
+{
+public:
+ CParameterBlock(const string& strName, const CTypeElement* pTypeElement);
+
+ // Type
+ virtual Type getType() const;
+};
+
diff --git a/parameter/ParameterBlockType.cpp b/parameter/ParameterBlockType.cpp
new file mode 100644
index 0000000..57cd3c0
--- /dev/null
+++ b/parameter/ParameterBlockType.cpp
@@ -0,0 +1,86 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterBlockType.h"
+#include "ParameterBlock.h"
+#include <sstream>
+
+#define base CTypeElement
+
+CParameterBlockType::CParameterBlockType(const string& strName) : base(strName)
+{
+}
+
+string CParameterBlockType::getKind() const
+{
+ return "ParameterBlock";
+}
+
+bool CParameterBlockType::childrenAreDynamic() const
+{
+ return true;
+}
+
+CInstanceConfigurableElement* CParameterBlockType::doInstantiate() const
+{
+ return new CParameterBlock(getName(), this);
+}
+
+void CParameterBlockType::populate(CElement* pElement) const
+{
+ uint32_t uiArrayLength = getArrayLength();
+
+ if (uiArrayLength) {
+
+ // Create child elements
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiArrayLength; uiChild++) {
+
+ CParameterBlock* pChildParameterBlock = new CParameterBlock(computeChildName(uiChild), this);
+
+ pElement->addChild(pChildParameterBlock);
+
+ base::populate(pChildParameterBlock);
+ }
+ } else {
+ // Regular block
+ base::populate(pElement);
+ }
+}
+
+string CParameterBlockType::computeChildName(uint32_t uiChild)
+{
+ ostringstream strStream;
+
+ strStream << uiChild;
+
+ return strStream.str();
+}
diff --git a/parameter/ParameterBlockType.h b/parameter/ParameterBlockType.h
new file mode 100644
index 0000000..b3577d8
--- /dev/null
+++ b/parameter/ParameterBlockType.h
@@ -0,0 +1,51 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "TypeElement.h"
+
+class CParameterBlockType : public CTypeElement
+{
+public:
+ CParameterBlockType(const string& strName);
+
+ // CElement
+ virtual string getKind() const;
+private:
+ virtual bool childrenAreDynamic() const;
+ // Instantiation
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+ // Population
+ virtual void populate(CElement* pElement) const;
+ // Creating sub blocks with indexes
+ static string computeChildName(uint32_t uiChild);
+};
+
diff --git a/parameter/ParameterFrameworkConfiguration.cpp b/parameter/ParameterFrameworkConfiguration.cpp
new file mode 100644
index 0000000..388e375
--- /dev/null
+++ b/parameter/ParameterFrameworkConfiguration.cpp
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterFrameworkConfiguration.h"
+
+#define base CElement
+
+CParameterFrameworkConfiguration::CParameterFrameworkConfiguration()
+{
+}
+
+string CParameterFrameworkConfiguration::getKind() const
+{
+ return "ParameterFrameworkConfiguration";
+}
+
+bool CParameterFrameworkConfiguration::childrenAreDynamic() const
+{
+ return true;
+}
diff --git a/parameter/ParameterFrameworkConfiguration.h b/parameter/ParameterFrameworkConfiguration.h
new file mode 100644
index 0000000..e0891e3
--- /dev/null
+++ b/parameter/ParameterFrameworkConfiguration.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CParameterFrameworkConfiguration : public CElement
+{
+public:
+ CParameterFrameworkConfiguration();
+
+ virtual string getKind() const;
+
+private:
+ virtual bool childrenAreDynamic() const;
+};
diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp
new file mode 100644
index 0000000..b9e9f30
--- /dev/null
+++ b/parameter/ParameterMgr.cpp
@@ -0,0 +1,1740 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterMgr.h"
+#include "XmlParser.h"
+#include "XmlParameterSerializingContext.h"
+#include "XmlElementSerializingContext.h"
+#include "SystemClass.h"
+#include "ElementLibrarySet.h"
+#include "SubsystemLibrary.h"
+#include "NamedElementBuilderTemplate.h"
+#include "KindElementBuilderTemplate.h"
+#include "ElementBuilderTemplate.h"
+#include "SelectionCriterionType.h"
+#include "SelectionCriterionDefinition.h"
+#include "SubsystemElementBuilder.h"
+#include "SelectionCriteria.h"
+#include "ComponentType.h"
+#include "ComponentInstance.h"
+#include "ParameterBlockType.h"
+#include "BooleanParameterType.h"
+#include "IntegerParameterType.h"
+#include "FixedPointParameterType.h"
+#include "ParameterBlackboard.h"
+#include "Parameter.h"
+#include "ComputedSizeParameterType.h"
+#include "ParameterBlackboard.h"
+#include "ParameterAccessContext.h"
+#include "XmlFileIncluderElement.h"
+#include "ParameterFrameworkConfiguration.h"
+#include "FrameworkConfigurationGroup.h"
+#include "FrameworkConfigurationLocation.h"
+#include "SystemClassConfiguration.h"
+#include "ConfigurableDomains.h"
+#include "ConfigurableDomain.h"
+#include "DomainConfiguration.h"
+#include "XmlComposer.h"
+#include "XmlDomainSerializingContext.h"
+#include "BitParameterBlockType.h"
+#include "BitParameterType.h"
+#include "RemoteProcessorServerInterface.h"
+#include "ElementLocator.h"
+#include "AutoLog.h"
+#include "CompoundRule.h"
+#include "SelectionCriterionRule.h"
+#include "SimulatedBackSynchronizer.h"
+#include "HardwareBackSynchronizer.h"
+#include <strings.h>
+#include <dlfcn.h>
+#include <assert.h>
+#include <sstream>
+
+#define base CElement
+
+// Used for remote processor server creation
+typedef IRemoteProcessorServerInterface* (*CreateRemoteProcessorServer)(uint16_t uiPort, IRemoteCommandHandler* pCommandHandler);
+
+// Global configuration file name (fixed)
+const char* gacParameterFrameworkConfigurationFileName = "ParameterFrameworkConfiguration.xml";
+const char* gacSystemSchemasSubFolder = "Schemas";
+
+// Config File System looks normally like this:
+// ---------------------------------------------
+//├── ParameterFrameworkConfiguration.xml
+//├── Schemas
+//│ └── *.xsd
+//├── Settings
+//│ └── <SystemClassName folder>*
+//│ ├── <ConfigurableDomains>.xml
+//│ └── <Settings>.bin?
+//└── Structure
+// └── <SystemClassName folder>*
+// ├── <SystemClassName>Class.xml
+// └── <Subsystem>.xml*
+// --------------------------------------------
+
+
+// Remote command parser array
+const CParameterMgr::SRemoteCommandParserItem CParameterMgr::gaRemoteCommandParserItems[] = {
+ /// Help
+ { "help", &CParameterMgr::helpCommandProcess, 0, "", "Show commands description and usage" },
+ /// Status
+ { "status", &CParameterMgr::statusCommandProcess, 0, "", "Show current status" },
+ /// Tuning Mode
+ { "setTuningMode", &CParameterMgr::setTuningModeCommmandProcess, 1, "on|off*", "Turn on or off Tuning Mode" },
+ { "getTuningMode", &CParameterMgr::getTuningModeCommmandProcess, 0, "", "Show Tuning Mode" },
+ /// Value Space
+ { "setValueSpace", &CParameterMgr::setValueSpaceCommmandProcess, 1, "raw|real*", "Assigns Value Space used for fixed point integer value interpretation" },
+ { "getValueSpace", &CParameterMgr::getValueSpaceCommmandProcess, 0, "", "Show Value Space" },
+ /// Sync
+ { "setAutoSync", &CParameterMgr::setAutoSyncCommmandProcess, 1, "on*|off", "Turn on or off automatic synchronization to hardware while in Tuning Mode" },
+ { "getAutoSync", &CParameterMgr::getAutoSyncCommmandProcess, 0, "", "Show Auto Sync state" },
+ { "sync", &CParameterMgr::syncCommmandProcess, 0, "", "Synchronize current settings to hardware while in Tuning Mode and Auto Sync off" },
+ /// Domains
+ { "listDomains", &CParameterMgr::listDomainsCommmandProcess, 0, "", "List configurable domains" },
+ { "createDomain", &CParameterMgr::createDomainCommmandProcess, 1, "<domain>", "Create new configurable domain" },
+ { "deleteDomain", &CParameterMgr::deleteDomainCommmandProcess, 1, "<domain>", "Delete configurable domain" },
+ { "renameDomain", &CParameterMgr::renameDomainCommmandProcess, 2, "<domain> <new name>", "Rename configurable domain" },
+ { "listDomainElements", &CParameterMgr::listDomainElementsCommmandProcess, 1, "<domain>", "List elements associated to configurable domain" },
+ { "addElement", &CParameterMgr::addElementCommmandProcess, 2, "<domain> <elem path>", "Associate element at given path to configurable domain" },
+ { "removeElement", &CParameterMgr::removeElementCommmandProcess, 2, "<domain> <elem path>", "Dissociate element at given path from configurable domain" },
+ { "splitDomain", &CParameterMgr::splitDomainCommmandProcess, 2, "<domain> <elem path>", "Split configurable domain at given associated element path" },
+ /// Configurations
+ { "listConfigurations", &CParameterMgr::listConfigurationsCommmandProcess, 1, "<domain>", "List domain configurations" },
+ { "createConfiguration", &CParameterMgr::createConfigurationCommmandProcess, 2, "<domain> <configuration>", "Create new domain configuration" },
+ { "deleteConfiguration", &CParameterMgr::deleteConfigurationCommmandProcess, 2, "<domain> <configuration>", "Delete domain configuration" },
+ { "renameConfiguration", &CParameterMgr::renameConfigurationCommmandProcess, 3, "<domain> <configuration> <new name>", "Rename domain configuration" },
+ { "saveConfiguration", &CParameterMgr::saveConfigurationCommmandProcess, 2, "<domain> <configuration>", "Save current settings into configuration" },
+ { "restoreConfiguration", &CParameterMgr::restoreConfigurationCommmandProcess, 2, "<domain> <configuration>", "Restore current settings from configuration" },
+ /// Elements/Parameters
+ { "listElements", &CParameterMgr::listElementsCommmandProcess, 1, "<elem path>|/", "List elements under element at given path or root" },
+ { "listElementsRecursive", &CParameterMgr::listElementsRecursiveCommmandProcess, 1, "<elem path>|/", "Recursively list elements under element at given path or root" },
+ { "dumpElement", &CParameterMgr::dumpElementCommmandProcess, 1, "<elem path>", "Dump structure and content of element at given path" },
+ { "getElementSize", &CParameterMgr::getElementSizeCommmandProcess, 1, "<elem path>", "Show size of element at given path" },
+ { "getParameter", &CParameterMgr::getParameterCommmandProcess, 1, "<elem ath>", "Get value for parameter at given path" },
+ { "setParameter", &CParameterMgr::setParameterCommmandProcess, 2, "<elem path> <value>", "Set value for parameter at given path" },
+ { "listBelongingDomains", &CParameterMgr::listBelongingDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is contained in" },
+ { "listAssociatedDomains", &CParameterMgr::listAssociatedDomainsCommmandProcess, 1, "<elem path>", "List domain(s) element at given path is associated to" },
+ /// Browse
+ { "listAssociatedElements", &CParameterMgr::listAssociatedElementsCommmandProcess, 0, "", "List element sub-trees associated to at least one configurable domain" },
+ { "listConflictingElements", &CParameterMgr::listConflictingElementsCommmandProcess, 0, "", "List element sub-trees contained in more than one configurable domain" },
+ { "listRogueElements", &CParameterMgr::listRogueElementsCommmandProcess, 0, "", "List element sub-trees owned by no configurable domain" },
+ /// Settings Import/Export
+ { "exportDomainsXML", &CParameterMgr::exportConfigurableDomainsToXMLCommmandProcess, 1, "<file path> ", "Export domains to XML file" },
+ { "importDomainsXML", &CParameterMgr::importConfigurableDomainsFromXMLCommmandProcess, 1, "<file path>", "Import domains from XML file" },
+ { "exportDomainsWithSettingsXML", &CParameterMgr::exportConfigurableDomainsWithSettingsToXMLCommmandProcess, 1, "<file path> ", "Export domains including settings to XML file" },
+ { "importDomainsWithSettingsXML", &CParameterMgr::importConfigurableDomainsWithSettingsFromXMLCommmandProcess, 1, "<file path>", "Import domains including settings from XML file" },
+ { "exportSettings", &CParameterMgr::exportSettingsCommmandProcess, 1, "<file path>", "Export settings to binary file" },
+ { "importSettings", &CParameterMgr::importSettingsCommmandProcess, 1, "<file path>", "Import settings from binary file" }
+};
+// Remote command parsers array Size
+const uint32_t CParameterMgr::guiNbRemoteCommandParserItems = sizeof(gaRemoteCommandParserItems) / sizeof(gaRemoteCommandParserItems[0]);
+
+CParameterMgr::CParameterMgr(const string& strParameterFrameworkConfigurationFolderPath, const string& strSystemClassName) :
+ _bTuningModeIsOn(false),
+ _bValueSpaceIsRaw(false),
+ _bAutoSyncOn(true),
+ _pMainParameterBlackboard(new CParameterBlackboard),
+ _pElementLibrarySet(new CElementLibrarySet),
+ _strParameterFrameworkConfigurationFolderPath(strParameterFrameworkConfigurationFolderPath),
+ _strSchemaFolderLocation(strParameterFrameworkConfigurationFolderPath + "/" + gacSystemSchemasSubFolder),
+ _pSystemClassConfiguration(NULL),
+ _uiStructureChecksum(0),
+ _pRemoteProcessorServer(NULL),
+ _uiMaxCommandUsageLength(0),
+ _pLogger(NULL),
+ _uiLogDepth(0)
+{
+ // Tuning Mode Mutex
+ bzero(&_tuningModeMutex, sizeof(_tuningModeMutex));
+ pthread_mutex_init(&_tuningModeMutex, NULL);
+
+ // Deal with children
+ addChild(new CParameterFrameworkConfiguration);
+ addChild(new CSelectionCriteria);
+ addChild(new CSystemClass(strSystemClassName));
+ addChild(new CConfigurableDomains(strSystemClassName));
+
+ // Feed element library
+ feedElementLibraries();
+}
+
+CParameterMgr::~CParameterMgr()
+{
+ // Children
+ delete _pRemoteProcessorServer;
+ delete _pMainParameterBlackboard;
+ delete _pElementLibrarySet;
+
+ // Tuning Mode Mutex
+ pthread_mutex_destroy(&_tuningModeMutex);
+}
+
+string CParameterMgr::getKind() const
+{
+ return "ParameterMgr";
+}
+
+// Logging
+void CParameterMgr::setLogger(CParameterMgr::ILogger* pLogger)
+{
+ _pLogger = pLogger;
+}
+
+// Logging
+void CParameterMgr::doLog(const string& strLog) const
+{
+ if (_pLogger) {
+
+ // Nest
+ string strIndent;
+
+ // Level
+ uint32_t uiNbIndents = _uiLogDepth;
+
+ while (uiNbIndents--) {
+
+ strIndent += " ";
+ }
+
+ // Log
+ _pLogger->log(strIndent + strLog);
+ }
+}
+
+void CParameterMgr::nestLog() const
+{
+ ((uint32_t&)_uiLogDepth)++;
+}
+
+void CParameterMgr::unnestLog() const
+{
+ ((uint32_t&)_uiLogDepth)--;
+}
+
+bool CParameterMgr::load(string& strError)
+{
+ CAutoLog autoLog(this, "Loading");
+
+ // Load Framework configuration
+ if (!loadFrameworkConfiguration(strError)) {
+
+ return false;
+ }
+
+ // Load subsystems
+ if (!getSystemClass()->loadSubsystems(strError, _astrPluginFolderPaths)) {
+
+ return false;
+ }
+
+ // Load structure
+ if (!loadStructure(strError)) {
+
+ return false;
+ }
+
+ // Load settings
+ if (!loadSettings(strError)) {
+
+ return false;
+ }
+
+ // All is loaded, we're ready to observe selection criteria events
+ getSelectionCriteria()->setObserver(this);
+
+ // Load and start Remote processor server if appropriate
+ if (!handleRemoteProcessingInterface(strError)) {
+
+ return false;
+ }
+
+ return true;
+}
+
+bool CParameterMgr::loadFrameworkConfiguration(string& strError)
+{
+ CAutoLog autoLog(this, "Loading framework configuration");
+
+ // Get Xml config file name
+ string strXmlConfigurationFilePath = _strParameterFrameworkConfigurationFolderPath + "/" + gacParameterFrameworkConfigurationFileName;
+
+ // Parse Structure XML file
+ CXmlElementSerializingContext elementSerializingContext(strError);
+
+ if (!xmlParse(elementSerializingContext, getFrameworkConfiguration(), strXmlConfigurationFilePath, _strParameterFrameworkConfigurationFolderPath, EFrameworkConfigurationLibrary)) {
+
+ return false;
+ }
+ // Get subsystem plugins folders element
+ const CFrameworkConfigurationGroup* pSubsystemPluginFolders= static_cast<const CFrameworkConfigurationGroup*>(getConstFrameworkConfiguration()->findChild("SubsystemPluginFolders"));
+
+ if (!pSubsystemPluginFolders) {
+
+ strError = "Parameter Framework Configuration: couldn't find SubsystemPluginFolders element";
+
+ return false;
+ }
+ // Get plugin locations
+ uint32_t uiPluginFolderLocation;
+ uint32_t uiNbPluginFolderLocations = pSubsystemPluginFolders->getNbChildren();
+
+ if (!uiNbPluginFolderLocations) {
+
+ strError = "Parameter Framework Configuration: couldn't find any PluginFolderLocation element";
+
+ return false;
+ }
+
+ for (uiPluginFolderLocation = 0; uiPluginFolderLocation < uiNbPluginFolderLocations; uiPluginFolderLocation++) {
+
+ const CFrameworkConfigurationLocation* pSubsystemPluginLocation = static_cast<const CFrameworkConfigurationLocation*>(pSubsystemPluginFolders->getChild(uiPluginFolderLocation));
+
+ _astrPluginFolderPaths.push_back(pSubsystemPluginLocation->getFilePath(_strParameterFrameworkConfigurationFolderPath));
+ }
+
+ // Get configuration for current system class
+ const CFrameworkConfigurationGroup* pParameterConfigurationGroup = static_cast<const CFrameworkConfigurationGroup*>(getConstFrameworkConfiguration()->findChildOfKind("ParameterConfiguration"));
+
+ if (!pParameterConfigurationGroup) {
+
+ strError = "Parameter Framework Configuration: couldn't find ParameterConfiguration element";
+
+ return false;
+ }
+ _pSystemClassConfiguration = static_cast<const CSystemClassConfiguration*>(pParameterConfigurationGroup->findChild(getSystemClass()->getName()));
+
+ if (!_pSystemClassConfiguration) {
+
+ strError = "No framework configuration found for SystemClass " + getSystemClass()->getName();
+
+ return false;
+ }
+ // Log tuning availability
+ log("Tuning %s", _pSystemClassConfiguration->isTuningAllowed() ? "allowed" : "prohibited");
+
+ return true;
+}
+
+bool CParameterMgr::loadStructure(string& strError)
+{
+ // Retrieve system to load structure to
+ CSystemClass* pSystemClass = getSystemClass();
+
+ CAutoLog autoLog(this, "Loading " + pSystemClass->getName() + " system class structure");
+
+ // Get structure description element
+ const CFrameworkConfigurationLocation* pStructureDescriptionFileLocation = static_cast<const CFrameworkConfigurationLocation*>(_pSystemClassConfiguration->findChildOfKind("StructureDescriptionFileLocation"));
+
+ if (!pStructureDescriptionFileLocation) {
+
+ strError = "No StructureDescriptionFileLocation element found for SystemClass " + pSystemClass->getName();
+
+ return false;
+ }
+
+ // Get Xml structure folder
+ string strXmlStructureFolder = pStructureDescriptionFileLocation->getFolderPath(_strParameterFrameworkConfigurationFolderPath);
+
+ // Get Xml structure file name
+ string strXmlStructureFilePath = pStructureDescriptionFileLocation->getFilePath(_strParameterFrameworkConfigurationFolderPath);
+
+ // Parse Structure XML file
+ CXmlParameterSerializingContext parameterBuildContext(strError);
+
+ if (!xmlParse(parameterBuildContext, pSystemClass, strXmlStructureFilePath, strXmlStructureFolder, EParameterCreationLibrary)) {
+
+ return false;
+ }
+
+ // Initialize offsets
+ pSystemClass->setOffset(0);
+
+ // Initialize main blackboard's size
+ _pMainParameterBlackboard->setSize(pSystemClass->getFootPrint());
+
+ return true;
+}
+
+bool CParameterMgr::loadSettings(string& strError)
+{
+ CAutoLog autoLog(this, "Loading settings");
+
+ // Get settings configuration element
+ const CFrameworkConfigurationGroup* pParameterConfigurationGroup = static_cast<const CFrameworkConfigurationGroup*>(_pSystemClassConfiguration->findChildOfKind("SettingsConfiguration"));
+
+ if (!pParameterConfigurationGroup) {
+
+ // No settings to load
+
+ return true;
+ }
+ // Get binary settings file location
+ const CFrameworkConfigurationLocation* pBinarySettingsFileLocation = static_cast<const CFrameworkConfigurationLocation*>(pParameterConfigurationGroup->findChildOfKind("BinarySettingsFileLocation"));
+
+ string strXmlBinarySettingsFilePath;
+
+ if (pBinarySettingsFileLocation) {
+
+ // Get Xml binary settings file name
+ strXmlBinarySettingsFilePath = pBinarySettingsFileLocation->getFilePath(_strParameterFrameworkConfigurationFolderPath);
+ }
+
+ // Get configurable domains element
+ const CFrameworkConfigurationLocation* pConfigurableDomainsFileLocation = static_cast<const CFrameworkConfigurationLocation*>(pParameterConfigurationGroup->findChildOfKind("ConfigurableDomainsFileLocation"));
+
+ if (!pConfigurableDomainsFileLocation) {
+
+ strError = "No ConfigurableDomainsFileLocation element found for SystemClass " + getSystemClass()->getName();
+
+ return false;
+ }
+ // Get destination root element
+ CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
+
+ // Get Xml configuration domains file name
+ string strXmlConfigurationDomainsFilePath = pConfigurableDomainsFileLocation->getFilePath(_strParameterFrameworkConfigurationFolderPath);
+
+ // Get Xml configuration domains folder
+ string strXmlConfigurationDomainsFolder = pConfigurableDomainsFileLocation->getFolderPath(_strParameterFrameworkConfigurationFolderPath);
+
+ // Parse configuration domains XML file (ask to read settings from XML file if they are not provided as binary)
+ CXmlDomainSerializingContext xmlDomainSerializingContext(strError, !pBinarySettingsFileLocation);
+
+ // Selection criteria definition for rule creation
+ xmlDomainSerializingContext.setSelectionCriteriaDefinition(getConstSelectionCriteria()->getSelectionCriteriaDefinition());
+
+ // Do parse
+ if (!xmlParse(xmlDomainSerializingContext, pConfigurableDomains, strXmlConfigurationDomainsFilePath, strXmlConfigurationDomainsFolder, EParameterConfigurationLibrary, "SystemClassName")) {
+
+ return false;
+ }
+ // We have loaded the whole system structure, compute checksum
+ const CSystemClass* pSystemClass = getConstSystemClass();
+ _uiStructureChecksum = pSystemClass->computeStructureChecksum() + getConfigurableDomains()->computeStructureChecksum() + getSelectionCriteria()->computeStructureChecksum();
+
+ // Load binary settings if any provided
+ if (pBinarySettingsFileLocation && !pConfigurableDomains->serializeSettings(strXmlBinarySettingsFilePath, false, _uiStructureChecksum, strError)) {
+
+ return false;
+ }
+
+ // Back synchronization for areas in parameter blackboard no covered by any domain
+ CBackSynchronizer* pBackSynchronizer = createBackSynchronizer(strError);
+
+ log("Main blackboard back synchronization");
+
+ // Back-synchronize
+ if (!pBackSynchronizer->sync()) {
+ // Get rif of back synchronizer
+ delete pBackSynchronizer;
+
+ strError = "Main blackboard back synchronization failed: " + strError;
+
+ return false;
+ }
+ // Get rif of back synchronizer
+ delete pBackSynchronizer;
+
+ // We're done loading the settings
+ // We need to ensure all domains are valid
+ pConfigurableDomains->validate(_pMainParameterBlackboard);
+
+ // Ensure application of currently selected configurations
+ // Force-apply configuration(s)
+ return pConfigurableDomains->apply(_pMainParameterBlackboard, true, strError);
+}
+
+// XML parsing
+bool CParameterMgr::xmlParse(CXmlElementSerializingContext& elementSerializingContext, CElement* pRootElement, const string& strXmlFilePath, const string& strXmlFolder, CParameterMgr::ElementLibrary eElementLibrary, const string& strNameAttrituteName)
+{
+ // Init serializing context
+ elementSerializingContext.set(_pElementLibrarySet->getElementLibrary(eElementLibrary), strXmlFolder, _strSchemaFolderLocation);
+
+ // Get Schema file associated to root element
+ string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pRootElement->getKind() + ".xsd";
+
+ // Parse Structure XML file
+ CXmlParser parser(strXmlFilePath, strXmlSchemaFilePath, pRootElement->getKind(), elementSerializingContext);
+
+ if (!parser.open()) {
+
+ return false;
+ }
+
+ // Check Root element name attribute (if any)
+ string strRootElementName = parser.getRootElementAttributeString(strNameAttrituteName);
+
+ if (!strRootElementName.empty() && strRootElementName != pRootElement->getName()) {
+
+ elementSerializingContext.setError("Error: Wrong XML structure file " + strXmlFilePath);
+ elementSerializingContext.appendLineToError(pRootElement->getKind() + " element " + pRootElement->getName() + " mismatches expected " + pRootElement->getKind() + " type " + pRootElement->getName());
+
+ return false;
+ }
+
+ // Start clean
+ pRootElement->clean();
+
+ // Parse
+ if (!parser.parse(pRootElement)) {
+
+ // Cleanup
+ pRootElement->clean();
+
+ return false;
+ }
+
+ // Close parser
+ if (!parser.close()) {
+
+ return false;
+ }
+
+ return true;
+}
+
+// Init
+bool CParameterMgr::init(string& strError)
+{
+ return base::init(strError);
+}
+
+// Selection criteria interface
+CSelectionCriterionType* CParameterMgr::createSelectionCriterionType(bool bIsInclusive)
+{
+ // Propagate
+ return getSelectionCriteria()->createSelectionCriterionType(bIsInclusive);
+}
+
+CSelectionCriterion* CParameterMgr::createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType)
+{
+ // Propagate
+ return getSelectionCriteria()->createSelectionCriterion(strName, pSelectionCriterionType);
+}
+
+// Selection criteria changed event
+void CParameterMgr::selectionCriterionChanged(const CSelectionCriterion* pSelectionCriterion)
+{
+ CAutoLog autoLog(this, pSelectionCriterion->getName() + " selection criterion changed event");
+
+ // Lock state
+ pthread_mutex_lock(&_tuningModeMutex);
+
+ if (!_bTuningModeIsOn) {
+
+ // Apply configuration(s)
+ string strError;
+
+ if (!getConfigurableDomains()->apply(_pMainParameterBlackboard, false, strError)) {
+
+ log("Failed to apply configurations!");
+ }
+ }
+ // Unlock state
+ pthread_mutex_unlock(&_tuningModeMutex);
+}
+
+// Command processing
+bool CParameterMgr::remoteCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ log("Processing remote command: \"%s\"", remoteCommand.getCommand().c_str());
+
+ // Dispatch
+ uint32_t uiRemoteCommandParserItem;
+
+ for (uiRemoteCommandParserItem = 0; uiRemoteCommandParserItem < guiNbRemoteCommandParserItems; uiRemoteCommandParserItem++) {
+
+ const SRemoteCommandParserItem* pRemoteCommandParserItem = &gaRemoteCommandParserItems[uiRemoteCommandParserItem];
+
+ if (string(pRemoteCommandParserItem->_pcCommandName) == remoteCommand.getCommand()) {
+
+ // Check enough arguments supplied
+ if (remoteCommand.getArgumentCount() < pRemoteCommandParserItem->_uiMinArgumentCount) {
+
+ strResult = string("Not enough arguments supplied\nUsage:\n") + pRemoteCommandParserItem->usage();
+
+ return false;
+ }
+
+ switch ((this->*pRemoteCommandParserItem->_pfnParser)(remoteCommand, strResult)) {
+ case EDone:
+ strResult = "Done";
+ case ESucceeded:
+ return true;
+ case EShowUsgae:
+ strResult = pRemoteCommandParserItem->usage();
+ // Fall through intentionally
+ case EFailed:
+ return false;
+ default:
+ assert(0);
+ }
+ }
+ }
+ // Not found
+ strResult = "Command not found!";
+
+ return false;
+}
+
+// Max command usage length, use for formatting
+void CParameterMgr::setMaxCommandUsageLength()
+{
+ // Show usages
+ uint32_t uiRemoteCommandParserItem;
+
+ for (uiRemoteCommandParserItem = 0; uiRemoteCommandParserItem < guiNbRemoteCommandParserItems; uiRemoteCommandParserItem++) {
+
+ const SRemoteCommandParserItem* pRemoteCommandParserItem = &gaRemoteCommandParserItems[uiRemoteCommandParserItem];
+
+ uint32_t uiRemoteCommandUsageLength = pRemoteCommandParserItem->usage().length();
+
+ if (uiRemoteCommandUsageLength > _uiMaxCommandUsageLength) {
+
+ _uiMaxCommandUsageLength = uiRemoteCommandUsageLength;
+ }
+ }
+}
+
+/////////////////// Remote command parsers
+/// Help
+CParameterMgr::CommandStatus CParameterMgr::helpCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ strResult = "\n";
+
+ // Show usages
+ uint32_t uiRemoteCommandParserItem;
+
+ for (uiRemoteCommandParserItem = 0; uiRemoteCommandParserItem < guiNbRemoteCommandParserItems; uiRemoteCommandParserItem++) {
+
+ const SRemoteCommandParserItem* pRemoteCommandParserItem = &gaRemoteCommandParserItems[uiRemoteCommandParserItem];
+
+ string strUsage = pRemoteCommandParserItem->usage();
+
+ strResult += strUsage;
+
+ // Align
+ uint32_t uiToSpacesAdd = _uiMaxCommandUsageLength + 5 - strUsage.length();
+
+ while (uiToSpacesAdd--) {
+
+ strResult += " ";
+ }
+
+ strResult += string("=> ") + string(pRemoteCommandParserItem->_pcDescription) + "\n";
+
+ }
+ return ESucceeded;
+}
+
+/// Status
+CParameterMgr::CommandStatus CParameterMgr::statusCommandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+ // System class
+ const CSystemClass* pSystemClass = getSystemClass();
+
+ strResult = "\n";
+
+ // Show status
+ /// System class
+ strResult += "System Class: ";
+ strResult += pSystemClass->getName();
+ strResult += "\n";
+
+ /// Tuning mode
+ strResult += "Tuning Mode: ";
+ strResult += tuningModeOn() ? "on" : "off";
+ strResult += "\n";
+
+ /// Value space
+ strResult += "Value Space: ";
+ strResult += valueSpaceIsRaw() ? "raw" : "real";
+ strResult += "\n";
+
+ /// Value space
+ strResult += "Auto Sync: ";
+ strResult += autoSyncOn() ? "on" : "off";
+ strResult += "\n";
+
+ /// Subsystem list
+ strResult += "\nSubsystems:";
+ string strSubsystemList;
+ pSystemClass->listChildrenPaths(strSubsystemList);
+ strResult += strSubsystemList;
+
+ /// Last applied configurations
+ strResult += "\nLast applied configurations:";
+ string strLastAppliedConfigurations;
+ getConfigurableDomains()->listLastAppliedConfigurations(strLastAppliedConfigurations);
+ strResult += strLastAppliedConfigurations;
+
+ return ESucceeded;
+}
+
+/// Tuning Mode
+CParameterMgr::CommandStatus CParameterMgr::setTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ if (remoteCommand.getArgument(0) == "on") {
+
+ if (setTuningMode(true, strResult)) {
+
+ return EDone;
+ }
+ } else if (remoteCommand.getArgument(0) == "off") {
+
+ if (setTuningMode(false, strResult)) {
+
+ return EDone;
+ }
+ } else {
+ // Show usage
+ return EShowUsgae;
+ }
+ return EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::getTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ strResult = tuningModeOn() ? "on" : "off";
+
+ return ESucceeded;
+}
+
+/// Value Space
+CParameterMgr::CommandStatus CParameterMgr::setValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)strResult;
+
+ if (remoteCommand.getArgument(0) == "raw") {
+
+ setValueSpace(true);
+
+ return EDone;
+
+ } else if (remoteCommand.getArgument(0) == "real") {
+
+ setValueSpace(false);
+
+ return EDone;
+
+ } else {
+ // Show usage
+ return EShowUsgae;
+ }
+ return EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::getValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ strResult = valueSpaceIsRaw() ? "raw" : "real";
+
+ return ESucceeded;
+}
+
+/// Sync
+CParameterMgr::CommandStatus CParameterMgr::setAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ if (remoteCommand.getArgument(0) == "on") {
+
+ if (setAutoSync(true, strResult)) {
+
+ return EDone;
+ }
+ } else if (remoteCommand.getArgument(0) == "off") {
+
+ if (setAutoSync(false, strResult)) {
+
+ return EDone;
+ }
+ } else {
+ // Show usage
+ return EShowUsgae;
+ }
+ return EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::getAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ strResult = autoSyncOn() ? "on" : "off";
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::syncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ return sync(strResult) ? EDone : EFailed;
+}
+
+
+/// Domains
+CParameterMgr::CommandStatus CParameterMgr::listDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ getConfigurableDomains()->listChildren(strResult);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::createDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return createDomain(remoteCommand.getArgument(0), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::deleteDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return deleteDomain(remoteCommand.getArgument(0), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::renameDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return getConfigurableDomains()->renameDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listDomainElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return getConfigurableDomains()->listDomainElements(remoteCommand.getArgument(0), strResult) ? ESucceeded : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::addElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return addConfigurableElementToDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::removeElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return removeConfigurableElementFromDomain(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::splitDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return split(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+/// Configurations
+CParameterMgr::CommandStatus CParameterMgr::listConfigurationsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return getConfigurableDomains()->listConfigurations(remoteCommand.getArgument(0), strResult) ? ESucceeded : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::createConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return createConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::deleteConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return deleteConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::renameConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return getConfigurableDomains()->renameConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), remoteCommand.getArgument(2), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::saveConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return saveConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::restoreConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return restoreConfiguration(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+/// Elements/Parameters
+CParameterMgr::CommandStatus CParameterMgr::listElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass(), false);
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ strResult = string("\n");
+
+ if (!pLocatedElement) {
+
+ // List from root folder
+
+ // Return system class qualified name
+ pLocatedElement = getSystemClass();
+ }
+
+ // Return sub-elements
+ strResult += pLocatedElement->listQualifiedPaths(false);
+
+ return ESucceeded;
+}
+
+/// Elements/Parameters
+CParameterMgr::CommandStatus CParameterMgr::listElementsRecursiveCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass(), false);
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ strResult = string("\n");
+
+ if (!pLocatedElement) {
+
+ // List from root folder
+
+ // Return system class qualified name
+ pLocatedElement = getSystemClass();
+ }
+
+ // Return sub-elements
+ strResult += pLocatedElement->listQualifiedPaths(true);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::dumpElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ string strError;
+
+ CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw);
+
+ // Dump elements
+ pLocatedElement->dumpContent(strResult, parameterAccessContext);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::getElementSizeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ // Converted to actual sizable element
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Get size as string
+ ostringstream str;
+
+ str << endl << pConfigurableElement->getFootPrint() << " bytes" << endl;
+
+ strResult = str.str();
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::getParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ string strValue;
+
+ if (!getValue(remoteCommand.getArgument(0), strValue, strResult)) {
+
+ return EFailed;
+ }
+ // Succeeded
+ strResult = strValue;
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::setParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return setValue(remoteCommand.getArgument(0), remoteCommand.getArgument(1), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listBelongingDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ // Convert element
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Return element belonging domains
+ pConfigurableElement->listBelongingDomains(strResult);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listAssociatedDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(remoteCommand.getArgument(0), &pLocatedElement, strResult)) {
+
+ return EFailed;
+ }
+
+ // Convert element
+ const CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Return element belonging domains
+ pConfigurableElement->listAssociatedDomains(strResult);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listAssociatedElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ getConfigurableDomains()->listAssociatedElements(strResult);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listConflictingElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ getConfigurableDomains()->listConflictingElements(strResult);
+
+ return ESucceeded;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::listRogueElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ (void)remoteCommand;
+
+ getSystemClass()->listRogueElements(strResult);
+
+ return ESucceeded;
+}
+
+/// Settings Import/Export
+CParameterMgr::CommandStatus CParameterMgr::exportConfigurableDomainsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return exportDomainsXml(remoteCommand.getArgument(0), false, strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::importConfigurableDomainsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return importDomainsXml(remoteCommand.getArgument(0), false, strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::exportConfigurableDomainsWithSettingsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return exportDomainsXml(remoteCommand.getArgument(0), true, strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::importConfigurableDomainsWithSettingsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return importDomainsXml(remoteCommand.getArgument(0), true, strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::exportSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return exportDomainsBinary(remoteCommand.getArgument(0), strResult) ? EDone : EFailed;
+}
+
+CParameterMgr::CommandStatus CParameterMgr::importSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult)
+{
+ return importDomainsBinary(remoteCommand.getArgument(0), strResult) ? EDone : EFailed;
+}
+
+// User set/get parameters
+bool CParameterMgr::setValue(const string& strPath, const string& strValue, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ CPathNavigator pathNavigator(strPath);
+
+ if (!pathNavigator.isPathValid()) {
+
+ strError = "Path not well formed";
+
+ return false;
+ }
+
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ strError = "Non settable element";
+
+ return false;
+ }
+
+ if (*pStrChildName != getSystemClass()->getName()) {
+
+ strError = "Path not found";
+
+ return false;
+ }
+
+ // Define context
+ CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw);
+
+ // Set auto sync
+ parameterAccessContext.setAutoSync(_bAutoSyncOn);
+
+ // Do the set
+ return getSystemClass()->setValue(pathNavigator, strValue, parameterAccessContext);
+}
+
+bool CParameterMgr::getValue(const string& strPath, string& strValue, string& strError) const
+{
+ CPathNavigator pathNavigator(strPath);
+
+ if (!pathNavigator.isPathValid()) {
+
+ strError = "Path not well formed";
+
+ return false;
+ }
+
+ string* pStrChildName = pathNavigator.next();
+
+ if (!pStrChildName) {
+
+ strError = "Non settable element";
+
+ return false;
+ }
+
+ if (*pStrChildName != getConstSystemClass()->getName()) {
+
+ strError = "Path not found";
+
+ return false;
+ }
+
+ // Define context
+ CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw);
+
+ // Do the get
+ return getConstSystemClass()->getValue(pathNavigator, strValue, parameterAccessContext);
+}
+
+// Tuning mode
+bool CParameterMgr::setTuningMode(bool bOn, string& strError)
+{
+ // Tuning allowed?
+ if (bOn && !_pSystemClassConfiguration->isTuningAllowed()) {
+
+ strError = "Tuning prohibited";
+
+ return false;
+ }
+ // Lock state
+ pthread_mutex_lock(&_tuningModeMutex);
+
+ // Warn domains about exiting tuning mode
+ if (!bOn && _bTuningModeIsOn) {
+
+ // Ensure application of currently selected configurations
+ // Force-apply configuration(s)
+ if (!getConfigurableDomains()->apply(_pMainParameterBlackboard, true, strError)) {
+
+ return false;
+ }
+ // Turn auto sync back on
+ _bAutoSyncOn = true;
+ }
+
+ // Store
+ _bTuningModeIsOn = bOn;
+
+ // Unlock state
+ pthread_mutex_unlock(&_tuningModeMutex);
+
+ return true;
+}
+
+bool CParameterMgr::tuningModeOn() const
+{
+ return _bTuningModeIsOn;
+}
+
+// Current value space for user set/get value interpretation
+void CParameterMgr::setValueSpace(bool bIsRaw)
+{
+ _bValueSpaceIsRaw = bIsRaw;
+}
+
+bool CParameterMgr::valueSpaceIsRaw()
+{
+ return _bValueSpaceIsRaw;
+}
+
+/// Sync
+// Automatic hardware synchronization control (during tuning session)
+bool CParameterMgr::setAutoSync(bool bAutoSyncOn, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+ // Warn domains about turning auto sync back on
+ if (bAutoSyncOn && !_bAutoSyncOn) {
+
+ // Ensure application of currently selected configurations
+ // Force-apply configuration(s)
+ if (!getConfigurableDomains()->apply(_pMainParameterBlackboard, true, strError)) {
+
+ return false;
+ }
+ }
+
+ // Set Auto sync
+ _bAutoSyncOn = bAutoSyncOn;
+
+ return true;
+}
+
+bool CParameterMgr::autoSyncOn() const
+{
+ return _bAutoSyncOn;
+}
+
+// Manual hardware synchronization control (during tuning session)
+bool CParameterMgr::sync(string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+ // Warn domains about turning auto sync back on
+ if (_bAutoSyncOn) {
+
+ strError = "Feature unavailable when Auto Sync is on";
+
+ return false;
+ }
+
+ // Get syncer set
+ CSyncerSet syncerSet;
+ // ... from system class
+ getConstSystemClass()->fillSyncerSet(syncerSet);
+ // Sync
+ return syncerSet.sync(*_pMainParameterBlackboard, false, strError);
+}
+
+// Content dump
+void CParameterMgr::logStructureContent(string& strContent) const
+{
+ string strError;
+
+ CParameterAccessContext parameterAccessContext(strError, _pMainParameterBlackboard, _bValueSpaceIsRaw);
+
+ dumpContent(strContent, parameterAccessContext);
+}
+
+// Configuration/Domains handling
+bool CParameterMgr::createDomain(const string& strName, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->createDomain(strName, strError);
+}
+
+bool CParameterMgr::deleteDomain(const string& strName, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->deleteDomain(strName, strError);
+}
+
+bool CParameterMgr::createConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->createConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, strError);
+}
+
+bool CParameterMgr::deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->deleteConfiguration(strDomain, strConfiguration, strError);
+}
+
+bool CParameterMgr::restoreConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->restoreConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, _bAutoSyncOn, strError);
+}
+
+bool CParameterMgr::saveConfiguration(const string& strDomain, const string& strConfiguration, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // Delegate to configurable domains
+ return getConfigurableDomains()->saveConfiguration(strDomain, strConfiguration, _pMainParameterBlackboard, strError);
+}
+
+// Configurable element - domain association
+bool CParameterMgr::addConfigurableElementToDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
+
+ return false;
+ }
+
+ // Convert element
+ CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Delegate
+ return getConfigurableDomains()->addConfigurableElementToDomain(strDomain, pConfigurableElement, _pMainParameterBlackboard, strError);
+}
+
+bool CParameterMgr::removeConfigurableElementFromDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
+
+ return EFailed;
+ }
+
+ // Convert element
+ CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Delegate
+ return getConfigurableDomains()->removeConfigurableElementFromDomain(strDomain, pConfigurableElement, strError);
+}
+
+bool CParameterMgr::split(const string& strDomain, const string& strConfigurableElementPath, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ CElementLocator elementLocator(getSystemClass());
+
+ CElement* pLocatedElement = NULL;
+
+ if (!elementLocator.locate(strConfigurableElementPath, &pLocatedElement, strError)) {
+
+ return EFailed;
+ }
+
+ // Convert element
+ CConfigurableElement* pConfigurableElement = static_cast<const CConfigurableElement*>(pLocatedElement);
+
+ // Delegate
+ return getConfigurableDomains()->split(strDomain, pConfigurableElement, strError);
+}
+
+// XML Import/Export
+bool CParameterMgr::importDomainsXml(const string& strFileName, bool bWithSettings, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+
+ // check path is absolute
+ if (strFileName[0] != '/') {
+
+ strError = "Please provide absolute path";
+
+ return false;
+ }
+ // Root element
+ CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
+
+ // Context
+ CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
+
+ // Secltion criteria definition for rule creation
+ xmlDomainSerializingContext.setSelectionCriteriaDefinition(getConstSelectionCriteria()->getSelectionCriteriaDefinition());
+
+ // Parse
+ if (!xmlParse(xmlDomainSerializingContext, pConfigurableDomains, strFileName, "", EParameterConfigurationLibrary, "SystemClassName")) {
+
+ return false;
+ }
+
+ // Validate domains after XML import
+ pConfigurableDomains->validate(_pMainParameterBlackboard);
+
+ return true;
+}
+
+bool CParameterMgr::exportDomainsXml(const string& strFileName, bool bWithSettings, string& strError) const
+{
+ // check path is absolute
+ if (strFileName[0] != '/') {
+
+ strError = "Please provide absolute path";
+
+ return false;
+ }
+
+ // Root element
+ const CConfigurableDomains* pConfigurableDomains = getConstConfigurableDomains();
+
+ // Get Schema file associated to root element
+ string strXmlSchemaFilePath = _strSchemaFolderLocation + "/" + pConfigurableDomains->getKind() + ".xsd";
+
+ // Context
+ CXmlDomainSerializingContext xmlDomainSerializingContext(strError, bWithSettings);
+
+ // Value space
+ xmlDomainSerializingContext.setValueSpaceRaw(_bValueSpaceIsRaw);
+
+ // Instantiate composer
+ CXmlComposer xmlComposer(strFileName, strXmlSchemaFilePath, pConfigurableDomains->getKind(), xmlDomainSerializingContext);
+
+ // Open composer
+ if (!xmlComposer.open()) {
+
+ return false;
+ }
+
+ // Compose
+ xmlComposer.compose(pConfigurableDomains);
+
+ // Close composer
+ if (!xmlComposer.close()) {
+
+ return false;
+ }
+
+ return true;
+}
+
+// Binary Import/Export
+bool CParameterMgr::importDomainsBinary(const string& strFileName, string& strError)
+{
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+ // check path is absolute
+ if (strFileName[0] != '/') {
+
+ strError = "Please provide absolute path";
+
+ return false;
+ }
+ // Root element
+ CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
+
+ // Serialize in
+ return pConfigurableDomains->serializeSettings(strFileName, false, _uiStructureChecksum, strError);
+}
+
+bool CParameterMgr::exportDomainsBinary(const string& strFileName, string& strError)
+{
+ // check path is absolute
+ if (strFileName[0] != '/') {
+
+ strError = "Please provide absolute path";
+
+ return false;
+ }
+ // Check tuning mode
+ if (!checkTuningModeOn(strError)) {
+
+ return false;
+ }
+ // Root element
+ CConfigurableDomains* pConfigurableDomains = getConfigurableDomains();
+
+ // Serialize out
+ return pConfigurableDomains->serializeSettings(strFileName, true, _uiStructureChecksum, strError);
+}
+
+// For tuning, check we're in tuning mode
+bool CParameterMgr::checkTuningModeOn(string& strError) const
+{
+ // Tuning Mode on?
+ if (!_bTuningModeIsOn) {
+
+ strError = "Tuning Mode must be on";
+
+ return false;
+ }
+ return true;
+}
+
+// Dynamic creation library feeding
+void CParameterMgr::feedElementLibraries()
+{
+ // Global Configuration handling
+ CElementLibrary* pFrameworkConfigurationLibrary = new CElementLibrary;
+
+ pFrameworkConfigurationLibrary->addElementBuilder(new CElementBuilderTemplate<CParameterFrameworkConfiguration>("ParameterFrameworkConfiguration"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationGroup>("SubsystemPluginFolders"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationLocation>("PluginFolderLocation"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationGroup>("ParameterConfiguration"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CSystemClassConfiguration>("SystemClassConfiguration"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationLocation>("StructureDescriptionFileLocation"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationGroup>("SettingsConfiguration"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationLocation>("ConfigurableDomainsFileLocation"));
+ pFrameworkConfigurationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CFrameworkConfigurationLocation>("BinarySettingsFileLocation"));
+
+ _pElementLibrarySet->addElementLibrary(pFrameworkConfigurationLibrary);
+
+ // Parameter creation
+ CElementLibrary* pParameterCreationLibrary = new CElementLibrary;
+
+ pParameterCreationLibrary->addElementBuilder(new CSubsystemElementBuilder(getSystemClass()->getSubsystemLibrary()));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CComponentType>("ComponentType"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CComponentInstance>("Component"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CBitParameterType>("BitParameter"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CBitParameterBlockType>("BitParameterBlock"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CParameterBlockType>("ParameterBlock"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CBooleanParameterType>("BooleanParameter"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CIntegerParameterType>("IntegerParameter"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CFixedPointParameterType>("FixedPointParameter"));
+ pParameterCreationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CComputedSizeParameterType>("ComputedSizeParameter"));
+ pParameterCreationLibrary->addElementBuilder(new CKindElementBuilderTemplate<CXmlFileIncluderElement>("SubsystemInclude"));
+
+ _pElementLibrarySet->addElementLibrary(pParameterCreationLibrary);
+
+ // Parameter Configuration Domains creation
+ CElementLibrary* pParameterConfigurationLibrary = new CElementLibrary;
+
+ pParameterConfigurationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CConfigurableDomain>("ConfigurableDomain"));
+ pParameterConfigurationLibrary->addElementBuilder(new CNamedElementBuilderTemplate<CDomainConfiguration>("Configuration"));
+ pParameterConfigurationLibrary->addElementBuilder(new CElementBuilderTemplate<CCompoundRule>("CompoundRule"));
+ pParameterConfigurationLibrary->addElementBuilder(new CElementBuilderTemplate<CSelectionCriterionRule>("SelectionCriterionRule"));
+
+ _pElementLibrarySet->addElementLibrary(pParameterConfigurationLibrary);
+}
+
+// Remote Processor Server connection handling
+bool CParameterMgr::handleRemoteProcessingInterface(string& strError)
+{
+ CAutoLog autoLog(this, "Handling remote processing interface");
+
+ // Start server if tuning allowed
+ if (_pSystemClassConfiguration->isTuningAllowed()) {
+
+ log("Loading remote processor library");
+
+ // Load library
+ void* lib_handle = dlopen("libremote-processor.so", RTLD_NOW);
+
+ if (!lib_handle) {
+
+ // Return error
+ const char* pcError = dlerror();
+
+ if (pcError) {
+
+ strError = pcError;
+ } else {
+
+ strError = "Unable to load libremote-processor.so library";
+ }
+
+ return false;
+ }
+
+ CreateRemoteProcessorServer pfnCreateRemoteProcessorServer = (CreateRemoteProcessorServer)dlsym(lib_handle, "createRemoteProcessorServer");
+
+ if (!pfnCreateRemoteProcessorServer) {
+
+ strError = "libremote-process.so does not contain createRemoteProcessorServer symbol.";
+
+ return false;
+ }
+
+ // Create server
+ _pRemoteProcessorServer = pfnCreateRemoteProcessorServer(_pSystemClassConfiguration->getServerPort(), this);
+
+ // Compute max command usage length
+ setMaxCommandUsageLength();
+
+ log("Starting remote processor server on port %d", _pSystemClassConfiguration->getServerPort());
+ // Start
+ if (!_pRemoteProcessorServer->start()) {
+
+ strError = "Unable to start remote processor server";
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+// Back synchronization
+CBackSynchronizer* CParameterMgr::createBackSynchronizer(string& strError) const
+{
+#ifdef SIMULATION
+ // In simulation, back synchronization of the blackboard won't probably work
+ // We need to ensure though the blackboard is initialized with valid data
+ return new CSimulatedBackSynchronizer(getConstSystemClass(), strError, _pMainParameterBlackboard);
+#else
+ // Real back synchronizer from subsystems
+ return new CHardwareBackSynchronizer(getConstSystemClass(), strError, _pMainParameterBlackboard);
+#endif
+}
+
+// Children typwise access
+CParameterFrameworkConfiguration* CParameterMgr::getFrameworkConfiguration()
+{
+ return static_cast<CParameterFrameworkConfiguration*>(getChild(EFrameworkConfiguration));
+}
+
+const CParameterFrameworkConfiguration* CParameterMgr::getConstFrameworkConfiguration()
+{
+ return getFrameworkConfiguration();
+}
+
+CSelectionCriteria* CParameterMgr::getSelectionCriteria()
+{
+ return static_cast<CSelectionCriteria*>(getChild(ESelectionCriteria));
+}
+
+const CSelectionCriteria* CParameterMgr::getConstSelectionCriteria()
+{
+ return static_cast<const CSelectionCriteria*>(getChild(ESelectionCriteria));
+}
+
+CSystemClass* CParameterMgr::getSystemClass()
+{
+ return static_cast<CSystemClass*>(getChild(ESystemClass));
+}
+
+const CSystemClass* CParameterMgr::getConstSystemClass() const
+{
+ return static_cast<const CSystemClass*>(getChild(ESystemClass));
+}
+
+// Configurable Domains
+CConfigurableDomains* CParameterMgr::getConfigurableDomains()
+{
+ return static_cast<CConfigurableDomains*>(getChild(EConfigurableDomains));
+}
+
+const CConfigurableDomains* CParameterMgr::getConstConfigurableDomains()
+{
+ return static_cast<const CConfigurableDomains*>(getChild(EConfigurableDomains));
+}
+
+const CConfigurableDomains* CParameterMgr::getConstConfigurableDomains() const
+{
+ return static_cast<const CConfigurableDomains*>(getChild(EConfigurableDomains));
+}
diff --git a/parameter/ParameterMgr.h b/parameter/ParameterMgr.h
new file mode 100644
index 0000000..a4ef01a
--- /dev/null
+++ b/parameter/ParameterMgr.h
@@ -0,0 +1,318 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <pthread.h>
+#include "RemoteCommandHandler.h"
+#include "PathNavigator.h"
+#include "SelectionCriterionType.h"
+#include "SelectionCriterion.h"
+#include "Element.h"
+#include "SelectionCriterionObserver.h"
+#include <map>
+#include <vector>
+
+class CElementLibrarySet;
+class CSubsystemLibrary;
+class CSystemClass;
+class CSelectionCriteria;
+class CParameterFrameworkConfiguration;
+class CSystemClassConfiguration;
+class CParameterBlackboard;
+class CConfigurableDomains;
+class IRemoteProcessorServerInterface;
+class CBackSynchronizer;
+
+class CParameterMgr : private CElement, private IRemoteCommandHandler, private ISelectionCriterionObserver
+{
+ enum ChildElement {
+ EFrameworkConfiguration,
+ ESelectionCriteria,
+ ESystemClass,
+ EConfigurableDomains
+ };
+ enum ElementLibrary {
+ EFrameworkConfigurationLibrary,
+ EParameterCreationLibrary,
+ EParameterConfigurationLibrary
+ };
+ // Remote command execution status
+ enum CommandStatus {
+ EDone,
+ ESucceeded,
+ EFailed,
+ EShowUsgae
+ };
+
+ // Remote command parsers
+ typedef CommandStatus (CParameterMgr::*RemoteCommandParser)(const IRemoteCommand& remoteCommand, string& strResult);
+
+ // Parser descriptions
+ struct SRemoteCommandParserItem
+ {
+ const char* _pcCommandName;
+ CParameterMgr::RemoteCommandParser _pfnParser;
+ uint32_t _uiMinArgumentCount;
+ const char* _pcHelp;
+ const char* _pcDescription;
+
+ // Usage
+ string usage() const
+ {
+ return string(_pcCommandName) + " " + _pcHelp;
+ }
+ };
+public:
+ // Logger interface
+ class ILogger
+ {
+ public:
+ virtual void log(const std::string& strLog) = 0;
+ };
+
+ // Construction
+ CParameterMgr(const string& strParameterFrameworkConfigurationFolderPath, const string& strSystemClassName);
+ virtual ~CParameterMgr();
+
+ // Logging
+ void setLogger(ILogger* pLogger);
+
+ // Init
+ bool load(string& strError);
+ virtual bool init(string& strError);
+
+ // Selection Criteria
+ CSelectionCriterionType* createSelectionCriterionType(bool bIsInclusive);
+ CSelectionCriterion* createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType);
+
+ //////////// Tuning /////////////
+ // Tuning mode
+ bool setTuningMode(bool bOn, string& strError);
+ bool tuningModeOn() const;
+
+ // Current value space for user set/get value interpretation
+ void setValueSpace(bool bIsRaw);
+ bool valueSpaceIsRaw();
+
+ // Automatic hardware synchronization control (during tuning session)
+ bool setAutoSync(bool bAutoSyncOn, string& strError);
+ bool autoSyncOn() const;
+ bool sync(string& strError);
+
+ // User set/get parameters
+ bool setValue(const string& strPath, const string& strValue, string& strError);
+ bool getValue(const string& strPath, string& strValue, string& strError) const;
+
+ ////////// Configuration/Domains handling //////////////
+ // Creation/Deletion
+ bool createDomain(const string& strName, string& strError);
+ bool deleteDomain(const string& strName, string& strError);
+ bool createConfiguration(const string& strDomain, const string& strConfiguration, string& strError);
+ bool deleteConfiguration(const string& strDomain, const string& strConfiguration, string& strError);
+
+ // Save/Restore
+ bool restoreConfiguration(const string& strDomain, const string& strConfiguration, string& strError);
+ bool saveConfiguration(const string& strDomain, const string& strConfiguration, string& strError);
+
+ // Configurable element - domain association
+ bool addConfigurableElementToDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError);
+ bool removeConfigurableElementFromDomain(const string& strDomain, const string& strConfigurableElementPath, string& strError);
+ bool split(const string& strDomain, const string& strConfigurableElementPath, string& strError);
+
+ // XML Import/Export
+ bool importDomainsXml(const string& strFileName, bool bWithSettings, string& strError);
+ bool exportDomainsXml(const string& strFileName, bool bWithSettings, string& strError) const;
+
+ // Binary Import/Export
+ bool importDomainsBinary(const string& strFileName, string& strError);
+ bool exportDomainsBinary(const string& strFileName, string& strError);
+
+ // Introspect
+ void logStructureContent(string& strContent) const;
+
+ // CElement
+ virtual string getKind() const;
+private:
+ // Logging (done by root)
+ virtual void doLog(const string& strLog) const;
+ virtual void nestLog() const;
+ virtual void unnestLog() const;
+
+ // From ISelectionCriterionObserver: selection criteria changed event
+ virtual void selectionCriterionChanged(const CSelectionCriterion* pSelectionCriterion);
+
+ // From IRemoteCommandHandler: return true on success, fill result in any cases
+ virtual bool remoteCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+
+ ////////////////:: Remote command parsers
+ /// Help
+ CommandStatus helpCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Status
+ CommandStatus statusCommandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Tuning Mode
+ CommandStatus setTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus getTuningModeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Value Space
+ CommandStatus setValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus getValueSpaceCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Sync
+ CommandStatus setAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus getAutoSyncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus syncCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Domains
+ CommandStatus listDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus createDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus deleteDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus renameDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listDomainElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus addElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus removeElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus splitDomainCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Configurations
+ CommandStatus listConfigurationsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus createConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus deleteConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus renameConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus saveConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus restoreConfigurationCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Elements/Parameters
+ CommandStatus listElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listElementsRecursiveCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus dumpElementCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus getElementSizeCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus getParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus setParameterCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listBelongingDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listAssociatedDomainsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Browse
+ CommandStatus listAssociatedElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listConflictingElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus listRogueElementsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ /// Settings Import/Export
+ CommandStatus exportConfigurableDomainsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus importConfigurableDomainsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus exportConfigurableDomainsWithSettingsToXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus importConfigurableDomainsWithSettingsFromXMLCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus exportSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+ CommandStatus importSettingsCommmandProcess(const IRemoteCommand& remoteCommand, string& strResult);
+
+ // Max command usage length, use for formatting
+ void setMaxCommandUsageLength();
+
+ // For tuning, check we're in tuning mode
+ bool checkTuningModeOn(string& strError) const;
+
+ // Framework global configuration loading
+ bool loadFrameworkConfiguration(string& strError);
+
+ // System class Structure loading
+ bool loadStructure(string& strError);
+
+ // System class Structure loading
+ bool loadSettings(string& strError);
+
+ // Parse XML file into Root element
+ bool xmlParse(CXmlElementSerializingContext& elementSerializingContext, CElement* pRootElement, const string& strXmlFilePath, const string& strXmlFolder, ElementLibrary eElementLibrary, const string& strNameAttrituteName = "Name");
+
+ // Framework Configuration
+ CParameterFrameworkConfiguration* getFrameworkConfiguration();
+ const CParameterFrameworkConfiguration* getConstFrameworkConfiguration();
+
+ // Selection Criteria
+ CSelectionCriteria* getSelectionCriteria();
+ const CSelectionCriteria* getConstSelectionCriteria();
+
+ // System Class
+ CSystemClass* getSystemClass();
+ const CSystemClass* getConstSystemClass() const;
+
+ // Configurable Domains
+ CConfigurableDomains* getConfigurableDomains();
+ const CConfigurableDomains* getConstConfigurableDomains();
+ const CConfigurableDomains* getConstConfigurableDomains() const;
+
+ // Dynamic object creation libraries feeding
+ void feedElementLibraries();
+
+ // Remote Processor Server connection handling
+ bool handleRemoteProcessingInterface(string& strError);
+
+ // Back synchronization
+ CBackSynchronizer* createBackSynchronizer(string& strError) const;
+
+ // Tuning
+ bool _bTuningModeIsOn;
+
+ // Value Space
+ bool _bValueSpaceIsRaw;
+
+ // Automatic synchronization to HW during Tuning session
+ bool _bAutoSyncOn;
+
+ // Current Parameter Settings
+ CParameterBlackboard* _pMainParameterBlackboard;
+
+ // Dynamic object creation
+ CElementLibrarySet* _pElementLibrarySet;
+
+ // XML parsing, object creation handling
+ string _strParameterFrameworkConfigurationFolderPath; // Root folder for framework configuration
+ string _strSchemaFolderLocation; // Place where schemas stand
+
+ // Subsystem plugin location
+ vector<string> _astrPluginFolderPaths;
+
+ // System Class Configuration
+ const CSystemClassConfiguration* _pSystemClassConfiguration;
+
+ // Whole system structure checksum
+ uint8_t _uiStructureChecksum;
+
+ // Remote Processor Server
+ IRemoteProcessorServerInterface* _pRemoteProcessorServer;
+
+ // Parser description array
+ static const SRemoteCommandParserItem gaRemoteCommandParserItems[];
+
+ // Parser description array size
+ static const uint32_t guiNbRemoteCommandParserItems;
+
+ // Maximum command usage length
+ uint32_t _uiMaxCommandUsageLength;
+
+ // Tuning mode mutex
+ pthread_mutex_t _tuningModeMutex;
+
+ // Logging
+ ILogger* _pLogger;
+ uint32_t _uiLogDepth;
+};
+
diff --git a/parameter/ParameterMgrLogger.cpp b/parameter/ParameterMgrLogger.cpp
new file mode 100644
index 0000000..c3dcda4
--- /dev/null
+++ b/parameter/ParameterMgrLogger.cpp
@@ -0,0 +1,42 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterMgrLogger.h"
+#include "ParameterMgrPlatformConnector.h"
+
+
+CParameterMgrLogger::CParameterMgrLogger(CParameterMgrPlatformConnector *pParameterMgrPlatformConnector) : _pParameterMgrPlatformConnector(pParameterMgrPlatformConnector)
+{
+}
+
+void CParameterMgrLogger::log(const string &strLog)
+{
+ _pParameterMgrPlatformConnector->doLog(strLog);
+}
diff --git a/parameter/ParameterMgrLogger.h b/parameter/ParameterMgrLogger.h
new file mode 100644
index 0000000..d99584d
--- /dev/null
+++ b/parameter/ParameterMgrLogger.h
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ParameterMgr.h"
+
+class CParameterMgrPlatformConnector;
+
+class CParameterMgrLogger : public CParameterMgr::ILogger
+{
+public:
+ CParameterMgrLogger(CParameterMgrPlatformConnector* pParameterMgrPlatformConnector);
+
+ // Logging
+ virtual void log(const string& strLog);
+
+private:
+ // Log destination
+ CParameterMgrPlatformConnector* _pParameterMgrPlatformConnector;
+};
+
diff --git a/parameter/ParameterMgrPlatformConnector.cpp b/parameter/ParameterMgrPlatformConnector.cpp
new file mode 100644
index 0000000..9da41dd
--- /dev/null
+++ b/parameter/ParameterMgrPlatformConnector.cpp
@@ -0,0 +1,101 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterMgrPlatformConnector.h"
+#include "ParameterMgr.h"
+#include "ParameterMgrLogger.h"
+#include <assert.h>
+
+#ifdef SIMULATION
+const char* gpcParameterFrameworkConfigurationFolderPath = "/home/pat/projects/qt/parameter-framework/XML";
+#else
+const char* gpcParameterFrameworkConfigurationFolderPath = "/etc/parameter-framework";
+#endif
+
+// Construction
+CParameterMgrPlatformConnector::CParameterMgrPlatformConnector(const string& strSystemClassName)
+ : _pParameterMgr(new CParameterMgr(gpcParameterFrameworkConfigurationFolderPath, strSystemClassName)), _bStarted(false), _pLogger(NULL)
+{
+ // Logging
+ _pParameterMgrLogger = new CParameterMgrLogger(this);
+ _pParameterMgr->setLogger(_pParameterMgrLogger);
+}
+
+CParameterMgrPlatformConnector::~CParameterMgrPlatformConnector()
+{
+ delete _pParameterMgr;
+ delete _pParameterMgrLogger;
+}
+
+ISelectionCriterionTypeInterface* CParameterMgrPlatformConnector::createSelectionCriterionType(bool bIsInclusive)
+{
+ assert(!_bStarted);
+
+ return _pParameterMgr->createSelectionCriterionType(bIsInclusive);
+}
+
+ISelectionCriterionInterface* CParameterMgrPlatformConnector::createSelectionCriterion(const std::string& strName, const ISelectionCriterionTypeInterface* pSelectionCriterionType)
+{
+ assert(!_bStarted);
+
+ return _pParameterMgr->createSelectionCriterion(strName, static_cast<const CSelectionCriterionType*>(pSelectionCriterionType));
+}
+
+// Logging
+void CParameterMgrPlatformConnector::setLogger(CParameterMgrPlatformConnector::ILogger* pLogger)
+{
+ _pLogger = pLogger;
+}
+
+// Start
+bool CParameterMgrPlatformConnector::start(std::string& strError)
+{
+ // Create data structure
+ if (!_pParameterMgr->load(strError)) {
+
+ return false;
+ }
+ // Init flow
+ if (!_pParameterMgr->init(strError)) {
+
+ return false;
+ }
+
+ return true;
+}
+
+// Private logging
+void CParameterMgrPlatformConnector::doLog(const std::string& strLog)
+{
+ if (_pLogger) {
+
+ _pLogger->log(strLog);
+ }
+}
diff --git a/parameter/ParameterMgrPlatformConnector.h b/parameter/ParameterMgrPlatformConnector.h
new file mode 100644
index 0000000..91679b7
--- /dev/null
+++ b/parameter/ParameterMgrPlatformConnector.h
@@ -0,0 +1,70 @@
+/* ParameterMgrPlatformConnector.h
+ **
+ ** Copyright © 2011 Intel
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ **
+ ** AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ ** CREATED: 2011-06-01
+ ** UPDATED: 2011-07-27
+ **
+ */
+#pragma once
+
+#include "SelectionCriterionTypeInterface.h"
+#include "SelectionCriterionInterface.h"
+
+class CParameterMgr;
+class CParameterMgrLogger;
+
+class CParameterMgrPlatformConnector
+{
+ friend class CParameterMgrLogger;
+public:
+ // Logger interface
+ class ILogger
+ {
+ public:
+ virtual void log(const std::string& strLog) = 0;
+ };
+
+ // Construction
+ CParameterMgrPlatformConnector(const std::string& strSystemClassName);
+ ~CParameterMgrPlatformConnector(); // Not virtual since supposed to be derived!
+
+ // Selection Criteria interface. Beware returned objects are lent, clients shall not delete them!
+ // Should be called before start
+ ISelectionCriterionTypeInterface* createSelectionCriterionType(bool bIsInclusive = false);
+ ISelectionCriterionInterface* createSelectionCriterion(const std::string& strName, const ISelectionCriterionTypeInterface* pSelectionCriterionType);
+
+ // Logging
+ // Should be called before start
+ void setLogger(ILogger* pLogger);
+
+ // Start
+ bool start(std::string& strError);
+
+private:
+ // Private logging
+ void doLog(const std::string& strLog);
+
+ // Implementation
+ CParameterMgr* _pParameterMgr;
+ // State
+ bool _bStarted;
+ // Logging
+ ILogger* _pLogger;
+ // Private logging
+ CParameterMgrLogger* _pParameterMgrLogger;
+};
+
diff --git a/parameter/ParameterType.cpp b/parameter/ParameterType.cpp
new file mode 100644
index 0000000..9a23c40
--- /dev/null
+++ b/parameter/ParameterType.cpp
@@ -0,0 +1,97 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ParameterType.h"
+#include "Parameter.h"
+#include "ArrayParameter.h"
+
+#define base CTypeElement
+
+CParameterType::CParameterType(const string& strName) : base(strName), _uiSize(0)
+{
+}
+
+CParameterType::~CParameterType()
+{
+}
+
+// Size
+void CParameterType::setSize(uint32_t uiSize)
+{
+ _uiSize = uiSize;
+}
+
+uint32_t CParameterType::getSize() const
+{
+ return _uiSize;
+}
+
+// Unit
+string CParameterType::getUnit() const
+{
+ return _strUnit;
+}
+
+// From IXmlSink
+bool CParameterType::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Unit
+ _strUnit = xmlElement.getAttributeString("Unit");
+
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+// XML Serialization value space handling
+// Value space handling for configuration import
+void CParameterType::handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ (void)xmlConfigurableElementSettingsElement;
+ (void)configurationAccessContext;
+ // Do nothing by default
+}
+
+// Default value handling (simulation only)
+uint32_t CParameterType::getDefaultValue() const
+{
+ return 0;
+}
+
+// Parameter instantiation
+CInstanceConfigurableElement* CParameterType::doInstantiate() const
+{
+ if (isScalar()) {
+ // Scalar parameter
+ return new CParameter(getName(), this);
+ } else {
+ // Array Parameter
+ return new CArrayParameter(getName(), this, getArrayLength());
+ }
+}
+
diff --git a/parameter/ParameterType.h b/parameter/ParameterType.h
new file mode 100644
index 0000000..9f136a9
--- /dev/null
+++ b/parameter/ParameterType.h
@@ -0,0 +1,76 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+
+#include "TypeElement.h"
+
+class CParameterAccessContext;
+class CConfigurationAccessContext;
+
+class CParameterType : public CTypeElement
+{
+public:
+ CParameterType(const string& strName);
+ virtual ~CParameterType();
+
+ // Size
+ uint32_t getSize() const;
+
+ // Unit
+ string getUnit() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Conversion
+ virtual bool asInteger(const string& strValue, uint32_t& uiValue, CParameterAccessContext& parameterAccessContext) const = 0;
+ virtual void asString(const uint32_t& uiValue, string& strValue, CParameterAccessContext& parameterAccessContext) const = 0;
+
+ // XML Serialization value space handling
+ // Value space handling for configuration import
+ virtual void handleValueSpaceAttribute(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+
+ // Default value handling (simulation only)
+ virtual uint32_t getDefaultValue() const;
+protected:
+ // Size
+ void setSize(uint32_t uiSize);
+
+private:
+ virtual CInstanceConfigurableElement* doInstantiate() const;
+
+ // Size in bytes
+ uint32_t _uiSize;
+ // Unit
+ string _strUnit;
+};
diff --git a/parameter/PathNavigator.cpp b/parameter/PathNavigator.cpp
new file mode 100644
index 0000000..1911002
--- /dev/null
+++ b/parameter/PathNavigator.cpp
@@ -0,0 +1,88 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "PathNavigator.h"
+#include "Tokenizer.h"
+
+CPathNavigator::CPathNavigator(const string& strPath) : _uiCurrentIndex(0)
+{
+ init(strPath);
+}
+
+void CPathNavigator::init(const string& strPath)
+{
+ Tokenizer tokenizer(strPath, "/");
+
+ _astrItems = tokenizer.split();
+
+ _bValid = checkPathFormat(strPath);
+}
+
+bool CPathNavigator::isPathValid() const
+{
+ return _bValid;
+}
+
+string* CPathNavigator::next()
+{
+ if (_uiCurrentIndex < _astrItems.size()) {
+
+ return &_astrItems[_uiCurrentIndex++];
+ }
+
+ return NULL;
+}
+
+string CPathNavigator::getCurrentPath() const
+{
+ string strPath = "/";
+
+ if (!_uiCurrentIndex) {
+
+ return strPath;
+ }
+
+ uint32_t uiItem;
+
+ for (uiItem = 0; uiItem < _uiCurrentIndex - 1; uiItem++) {
+
+ strPath += _astrItems[uiItem] + "/";
+ }
+
+ strPath += _astrItems[uiItem];
+
+ return strPath;
+}
+
+
+bool CPathNavigator::checkPathFormat(const string& strUpl)
+{
+ return strUpl[0] == '/';
+}
diff --git a/parameter/PathNavigator.h b/parameter/PathNavigator.h
new file mode 100644
index 0000000..ae3a901
--- /dev/null
+++ b/parameter/PathNavigator.h
@@ -0,0 +1,57 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <vector>
+#include <string>
+#include <stdint.h>
+
+using namespace std;
+
+class CPathNavigator
+{
+public:
+ CPathNavigator(const string& strPath);
+
+ bool isPathValid() const;
+
+ string* next();
+
+ string getCurrentPath() const;
+
+private:
+ void init(const string& strPath);
+ static bool checkPathFormat(const string& strUpl);
+
+ bool _bValid;
+ vector<string> _astrItems;
+ uint32_t _uiCurrentIndex;
+};
diff --git a/parameter/Rule.cpp b/parameter/Rule.cpp
new file mode 100644
index 0000000..83c5177
--- /dev/null
+++ b/parameter/Rule.cpp
@@ -0,0 +1,38 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Rule.h"
+
+#define base CElement
+
+CRule::CRule()
+{
+}
+
diff --git a/parameter/Rule.h b/parameter/Rule.h
new file mode 100644
index 0000000..95b9de3
--- /dev/null
+++ b/parameter/Rule.h
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CRule : public CElement
+{
+
+public:
+ CRule();
+
+ // Rule check
+ virtual bool matches() const = 0;
+};
diff --git a/parameter/SelectionCriteria.cpp b/parameter/SelectionCriteria.cpp
new file mode 100644
index 0000000..f92807c
--- /dev/null
+++ b/parameter/SelectionCriteria.cpp
@@ -0,0 +1,80 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriteria.h"
+#include "SelectionCriterionLibrary.h"
+#include "SelectionCriteriaDefinition.h"
+
+#define base CElement
+
+CSelectionCriteria::CSelectionCriteria()
+{
+ addChild(new CSelectionCriterionLibrary);
+ addChild(new CSelectionCriteriaDefinition);
+}
+
+string CSelectionCriteria::getKind() const
+{
+ return "SelectionCriteria";
+}
+
+// Selection Criteria/Type creation
+CSelectionCriterionType* CSelectionCriteria::createSelectionCriterionType(bool bIsInclusive)
+{
+ return getSelectionCriterionLibrary()->createSelectionCriterionType(bIsInclusive);
+}
+
+CSelectionCriterion* CSelectionCriteria::createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType)
+{
+ return getSelectionCriteriaDefinition()->createSelectionCriterion(strName, pSelectionCriterionType);
+}
+
+// Subscription
+void CSelectionCriteria::setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver)
+{
+ // Delegate
+ getSelectionCriteriaDefinition()->setObserver(pSelectionCriterionObserver);
+}
+
+// Children access
+CSelectionCriterionLibrary* CSelectionCriteria::getSelectionCriterionLibrary()
+{
+ return static_cast<CSelectionCriterionLibrary*>(getChild(ESelectionCriterionLibrary));
+}
+
+CSelectionCriteriaDefinition* CSelectionCriteria::getSelectionCriteriaDefinition()
+{
+ return static_cast<CSelectionCriteriaDefinition*>(getChild(ESelectionCriteriaDefinition));
+}
+
+const CSelectionCriteriaDefinition* CSelectionCriteria::getSelectionCriteriaDefinition() const
+{
+ return static_cast<const CSelectionCriteriaDefinition*>(getChild(ESelectionCriteriaDefinition));
+}
diff --git a/parameter/SelectionCriteria.h b/parameter/SelectionCriteria.h
new file mode 100644
index 0000000..70528a9
--- /dev/null
+++ b/parameter/SelectionCriteria.h
@@ -0,0 +1,66 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include "SelectionCriterionType.h"
+#include "SelectionCriterion.h"
+
+class CSelectionCriterionLibrary;
+class CSelectionCriteriaDefinition;
+class ISelectionCriterionObserver;
+
+class CSelectionCriteria : public CElement
+{
+ enum ChildElementType {
+ ESelectionCriterionLibrary,
+ ESelectionCriteriaDefinition
+ };
+public:
+ CSelectionCriteria();
+
+ // Selection Criteria/Type creation
+ CSelectionCriterionType* createSelectionCriterionType(bool bIsInclusive);
+ CSelectionCriterion* createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType);
+
+ // Selection Criterion definition
+ const CSelectionCriteriaDefinition* getSelectionCriteriaDefinition() const;
+
+ // Subscription
+ void setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver);
+
+ // Base
+ virtual string getKind() const;
+private:
+ // Children access
+ CSelectionCriterionLibrary* getSelectionCriterionLibrary();
+ CSelectionCriteriaDefinition* getSelectionCriteriaDefinition();
+};
diff --git a/parameter/SelectionCriteriaDefinition.cpp b/parameter/SelectionCriteriaDefinition.cpp
new file mode 100644
index 0000000..eae8944
--- /dev/null
+++ b/parameter/SelectionCriteriaDefinition.cpp
@@ -0,0 +1,72 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriteriaDefinition.h"
+#include "SelectionCriterion.h"
+
+CSelectionCriteriaDefinition::CSelectionCriteriaDefinition()
+{
+}
+
+string CSelectionCriteriaDefinition::getKind() const
+{
+ return "SelectionCriteriaDefinition";
+}
+
+// Selection Criterion creation
+CSelectionCriterion* CSelectionCriteriaDefinition::createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType)
+{
+ CSelectionCriterion* pSelectionCriterion = new CSelectionCriterion(strName, pSelectionCriterionType);
+
+ addChild(pSelectionCriterion);
+
+ return pSelectionCriterion;
+}
+
+// Selection Criterion access
+const CSelectionCriterion* CSelectionCriteriaDefinition::getSelectionCriterion(const string& strName) const
+{
+ return static_cast<const CSelectionCriterion*>(findChild(strName));
+}
+
+// Subscription
+void CSelectionCriteriaDefinition::setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver)
+{
+ // Propagate
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ CSelectionCriterion* pSelectionCriterion = static_cast<CSelectionCriterion*>(getChild(uiChild));
+
+ pSelectionCriterion->setObserver(pSelectionCriterionObserver);
+ }
+}
diff --git a/parameter/SelectionCriteriaDefinition.h b/parameter/SelectionCriteriaDefinition.h
new file mode 100644
index 0000000..2e1a2d6
--- /dev/null
+++ b/parameter/SelectionCriteriaDefinition.h
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include "SelectionCriterion.h"
+
+class ISelectionCriterionObserver;
+
+class CSelectionCriteriaDefinition : public CElement
+{
+public:
+ CSelectionCriteriaDefinition();
+
+ // Selection Criterion creation
+ CSelectionCriterion* createSelectionCriterion(const string& strName, const CSelectionCriterionType* pSelectionCriterionType);
+
+ // Selection Criterion access
+ const CSelectionCriterion* getSelectionCriterion(const string& strName) const;
+
+ // Subscription
+ void setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver);
+
+ // Base
+ virtual string getKind() const;
+};
+
diff --git a/parameter/SelectionCriterion.cpp b/parameter/SelectionCriterion.cpp
new file mode 100644
index 0000000..4c032bb
--- /dev/null
+++ b/parameter/SelectionCriterion.cpp
@@ -0,0 +1,93 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriterion.h"
+
+#define base CElement
+
+CSelectionCriterion::CSelectionCriterion(const string& strName, const CSelectionCriterionType* pType) : base(strName), _iState(0), _pType(pType), _pObserver(NULL)
+{
+}
+
+string CSelectionCriterion::getKind() const
+{
+ return "SelectionCriterion";
+}
+
+/// From ISelectionCriterionInterface
+// State
+void CSelectionCriterion::setCriterionState(int iState, bool bUpdate)
+{
+ // Check for a change
+ if (_iState != iState) {
+
+ _iState = iState;
+
+ // Update if required
+ if (bUpdate && _pObserver) {
+
+ _pObserver->selectionCriterionChanged(this);
+ }
+ }
+}
+
+int CSelectionCriterion::getCriterionState() const
+{
+ return _iState;
+}
+
+// Name
+string CSelectionCriterion::getCriterionName() const
+{
+ return getName();
+}
+
+// Type
+const ISelectionCriterionTypeInterface* CSelectionCriterion::getCriterionType() const
+{
+ return _pType;
+}
+
+/// Observer
+void CSelectionCriterion::setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver)
+{
+ _pObserver = pSelectionCriterionObserver;
+}
+
+/// Match methods
+bool CSelectionCriterion::equals(int iState) const
+{
+ return _iState == iState;
+}
+
+bool CSelectionCriterion::contains(int iState) const
+{
+ return (_iState & iState) != 0;
+}
diff --git a/parameter/SelectionCriterion.h b/parameter/SelectionCriterion.h
new file mode 100644
index 0000000..8bdca68
--- /dev/null
+++ b/parameter/SelectionCriterion.h
@@ -0,0 +1,73 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include "SelectionCriterionType.h"
+#include "SelectionCriterionObserver.h"
+#include "SelectionCriterionInterface.h"
+
+#include <list>
+
+using namespace std;
+
+class CSelectionCriterion : public CElement, public ISelectionCriterionInterface
+{
+public:
+ CSelectionCriterion(const string& strName, const CSelectionCriterionType* pType);
+
+ /// From ISelectionCriterionInterface
+ // State
+ virtual void setCriterionState(int iState, bool bUpdate);
+ virtual int getCriterionState() const;
+ // Name
+ virtual string getCriterionName() const;
+ // Type
+ virtual const ISelectionCriterionTypeInterface* getCriterionType() const;
+
+ /// Subscription
+ void setObserver(ISelectionCriterionObserver* pSelectionCriterionObserver);
+
+ /// Match methods
+ bool equals(int iState) const;
+ bool contains(int iState) const;
+
+ /// From CElement
+ virtual string getKind() const;
+private:
+ // Current state
+ int _iState;
+ // Type
+ const CSelectionCriterionType* _pType;
+ // Observer
+ ISelectionCriterionObserver* _pObserver;
+};
+
diff --git a/parameter/SelectionCriterionDefinition.cpp b/parameter/SelectionCriterionDefinition.cpp
new file mode 100644
index 0000000..58c5485
--- /dev/null
+++ b/parameter/SelectionCriterionDefinition.cpp
@@ -0,0 +1,40 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriterionDefinition.h"
+
+CSelectionCriterionDefinition::CSelectionCriterionDefinition(const string& strName) : CElement(strName)
+{
+}
+
+string CSelectionCriterionDefinition::getKind() const
+{
+ return "SelectionCriterionDefinition";
+}
diff --git a/parameter/SelectionCriterionDefinition.h b/parameter/SelectionCriterionDefinition.h
new file mode 100644
index 0000000..4532010
--- /dev/null
+++ b/parameter/SelectionCriterionDefinition.h
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CSelectionCriterionDefinition : public CElement
+{
+public:
+ CSelectionCriterionDefinition(const string& strName);
+
+ virtual string getKind() const;
+private:
+};
+
diff --git a/parameter/SelectionCriterionInterface.h b/parameter/SelectionCriterionInterface.h
new file mode 100644
index 0000000..134de01
--- /dev/null
+++ b/parameter/SelectionCriterionInterface.h
@@ -0,0 +1,35 @@
+/* SelectionCriterionInterface.h
+ **
+ ** Copyright © 2011 Intel
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ **
+ ** AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ ** CREATED: 2011-06-01
+ ** UPDATED: 2011-07-27
+ **
+ */
+#pragma once
+
+#include <string>
+
+#include "SelectionCriterionTypeInterface.h"
+
+class ISelectionCriterionInterface
+{
+public:
+ virtual void setCriterionState(int iState, bool bUpdate = true) = 0;
+ virtual int getCriterionState() const = 0;
+ virtual std::string getCriterionName() const = 0;
+ virtual const ISelectionCriterionTypeInterface* getCriterionType() const = 0;
+};
diff --git a/parameter/SelectionCriterionLibrary.cpp b/parameter/SelectionCriterionLibrary.cpp
new file mode 100644
index 0000000..f15cd47
--- /dev/null
+++ b/parameter/SelectionCriterionLibrary.cpp
@@ -0,0 +1,52 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriterionLibrary.h"
+
+#define base CElement
+
+CSelectionCriterionLibrary::CSelectionCriterionLibrary()
+{
+}
+
+string CSelectionCriterionLibrary::getKind() const
+{
+ return "SelectionCriterionLibrary";
+}
+
+// Type creation
+CSelectionCriterionType* CSelectionCriterionLibrary::createSelectionCriterionType(bool bIsInclusive)
+{
+ CSelectionCriterionType* pSelectionCriterionType = new CSelectionCriterionType(bIsInclusive);
+
+ addChild(pSelectionCriterionType);
+
+ return pSelectionCriterionType;
+}
diff --git a/parameter/SelectionCriterionLibrary.h b/parameter/SelectionCriterionLibrary.h
new file mode 100644
index 0000000..9d463c8
--- /dev/null
+++ b/parameter/SelectionCriterionLibrary.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include "SelectionCriterionType.h"
+
+class CSelectionCriterionLibrary : public CElement
+{
+public:
+ CSelectionCriterionLibrary();
+
+ // Type creation
+ CSelectionCriterionType* createSelectionCriterionType(bool bIsInclusive);
+
+ // CElement
+ virtual string getKind() const;
+};
diff --git a/parameter/SelectionCriterionObserver.h b/parameter/SelectionCriterionObserver.h
new file mode 100644
index 0000000..fd0ec7d
--- /dev/null
+++ b/parameter/SelectionCriterionObserver.h
@@ -0,0 +1,39 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+class CSelectionCriterion;
+
+class ISelectionCriterionObserver
+{
+public:
+ virtual void selectionCriterionChanged(const CSelectionCriterion* pSelectionCriterion) = 0;
+};
diff --git a/parameter/SelectionCriterionRule.cpp b/parameter/SelectionCriterionRule.cpp
new file mode 100644
index 0000000..4b5956c
--- /dev/null
+++ b/parameter/SelectionCriterionRule.cpp
@@ -0,0 +1,150 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriterionRule.h"
+#include "SelectionCriterion.h"
+#include "XmlDomainSerializingContext.h"
+#include "SelectionCriteriaDefinition.h"
+#include <assert.h>
+
+#define base CRule
+
+const char* CSelectionCriterionRule::_apcMatchesWhen[CSelectionCriterionRule::ENbMatchesWhen] = {
+ "Is",
+ "Contains"
+};
+
+CSelectionCriterionRule::CSelectionCriterionRule() : _pSelectionCriterion(NULL), _eMatchesWhen(CSelectionCriterionRule::EIs), _iMatchValue(0)
+{
+}
+
+// Class kind
+string CSelectionCriterionRule::getKind() const
+{
+ return "SelectionCriterionRule";
+}
+
+// Rule check
+bool CSelectionCriterionRule::matches() const
+{
+ assert(_pSelectionCriterion);
+
+ switch(_eMatchesWhen) {
+ case EIs:
+ return _pSelectionCriterion->equals(_iMatchValue);
+ case EContains:
+ return _pSelectionCriterion->contains(_iMatchValue);
+ default:
+ assert(0);
+ return false;
+ }
+}
+
+// From IXmlSink
+bool CSelectionCriterionRule::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Retrieve actual context
+ CXmlDomainSerializingContext& xmlDomainSerializingContext = static_cast<CXmlDomainSerializingContext&>(serializingContext);
+
+ // Get selection criterion
+ string strSelectionCriterion = xmlElement.getAttributeString("SelectionCriterion");
+
+ _pSelectionCriterion = xmlDomainSerializingContext.getSelectionCriteriaDefinition()->getSelectionCriterion(strSelectionCriterion);
+
+ // Check existence
+ if (!_pSelectionCriterion) {
+
+ xmlDomainSerializingContext.setError("Couldn't find selection criterion " + strSelectionCriterion + " in " + getKind() + " " + xmlElement.getPath());
+
+ return false;
+ }
+
+ // Get MatchesWhen
+ string strMatchesWhen = xmlElement.getAttributeString("MatchesWhen");
+
+ if (!setMatchesWhen(strMatchesWhen)) {
+
+ xmlDomainSerializingContext.setError("Wrong MatchesWhen attribute " + strMatchesWhen + " in " + getKind() + " " + xmlElement.getPath());
+
+ return false;
+ }
+
+ // Get Value
+ string strValue = xmlElement.getAttributeString("Value");
+
+ if (!_pSelectionCriterion->getCriterionType()->getNumericalValue(strValue, _iMatchValue)) {
+
+ xmlDomainSerializingContext.setError("Wrong Value attribute value " + strValue + " in " + getKind() + " " + xmlElement.getPath());
+
+ return false;
+ }
+
+ // Done
+ return true;
+}
+
+// From IXmlSource
+void CSelectionCriterionRule::toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const
+{
+ (void)serializingContext;
+
+ assert(_pSelectionCriterion);
+
+ // Set selection criterion
+ xmlElement.setAttributeString("SelectionCriterion", _pSelectionCriterion->getName());
+
+ // Set MatchesWhen
+ xmlElement.setAttributeString("MatchesWhen", _apcMatchesWhen[_eMatchesWhen]);
+
+ // Set Value
+ string strValue;
+
+ _pSelectionCriterion->getCriterionType()->getLiteralValue(_iMatchValue, strValue);
+
+ xmlElement.setAttributeString("Value", strValue);
+}
+
+// XML MatchesWhen attribute parsing
+bool CSelectionCriterionRule::setMatchesWhen(const string& strMatchesWhen)
+{
+ uint32_t uiMatchesWhen;
+
+ for (uiMatchesWhen = 0; uiMatchesWhen < ENbMatchesWhen; uiMatchesWhen++) {
+
+ if (strMatchesWhen == _apcMatchesWhen[uiMatchesWhen]) {
+
+ // Found it!
+ _eMatchesWhen = (MatchesWhen)uiMatchesWhen;
+
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/parameter/SelectionCriterionRule.h b/parameter/SelectionCriterionRule.h
new file mode 100644
index 0000000..ebd7611
--- /dev/null
+++ b/parameter/SelectionCriterionRule.h
@@ -0,0 +1,76 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Rule.h"
+
+class CSelectionCriterion;
+
+class CSelectionCriterionRule : public CRule
+{
+ enum MatchesWhen {
+ EIs,
+ EContains,
+
+ ENbMatchesWhen
+ };
+
+public:
+ CSelectionCriterionRule();
+
+ // Rule check
+ virtual bool matches() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // From IXmlSource
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const;
+
+ // Class kind
+ virtual string getKind() const;
+private:
+ // Selection criterion
+ const CSelectionCriterion* _pSelectionCriterion;
+
+ // XML MatchesWhen attribute parsing
+ bool setMatchesWhen(const string& strMatchesWhen);
+
+ // MatchesWhen
+ MatchesWhen _eMatchesWhen;
+
+ // Value
+ int32_t _iMatchValue;
+
+ // Used for XML MatchesWhen attribute parsing
+ static const char* _apcMatchesWhen[ENbMatchesWhen];
+};
+
diff --git a/parameter/SelectionCriterionType.cpp b/parameter/SelectionCriterionType.cpp
new file mode 100644
index 0000000..2e562da
--- /dev/null
+++ b/parameter/SelectionCriterionType.cpp
@@ -0,0 +1,93 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SelectionCriterionType.h"
+
+#define base CElement
+
+CSelectionCriterionType::CSelectionCriterionType(bool bIsInclusive) : _bInclusive(bIsInclusive)
+{
+}
+
+string CSelectionCriterionType::getKind() const
+{
+ return "SelectionCriterionType";
+}
+
+// From ISelectionCriterionTypeInterface
+std::string CSelectionCriterionType::getCriterionTypeName()
+{
+ return getName();
+}
+
+bool CSelectionCriterionType::addValuePair(int iValue, const string& strValue)
+{
+ if (_numToLitMap.find(strValue) != _numToLitMap.end()) {
+
+ return false;
+ }
+ _numToLitMap[strValue] = iValue;
+
+ return true;
+}
+
+bool CSelectionCriterionType::getNumericalValue(const string& strValue, int& iValue) const
+{
+ NumToLitMapConstIt it = _numToLitMap.find(strValue);
+
+ if (it != _numToLitMap.end()) {
+
+ iValue = it->second;
+
+ return true;
+ }
+ return false;
+}
+
+bool CSelectionCriterionType::getLiteralValue(int iValue, string& strValue) const
+{
+ NumToLitMapConstIt it;
+
+ for (it = _numToLitMap.begin(); it != _numToLitMap.end(); ++it) {
+
+ if (it->second == iValue) {
+
+ strValue = it->first;
+
+ return true;
+ }
+ }
+ return false;
+}
+
+bool CSelectionCriterionType::isTypeInclusive() const
+{
+ return _bInclusive;
+}
diff --git a/parameter/SelectionCriterionType.h b/parameter/SelectionCriterionType.h
new file mode 100644
index 0000000..ca0571f
--- /dev/null
+++ b/parameter/SelectionCriterionType.h
@@ -0,0 +1,59 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+#include <map>
+#include <string>
+#include "SelectionCriterionTypeInterface.h"
+
+class CSelectionCriterionType : public CElement, public ISelectionCriterionTypeInterface
+{
+ typedef map<string, int>::const_iterator NumToLitMapConstIt;
+
+public:
+ CSelectionCriterionType(bool bIsInclusive);
+
+ // From ISelectionCriterionTypeInterface
+ virtual std::string getCriterionTypeName();
+ virtual bool addValuePair(int iValue, const string& strValue);
+ virtual bool getNumericalValue(const string& strValue, int& iValue) const;
+ virtual bool getLiteralValue(int iValue, string& strValue) const;
+ virtual bool isTypeInclusive() const;
+
+ // From CElement
+ virtual string getKind() const;
+private:
+
+ bool _bInclusive;
+ map<string, int> _numToLitMap;
+};
+
diff --git a/parameter/SelectionCriterionTypeInterface.h b/parameter/SelectionCriterionTypeInterface.h
new file mode 100644
index 0000000..e089056
--- /dev/null
+++ b/parameter/SelectionCriterionTypeInterface.h
@@ -0,0 +1,34 @@
+/* SelectionCriterionTypeInterface.h
+ **
+ ** Copyright © 2011 Intel
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ **
+ ** AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ ** CREATED: 2011-06-01
+ ** UPDATED: 2011-07-27
+ **
+ */
+#pragma once
+
+#include <string>
+
+class ISelectionCriterionTypeInterface
+{
+public:
+ virtual bool addValuePair(int iValue, const std::string& strValue) = 0;
+ virtual bool getNumericalValue(const std::string& strValue, int& iValue) const = 0;
+ virtual bool getLiteralValue(int iValue, std::string& strValue) const = 0;
+ virtual bool isTypeInclusive() const = 0;
+};
+
diff --git a/parameter/SimulatedBackSynchronizer.cpp b/parameter/SimulatedBackSynchronizer.cpp
new file mode 100644
index 0000000..c808081
--- /dev/null
+++ b/parameter/SimulatedBackSynchronizer.cpp
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SimulatedBackSynchronizer.h"
+#include "ConfigurableElement.h"
+
+#define base CBackSynchronizer
+
+CSimulatedBackSynchronizer::CSimulatedBackSynchronizer(const CConfigurableElement* pConfigurableElement, string& strError, CParameterBlackboard* pParameterBlackboard)
+ : base(pConfigurableElement), _parameterAccessContext(strError)
+{
+ _parameterAccessContext.setParameterBlackboard(pParameterBlackboard);
+}
+
+// Back synchronization
+bool CSimulatedBackSynchronizer::sync()
+{
+ // Set default values to simulate back synchronization
+ list<const CConfigurableElement*>::const_iterator it;
+
+ for (it = _needingBackSyncList.begin(); it != _needingBackSyncList.end(); ++it) {
+
+ const CConfigurableElement* pConfigurableElement = *it;
+
+ pConfigurableElement->setDefaultValues(_parameterAccessContext);
+ }
+ return true;
+}
diff --git a/parameter/SimulatedBackSynchronizer.h b/parameter/SimulatedBackSynchronizer.h
new file mode 100644
index 0000000..c6cb5e5
--- /dev/null
+++ b/parameter/SimulatedBackSynchronizer.h
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "BackSynchronizer.h"
+#include "ParameterAccessContext.h"
+
+class CParameterBlackboard;
+
+class CSimulatedBackSynchronizer : public CBackSynchronizer
+{
+public:
+ CSimulatedBackSynchronizer(const CConfigurableElement* pConfigurableElement, string& strError, CParameterBlackboard* pParameterBlackboard);
+
+ // Back synchronization
+ virtual bool sync();
+private:
+ // Parameter context
+ CParameterAccessContext _parameterAccessContext;
+};
+
diff --git a/parameter/Subsystem.cpp b/parameter/Subsystem.cpp
new file mode 100644
index 0000000..a501f91
--- /dev/null
+++ b/parameter/Subsystem.cpp
@@ -0,0 +1,341 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Subsystem.h"
+#include "ComponentLibrary.h"
+#include "InstanceDefinition.h"
+#include "XmlParameterSerializingContext.h"
+#include "ParameterAccessContext.h"
+#include "ConfigurationAccessContext.h"
+#include "SubsystemObjectCreator.h"
+#include <assert.h>
+
+#define base CConfigurableElement
+
+CSubsystem::CSubsystem(const string& strName) : base(strName), _pComponentLibrary(new CComponentLibrary), _pInstanceDefinition(new CInstanceDefinition), _bBigEndian(false)
+{
+ // Note: A subsystem contains instance components
+ // InstanceDefintion and ComponentLibrary objects are then not chosen to be children
+ // They'll be delt with locally
+}
+
+CSubsystem::~CSubsystem()
+{
+ // Remove subsystem objects
+ SubsystemObjectListIterator subsystemObjectIt;
+
+ for (subsystemObjectIt = _subsystemObjectList.begin(); subsystemObjectIt != _subsystemObjectList.end(); ++subsystemObjectIt) {
+
+ delete *subsystemObjectIt;
+ }
+
+ // Remove susbsystem creators
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _subsystemObjectCreatorArray.size(); uiIndex++) {
+
+ delete _subsystemObjectCreatorArray[uiIndex];
+ }
+
+ // Order matters!
+ delete _pInstanceDefinition;
+ delete _pComponentLibrary;
+}
+
+string CSubsystem::getKind() const
+{
+ return "Subsystem";
+}
+
+// Susbsystem Endianness
+bool CSubsystem::isBigEndian() const
+{
+ return _bBigEndian;
+}
+
+// From IXmlSink
+bool CSubsystem::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ CXmlParameterSerializingContext& parameterBuildContext = static_cast<CXmlParameterSerializingContext&>(serializingContext);
+
+ // Install temporary component library for further component creation
+ parameterBuildContext.setComponentLibrary(_pComponentLibrary);
+
+ CXmlElement childElement;
+
+ // XML populate ComponentLibrary
+ xmlElement.getChildElement("ComponentLibrary", childElement);
+
+ if (!_pComponentLibrary->fromXml(childElement, serializingContext)) {
+
+ return false;
+ }
+
+ // XML populate InstanceDefintion
+ xmlElement.getChildElement("InstanceDefintion", childElement);
+ if (!_pInstanceDefinition->fromXml(childElement, serializingContext)) {
+
+ return false;
+ }
+
+ // Create components
+ _pInstanceDefinition->createInstances(this);
+
+ // Execute mapping to create subsystem mapping entities
+ string strError;
+ if (!mapSubsystemElements(strError)) {
+
+ serializingContext.setError(strError);
+
+ return false;
+ }
+
+ // Endianness
+ _bBigEndian = xmlElement.getAttributeBoolean("Endianness", "Big");
+
+ return true;
+}
+
+// XML configuration settings parsing
+bool CSubsystem::serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const
+{
+ // Fix Endianness
+ configurationAccessContext.setBigEndianSubsystem(_bBigEndian);
+
+ return base::serializeXmlSettings(xmlConfigurableElementSettingsElement, configurationAccessContext);
+}
+
+
+bool CSubsystem::mapSubsystemElements(string& strError)
+{
+ // Default mapping context
+ _contextStack.push(CMappingContext(_contextMappingKeyArray.size()));
+
+ // Map all instantiated subelements in subsystem
+ uint32_t uiNbChildren = getNbChildren();
+ uint32_t uiChild;
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ CInstanceConfigurableElement* pInstanceConfigurableChildElement = static_cast<CInstanceConfigurableElement*>(getChild(uiChild));
+
+ if (!pInstanceConfigurableChildElement->map(*this, strError)) {
+
+ return false;
+ }
+ }
+ return true;
+}
+
+// Parameter access
+bool CSubsystem::setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Deal with Endianness
+ parameterContext.setBigEndianSubsystem(_bBigEndian);
+
+ return base::setValue(pathNavigator, strValue, errorContext);
+}
+
+bool CSubsystem::getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Deal with Endianness
+ parameterContext.setBigEndianSubsystem(_bBigEndian);
+
+ return base::getValue(pathNavigator, strValue, errorContext);
+}
+
+void CSubsystem::logValue(string& strValue, CErrorContext& errorContext) const
+{
+ CParameterAccessContext& parameterContext = static_cast<CParameterAccessContext&>(errorContext);
+
+ // Deal with Endianness
+ parameterContext.setBigEndianSubsystem(_bBigEndian);
+
+ return base::logValue(strValue, errorContext);
+}
+
+// Used for simulation only
+void CSubsystem::setDefaultValues(CParameterAccessContext& parameterAccessContext) const
+{
+ // Deal with Endianness
+ parameterAccessContext.setBigEndianSubsystem(_bBigEndian);
+
+ base::setDefaultValues(parameterAccessContext);
+}
+
+// Belonging subsystem
+const CSubsystem* CSubsystem::getBelongingSubsystem() const
+{
+ return this;
+}
+
+// Subsystem context mapping keys publication
+void CSubsystem::addContextMappingKey(const string& strMappingKey)
+{
+ _contextMappingKeyArray.push_back(strMappingKey);
+}
+
+// Subsystem object creator publication (strong reference)
+void CSubsystem::addSubsystemObjectCreator(CSubsystemObjectCreator* pSubsystemObjectCreator)
+{
+ _subsystemObjectCreatorArray.push_back(pSubsystemObjectCreator);
+}
+
+// Mapping generic context handling
+bool CSubsystem::handleMappingContext(const CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError)
+{
+ // Feed context with found mapping data
+ uint32_t uiItem;
+
+ for (uiItem = 0; uiItem < _contextMappingKeyArray.size(); uiItem++) {
+
+ string strKey = _contextMappingKeyArray[uiItem];
+ string strValue;
+
+ if (pInstanceConfigurableElement->getMappingData(strKey, strValue)) {
+ // Assign item to context
+ if (!context.setItem(uiItem, strValue)) {
+
+ getMappingError(strError, strKey, "Already set", pInstanceConfigurableElement);
+
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+// Creation handling
+bool CSubsystem::handleSubsystemObjectCreation(CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError)
+{
+ uint32_t uiItem;
+
+ for (uiItem = 0; uiItem < _subsystemObjectCreatorArray.size(); uiItem++) {
+
+ const CSubsystemObjectCreator* pSubsystemObjectCreator = _subsystemObjectCreatorArray[uiItem];
+
+ // Mapping key
+ string strKey = pSubsystemObjectCreator->getMappingKey();
+ // Object id
+ string strId;
+
+ if (pInstanceConfigurableElement->getMappingData(strKey, strId)) {
+
+ // First check context consisteny
+ uint32_t uiAncestorKey;
+ uint32_t uiAncestorMask = pSubsystemObjectCreator->getAncestorMask();
+
+ for (uiAncestorKey = 0; uiAncestorKey & uiAncestorMask; uiAncestorKey++) {
+
+ string strAncestorKey = _subsystemObjectCreatorArray[uiAncestorKey]->getMappingKey();
+
+ if (!context.iSet(uiAncestorKey)) {
+
+ getMappingError(strError, strKey, strAncestorKey + " not set", pInstanceConfigurableElement);
+
+ return false;
+ }
+ }
+
+ // Do create object
+ string strCreationError;
+
+ CSubsystemObject* pSubsystemObject = pSubsystemObjectCreator->objectCreate(strId, pInstanceConfigurableElement, context, strCreationError);
+
+ if (!pSubsystemObject) {
+
+ getMappingError(strError, strKey, strCreationError, pInstanceConfigurableElement);
+
+ return false;
+ }
+ // Keep track of created object
+ _subsystemObjectList.push_back(pSubsystemObject);
+
+ // Done
+ return true;
+ }
+ }
+ getMappingError(strError, "Mapping key", "Not found", pInstanceConfigurableElement);
+
+ return false;
+}
+
+// Generic error handling from derived subsystem classes
+void CSubsystem::getMappingError(string& strError, const string& strKey, const string& strMessage, const CInstanceConfigurableElement* pInstanceConfigurableElement)
+{
+ strError = getName() + " " + getKind() + " mapping:\n" + strKey + " error : \"" + strMessage + "\" for element " + pInstanceConfigurableElement->getPath();
+}
+
+// From IMapper
+bool CSubsystem::mapBegin(CInstanceConfigurableElement* pInstanceConfigurableElement, string& strError)
+{
+ // Get current context
+ CMappingContext context = _contextStack.top();
+
+ switch(pInstanceConfigurableElement->getType()) {
+
+ case CInstanceConfigurableElement::EComponent:
+
+ if (!handleMappingContext(pInstanceConfigurableElement, context, strError)) {
+
+ return false;
+ }
+ break;
+ case CInstanceConfigurableElement::EParameterBlock:
+ case CInstanceConfigurableElement::EBitParameterBlock:
+ case CInstanceConfigurableElement::EParameter:
+ {
+ if (!handleSubsystemObjectCreation(pInstanceConfigurableElement, context, strError)) {
+
+ return false;
+ }
+ break;
+ }
+ default:
+ assert(0);
+ return false;
+ }
+
+ // Push context
+ _contextStack.push(context);
+
+ return true;
+}
+
+void CSubsystem::mapEnd()
+{
+ // Unstack context
+ _contextStack.pop();
+}
diff --git a/parameter/Subsystem.h b/parameter/Subsystem.h
new file mode 100644
index 0000000..af98608
--- /dev/null
+++ b/parameter/Subsystem.h
@@ -0,0 +1,113 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ConfigurableElement.h"
+#include "Mapper.h"
+#include "MappingContext.h"
+#include <stack>
+#include <vector>
+
+class CInstanceDefinition;
+class CComponentLibrary;
+class CSubsystemObject;
+class CSubsystemObjectCreator;
+
+class CSubsystem : public CConfigurableElement, private IMapper
+{
+ // Subsystem objects iterator
+ typedef list<CSubsystemObject*>::const_iterator SubsystemObjectListIterator;
+public:
+ CSubsystem(const string& strName);
+ virtual ~CSubsystem();
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Susbsystem Endianness
+ bool isBigEndian() const;
+
+ // XML configuration settings parsing
+ virtual bool serializeXmlSettings(CXmlElement& xmlConfigurableElementSettingsElement, CConfigurationAccessContext& configurationAccessContext) const;
+
+ // from CElement
+ virtual string getKind() const;
+protected:
+ // Parameter access
+ virtual bool setValue(CPathNavigator& pathNavigator, const string& strValue, CErrorContext& errorContext) const;
+ virtual bool getValue(CPathNavigator& pathNavigator, string& strValue, CErrorContext& errorContext) const;
+ virtual void logValue(string& strValue, CErrorContext& errorContext) const;
+ // Used for simulation only
+ virtual void setDefaultValues(CParameterAccessContext& parameterAccessContext) const;
+
+ /// Functionality intendedn for derived Subsystems
+ // Subsystem context mapping keys publication
+ void addContextMappingKey(const string& strMappingKey);
+ // Subsystem object creator publication (strong reference)
+ void addSubsystemObjectCreator(CSubsystemObjectCreator* pSubsystemObjectCreator);
+private:
+ // Belonging subsystem
+ virtual const CSubsystem* getBelongingSubsystem() const;
+
+ // Mapping execution
+ bool mapSubsystemElements(string& strError);
+
+ // Generic subsystem mapping error handling
+ void getMappingError(string& strError, const string& strKey, const string& strMessage, const CInstanceConfigurableElement* pInstanceConfigurableElement);
+
+ // From IMapper
+ virtual bool mapBegin(CInstanceConfigurableElement* pInstanceConfigurableElement, string& strError);
+ virtual void mapEnd();
+
+ // Mapping generic context handling
+ bool handleMappingContext(const CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError);
+ // Subsystem object creation handling
+ bool handleSubsystemObjectCreation(CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError);
+
+ // Subsystem context mapping keys
+ vector<string> _contextMappingKeyArray;
+
+ // Subsystem object creator map
+ vector<CSubsystemObjectCreator*> _subsystemObjectCreatorArray;
+
+ // Subsystem sync objects (house keeping)
+ list<CSubsystemObject*> _subsystemObjectList;
+
+ // Mapping Context stack
+ stack<CMappingContext> _contextStack;
+
+ // Subelements
+ CComponentLibrary* _pComponentLibrary;
+ CInstanceDefinition* _pInstanceDefinition;
+
+ // Endianness
+ bool _bBigEndian;
+};
diff --git a/parameter/SubsystemElementBuilder.cpp b/parameter/SubsystemElementBuilder.cpp
new file mode 100644
index 0000000..118ddf1
--- /dev/null
+++ b/parameter/SubsystemElementBuilder.cpp
@@ -0,0 +1,41 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SubsystemElementBuilder.h"
+#include "SubsystemLibrary.h"
+
+CSubsystemElementBuilder::CSubsystemElementBuilder(const CSubsystemLibrary* pSubsystemLibrary) : CElementBuilder("Subsystem"), _pSubsystemLibrary(pSubsystemLibrary)
+{
+}
+
+CElement* CSubsystemElementBuilder::createElement(const CXmlElement& xmlElement) const
+{
+ return _pSubsystemLibrary->createElement(xmlElement);
+}
diff --git a/parameter/SubsystemElementBuilder.h b/parameter/SubsystemElementBuilder.h
new file mode 100644
index 0000000..bc3cdfa
--- /dev/null
+++ b/parameter/SubsystemElementBuilder.h
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ElementBuilder.h"
+
+class CSubsystemLibrary;
+
+class CSubsystemElementBuilder : public CElementBuilder
+{
+public:
+ CSubsystemElementBuilder(const CSubsystemLibrary* pSubsystemLibrary);
+
+ virtual CElement* createElement(const CXmlElement& xmlElement) const;
+
+private:
+ const CSubsystemLibrary* _pSubsystemLibrary;
+};
+
diff --git a/parameter/SubsystemLibrary.cpp b/parameter/SubsystemLibrary.cpp
new file mode 100644
index 0000000..8dd84e6
--- /dev/null
+++ b/parameter/SubsystemLibrary.cpp
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SubsystemLibrary.h"
+#include "XmlElement.h"
+
+
+CSubsystemLibrary::CSubsystemLibrary()
+{
+}
+
+CSubsystemLibrary::~CSubsystemLibrary()
+{
+}
+
+string CSubsystemLibrary::getBuilderType(const CXmlElement& xmlElement) const
+{
+ // Xml element's name attribute
+ return xmlElement.getAttributeString("Type");
+}
diff --git a/parameter/SubsystemLibrary.h b/parameter/SubsystemLibrary.h
new file mode 100644
index 0000000..c94b762
--- /dev/null
+++ b/parameter/SubsystemLibrary.h
@@ -0,0 +1,44 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ElementLibrary.h"
+
+class CSubsystemLibrary : public CElementLibrary
+{
+public:
+ CSubsystemLibrary();
+ virtual ~CSubsystemLibrary();
+
+private:
+ // Builder type (based on element's name attribute)
+ virtual string getBuilderType(const CXmlElement& xmlElement) const;
+};
diff --git a/parameter/SubsystemObject.cpp b/parameter/SubsystemObject.cpp
new file mode 100644
index 0000000..fb53520
--- /dev/null
+++ b/parameter/SubsystemObject.cpp
@@ -0,0 +1,97 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SubsystemObject.h"
+#include "InstanceConfigurableElement.h"
+#include "ParameterBlackboard.h"
+#include <assert.h>
+
+CSubsystemObject::CSubsystemObject(CInstanceConfigurableElement* pInstanceConfigurableElement)
+ : _pInstanceConfigurableElement(pInstanceConfigurableElement), _uiDataSize(pInstanceConfigurableElement->getFootPrint()), _pvSynchronizedLocation(NULL)
+{
+ // Syncer
+ _pInstanceConfigurableElement->setSyncer(this);
+}
+
+CSubsystemObject::~CSubsystemObject()
+{
+ _pInstanceConfigurableElement->unsetSyncer();
+}
+
+// Synchronized location
+void CSubsystemObject::setSynchronizedLocation(void* pvSynchronizedLocation)
+{
+ _pvSynchronizedLocation = pvSynchronizedLocation;
+}
+
+// Size
+uint32_t CSubsystemObject::getSize() const
+{
+ return _uiDataSize;
+}
+
+// Synchronization
+bool CSubsystemObject::sync(CParameterBlackboard& parameterBlackboard, bool bBack, string& strError)
+{
+ assert(_pvSynchronizedLocation);
+
+#ifdef SIMULATION
+ return true;
+#endif
+
+ // Synchronize to/from HW
+ if (bBack) {
+
+ // Read from HW
+ if (!receiveFromHW()) {
+
+ strError = "Unable to back synchronize configurable element " + _pInstanceConfigurableElement->getPath();
+
+ return false;
+ }
+
+ // Write parameter block data
+ parameterBlackboard.rawWrite(_pvSynchronizedLocation, _uiDataSize, _pInstanceConfigurableElement->getOffset());
+
+ } else {
+
+ // Read parameter block data
+ parameterBlackboard.rawRead(_pvSynchronizedLocation, _uiDataSize, _pInstanceConfigurableElement->getOffset());
+
+ // Send to HW
+ if (!sendToHW()) {
+
+ strError = "Unable to synchronize configurable element " + _pInstanceConfigurableElement->getPath();
+
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/parameter/SubsystemObject.h b/parameter/SubsystemObject.h
new file mode 100644
index 0000000..c4e88fb
--- /dev/null
+++ b/parameter/SubsystemObject.h
@@ -0,0 +1,64 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Syncer.h"
+#include <stdint.h>
+
+class CInstanceConfigurableElement;
+
+class CSubsystemObject : public ISyncer
+{
+public:
+ CSubsystemObject(CInstanceConfigurableElement* pInstanceConfigurableElement);
+ virtual ~CSubsystemObject();
+
+ // from ISyncer
+ virtual bool sync(CParameterBlackboard& parameterBlackboard, bool bBack, string& strError);
+
+protected:
+ // Synchronized location
+ void setSynchronizedLocation(void* pvSynchronizedLocation);
+ // Size
+ uint32_t getSize() const;
+
+ // Sync to/from HW
+ virtual bool sendToHW() = 0;
+ virtual bool receiveFromHW() = 0;
+private:
+ // Instance element to sync from/to
+ CInstanceConfigurableElement* _pInstanceConfigurableElement;
+ // Data size
+ uint32_t _uiDataSize;
+ // Synchronized location
+ void* _pvSynchronizedLocation;
+};
+
diff --git a/parameter/SubsystemObjectCreator.cpp b/parameter/SubsystemObjectCreator.cpp
new file mode 100644
index 0000000..b0f0dde
--- /dev/null
+++ b/parameter/SubsystemObjectCreator.cpp
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SubsystemObjectCreator.h"
+
+CSubsystemObjectCreator::CSubsystemObjectCreator(const string& strMappingKey, uint32_t uiAncestorIdMask)
+ : _strMappingKey(strMappingKey), _uiAncestorIdMask(uiAncestorIdMask)
+{
+}
+
+// Accessors
+const string& CSubsystemObjectCreator::getMappingKey() const
+{
+ return _strMappingKey;
+}
+
+uint32_t CSubsystemObjectCreator::getAncestorMask() const
+{
+ return _uiAncestorIdMask;
+}
diff --git a/parameter/SubsystemObjectCreator.h b/parameter/SubsystemObjectCreator.h
new file mode 100644
index 0000000..91ad5be
--- /dev/null
+++ b/parameter/SubsystemObjectCreator.h
@@ -0,0 +1,57 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "SubsystemObject.h"
+#include "MappingContext.h"
+#include <string>
+
+using namespace std;
+
+class CSubsystemObjectCreator
+{
+public:
+ CSubsystemObjectCreator(const string& strMappingKey, uint32_t uiAncestorIdMask);
+
+ // Accessors
+ const string& getMappingKey() const;
+ uint32_t getAncestorMask() const;
+
+ // Object creation
+ virtual CSubsystemObject* objectCreate(const string& strId, CInstanceConfigurableElement* pInstanceConfigurableElement, CMappingContext& context, string& strError) const = 0;
+
+private:
+ // Mapping key
+ string _strMappingKey;
+ // Mask of must-be-specified ancestors
+ uint32_t _uiAncestorIdMask;
+};
+
diff --git a/parameter/Syncer.h b/parameter/Syncer.h
new file mode 100644
index 0000000..052df6b
--- /dev/null
+++ b/parameter/Syncer.h
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+class CParameterBlackboard;
+
+class ISyncer
+{
+public:
+ virtual bool sync(CParameterBlackboard& parameterBlackboard, bool bBack, string& strError) = 0;
+};
diff --git a/parameter/SyncerSet.cpp b/parameter/SyncerSet.cpp
new file mode 100644
index 0000000..0924784
--- /dev/null
+++ b/parameter/SyncerSet.cpp
@@ -0,0 +1,75 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SyncerSet.h"
+#include "Syncer.h"
+
+CSyncerSet::CSyncerSet()
+{
+}
+
+const CSyncerSet& CSyncerSet::operator+=(ISyncer* pRightSyncer)
+{
+ _syncerSet.insert(pRightSyncer);
+
+ return *this;
+}
+
+const CSyncerSet& CSyncerSet::operator+=(const CSyncerSet& rightSyncerSet)
+{
+ if (&rightSyncerSet != this) {
+
+ _syncerSet.insert(rightSyncerSet._syncerSet.begin(), rightSyncerSet._syncerSet.end());
+ }
+
+ return *this;
+}
+
+void CSyncerSet::clear()
+{
+ _syncerSet.clear();
+}
+
+bool CSyncerSet::sync(CParameterBlackboard& parameterBlackboard, bool bBack, string& strError) const
+{
+ // Propagate
+ SyncerSetConstIterator it;
+
+ for (it = _syncerSet.begin(); it != _syncerSet.end(); ++it) {
+
+ ISyncer* pSyncer = *it;
+
+ if (!pSyncer->sync(parameterBlackboard, bBack, strError)) {
+
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/parameter/SyncerSet.h b/parameter/SyncerSet.h
new file mode 100644
index 0000000..1095c9e
--- /dev/null
+++ b/parameter/SyncerSet.h
@@ -0,0 +1,59 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <set>
+#include <string>
+
+using namespace std;
+
+class ISyncer;
+class CParameterBlackboard;
+
+class CSyncerSet
+{
+ typedef set<ISyncer*>::const_iterator SyncerSetConstIterator;
+public:
+ CSyncerSet();
+
+ // Filling
+ const CSyncerSet& operator+=(ISyncer* pRightSyncer);
+ const CSyncerSet& operator+=(const CSyncerSet& rightSyncerSet);
+
+ // Clearing
+ void clear();
+
+ // Sync
+ bool sync(CParameterBlackboard& parameterBlackboard, bool bBack, string& strError) const;
+
+private:
+ set<ISyncer*> _syncerSet;
+};
diff --git a/parameter/SystemClass.cpp b/parameter/SystemClass.cpp
new file mode 100644
index 0000000..62b6538
--- /dev/null
+++ b/parameter/SystemClass.cpp
@@ -0,0 +1,177 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include <dlfcn.h>
+#include <dirent.h>
+#include "SystemClass.h"
+#include "SubsystemLibrary.h"
+#include "AutoLog.h"
+
+#define base CConfigurableElement
+
+// Used by subsystem plugins
+typedef void (*GetSusbystemBuilder)(CSubsystemLibrary*);
+
+CSystemClass::CSystemClass(const string& strName) : base(strName), _pSubsystemLibrary(new CSubsystemLibrary)
+{
+}
+
+CSystemClass::~CSystemClass()
+{
+ delete _pSubsystemLibrary;
+}
+
+bool CSystemClass::childrenAreDynamic() const
+{
+ return true;
+}
+
+string CSystemClass::getKind() const
+{
+ return "SystemClass";
+}
+
+bool CSystemClass::loadSubsystems(string& strError, const vector<string>& astrPluginFolderPaths)
+{
+ CAutoLog autoLlog(this, "Loading subsystem plugins");
+
+ // Plugin list
+ vector<string> astrPluginFiles;
+
+ uint32_t uiFolderLocation;
+
+ for (uiFolderLocation = 0; uiFolderLocation < astrPluginFolderPaths.size(); uiFolderLocation++) {
+
+ // Folder for current SystemClass
+ string strPluginPath = astrPluginFolderPaths[uiFolderLocation] + "/" + getName() + "/";
+
+ // Get plugin list
+ getPluginFiles(strPluginPath, astrPluginFiles);
+ }
+ // Check at least one subsystem plugin available
+ if (!astrPluginFiles.size()) {
+
+ // No plugin found?
+ strError = "No subsystem plugin found";
+ }
+
+ // Actually load plugins
+ uint32_t uiPlugin;
+ // Start clean
+ _pSubsystemLibrary->clean();
+
+ for (uiPlugin = 0; uiPlugin < astrPluginFiles.size(); uiPlugin++) {
+
+ string strPluginFileName = astrPluginFiles[uiPlugin];
+
+ log("Loading subsystem plugin path \"%s\"", strPluginFileName.c_str());
+
+ void* lib_handle = dlopen(strPluginFileName.c_str(), RTLD_LAZY);
+
+ if (!lib_handle) {
+
+ // Return error
+ const char* pcError = dlerror();
+
+ if (pcError) {
+
+ strError = pcError;
+ } else {
+
+ strError = "Unable to load subsystem plugin " + strPluginFileName;
+ }
+
+ _pSubsystemLibrary->clean();
+
+ return false;
+ }
+
+ GetSusbystemBuilder pfnGetSusbystemBuilder = (GetSusbystemBuilder)dlsym(lib_handle, "getSusbystemBuilder");
+
+ if (!pfnGetSusbystemBuilder) {
+
+ strError = "Subsystem plugin " + strPluginFileName + " does not contain getSusbystemBuilder symbol.";
+
+ _pSubsystemLibrary->clean();
+
+ return false;
+ }
+
+ // Fill library
+ pfnGetSusbystemBuilder(_pSubsystemLibrary);
+ }
+
+ return true;
+}
+
+bool CSystemClass::getPluginFiles(const string& strPluginPath, vector<string>& astrPluginFiles) const
+{
+ log("Seeking subsystem plugins from folder \"%s\"", strPluginPath.c_str());
+
+ DIR *dirp;
+ struct dirent *dp;
+
+ if ((dirp = opendir(strPluginPath.c_str())) == NULL) {
+
+ return false;
+ }
+
+ const string strPluginPattern("-subsystem.so");
+
+ // Parse it and load plugins
+ while ((dp = readdir(dirp)) != NULL) {
+
+ string strFileName(dp->d_name);
+
+ // Check file name ends with "-susbsystem.so"
+ size_t uiPatternPos = strFileName.rfind(strPluginPattern, -1);
+
+ if (uiPatternPos != (size_t)-1 && uiPatternPos == strFileName.size() - strPluginPattern.size()) {
+ // Found plugin
+ astrPluginFiles.push_back(strPluginPath + strFileName);
+ }
+ }
+
+ // Close plugin folder
+ closedir(dirp);
+
+ return true;
+}
+
+const CSubsystemLibrary* CSystemClass::getSubsystemLibrary() const
+{
+ return _pSubsystemLibrary;
+}
+
+bool CSystemClass::init(string& strError)
+{
+ return base::init(strError);
+}
+
diff --git a/parameter/SystemClass.h b/parameter/SystemClass.h
new file mode 100644
index 0000000..a739f1a
--- /dev/null
+++ b/parameter/SystemClass.h
@@ -0,0 +1,62 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "ConfigurableElement.h"
+#include <vector>
+
+class CSubsystemLibrary;
+
+class CSystemClass : public CConfigurableElement
+{
+public:
+ CSystemClass(const string& strName);
+ virtual ~CSystemClass();
+
+ // Called from parent before actual init
+ bool loadSubsystems(string& strError, const vector<string>& astrPluginFolderPaths);
+ const CSubsystemLibrary* getSubsystemLibrary() const;
+
+ // base
+ virtual bool init(string& strError);
+ virtual string getKind() const;
+
+private:
+ // base
+ virtual bool childrenAreDynamic() const;
+
+ // Subsystem plugins
+ bool getPluginFiles(const string& strPluginPath, vector<string>& astrPluginFiles) const;
+
+ // ref only
+ CSubsystemLibrary* _pSubsystemLibrary;
+};
+
diff --git a/parameter/SystemClassConfiguration.cpp b/parameter/SystemClassConfiguration.cpp
new file mode 100644
index 0000000..0ebb2b1
--- /dev/null
+++ b/parameter/SystemClassConfiguration.cpp
@@ -0,0 +1,63 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "SystemClassConfiguration.h"
+
+#define base CFrameworkConfigurationGroup
+
+CSystemClassConfiguration::CSystemClassConfiguration(const string& strName, const string& strKind)
+ : base(strName, strKind), _bTuningAllowed(false), _uiServerPort(0)
+{
+}
+
+// Tuning allowed
+bool CSystemClassConfiguration::isTuningAllowed() const
+{
+ return _bTuningAllowed;
+}
+
+// Server port
+uint16_t CSystemClassConfiguration::getServerPort() const
+{
+ return _uiServerPort;
+}
+
+// From IXmlSink
+bool CSystemClassConfiguration::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Tuning allowed
+ _bTuningAllowed = xmlElement.getAttributeBoolean("TuningAllowed");
+
+ // Server port
+ _uiServerPort = (uint16_t)xmlElement.getAttributeInteger("ServerPort");
+
+ // Base
+ return base::fromXml(xmlElement, serializingContext);
+}
diff --git a/parameter/SystemClassConfiguration.h b/parameter/SystemClassConfiguration.h
new file mode 100644
index 0000000..0a24a8a
--- /dev/null
+++ b/parameter/SystemClassConfiguration.h
@@ -0,0 +1,54 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "FrameworkConfigurationGroup.h"
+
+class CSystemClassConfiguration : public CFrameworkConfigurationGroup
+{
+public:
+ CSystemClassConfiguration(const string& strName, const string& strKind);
+
+ // Tuning allowed
+ bool isTuningAllowed() const;
+
+ // Server port
+ uint16_t getServerPort() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+private:
+ // Tuning allowed
+ bool _bTuningAllowed;
+ // Server port
+ uint16_t _uiServerPort;
+};
+
diff --git a/parameter/TypeElement.cpp b/parameter/TypeElement.cpp
new file mode 100644
index 0000000..2b9c663
--- /dev/null
+++ b/parameter/TypeElement.cpp
@@ -0,0 +1,126 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "TypeElement.h"
+#include "MappingData.h"
+#include "Tokenizer.h"
+#include "InstanceConfigurableElement.h"
+#include <assert.h>
+
+#define base CElement
+
+CTypeElement::CTypeElement(const string& strName) : base(strName), _uiArrayLength(0), _pMappingData(NULL)
+{
+}
+
+CTypeElement::~CTypeElement()
+{
+ delete _pMappingData;
+}
+
+bool CTypeElement::isScalar() const
+{
+ return !_uiArrayLength;
+}
+
+uint32_t CTypeElement::getArrayLength() const
+{
+ return _uiArrayLength;
+}
+
+bool CTypeElement::getMappingData(const string& strKey, string& strValue) const
+{
+ if (_pMappingData) {
+
+ return _pMappingData->getValue(strKey, strValue);
+ }
+ return false;
+}
+
+bool CTypeElement::hasMappingData() const
+{
+ return !!_pMappingData;
+}
+
+void CTypeElement::populate(CElement* pElement) const
+{
+ // Populate children
+ uint32_t uiChild;
+ uint32_t uiNbChildren = getNbChildren();
+
+ for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+ const CTypeElement* pChildTypeElement = static_cast<const CTypeElement*>(getChild(uiChild));
+
+ CInstanceConfigurableElement* pInstanceConfigurableChildElement = pChildTypeElement->instantiate();
+
+ // Affiliate
+ pElement->addChild(pInstanceConfigurableChildElement);
+ }
+}
+
+bool CTypeElement::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Array Length attribute
+ if (xmlElement.hasAttribute("ArrayLength")) {
+
+ _uiArrayLength = xmlElement.getAttributeInteger("ArrayLength");
+ } else {
+ _uiArrayLength = 0; // Scalar
+ }
+ // Manage mapping attribute
+ if (xmlElement.hasAttribute("Mapping")) {
+
+ if (!getMappingData()->fromXml(xmlElement, serializingContext)) {
+
+ return false;
+ }
+ }
+ return base::fromXml(xmlElement, serializingContext);
+}
+
+CInstanceConfigurableElement* CTypeElement::instantiate() const
+{
+ CInstanceConfigurableElement* pInstanceConfigurableElement = doInstantiate();
+
+ // Populate
+ populate(pInstanceConfigurableElement);
+
+ return pInstanceConfigurableElement;
+}
+
+CMappingData* CTypeElement::getMappingData()
+{
+ if (!_pMappingData) {
+
+ _pMappingData = new CMappingData;
+ }
+ return _pMappingData;
+}
diff --git a/parameter/TypeElement.h b/parameter/TypeElement.h
new file mode 100644
index 0000000..9391729
--- /dev/null
+++ b/parameter/TypeElement.h
@@ -0,0 +1,75 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Element.h"
+
+class CMappingData;
+class CInstanceConfigurableElement;
+
+class CTypeElement : public CElement
+{
+public:
+ CTypeElement(const string& strName = "");
+ virtual ~CTypeElement();
+
+ // Instantiation
+ CInstanceConfigurableElement* instantiate() const;
+
+ // Mapping info
+ virtual bool getMappingData(const string& strKey, string& strValue) const;
+ virtual bool hasMappingData() const;
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+
+ // Scalar or Array?
+ bool isScalar() const;
+
+protected:
+ // Array Length
+ uint32_t getArrayLength() const;
+
+ // Object creation
+ virtual void populate(CElement* pElement) const;
+private:
+ // Actual instance creation
+ virtual CInstanceConfigurableElement* doInstantiate() const = 0;
+
+ // Mapping data creation and access
+ CMappingData* getMappingData();
+
+ // For Arrays. 0 means scalar
+ uint32_t _uiArrayLength;
+
+ // Mapping info
+ CMappingData* _pMappingData;
+};
diff --git a/parameter/XmlDomainSerializingContext.cpp b/parameter/XmlDomainSerializingContext.cpp
new file mode 100644
index 0000000..34a465c
--- /dev/null
+++ b/parameter/XmlDomainSerializingContext.cpp
@@ -0,0 +1,66 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlDomainSerializingContext.h"
+
+#define base CXmlElementSerializingContext
+
+CXmlDomainSerializingContext::CXmlDomainSerializingContext(string& strError, bool bWithSettings)
+ : base(strError), _bWithSettings(bWithSettings), _bValueSpaceIsRaw(false), _pSelectionCriteriaDefinition(NULL)
+{
+}
+
+// Settings to be loaded or not
+bool CXmlDomainSerializingContext::withSettings() const
+{
+ return _bWithSettings;
+}
+
+// Value Space
+void CXmlDomainSerializingContext::setValueSpaceRaw(bool bIsRaw)
+{
+ _bValueSpaceIsRaw = bIsRaw;
+}
+
+bool CXmlDomainSerializingContext::valueSpaceIsRaw() const
+{
+ return _bValueSpaceIsRaw;
+}
+
+// Criteria defintion
+void CXmlDomainSerializingContext::setSelectionCriteriaDefinition(const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition)
+{
+ _pSelectionCriteriaDefinition = pSelectionCriteriaDefinition;
+}
+
+const CSelectionCriteriaDefinition* CXmlDomainSerializingContext::getSelectionCriteriaDefinition() const
+{
+ return _pSelectionCriteriaDefinition;
+}
diff --git a/parameter/XmlDomainSerializingContext.h b/parameter/XmlDomainSerializingContext.h
new file mode 100644
index 0000000..770f14b
--- /dev/null
+++ b/parameter/XmlDomainSerializingContext.h
@@ -0,0 +1,64 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElementSerializingContext.h"
+
+class CParameterBlackboard;
+class CSelectionCriteriaDefinition;
+
+class CXmlDomainSerializingContext : public CXmlElementSerializingContext
+{
+public:
+ CXmlDomainSerializingContext(string& strError, bool bWithSettings);
+
+ // Settings to be serialized or not
+ bool withSettings() const;
+
+ // Value interpretation as Real or Raw (usefull for Fixed point parameters)
+ void setValueSpaceRaw(bool bIsRaw);
+ bool valueSpaceIsRaw() const;
+
+ // ParameterBlackboard
+ const CParameterBlackboard* getParameterBlackboard() const;
+
+ // Criteria defintion
+ void setSelectionCriteriaDefinition(const CSelectionCriteriaDefinition* pSelectionCriteriaDefinition);
+ const CSelectionCriteriaDefinition* getSelectionCriteriaDefinition() const;
+
+private:
+ // Indicate wheter or not to import settings
+ bool _bWithSettings;
+ // Value Space
+ bool _bValueSpaceIsRaw;
+ // Criteria defintion
+ const CSelectionCriteriaDefinition* _pSelectionCriteriaDefinition;
+};
diff --git a/parameter/XmlElementSerializingContext.cpp b/parameter/XmlElementSerializingContext.cpp
new file mode 100644
index 0000000..a5d0f8e
--- /dev/null
+++ b/parameter/XmlElementSerializingContext.cpp
@@ -0,0 +1,65 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlElementSerializingContext.h"
+#include <stdlib.h>
+
+#define base CXmlSerializingContext
+
+CXmlElementSerializingContext::CXmlElementSerializingContext(string& strError) : base(strError), _pElementLibrary(NULL)
+{
+}
+
+// Init
+void CXmlElementSerializingContext::set(const CElementLibrary* pElementLibrary, const string& strXmlFolder, const string& strXmlSchemaFolder)
+{
+ _pElementLibrary = pElementLibrary;
+ _strXmlFolder = strXmlFolder;
+ _strXmlSchemaFolder = strXmlSchemaFolder;
+}
+
+// ElementLibrary
+const CElementLibrary* CXmlElementSerializingContext::getElementLibrary() const
+{
+ return _pElementLibrary;
+}
+
+// XML Folder Path
+const string& CXmlElementSerializingContext::getXmlFolder() const
+{
+ return _strXmlFolder;
+}
+
+// XML Schema Path
+const string& CXmlElementSerializingContext::getXmlSchemaPathFolder() const
+{
+ return _strXmlSchemaFolder;
+}
+
diff --git a/parameter/XmlElementSerializingContext.h b/parameter/XmlElementSerializingContext.h
new file mode 100644
index 0000000..16ff5d2
--- /dev/null
+++ b/parameter/XmlElementSerializingContext.h
@@ -0,0 +1,57 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlSerializingContext.h"
+
+class CElementLibrary;
+
+class CXmlElementSerializingContext : public CXmlSerializingContext
+{
+public:
+ CXmlElementSerializingContext(string& strError);
+
+ // Init
+ void set(const CElementLibrary* pElementLibrary, const string& strXmlFolder, const string& strXmlSchemaFolder);
+
+ // ElementLibrary
+ const CElementLibrary* getElementLibrary() const;
+
+ // XML File Path
+ const string& getXmlFolder() const;
+
+ // Schema Path
+ const string& getXmlSchemaPathFolder() const;
+private:
+ const CElementLibrary* _pElementLibrary;
+ string _strXmlFolder;
+ string _strXmlSchemaFolder;
+};
diff --git a/parameter/XmlFileIncluderElement.cpp b/parameter/XmlFileIncluderElement.cpp
new file mode 100644
index 0000000..4000758
--- /dev/null
+++ b/parameter/XmlFileIncluderElement.cpp
@@ -0,0 +1,111 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlFileIncluderElement.h"
+#include "XmlParser.h"
+#include "XmlElementSerializingContext.h"
+#include "ElementLibrary.h"
+#include <assert.h>
+
+#define base CKindElement
+
+CXmlFileIncluderElement::CXmlFileIncluderElement(const string& strName, const string& strKind) : base(strName, strKind)
+{
+}
+
+// From IXmlSink
+bool CXmlFileIncluderElement::fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext)
+{
+ // Context
+ CXmlElementSerializingContext& elementSerializingContext = static_cast<CXmlElementSerializingContext&>(serializingContext);
+
+ // Parse included document
+ string strPath = xmlElement.getAttributeString("Path");
+
+ // Relative path?
+ if (strPath[0] != '/') {
+
+ strPath = elementSerializingContext.getXmlFolder() + "/" + strPath;
+ }
+
+ // Instantiate parser
+ string strIncludedElementType = getIncludedElementType();
+
+ CXmlParser parser(strPath, elementSerializingContext.getXmlSchemaPathFolder() + "/" + strIncludedElementType + ".xsd", strIncludedElementType, elementSerializingContext);
+
+ if (!parser.open()) {
+
+ return false;
+ }
+
+ // Get top level element
+ CXmlElement childElement;
+
+ parser.getRootElement(childElement);
+
+ // Create child element
+ CElement* pChild = elementSerializingContext.getElementLibrary()->createElement(childElement);
+
+ if (pChild) {
+
+ // Store created child!
+ getParent()->addChild(pChild);
+ } else {
+
+ elementSerializingContext.setError("Unable to create XML element " + childElement.getPath());
+
+ return false;
+ }
+
+ if (!parser.parse(pChild)) {
+
+ return false;
+ }
+
+ // Detach from parent
+ getParent()->removeChild(this);
+
+ // Self destroy
+ delete this;
+
+ return true;
+}
+
+// Element type
+string CXmlFileIncluderElement::getIncludedElementType() const
+{
+ string strKind = getKind();
+
+ int iPosToRemoveFrom = strKind.rfind("Include", -1);
+
+ assert(iPosToRemoveFrom != -1);
+
+ return strKind.substr(0, iPosToRemoveFrom);
+}
diff --git a/parameter/XmlFileIncluderElement.h b/parameter/XmlFileIncluderElement.h
new file mode 100644
index 0000000..5b37a44
--- /dev/null
+++ b/parameter/XmlFileIncluderElement.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "KindElement.h"
+
+// Class used to parse <ElementType>Include elements
+class CXmlFileIncluderElement : public CKindElement
+{
+public:
+ CXmlFileIncluderElement(const string& strName, const string& strKind);
+
+ // From IXmlSink
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext);
+private:
+ // Element type
+ string getIncludedElementType() const;
+};
diff --git a/parameter/XmlParameterSerializingContext.cpp b/parameter/XmlParameterSerializingContext.cpp
new file mode 100644
index 0000000..2139660
--- /dev/null
+++ b/parameter/XmlParameterSerializingContext.cpp
@@ -0,0 +1,50 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlParameterSerializingContext.h"
+
+#define base CXmlElementSerializingContext
+
+CXmlParameterSerializingContext::CXmlParameterSerializingContext(string& strError) : base(strError)
+{
+}
+
+// ComponentLibrary
+void CXmlParameterSerializingContext::setComponentLibrary(const CComponentLibrary* pComponentLibrary)
+{
+ _pComponentLibrary = pComponentLibrary;
+}
+
+const CComponentLibrary* CXmlParameterSerializingContext::getComponentLibrary() const
+{
+ return _pComponentLibrary;
+}
+
+
diff --git a/parameter/XmlParameterSerializingContext.h b/parameter/XmlParameterSerializingContext.h
new file mode 100644
index 0000000..2e92c0a
--- /dev/null
+++ b/parameter/XmlParameterSerializingContext.h
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElementSerializingContext.h"
+
+class CComponentLibrary;
+
+class CXmlParameterSerializingContext : public CXmlElementSerializingContext
+{
+public:
+ CXmlParameterSerializingContext(string& strError);
+
+ // ComponentLibrary
+ void setComponentLibrary(const CComponentLibrary* pComponentLibrary);
+ const CComponentLibrary* getComponentLibrary() const;
+private:
+ const CComponentLibrary* _pComponentLibrary;
+};
diff --git a/parameter/parameter b/parameter/parameter
new file mode 100755
index 0000000..837edd0
--- /dev/null
+++ b/parameter/parameter
@@ -0,0 +1,2 @@
+#! /bin/sh
+./remote-process localhost 5000 $*
diff --git a/remote-process/Android.mk b/remote-process/Android.mk
new file mode 100644
index 0000000..7f1c59c
--- /dev/null
+++ b/remote-process/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH :=
+
+
+LOCAL_SRC_FILES:= \
+ main.cpp
+
+
+LOCAL_MODULE:= remote-process
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../remote-processor/
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc libremote-processor
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_LDLIBS +=
+LOCAL_LDFLAGS +=
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/remote-process/main.cpp b/remote-process/main.cpp
new file mode 100644
index 0000000..51d0fae
--- /dev/null
+++ b/remote-process/main.cpp
@@ -0,0 +1,111 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include <iostream>
+#include <stdlib.h>
+#include "RequestMessage.h"
+#include "AnswerMessage.h"
+#include "ConnectionSocket.h"
+
+using namespace std;
+
+// <program> <target> <port> <cmd> <arg>*
+int main(int argc, char *argv[])
+{
+ // Enough args?
+ if (argc < 4) {
+
+ cerr << "Missing arguments" << endl;
+ cerr << "Usage: " << argv[1] << " <target> <port> <cmd> <arg>*" << endl;
+
+ return -1;
+ }
+ // Get port number
+ uint16_t uiPort = (uint16_t)strtoul(argv[2], NULL, 0);
+
+ // Connect to target
+ CConnectionSocket connectionSocket;
+
+ // Set timeout
+ connectionSocket.setTimeout(5000);
+
+ string strError;
+ // Connect
+ if (!connectionSocket.connect(argv[1], uiPort, strError)) {
+
+ cerr << strError << endl;
+
+ return -2;
+ }
+
+ // Create command message
+ CRequestMessage requestMessage(argv[3]);
+
+ // Add arguments
+ uint32_t uiArg;
+
+ for (uiArg = 4; uiArg < (uint32_t)argc; uiArg++) {
+
+ requestMessage.addArgument(argv[uiArg]);
+ }
+
+ ///// Send command
+ if (!requestMessage.serialize(&connectionSocket, true)) {
+
+ cerr << "Unable to send command to target" << endl;
+
+ return -3;
+ }
+
+ // Create answer message
+ CAnswerMessage answerMessage;
+
+ ///// Get answer
+ if (!answerMessage.serialize(&connectionSocket, false)) {
+
+ cerr << "No answer received from target" << endl;
+
+ return -4;
+ }
+
+ // Success?
+ if (!answerMessage.success()) {
+
+ // Display error answer
+ cerr << answerMessage.getAnswer() << endl;
+ } else {
+
+ // Display success answer
+ cout << answerMessage.getAnswer() << endl;
+ }
+
+ // Program status
+ return answerMessage.success() ? 0 : -5;
+}
diff --git a/remote-processor-test/Android.mk b/remote-processor-test/Android.mk
new file mode 100644
index 0000000..66c0cab
--- /dev/null
+++ b/remote-processor-test/Android.mk
@@ -0,0 +1,32 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH :=
+
+
+LOCAL_SRC_FILES:= \
+ main.cpp
+
+
+LOCAL_MODULE:= remote-processor-test
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../remote-processor
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc libremote-processor
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_LDLIBS +=
+LOCAL_LDFLAGS +=
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/remote-processor-test/main.cpp b/remote-processor-test/main.cpp
new file mode 100644
index 0000000..8c68f29
--- /dev/null
+++ b/remote-processor-test/main.cpp
@@ -0,0 +1,69 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include <iostream>
+#include <stdlib.h>
+#include "RemoteProcessorServer.h"
+#include <semaphore.h>
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+ // Enough args?
+ if (argc < 2) {
+
+ cerr << "Missing arguments (port number)" << endl;
+
+ return -1;
+ }
+ // Get port number
+ uint16_t uiPort = (uint16_t)strtoul(argv[1], NULL, 0);
+
+ CRemoteProcessorServer remoteProcessorServer(uiPort, NULL);
+
+ if (!remoteProcessorServer.start()) {
+
+ cerr << "Unable to start server" << endl;
+
+ return -1;
+ }
+
+ // Block here
+ sem_t sem;
+
+ sem_init(&sem, false, 0);
+
+ sem_wait(&sem);
+
+ sem_destroy(&sem);
+
+ return 0;
+}
diff --git a/remote-processor/Android.mk b/remote-processor/Android.mk
new file mode 100644
index 0000000..e55b158
--- /dev/null
+++ b/remote-processor/Android.mk
@@ -0,0 +1,39 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
+
+LOCAL_SRC_FILES:= \
+ Socket.cpp \
+ ListeningSocket.cpp \
+ ConnectionSocket.cpp \
+ Message.cpp \
+ RequestMessage.cpp \
+ AnswerMessage.cpp \
+ RemoteProcessorServer.cpp \
+ RemoteProcessorServerBuilder.cpp
+
+LOCAL_MODULE:= libremote-processor
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc
+LOCAL_STATIC_LIBRARIES :=
+
+LOCAL_LDLIBS +=
+
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/remote-processor/AnswerMessage.cpp b/remote-processor/AnswerMessage.cpp
new file mode 100644
index 0000000..60bf750
--- /dev/null
+++ b/remote-processor/AnswerMessage.cpp
@@ -0,0 +1,85 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "AnswerMessage.h"
+#include "RemoteProcessorProtocol.h"
+#include <assert.h>
+
+#define base CMessage
+
+CAnswerMessage::CAnswerMessage(const string& strAnswer, bool bSuccess) : base(bSuccess ? ESuccessAnswer : EFailureAnswer), _strAnswer(strAnswer)
+{
+}
+
+CAnswerMessage::CAnswerMessage()
+{
+}
+
+// Answer
+void CAnswerMessage::setAnswer(const string& strAnswer)
+{
+ _strAnswer = strAnswer;
+}
+
+const string& CAnswerMessage::getAnswer() const
+{
+ return _strAnswer;
+}
+
+// Status
+bool CAnswerMessage::success() const
+{
+ return getMsgId() == ESuccessAnswer;
+}
+
+// Size
+uint32_t CAnswerMessage::getDataSize() const
+{
+ // Answer
+ return getStringSize(getAnswer());
+}
+
+// Fill data to send
+void CAnswerMessage::fillDataToSend()
+{
+ // Send answer
+ writeString(getAnswer());
+}
+
+// Collect received data
+void CAnswerMessage::collectReceivedData()
+{
+ // Receive answer
+ string strAnswer;
+
+ readString(strAnswer);
+
+ setAnswer(strAnswer);
+}
diff --git a/remote-processor/AnswerMessage.h b/remote-processor/AnswerMessage.h
new file mode 100644
index 0000000..16259a6
--- /dev/null
+++ b/remote-processor/AnswerMessage.h
@@ -0,0 +1,59 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Message.h"
+
+class CAnswerMessage : public CMessage
+{
+public:
+ CAnswerMessage(const string& strAnswer, bool bSuccess);
+ CAnswerMessage();
+
+ // Answer
+ const string& getAnswer() const;
+
+ // Status
+ bool success() const;
+private:
+ // Fill data to send
+ virtual void fillDataToSend();
+ // Collect received data
+ virtual void collectReceivedData();
+ // Size
+ virtual uint32_t getDataSize() const;
+ // Answer
+ void setAnswer(const string& strAnswer);
+
+ // Answer
+ string _strAnswer;
+};
+
diff --git a/remote-processor/ConnectionSocket.cpp b/remote-processor/ConnectionSocket.cpp
new file mode 100644
index 0000000..4a0357e
--- /dev/null
+++ b/remote-processor/ConnectionSocket.cpp
@@ -0,0 +1,73 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ConnectionSocket.h"
+#include <unistd.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <errno.h>
+
+#define base CSocket
+
+CConnectionSocket::CConnectionSocket()
+{
+}
+
+// Connection
+bool CConnectionSocket::connect(const string& strRemote, uint16_t uiPort, string& strError)
+{
+ struct sockaddr_in server_addr;
+
+ // Host entry
+ struct hostent* host = gethostbyname(strRemote.c_str());
+
+ // Check host
+ if (!host) {
+
+ strError = "Target not found :-(";
+
+ return false;
+ }
+
+ // Fill server address
+ initSockAddrIn(&server_addr, *((uint32_t*)host->h_addr), uiPort);
+
+ // Connect
+ if (::connect(getFd(), (struct sockaddr *)&server_addr, sizeof(struct sockaddr))) {
+
+ perror("CConnectionSocket::connect::connect");
+
+ strError = "Unable to connnect to target :-(";
+
+ return false;
+ }
+ return true;
+}
diff --git a/remote-processor/ConnectionSocket.h b/remote-processor/ConnectionSocket.h
new file mode 100644
index 0000000..e0d6064
--- /dev/null
+++ b/remote-processor/ConnectionSocket.h
@@ -0,0 +1,47 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Socket.h"
+
+#include <string>
+
+using namespace std;
+
+class CConnectionSocket : public CSocket
+{
+public:
+ CConnectionSocket();
+
+ // Connection
+ bool connect(const string& strRemote, uint16_t uiPort, string& strError);
+};
+
diff --git a/remote-processor/ListeningSocket.cpp b/remote-processor/ListeningSocket.cpp
new file mode 100644
index 0000000..df5d369
--- /dev/null
+++ b/remote-processor/ListeningSocket.cpp
@@ -0,0 +1,92 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "ListeningSocket.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <assert.h>
+#include <netdb.h>
+#include <strings.h>
+
+#include <stdio.h>
+#include <errno.h>
+
+#define base CSocket
+
+CListeningSocket::CListeningSocket()
+{
+ int iOption = true;
+ // Reuse option
+ setsockopt(getFd(), SOL_SOCKET, SO_REUSEADDR, &iOption, sizeof(iOption));
+}
+
+// Listen
+bool CListeningSocket::listen(uint16_t uiPort)
+{
+ struct sockaddr_in server_addr;
+
+ // Fill server address
+ initSockAddrIn(&server_addr, INADDR_ANY, uiPort);
+
+ // Bind
+ if (bind(getFd(), (struct sockaddr*)&server_addr, sizeof(struct sockaddr)) == -1) {
+
+ perror("CListeningSocket::listen::bind");
+
+ return false;
+ }
+
+ if (::listen(getFd(), 5) == -1) {
+
+ perror("CListeningSocket::listen::bind");
+
+ return false;
+ }
+ return true;
+}
+
+// Accept
+CSocket* CListeningSocket::accept()
+{
+ struct sockaddr_in client_addr;
+ socklen_t ulClientAddrLen = sizeof(client_addr);
+
+ int iSockId = ::accept(getFd(), (struct sockaddr*)&client_addr, &ulClientAddrLen);
+
+ if (iSockId == -1) {
+
+ perror("CListeningSocket::accept::accept");
+
+ return NULL;
+ }
+ return new CSocket(iSockId);
+}
diff --git a/remote-processor/ListeningSocket.h b/remote-processor/ListeningSocket.h
new file mode 100644
index 0000000..a242a73
--- /dev/null
+++ b/remote-processor/ListeningSocket.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Socket.h"
+
+class CListeningSocket : public CSocket
+{
+public:
+ CListeningSocket();
+
+ // Listen
+ bool listen(uint16_t uiPort);
+
+ // Accept
+ CSocket* accept();
+};
+
diff --git a/remote-processor/Message.cpp b/remote-processor/Message.cpp
new file mode 100644
index 0000000..5679501
--- /dev/null
+++ b/remote-processor/Message.cpp
@@ -0,0 +1,267 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Message.h"
+#include <assert.h>
+#include "Socket.h"
+#include "RemoteProcessorProtocol.h"
+#include <string.h>
+#include <assert.h>
+
+CMessage::CMessage(uint8_t ucMsgId) : _ucMsgId(ucMsgId), _pucData(NULL), _uiDataSize(0), _uiIndex(0)
+{
+}
+
+CMessage::CMessage() : _ucMsgId(-1), _pucData(NULL), _uiDataSize(0), _uiIndex(0)
+{
+}
+
+CMessage::~CMessage()
+{
+ delete [] _pucData;
+}
+
+// Msg Id
+uint8_t CMessage::getMsgId() const
+{
+ return _ucMsgId;
+}
+
+// Data
+void CMessage::writeData(const void* pvData, uint32_t uiSize)
+{
+ assert(_uiIndex + uiSize <= _uiDataSize);
+
+ // Copy
+ memcpy(&_pucData[_uiIndex], pvData, uiSize);
+
+ // Index
+ _uiIndex += uiSize;
+}
+
+void CMessage::readData(void* pvData, uint32_t uiSize)
+{
+ assert(_uiIndex + uiSize <= _uiDataSize);
+
+ // Copy
+ memcpy(pvData, &_pucData[_uiIndex], uiSize);
+
+ // Index
+ _uiIndex += uiSize;
+}
+
+void CMessage::writeString(const string& strData)
+{
+ // Size
+ uint32_t uiSize = strData.length();
+
+ writeData(&uiSize, sizeof(uiSize));
+
+ // Content
+ writeData(strData.c_str(), uiSize);
+}
+
+void CMessage::readString(string& strData)
+{
+ // Size
+ uint32_t uiSize;
+
+ readData(&uiSize, sizeof(uiSize));
+
+ // Data
+ char* pcData = new char[uiSize + 1];
+
+ // Content
+ readData(pcData, uiSize);
+
+ // NULL-terminate string
+ pcData[uiSize] = '\0';
+
+ // Output
+ strData = pcData;
+
+ // Delete
+ delete [] pcData;
+}
+
+uint32_t CMessage::getStringSize(const string& strData) const
+{
+ // Return string length plus room to store its length
+ return strData.length() + sizeof(uint32_t);
+}
+
+// Remaining data size
+uint32_t CMessage::getRemainingDataSize() const
+{
+ return _uiDataSize - _uiIndex;
+}
+
+// Send/Receive
+bool CMessage::serialize(CSocket* pSocket, bool bOut)
+{
+ if (bOut) {
+
+ // Make room for data to send
+ allocateData(getDataSize());
+
+ // Get data from derived
+ fillDataToSend();
+
+ // Finished providing data?
+ assert(_uiIndex == _uiDataSize);
+
+ // First send sync word
+ uint16_t uiSyncWord = SYNC_WORD;
+
+ if (!pSocket->write(&uiSyncWord, sizeof(uiSyncWord))) {
+
+ return false;
+ }
+
+ // Size
+ uint32_t uiSize = sizeof(_ucMsgId) + _uiDataSize;
+
+ if (!pSocket->write(&uiSize, sizeof(uiSize))) {
+
+ return false;
+ }
+
+ // Msg Id
+ if (!pSocket->write(&_ucMsgId, sizeof(_ucMsgId))) {
+
+ return false;
+ }
+
+ // Data
+ if (!pSocket->write(_pucData, _uiDataSize)) {
+
+ return false;
+ }
+
+ // Checksum
+ uint8_t ucChecksum = computeChecksum();
+
+ if (!pSocket->write(&ucChecksum, sizeof(ucChecksum))) {
+
+ return false;
+ }
+
+ } else {
+ // First read sync word
+ uint16_t uiSyncWord;
+
+ if (!pSocket->read(&uiSyncWord, sizeof(uiSyncWord))) {
+
+ return false;
+ }
+
+ // Check Sync word
+ if (uiSyncWord != SYNC_WORD) {
+
+ return false;
+ }
+
+ // Size
+ uint32_t uiSize;
+
+ if (!pSocket->read(&uiSize, sizeof(uiSize))) {
+
+ return false;
+ }
+
+ // Msg Id
+ if (!pSocket->read(&_ucMsgId, sizeof(_ucMsgId))) {
+
+ return false;
+ }
+
+ // Data
+
+ // Allocate
+ allocateData(uiSize - sizeof(_ucMsgId));
+
+ // Data receive
+ if (!pSocket->read(_pucData, _uiDataSize)) {
+
+ return false;
+ }
+
+ // Checksum
+ uint8_t ucChecksum;
+
+ if (!pSocket->read(&ucChecksum, sizeof(ucChecksum))) {
+
+ return false;
+ }
+ // Compare
+ if (ucChecksum != computeChecksum()) {
+
+ return false;
+ }
+
+ // Collect data in derived
+ collectReceivedData();
+ }
+
+ return true;
+}
+
+// Checksum
+uint8_t CMessage::computeChecksum() const
+{
+ uint8_t uiChecksum = (_ucMsgId & 0xFF) + (_ucMsgId >> 8);
+
+ uint32_t uiIndex;
+
+ for (uiIndex = 0; uiIndex < _uiDataSize; uiIndex++) {
+
+ uiChecksum += _pucData[uiIndex];
+ }
+
+ return uiChecksum;
+}
+
+// Data allocation
+void CMessage::allocateData(uint32_t uiSize)
+{
+ // Remove previous one
+ if (_pucData) {
+
+ delete [] _pucData;
+ }
+ // Do allocate
+ _pucData = new uint8_t[uiSize];
+
+ // Record size
+ _uiDataSize = uiSize;
+
+ // Reset Index
+ _uiIndex = 0;
+}
diff --git a/remote-processor/Message.h b/remote-processor/Message.h
new file mode 100644
index 0000000..4ab6a2b
--- /dev/null
+++ b/remote-processor/Message.h
@@ -0,0 +1,81 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <string>
+
+using namespace std;
+
+class CSocket;
+
+class CMessage
+{
+public:
+ CMessage(uint8_t ucMsgId);
+ CMessage();
+ virtual ~CMessage();
+
+ // Send/Receive
+ bool serialize(CSocket* pSocket, bool bOut);
+
+protected:
+ // Msg Id
+ uint8_t getMsgId() const;
+ // Data
+ void writeData(const void* pvData, uint32_t uiSize);
+ void readData(void* pvData, uint32_t uiSize);
+ void writeString(const string& strData);
+ void readString(string& strData);
+ uint32_t getStringSize(const string& strData) const;
+ // Remaining data size
+ uint32_t getRemainingDataSize() const;
+private:
+ // Data allocation
+ void allocateData(uint32_t uiDataSize);
+ // Fill data to send
+ virtual void fillDataToSend() = 0;
+ // Collect received data
+ virtual void collectReceivedData() = 0;
+ // Size
+ virtual uint32_t getDataSize() const = 0;
+ // Checksum
+ uint8_t computeChecksum() const;
+
+ // MsgId
+ uint8_t _ucMsgId;
+ // Data
+ uint8_t* _pucData;
+ // Data size
+ uint32_t _uiDataSize;
+ // Read/Write Index
+ uint32_t _uiIndex;
+};
diff --git a/remote-processor/RemoteCommand.h b/remote-processor/RemoteCommand.h
new file mode 100644
index 0000000..8409468
--- /dev/null
+++ b/remote-processor/RemoteCommand.h
@@ -0,0 +1,46 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <string>
+
+class IRemoteCommand
+{
+public:
+ // Command Name
+ virtual const std::string& getCommand() const = 0;
+
+ // Arguments
+ virtual void addArgument(const std::string& strArgument) = 0;
+ virtual uint32_t getArgumentCount() const = 0;
+ virtual const std::string& getArgument(uint32_t uiArgument) const = 0;
+};
diff --git a/remote-processor/RemoteCommandHandler.h b/remote-processor/RemoteCommandHandler.h
new file mode 100644
index 0000000..4f1ab3d
--- /dev/null
+++ b/remote-processor/RemoteCommandHandler.h
@@ -0,0 +1,41 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "RemoteCommand.h"
+#include <string>
+
+class IRemoteCommandHandler
+{
+public:
+ // Return true on success, fill result in any cases
+ virtual bool remoteCommandProcess(const IRemoteCommand& remoteCommand, std::string& strResult) = 0;
+};
diff --git a/remote-processor/RemoteProcessorProtocol.h b/remote-processor/RemoteProcessorProtocol.h
new file mode 100644
index 0000000..28f9bfb
--- /dev/null
+++ b/remote-processor/RemoteProcessorProtocol.h
@@ -0,0 +1,40 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#define SYNC_WORD 0xBABE
+
+enum RemoteProtocolMsgType
+{
+ ECommandRequest,
+ ESuccessAnswer,
+ EFailureAnswer
+};
diff --git a/remote-processor/RemoteProcessorServer.cpp b/remote-processor/RemoteProcessorServer.cpp
new file mode 100644
index 0000000..efe4342
--- /dev/null
+++ b/remote-processor/RemoteProcessorServer.cpp
@@ -0,0 +1,203 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "RemoteProcessorServer.h"
+#include "ListeningSocket.h"
+#include <assert.h>
+#include <poll.h>
+#include <unistd.h>
+#include <strings.h>
+#include "RequestMessage.h"
+#include "AnswerMessage.h"
+#include "RemoteCommandHandler.h"
+
+CRemoteProcessorServer::CRemoteProcessorServer(uint16_t uiPort, IRemoteCommandHandler* pCommandHandler) :
+ _uiPort(uiPort), _pCommandHandler(pCommandHandler), _bIsStarted(false), _pListeningSocket(NULL), _ulThreadId(0)
+{
+ // Create inband pipe
+ pipe(_aiInbandPipe);
+}
+
+CRemoteProcessorServer::~CRemoteProcessorServer()
+{
+ stop();
+}
+
+// State
+bool CRemoteProcessorServer::start()
+{
+ assert(!_bIsStarted);
+
+ // Create server socket
+ _pListeningSocket = new CListeningSocket;
+
+ if (!_pListeningSocket->listen(_uiPort)) {
+
+ // Remove listening socket
+ delete _pListeningSocket;
+ _pListeningSocket = NULL;
+
+ return false;
+ }
+
+ // Create thread
+ pthread_create(&_ulThreadId, NULL, thread_func, this);
+
+ // State
+ _bIsStarted = true;
+
+ return true;
+}
+
+void CRemoteProcessorServer::stop()
+{
+ // Check state
+ if (!_bIsStarted) {
+
+ return;
+ }
+
+ // Cause exiting of the thread
+ uint8_t ucData = 0;
+ write(_aiInbandPipe[1], &ucData, sizeof(ucData));
+
+ // Join thread
+ pthread_join(_ulThreadId, NULL);
+
+ _bIsStarted = false;
+
+ // Remove listening socket
+ delete _pListeningSocket;
+ _pListeningSocket = NULL;
+}
+
+bool CRemoteProcessorServer::isStarted() const
+{
+ return _bIsStarted;
+}
+
+// Thread
+void* CRemoteProcessorServer::thread_func(void* pData)
+{
+ reinterpret_cast<CRemoteProcessorServer*>(pData)->run();
+
+ return NULL;
+}
+
+void CRemoteProcessorServer::run()
+{
+ struct pollfd _aPollFds[2];
+
+ bzero(_aPollFds, sizeof(_aPollFds));
+
+ // Build poll elements
+ _aPollFds[0].fd = _pListeningSocket->getFd();
+ _aPollFds[1].fd = _aiInbandPipe[0];
+ _aPollFds[0].events = POLLIN;
+ _aPollFds[1].events = POLLIN;
+
+ while (true) {
+
+ poll(_aPollFds, 2, -1);
+
+ if (_aPollFds[0].revents & POLLIN) {
+
+ // New incoming connection
+ handleNewConnection();
+ }
+ if (_aPollFds[1].revents & POLLIN) {
+
+ // Consume exit request
+ uint8_t ucData;
+ read(_aiInbandPipe[0], &ucData, sizeof(ucData));
+
+ // Exit
+ return;
+ }
+ }
+}
+
+// New connection
+void CRemoteProcessorServer::handleNewConnection()
+{
+ CSocket* pClientSocket = _pListeningSocket->accept();
+
+ if (!pClientSocket) {
+
+ return;
+ }
+
+ // Set timeout
+ pClientSocket->setTimeout(5000);
+
+ // Process all incoming requests from the client
+ while (true) {
+
+ // Process requests
+ // Create command message
+ CRequestMessage requestMessage;
+
+ ///// Receive command
+ if (!requestMessage.serialize(pClientSocket, false)) {
+
+ // Bail out
+ break;
+ }
+
+ // Actually process the request
+ bool bSuccess;
+
+ string strResult;
+
+ if (_pCommandHandler) {
+
+ bSuccess = _pCommandHandler->remoteCommandProcess(requestMessage, strResult);
+
+ } else {
+
+ strResult = "No handler!";
+
+ bSuccess = false;
+ }
+
+ // Send back answer
+ // Create answer message
+ CAnswerMessage answerMessage(strResult, bSuccess);
+
+ ///// Send answer
+ if (!answerMessage.serialize(pClientSocket, true)) {
+
+ // Bail out
+ break;
+ }
+ }
+ // Remove client socket
+ delete pClientSocket;
+}
diff --git a/remote-processor/RemoteProcessorServer.h b/remote-processor/RemoteProcessorServer.h
new file mode 100644
index 0000000..0abb5c8
--- /dev/null
+++ b/remote-processor/RemoteProcessorServer.h
@@ -0,0 +1,72 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <pthread.h>
+#include "RemoteProcessorServerInterface.h"
+
+class CListeningSocket;
+class IRemoteCommandHandler;
+
+class CRemoteProcessorServer : public IRemoteProcessorServerInterface
+{
+public:
+ CRemoteProcessorServer(uint16_t uiPort, IRemoteCommandHandler* pCommandHandler);
+ virtual ~CRemoteProcessorServer();
+
+ // State
+ virtual bool start();
+ virtual void stop();
+ virtual bool isStarted() const;
+
+private:
+ // Thread
+ static void* thread_func(void* pData);
+ void run();
+
+ // New connection
+ void handleNewConnection();
+
+ // Port number
+ uint16_t _uiPort;
+ // Command handler
+ IRemoteCommandHandler* _pCommandHandler;
+ // State
+ bool _bIsStarted;
+ // Listening socket
+ CListeningSocket* _pListeningSocket;
+ // Inband pipe
+ int _aiInbandPipe[2];
+ // Thread
+ pthread_t _ulThreadId;
+};
+
diff --git a/remote-processor/RemoteProcessorServerBuilder.cpp b/remote-processor/RemoteProcessorServerBuilder.cpp
new file mode 100644
index 0000000..ed6b2c2
--- /dev/null
+++ b/remote-processor/RemoteProcessorServerBuilder.cpp
@@ -0,0 +1,41 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "RemoteProcessorServer.h"
+
+
+extern "C"
+{
+IRemoteProcessorServerInterface* createRemoteProcessorServer(uint16_t uiPort, IRemoteCommandHandler* pCommandHandler)
+{
+ return new CRemoteProcessorServer(uiPort, pCommandHandler);
+}
+}
+
diff --git a/remote-processor/RemoteProcessorServerInterface.h b/remote-processor/RemoteProcessorServerInterface.h
new file mode 100644
index 0000000..991d3db
--- /dev/null
+++ b/remote-processor/RemoteProcessorServerInterface.h
@@ -0,0 +1,43 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "RequestMessage.h"
+
+using namespace std;
+
+class IRemoteProcessorServerInterface
+{
+public:
+ virtual bool start() = 0;
+ virtual void stop() = 0;
+ virtual bool isStarted() const = 0;
+};
diff --git a/remote-processor/RequestMessage.cpp b/remote-processor/RequestMessage.cpp
new file mode 100644
index 0000000..6f71b8a
--- /dev/null
+++ b/remote-processor/RequestMessage.cpp
@@ -0,0 +1,137 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "RequestMessage.h"
+#include "RemoteProcessorProtocol.h"
+#include <assert.h>
+#include <algorithm>
+#include <ctype.h>
+
+#define base CMessage
+
+CRequestMessage::CRequestMessage(const string& strCommand) : base(ECommandRequest), _strCommand(strCommand)
+{
+}
+
+CRequestMessage::CRequestMessage()
+{
+}
+
+// Command Name
+void CRequestMessage::setCommand(const string& strCommand)
+{
+ _strCommand = trim(strCommand);
+}
+
+const string& CRequestMessage::getCommand() const
+{
+ return _strCommand;
+}
+
+// Arguments
+void CRequestMessage::addArgument(const string& strArgument)
+{
+ _argumentVector.push_back(trim(strArgument));
+}
+
+uint32_t CRequestMessage::getArgumentCount() const
+{
+ return _argumentVector.size();
+}
+
+const string& CRequestMessage::getArgument(uint32_t uiArgument) const
+{
+ assert(uiArgument < _argumentVector.size());
+
+ return _argumentVector[uiArgument];
+}
+
+// Fill data to send
+void CRequestMessage::fillDataToSend()
+{
+ // Send command
+ writeString(getCommand());
+
+ // Arguments
+ uint32_t uiArgument;
+
+ for (uiArgument = 0; uiArgument < getArgumentCount(); uiArgument++) {
+
+ writeString(getArgument(uiArgument));
+ }
+}
+
+// Collect received data
+void CRequestMessage::collectReceivedData()
+{
+ // Receive command
+ string strCommand;
+
+ readString(strCommand);
+
+ setCommand(strCommand);
+
+ // Arguments
+ while (getRemainingDataSize()) {
+
+ string strArgument;
+
+ readString(strArgument);
+
+ addArgument(strArgument);
+ }
+}
+
+// Size
+uint32_t CRequestMessage::getDataSize() const
+{
+ // Command
+ uint32_t uiSize = getStringSize(getCommand());
+
+ // Arguments
+ uint32_t uiArgument;
+
+ for (uiArgument = 0; uiArgument < getArgumentCount(); uiArgument++) {
+
+ uiSize += getStringSize(getArgument(uiArgument));
+ }
+ return uiSize;
+}
+
+// Trim input string
+string CRequestMessage::trim(const string& strToTrim)
+{
+ // Trim string
+ string strTrimmed = strToTrim;
+
+ strTrimmed.erase(remove_if(strTrimmed.begin(), strTrimmed.end(), ::isspace), strTrimmed.end());
+
+ return strTrimmed;
+}
diff --git a/remote-processor/RequestMessage.h b/remote-processor/RequestMessage.h
new file mode 100644
index 0000000..c0b2183
--- /dev/null
+++ b/remote-processor/RequestMessage.h
@@ -0,0 +1,68 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "Message.h"
+#include "RemoteCommand.h"
+#include <vector>
+
+class CRequestMessage : public CMessage, public IRemoteCommand
+{
+public:
+ CRequestMessage(const string& strCommand);
+ CRequestMessage();
+
+ // Command Name
+ virtual const string& getCommand() const;
+
+ // Arguments
+ virtual void addArgument(const string& strArgument);
+ virtual uint32_t getArgumentCount() const;
+ virtual const string& getArgument(uint32_t uiArgument) const;
+
+private:
+ // Fill data to send
+ virtual void fillDataToSend();
+ // Collect received data
+ virtual void collectReceivedData();
+ // Size
+ virtual uint32_t getDataSize() const;
+ // Command
+ void setCommand(const string& strCommand);
+ // Trim input string
+ static string trim(const string& strToTrim);
+
+ // Command
+ string _strCommand;
+ // Arguments
+ vector<string> _argumentVector;
+};
+
diff --git a/remote-processor/Socket.cpp b/remote-processor/Socket.cpp
new file mode 100644
index 0000000..f77cd45
--- /dev/null
+++ b/remote-processor/Socket.cpp
@@ -0,0 +1,139 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "Socket.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <unistd.h>
+#include <assert.h>
+#include <netdb.h>
+#include <strings.h>
+#include <fcntl.h>
+#include <netinet/in.h>
+#include <sys/time.h>
+
+CSocket::CSocket() : _iSockFd(socket(AF_INET, SOCK_STREAM, 0))
+{
+ assert(_iSockFd != -1);
+}
+
+CSocket::CSocket(int iSockId) : _iSockFd(iSockId)
+{
+ assert(_iSockFd != -1);
+}
+
+CSocket::~CSocket()
+{
+ close(_iSockFd);
+}
+
+// Socket address init
+void CSocket::initSockAddrIn(struct sockaddr_in* pSockAddrIn, uint32_t uiInAddr, uint16_t uiPort) const
+{
+ // Fill server address
+ pSockAddrIn->sin_family = AF_INET;
+ pSockAddrIn->sin_port = htons(uiPort);
+ pSockAddrIn->sin_addr.s_addr = uiInAddr;
+ bzero(&pSockAddrIn->sin_zero, sizeof(pSockAddrIn->sin_zero));
+}
+
+// Non blocking state
+void CSocket::setNonBlocking(bool bNonBlocking)
+{
+ int iFlags = fcntl(_iSockFd, F_GETFL, 0);
+
+ assert(iFlags != -1);
+
+ if (bNonBlocking) {
+
+ iFlags |= O_NONBLOCK;
+ } else {
+
+ iFlags &= ~O_NONBLOCK;
+ }
+ fcntl(_iSockFd, F_SETFL, iFlags);
+}
+
+// Communication timeout
+void CSocket::setTimeout(uint32_t uiMilliseconds)
+{
+ struct timeval tv;
+ tv.tv_sec = uiMilliseconds / 1000;
+ tv.tv_usec = (uiMilliseconds % 1000) * 1000;
+
+ setsockopt(_iSockFd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
+ setsockopt(_iSockFd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+}
+
+// Read
+bool CSocket::read(void* pvData, uint32_t uiSize)
+{
+ uint32_t uiOffset = 0;
+ uint8_t* pucData = (uint8_t*)pvData;
+
+ while (uiSize) {
+
+ int32_t iAccessedSize = ::recv(_iSockFd, &pucData[uiOffset], uiSize, MSG_NOSIGNAL);
+
+ if (!iAccessedSize || iAccessedSize == -1) {
+
+ return false;
+ }
+ uiSize -= iAccessedSize;
+ uiOffset += iAccessedSize;
+ }
+ return true;
+}
+
+// Write
+bool CSocket::write(const void* pvData, uint32_t uiSize)
+{
+ uint32_t uiOffset = 0;
+ const uint8_t* pucData = (const uint8_t*)pvData;
+
+ while (uiSize) {
+
+ int32_t iAccessedSize = ::send(_iSockFd, &pucData[uiOffset], uiSize, MSG_NOSIGNAL);
+
+ if (!iAccessedSize || iAccessedSize == -1) {
+
+ return false;
+ }
+ uiSize -= iAccessedSize;
+ uiOffset += iAccessedSize;
+ }
+ return true;
+}
+
+// Fd
+int CSocket::getFd() const
+{
+ return _iSockFd;
+}
diff --git a/remote-processor/Socket.h b/remote-processor/Socket.h
new file mode 100644
index 0000000..4552dc5
--- /dev/null
+++ b/remote-processor/Socket.h
@@ -0,0 +1,66 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+#include <stdint.h>
+
+using namespace std;
+
+struct sockaddr_in;
+struct in_addr;
+
+class CSocket
+{
+public:
+ CSocket();
+ CSocket(int iSockId);
+ virtual ~CSocket();
+
+ // Non blocking state
+ void setNonBlocking(bool bNonBlocking);
+
+ // Communication timeout
+ void setTimeout(uint32_t uiMilliseconds);
+
+ // Read
+ bool read(void* pvData, uint32_t uiSize);
+ // Write
+ bool write(const void* pvData, uint32_t uiSize);
+
+ // Fd
+ int getFd() const;
+protected:
+ // Socket address init
+ void initSockAddrIn(struct sockaddr_in* pSockAddrIn, uint32_t uiInAddr, uint16_t uiPort) const;
+private:
+ int _iSockFd;
+};
diff --git a/utility/Android.mk b/utility/Android.mk
new file mode 100644
index 0000000..f6af488
--- /dev/null
+++ b/utility/Android.mk
@@ -0,0 +1,29 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+
+LOCAL_SRC_FILES:= Tokenizer.cpp
+
+LOCAL_MODULE:= libutility
+
+LOCAL_MODULE_TAGS :=
+
+
+LOCAL_C_INCLUDES +=
+
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_SHARED_LIBRARIES :=
+
+LOCAL_LDLIBS +=
+
+
+include $(BUILD_STATIC_LIBRARY)
+
diff --git a/utility/Tokenizer.cpp b/utility/Tokenizer.cpp
new file mode 100644
index 0000000..9ea4ea4
--- /dev/null
+++ b/utility/Tokenizer.cpp
@@ -0,0 +1,125 @@
+///////////////////////////////////////////////////////////////////////////////
+// Tokenizer.cpp
+// =============
+// General purpose string tokenizer (C++ string version)
+//
+// The default delimiters are space(" "), tab(\t, \v), newline(\n),
+// carriage return(\r), and form feed(\f).
+// If you want to use different delimiters, then use setDelimiter() to override
+// the delimiters. Note that the delimiter string can hold multiple characters.
+//
+// AUTHOR: Song Ho Ahn (song.ahn@gmail.com)
+// CREATED: 2005-05-25
+// UPDATED: 2011-03-08
+///////////////////////////////////////////////////////////////////////////////
+
+#include "Tokenizer.h"
+
+
+///////////////////////////////////////////////////////////////////////////////
+// constructor
+///////////////////////////////////////////////////////////////////////////////
+Tokenizer::Tokenizer() : buffer(""), token(""), delimiter(DEFAULT_DELIMITER)
+{
+ currPos = buffer.begin();
+}
+
+Tokenizer::Tokenizer(const std::string& str, const std::string& delimiter) : buffer(str), token(""), delimiter(delimiter)
+{
+ currPos = buffer.begin();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// destructor
+///////////////////////////////////////////////////////////////////////////////
+Tokenizer::~Tokenizer()
+{
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// reset string buffer, delimiter and the currsor position
+///////////////////////////////////////////////////////////////////////////////
+void Tokenizer::set(const std::string& str, const std::string& delimiter)
+{
+ this->buffer = str;
+ this->delimiter = delimiter;
+ this->currPos = buffer.begin();
+}
+
+void Tokenizer::setString(const std::string& str)
+{
+ this->buffer = str;
+ this->currPos = buffer.begin();
+}
+
+void Tokenizer::setDelimiter(const std::string& delimiter)
+{
+ this->delimiter = delimiter;
+ this->currPos = buffer.begin();
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// return the next token
+// If cannot find a token anymore, return "".
+///////////////////////////////////////////////////////////////////////////////
+std::string Tokenizer::next()
+{
+ if(buffer.size() <= 0) return ""; // skip if buffer is empty
+
+ token.clear(); // reset token string
+
+ this->skipDelimiter(); // skip leading delimiters
+
+ // append each char to token string until it meets delimiter
+ while(currPos != buffer.end() && !isDelimiter(*currPos))
+ {
+ token += *currPos;
+ ++currPos;
+ }
+ return token;
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// skip ang leading delimiters
+///////////////////////////////////////////////////////////////////////////////
+void Tokenizer::skipDelimiter()
+{
+ while(currPos != buffer.end() && isDelimiter(*currPos))
+ ++currPos;
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// return true if the current character is delimiter
+///////////////////////////////////////////////////////////////////////////////
+bool Tokenizer::isDelimiter(char c)
+{
+ return (delimiter.find(c) != std::string::npos);
+}
+
+
+
+///////////////////////////////////////////////////////////////////////////////
+// split the input string into multiple tokens
+// This function scans tokens from the current cursor position.
+///////////////////////////////////////////////////////////////////////////////
+std::vector<std::string> Tokenizer::split()
+{
+ std::vector<std::string> tokens;
+ std::string token;
+ while((token = this->next()) != "")
+ {
+ tokens.push_back(token);
+ }
+
+ return tokens;
+}
diff --git a/utility/Tokenizer.h b/utility/Tokenizer.h
new file mode 100644
index 0000000..de3f86c
--- /dev/null
+++ b/utility/Tokenizer.h
@@ -0,0 +1,56 @@
+///////////////////////////////////////////////////////////////////////////////
+// Tokenizer.h
+// ===========
+// General purpose string tokenizer (C++ string version)
+//
+// The default delimiters are space(" "), tab(\t, \v), newline(\n),
+// carriage return(\r), and form feed(\f).
+// If you want to use different delimiters, then use setDelimiter() to override
+// the delimiters. Note that the delimiter string can hold multiple characters.
+//
+// AUTHOR: Song Ho Ahn (song.ahn@gmail.com)
+// CREATED: 2005-05-25
+// UPDATED: 2011-03-08
+///////////////////////////////////////////////////////////////////////////////
+
+#ifndef TOKENIZER_H
+#define TOKENIZER_H
+
+#include <string>
+#include <vector>
+
+// default delimiter string (space, tab, newline, carriage return, form feed)
+const std::string DEFAULT_DELIMITER = " \t\v\n\r\f";
+
+class Tokenizer
+{
+public:
+ // ctor/dtor
+ Tokenizer();
+ Tokenizer(const std::string& str, const std::string& delimiter=DEFAULT_DELIMITER);
+ ~Tokenizer();
+
+ // set string and delimiter
+ void set(const std::string& str, const std::string& delimiter=DEFAULT_DELIMITER);
+ void setString(const std::string& str); // set source string only
+ void setDelimiter(const std::string& delimiter); // set delimiter string only
+
+ std::string next(); // return the next token, return "" if it ends
+
+ std::vector<std::string> split(); // return array of tokens from current cursor
+
+protected:
+
+
+private:
+ void skipDelimiter(); // ignore leading delimiters
+ bool isDelimiter(char c); // check if the current char is delimiter
+
+ std::string buffer; // input string
+ std::string token; // output string
+ std::string delimiter; // delimiter string
+ std::string::const_iterator currPos; // string iterator pointing the current position
+
+};
+
+#endif // TOKENIZER_H
diff --git a/xmlparser-test/Android.mk b/xmlparser-test/Android.mk
new file mode 100644
index 0000000..ea1172d
--- /dev/null
+++ b/xmlparser-test/Android.mk
@@ -0,0 +1,33 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH :=
+
+
+LOCAL_SRC_FILES:= \
+ main.cpp
+
+
+LOCAL_MODULE:= xmlparser-test
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ external/libxml2/include/ \
+ external/webkit/WebCore/icu/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc
+LOCAL_STATIC_LIBRARIES := libxml2
+
+LOCAL_LDLIBS +=
+
+include $(BUILD_EXECUTABLE)
+
diff --git a/xmlparser-test/main.cpp b/xmlparser-test/main.cpp
new file mode 100644
index 0000000..a399b9c
--- /dev/null
+++ b/xmlparser-test/main.cpp
@@ -0,0 +1,210 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+/**
+ * section: Tree
+ * synopsis: Navigates a tree to print element names
+ * purpose: Parse a file to a tree, use xmlDocGetRootElement() to
+ * get the root element, then walk the document and print
+ * all the element name in document order.
+ * usage: tree1 filename_or_URL
+ * test: tree1 test2.xml > tree1.tmp ; diff tree1.tmp tree1.res ; rm tree1.tmp
+ * author: Dodji Seketeli
+ * copy: see Copyright for the status of this software.
+ */
+#include <stdio.h>
+#include <stdarg.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlschemas.h>
+
+/*
+ *To compile this file using gcc you can type
+ *gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c
+ */
+static void schemaValidityErrorFunc(void *ctx, const char *msg, ...)
+{
+ char acBuffer[256];
+ va_list listPointer;
+
+ (void)ctx;
+
+ va_start( listPointer, msg );
+ //vprintf(msg, listPointer);
+
+ vsnprintf(acBuffer, sizeof(acBuffer), msg, listPointer);
+
+ va_end( listPointer );
+
+ puts(acBuffer);
+}
+
+static void schemaValidityWarningFunc(void *ctx, const char *msg, ...)
+{
+ char acBuffer[256];
+ va_list listPointer;
+
+ (void)ctx;
+
+ va_start( listPointer, msg );
+
+ vsnprintf(acBuffer, sizeof(acBuffer), msg, listPointer);
+
+ va_end( listPointer );
+
+ puts(acBuffer);
+}
+
+static int is_valid(const xmlDocPtr doc, const char *schema_filename)
+{
+#ifdef LIBXML_SCHEMAS_ENABLED
+ xmlDocPtr schema_doc = xmlReadFile(schema_filename, NULL, XML_PARSE_NONET);
+ if (schema_doc == NULL) {
+ /* the schema cannot be loaded or is not well-formed */
+ return -1;
+ }
+ xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc);
+ if (parser_ctxt == NULL) {
+ /* unable to create a parser context for the schema */
+ xmlFreeDoc(schema_doc);
+ return -2;
+ }
+
+ xmlSchemaPtr schema = xmlSchemaParse(parser_ctxt);
+ if (schema == NULL) {
+ /* the schema itself is not valid */
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+ xmlFreeDoc(schema_doc);
+ return -3;
+ }
+ xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
+ if (valid_ctxt == NULL) {
+ /* unable to create a validation context for the schema */
+ xmlSchemaFree(schema);
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+ xmlFreeDoc(schema_doc);
+ return -4;
+ }
+ xmlSchemaSetValidErrors(valid_ctxt, schemaValidityErrorFunc, schemaValidityWarningFunc, NULL);
+
+ int is_valid = (xmlSchemaValidateDoc(valid_ctxt, doc) == 0);
+ xmlSchemaFreeValidCtxt(valid_ctxt);
+ xmlSchemaFree(schema);
+ xmlSchemaFreeParserCtxt(parser_ctxt);
+ xmlFreeDoc(schema_doc);
+
+ /* force the return value to be non-negative on success */
+ return is_valid ? 1 : 0;
+#else
+ return 1;
+#endif
+}
+
+/**
+ * print_element_names:
+ * @a_node: the initial xml node to consider.
+ *
+ * Prints the names of the all the xml elements
+ * that are siblings or children of a given xml node.
+ */
+static void
+print_element_names(xmlNode * a_node, int iLevel = 0)
+{
+ xmlNode *cur_node = NULL;
+
+ for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
+
+ int iIndent = iLevel;
+
+ while (iIndent--) {
+ printf(" ");
+ }
+
+ if (cur_node->type == XML_ELEMENT_NODE) {
+
+ printf("node type: Element, name: %s\n", cur_node->name);
+ }
+ print_element_names(cur_node->children, iLevel + 1);
+ }
+}
+
+
+/**
+ * Simple example to parse a file called "file.xml",
+ * walk down the DOM, and print the name of the
+ * xml elements nodes.
+ */
+int
+main(int argc, char **argv)
+{
+ xmlDoc *doc = NULL;
+ xmlNode *root_element = NULL;
+
+ if (argc != 3)
+ return(1);
+
+ /*
+ * this initialize the library and check potential ABI mismatches
+ * between the version it was compiled for and the actual shared
+ * library used.
+ */
+ LIBXML_TEST_VERSION
+
+ /*parse the file and get the DOM */
+ doc = xmlReadFile(argv[1], NULL, 0);
+
+ if (doc == NULL) {
+ printf("error: could not parse file %s\n", argv[1]);
+ }
+ // Validate
+ if (!is_valid(doc, argv[2])) {
+ printf("error: doc is not valid\n");
+
+ return -1;
+ }
+
+
+ /*Get the root element node */
+ root_element = xmlDocGetRootElement(doc);
+
+
+ print_element_names(root_element);
+
+ /*free the document */
+ xmlFreeDoc(doc);
+
+ /*
+ *Free the global variables that may
+ *have been allocated by the parser.
+ */
+ xmlCleanupParser();
+
+ return 0;
+}
diff --git a/xmlserializer/Android.mk b/xmlserializer/Android.mk
new file mode 100644
index 0000000..6d68dad
--- /dev/null
+++ b/xmlserializer/Android.mk
@@ -0,0 +1,38 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
+
+LOCAL_SRC_FILES:= \
+ XmlParser.cpp \
+ XmlElement.cpp \
+ XmlComposer.cpp \
+ XmlSerializingContext.cpp \
+ XmlSerializer.cpp
+
+LOCAL_MODULE:= libxmlserializer
+
+LOCAL_MODULE_TAGS := optional
+
+TARGET_ERROR_FLAGS += -Wno-non-virtual-dtor
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_C_INCLUDES += \
+ external/stlport/stlport/ \
+ external/libxml2/include/ \
+ external/webkit/WebCore/icu/ \
+ bionic/libstdc++ \
+ bionic/
+
+LOCAL_C_INCLUDES +=
+
+LOCAL_SHARED_LIBRARIES := libstlport libicuuc
+LOCAL_STATIC_LIBRARIES := libxml2
+
+LOCAL_LDLIBS += -Lexternal/libxml2/lib
+
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/xmlserializer/XML b/xmlserializer/XML
new file mode 120000
index 0000000..7f870ca
--- /dev/null
+++ b/xmlserializer/XML
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/XML \ No newline at end of file
diff --git a/xmlserializer/XmlComposer.cpp b/xmlserializer/XmlComposer.cpp
new file mode 100644
index 0000000..2cdd5dc
--- /dev/null
+++ b/xmlserializer/XmlComposer.cpp
@@ -0,0 +1,111 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlComposer.h"
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <time.h>
+
+#define base CXmlSerializer
+
+#ifndef LIBXML_TREE_ENABLED
+#warning "LIBXML_TREE_ENABLED undefined. XML file exporting feature won't be supported!"
+#endif
+
+CXmlComposer::CXmlComposer(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext) :
+ base(strXmlInstanceFile, strXmlSchemaFile, strRootElementType, serializingContext)
+{
+}
+
+CXmlComposer::~CXmlComposer()
+{
+}
+
+// open / close
+bool CXmlComposer::open()
+{
+#ifdef LIBXML_TREE_ENABLED
+ // Create document from scratch
+ _pDoc = xmlNewDoc(BAD_CAST "1.0");
+
+ // Create root node
+ _pRootNode = xmlNewNode(NULL, BAD_CAST _strRootElementType.c_str());
+
+ // Assign it to document
+ xmlDocSetRootElement(_pDoc, _pRootNode);
+#else
+ _serializingContext.setError("XML file exporting feature unsupported on this image. This easiest way to activate it is to do a global recompilation with LIBXML_TREE_ENABLED compiler switch set");
+#endif
+ return base::open();
+}
+
+bool CXmlComposer::close()
+{
+ // Write file (formatted)
+ if (xmlSaveFormatFileEnc(_strXmlInstanceFile.c_str(), _pDoc, "UTF-8", 1) == -1) {
+
+ _serializingContext.setError("Could not write file " + _strXmlInstanceFile);
+
+ return false;
+ }
+
+ return base::close();
+}
+
+// Composing contents
+void CXmlComposer::compose(const IXmlSource* pXmlSource)
+{
+ // Compose document
+ CXmlElement docElement(_pRootNode);
+
+ // Schema namespace
+ docElement.setAttributeString("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
+
+ // Schema location
+ docElement.setAttributeString("xsi:noNamespaceSchemaLocation", _strXmlSchemaFile);
+
+ // Comment for date/time
+ docElement.setComment(string(" Exported on ") + getTimeAsString() + " from parameter-framework ");
+
+ pXmlSource->toXml(docElement, _serializingContext);
+}
+
+string CXmlComposer::getTimeAsString()
+{
+ char acBuf[200];
+ time_t t;
+ struct tm *tmp;
+ t = time(NULL);
+ tmp = localtime(&t);
+
+ strftime(acBuf, sizeof(acBuf), "%F, %T", tmp);
+
+ return acBuf;
+}
diff --git a/xmlserializer/XmlComposer.h b/xmlserializer/XmlComposer.h
new file mode 100644
index 0000000..2f5090f
--- /dev/null
+++ b/xmlserializer/XmlComposer.h
@@ -0,0 +1,55 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlSerializer.h"
+#include "XmlSource.h"
+
+struct _xmlDoc;
+struct _xmlNode;
+
+class CXmlComposer : public CXmlSerializer
+{
+public:
+ CXmlComposer(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext);
+ virtual ~CXmlComposer();
+
+ // open / close
+ virtual bool open();
+ virtual bool close();
+
+ // Composing contents
+ void compose(const IXmlSource* pXmlSource);
+
+private:
+ static string getTimeAsString();
+};
+
diff --git a/xmlserializer/XmlElement.cpp b/xmlserializer/XmlElement.cpp
new file mode 100644
index 0000000..cea7a1d
--- /dev/null
+++ b/xmlserializer/XmlElement.cpp
@@ -0,0 +1,235 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlElement.h"
+#include <libxml/tree.h>
+#include <stdlib.h>
+
+CXmlElement::CXmlElement(_xmlNode* pXmlElement) : _pXmlElement(pXmlElement)
+{
+}
+
+CXmlElement::CXmlElement() : _pXmlElement(NULL)
+{
+}
+
+void CXmlElement::setXmlElement(_xmlNode* pXmlElement)
+{
+ _pXmlElement = pXmlElement;
+}
+
+string CXmlElement::getType() const
+{
+ return (const char*)_pXmlElement->name;
+}
+
+string CXmlElement::getPath() const
+{
+ string strPathElement = "/" + getType();
+
+ if (hasAttribute("Name")) {
+
+ strPathElement += "[@Name=" + getNameAttribute() + "]";
+ }
+
+ CXmlElement parentElement;
+
+ if (getParentElement(parentElement)) {
+
+ // Done
+ return parentElement.getPath() + strPathElement;
+ }
+ return strPathElement;
+}
+
+string CXmlElement::getNameAttribute() const
+{
+ return getAttributeString("Name");
+}
+
+bool CXmlElement::hasAttribute(const string& strAttributeName) const
+{
+ return xmlHasProp(_pXmlElement, (const xmlChar*)strAttributeName.c_str()) != NULL;
+}
+
+string CXmlElement::getAttributeString(const string &strAttributeName) const
+{
+ if (!hasAttribute(strAttributeName)) {
+
+ return "";
+ }
+ xmlChar* pucXmlValue = xmlGetProp((xmlNode*)_pXmlElement, (const xmlChar*)strAttributeName.c_str());
+
+ string strValue((const char*)pucXmlValue);
+
+ xmlFree(pucXmlValue);
+
+ return strValue;
+}
+
+bool CXmlElement::getAttributeBoolean(const string& strAttributeName, const string& strTrueValue) const
+{
+ return getAttributeString(strAttributeName) == strTrueValue;
+}
+
+bool CXmlElement::getAttributeBoolean(const string& strAttributeName) const
+{
+ string strAttributeValue(getAttributeString(strAttributeName));
+
+ return strAttributeValue == "true" || strAttributeValue == "1";
+}
+
+uint32_t CXmlElement::getAttributeInteger(const string &strAttributeName) const
+{
+ string strAttributeValue(getAttributeString(strAttributeName));
+
+ return strtoul(strAttributeValue.c_str(), NULL, 0);
+}
+
+int32_t CXmlElement::getAttributeSignedInteger(const string &strAttributeName) const
+{
+ string strAttributeValue(getAttributeString(strAttributeName));
+
+ return strtol(strAttributeValue.c_str(), NULL, 0);
+}
+
+double CXmlElement::getAttributeDouble(const string &strAttributeName) const
+{
+ string strAttributeValue(getAttributeString(strAttributeName));
+
+ return strtod(strAttributeValue.c_str(), NULL);
+}
+
+string CXmlElement::getTextContent() const
+{
+ xmlChar* pucXmlContent = xmlNodeGetContent(_pXmlElement);
+
+ string strContent((const char*)pucXmlContent);
+
+ xmlFree(pucXmlContent);
+
+ return strContent;
+}
+
+bool CXmlElement::getChildElement(const string& strType, CXmlElement& childElement) const
+{
+ CChildIterator childIterator(*this);
+
+ while (childIterator.next(childElement)) {
+
+ if (childElement.getType() == strType) {
+
+ return true;
+ }
+ }
+ return false;
+}
+
+bool CXmlElement::getChildElement(const string& strType, const string& strNameAttribute, CXmlElement& childElement) const
+{
+ CChildIterator childIterator(*this);
+
+ while (childIterator.next(childElement)) {
+
+ if ((childElement.getType() == strType) && (childElement.getNameAttribute() == strNameAttribute)) {
+
+ return true;
+ }
+ }
+ return false;
+}
+
+bool CXmlElement::getParentElement(CXmlElement& parentElement) const
+{
+ _xmlNode* pXmlNode = _pXmlElement->parent;
+
+ if (pXmlNode->type == XML_ELEMENT_NODE) {
+
+ parentElement.setXmlElement(pXmlNode);
+
+ return true;
+ }
+ return false;
+}
+
+// Setters
+void CXmlElement::setAttributeString(const string& strAttributeName, const string& strValue)
+{
+ xmlNewProp(_pXmlElement, BAD_CAST strAttributeName.c_str(), BAD_CAST strValue.c_str());
+}
+
+void CXmlElement::setNameAttribute(const string& strValue)
+{
+ setAttributeString("Name", strValue);
+}
+
+void CXmlElement::setTextContent(const string& strContent)
+{
+ xmlAddChild(_pXmlElement, xmlNewText(BAD_CAST strContent.c_str()));
+}
+
+void CXmlElement::setComment(const string& strComment)
+{
+ xmlAddChild(_pXmlElement, xmlNewComment(BAD_CAST strComment.c_str()));
+}
+
+// Child creation
+void CXmlElement::createChild(CXmlElement& childElement, const string& strType)
+{
+#ifdef LIBXML_TREE_ENABLED
+ xmlNodePtr pChildNode = xmlNewChild(_pXmlElement, NULL, BAD_CAST strType.c_str(), NULL);
+
+ childElement.setXmlElement(pChildNode);
+#endif
+}
+
+// Child iteration
+CXmlElement::CChildIterator::CChildIterator(const CXmlElement& xmlElement) : _pCurNode(xmlElement._pXmlElement->children)
+{
+}
+
+bool CXmlElement::CChildIterator::next(CXmlElement& xmlChildElement)
+{
+ while (_pCurNode) {
+
+ if (_pCurNode->type == XML_ELEMENT_NODE) {
+
+ xmlChildElement.setXmlElement(_pCurNode);
+
+ _pCurNode = _pCurNode->next;
+
+ return true;
+ }
+ _pCurNode = _pCurNode->next;
+ }
+
+ return false;
+}
+
diff --git a/xmlserializer/XmlElement.h b/xmlserializer/XmlElement.h
new file mode 100644
index 0000000..797179f
--- /dev/null
+++ b/xmlserializer/XmlElement.h
@@ -0,0 +1,93 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <stdint.h>
+#include <string>
+
+using namespace std;
+
+struct _xmlNode;
+struct _xmlDoc;
+
+class CXmlElement
+{
+ friend class CChildIterator;
+public:
+ CXmlElement(_xmlNode* pXmlElement);
+ CXmlElement();
+
+ // Xml element
+ void setXmlElement(_xmlNode* pXmlElement);
+
+ // Getters
+ string getType() const;
+ string getPath() const;
+ string getNameAttribute() const;
+ bool hasAttribute(const string& strAttributeName) const;
+ bool getAttributeBoolean(const string& strAttributeName, const string& strTrueValue) const;
+ bool getAttributeBoolean(const string& strAttributeName) const;
+ string getAttributeString(const string& strAttributeName) const;
+ uint32_t getAttributeInteger(const string& strAttributeName) const;
+ int32_t getAttributeSignedInteger(const string& strAttributeName) const;
+ double getAttributeDouble(const string& strAttributeName) const;
+ string getTextContent() const;
+
+ // Navigation
+ bool getChildElement(const string& strType, CXmlElement& childElement) const;
+ bool getChildElement(const string& strType, const string& strNameAttribute, CXmlElement& childElement) const;
+ bool getParentElement(CXmlElement& parentElement) const;
+
+ // Setters
+ void setAttributeString(const string& strAttributeName, const string& strValue);
+ void setNameAttribute(const string& strValue);
+ void setTextContent(const string& strContent);
+ void setComment(const string& strComment);
+
+ // Child creation
+ void createChild(CXmlElement& childElement, const string& strType);
+
+public:
+ // Child iteration
+ class CChildIterator
+ {
+ public:
+ CChildIterator(const CXmlElement& xmlElement);
+
+ bool next(CXmlElement& xmlChildElement);
+ private:
+ _xmlNode* _pCurNode;
+ };
+
+private:
+ _xmlNode* _pXmlElement;
+};
+
diff --git a/xmlserializer/XmlParser.cpp b/xmlserializer/XmlParser.cpp
new file mode 100644
index 0000000..9477c0f
--- /dev/null
+++ b/xmlserializer/XmlParser.cpp
@@ -0,0 +1,162 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlParser.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlschemas.h>
+
+#define base CXmlSerializer
+
+
+CXmlParser::CXmlParser(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext) :
+ base(strXmlInstanceFile, strXmlSchemaFile, strRootElementType, serializingContext)
+{
+}
+
+CXmlParser::~CXmlParser()
+{
+}
+
+void CXmlParser::schemaValidityStructuredErrorFunc(void* pUserData, _xmlError* pError)
+{
+ (void)pUserData;
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+ // Display message
+ puts(pError->message);
+#endif
+}
+
+bool CXmlParser::isInstanceDocumentValid()
+{
+#ifdef LIBXML_SCHEMAS_ENABLED
+ xmlDocPtr pSchemaDoc = xmlReadFile(_strXmlSchemaFile.c_str(), NULL, XML_PARSE_NONET);
+
+ if (!pSchemaDoc) {
+ // Unable to load Schema
+ return false;
+ }
+
+ xmlSchemaParserCtxtPtr pParserCtxt = xmlSchemaNewDocParserCtxt(pSchemaDoc);
+
+ if (!pParserCtxt) {
+
+ // Unable to create schema context
+ xmlFreeDoc(pSchemaDoc);
+ return false;
+ }
+
+ // Get Schema
+ xmlSchemaPtr pSchema = xmlSchemaParse(pParserCtxt);
+
+ if (!pSchema) {
+
+ // Invalid Schema
+ xmlSchemaFreeParserCtxt(pParserCtxt);
+ xmlFreeDoc(pSchemaDoc);
+ return false;
+ }
+ xmlSchemaValidCtxtPtr pValidationCtxt = xmlSchemaNewValidCtxt(pSchema);
+
+ if (!pValidationCtxt) {
+
+ // Unable to create validation context
+ xmlSchemaFree(pSchema);
+ xmlSchemaFreeParserCtxt(pParserCtxt);
+ xmlFreeDoc(pSchemaDoc);
+ return false;
+ }
+
+ xmlSetStructuredErrorFunc(this, schemaValidityStructuredErrorFunc);
+ //xmlSchemaSetValidErrors(pValidationCtxt, schemaValidityErrorFunc, schemaValidityWarningFunc, NULL);
+
+ bool isDocValid = xmlSchemaValidateDoc(pValidationCtxt, _pDoc) == 0;
+
+ xmlSchemaFreeValidCtxt(pValidationCtxt);
+ xmlSchemaFree(pSchema);
+ xmlSchemaFreeParserCtxt(pParserCtxt);
+ xmlFreeDoc(pSchemaDoc);
+
+ return isDocValid;
+#else
+ return true;
+#endif
+}
+
+bool CXmlParser::open()
+{
+ // Parse the file and get the DOM
+ _pDoc = xmlReadFile(_strXmlInstanceFile.c_str(), NULL, 0);
+
+ if (!_pDoc) {
+
+ _serializingContext.setError("Could not parse file " + _strXmlInstanceFile);
+
+ return false;
+ }
+ // Validate
+ if (!isInstanceDocumentValid()) {
+
+ _serializingContext.setError("Document " + _strXmlInstanceFile + " is not valid");
+
+ // Free XML doc
+ xmlFreeDoc(_pDoc);
+
+ _pDoc = NULL;
+
+ return false;
+ }
+
+ // Get the root element node
+ _pRootNode = xmlDocGetRootElement(_pDoc);
+
+ // Check Root element type
+ if (getRootElementName() != _strRootElementType) {
+
+ _serializingContext.setError("Error: Wrong XML structure file " + _strXmlInstanceFile);
+ _serializingContext.appendLineToError("Root Element " + getRootElementName() + " mismatches expected type " + _strRootElementType);
+
+ return false;
+ }
+
+ return base::open();
+}
+
+bool CXmlParser::parse(IXmlSink* pXmlSink)
+{
+ // Parse document
+ CXmlElement topMostElement(_pRootNode);
+
+ return pXmlSink->fromXml(topMostElement, _serializingContext);
+}
+
diff --git a/xmlserializer/XmlParser.h b/xmlserializer/XmlParser.h
new file mode 100644
index 0000000..4e38f56
--- /dev/null
+++ b/xmlserializer/XmlParser.h
@@ -0,0 +1,54 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlSerializer.h"
+#include "XmlSink.h"
+
+struct _xmlError;
+
+class CXmlParser : public CXmlSerializer
+{
+public:
+ CXmlParser(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext);
+ virtual ~CXmlParser();
+
+ // Parsing file
+ virtual bool open();
+
+ // Parsing contents
+ bool parse(IXmlSink* pXmlSink);
+
+private:
+ // Validity checks
+ bool isInstanceDocumentValid();
+ static void schemaValidityStructuredErrorFunc(void* pUserData, _xmlError* pError);
+};
diff --git a/xmlserializer/XmlSerializer.cpp b/xmlserializer/XmlSerializer.cpp
new file mode 100644
index 0000000..73ae90c
--- /dev/null
+++ b/xmlserializer/XmlSerializer.cpp
@@ -0,0 +1,89 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlSerializer.h"
+#include <libxml/tree.h>
+#include <stdlib.h>
+
+// Schedule for libxml2 library
+bool CXmlSerializer::_bLibXml2CleanupScheduled;
+
+CXmlSerializer::CXmlSerializer(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext) :
+ _strXmlInstanceFile(strXmlInstanceFile), _strXmlSchemaFile(strXmlSchemaFile), _strRootElementType(strRootElementType), _serializingContext(serializingContext), _pDoc(NULL), _pRootNode(NULL)
+{
+ if (_bLibXml2CleanupScheduled) {
+
+ // Schedule cleanup
+ atexit(xmlCleanupParser);
+
+ _bLibXml2CleanupScheduled = true;
+ }
+}
+
+CXmlSerializer::~CXmlSerializer()
+{
+ // Free XML doc
+ xmlFreeDoc(_pDoc);
+}
+
+bool CXmlSerializer::close()
+{
+ // Free XML doc
+ xmlFreeDoc(_pDoc);
+
+ _pDoc = NULL;
+
+ return true;
+}
+
+bool CXmlSerializer::open()
+{
+ return _pDoc != NULL;
+}
+
+// Root element
+void CXmlSerializer::getRootElement(CXmlElement& xmlRootElement) const
+{
+ xmlRootElement.setXmlElement(_pRootNode);
+}
+
+string CXmlSerializer::getRootElementName() const
+{
+ return (const char*)_pRootNode->name;
+}
+
+string CXmlSerializer::getRootElementAttributeString(const string& strAttributeName) const
+{
+ CXmlElement topMostElement(_pRootNode);
+
+ return topMostElement.getAttributeString(strAttributeName);
+}
+
+
diff --git a/xmlserializer/XmlSerializer.h b/xmlserializer/XmlSerializer.h
new file mode 100644
index 0000000..9490bdf
--- /dev/null
+++ b/xmlserializer/XmlSerializer.h
@@ -0,0 +1,74 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElement.h"
+#include "XmlSerializingContext.h"
+
+struct _xmlDoc;
+struct _xmlNode;
+
+class CXmlSerializer
+{
+public:
+ CXmlSerializer(const string& strXmlInstanceFile, const string& strXmlSchemaFile, const string& strRootElementType, CXmlSerializingContext& serializingContext);
+ virtual ~CXmlSerializer();
+
+ // Open/Close
+ virtual bool open();
+ virtual bool close();
+
+ // Root element
+ void getRootElement(CXmlElement& xmlRootElement) const;
+ string getRootElementName() const;
+ string getRootElementAttributeString(const string& strAttributeName) const;
+protected:
+ // Instance file
+ string _strXmlInstanceFile;
+
+ // Schema file
+ string _strXmlSchemaFile;
+
+ // Root element type
+ string _strRootElementType;
+
+ // Serializing context
+ CXmlSerializingContext& _serializingContext;
+
+ // XML document
+ _xmlDoc* _pDoc;
+
+ // Root node
+ _xmlNode* _pRootNode;
+
+ // libxml2 library cleanup
+ static bool _bLibXml2CleanupScheduled;
+};
diff --git a/xmlserializer/XmlSerializingContext.cpp b/xmlserializer/XmlSerializingContext.cpp
new file mode 100644
index 0000000..9ad71d8
--- /dev/null
+++ b/xmlserializer/XmlSerializingContext.cpp
@@ -0,0 +1,51 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#include "XmlSerializingContext.h"
+
+CXmlSerializingContext::CXmlSerializingContext(string& strError) : _strError(strError)
+{
+}
+
+// Error
+void CXmlSerializingContext::setError(const string& strError)
+{
+ _strError = strError;
+}
+
+void CXmlSerializingContext::appendLineToError(const string& strAppend)
+{
+ _strError += "\n" + strAppend;
+}
+
+const string& CXmlSerializingContext::getError() const
+{
+ return _strError;
+}
diff --git a/xmlserializer/XmlSerializingContext.h b/xmlserializer/XmlSerializingContext.h
new file mode 100644
index 0000000..c287d55
--- /dev/null
+++ b/xmlserializer/XmlSerializingContext.h
@@ -0,0 +1,49 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include <string>
+
+using namespace std;
+
+class CXmlSerializingContext
+{
+public:
+ CXmlSerializingContext(string& strError);
+
+ // Error
+ void setError(const string& strError);
+ void appendLineToError(const string& strAppend);
+ const string& getError() const;
+
+private:
+ string& _strError;
+};
diff --git a/xmlserializer/XmlSink.h b/xmlserializer/XmlSink.h
new file mode 100644
index 0000000..104dd5b
--- /dev/null
+++ b/xmlserializer/XmlSink.h
@@ -0,0 +1,40 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElement.h"
+#include "XmlSerializingContext.h"
+
+class IXmlSink
+{
+public:
+ virtual bool fromXml(const CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) = 0;
+};
diff --git a/xmlserializer/XmlSource.h b/xmlserializer/XmlSource.h
new file mode 100644
index 0000000..b73322e
--- /dev/null
+++ b/xmlserializer/XmlSource.h
@@ -0,0 +1,40 @@
+/* <auto_header>
+ * <FILENAME>
+ *
+ * INTEL CONFIDENTIAL
+ * Copyright © 2011 Intel
+ * Corporation All Rights Reserved.
+ *
+ * The source code contained or described herein and all documents related to
+ * the source code ("Material") are owned by Intel Corporation or its suppliers
+ * or licensors. Title to the Material remains with Intel Corporation or its
+ * suppliers and licensors. The Material contains trade secrets and proprietary
+ * and confidential information of Intel or its suppliers and licensors. The
+ * Material is protected by worldwide copyright and trade secret laws and
+ * treaty provisions. No part of the Material may be used, copied, reproduced,
+ * modified, published, uploaded, posted, transmitted, distributed, or
+ * disclosed in any way without Intel’s prior express written permission.
+ *
+ * No license under any patent, copyright, trade secret or other intellectual
+ * property right is granted to or conferred upon you by disclosure or delivery
+ * of the Materials, either expressly, by implication, inducement, estoppel or
+ * otherwise. Any license under such intellectual property rights must be
+ * express and approved by Intel in writing.
+ *
+ * AUTHOR: Patrick Benavoli (patrickx.benavoli@intel.com)
+ * CREATED: 2011-06-01
+ * UPDATED: 2011-07-27
+ *
+ *
+ * </auto_header>
+ */
+#pragma once
+
+#include "XmlElement.h"
+#include "XmlSerializingContext.h"
+
+class IXmlSource
+{
+public:
+ virtual void toXml(CXmlElement& xmlElement, CXmlSerializingContext& serializingContext) const = 0;
+};
diff --git a/xmlserializer/parameter b/xmlserializer/parameter
new file mode 120000
index 0000000..ad0e2c4
--- /dev/null
+++ b/xmlserializer/parameter
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/parameter \ No newline at end of file
diff --git a/xmlserializer/parameter-connector-test b/xmlserializer/parameter-connector-test
new file mode 120000
index 0000000..423f3bd
--- /dev/null
+++ b/xmlserializer/parameter-connector-test
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/parameter-connector-test \ No newline at end of file
diff --git a/xmlserializer/parameter-test b/xmlserializer/parameter-test
new file mode 120000
index 0000000..ce9f218
--- /dev/null
+++ b/xmlserializer/parameter-test
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/parameter-test \ No newline at end of file
diff --git a/xmlserializer/remote-process b/xmlserializer/remote-process
new file mode 120000
index 0000000..dc88707
--- /dev/null
+++ b/xmlserializer/remote-process
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/remote-process \ No newline at end of file
diff --git a/xmlserializer/remote-processor b/xmlserializer/remote-processor
new file mode 120000
index 0000000..d66076c
--- /dev/null
+++ b/xmlserializer/remote-processor
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/remote-processor \ No newline at end of file
diff --git a/xmlserializer/remote-processor-test b/xmlserializer/remote-processor-test
new file mode 120000
index 0000000..76384be
--- /dev/null
+++ b/xmlserializer/remote-processor-test
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/remote-processor-test \ No newline at end of file
diff --git a/xmlserializer/utility b/xmlserializer/utility
new file mode 120000
index 0000000..e87d41a
--- /dev/null
+++ b/xmlserializer/utility
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/utility \ No newline at end of file
diff --git a/xmlserializer/xmlparser-test b/xmlserializer/xmlparser-test
new file mode 120000
index 0000000..e084673
--- /dev/null
+++ b/xmlserializer/xmlparser-test
@@ -0,0 +1 @@
+/home/lab/projects/qt/parameter-framework/xmlparser-test \ No newline at end of file