@@ -15,7 +15,15 @@ class ConfigurationC : public Configuration, public MemoryManaged {
1515public:
1616 ConfigurationC (ocpp_configuration *config) :
1717 config (config) {
18- config->mo_data = this ;
18+ if (config->read_only ) {
19+ setReadOnly ();
20+ }
21+ if (config->write_only ) {
22+ setWriteOnly ();
23+ }
24+ if (config->reboot_required ) {
25+ setRebootRequired ();
26+ }
1927 }
2028
2129 bool setKey (const char *key) override {
@@ -116,6 +124,59 @@ class ConfigurationC : public Configuration, public MemoryManaged {
116124 }
117125};
118126
127+ namespace MicroOcpp {
128+
129+ ConfigurationC *getConfigurationC (ocpp_configuration *config) {
130+ if (!config->mo_data ) {
131+ return nullptr ;
132+ }
133+ return reinterpret_cast <std::shared_ptr<ConfigurationC>*>(config->mo_data )->get ();
134+ }
135+
136+ }
137+
138+ using namespace MicroOcpp ;
139+
140+
141+ void ocpp_setRebootRequired (ocpp_configuration *config) {
142+ if (auto c = getConfigurationC (config)) {
143+ c->setRebootRequired ();
144+ }
145+ config->reboot_required = true ;
146+ }
147+ bool ocpp_isRebootRequired (ocpp_configuration *config) {
148+ if (auto c = getConfigurationC (config)) {
149+ return c->isRebootRequired ();
150+ }
151+ return config->reboot_required ;
152+ }
153+
154+ void ocpp_setReadOnly (ocpp_configuration *config) {
155+ if (auto c = getConfigurationC (config)) {
156+ c->setReadOnly ();
157+ }
158+ config->read_only = true ;
159+ }
160+ bool ocpp_isReadOnly (ocpp_configuration *config) {
161+ if (auto c = getConfigurationC (config)) {
162+ return c->isReadOnly ();
163+ }
164+ return config->read_only ;
165+ }
166+ bool ocpp_isReadable (ocpp_configuration *config) {
167+ if (auto c = getConfigurationC (config)) {
168+ return c->isReadable ();
169+ }
170+ return !config->write_only ;
171+ }
172+
173+ void ocpp_setWriteOnly (ocpp_configuration *config) {
174+ if (auto c = getConfigurationC (config)) {
175+ c->setWriteOnly ();
176+ }
177+ config->write_only = true ;
178+ }
179+
119180class ConfigurationContainerC : public ConfigurationContainer , public MemoryManaged {
120181private:
121182 ocpp_configuration_container *container;
@@ -125,15 +186,41 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana
125186
126187 }
127188
189+ ~ConfigurationContainerC () {
190+ for (size_t i = 0 ; i < container->size (container->user_data ); i++) {
191+ if (auto config = container->get_configuration (container->user_data , i)) {
192+ if (config->mo_data ) {
193+ delete reinterpret_cast <std::shared_ptr<ConfigurationC>*>(config->mo_data );
194+ config->mo_data = nullptr ;
195+ }
196+ }
197+ }
198+ }
199+
128200 bool load () override {
129- return container->load (container->user_data );
201+ if (container->load ) {
202+ return container->load (container->user_data );
203+ } else {
204+ return true ;
205+ }
130206 }
131207
132208 bool save () override {
133- return container->save (container->user_data );
209+ if (container->save ) {
210+ return container->save (container->user_data );
211+ } else {
212+ return true ;
213+ }
134214 }
135215
136216 std::shared_ptr<Configuration> createConfiguration (TConfig type, const char *key) override {
217+
218+ auto result = std::shared_ptr<ConfigurationC>(nullptr , std::default_delete<ConfigurationC>(), makeAllocator<ConfigurationC>(getMemoryTag ()));
219+
220+ if (!container->create_configuration ) {
221+ return result;
222+ }
223+
137224 ocpp_config_datatype dt;
138225 switch (type) {
139226 case TConfig::Int:
@@ -147,19 +234,38 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana
147234 break ;
148235 default :
149236 MO_DBG_ERR (" internal error" );
150- return nullptr ;
237+ return result ;
151238 }
152239 ocpp_configuration *config = container->create_configuration (container->user_data , dt, key);
240+ if (!config) {
241+ return result;
242+ }
243+
244+ result.reset (new ConfigurationC (config));
153245
154- if (config) {
155- return std::allocate_shared<ConfigurationC>(makeAllocator<ConfigurationC>(getMemoryTag ()), config);
246+ if (result) {
247+ auto captureConfigC = new std::shared_ptr<ConfigurationC>(result);
248+ config->mo_data = reinterpret_cast <void *>(captureConfigC);
156249 } else {
157250 MO_DBG_ERR (" could not create config: %s" , key);
158- return nullptr ;
251+ if (container->remove ) {
252+ container->remove (container->user_data , key);
253+ }
159254 }
255+
256+ return result;
160257 }
161258
162259 void remove (Configuration *config) override {
260+ if (!container->remove ) {
261+ return ;
262+ }
263+
264+ if (auto c = container->get_configuration_by_key (container->user_data , config->getKey ())) {
265+ delete reinterpret_cast <std::shared_ptr<ConfigurationC>*>(c->mo_data );
266+ c->mo_data = nullptr ;
267+ }
268+
163269 container->remove (container->user_data , config->getKey ());
164270 }
165271
@@ -170,16 +276,28 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana
170276 Configuration *getConfiguration (size_t i) override {
171277 auto config = container->get_configuration (container->user_data , i);
172278 if (config) {
173- return static_cast <Configuration*>(config->mo_data );
279+ if (!config->mo_data ) {
280+ auto c = new ConfigurationC (config);
281+ if (c) {
282+ config->mo_data = reinterpret_cast <void *>(new std::shared_ptr<ConfigurationC>(c, std::default_delete<ConfigurationC>(), makeAllocator<ConfigurationC>(getMemoryTag ())));
283+ }
284+ }
285+ return static_cast <Configuration*>(config->mo_data ? reinterpret_cast <std::shared_ptr<ConfigurationC>*>(config->mo_data )->get () : nullptr );
174286 } else {
175287 return nullptr ;
176288 }
177289 }
178290
179291 std::shared_ptr<Configuration> getConfiguration (const char *key) override {
180- ocpp_configuration * config = container->get_configuration_by_key (container->user_data , key);
292+ auto config = container->get_configuration_by_key (container->user_data , key);
181293 if (config) {
182- return std::allocate_shared<ConfigurationC>(makeAllocator<ConfigurationC>(getMemoryTag ()), config);
294+ if (!config->mo_data ) {
295+ auto c = new ConfigurationC (config);
296+ if (c) {
297+ config->mo_data = reinterpret_cast <void *>(new std::shared_ptr<ConfigurationC>(c, std::default_delete<ConfigurationC>(), makeAllocator<ConfigurationC>(getMemoryTag ())));
298+ }
299+ }
300+ return config->mo_data ? *reinterpret_cast <std::shared_ptr<ConfigurationC>*>(config->mo_data ) : nullptr ;
183301 } else {
184302 return nullptr ;
185303 }
0 commit comments