1/*
2 * Copyright (c) 2011-2015, Intel Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation and/or
13 * other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors
16 * may be used to endorse or promote products derived from this software without
17 * specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30#pragma once
31
32#include "ParameterBlackboard.h"
33#include "SyncerSet.h"
34#include "Results.h"
35
36class CConfigurableElement;
37class CXmlElement;
38class CConfigurationAccessContext;
39
40class CAreaConfiguration
41{
42public:
43    CAreaConfiguration(const CConfigurableElement *pConfigurableElement,
44                       const CSyncerSet *pSyncerSet);
45
46    virtual ~CAreaConfiguration() = default;
47
48    // Save data from current
49    void save(const CParameterBlackboard *pMainBlackboard);
50
51    /** Restore the configuration area
52     *
53     * @param[in] pMainBlackboard the application main blackboard
54     * @param[in] bSync indicates if a synchronisation has to be done
55     * @param[out] errors, errors encountered during restoration
56     * @return true if success false otherwise
57     */
58    bool restore(CParameterBlackboard *pMainBlackboard, bool bSync, core::Results *errors) const;
59
60    // Ensure validity
61    void validate(const CParameterBlackboard *pMainBlackboard);
62
63    // Return validity
64    bool isValid() const;
65
66    // Ensure validity against given valid area configuration
67    void validateAgainst(const CAreaConfiguration *pValidAreaConfiguration);
68
69    // Compound handling
70    const CConfigurableElement *getConfigurableElement() const;
71
72    // Configuration merging
73    virtual void copyToOuter(CAreaConfiguration *pToAreaConfiguration) const;
74
75    // Configuration splitting
76    virtual void copyFromOuter(const CAreaConfiguration *pFromAreaConfiguration);
77
78    // XML configuration settings parsing/composing
79    bool serializeXmlSettings(CXmlElement &xmlConfigurableElementSettingsElementContent,
80                              CConfigurationAccessContext &configurationAccessContext);
81
82    // Fetch the Configuration Blackboard
83    CParameterBlackboard &getBlackboard();
84    const CParameterBlackboard &getBlackboard() const;
85
86protected:
87    CAreaConfiguration(const CConfigurableElement *pConfigurableElement,
88                       const CSyncerSet *pSyncerSet, size_t size);
89
90private:
91    // Blackboard copies
92    virtual void copyTo(CParameterBlackboard *pToBlackboard, size_t offset) const;
93    virtual void copyFrom(const CParameterBlackboard *pFromBlackboard, size_t offset);
94
95    // Store validity
96    void setValid(bool bValid);
97
98protected:
99    // Associated configurable element
100    const CConfigurableElement *_pConfigurableElement;
101
102    // Configurable element settings
103    CParameterBlackboard _blackboard;
104
105private:
106    // Syncer set (required for immediate synchronization)
107    const CSyncerSet *_pSyncerSet;
108
109    // Area configuration validity (invalid area configurations can't be restored)
110    bool _bValid{false};
111};
112