]> sjero.net Git - linphone/commitdiff
Add the linphone_core_new_with_config() function to instantiate a LinphoneCore given...
authorGhislain MARY <ghislain.mary@belledonne-communications.com>
Thu, 11 Apr 2013 13:39:25 +0000 (15:39 +0200)
committerGhislain MARY <ghislain.mary@belledonne-communications.com>
Thu, 11 Apr 2013 13:41:43 +0000 (15:41 +0200)
This enables the creation of the LpConfig before creating the LinphoneCore.
It is useful on some systems to read some configuration parameters and perform some customization before creating the LinphoneCore.

The LpConfig can now also be created given a factory config filename using the new lp_config_new_with_factory() function.

coreapi/linphonecore.c
coreapi/linphonecore.h
coreapi/lpconfig.c
coreapi/lpconfig.h

index 729df1fc6e7118c6edba9621aa6e1a6fe7e87de2..edf11a4071d7ca2d6808442c3f95d0396ab1c926 100644 (file)
@@ -1218,11 +1218,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;
 
@@ -1299,10 +1299,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);
        sal_set_callbacks(lc->sal,&linphone_sal_callbacks);
@@ -1348,13 +1344,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;
 }
 
index f8e1dcb88fdb4e3707eb9fd86f2441b9311cddbe..5ae73cc4dd91bb48676affa7a65d06151992d48e 100644 (file)
@@ -913,6 +913,20 @@ const char *linphone_core_get_user_agent_version(void);
 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 */
 void linphone_core_iterate(LinphoneCore *lc);
index dd3de63db91aec56243c0de7de241f9bc7388027..ca65fd1ffcd5ca4158d8e5425df06b485a985fb5 100644 (file)
@@ -211,19 +211,23 @@ 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);
-       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){
                        struct stat fileStat;
                        lp_config_parse(lpconfig,lpconfig->file);
                        fclose(lpconfig->file);
 #if !defined(_WIN32_WCE)
-                       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));
                                }
@@ -233,6 +237,9 @@ LpConfig * lp_config_new(const char *filename){
                        lpconfig->modified=0;
                }
        }
+       if (factory_config_filename != NULL) {
+               lp_config_read_file(lpconfig, factory_config_filename);
+       }
        return lpconfig;
 }
 
index 310baaff3e5a147150643092ad9b04e57b83a4e3..43f761adb74663d7f92e81cba25043087d30ca1b 100644 (file)
@@ -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.