Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • marin/ModemManager
  • mobile-broadband/ModemManager
  • lkundrak/ModemManager
  • t-8ch/ModemManager
  • rah/ModemManager
  • benchan/ModemManager
  • claudep/ModemManager
  • ebassi/ModemManager
  • dcbw/ModemManager
  • alfonsosanchezbeato/ModemManager
  • xingnifeng/ModemManager
  • paulbartell/ModemManager
  • MiloCasagrande/ModemManager
  • afett/ModemManager
  • svenschwermer/ModemManager
  • cancanxinxin/ModemManager
  • mjablonsky/ModemManager
  • vicamo/ModemManager
  • kraj/ModemManager
  • lisablanco777/ModemManager
  • Laymer/ModemManager
  • mahatma/ModemManager
  • ejcaruso/ModemManager
  • scootergrisen/ModemManager
  • fran.dieguez/ModemManager
  • bgalvani/ModemManager
  • dnlplm/ModemManager
  • c.lobrano/ModemManager
  • lingzangwuhen/ModemManager
  • aleksm/ModemManager
  • alexanderyashin/ModemManager
  • welaq/ModemManager
  • wi24rd/ModemManager
  • sadiq/ModemManager
  • Linaro/ModemManager
  • HED-mstarr/ModemManager
  • kdrobinski/ModemManager
  • emintufan/ModemManager
  • yurchor/ModemManager
  • rafaelff/ModemManager
  • remuswu1019/ModemManager
  • Fanice.luo/ModemManager
  • roman.stratiienko/ModemManager
  • mno294163/ModemManager
  • mozzwald/ModemManager
  • andika/ModemManager
  • fiziyr/ModemManager
  • teijo.kinnunen/ModemManager
  • dakhouya/ModemManager
  • gci/ModemManager
  • alexcani109/ModemManager
  • ArenM/ModemManager
  • bpeterlytx/ModemManager
  • Hagstrom/ModemManager
  • aplazas/ModemManager
  • justinsg/ModemManager
  • carlyin/ModemManager
  • dle0/ModemManager
  • jessy.diamondman/ModemManager
  • steven831926/ModemManager
  • nytowl/ModemManager
  • prescott66/ModemManager
  • ajonsson/ModemManager
  • mkm/ModemManager
  • pholla/ModemManager
  • wicadmin/ModemManager
  • deng.yi/ModemManager
  • madhavadas/ModemManager
  • fmartinsons/ModemManager
  • Nananas/ModemManager
  • loicpoulain/ModemManager
  • rafal.mszal/ModemManager
  • dylanvanassche/ModemManager
  • myrkr/ModemManager
  • mobilekiller742/ModemManager
  • maorui/ModemManager
  • timo.jyrinki/ModemManager
  • luksen/ModemManager
  • stoehraj/ModemManager
  • vpalatin/ModemManager
  • yaron/ModemManager
  • yegorslists/ModemManager
  • NorwayFun/ModemManager
  • takc923/ModemManager
  • zrshuo.zhang/ModemManager
  • zhuzhaoyu_fibocom/ModemManager
  • bentiss/ModemManager
  • Som_SP/ModemManager
  • KingSun/ModemManager
  • eliasr/ModemManager
  • craftyguy/ModemManager
  • 3378897661/ModemManager
  • ShivakuS/ModemManager
  • bmork/ModemManager
  • ivan.mikhanchuk/ModemManager
  • SimonGuan/ModemManager
  • ziyou/ModemManager
  • juliandehm/ModemManager
  • Jarrah/ModemManager
  • a-wai/ModemManager
  • ZhangMingjie/ModemManager
  • felipeborges/ModemManager
  • dirksu/ModemManager
  • conklinjames175/ModemManager
  • agupta/ModemManager
  • Jarvis-Jiang-G/ModemManager
  • qyliss/ModemManager
  • UnitacSW/ModemManager
  • joelselvaraj/ModemManager
  • mips171/ModemManager
  • LeSpocky/ModemManager
  • Benoit_Monin/ModemManager
  • inigomartinez/ModemManager
  • humb3rtoguti3rr3z/ModemManager
  • tpikonen/ModemManager
  • awaittrot/ModemManager
  • prakash_p/ModemManager
  • florencewchan/ModemManager
  • shawnguo/ModemManager
  • seabass/ModemManager
  • laeyraud/ModemManager
  • maciejsszmigiero/ModemManager
  • dansebcar/ModemManager
  • Shiva/ModemManager
  • stranche/ModemManager
  • anugrah/ModemManager
  • matthewvia/ModemManager
  • umohr/ModemManager
  • matlinuxer2/ModemManager
  • feckert/ModemManager
  • jakko/ModemManager
  • elguap0x0/ModemManager
  • Project0/ModemManager
  • Pac-Man/ModemManager
  • raphj/ModemManager
  • DadiBit/modem-manager
  • pholla1/ModemManager
  • jinjian.song/ModemManager
  • nathangoulding/ModemManager
  • sc0w/ModemManager
  • guisil/ModemManager
  • arbruijn/ModemManager
  • alor/ModemManager
  • andrewlassalle/ModemManager
  • sdeziel/ModemManager
  • troth/ModemManager
  • Stephan/ModemManager
  • nfollens/ModemManager
  • kzapalowicz/ModemManager
  • alad/ModemManager
  • quic_akasagga/ModemManager
  • rmao/ModemManager
  • chrta/ModemManager
  • nicholas123/ModemManager
  • aa13q/ModemManager
  • chandupokuru/ModemManager
  • dskorykh/ModemManager
  • skv/ModemManager
  • shawn.xiao/ModemManager
  • pineapplefurly/ModemManager
  • tsabsch/ModemManager
  • hthiery/ModemManager
  • devrtz/ModemManager
  • haata/ModemManager
  • okaestne/ModemManager
  • nmarupaka/ModemManager
  • simdeveloper/ModemManager
  • ShaneParslow/ModemManager
  • dukexinaw/ModemManager
  • james.fu/ModemManager
  • dchard/ModemManager
  • lvoegl/ModemManager
  • zaripov-kamil/ModemManager
  • kbuksha/ModemManager
  • dos/ModemManager
  • airsoup/ModemManager
  • mafolk/ModemManager
  • tomwimmenhove/ModemManager
  • Lauszus/ModemManager
  • ujjwalpande/ModemManager
  • jordimas/ModemManager
  • diekleinekuh/ModemManager
  • agx/ModemManager
  • PeterK/ModemManager
  • QuectelDuke/ModemManager
  • Lupuliang/ModemManager
  • sinaro/ModemManager
  • Jerry.Meng/ModemManager
  • dahopem/ModemManager
  • robimarko/ModemManager
  • ausil/ModemManager
  • Ming-Pei/ModemManager
  • mkrle/ModemManager
  • PaulosV/ModemManager
  • fabio.porcedda/ModemManager
  • kop316/ModemManager
  • rgenoud/ModemManager
  • janro/ModemManager
  • RICCIARDI-Adrien/ModemManager
  • Garfield/ModemManager
  • nt8r/ModemManager
  • floris.sm/ModemManager
  • quic_krelangi/ModemManager
  • bolan/ModemManager
  • svalery/ModemManager
  • kevlhop/ModemManager
  • evetsso/ModemManager
  • i-tek/ModemManager
  • vanillan/ModemManager
  • jean/ModemManager
  • tuxor1337/ModemManager
  • lupuliang5/ModemManager
  • fuzzy7k/ModemManager
  • piotrdrag/ModemManager
  • asusmith/ModemManager
  • mank/ModemManager
  • sleirsgoevy/ModemManager
  • quic_asusmith/ModemManager
  • cs99/ModemManager
  • barracuda156/ModemManager
  • anaghg/ModemManager
  • stigma/ModemManager
  • biemster/ModemManager
  • zolfa/ModemManager
  • Mank-Netprisma/ModemManager
  • andrew-sayers/ModemManager
  • jmkim/ModemManager
  • maldiran/ModemManager
  • Mank.Wang/ModemManager
229 results
Show changes
......@@ -23,6 +23,7 @@
#include <libmm-glib.h>
#include "mm-base-modem.h"
#include "mm-call-audio-format.h"
#define MM_TYPE_BASE_CALL (mm_base_call_get_type ())
#define MM_BASE_CALL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_BASE_CALL, MMBaseCall))
......@@ -35,9 +36,11 @@ typedef struct _MMBaseCall MMBaseCall;
typedef struct _MMBaseCallClass MMBaseCallClass;
typedef struct _MMBaseCallPrivate MMBaseCallPrivate;
#define MM_BASE_CALL_PATH "call-path"
#define MM_BASE_CALL_CONNECTION "call-connection"
#define MM_BASE_CALL_MODEM "call-modem"
#define MM_BASE_CALL_PATH "call-path"
#define MM_BASE_CALL_CONNECTION "call-connection"
#define MM_BASE_CALL_MODEM "call-modem"
#define MM_BASE_CALL_SUPPORTS_DIALING_TO_RINGING "call-supports-dialing-to-ringing"
#define MM_BASE_CALL_SUPPORTS_RINGING_TO_ACTIVE "call-supports-ringing-to-active"
struct _MMBaseCall {
MmGdbusCallSkeleton parent;
......@@ -80,37 +83,47 @@ struct _MMBaseCallClass {
GAsyncResult *res,
GError **error);
/* Delete the call */
void (* delete) (MMBaseCall *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (* delete_finish) (MMBaseCall *self,
GAsyncResult *res,
GError **error);
/* Setup/cleanup in-call unsolicited events */
gboolean (* setup_unsolicited_events) (MMBaseCall *self,
GError **error);
gboolean (* cleanup_unsolicited_events) (MMBaseCall *self,
GError **error);
/* Setup/cleanup audio channel */
void (* setup_audio_channel) (MMBaseCall *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (* setup_audio_channel_finish) (MMBaseCall *self,
GAsyncResult *res,
MMPort **audio_port,
MMCallAudioFormat **audio_format,
GError **error);
void (* cleanup_audio_channel) (MMBaseCall *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean (* cleanup_audio_channel_finish) (MMBaseCall *self,
GAsyncResult *res,
GError **error);
};
GType mm_base_call_get_type (void);
/* This one can be overridden by plugins */
MMBaseCall *mm_base_call_new (MMBaseModem *modem);
MMBaseCall *mm_base_call_new_from_properties (MMBaseModem *modem,
MMCallProperties *properties,
GError **error);
void mm_base_call_export (MMBaseCall *self);
void mm_base_call_unexport (MMBaseCall *self);
const gchar *mm_base_call_get_path (MMBaseCall *self);
void mm_base_call_change_state (MMBaseCall *self,
MMCallState new_state,
MMCallStateReason reason);
void mm_base_call_received_dtmf (MMBaseCall *self,
const gchar *dtmf);
void mm_base_call_delete (MMBaseCall *self,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean mm_base_call_delete_finish (MMBaseCall *self,
GAsyncResult *res,
GError **error);
/* This one can be overriden by plugins */
MMBaseCall *mm_base_call_new (MMBaseModem *modem,
MMCallDirection direction,
const gchar *number);
void mm_base_call_export (MMBaseCall *self);
void mm_base_call_unexport (MMBaseCall *self);
const gchar *mm_base_call_get_path (MMBaseCall *self);
void mm_base_call_change_state (MMBaseCall *self,
MMCallState new_state,
MMCallStateReason reason);
void mm_base_call_received_dtmf (MMBaseCall *self,
const gchar *dtmf);
void mm_base_call_incoming_refresh (MMBaseCall *self);
#endif /* MM_BASE_CALL_H */
......@@ -6928,7 +6928,7 @@ ring_received (MMPortSerialAt *port,
MMBroadbandModem *self)
{
mm_dbg ("Ringing");
mm_iface_modem_voice_create_incoming_call (MM_IFACE_MODEM_VOICE (self));
mm_iface_modem_voice_report_incoming_call (MM_IFACE_MODEM_VOICE (self), NULL);
}
static void
......@@ -6936,7 +6936,6 @@ cring_received (MMPortSerialAt *port,
GMatchInfo *info,
MMBroadbandModem *self)
{
/* The match info gives us in which storage the index applies */
gchar *str;
/* We could have "VOICE" or "DATA". Now consider only "VOICE" */
......@@ -6945,7 +6944,7 @@ cring_received (MMPortSerialAt *port,
mm_dbg ("Ringing (%s)", str);
g_free (str);
mm_iface_modem_voice_create_incoming_call (MM_IFACE_MODEM_VOICE (self));
mm_iface_modem_voice_report_incoming_call (MM_IFACE_MODEM_VOICE (self), NULL);
}
static void
......@@ -6953,24 +6952,11 @@ clip_received (MMPortSerialAt *port,
GMatchInfo *info,
MMBroadbandModem *self)
{
/* The match info gives us in which storage the index applies */
gchar *str;
str = mm_get_string_unquoted_from_match_info (info, 1);
if (str) {
guint validity = 0;
guint type = 0;
mm_get_uint_from_match_info (info, 2, &type);
mm_get_uint_from_match_info (info, 3, &validity);
mm_dbg ("Caller ID received: number '%s', type '%d', validity '%d'", str, type, validity);
mm_iface_modem_voice_update_incoming_call_number (MM_IFACE_MODEM_VOICE (self), str, type, validity);
g_free (str);
}
mm_iface_modem_voice_report_incoming_call (MM_IFACE_MODEM_VOICE (self), str);
g_free (str);
}
static void
......@@ -7115,9 +7101,11 @@ modem_voice_enable_unsolicited_events (MMIfaceModemVoice *self,
/* Create CALL (Voice interface) */
static MMBaseCall *
modem_voice_create_call (MMIfaceModemVoice *self)
modem_voice_create_call (MMIfaceModemVoice *self,
MMCallDirection direction,
const gchar *number)
{
return mm_base_call_new (MM_BASE_MODEM (self));
return mm_base_call_new (MM_BASE_MODEM (self), direction, number);
}
/*****************************************************************************/
......
......@@ -84,137 +84,33 @@ mm_call_list_get_paths (MMCallList *self)
/*****************************************************************************/
MMBaseCall *
mm_call_list_get_new_incoming (MMCallList *self)
mm_call_list_get_first_ringing_in_call (MMCallList *self)
{
MMBaseCall *call = NULL;
GList *l;
for (l = self->priv->list; l; l = g_list_next (l)) {
MMBaseCall *call;
MMCallState state;
MMCallStateReason reason;
MMCallDirection direct;
g_object_get (MM_BASE_CALL (l->data),
"state", &state,
"state-reason", &reason,
"direction", &direct,
NULL);
if (direct == MM_CALL_DIRECTION_INCOMING &&
state == MM_CALL_STATE_RINGING_IN &&
reason == MM_CALL_STATE_REASON_INCOMING_NEW ) {
call = MM_BASE_CALL (l->data);
break;
}
}
return call;
}
MMBaseCall *
mm_call_list_get_first_ringing_call (MMCallList *self)
{
MMBaseCall *call = NULL;
GList *l;
for (l = self->priv->list; l; l = g_list_next (l)) {
MMCallState state;
g_object_get (MM_BASE_CALL (l->data),
"state", &state,
NULL);
if (state == MM_CALL_STATE_RINGING_IN ||
state == MM_CALL_STATE_RINGING_OUT) {
call = MM_BASE_CALL (l->data);
break;
}
}
MMCallDirection direction;
return call;
}
MMBaseCall *
mm_call_list_get_first_outgoing_dialing_call (MMCallList *self)
{
MMBaseCall *call = NULL;
GList *l;
call = MM_BASE_CALL (l->data);
for (l = self->priv->list; l; l = g_list_next (l)) {
MMCallState state;
MMCallDirection direction;
g_object_get (MM_BASE_CALL (l->data),
g_object_get (call,
"state", &state,
"direction", &direction,
NULL);
if (direction == MM_CALL_DIRECTION_OUTGOING &&
state == MM_CALL_STATE_DIALING) {
call = MM_BASE_CALL (l->data);
break;
}
}
return call;
}
MMBaseCall *
mm_call_list_get_first_non_terminated_call (MMCallList *self)
{
MMBaseCall *call = NULL;
GList *l;
for (l = self->priv->list; l; l = g_list_next (l)) {
MMCallState state;
g_object_get (MM_BASE_CALL (l->data),
"state", &state,
NULL);
if (state != MM_CALL_STATE_TERMINATED) {
call = MM_BASE_CALL (l->data);
break;
if (direction == MM_CALL_DIRECTION_INCOMING &&
state == MM_CALL_STATE_RINGING_IN) {
return call;
}
}
return call;
}
gboolean
mm_call_list_send_dtmf_to_active_calls (MMCallList *self,
const gchar *dtmf)
{
gboolean signaled = FALSE;
GList *l;
for (l = self->priv->list; l; l = g_list_next (l)) {
MMCallState state;
g_object_get (MM_BASE_CALL (l->data),
"state", &state,
NULL);
if (state == MM_CALL_STATE_ACTIVE) {
signaled = TRUE;
mm_base_call_received_dtmf (MM_BASE_CALL (l->data), dtmf);
}
}
return signaled;
return NULL;
}
/*****************************************************************************/
gboolean
mm_call_list_delete_call_finish (MMCallList *self,
GAsyncResult *res,
GError **error)
{
return g_task_propagate_boolean (G_TASK (res), error);
}
static guint
cmp_call_by_path (MMBaseCall *call,
const gchar *path)
......@@ -222,78 +118,34 @@ cmp_call_by_path (MMBaseCall *call,
return g_strcmp0 (mm_base_call_get_path (call), path);
}
static void
delete_ready (MMBaseCall *call,
GAsyncResult *res,
GTask *task)
{
MMCallList *self;
const gchar *path;
GError *error = NULL;
GList *l;
self = g_task_get_source_object (task);
path = g_task_get_task_data (task);
if (!mm_base_call_delete_finish (call, res, &error)) {
/* We report the error */
g_task_return_error (task, error);
g_object_unref (task);
return;
}
/* The CALL was properly deleted, we now remove it from our list */
l = g_list_find_custom (self->priv->list,
path,
(GCompareFunc)cmp_call_by_path);
if (l) {
g_object_unref (MM_BASE_CALL (l->data));
self->priv->list = g_list_delete_link (self->priv->list, l);
}
/* We don't need to unref the CALL any more, but we can use the
* reference we got in the method, which is the one kept alive
* during the async operation. */
mm_base_call_unexport (call);
g_signal_emit (self,
signals[SIGNAL_CALL_DELETED], 0,
path);
g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
void
mm_call_list_delete_call (MMCallList *self,
const gchar *call_path,
GAsyncReadyCallback callback,
gpointer user_data)
gboolean
mm_call_list_delete_call (MMCallList *self,
const gchar *call_path,
GError **error)
{
GList *l;
GTask *task;
GList *l;
MMBaseCall *call;
l = g_list_find_custom (self->priv->list,
(gpointer)call_path,
(GCompareFunc)cmp_call_by_path);
if (!l) {
g_task_report_new_error (self,
callback,
user_data,
mm_call_list_delete_call,
MM_CORE_ERROR,
MM_CORE_ERROR_NOT_FOUND,
"No CALL found with path '%s'",
call_path);
return;
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_NOT_FOUND,
"No call found with path '%s'",
call_path);
return FALSE;
}
/* Delete all CALL parts */
task = g_task_new (self, NULL, callback, user_data);
g_task_set_task_data (task, g_strdup (call_path), g_free);
call = MM_BASE_CALL (l->data);
mm_base_call_unexport (call);
g_signal_emit (self, signals[SIGNAL_CALL_DELETED], 0, call_path);
g_object_unref (call);
self->priv->list = g_list_delete_link (self->priv->list, l);
mm_base_call_delete (MM_BASE_CALL (l->data),
(GAsyncReadyCallback)delete_ready,
task);
return TRUE;
}
/*****************************************************************************/
......
......@@ -64,19 +64,10 @@ guint mm_call_list_get_count (MMCallList *self);
void mm_call_list_add_call (MMCallList *self,
MMBaseCall *call);
void mm_call_list_delete_call (MMCallList *self,
const gchar *call_path,
GAsyncReadyCallback callback,
gpointer user_data);
gboolean mm_call_list_delete_call_finish (MMCallList *self,
GAsyncResult *res,
GError **error);
MMBaseCall *mm_call_list_get_new_incoming (MMCallList *self);
MMBaseCall *mm_call_list_get_first_ringing_call (MMCallList *self);
MMBaseCall *mm_call_list_get_first_outgoing_dialing_call(MMCallList *self);
MMBaseCall *mm_call_list_get_first_non_terminated_call (MMCallList *self);
gboolean mm_call_list_send_dtmf_to_active_calls (MMCallList *self,
const gchar *dtmf);
gboolean mm_call_list_delete_call (MMCallList *self,
const gchar *call_path,
GError **error);
MMBaseCall *mm_call_list_get_first_ringing_in_call (MMCallList *self);
#endif /* MM_CALL_LIST_H */
......@@ -38,176 +38,80 @@ mm_iface_modem_voice_bind_simple_status (MMIfaceModemVoice *self,
/*****************************************************************************/
MMBaseCall *
mm_iface_modem_voice_create_call (MMIfaceModemVoice *self)
static MMBaseCall *
create_incoming_call (MMIfaceModemVoice *self,
const gchar *number)
{
g_assert (MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call != NULL);
return MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call (self);
return MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call (self, MM_CALL_DIRECTION_INCOMING, number);
}
MMBaseCall *
mm_iface_modem_voice_create_incoming_call (MMIfaceModemVoice *self)
static MMBaseCall *
create_outgoing_call_from_properties (MMIfaceModemVoice *self,
MMCallProperties *properties,
GError **error)
{
MMBaseCall *call = NULL;
MMCallList *list = NULL;
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
if (list) {
call = mm_call_list_get_new_incoming (list);
if (!call) {
mm_dbg ("Creating new incoming call...");
call = mm_base_call_new (MM_BASE_MODEM (self));
g_object_set (call,
"state", MM_CALL_STATE_RINGING_IN,
"state-reason", MM_CALL_STATE_REASON_INCOMING_NEW,
"direction", MM_CALL_DIRECTION_INCOMING,
NULL);
/* Only export once properly created */
mm_base_call_export (call);
mm_call_list_add_call (list, call);
g_object_unref (call);
}
g_object_unref (list);
}
return call;
}
gboolean
mm_iface_modem_voice_update_incoming_call_number (MMIfaceModemVoice *self,
gchar *number,
guint type,
guint validity)
{
gboolean updated = FALSE;
MMBaseCall *call = NULL;
MMCallList *list = NULL;
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
const gchar *number;
if (list) {
call = mm_call_list_get_new_incoming (list);
if (call) {
g_object_set (call, "number", number, NULL);
mm_gdbus_call_set_number (MM_GDBUS_CALL (call), number);
/*
* TODO: Maybe also this parameters should be used:
* - type
* - validity
*/
updated = TRUE;
} else {
mm_dbg ("Incoming call does not exist yet");
}
/* Don't create CALL from properties if either number is missing */
number = mm_call_properties_get_number (properties) ;
if (!number) {
g_set_error (error,
MM_CORE_ERROR,
MM_CORE_ERROR_INVALID_ARGS,
"Cannot create call: mandatory parameter 'number' is missing");
return NULL;
}
return updated;
/* Create a call object as defined by the interface */
g_assert (MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call != NULL);
return MM_IFACE_MODEM_VOICE_GET_INTERFACE (self)->create_call (self, MM_CALL_DIRECTION_OUTGOING, number);
}
gboolean
mm_iface_modem_voice_call_dialing_to_ringing (MMIfaceModemVoice *self)
{
gboolean updated = FALSE;
MMBaseCall *call = NULL;
MMCallList *list = NULL;
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
if (list) {
call = mm_call_list_get_first_outgoing_dialing_call (list);
if (call) {
mm_base_call_change_state (call, MM_CALL_STATE_RINGING_OUT, MM_CALL_STATE_REASON_OUTGOING_STARTED);
updated = TRUE;
} else {
mm_dbg ("Outgoing dialing call does not exist");
}
}
return updated;
}
/*****************************************************************************/
gboolean
mm_iface_modem_voice_call_ringing_to_active (MMIfaceModemVoice *self)
void
mm_iface_modem_voice_report_incoming_call (MMIfaceModemVoice *self,
const gchar *number)
{
gboolean updated = FALSE;
MMBaseCall *call = NULL;
MMCallList *list = NULL;
MMBaseCall *call = NULL;
MMCallList *list = NULL;
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
if (list) {
call = mm_call_list_get_first_ringing_call (list);
if (call) {
mm_base_call_change_state (call, MM_CALL_STATE_ACTIVE, MM_CALL_STATE_REASON_ACCEPTED);
updated = TRUE;
} else {
mm_dbg ("Ringing call does not exist");
}
if (!list) {
mm_warn ("Cannot create incoming call: missing call list");
return;
}
return updated;
}
gboolean
mm_iface_modem_voice_network_hangup (MMIfaceModemVoice *self)
{
gboolean updated = FALSE;
MMBaseCall *call = NULL;
MMCallList *list = NULL;
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
call = mm_call_list_get_first_ringing_in_call (list);
if (list) {
call = mm_call_list_get_first_non_terminated_call (list);
if (call) {
mm_base_call_change_state (call, MM_CALL_STATE_TERMINATED, MM_CALL_STATE_REASON_TERMINATED);
updated = TRUE;
} else {
mm_dbg ("No call to hangup");
}
/* If call exists already, refresh its validity and set number if it wasn't set */
if (call) {
if (number && !mm_gdbus_call_get_number (MM_GDBUS_CALL (call)))
mm_gdbus_call_set_number (MM_GDBUS_CALL (call), number);
mm_base_call_incoming_refresh (call);
g_object_unref (list);
return;
}
return updated;
}
mm_dbg ("Creating new incoming call...");
call = create_incoming_call (self, number);
gboolean
mm_iface_modem_voice_received_dtmf (MMIfaceModemVoice *self,
gchar *dtmf)
{
gboolean updated = FALSE;
MMCallList *list = NULL;
/* Set the state as ringing in */
mm_base_call_change_state (call, MM_CALL_STATE_RINGING_IN, MM_CALL_STATE_REASON_INCOMING_NEW);
g_object_get (MM_BASE_MODEM (self),
MM_IFACE_MODEM_VOICE_CALL_LIST, &list,
NULL);
/* Start its validity timeout */
mm_base_call_incoming_refresh (call);
if (list) {
updated = mm_call_list_send_dtmf_to_active_calls (list, dtmf);
}
return updated;
/* Only export once properly created */
mm_base_call_export (call);
mm_call_list_add_call (list, call);
g_object_unref (call);
g_object_unref (list);
}
/*****************************************************************************/
......@@ -229,21 +133,6 @@ handle_delete_context_free (HandleDeleteContext *ctx)
g_free (ctx);
}
static void
handle_delete_ready (MMCallList *list,
GAsyncResult *res,
HandleDeleteContext *ctx)
{
GError *error = NULL;
if (!mm_call_list_delete_call_finish (list, res, &error))
g_dbus_method_invocation_take_error (ctx->invocation, error);
else
mm_gdbus_modem_voice_complete_delete_call (ctx->skeleton, ctx->invocation);
handle_delete_context_free (ctx);
}
static void
handle_delete_auth_ready (MMBaseModem *self,
GAsyncResult *res,
......@@ -267,7 +156,7 @@ handle_delete_auth_ready (MMBaseModem *self,
g_dbus_method_invocation_return_error (ctx->invocation,
MM_CORE_ERROR,
MM_CORE_ERROR_WRONG_STATE,
"Cannot delete CALL: device not yet enabled");
"Cannot delete call: device not yet enabled");
handle_delete_context_free (ctx);
return;
}
......@@ -279,15 +168,17 @@ handle_delete_auth_ready (MMBaseModem *self,
g_dbus_method_invocation_return_error (ctx->invocation,
MM_CORE_ERROR,
MM_CORE_ERROR_WRONG_STATE,
"Cannot delete CALL: missing CALL list");
"Cannot delete call: missing call list");
handle_delete_context_free (ctx);
return;
}
mm_call_list_delete_call (list,
ctx->path,
(GAsyncReadyCallback)handle_delete_ready,
ctx);
if (!mm_call_list_delete_call (list, ctx->path, &error))
g_dbus_method_invocation_take_error (ctx->invocation, error);
else
mm_gdbus_modem_voice_complete_delete_call (ctx->skeleton, ctx->invocation);
handle_delete_context_free (ctx);
g_object_unref (list);
}
......@@ -370,9 +261,7 @@ handle_create_auth_ready (MMBaseModem *self,
return;
}
call = mm_base_call_new_from_properties (MM_BASE_MODEM (self),
properties,
&error);
call = create_outgoing_call_from_properties (MM_IFACE_MODEM_VOICE (self), properties, &error);
if (!call) {
g_object_unref (properties);
g_dbus_method_invocation_take_error (ctx->invocation, error);
......@@ -394,7 +283,8 @@ handle_create_auth_ready (MMBaseModem *self,
return;
}
/* Add it to the list */
/* Only export once properly created */
mm_base_call_export (call);
mm_call_list_add_call (list, call);
/* Complete the DBus call */
......
......@@ -78,7 +78,9 @@ struct _MMIfaceModemVoice {
GError **error);
/* Create CALL objects */
MMBaseCall * (* create_call) (MMIfaceModemVoice *self);
MMBaseCall * (* create_call) (MMIfaceModemVoice *self,
MMCallDirection direction,
const gchar *number);
};
GType mm_iface_modem_voice_get_type (void);
......@@ -116,22 +118,8 @@ void mm_iface_modem_voice_shutdown (MMIfaceModemVoice *self);
void mm_iface_modem_voice_bind_simple_status (MMIfaceModemVoice *self,
MMSimpleStatus *status);
/* CALL creation */
MMBaseCall *mm_iface_modem_voice_create_call (MMIfaceModemVoice *self);
MMBaseCall *mm_iface_modem_voice_create_incoming_call (MMIfaceModemVoice *self);
gboolean mm_iface_modem_voice_update_incoming_call_number (MMIfaceModemVoice *self,
gchar *number,
guint type,
guint validity);
gboolean mm_iface_modem_voice_call_dialing_to_ringing (MMIfaceModemVoice *self);
gboolean mm_iface_modem_voice_call_ringing_to_active (MMIfaceModemVoice *self);
gboolean mm_iface_modem_voice_network_hangup (MMIfaceModemVoice *self);
gboolean mm_iface_modem_voice_received_dtmf (MMIfaceModemVoice *self,
gchar *dtmf);
/* Look for a new valid multipart reference */
guint8 mm_iface_modem_voice_get_local_multipart_reference (MMIfaceModemVoice *self,
const gchar *number,
GError **error);
/* Incoming call management */
void mm_iface_modem_voice_report_incoming_call (MMIfaceModemVoice *self,
const gchar *number);
#endif /* MM_IFACE_MODEM_VOICE_H */
......@@ -14,6 +14,8 @@
* Copyright (C) 2018 Aleksander Morgado <aleksander@aleksander.es>
*/
#include <string.h>
#include <ModemManager.h>
#include <mm-errors-types.h>
......
......@@ -1175,6 +1175,15 @@ mm_port_serial_open (MMPortSerial *self, GError **error)
return FALSE;
}
if (mm_port_get_connected (MM_PORT (self))) {
g_set_error (error,
MM_SERIAL_ERROR,
MM_SERIAL_ERROR_OPEN_FAILED,
"Could not open serial device %s: port is connected",
device);
return FALSE;
}
if (self->priv->open_count) {
/* Already open */
goto success;
......
......@@ -449,7 +449,7 @@ uim_verify_pin (MMSimQmi *self,
QmiClient *client = NULL;
if (!ensure_qmi_client (task,
MM_SIM_QMI (self),
self,
QMI_SERVICE_UIM, &client))
return;
......@@ -504,7 +504,7 @@ dms_uim_verify_pin (MMSimQmi *self,
QmiClient *client = NULL;
if (!ensure_qmi_client (NULL,
MM_SIM_QMI (self),
self,
QMI_SERVICE_DMS, &client)) {
/* Very unlikely that this will ever happen, but anyway, try with
* UIM service instead */
......@@ -605,7 +605,7 @@ uim_unblock_pin (MMSimQmi *self,
UnblockPinContext *ctx;
if (!ensure_qmi_client (task,
MM_SIM_QMI (self),
self,
QMI_SERVICE_UIM, &client))
return;
......@@ -664,7 +664,7 @@ dms_uim_unblock_pin (MMSimQmi *self,
UnblockPinContext *ctx;
if (!ensure_qmi_client (NULL,
MM_SIM_QMI (self),
self,
QMI_SERVICE_DMS, &client)) {
/* Very unlikely that this will ever happen, but anyway, try with
* UIM service instead */
......@@ -772,7 +772,7 @@ uim_change_pin (MMSimQmi *self,
ChangePinContext *ctx;
if (!ensure_qmi_client (task,
MM_SIM_QMI (self),
self,
QMI_SERVICE_UIM, &client))
return;
......@@ -831,7 +831,7 @@ dms_uim_change_pin (MMSimQmi *self,
ChangePinContext *ctx;
if (!ensure_qmi_client (NULL,
MM_SIM_QMI (self),
self,
QMI_SERVICE_DMS, &client)) {
/* Very unlikely that this will ever happen, but anyway, try with
* UIM service instead */
......