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 "Element.h"
33#include "Results.h"
34#include <set>
35#include <string>
36
37class CParameterBlackboard;
38class CConfigurableElement;
39class CSyncerSet;
40class CConfigurableDomain;
41class CSelectionCriteriaDefinition;
42
43class CConfigurableDomains : public CElement
44{
45public:
46    // Configuration/Domains handling
47    /// Domains
48    bool createDomain(const std::string &strName, std::string &strError);
49
50    /*
51     * Adds a domain object to configurable domains. The ConfigurableDomains
52     * object takes ownership of the ConfigurableDomain object.
53     *
54     * @param[in] pDomain the domain object.
55     * @param[in] bOverwrite if false, will refuse to overwrite an existing
56     * domain, otherwise, an existing domain with the same name will first be
57     * removed.
58     * @param[in,out] strError error message
59     *
60     * @returns true if the domain was successfully added
61     */
62    bool addDomain(CConfigurableDomain &domain, bool bOverwrite, std::string &strError);
63
64    /**
65     * Delete a domain by name
66     *
67     * @param[in] strName name of the domain to be deleted
68     * @param[in,out] strError error message
69     *
70     * @returns true of the domain was sucessfully deleted, false otherwise (i.e.
71     * the domain didn't exist).
72     */
73    bool deleteDomain(const std::string &strName, std::string &strError);
74    void deleteAllDomains();
75    bool renameDomain(const std::string &strName, const std::string &strNewName,
76                      std::string &strError);
77    bool setSequenceAwareness(const std::string &strDomain, bool bSequenceAware,
78                              std::string &strError);
79    bool getSequenceAwareness(const std::string &strDomain, bool &bSequenceAware,
80                              std::string &strError) const;
81    bool listDomainElements(const std::string &strDomain, std::string &strResult) const;
82
83    /** Split a domain in two.
84     * Remove an element of a domain and create a new domain which owns the element.
85     *
86     * @param[in] domainName the domain name
87     * @param[in] element pointer to the element to remove
88     * @param[out] infos useful information we can provide to client
89     * @return true if succeed false otherwise
90     */
91    bool split(const std::string &domainName, CConfigurableElement *element, core::Results &infos);
92
93    void listAssociatedElements(std::string &strResult) const;
94    void listConflictingElements(std::string &strResult) const;
95    void listDomains(std::string &strResult) const;
96    /// Configurations
97    bool listConfigurations(const std::string &strDomain, std::string &strResult) const;
98    bool createConfiguration(const std::string &strDomain, const std::string &strConfiguration,
99                             const CParameterBlackboard *pMainBlackboard, std::string &strError);
100    bool deleteConfiguration(const std::string &strDomain, const std::string &strConfiguration,
101                             std::string &strError);
102    bool renameConfiguration(const std::string &strDomain, const std::string &strConfigurationName,
103                             const std::string &strNewConfigurationName, std::string &strError);
104
105    /** Restore a configuration
106     *
107     * @param[in] strDomain the domain name
108     * @param[in] strConfiguration the configuration name
109     * @param[in] pMainBlackboard the application main blackboard
110     * @param[in] bAutoSync boolean which indicates if auto sync mechanism is on
111     * @param[out] errors, errors encountered during restoration
112     * @return true if success false otherwise
113     */
114    bool restoreConfiguration(const std::string &strDomain, const std::string &strConfiguration,
115                              CParameterBlackboard *pMainBlackboard, bool bAutoSync,
116                              core::Results &errors) const;
117
118    bool saveConfiguration(const std::string &strDomain, const std::string &strConfiguration,
119                           const CParameterBlackboard *pMainBlackboard, std::string &strError);
120    bool setElementSequence(const std::string &strDomain, const std::string &strConfiguration,
121                            const std::vector<std::string> &astrNewElementSequence,
122                            std::string &strError);
123    bool getElementSequence(const std::string &strDomain, const std::string &strConfiguration,
124                            std::string &strResult) const;
125    bool setApplicationRule(const std::string &strDomain, const std::string &strConfiguration,
126                            const std::string &strApplicationRule,
127                            const CSelectionCriteriaDefinition *pSelectionCriteriaDefinition,
128                            std::string &strError);
129    bool clearApplicationRule(const std::string &strDomain, const std::string &strConfiguration,
130                              std::string &strError);
131    bool getApplicationRule(const std::string &strDomain, const std::string &strConfiguration,
132                            std::string &strResult) const;
133
134    // Last applied configurations
135    void listLastAppliedConfigurations(std::string &strResult) const;
136
137    /** Associate a configurable element to a domain
138     *
139     * @param[in] domainName the domain name
140     * @param[in] element pointer to the element to add
141     * @param[in] mainBlackboard pointer to the application main blackboard
142     * @param[out] infos useful information we can provide to client
143     * @return true if succeed false otherwise
144     */
145    bool addConfigurableElementToDomain(const std::string &domainName,
146                                        CConfigurableElement *element,
147                                        const CParameterBlackboard *mainBlackboard,
148                                        core::Results &infos);
149
150    bool removeConfigurableElementFromDomain(const std::string &strDomain,
151                                             CConfigurableElement *pConfigurableElement,
152                                             std::string &strError);
153
154    // Configuration Blackboard for element
155    CParameterBlackboard *findConfigurationBlackboard(
156        const std::string &strDomain, const std::string &strConfiguration,
157        const CConfigurableElement *pConfigurableElement, size_t &baseOffset, bool &bIsLastApplied,
158        std::string &strError) const;
159
160    const CConfigurableDomain *findConfigurableDomain(const std::string &strDomain,
161                                                      std::string &strError) const;
162
163    // From IXmlSource
164    virtual void toXml(CXmlElement &xmlElement, CXmlSerializingContext &serializingContext) const;
165
166    // Ensure validity on whole domains from main blackboard
167    void validate(const CParameterBlackboard *pMainBlackboard);
168
169    /** Apply the configuration if required
170     *
171     * @param[in] pParameterBlackboard the blackboard to synchronize
172     * @param[in] syncerSet the set containing application syncers
173     * @param[in] bForce boolean used to force configuration application
174     * @param[out] infos useful information we can provide to client
175     */
176    void apply(CParameterBlackboard *pParameterBlackboard, CSyncerSet &syncerSet, bool bForce,
177               core::Results &infos) const;
178
179    // Class kind
180    virtual std::string getKind() const;
181
182private:
183    /** Delete a domain
184     *
185     * @param(in] configurableDomain domain to be deleted
186     * @param[in,out] strError error message
187     * @returns true of the domain was sucessfully deleted, false otherwise (i.e.
188     * the domain didn't exist).
189     */
190    void deleteDomain(CConfigurableDomain &configurableDomain);
191    // Returns true if children dynamic creation is to be dealt with
192    virtual bool childrenAreDynamic() const;
193    // Gather owned configurable elements owned by any domain
194    void gatherAllOwnedConfigurableElements(
195        std::set<const CConfigurableElement *> &configurableElementSet) const;
196    // Domain retrieval
197    CConfigurableDomain *findConfigurableDomain(const std::string &strDomain,
198                                                std::string &strError);
199};
200