1
0
Fork 0
mirror of https://gitlab.gnome.org/GNOME/calls.git synced 2024-06-28 14:49:30 +00:00
Purism-Calls/src/calls-ui-call-data.c
Evangelos Ribeiro Tzaras f206b7d257 call: Rename property from "number" to "id"
The term number is not necessarily accurate when dealing with f.e. SIP.
2021-12-05 09:49:05 +01:00

386 lines
10 KiB
C

#include "calls-ui-call-data.h"
#include "calls-contacts-provider.h"
#include "calls-manager.h"
#include <cui-call.h>
enum {
PROP_0,
PROP_CALL,
PROP_DISPLAY_NAME,
PROP_ID,
PROP_STATE,
PROP_ENCRYPTED,
PROP_CAN_DTMF,
PROP_AVATAR_ICON,
PROP_LAST_PROP
};
static GParamSpec *props[PROP_LAST_PROP];
struct _CallsUiCallData
{
GObject parent_instance;
CallsCall *call;
CallsBestMatch *best_match;
};
static void calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface);
G_DEFINE_TYPE_WITH_CODE (CallsUiCallData, calls_ui_call_data, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (CUI_TYPE_CALL,
calls_ui_call_data_cui_call_interface_init))
struct DtmfData
{
CallsCall *call;
char dtmf;
};
static const char *
calls_ui_call_data_get_display_name (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), NULL);
g_return_val_if_fail (!!self->call, NULL);
return calls_best_match_get_name (self->best_match);
}
static const char *
calls_ui_call_data_get_id (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), NULL);
g_return_val_if_fail (!!self->call, NULL);
return calls_call_get_id (self->call);
}
static CuiCallState
calls_state_to_cui_call_state (CallsCallState state)
{
switch (state) {
case CALLS_CALL_STATE_ACTIVE:
return CUI_CALL_STATE_ACTIVE;
case CALLS_CALL_STATE_HELD:
return CUI_CALL_STATE_HELD;
case CALLS_CALL_STATE_DIALING:
return CUI_CALL_STATE_DIALING;
case CALLS_CALL_STATE_ALERTING:
return CUI_CALL_STATE_ALERTING;
case CALLS_CALL_STATE_INCOMING:
return CUI_CALL_STATE_INCOMING;
case CALLS_CALL_STATE_WAITING:
return CUI_CALL_STATE_WAITING;
case CALLS_CALL_STATE_DISCONNECTED:
return CUI_CALL_STATE_DISCONNECTED;
default:
return CUI_CALL_STATE_UNKNOWN;
}
}
static CuiCallState
calls_ui_call_data_get_state (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), CUI_CALL_STATE_UNKNOWN);
g_return_val_if_fail (!!self->call, CUI_CALL_STATE_UNKNOWN);
return calls_state_to_cui_call_state (calls_call_get_state (self->call));
}
static gboolean
calls_ui_call_data_get_encrypted (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), FALSE);
g_return_val_if_fail (!!self->call, FALSE);
return FALSE;
}
static gboolean
calls_ui_call_data_get_can_dtmf (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), FALSE);
g_return_val_if_fail (!!self->call, FALSE);
return calls_call_can_dtmf (self->call);
}
static GLoadableIcon *
calls_ui_call_data_get_avatar_icon (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_val_if_fail (CALLS_UI_CALL_DATA (self), NULL);
return calls_best_match_get_avatar (self->best_match);
}
static void
calls_ui_call_data_accept (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_if_fail (CALLS_IS_UI_CALL_DATA (self));
g_return_if_fail (!!self->call);
calls_call_answer (self->call);
}
static void
calls_ui_call_data_hang_up (CuiCall *call_data)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_if_fail (CALLS_IS_UI_CALL_DATA (self));
g_return_if_fail (!!self->call);
calls_call_hang_up (self->call);
}
static void
calls_ui_call_data_send_dtmf (CuiCall *call_data,
const char *dtmf)
{
CallsUiCallData *self = (CallsUiCallData *) call_data;
g_return_if_fail (CALLS_IS_UI_CALL_DATA (self));
g_return_if_fail (!!self->call);
calls_call_send_dtmf_tone (self->call, *dtmf);
}
static void
calls_ui_call_data_cui_call_interface_init (CuiCallInterface *iface)
{
iface->get_id = calls_ui_call_data_get_id;
iface->get_display_name = calls_ui_call_data_get_display_name;
iface->get_state = calls_ui_call_data_get_state;
iface->get_encrypted = calls_ui_call_data_get_encrypted;
iface->get_can_dtmf = calls_ui_call_data_get_can_dtmf;
iface->get_avatar_icon = calls_ui_call_data_get_avatar_icon;
iface->accept = calls_ui_call_data_accept;
iface->hang_up = calls_ui_call_data_hang_up;
iface->send_dtmf = calls_ui_call_data_send_dtmf;
}
static void
on_notify_state (CallsUiCallData *self)
{
g_assert (CALLS_IS_UI_CALL_DATA (self));
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_STATE]);
}
static void
on_notify_name (CallsUiCallData *self)
{
g_assert (CALLS_IS_UI_CALL_DATA (self));
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_DISPLAY_NAME]);
}
static void
on_notify_avatar (CallsUiCallData *self)
{
g_assert (CALLS_IS_UI_CALL_DATA (self));
g_object_notify_by_pspec (G_OBJECT (self), props[PROP_AVATAR_ICON]);
}
static void
set_call_data (CallsUiCallData *self,
CallsCall *call)
{
CallsManager *manager;
CallsContactsProvider *contacts_provider;
g_return_if_fail (CALLS_IS_UI_CALL_DATA (self));
g_return_if_fail (CALLS_IS_CALL (call));
manager = calls_manager_get_default ();
contacts_provider = calls_manager_get_contacts_provider (manager);
self->best_match =
calls_contacts_provider_lookup_id (contacts_provider,
calls_call_get_id (call));
g_signal_connect_object (self->best_match,
"notify::name",
G_CALLBACK (on_notify_name),
self,
G_CONNECT_SWAPPED);
g_signal_connect_object (self->best_match,
"notify::has-individual",
G_CALLBACK (on_notify_name),
self,
G_CONNECT_SWAPPED);
g_signal_connect_object (self->best_match,
"notify::avatar",
G_CALLBACK (on_notify_avatar),
self,
G_CONNECT_SWAPPED);
self->call = call;
g_signal_connect_object (self->call,
"notify::state",
G_CALLBACK (on_notify_state),
self,
G_CONNECT_SWAPPED);
}
static void
calls_ui_call_data_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
CallsUiCallData *self = CALLS_UI_CALL_DATA (object);
switch (property_id) {
case PROP_CALL:
// construct only
set_call_data (self, g_value_dup_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
calls_ui_call_data_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
CallsUiCallData *self = CALLS_UI_CALL_DATA (object);
CuiCall *cui_call = CUI_CALL (object);
switch (property_id) {
case PROP_CALL:
g_value_set_object (value, self->call);
break;
case PROP_DISPLAY_NAME:
g_value_set_string (value, calls_ui_call_data_get_display_name (cui_call));
break;
case PROP_ID:
g_value_set_string (value, calls_ui_call_data_get_id (cui_call));
break;
case PROP_STATE:
g_value_set_enum (value, calls_ui_call_data_get_state (cui_call));
break;
case PROP_ENCRYPTED:
g_value_set_boolean (value, calls_ui_call_data_get_encrypted (cui_call));
break;
case PROP_CAN_DTMF:
g_value_set_boolean (value, calls_ui_call_data_get_can_dtmf (cui_call));
break;
case PROP_AVATAR_ICON:
g_value_set_object (value, calls_ui_call_data_get_avatar_icon (cui_call));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
calls_ui_call_data_finalize (GObject *object)
{
CallsUiCallData *self = CALLS_UI_CALL_DATA (object);
g_object_unref (self->call);
g_object_unref (self->best_match);
G_OBJECT_CLASS (calls_ui_call_data_parent_class)->finalize (object);
}
static void
calls_ui_call_data_init (CallsUiCallData *self)
{
}
static void
calls_ui_call_data_class_init (CallsUiCallDataClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->set_property = calls_ui_call_data_set_property;
object_class->get_property = calls_ui_call_data_get_property;
object_class->finalize = calls_ui_call_data_finalize;
props[PROP_CALL] =
g_param_spec_object ("call",
"Call",
"The call",
CALLS_TYPE_CALL,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS);
g_object_class_install_property (object_class, PROP_CALL, props[PROP_CALL]);
g_object_class_override_property (object_class, PROP_ID, "id");
props[PROP_ID] = g_object_class_find_property (object_class, "id");
g_object_class_override_property (object_class, PROP_DISPLAY_NAME, "display-name");
props[PROP_DISPLAY_NAME] = g_object_class_find_property (object_class, "display-name");
g_object_class_override_property (object_class, PROP_STATE, "state");
props[PROP_STATE] = g_object_class_find_property (object_class, "state");
g_object_class_override_property (object_class, PROP_ENCRYPTED, "encrypted");
props[PROP_ENCRYPTED] = g_object_class_find_property (object_class, "encrypted");
g_object_class_override_property (object_class, PROP_CAN_DTMF, "can-dtmf");
props[PROP_CAN_DTMF] = g_object_class_find_property (object_class, "can-dtmf");
g_object_class_override_property (object_class, PROP_AVATAR_ICON, "avatar-icon");
props[PROP_AVATAR_ICON] = g_object_class_find_property (object_class, "avatar-icon");
}
CallsUiCallData *
calls_ui_call_data_new (CallsCall *call)
{
return g_object_new (CALLS_TYPE_UI_CALL_DATA, "call", call, NULL);
}
CallsCall *
calls_ui_call_data_get_call (CallsUiCallData *self)
{
g_return_val_if_fail (CALLS_IS_UI_CALL_DATA (self), NULL);
return self->call;
}