@@ -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