Commit c1ef06eb authored by Simon Morlat's avatar Simon Morlat

add refcounting to LpConfig

parent 9f68674a
...@@ -1304,7 +1304,7 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab ...@@ -1304,7 +1304,7 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab
const char *remote_provisioning_uri = NULL; const char *remote_provisioning_uri = NULL;
ms_message("Initializing LinphoneCore %s", linphone_core_get_version()); ms_message("Initializing LinphoneCore %s", linphone_core_get_version());
memset (lc, 0, sizeof (LinphoneCore)); memset (lc, 0, sizeof (LinphoneCore));
lc->config=config; lc->config=lp_config_ref(config);
lc->data=userdata; lc->data=userdata;
lc->ringstream_autorelease=TRUE; lc->ringstream_autorelease=TRUE;
...@@ -1421,8 +1421,11 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab ...@@ -1421,8 +1421,11 @@ static void linphone_core_init(LinphoneCore * lc, const LinphoneCoreVTable *vtab
LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,
const char *config_path, const char *factory_config_path, void * userdata) const char *config_path, const char *factory_config_path, void * userdata)
{ {
LinphoneCore *lc;
LpConfig *config = lp_config_new_with_factory(config_path, factory_config_path); LpConfig *config = lp_config_new_with_factory(config_path, factory_config_path);
return linphone_core_new_with_config(vtable, config, userdata); lc=linphone_core_new_with_config(vtable, config, userdata);
lp_config_unref(config);
return lc;
} }
LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata) LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata)
......
...@@ -63,6 +63,7 @@ typedef struct _LpSection{ ...@@ -63,6 +63,7 @@ typedef struct _LpSection{
} LpSection; } LpSection;
struct _LpConfig{ struct _LpConfig{
int refcnt;
FILE *file; FILE *file;
char *filename; char *filename;
MSList *sections; MSList *sections;
...@@ -287,6 +288,7 @@ LpConfig * lp_config_new(const char *filename){ ...@@ -287,6 +288,7 @@ LpConfig * lp_config_new(const char *filename){
LpConfig * lp_config_new_from_buffer(const char *buffer){ LpConfig * lp_config_new_from_buffer(const char *buffer){
LpConfig* conf = lp_new0(LpConfig,1); LpConfig* conf = lp_new0(LpConfig,1);
conf->refcnt=1;
LpSection* current_section = NULL; LpSection* current_section = NULL;
char* ptr = ms_strdup(buffer); char* ptr = ms_strdup(buffer);
...@@ -305,7 +307,7 @@ LpConfig * lp_config_new_from_buffer(const char *buffer){ ...@@ -305,7 +307,7 @@ LpConfig * lp_config_new_from_buffer(const char *buffer){
LpConfig *lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename) { LpConfig *lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename) {
LpConfig *lpconfig=lp_new0(LpConfig,1); LpConfig *lpconfig=lp_new0(LpConfig,1);
lpconfig->refcnt=1;
if (config_filename!=NULL){ if (config_filename!=NULL){
ms_message("Using (r/w) config information from %s", config_filename); ms_message("Using (r/w) config information from %s", config_filename);
lpconfig->filename=ortp_strdup(config_filename); lpconfig->filename=ortp_strdup(config_filename);
...@@ -354,13 +356,28 @@ void lp_item_set_value(LpItem *item, const char *value){ ...@@ -354,13 +356,28 @@ void lp_item_set_value(LpItem *item, const char *value){
} }
void lp_config_destroy(LpConfig *lpconfig){ static void _lp_config_destroy(LpConfig *lpconfig){
if (lpconfig->filename!=NULL) ortp_free(lpconfig->filename); if (lpconfig->filename!=NULL) ortp_free(lpconfig->filename);
ms_list_for_each(lpconfig->sections,(void (*)(void*))lp_section_destroy); ms_list_for_each(lpconfig->sections,(void (*)(void*))lp_section_destroy);
ms_list_free(lpconfig->sections); ms_list_free(lpconfig->sections);
free(lpconfig); free(lpconfig);
} }
LpConfig *lp_config_ref(LpConfig *lpconfig){
lpconfig->refcnt++;
return lpconfig;
}
void lp_config_unref(LpConfig *lpconfig){
lpconfig->refcnt--;
if (lpconfig->refcnt==0)
_lp_config_destroy(lpconfig);
}
void lp_config_destroy(LpConfig *lpconfig){
lp_config_unref(lpconfig);
}
void lp_section_remove_item(LpSection *sec, LpItem *item){ void lp_section_remove_item(LpSection *sec, LpItem *item){
sec->items=ms_list_remove(sec->items,(void *)item); sec->items=ms_list_remove(sec->items,(void *)item);
lp_item_destroy(item); lp_item_destroy(item);
......
...@@ -57,7 +57,7 @@ extern "C" { ...@@ -57,7 +57,7 @@ extern "C" {
/** /**
* Instantiates a LpConfig object from a user config file. * Instantiates a LpConfig object from a user config file.
* * The caller of this constructor owns a reference. lp_config_unref() must be called when this object is no longer needed.
* @ingroup misc * @ingroup misc
* @param filename the filename of the config file to read to fill the instantiated LpConfig * @param filename the filename of the config file to read to fill the instantiated LpConfig
* @see lp_config_new_with_factory * @see lp_config_new_with_factory
...@@ -66,7 +66,7 @@ LINPHONE_PUBLIC LpConfig * lp_config_new(const char *filename); ...@@ -66,7 +66,7 @@ LINPHONE_PUBLIC LpConfig * lp_config_new(const char *filename);
/** /**
* Instantiates a LpConfig object from a user provided buffer. * Instantiates a LpConfig object from a user provided buffer.
* * The caller of this constructor owns a reference. lp_config_unref() must be called when this object is no longer needed.
* @ingroup misc * @ingroup misc
* @param buffer the buffer from which the lpconfig will be retrieved. We expect the buffer to be null-terminated. * @param buffer the buffer from which the lpconfig will be retrieved. We expect the buffer to be null-terminated.
* @see lp_config_new_with_factory * @see lp_config_new_with_factory
...@@ -76,7 +76,7 @@ LINPHONE_PUBLIC LpConfig * lp_config_new_from_buffer(const char *buffer); ...@@ -76,7 +76,7 @@ LINPHONE_PUBLIC LpConfig * lp_config_new_from_buffer(const char *buffer);
/** /**
* Instantiates a LpConfig object from a user config file and a factory config file. * Instantiates a LpConfig object from a user config file and a factory config file.
* * The caller of this constructor owns a reference. lp_config_unref() must be called when this object is no longer needed.
* @ingroup misc * @ingroup misc
* @param config_filename the filename of the user config file to read to fill the instantiated LpConfig * @param config_filename the filename of the user config file to read to fill the instantiated LpConfig
* @param factory_config_filename the filename of the factory config file to read to fill the instantiated LpConfig * @param factory_config_filename the filename of the factory config file to read to fill the instantiated LpConfig
...@@ -259,6 +259,19 @@ LINPHONE_PUBLIC const char* lp_config_get_default_string(const LpConfig *lpconfi ...@@ -259,6 +259,19 @@ LINPHONE_PUBLIC const char* lp_config_get_default_string(const LpConfig *lpconfi
**/ **/
LINPHONE_PUBLIC const char* lp_config_get_section_param_string(const LpConfig *lpconfig, const char *section, const char *key, const char *default_value); LINPHONE_PUBLIC const char* lp_config_get_section_param_string(const LpConfig *lpconfig, const char *section, const char *key, const char *default_value);
/**
* increment reference count
* @ingroup misc
**/
LINPHONE_PUBLIC LpConfig *lp_config_ref(LpConfig *lpconfig);
/**
* Decrement reference count, which will eventually free the object.
* @ingroup misc
**/
LINPHONE_PUBLIC void lp_config_unref(LpConfig *lpconfig);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment