Usage
Retrieving current configuration
#include <kaa/common/types/ICommonRecord.hpp>
using namespace kaa;
... 
ICommonRecord & rootConfiguration = Kaa::getKaaClient().getConfigurationManager().getConfiguration();
...
  
Subscribing for configuration updates
using namespace kaa;
public:
    void onConfigurationUpdated(const ICommonRecord &configuration) {
        std::cout << "Configuration updated!" << std::endl;
    }
    
};
...
IConfigurationReceiver * configurationReceiver = new ConfigurationReceiver();
Kaa::getKaaClient().getConfigurationManager().subscribeForConfigurationChanges(configurationReceiver);
 
Working with configuration objects
Configuration in C++ sdk is represented as tree of kaa::ICommonValue objects.
 Use kaa::CommonValueTools helper class to extract values from ICommonValue object.
 
 Extracting primitive from ICommonValue:
using namespace kaa;
ICommonRecord & configuration = Kaa::getKaaClient().getConfigurationManager().getConfiguration();
std::string fieldName = "foo";
if (configuration.hasField(fieldName)) {
    std::shared_ptr<ICommonValue> fooField = configuration.getField(fieldName);
    
    if (CommonValueTools::isBoolean(fooField)) {
        bool fooValue = boost::any_cast<bool>(fooField->getValue());
    }
}
try {
    bool fooValue = boost::any_cast<bool>(configuration.getField(fieldName)->getValue());
    std::cerr << 
"'foo' field is not present in record. "<< e.
what() << std::endl;
} catch (const boost::bad_cast &e) {
    std::cerr << "'foo' field is not of boolean type. " << e.what() << std::endl;
}
 
 Extracting data from ICommonRecord:
using namespace kaa;
ICommonRecord & configuration = Kaa::getKaaClient().getConfigurationManager().getConfiguration();
std::string fieldName = "foo";
if (configuration.hasField(fieldName)) {
    
    std::shared_ptr<ICommonValue> fooField = configuration.getField(fieldName);
    
    if (CommonValueTools::isRecord(fooField)) {
        const ICommonRecord & fooRecord = CommonValueTools::getRecord(fooField);
        
    }
}
try {
    const ICommonRecord & fooRecord = CommonValueTools::getRecord(configuration.getField(fieldName))
    std::cerr << 
"Failed to get record 'foo': "<< e.
what() << std::endl;
}
 
 Extracting array from ICommonValue:
using namespace kaa;
ICommonRecord & configuration = Kaa::getKaaClient().getConfigurationManager().getConfiguration();
std::string fieldName = "fooArray";
if (configuration.hasField(fieldName)) {
    std::shared_ptr<ICommonValue> fooField = configuration.getField(fieldName);
    if (CommonValueTools::isArray(fooField)) {
        auto fooArray = CommonValueTools::getArray(fooField);
    }
}
try {
    auto fooArray = CommonValueTools::getArray(configuration.getField(fieldName))
    std::cerr << 
"Failed to get array 'fooArray': "<< e.
what() << std::endl;
}
Setting configuration persistent storage
#include <vector>
using namespace kaa;
    byte_buffer configurationBytes_;
public:
    MemoryConfigurationStorage() {}
    
    void saveConfiguration(const byte_buffer &bytes) {
        configurationBytes_.assign(bytes.begin(), bytes.end());
    }
    
    byte_buffer loadConfiguration() {
        return configurationBytes_;
    }
};
...
IConfigurationStorage * storage = new MemoryConfigurationStorage();
Kaa::getKaaClient().getConfigurationPersistanceManager().setConfigurationStorage(storage);
Setting configuration schema persistent storage
#include <vector>
#include <kaa/schema/storage/ISchemaStorage.hpp>
using namespace kaa;
class MemoryConfigurationSchemaStorage : public ISchemaStorage {
    byte_buffer schemaBytes_;
public:
    MemoryConfigurationSchemaStorage() {}
    
    void saveSchema(const byte_buffer &data) {
        schemaBytes_.assign(data.begin(), data.end());
    }
    
    byte_buffer loadSchema() {
        return schemaBytes_;
    }
};
...
ISchemaStorage * storage = new MemoryConfigurationSchemaStorage();
Kaa::getKaaClient().getSchemaPersistanceManager().setSchemaStorage(storage);