Commit 4816b846 authored by Tristan Matthews's avatar Tristan Matthews

* #6623: refactored callable object, removed leaks

parent 16f29939
......@@ -359,8 +359,8 @@ gboolean sflphone_init (GError **error)
if (!dbus_register (getpid (), "Gtk+ Client", error)) {
return FALSE;
}
abookfactory_init_factory();
abookfactory_init_factory();
// Init icons factory
init_icon_factory ();
......@@ -763,8 +763,7 @@ sflphone_new_call()
if (calllist_get_size (current_calls) == 0)
dbus_start_tone (TRUE , (current_account_has_new_message () > 0) ? TONE_WITH_MESSAGE : TONE_WITHOUT_MESSAGE) ;
callable_obj_t *c;
create_new_call (CALL, CALL_STATE_DIALING, "", "", "", "", &c);
callable_obj_t *c = create_new_call (CALL, CALL_STATE_DIALING, "", "", "", "");
c->_history_state = OUTGOING;
......@@ -984,9 +983,9 @@ static int _place_registered_call (callable_obj_t * c)
}
c->_history_state = OUTGOING;
calllist_add_call (history, c);
calltree_add_call (history, c, NULL);
calltree_add_call (history, c, NULL);
return 0;
}
......@@ -1237,7 +1236,7 @@ void sflphone_fill_codec_list_per_account (account_t **account)
guint caps_size = codec_list_get_size (), i=0;
for (i=0; i<caps_size; i++) {
for (i = 0; i < caps_size; i++) {
codec_t * current_cap = capabilities_get_nth (i);
......@@ -1247,38 +1246,33 @@ void sflphone_fill_codec_list_per_account (account_t **account)
// codec_create_new_from_caps (current_cap, &cpy);
current_cap->is_active = active;
codec_list_add (current_cap, &codeclist);
} else {
}
}
(*account)->codecs = codeclist;
}
void sflphone_fill_call_list (void)
{
gchar** calls = (gchar**) dbus_get_call_list();
GHashTable *call_details;
callable_obj_t *c;
gchar *callID;
DEBUG ("sflphone_fill_call_list");
if (calls) {
for (; *calls; calls++) {
c = g_new0 (callable_obj_t, 1);
callID = (gchar*) (*calls);
call_details = dbus_get_call_details (callID);
create_new_call_from_details (callID, call_details, &c);
c->_callID = g_strdup (callID);
c->_zrtp_confirmed = FALSE;
// Add it to the list
DEBUG ("Add call retrieved from server side: %s\n", c->_callID);
calllist_add_call (current_calls, c);
// Update the GUI
calltree_add_call (current_calls, c, NULL);
}
if (!calls)
return;
for (; *calls; calls++) {
callable_obj_t *c = g_new0 (callable_obj_t, 1);
gchar *callID = (gchar*) (*calls);
call_details = dbus_get_call_details (callID);
c = create_new_call_from_details (callID, call_details);
g_free(callID);
c->_zrtp_confirmed = FALSE;
// Add it to the list
DEBUG ("Add call retrieved from server side: %s\n", c->_callID);
calllist_add_call (current_calls, c);
// Update the GUI
calltree_add_call (current_calls, c, NULL);
}
}
......@@ -1326,61 +1320,59 @@ void sflphone_fill_history (void)
while (*entries) {
gchar *current_entry = *entries;
// Parsed a conference
if(g_str_has_prefix(current_entry, "9999")) {
// create a conference entry
create_conference_history_entry_from_serialized(current_entry, &history_conf);
// verify if this conference have been already created yet
conf = conferencelist_get(history, history_conf->_confID);
if(conf == NULL) {
// if this conference haven't been created yet, add it to the conference list
conferencelist_add(history, history_conf);
}
else {
// if this conference is already created since one of the participant have already
// been unserialized, update the recordfile value
conf->_recordfile = g_strdup(history_conf->_recordfile);
}
}
else {
// Parsed a conference
if(g_str_has_prefix(current_entry, "9999")) {
// create a conference entry
create_conference_history_entry_from_serialized(current_entry, &history_conf);
// verify if this conference have been already created yet
conf = conferencelist_get(history, history_conf->_confID);
if(conf == NULL) {
// if this conference haven't been created yet, add it to the conference list
conferencelist_add(history, history_conf);
}
else {
// if this conference is already created since one of the participant have already
// been unserialized, update the recordfile value
conf->_recordfile = g_strdup(history_conf->_recordfile);
}
}
else {
// do something with key and value
create_history_entry_from_serialized_form (current_entry, &history_call);
// Add it and update the GUI
calllist_add_call (history, history_call);
history_call = create_history_entry_from_serialized_form (current_entry);
if(history_call->_confID && g_strcmp0(history_call->_confID, "") != 0) {
// Add it and update the GUI
calllist_add_call (history, history_call);
// process conference
conf = conferencelist_get(history, history_call->_confID);
if(conf == NULL) {
// conference does not exist yet, create it
create_new_conference(CONFERENCE_STATE_ACTIVE_ATACHED, history_call->_confID, &conf);
conferencelist_add(history, conf);
}
// add this participant to the conference
conference_add_participant(history_call->_callID, conf);
if (history_call->_confID && g_strcmp0(history_call->_confID, "") != 0) {
// conference start timestamp corespond to
if(conf->_time_start > history_call->_time_added) {
conf->_time_start = history_call->_time_added;
// process conference
conf = conferencelist_get(history, history_call->_confID);
if (!conf) {
// conference does not exist yet, create it
create_new_conference(CONFERENCE_STATE_ACTIVE_ATACHED, history_call->_confID, &conf);
conferencelist_add(history, conf);
}
}
// add this participant to the conference
conference_add_participant(history_call->_callID, conf);
// conference start timestamp corespond to
if (conf->_time_start > history_call->_time_added)
conf->_time_start = history_call->_time_added;
}
}
g_free(*entries++);
g_free(*entries++);
}
g_free(entries_orig);
// fill the treeview with calls
n = calllist_get_size(history);
for(i = 0; i < n; i++) {
element = calllist_get_nth(history, i);
if(element->type == HIST_CALL) {
call = element->elem.call;
element = calllist_get_nth(history, i);
if(element->type == HIST_CALL) {
call = element->elem.call;
calltree_add_call (history, call, NULL);
}
}
......@@ -1389,21 +1381,19 @@ void sflphone_fill_history (void)
n = conferencelist_get_size(history);
for(i = 0; i < n; i++) {
conference_obj_t *conf = conferencelist_get_nth(history, i);
if(conf == NULL) {
DEBUG("SFLphone: Error: Could not find conference");
}
calltree_add_conference(history, conf);
}
if (!conf)
DEBUG("SFLphone: Error: Could not find conference");
calltree_add_conference(history, conf);
}
}
#if ! (GLIB_CHECK_VERSION(2,28,0))
static void
g_slist_free_full (GSList *list,
GDestroyNotify free_func)
GDestroyNotify free_func)
{
g_slist_foreach (list, (GFunc) free_func, NULL);
g_slist_free (list);
g_slist_foreach (list, (GFunc) free_func, NULL);
g_slist_free (list);
}
#endif
......@@ -1426,8 +1416,8 @@ void sflphone_save_history (void)
for (i = 0; i < size; i++) {
current = calllist_get_nth (history, i);
if (!current) {
WARN("SFLphone: Warning: %dth element is null", i);
break;
WARN("SFLphone: Warning: %dth element is null", i);
break;
}
gchar *value;
......@@ -1442,22 +1432,22 @@ void sflphone_save_history (void)
gchar *key = convert_timestamp_to_gchar (current->elem.call->_time_start);
g_hash_table_replace (result, (gpointer) key,
g_slist_append(g_hash_table_lookup(result, key),(gpointer) value));
g_slist_append(g_hash_table_lookup(result, key),(gpointer) value));
}
size = conferencelist_get_size(history);
for(i = 0; i < size; i++) {
conf = conferencelist_get_nth(history, i);
if(!conf) {
DEBUG("SFLphone: Error: Could not get %dth conference", i);
break;
if(!conf) {
DEBUG("SFLphone: Error: Could not get %dth conference", i);
break;
}
gchar *value = serialize_history_conference_entry(conf);
gchar *key = convert_timestamp_to_gchar(conf->_time_start);
gchar *key = convert_timestamp_to_gchar(conf->_time_start);
g_hash_table_replace(result, (gpointer) key,
g_slist_append(g_hash_table_lookup(result, key), (gpointer) value));
g_hash_table_replace(result, (gpointer) key,
g_slist_append(g_hash_table_lookup(result, key), (gpointer) value));
}
gchar **ordered_result = sflphone_order_history_hash_table(result);
......@@ -1601,8 +1591,7 @@ void sflphone_get_interface_addr_from_name (char *iface_name, char **iface_addr,
tmp_addr = (char *) addr_in;
snprintf (*iface_addr, size, "%d.%d.%d.%d",
UC (tmp_addr[0]), UC (tmp_addr[1]), UC (tmp_addr[2]), UC (tmp_addr[3]));
UC (tmp_addr[0]), UC (tmp_addr[1]), UC (tmp_addr[2]), UC (tmp_addr[3]));
close (fd);
}
......@@ -36,10 +36,6 @@
#include <unistd.h>
#define UNIX_DAY 86400
#define UNIX_WEEK 86400 * 6
#define UNIX_TWO_DAYS 86400 * 2
gint get_state_callstruct (gconstpointer a, gconstpointer b)
{
callable_obj_t * c = (callable_obj_t*) a;
......@@ -188,12 +184,11 @@ void stop_call_clock (callable_obj_t *c)
}
}
void create_new_call (callable_type_t type, call_state_t state,
callable_obj_t *create_new_call (callable_type_t type, call_state_t state,
const gchar* const callID,
const gchar* const accountID,
const gchar* const peer_name,
const gchar* const peer_number,
callable_obj_t ** new_call)
const gchar* const peer_number)
{
GError *err1 = NULL ;
callable_obj_t *obj;
......@@ -252,12 +247,11 @@ void create_new_call (callable_type_t type, call_state_t state,
obj->_time_added = 0;
*new_call = obj;
return obj;
}
void create_new_call_from_details (const gchar *call_id, GHashTable *details, callable_obj_t **call)
callable_obj_t *create_new_call_from_details (const gchar *call_id, GHashTable *details)
{
callable_obj_t *new_call;
call_state_t state;
const gchar * const accountID = g_hash_table_lookup (details, "ACCOUNTID");
......@@ -283,11 +277,10 @@ void create_new_call_from_details (const gchar *call_id, GHashTable *details, ca
else
state = CALL_STATE_FAILURE;
create_new_call (CALL, state, call_id, accountID, peer_name, call_get_peer_number (peer_number), &new_call);
*call = new_call;
return create_new_call (CALL, state, call_id, accountID, peer_name, call_get_peer_number (peer_number));
}
void create_history_entry_from_serialized_form (gchar *entry, callable_obj_t **call)
callable_obj_t *create_history_entry_from_serialized_form (const gchar *entry)
{
const gchar *peer_name = "";
const gchar *peer_number = "";
......@@ -304,7 +297,7 @@ void create_history_entry_from_serialized_form (gchar *entry, callable_obj_t **c
gchar ** ptr;
gchar ** ptr_orig;
static const gchar * const delim = "|";
ptr = g_strsplit(entry, delim, 10);
ptr_orig = ptr;
while (ptr != NULL && token < 10) {
......@@ -350,7 +343,7 @@ void create_history_entry_from_serialized_form (gchar *entry, callable_obj_t **c
if (g_strcasecmp (peer_name, "empty") == 0)
peer_name = "";
create_new_call (HISTORY_ENTRY, CALL_STATE_DIALING, callID, accountID, peer_name, peer_number, &new_call);
new_call = create_new_call (HISTORY_ENTRY, CALL_STATE_DIALING, callID, accountID, peer_name, peer_number);
new_call->_history_state = history_state;
new_call->_time_start = convert_gchar_to_timestamp (time_start);
new_call->_time_stop = convert_gchar_to_timestamp (time_stop);
......@@ -360,8 +353,8 @@ void create_history_entry_from_serialized_form (gchar *entry, callable_obj_t **c
new_call->_time_added = convert_gchar_to_timestamp(time_start);
new_call->_record_is_playing = FALSE;
*call = new_call;
g_strfreev(ptr_orig);
return new_call;
}
void free_callable_obj_t (callable_obj_t *c)
......@@ -500,6 +493,9 @@ gchar* serialize_history_call_entry (callable_obj_t *entry)
// gchar* get_formatted_start_timestamp (callable_obj_t *obj)
gchar *get_formatted_start_timestamp (time_t time_start)
{
enum { UNIX_DAY = 86400,
UNIX_WEEK = UNIX_DAY * 6,
UNIX_TWO_DAYS = UNIX_DAY * 2};
struct tm* ptr;
time_t lt, now;
......
......@@ -178,11 +178,11 @@ typedef struct {
} callable_obj_t;
void create_new_call (callable_type_t, call_state_t, const gchar* const, const gchar* const, const gchar* const, const gchar* const, callable_obj_t **);
callable_obj_t *create_new_call (callable_type_t, call_state_t, const gchar* const, const gchar* const, const gchar* const, const gchar* const);
void create_new_call_from_details (const gchar *, GHashTable *, callable_obj_t **);
callable_obj_t *create_new_call_from_details (const gchar *, GHashTable *);
void create_history_entry_from_serialized_form (gchar *, callable_obj_t **);
callable_obj_t *create_history_entry_from_serialized_form (const gchar *);
void call_add_error (callable_obj_t * call, gpointer dialog);
......
......@@ -66,7 +66,7 @@ void calllist_add_contact (gchar *contact_name, gchar *contact_phone, contact_ty
/* Check if the information is valid */
if (g_strcasecmp (contact_phone, EMPTY_ENTRY) != 0) {
create_new_call (CONTACT, CALL_STATE_DIALING, "", "", contact_name, contact_phone, &new_call);
new_call = create_new_call (CONTACT, CALL_STATE_DIALING, "", "", contact_name, contact_phone);
// Attach a pixbuf to a contact
if (photo) {
......
......@@ -221,8 +221,7 @@ row_activated (GtkTreeView *tree_view UNUSED,
}
} else {
// If history or contact: double click action places a new call
callable_obj_t* new_call;
create_new_call (CALL, CALL_STATE_DIALING, "", selectedCall->_accountID, selectedCall->_peer_name, selectedCall->_peer_number, &new_call);
callable_obj_t* new_call = create_new_call (CALL, CALL_STATE_DIALING, "", selectedCall->_accountID, selectedCall->_peer_name, selectedCall->_peer_number);
calllist_add_call(current_calls, new_call);
calltree_add_call (current_calls, new_call, NULL);
......
......@@ -128,14 +128,13 @@ static void
new_call_created_cb (DBusGProxy *proxy UNUSED, const gchar *accountID,
const gchar *callID, const gchar *to, void *foo UNUSED)
{
callable_obj_t *c;
const gchar *peer_name = to;
const gchar *peer_number = to;
DEBUG("DBUS: New Call (%s) created to (%s)", callID, to);
create_new_call(CALL, CALL_STATE_RINGING, callID, accountID,
peer_name, peer_number, &c);
callable_obj_t *c = create_new_call(CALL, CALL_STATE_RINGING, callID, accountID,
peer_name, peer_number);
set_timestamp(&c->_time_start);
......@@ -164,8 +163,8 @@ incoming_call_cb (DBusGProxy *proxy UNUSED, const gchar* accountID,
DEBUG ("DBus incoming peer name: %s", peer_name);
DEBUG ("DBus incoming peer number: %s", peer_number);
create_new_call (CALL, CALL_STATE_INCOMING, callID, accountID, peer_name,
peer_number, &c);
c = create_new_call (CALL, CALL_STATE_INCOMING, callID, accountID, peer_name,
peer_number);
#if GTK_CHECK_VERSION(2,10,0)
status_tray_icon_blink (TRUE);
popup_main_window();
......@@ -298,7 +297,6 @@ call_state_cb (DBusGProxy *proxy UNUSED, const gchar* callID, const gchar* state
if ((strcmp (state, "RINGING")) == 0 ||
(strcmp (state, "CURRENT")) == 0 ||
(strcmp (state, "RECORD"))) {
callable_obj_t *new_call;
GHashTable *call_details;
gchar *type;
......@@ -306,7 +304,7 @@ call_state_cb (DBusGProxy *proxy UNUSED, const gchar* callID, const gchar* state
// We fetch the details associated to the specified call
call_details = dbus_get_call_details (callID);
create_new_call_from_details (callID, call_details, &new_call);
callable_obj_t *new_call = create_new_call_from_details (callID, call_details);
// Restore the callID to be synchronous with the daemon
new_call->_callID = g_strdup (callID);
......
......@@ -678,8 +678,8 @@ call_pick_up (void * foo UNUSED)
selectedCall = calltab_get_selected_call(active_calltree);
if (selectedCall) {
create_new_call (CALL, CALL_STATE_DIALING, "", "", "",
selectedCall->_peer_number, &new_call);
new_call = create_new_call (CALL, CALL_STATE_DIALING, "", "", "",
selectedCall->_peer_number);
calllist_add_call (current_calls, new_call);
calltree_add_call (current_calls, new_call, NULL);
......@@ -835,8 +835,8 @@ call_back (void * foo UNUSED)
return;
}
create_new_call (CALL, CALL_STATE_DIALING, "", "",
selected_call->_peer_name, selected_call->_peer_number, &new_call);
new_call = create_new_call (CALL, CALL_STATE_DIALING, "", "",
selected_call->_peer_name, selected_call->_peer_number);
calllist_add_call (current_calls, new_call);
calltree_add_call (current_calls, new_call, NULL);
......@@ -1015,8 +1015,7 @@ call_mailbox_cb (void)
to = g_strdup (g_hash_table_lookup (current->properties, ACCOUNT_MAILBOX));
account_id = g_strdup (current->accountID);
create_new_call (CALL, CALL_STATE_DIALING, "", account_id, _ ("Voicemail"), to,
&mailbox_call);
mailbox_call = create_new_call (CALL, CALL_STATE_DIALING, "", account_id, _ ("Voicemail"), to);
g_free(to);
g_free(account_id);
DEBUG ("TO : %s" , mailbox_call->_peer_number);
......@@ -1671,17 +1670,13 @@ show_popup_menu_contacts (GtkWidget *my_widget, GdkEventButton *event)
static void
ok_cb (GtkWidget *widget UNUSED, gpointer userdata)
{
gchar *new_number;
callable_obj_t *modified_call, *original;
// Change the number of the selected call before calling
new_number = (gchar*) gtk_entry_get_text (GTK_ENTRY (editable_num));
original = (callable_obj_t*) userdata;
const gchar * const new_number = (gchar*) gtk_entry_get_text (GTK_ENTRY (editable_num));
callable_obj_t *original = (callable_obj_t*) userdata;
// Create the new call
create_new_call (CALL, CALL_STATE_DIALING, "", original->_accountID,
original->_peer_name, new_number, &modified_call);
callable_obj_t *modified_call = create_new_call (CALL, CALL_STATE_DIALING, "", original->_accountID,
original->_peer_name, new_number);
// Update the internal data structure and the GUI
calllist_add_call (current_calls, modified_call);
......
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