diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 3b1289778..9731d773e 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1226,11 +1226,11 @@ static void misc_config_read (LinphoneCore *lc) { -static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, const char *config_path, - const char *factory_config_path, void * userdata) +static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, LpConfig *config, void * userdata) { ms_message("Initializing LinphoneCore %s", linphone_core_get_version()); memset (lc, 0, sizeof (LinphoneCore)); + lc->config=config; lc->data=userdata; lc->ringstream_autorelease=TRUE; @@ -1307,10 +1307,6 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta lc->msevq=ms_event_queue_new(); ms_set_global_event_queue(lc->msevq); - lc->config=lp_config_new(config_path); - if (factory_config_path) - lp_config_read_file(lc->config,factory_config_path); - lc->sal=sal_init(); sal_set_user_pointer(lc->sal,lc); @@ -1357,13 +1353,19 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta * It is OPTIONAL, use NULL if unneeded. * @param userdata an opaque user pointer that can be retrieved at any time (for example in * callbacks) using linphone_core_get_user_data(). - * + * @see linphone_core_new_with_config **/ LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, const char *config_path, const char *factory_config_path, void * userdata) { - LinphoneCore *core=ms_new(LinphoneCore,1); - linphone_core_init(core,vtable,config_path, factory_config_path, userdata); + LpConfig *config = lp_config_new_with_factory(config_path, factory_config_path); + return linphone_core_new_with_config(vtable, config, userdata); +} + +LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata) +{ + LinphoneCore *core = ms_new(LinphoneCore, 1); + linphone_core_init(core, vtable, config, userdata); return core; } diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index f61dffe7d..ede4008b1 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -924,6 +924,20 @@ const char *linphone_core_get_user_agent_version(void); LINPHONE_PUBLIC LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, const char *config_path, const char *factory_config, void* userdata); +/** + * Instantiates a LinphoneCore object with a given LpConfig. + * @ingroup initializing + * + * The LinphoneCore object is the primary handle for doing all phone actions. + * It should be unique within your application. + * @param vtable a LinphoneCoreVTable structure holding your application callbacks + * @param config a pointer to an LpConfig object holding the configuration of the LinphoneCore to be instantiated. + * @param userdata an opaque user pointer that can be retrieved at any time (for example in + * callbacks) using linphone_core_get_user_data(). + * @see linphone_core_new +**/ +LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata); + /* function to be periodically called in a main loop */ /* For ICE to work properly it should be called every 20ms */ LINPHONE_PUBLIC void linphone_core_iterate(LinphoneCore *lc); diff --git a/coreapi/lpconfig.c b/coreapi/lpconfig.c index 6ef756e3f..8fbd094c8 100644 --- a/coreapi/lpconfig.c +++ b/coreapi/lpconfig.c @@ -215,28 +215,35 @@ void lp_config_parse(LpConfig *lpconfig, FILE *file){ } LpConfig * lp_config_new(const char *filename){ + return lp_config_new_with_factory(filename, NULL); +} + +LpConfig *lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename) { LpConfig *lpconfig=lp_new0(LpConfig,1); struct stat fileStat; - if (filename!=NULL){ - ms_message("Using (r/w) config information from %s", filename); - lpconfig->filename=ortp_strdup(filename); - lpconfig->file=fopen(filename,"r+"); + if (config_filename!=NULL){ + ms_message("Using (r/w) config information from %s", config_filename); + lpconfig->filename=ortp_strdup(config_filename); + lpconfig->file=fopen(config_filename,"r+"); if (lpconfig->file!=NULL){ lp_config_parse(lpconfig,lpconfig->file); fclose(lpconfig->file); #if !defined(WIN32) - if ((stat(filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { + if ((stat(config_filename,&fileStat) == 0) && (S_ISREG(fileStat.st_mode))) { /* make existing configuration files non-group/world-accessible */ - if (chmod(filename, S_IRUSR | S_IWUSR ) == -1) { + if (chmod(config_filename, S_IRUSR | S_IWUSR) == -1) { ms_warning("unable to correct permissions on " "configuration file: %s", strerror(errno)); } } -#endif /*_WIN32_WCE*/ +#endif /*WIN32*/ lpconfig->file=NULL; lpconfig->modified=0; } } + if (factory_config_filename != NULL) { + lp_config_read_file(lpconfig, factory_config_filename); + } return lpconfig; } diff --git a/coreapi/lpconfig.h b/coreapi/lpconfig.h index 8b7bbb825..02a4fe3c8 100644 --- a/coreapi/lpconfig.h +++ b/coreapi/lpconfig.h @@ -65,7 +65,29 @@ extern "C" { (config) ? (lp_config_get_float(config, "default_values", name, default)) : (default) +/** + * Instantiates a LpConfig object from a user config file. + * + * @ingroup misc + * @param filename the filename of the config file to read to fill the instantiated LpConfig + * @see lp_config_new_with_factory + */ LpConfig * lp_config_new(const char *filename); + +/** + * Instantiates a LpConfig object from a user config file and a factory config file. + * + * @ingroup misc + * @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 + * @see lp_config_new + * + * The user config file is read first to fill the LpConfig and then the factory config file is read. + * Therefore the configuration parameters defined in the user config file will be overwritten by the parameters + * defined in the factory config file. + */ +LpConfig * lp_config_new_with_factory(const char *config_filename, const char *factory_config_filename); + int lp_config_read_file(LpConfig *lpconfig, const char *filename); /** * Retrieves a configuration item as a string, given its section, key, and default value.