diff --git a/build/android/Android.mk b/build/android/Android.mk
index 817aba539..6310550c4 100755
--- a/build/android/Android.mk
+++ b/build/android/Android.mk
@@ -65,7 +65,8 @@ LOCAL_SRC_FILES := \
xml2lpc.c \
lpc2xml.c \
remote_provisioning.c \
- quality_reporting.c
+ quality_reporting.c \
+ call_log.c
ifndef LINPHONE_VERSION
LINPHONE_VERSION = "Devel"
diff --git a/build/wp8/LibLinphone.vcxproj b/build/wp8/LibLinphone.vcxproj
index 797b2517d..df4135e68 100644
--- a/build/wp8/LibLinphone.vcxproj
+++ b/build/wp8/LibLinphone.vcxproj
@@ -107,6 +107,7 @@
+
diff --git a/coreapi/CMakeLists.txt b/coreapi/CMakeLists.txt
index ab707ce69..6323a1adc 100644
--- a/coreapi/CMakeLists.txt
+++ b/coreapi/CMakeLists.txt
@@ -42,6 +42,7 @@ set(SOURCE_FILES
bellesip_sal/sal_op_registration.c
bellesip_sal/sal_sdp.c
callbacks.c
+ call_log.c
chat.c
conference.c
ec-calibrator.c
@@ -139,7 +140,19 @@ install(TARGETS linphone
)
-file(GLOB HEADER_FILES "*.h")
+set(HEADER_FILES
+ call_log.h
+ event.h
+ linphonecore.h
+ linphonecore_utils.h
+ linphonefriend.h
+ linphonepresence.h
+ linphone_tunnel.h
+ lpc2xml.h
+ lpconfig.h
+ sipsetup.h
+ xml2lpc.h
+)
install(FILES ${HEADER_FILES}
DESTINATION include/linphone
diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am
index 5ae75edd8..a359970e9 100644
--- a/coreapi/Makefile.am
+++ b/coreapi/Makefile.am
@@ -24,7 +24,7 @@ CLEANFILES=$(GITVERSION_FILE)
## Process this file with automake to produce Makefile.in
linphone_includedir=$(includedir)/linphone
-linphone_include_HEADERS=linphonecore.h linphonefriend.h linphonepresence.h linphonecore_utils.h lpconfig.h sipsetup.h event.h xml2lpc.h lpc2xml.h linphone_tunnel.h
+linphone_include_HEADERS=linphonecore.h linphonefriend.h linphonepresence.h linphonecore_utils.h lpconfig.h sipsetup.h event.h xml2lpc.h lpc2xml.h linphone_tunnel.h call_log.h
lib_LTLIBRARIES=liblinphone.la
@@ -59,6 +59,7 @@ liblinphone_la_SOURCES=\
lpc2xml.c \
remote_provisioning.c \
quality_reporting.c quality_reporting.h\
+ call_log.c \
$(GITVERSION_FILE)
if BUILD_UPNP
diff --git a/coreapi/call_log.c b/coreapi/call_log.c
new file mode 100644
index 000000000..811f8c437
--- /dev/null
+++ b/coreapi/call_log.c
@@ -0,0 +1,260 @@
+/*
+linphone
+Copyright (C) 2010-2014 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#include "linphonecore.h"
+#include "private.h"
+
+
+/*******************************************************************************
+ * Internal functions *
+ ******************************************************************************/
+
+static void set_call_log_date(LinphoneCallLog *cl, time_t start_time){
+ struct tm loctime;
+#ifdef WIN32
+#if !defined(_WIN32_WCE)
+ loctime=*localtime(&start_time);
+ /*FIXME*/
+#endif /*_WIN32_WCE*/
+#else
+ localtime_r(&start_time,&loctime);
+#endif
+ my_strftime(cl->start_date,sizeof(cl->start_date),"%c",&loctime);
+}
+
+/*******************************************************************************
+ * Private functions *
+ ******************************************************************************/
+
+void call_logs_write_to_config_file(LinphoneCore *lc){
+ MSList *elem;
+ char logsection[32];
+ int i;
+ char *tmp;
+ LpConfig *cfg=lc->config;
+
+ if (linphone_core_get_global_state (lc)==LinphoneGlobalStartup) return;
+
+ for(i=0,elem=lc->call_logs;elem!=NULL;elem=elem->next,++i){
+ LinphoneCallLog *cl=(LinphoneCallLog*)elem->data;
+ snprintf(logsection,sizeof(logsection),"call_log_%i",i);
+ lp_config_clean_section(cfg,logsection);
+ lp_config_set_int(cfg,logsection,"dir",cl->dir);
+ lp_config_set_int(cfg,logsection,"status",cl->status);
+ tmp=linphone_address_as_string(cl->from);
+ lp_config_set_string(cfg,logsection,"from",tmp);
+ ms_free(tmp);
+ tmp=linphone_address_as_string(cl->to);
+ lp_config_set_string(cfg,logsection,"to",tmp);
+ ms_free(tmp);
+ if (cl->start_date_time)
+ lp_config_set_int64(cfg,logsection,"start_date_time",(int64_t)cl->start_date_time);
+ else lp_config_set_string(cfg,logsection,"start_date",cl->start_date);
+ lp_config_set_int(cfg,logsection,"duration",cl->duration);
+ if (cl->refkey) lp_config_set_string(cfg,logsection,"refkey",cl->refkey);
+ lp_config_set_float(cfg,logsection,"quality",cl->quality);
+ lp_config_set_int(cfg,logsection,"video_enabled", cl->video_enabled);
+ lp_config_set_string(cfg,logsection,"call_id",cl->call_id);
+ }
+ for(;imax_call_logs;++i){
+ snprintf(logsection,sizeof(logsection),"call_log_%i",i);
+ lp_config_clean_section(cfg,logsection);
+ }
+}
+
+void call_logs_read_from_config_file(LinphoneCore *lc){
+ char logsection[32];
+ int i;
+ const char *tmp;
+ uint64_t sec;
+ LpConfig *cfg=lc->config;
+ for(i=0;;++i){
+ snprintf(logsection,sizeof(logsection),"call_log_%i",i);
+ if (lp_config_has_section(cfg,logsection)){
+ LinphoneCallLog *cl=ms_new0(LinphoneCallLog,1);
+ cl->dir=lp_config_get_int(cfg,logsection,"dir",0);
+ cl->status=lp_config_get_int(cfg,logsection,"status",0);
+ tmp=lp_config_get_string(cfg,logsection,"from",NULL);
+ if (tmp) cl->from=linphone_address_new(tmp);
+ tmp=lp_config_get_string(cfg,logsection,"to",NULL);
+ if (tmp) cl->to=linphone_address_new(tmp);
+ sec=lp_config_get_int64(cfg,logsection,"start_date_time",0);
+ if (sec) {
+ /*new call log format with date expressed in seconds */
+ cl->start_date_time=(time_t)sec;
+ set_call_log_date(cl,cl->start_date_time);
+ }else{
+ tmp=lp_config_get_string(cfg,logsection,"start_date",NULL);
+ if (tmp) {
+ strncpy(cl->start_date,tmp,sizeof(cl->start_date));
+ cl->start_date_time=string_to_time(cl->start_date);
+ }
+ }
+ cl->duration=lp_config_get_int(cfg,logsection,"duration",0);
+ tmp=lp_config_get_string(cfg,logsection,"refkey",NULL);
+ if (tmp) cl->refkey=ms_strdup(tmp);
+ cl->quality=lp_config_get_float(cfg,logsection,"quality",-1);
+ cl->video_enabled=lp_config_get_int(cfg,logsection,"video_enabled",0);
+ tmp=lp_config_get_string(cfg,logsection,"call_id",NULL);
+ if (tmp) cl->call_id=ms_strdup(tmp);
+ lc->call_logs=ms_list_append(lc->call_logs,cl);
+ }else break;
+ }
+}
+
+
+/*******************************************************************************
+ * Public functions *
+ ******************************************************************************/
+
+const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl){
+ return cl->call_id;
+}
+
+LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl){
+ return cl->dir;
+}
+
+int linphone_call_log_get_duration(LinphoneCallLog *cl){
+ return cl->duration;
+}
+
+LinphoneAddress *linphone_call_log_get_from_address(LinphoneCallLog *cl){
+ return cl->from;
+}
+
+const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl){
+ return &cl->local_stats;
+}
+
+float linphone_call_log_get_quality(LinphoneCallLog *cl){
+ return cl->quality;
+}
+
+const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl){
+ return cl->refkey;
+}
+
+LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl){
+ return (cl->dir == LinphoneCallIncoming) ? cl->from : cl->to;
+}
+
+const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl){
+ return &cl->remote_stats;
+}
+
+time_t linphone_call_log_get_start_date(LinphoneCallLog *cl){
+ return cl->start_date_time;
+}
+
+LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl){
+ return cl->status;
+}
+
+LinphoneAddress *linphone_call_log_get_to_address(LinphoneCallLog *cl){
+ return cl->to;
+}
+
+void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey){
+ if (cl->refkey!=NULL){
+ ms_free(cl->refkey);
+ cl->refkey=NULL;
+ }
+ if (refkey) cl->refkey=ms_strdup(refkey);
+}
+
+char * linphone_call_log_to_str(LinphoneCallLog *cl){
+ char *status;
+ char *tmp;
+ char *from=linphone_address_as_string (cl->from);
+ char *to=linphone_address_as_string (cl->to);
+ switch(cl->status){
+ case LinphoneCallAborted:
+ status=_("aborted");
+ break;
+ case LinphoneCallSuccess:
+ status=_("completed");
+ break;
+ case LinphoneCallMissed:
+ status=_("missed");
+ break;
+ default:
+ status="unknown";
+ }
+ tmp=ortp_strdup_printf(_("%s at %s\nFrom: %s\nTo: %s\nStatus: %s\nDuration: %i mn %i sec\n"),
+ (cl->dir==LinphoneCallIncoming) ? _("Incoming call") : _("Outgoing call"),
+ cl->start_date,
+ from,
+ to,
+ status,
+ cl->duration/60,
+ cl->duration%60);
+ ms_free(from);
+ ms_free(to);
+ return tmp;
+}
+
+bool_t linphone_call_log_video_enabled(LinphoneCallLog *cl) {
+ return cl->video_enabled;
+}
+
+
+/*******************************************************************************
+ * Reference and user data handling functions *
+ ******************************************************************************/
+
+void *linphone_call_log_get_user_data(const LinphoneCallLog *cl){
+ return cl->user_pointer;
+}
+
+void linphone_call_log_set_user_data(LinphoneCallLog *cl, void *ud){
+ cl->user_pointer=ud;
+}
+
+
+/*******************************************************************************
+ * Constructor and destructor functions *
+ ******************************************************************************/
+
+void linphone_call_log_destroy(LinphoneCallLog *cl){
+ if (cl->from!=NULL) linphone_address_destroy(cl->from);
+ if (cl->to!=NULL) linphone_address_destroy(cl->to);
+ if (cl->refkey!=NULL) ms_free(cl->refkey);
+ if (cl->call_id) ms_free(cl->call_id);
+ if (cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]);
+ if (cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]);
+
+ ms_free(cl);
+}
+
+LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *from, LinphoneAddress *to){
+ LinphoneCallLog *cl=ms_new0(LinphoneCallLog,1);
+ cl->dir=call->dir;
+ cl->start_date_time=time(NULL);
+ set_call_log_date(cl,cl->start_date_time);
+ cl->from=from;
+ cl->to=to;
+ cl->status=LinphoneCallAborted; /*default status*/
+ cl->quality=-1;
+
+ cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]=linphone_reporting_new();
+ cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]=linphone_reporting_new();
+ return cl;
+}
diff --git a/coreapi/call_log.h b/coreapi/call_log.h
new file mode 100644
index 000000000..e69f17098
--- /dev/null
+++ b/coreapi/call_log.h
@@ -0,0 +1,224 @@
+/*
+linphone
+Copyright (C) 2010-2014 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+
+#ifndef __LINPHONE_CALL_LOG_H__
+#define __LINPHONE_CALL_LOG_H__
+
+/**
+ * @addtogroup call_logs
+ * @{
+**/
+
+
+/*******************************************************************************
+ * Structures and enums *
+ ******************************************************************************/
+
+/**
+ * Enum representing the direction of a call.
+**/
+enum _LinphoneCallDir {
+ LinphoneCallOutgoing, /**< outgoing calls*/
+ LinphoneCallIncoming /**< incoming calls*/
+};
+
+/**
+ * Typedef for enum
+**/
+typedef enum _LinphoneCallDir LinphoneCallDir;
+
+/**
+ * Enum representing the status of a call
+**/
+typedef enum _LinphoneCallStatus {
+ LinphoneCallSuccess, /**< The call was sucessful */
+ LinphoneCallAborted, /**< The call was aborted */
+ LinphoneCallMissed, /**< The call was missed (unanswered) */
+ LinphoneCallDeclined /**< The call was declined, either locally or by remote end */
+} LinphoneCallStatus;
+
+/**
+ * Structure representing a call log.
+**/
+typedef struct _LinphoneCallLog LinphoneCallLog;
+
+
+/*******************************************************************************
+ * Public functions *
+ ******************************************************************************/
+
+/**
+ * Get the call ID used by the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The call ID used by the call as a string.
+**/
+LINPHONE_PUBLIC const char * linphone_call_log_get_call_id(const LinphoneCallLog *cl);
+
+/**
+ * Get the direction of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The direction of the call.
+**/
+LINPHONE_PUBLIC LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl);
+
+/**
+ * Get the duration of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The duration of the call in seconds.
+**/
+LINPHONE_PUBLIC int linphone_call_log_get_duration(LinphoneCallLog *cl);
+
+/**
+ * Get the origin address (ie from) of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The origin address (ie from) of the call.
+**/
+LINPHONE_PUBLIC LinphoneAddress * linphone_call_log_get_from_address(LinphoneCallLog *cl);
+
+/**
+ * Get the RTP statistics computed locally regarding the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The RTP statistics that have been computed locally for the call.
+**/
+LINPHONE_PUBLIC const rtp_stats_t * linphone_call_log_get_local_stats(const LinphoneCallLog *cl);
+
+/**
+ * Get the overall quality indication of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The overall quality indication of the call.
+**/
+LINPHONE_PUBLIC float linphone_call_log_get_quality(LinphoneCallLog *cl);
+
+/**
+ * Get the persistent reference key associated to the call log.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cl LinphoneCallLog object
+ * @return The reference key string that has been associated to the call log, or NULL if none has been associated.
+**/
+LINPHONE_PUBLIC const char * linphone_call_log_get_ref_key(const LinphoneCallLog *cl);
+
+/**
+ * Get the remote address (that is from or to depending on call direction).
+ * @param[in] cl LinphoneCallLog object
+ * @return The remote address of the call.
+**/
+LINPHONE_PUBLIC LinphoneAddress * linphone_call_log_get_remote_address(LinphoneCallLog *cl);
+
+/**
+ * Get the RTP statistics computed by the remote end and sent back via RTCP.
+ * @note Not implemented yet.
+ * @param[in] cl LinphoneCallLog object
+ * @return The RTP statistics that have been computed by the remote end for the call.
+**/
+LINPHONE_PUBLIC const rtp_stats_t * linphone_call_log_get_remote_stats(const LinphoneCallLog *cl);
+
+/**
+ * Get the start date of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The date of the beginning of the call.
+**/
+LINPHONE_PUBLIC time_t linphone_call_log_get_start_date(LinphoneCallLog *cl);
+
+/**
+ * Get the status of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The status of the call.
+**/
+LINPHONE_PUBLIC LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl);
+
+/**
+ * Get the destination address (ie to) of the call.
+ * @param[in] cl LinphoneCallLog object
+ * @return The destination address (ie to) of the call.
+**/
+LINPHONE_PUBLIC LinphoneAddress * linphone_call_log_get_to_address(LinphoneCallLog *cl);
+
+/**
+ * Associate a persistent reference key to the call log.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cl LinphoneCallLog object
+ * @param[in] refkey The reference key string to associate to the call log.
+**/
+LINPHONE_PUBLIC void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey);
+
+/**
+ * Tell whether video was enabled at the end of the call or not.
+ * @param[in] cl LinphoneCallLog object
+ * @return A boolean value telling whether video was enabled at the end of the call.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_log_video_enabled(LinphoneCallLog *cl);
+
+/**
+ * Get a human readable string describing the call.
+ * @note: the returned string must be freed by the application (use ms_free()).
+ * @param[in] cl LinphoneCallLog object
+ * @return A human readable string describing the call.
+**/
+LINPHONE_PUBLIC char * linphone_call_log_to_str(LinphoneCallLog *cl);
+
+
+/*******************************************************************************
+ * Reference and user data handling functions *
+ ******************************************************************************/
+
+/**
+ * Get the user data associated with the call log.
+ * @param[in] cl LinphoneCallLog object
+ * @return The user data associated with the call log.
+**/
+LINPHONE_PUBLIC void *linphone_call_log_get_user_data(const LinphoneCallLog *cl);
+
+/**
+ * Assign a user data to the call log.
+ * @param[in] cl LinphoneCallLog object
+ * @param[in] ud The user data to associate with the call log.
+**/
+LINPHONE_PUBLIC void linphone_call_log_set_user_data(LinphoneCallLog *cl, void *ud);
+
+
+/*******************************************************************************
+ * DEPRECATED *
+ ******************************************************************************/
+
+/** @deprecated Use linphone_call_log_get_from_address() instead. */
+#define linphone_call_log_get_from(cl) linphone_call_log_get_from_address(cl)
+
+/** @deprecated Use linphone_call_log_get_to_address() instead. */
+#define linphone_call_log_get_to(cl) linphone_call_log_get_to_address(cl)
+
+/** @deprecated Use linphone_call_log_set_user_data() instead. */
+#define linphone_call_log_set_user_pointer(cl, ud) linphone_call_log_set_user_data(cl, ud)
+
+/** @deprecated Use linphone_call_log_get_user_data() instead. */
+#define linphone_call_log_get_user_pointer(cl) linphone_call_log_get_user_data(cl)
+
+
+/**
+ * @}
+**/
+
+
+#endif /* __LINPHONE_CALL_LOG_H__ */
diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c
index a926bee08..985b23d48 100644
--- a/coreapi/linphonecore.c
+++ b/coreapi/linphonecore.c
@@ -107,70 +107,6 @@ static size_t my_strftime(char *s, size_t max, const char *fmt, const struct t
return strftime(s, max, fmt, tm);
}
-static void set_call_log_date(LinphoneCallLog *cl, time_t start_time){
- struct tm loctime;
-#ifdef WIN32
-#if !defined(_WIN32_WCE)
- loctime=*localtime(&start_time);
- /*FIXME*/
-#endif /*_WIN32_WCE*/
-#else
- localtime_r(&start_time,&loctime);
-#endif
- my_strftime(cl->start_date,sizeof(cl->start_date),"%c",&loctime);
-}
-
-LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *from, LinphoneAddress *to){
- LinphoneCallLog *cl=ms_new0(LinphoneCallLog,1);
- cl->dir=call->dir;
- cl->start_date_time=time(NULL);
- set_call_log_date(cl,cl->start_date_time);
- cl->from=from;
- cl->to=to;
- cl->status=LinphoneCallAborted; /*default status*/
- cl->quality=-1;
-
- cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]=linphone_reporting_new();
- cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]=linphone_reporting_new();
- return cl;
-}
-
-void call_logs_write_to_config_file(LinphoneCore *lc){
- MSList *elem;
- char logsection[32];
- int i;
- char *tmp;
- LpConfig *cfg=lc->config;
-
- if (linphone_core_get_global_state (lc)==LinphoneGlobalStartup) return;
-
- for(i=0,elem=lc->call_logs;elem!=NULL;elem=elem->next,++i){
- LinphoneCallLog *cl=(LinphoneCallLog*)elem->data;
- snprintf(logsection,sizeof(logsection),"call_log_%i",i);
- lp_config_clean_section(cfg,logsection);
- lp_config_set_int(cfg,logsection,"dir",cl->dir);
- lp_config_set_int(cfg,logsection,"status",cl->status);
- tmp=linphone_address_as_string(cl->from);
- lp_config_set_string(cfg,logsection,"from",tmp);
- ms_free(tmp);
- tmp=linphone_address_as_string(cl->to);
- lp_config_set_string(cfg,logsection,"to",tmp);
- ms_free(tmp);
- if (cl->start_date_time)
- lp_config_set_int64(cfg,logsection,"start_date_time",(int64_t)cl->start_date_time);
- else lp_config_set_string(cfg,logsection,"start_date",cl->start_date);
- lp_config_set_int(cfg,logsection,"duration",cl->duration);
- if (cl->refkey) lp_config_set_string(cfg,logsection,"refkey",cl->refkey);
- lp_config_set_float(cfg,logsection,"quality",cl->quality);
- lp_config_set_int(cfg,logsection,"video_enabled", cl->video_enabled);
- lp_config_set_string(cfg,logsection,"call_id",cl->call_id);
- }
- for(;imax_call_logs;++i){
- snprintf(logsection,sizeof(logsection),"call_log_%i",i);
- lp_config_clean_section(cfg,logsection);
- }
-}
-
static time_t string_to_time(const char *date){
#ifndef WIN32
struct tm tmtime={0};
@@ -181,230 +117,6 @@ static time_t string_to_time(const char *date){
#endif
}
-static void call_logs_read_from_config_file(LinphoneCore *lc){
- char logsection[32];
- int i;
- const char *tmp;
- uint64_t sec;
- LpConfig *cfg=lc->config;
- for(i=0;;++i){
- snprintf(logsection,sizeof(logsection),"call_log_%i",i);
- if (lp_config_has_section(cfg,logsection)){
- LinphoneCallLog *cl=ms_new0(LinphoneCallLog,1);
- cl->dir=lp_config_get_int(cfg,logsection,"dir",0);
- cl->status=lp_config_get_int(cfg,logsection,"status",0);
- tmp=lp_config_get_string(cfg,logsection,"from",NULL);
- if (tmp) cl->from=linphone_address_new(tmp);
- tmp=lp_config_get_string(cfg,logsection,"to",NULL);
- if (tmp) cl->to=linphone_address_new(tmp);
- sec=lp_config_get_int64(cfg,logsection,"start_date_time",0);
- if (sec) {
- /*new call log format with date expressed in seconds */
- cl->start_date_time=(time_t)sec;
- set_call_log_date(cl,cl->start_date_time);
- }else{
- tmp=lp_config_get_string(cfg,logsection,"start_date",NULL);
- if (tmp) {
- strncpy(cl->start_date,tmp,sizeof(cl->start_date));
- cl->start_date_time=string_to_time(cl->start_date);
- }
- }
- cl->duration=lp_config_get_int(cfg,logsection,"duration",0);
- tmp=lp_config_get_string(cfg,logsection,"refkey",NULL);
- if (tmp) cl->refkey=ms_strdup(tmp);
- cl->quality=lp_config_get_float(cfg,logsection,"quality",-1);
- cl->video_enabled=lp_config_get_int(cfg,logsection,"video_enabled",0);
- tmp=lp_config_get_string(cfg,logsection,"call_id",NULL);
- if (tmp) cl->call_id=ms_strdup(tmp);
- lc->call_logs=ms_list_append(lc->call_logs,cl);
- }else break;
- }
-}
-
-
-
-/**
- * @addtogroup call_logs
- * @{
-**/
-
-/**
- * Returns a human readable string describing the call.
- *
- * @note: the returned char* must be freed by the application (use ms_free()).
-**/
-char * linphone_call_log_to_str(LinphoneCallLog *cl){
- char *status;
- char *tmp;
- char *from=linphone_address_as_string (cl->from);
- char *to=linphone_address_as_string (cl->to);
- switch(cl->status){
- case LinphoneCallAborted:
- status=_("aborted");
- break;
- case LinphoneCallSuccess:
- status=_("completed");
- break;
- case LinphoneCallMissed:
- status=_("missed");
- break;
- default:
- status="unknown";
- }
- tmp=ortp_strdup_printf(_("%s at %s\nFrom: %s\nTo: %s\nStatus: %s\nDuration: %i mn %i sec\n"),
- (cl->dir==LinphoneCallIncoming) ? _("Incoming call") : _("Outgoing call"),
- cl->start_date,
- from,
- to,
- status,
- cl->duration/60,
- cl->duration%60);
- ms_free(from);
- ms_free(to);
- return tmp;
-}
-
-/**
- * Returns RTP statistics computed locally regarding the call.
- *
-**/
-const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl){
- return &cl->local_stats;
-}
-
-/**
- * Returns RTP statistics computed by remote end and sent back via RTCP.
- *
- * @note Not implemented yet.
-**/
-const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl){
- return &cl->remote_stats;
-}
-
-const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl){
- return cl->call_id;
-}
-
-/**
- * Assign a user pointer to the call log.
-**/
-void linphone_call_log_set_user_data(LinphoneCallLog *cl, void *up){
- cl->user_pointer=up;
-}
-
-/**
- * Returns the user pointer associated with the call log.
-**/
-void *linphone_call_log_get_user_data(const LinphoneCallLog *cl){
- return cl->user_pointer;
-}
-
-
-
-/**
- * Associate a persistent reference key to the call log.
- *
- * The reference key can be for example an id to an external database.
- * It is stored in the config file, thus can survive to process exits/restarts.
- *
-**/
-void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey){
- if (cl->refkey!=NULL){
- ms_free(cl->refkey);
- cl->refkey=NULL;
- }
- if (refkey) cl->refkey=ms_strdup(refkey);
-}
-
-/**
- * Get the persistent reference key associated to the call log.
- *
- * The reference key can be for example an id to an external database.
- * It is stored in the config file, thus can survive to process exits/restarts.
- *
-**/
-const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl){
- return cl->refkey;
-}
-
-/**
- * Returns origin address (ie from) of the call.
- * @param[in] cl LinphoneCallLog object
- * @return The origin address (ie from) of the call.
-**/
-LinphoneAddress *linphone_call_log_get_from_address(LinphoneCallLog *cl){
- return cl->from;
-}
-
-/**
- * Returns destination address (ie to) of the call.
- * @param[in] cl LinphoneCallLog object
- * @return The destination address (ie to) of the call.
-**/
-LinphoneAddress *linphone_call_log_get_to_address(LinphoneCallLog *cl){
- return cl->to;
-}
-
-/**
- * Returns remote address (that is from or to depending on call direction).
-**/
-LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl){
- return (cl->dir == LinphoneCallIncoming) ? cl->from : cl->to;
-}
-
-/**
- * Returns the direction of the call.
-**/
-LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl){
- return cl->dir;
-}
-
-/**
- * Returns the status of the call.
-**/
-LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl){
- return cl->status;
-}
-
-/**
- * Returns the start date of the call, expressed as a POSIX time_t.
-**/
-time_t linphone_call_log_get_start_date(LinphoneCallLog *cl){
- return cl->start_date_time;
-}
-
-/**
- * Returns duration of the call.
-**/
-int linphone_call_log_get_duration(LinphoneCallLog *cl){
- return cl->duration;
-}
-
-/**
- * Returns overall quality indication of the call.
-**/
-float linphone_call_log_get_quality(LinphoneCallLog *cl){
- return cl->quality;
-}
-/**
- * return true if video was enabled at the end of the call
- */
-bool_t linphone_call_log_video_enabled(LinphoneCallLog *cl) {
- return cl->video_enabled;
-}
-/** @} */
-
-void linphone_call_log_destroy(LinphoneCallLog *cl){
- if (cl->from!=NULL) linphone_address_destroy(cl->from);
- if (cl->to!=NULL) linphone_address_destroy(cl->to);
- if (cl->refkey!=NULL) ms_free(cl->refkey);
- if (cl->call_id) ms_free(cl->call_id);
- if (cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_AUDIO]);
- if (cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]!=NULL) linphone_reporting_destroy(cl->reporting.reports[LINPHONE_CALL_STATS_VIDEO]);
-
- ms_free(cl);
-}
-
/**
* Returns TRUE if the LinphoneCall asked to autoanswer
*
@@ -4791,22 +4503,16 @@ LinphoneFirewallPolicy linphone_core_get_firewall_policy(const LinphoneCore *lc)
return LinphonePolicyNoFirewall;
}
-/**
- * Get the list of call logs (past calls).
- * @param[in] lc The LinphoneCore object
- * @return \mslist{LinphoneCallLog}
- *
- * @ingroup call_logs
-**/
+
+
+/*******************************************************************************
+ * Call log related functions *
+ ******************************************************************************/
+
const MSList * linphone_core_get_call_logs(LinphoneCore *lc){
return lc->call_logs;
}
-/**
- * Erase the call log.
- *
- * @ingroup call_logs
-**/
void linphone_core_clear_call_logs(LinphoneCore *lc){
lc->missed_calls=0;
ms_list_for_each(lc->call_logs,(void (*)(void*))linphone_call_log_destroy);
@@ -4828,6 +4534,9 @@ void linphone_core_remove_call_log(LinphoneCore *lc, LinphoneCallLog *cl){
linphone_call_log_destroy(cl);
}
+
+
+
static void toggle_video_preview(LinphoneCore *lc, bool_t val){
#ifdef VIDEO_ENABLED
if (val){
diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h
index cb3b173ee..0a35554c4 100644
--- a/coreapi/linphonecore.h
+++ b/coreapi/linphonecore.h
@@ -292,9 +292,11 @@ LINPHONE_PUBLIC int linphone_payload_type_get_channels(const LinphonePayloadType
#ifdef IN_LINPHONE
#include "linphonefriend.h"
#include "event.h"
+#include "call_log.h"
#else
#include "linphone/linphonefriend.h"
#include "linphone/event.h"
+#include "linphone/call_log.h"
#endif
LINPHONE_PUBLIC LinphoneAddress * linphone_address_new(const char *addr);
@@ -332,40 +334,6 @@ LINPHONE_PUBLIC LinphoneAddress * linphone_core_create_address(LinphoneCore *lc,
struct _SipSetupContext;
-/**
- * Enum representing the direction of a call.
- * @ingroup call_logs
-**/
-enum _LinphoneCallDir {
- LinphoneCallOutgoing, /**< outgoing calls*/
- LinphoneCallIncoming /**< incoming calls*/
-};
-
-/**
- * Typedef for enum
- * @ingroup call_logs
-**/
-typedef enum _LinphoneCallDir LinphoneCallDir;
-
-/**
- * Enum representing the status of a call
- * @ingroup call_logs
-**/
-typedef enum _LinphoneCallStatus {
- LinphoneCallSuccess, /**< The call was sucessful*/
- LinphoneCallAborted, /**< The call was aborted */
- LinphoneCallMissed, /**< The call was missed (unanswered)*/
- LinphoneCallDeclined /**< The call was declined, either locally or by remote end*/
-} LinphoneCallStatus;
-
-/**
- * Structure representing a call log.
- *
- * @ingroup call_logs
- *
-**/
-typedef struct _LinphoneCallLog LinphoneCallLog;
-
/**
* Enum describing type of media encryption types.
* @ingroup media_parameters
@@ -388,32 +356,6 @@ typedef enum _LinphoneMediaEncryption LinphoneMediaEncryption;
**/
LINPHONE_PUBLIC const char *linphone_media_encryption_to_string(LinphoneMediaEncryption menc);
-/*public: */
-/** @deprecated Use linphone_call_log_get_from_address() instead. */
-#define linphone_call_log_get_from(cl) linphone_call_log_get_from_address(cl)
-LINPHONE_PUBLIC LinphoneAddress *linphone_call_log_get_from_address(LinphoneCallLog *cl);
-/** @deprecated Use linphone_call_log_get_to_address() instead. */
-#define linphone_call_log_get_to(cl) linphone_call_log_get_to_address(cl)
-LINPHONE_PUBLIC LinphoneAddress *linphone_call_log_get_to_address(LinphoneCallLog *cl);
-LINPHONE_PUBLIC LinphoneAddress *linphone_call_log_get_remote_address(LinphoneCallLog *cl);
-LINPHONE_PUBLIC LinphoneCallDir linphone_call_log_get_dir(LinphoneCallLog *cl);
-LINPHONE_PUBLIC LinphoneCallStatus linphone_call_log_get_status(LinphoneCallLog *cl);
-LINPHONE_PUBLIC bool_t linphone_call_log_video_enabled(LinphoneCallLog *cl);
-LINPHONE_PUBLIC time_t linphone_call_log_get_start_date(LinphoneCallLog *cl);
-LINPHONE_PUBLIC int linphone_call_log_get_duration(LinphoneCallLog *cl);
-LINPHONE_PUBLIC float linphone_call_log_get_quality(LinphoneCallLog *cl);
-/** @deprecated Use linphone_call_log_set_user_data() instead. */
-#define linphone_call_log_set_user_pointer(cl, ud) linphone_call_log_set_user_data(cl, ud)
-LINPHONE_PUBLIC void linphone_call_log_set_user_data(LinphoneCallLog *cl, void *up);
-/** @deprecated Use linphone_call_log_get_user_data() instead. */
-#define linphone_call_log_get_user_pointer(cl) linphone_call_log_get_user_data(cl)
-LINPHONE_PUBLIC void *linphone_call_log_get_user_data(const LinphoneCallLog *cl);
-void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey);
-const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl);
-LINPHONE_PUBLIC const rtp_stats_t *linphone_call_log_get_local_stats(const LinphoneCallLog *cl);
-LINPHONE_PUBLIC const rtp_stats_t *linphone_call_log_get_remote_stats(const LinphoneCallLog *cl);
-LINPHONE_PUBLIC const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl);
-LINPHONE_PUBLIC char * linphone_call_log_to_str(LinphoneCallLog *cl);
/**
* Private structure definition for LinphoneCallParams.
@@ -2457,34 +2399,54 @@ bool_t linphone_core_get_rtp_no_xmit_on_audio_mute(const LinphoneCore *lc);
void linphone_core_set_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, bool_t val);
-/* returns a list of LinphoneCallLog */
-LINPHONE_PUBLIC const MSList * linphone_core_get_call_logs(LinphoneCore *lc);
-LINPHONE_PUBLIC void linphone_core_clear_call_logs(LinphoneCore *lc);
+/*******************************************************************************
+ * Call log related functions *
+ ******************************************************************************/
+
+/**
+ * @addtogroup call_logs
+ * @{
+**/
+
+/**
+ * Get the list of call logs (past calls).
+ * @param[in] lc LinphoneCore object
+ * @return \mslist{LinphoneCallLog}
+**/
+LINPHONE_PUBLIC const MSList * linphone_core_get_call_logs(LinphoneCore *lc);
+
+/**
+ * Erase the call log.
+ * @param[in] lc LinphoneCore object
+**/
+LINPHONE_PUBLIC void linphone_core_clear_call_logs(LinphoneCore *lc);
/**
* Get the number of missed calls.
* Once checked, this counter can be reset with linphone_core_reset_missed_calls_count().
* @param[in] lc #LinphoneCore object.
* @returns The number of missed calls.
- * @ingroup call_logs
**/
-LINPHONE_PUBLIC int linphone_core_get_missed_calls_count(LinphoneCore *lc);
+LINPHONE_PUBLIC int linphone_core_get_missed_calls_count(LinphoneCore *lc);
/**
* Reset the counter of missed calls.
* @param[in] lc #LinphoneCore object.
- * @ingroup call_logs
**/
-LINPHONE_PUBLIC void linphone_core_reset_missed_calls_count(LinphoneCore *lc);
+LINPHONE_PUBLIC void linphone_core_reset_missed_calls_count(LinphoneCore *lc);
/**
* Remove a specific call log from call history list.
* This function destroys the call log object. It must not be accessed anymore by the application after calling this function.
* @param[in] lc #LinphoneCore object
* @param[in] call_log #LinphoneCallLog object to remove.
- * @ingroup call_logs
**/
-LINPHONE_PUBLIC void linphone_core_remove_call_log(LinphoneCore *lc, LinphoneCallLog *call_log);
+LINPHONE_PUBLIC void linphone_core_remove_call_log(LinphoneCore *lc, LinphoneCallLog *call_log);
+
+/**
+ * @}
+**/
+
/* video support */
LINPHONE_PUBLIC bool_t linphone_core_video_supported(LinphoneCore *lc);
diff --git a/coreapi/private.h b/coreapi/private.h
index 136c8189b..6ea57830e 100644
--- a/coreapi/private.h
+++ b/coreapi/private.h
@@ -824,6 +824,7 @@ void _linphone_core_codec_config_write(LinphoneCore *lc);
#ifndef NB_MAX_CALLS
#define NB_MAX_CALLS (10)
#endif
+void call_logs_read_from_config_file(LinphoneCore *lc);
void call_logs_write_to_config_file(LinphoneCore *lc);
int linphone_core_get_edge_bw(LinphoneCore *lc);