Move provider plugins into a dedicated directory
Since we will introduce another type of plugin for the policy engine we want to have each plugin type in separate directories. We also have to adjust: - plugin search directories - po file location - update paths for calls-doc target
This commit is contained in:
committed by
Guido Günther
parent
8c6ece6a87
commit
86a8f3ae22
346
plugins/provider/ofono/calls-ofono-call.c
Normal file
346
plugins/provider/ofono/calls-ofono-call.c
Normal file
@@ -0,0 +1,346 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN "CallsOfonoCall"
|
||||
|
||||
#include "calls-ofono-call.h"
|
||||
#include "calls-call.h"
|
||||
#include "calls-message-source.h"
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
|
||||
struct _CallsOfonoCall {
|
||||
GObject parent_instance;
|
||||
GDBOVoiceCall *voice_call;
|
||||
gchar *disconnect_reason;
|
||||
};
|
||||
|
||||
static void calls_ofono_call_message_source_interface_init (CallsMessageSourceInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (CallsOfonoCall, calls_ofono_call, CALLS_TYPE_CALL,
|
||||
G_IMPLEMENT_INTERFACE (CALLS_TYPE_MESSAGE_SOURCE,
|
||||
calls_ofono_call_message_source_interface_init))
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_VOICE_CALL,
|
||||
PROP_LAST_PROP,
|
||||
};
|
||||
static GParamSpec *props[PROP_LAST_PROP];
|
||||
|
||||
enum {
|
||||
SIGNAL_TONE,
|
||||
SIGNAL_LAST_SIGNAL,
|
||||
};
|
||||
static guint signals[SIGNAL_LAST_SIGNAL];
|
||||
|
||||
static const char *
|
||||
calls_ofono_call_get_protocol (CallsCall *call)
|
||||
{
|
||||
return "tel";
|
||||
}
|
||||
|
||||
struct CallsCallOperationData {
|
||||
const gchar *desc;
|
||||
CallsOfonoCall *self;
|
||||
gboolean (*finish_func) (GDBOVoiceCall *, GAsyncResult *, GError **);
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
operation_cb (GDBOVoiceCall *voice_call,
|
||||
GAsyncResult *res,
|
||||
struct CallsCallOperationData *data)
|
||||
{
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
||||
gboolean ok;
|
||||
|
||||
ok = data->finish_func (voice_call, res, &error);
|
||||
if (!ok) {
|
||||
g_warning ("Error %s oFono voice call to `%s': %s",
|
||||
data->desc,
|
||||
calls_call_get_id (CALLS_CALL (data->self)),
|
||||
error->message);
|
||||
CALLS_ERROR (data->self, error);
|
||||
}
|
||||
|
||||
g_object_unref (data->self);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_call_answer (CallsCall *call)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (call);
|
||||
struct CallsCallOperationData *data;
|
||||
|
||||
data = g_new0 (struct CallsCallOperationData, 1);
|
||||
data->desc = "answering";
|
||||
data->self = g_object_ref (self);
|
||||
data->finish_func = gdbo_voice_call_call_answer_finish;
|
||||
|
||||
gdbo_voice_call_call_answer
|
||||
(self->voice_call, NULL,
|
||||
(GAsyncReadyCallback) operation_cb,
|
||||
data);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_call_hang_up (CallsCall *call)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (call);
|
||||
struct CallsCallOperationData *data;
|
||||
|
||||
data = g_new0 (struct CallsCallOperationData, 1);
|
||||
data->desc = "hanging up";
|
||||
data->self = g_object_ref (self);
|
||||
data->finish_func = gdbo_voice_call_call_hangup_finish;
|
||||
|
||||
gdbo_voice_call_call_hangup
|
||||
(self->voice_call, NULL,
|
||||
(GAsyncReadyCallback) operation_cb,
|
||||
data);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_call_send_dtmf_tone (CallsCall *call, gchar key)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (call);
|
||||
|
||||
if (calls_call_get_state (call) != CALLS_CALL_STATE_ACTIVE) {
|
||||
g_warning ("Tone start requested for non-active call to `%s'",
|
||||
calls_call_get_id (call));
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_emit_by_name (self, "tone", key);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (object);
|
||||
|
||||
switch (property_id) {
|
||||
case PROP_VOICE_CALL:
|
||||
g_set_object
|
||||
(&self->voice_call, GDBO_VOICE_CALL (g_value_get_object (value)));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
property_changed_cb (CallsOfonoCall *self,
|
||||
const gchar *name,
|
||||
GVariant *value)
|
||||
{
|
||||
GVariant *str_var;
|
||||
gchar *str = NULL;
|
||||
CallsCallState state;
|
||||
gboolean ok;
|
||||
g_autofree char *text = g_variant_print (value, TRUE);
|
||||
|
||||
g_debug ("Property `%s' for oFono call to `%s' changed to: %s",
|
||||
name,
|
||||
calls_call_get_id (CALLS_CALL (self)),
|
||||
text);
|
||||
|
||||
if (g_strcmp0 (name, "State") != 0)
|
||||
return;
|
||||
|
||||
g_variant_get (value, "v", &str_var);
|
||||
g_variant_get (str_var, "&s", &str);
|
||||
g_return_if_fail (str != NULL);
|
||||
|
||||
ok = calls_call_state_parse_nick (&state, str);
|
||||
if (ok)
|
||||
calls_call_set_state (CALLS_CALL (self), state);
|
||||
else
|
||||
g_warning ("Could not parse new state `%s'"
|
||||
" of oFono call to `%s'",
|
||||
str, calls_call_get_id (CALLS_CALL (self)));
|
||||
|
||||
g_variant_unref (str_var);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
disconnect_reason_cb (CallsOfonoCall *self,
|
||||
const gchar *reason)
|
||||
{
|
||||
if (reason) {
|
||||
g_free (self->disconnect_reason);
|
||||
self->disconnect_reason = g_strdup (reason);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
constructed (GObject *object)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (object);
|
||||
|
||||
g_return_if_fail (self->voice_call != NULL);
|
||||
|
||||
g_signal_connect_object (self->voice_call, "property-changed",
|
||||
G_CALLBACK (property_changed_cb),
|
||||
self, G_CONNECT_SWAPPED);
|
||||
g_signal_connect_object (self->voice_call, "disconnect-reason",
|
||||
G_CALLBACK (disconnect_reason_cb),
|
||||
self, G_CONNECT_SWAPPED);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_call_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dispose (GObject *object)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (object);
|
||||
|
||||
g_clear_object (&self->voice_call);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_call_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
finalize (GObject *object)
|
||||
{
|
||||
CallsOfonoCall *self = CALLS_OFONO_CALL (object);
|
||||
|
||||
g_free (self->disconnect_reason);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_call_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_call_class_init (CallsOfonoCallClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
CallsCallClass *call_class = CALLS_CALL_CLASS (klass);
|
||||
GType tone_arg_types = G_TYPE_CHAR;
|
||||
|
||||
object_class->set_property = set_property;
|
||||
object_class->constructed = constructed;
|
||||
object_class->dispose = dispose;
|
||||
object_class->finalize = finalize;
|
||||
|
||||
call_class->get_protocol = calls_ofono_call_get_protocol;
|
||||
call_class->answer = calls_ofono_call_answer;
|
||||
call_class->hang_up = calls_ofono_call_hang_up;
|
||||
call_class->send_dtmf_tone = calls_ofono_call_send_dtmf_tone;
|
||||
|
||||
props[PROP_VOICE_CALL] =
|
||||
g_param_spec_object ("voice-call",
|
||||
"Voice call",
|
||||
"A GDBO proxy object for the underlying call object",
|
||||
GDBO_TYPE_VOICE_CALL,
|
||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_property (object_class, PROP_VOICE_CALL, props[PROP_VOICE_CALL]);
|
||||
|
||||
signals[SIGNAL_TONE] =
|
||||
g_signal_newv ("tone",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
NULL, NULL, NULL, NULL,
|
||||
G_TYPE_NONE,
|
||||
1, &tone_arg_types);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_call_message_source_interface_init (CallsMessageSourceInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
calls_ofono_call_init (CallsOfonoCall *self)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CallsOfonoCall *
|
||||
calls_ofono_call_new (GDBOVoiceCall *voice_call,
|
||||
GVariant *call_props)
|
||||
{
|
||||
const char *state_str = NULL;
|
||||
const char *name = NULL;
|
||||
const char *id = NULL;
|
||||
CallsCallState state = CALLS_CALL_STATE_UNKNOWN;
|
||||
gboolean inbound = FALSE;
|
||||
|
||||
g_return_val_if_fail (GDBO_IS_VOICE_CALL (voice_call), NULL);
|
||||
g_return_val_if_fail (call_props != NULL, NULL);
|
||||
|
||||
g_variant_lookup (call_props, "LineIdentification", "s", &id);
|
||||
g_variant_lookup (call_props, "Name", "s", &name);
|
||||
|
||||
g_variant_lookup (call_props, "State", "&s", &state_str);
|
||||
if (state_str)
|
||||
calls_call_state_parse_nick (&state, state_str);
|
||||
|
||||
/* `inbound` is derived from `state` at construction time.
|
||||
* If the call was already somehow accepted and thus state=active,
|
||||
* then it's not possible to know the correct value for `inbound`. */
|
||||
if (state == CALLS_CALL_STATE_INCOMING)
|
||||
inbound = TRUE;
|
||||
|
||||
return g_object_new (CALLS_TYPE_OFONO_CALL,
|
||||
"voice-call", voice_call,
|
||||
"id", id,
|
||||
"name", name,
|
||||
"inbound", inbound,
|
||||
"state", state,
|
||||
"call-type", CALLS_CALL_TYPE_CELLULAR,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
const gchar *
|
||||
calls_ofono_call_get_object_path (CallsOfonoCall *call)
|
||||
{
|
||||
return g_dbus_proxy_get_object_path (G_DBUS_PROXY (call->voice_call));
|
||||
}
|
||||
|
||||
|
||||
const gchar *
|
||||
calls_ofono_call_get_disconnect_reason (CallsOfonoCall *call)
|
||||
{
|
||||
return call->disconnect_reason;
|
||||
}
|
||||
47
plugins/provider/ofono/calls-ofono-call.h
Normal file
47
plugins/provider/ofono/calls-ofono-call.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CALLS_OFONO_CALL_H__
|
||||
#define CALLS_OFONO_CALL_H__
|
||||
|
||||
#include <libgdbofono/gdbo-call.h>
|
||||
#include <glib-object.h>
|
||||
|
||||
#include "calls-call.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CALLS_TYPE_OFONO_CALL (calls_ofono_call_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (CallsOfonoCall, calls_ofono_call, CALLS, OFONO_CALL, CallsCall)
|
||||
|
||||
CallsOfonoCall *calls_ofono_call_new (GDBOVoiceCall *voice_call,
|
||||
GVariant *properties);
|
||||
const gchar *calls_ofono_call_get_object_path (CallsOfonoCall *call);
|
||||
const gchar *calls_ofono_call_get_disconnect_reason (CallsOfonoCall *call);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* CALLS_OFONO_CALL_H__ */
|
||||
588
plugins/provider/ofono/calls-ofono-origin.c
Normal file
588
plugins/provider/ofono/calls-ofono-origin.c
Normal file
@@ -0,0 +1,588 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN "CallsOfonoOrigin"
|
||||
|
||||
#include "calls-ofono-origin.h"
|
||||
#include "calls-origin.h"
|
||||
#include "calls-ofono-call.h"
|
||||
#include "calls-message-source.h"
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
|
||||
struct _CallsOfonoOrigin {
|
||||
GObject parent_instance;
|
||||
GDBusConnection *connection;
|
||||
GDBOModem *modem;
|
||||
gchar *name;
|
||||
GDBOVoiceCallManager *voice;
|
||||
gboolean sending_tones;
|
||||
GString *tone_queue;
|
||||
GHashTable *calls;
|
||||
};
|
||||
|
||||
static void calls_ofono_origin_message_source_interface_init (CallsOriginInterface *iface);
|
||||
static void calls_ofono_origin_origin_interface_init (CallsOriginInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (CallsOfonoOrigin, calls_ofono_origin, G_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (CALLS_TYPE_MESSAGE_SOURCE,
|
||||
calls_ofono_origin_message_source_interface_init)
|
||||
G_IMPLEMENT_INTERFACE (CALLS_TYPE_ORIGIN,
|
||||
calls_ofono_origin_origin_interface_init))
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ID,
|
||||
PROP_NAME,
|
||||
PROP_CALLS,
|
||||
PROP_MODEM,
|
||||
PROP_COUNTRY_CODE,
|
||||
PROP_LAST_PROP,
|
||||
};
|
||||
static GParamSpec *props[PROP_LAST_PROP];
|
||||
|
||||
|
||||
static void
|
||||
dial_cb (GDBOVoiceCallManager *voice,
|
||||
GAsyncResult *res,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
gboolean ok;
|
||||
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
||||
ok = gdbo_voice_call_manager_call_dial_finish
|
||||
(voice, NULL, res, &error);
|
||||
if (!ok) {
|
||||
g_warning ("Error dialing number on modem `%s': %s",
|
||||
self->name, error->message);
|
||||
CALLS_ERROR (self, error);
|
||||
return;
|
||||
}
|
||||
|
||||
/* We will add the call through the call-added signal */
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dial (CallsOrigin *origin, const gchar *number)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (origin);
|
||||
|
||||
g_return_if_fail (self->voice != NULL);
|
||||
|
||||
gdbo_voice_call_manager_call_dial
|
||||
(self->voice,
|
||||
number,
|
||||
"default" /* default caller id settings */,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) dial_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
supports_protocol (CallsOrigin *origin,
|
||||
const char *protocol)
|
||||
{
|
||||
g_assert (protocol);
|
||||
g_assert (CALLS_IS_OFONO_ORIGIN (origin));
|
||||
|
||||
return g_strcmp0 (protocol, "tel") == 0;
|
||||
}
|
||||
|
||||
CallsOfonoOrigin *
|
||||
calls_ofono_origin_new (GDBOModem *modem)
|
||||
{
|
||||
g_return_val_if_fail (GDBO_IS_MODEM (modem), NULL);
|
||||
|
||||
return g_object_new (CALLS_TYPE_OFONO_ORIGIN,
|
||||
"modem", modem,
|
||||
NULL);
|
||||
}
|
||||
|
||||
gboolean
|
||||
calls_ofono_origin_matches (CallsOfonoOrigin *self,
|
||||
const char *path)
|
||||
{
|
||||
g_return_val_if_fail (CALLS_IS_OFONO_ORIGIN (self), FALSE);
|
||||
g_return_val_if_fail (path, FALSE);
|
||||
g_return_val_if_fail (self->modem, FALSE);
|
||||
|
||||
return g_strcmp0 (g_dbus_proxy_get_object_path (G_DBUS_PROXY (self->modem)), path) == 0;
|
||||
}
|
||||
|
||||
static void
|
||||
set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (object);
|
||||
|
||||
switch (property_id) {
|
||||
case PROP_ID:
|
||||
/* we're using a hardcoded value, so let's ignore it */
|
||||
break;
|
||||
|
||||
case PROP_MODEM:
|
||||
g_set_object
|
||||
(&self->modem, GDBO_MODEM (g_value_get_object (value)));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (object);
|
||||
|
||||
switch (property_id) {
|
||||
case PROP_ID:
|
||||
g_value_set_string (value, "ofono");
|
||||
break;
|
||||
|
||||
case PROP_NAME:
|
||||
g_value_set_string (value, self->name);
|
||||
break;
|
||||
|
||||
case PROP_CALLS:
|
||||
g_value_set_pointer (value, g_hash_table_get_values (self->calls));
|
||||
break;
|
||||
|
||||
case PROP_COUNTRY_CODE:
|
||||
g_value_set_string (value, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
remove_call (CallsOfonoOrigin *self,
|
||||
CallsOfonoCall *call,
|
||||
const gchar *reason)
|
||||
{
|
||||
const gchar *path = calls_ofono_call_get_object_path (call);
|
||||
|
||||
g_signal_emit_by_name (CALLS_ORIGIN (self), "call-removed",
|
||||
CALLS_CALL (call), reason);
|
||||
g_hash_table_remove (self->calls, path);
|
||||
}
|
||||
|
||||
|
||||
struct CallsRemoveCallsData {
|
||||
CallsOrigin *origin;
|
||||
const gchar *reason;
|
||||
};
|
||||
|
||||
static gboolean
|
||||
remove_calls_cb (const gchar *path,
|
||||
CallsOfonoCall *call,
|
||||
struct CallsRemoveCallsData *data)
|
||||
{
|
||||
g_signal_emit_by_name (data->origin, "call-removed",
|
||||
CALLS_CALL (call), data->reason);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
remove_calls (CallsOfonoOrigin *self, const gchar *reason)
|
||||
{
|
||||
struct CallsRemoveCallsData data = { CALLS_ORIGIN (self), reason };
|
||||
|
||||
g_hash_table_foreach_remove (self->calls,
|
||||
(GHRFunc) remove_calls_cb,
|
||||
&data);
|
||||
}
|
||||
|
||||
|
||||
struct CallsVoiceCallProxyNewData {
|
||||
CallsOfonoOrigin *self;
|
||||
GVariant *properties;
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
send_tones_cb (GDBOVoiceCallManager *voice,
|
||||
GAsyncResult *res,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
gboolean ok;
|
||||
GError *error = NULL;
|
||||
|
||||
/* Deal with old tones */
|
||||
ok = gdbo_voice_call_manager_call_send_tones_finish
|
||||
(voice, res, &error);
|
||||
if (!ok) {
|
||||
g_warning ("Error sending DTMF tones to network on modem `%s': %s",
|
||||
self->name, error->message);
|
||||
CALLS_EMIT_MESSAGE (self, error->message, GTK_MESSAGE_WARNING);
|
||||
}
|
||||
|
||||
/* Possibly send new tones */
|
||||
if (self->tone_queue) {
|
||||
g_debug ("Sending queued DTMF tones `%s'", self->tone_queue->str);
|
||||
|
||||
gdbo_voice_call_manager_call_send_tones (voice,
|
||||
self->tone_queue->str,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) send_tones_cb,
|
||||
self);
|
||||
|
||||
g_string_free (self->tone_queue, TRUE);
|
||||
self->tone_queue = NULL;
|
||||
} else {
|
||||
self->sending_tones = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
tone_cb (CallsOfonoOrigin *self,
|
||||
gchar key)
|
||||
{
|
||||
const gchar key_str[2] = { key, '\0' };
|
||||
|
||||
if (self->sending_tones) {
|
||||
if (self->tone_queue) {
|
||||
g_string_append_c (self->tone_queue, key);
|
||||
} else {
|
||||
self->tone_queue = g_string_new (key_str);
|
||||
}
|
||||
} else {
|
||||
g_debug ("Sending immediate DTMF tone `%c'", key);
|
||||
|
||||
gdbo_voice_call_manager_call_send_tones (self->voice,
|
||||
key_str,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) send_tones_cb,
|
||||
self);
|
||||
|
||||
self->sending_tones = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
voice_call_proxy_new_cb (GDBusConnection *connection,
|
||||
GAsyncResult *res,
|
||||
struct CallsVoiceCallProxyNewData *data)
|
||||
{
|
||||
CallsOfonoOrigin *self = data->self;
|
||||
GDBOVoiceCall *voice_call;
|
||||
|
||||
g_autoptr (GError) error = NULL;
|
||||
const gchar *path;
|
||||
CallsOfonoCall *call;
|
||||
|
||||
voice_call = gdbo_voice_call_proxy_new_finish (res, &error);
|
||||
if (!voice_call) {
|
||||
g_variant_unref (data->properties);
|
||||
g_free (data);
|
||||
g_warning ("Error creating oFono VoiceCall proxy: %s",
|
||||
error->message);
|
||||
CALLS_ERROR (self, error);
|
||||
return;
|
||||
}
|
||||
|
||||
call = calls_ofono_call_new (voice_call, data->properties);
|
||||
g_signal_connect_swapped (call, "tone",
|
||||
G_CALLBACK (tone_cb), self);
|
||||
|
||||
path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (voice_call));
|
||||
g_hash_table_insert (self->calls, g_strdup (path), call);
|
||||
|
||||
g_signal_emit_by_name (CALLS_ORIGIN (self), "call-added",
|
||||
CALLS_CALL (call));
|
||||
|
||||
g_debug ("Call `%s' added", path);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
call_added_cb (GDBOVoiceCallManager *voice,
|
||||
const gchar *path,
|
||||
GVariant *properties,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
struct CallsVoiceCallProxyNewData *data;
|
||||
|
||||
g_debug ("Adding call `%s'", path);
|
||||
|
||||
if (g_hash_table_lookup (self->calls, path)) {
|
||||
g_warning ("Call `%s' already exists", path);
|
||||
return;
|
||||
}
|
||||
|
||||
data = g_new0 (struct CallsVoiceCallProxyNewData, 1);
|
||||
data->self = self;
|
||||
data->properties = properties;
|
||||
g_variant_ref (properties);
|
||||
|
||||
gdbo_voice_call_proxy_new
|
||||
(self->connection,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
g_dbus_proxy_get_name (G_DBUS_PROXY (voice)),
|
||||
path,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) voice_call_proxy_new_cb,
|
||||
data);
|
||||
|
||||
g_debug ("Call `%s' addition in progress", path);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
call_removed_cb (GDBOVoiceCallManager *voice,
|
||||
const gchar *path,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
CallsOfonoCall *ofono_call;
|
||||
GString *reason;
|
||||
const gchar *ofono_reason;
|
||||
|
||||
g_debug ("Removing call `%s'", path);
|
||||
|
||||
ofono_call = g_hash_table_lookup (self->calls, path);
|
||||
if (!ofono_call) {
|
||||
g_warning ("Could not find removed call `%s'", path);
|
||||
return;
|
||||
}
|
||||
|
||||
reason = g_string_new ("Call removed");
|
||||
|
||||
ofono_reason = calls_ofono_call_get_disconnect_reason (ofono_call);
|
||||
if (ofono_reason) {
|
||||
/* The oFono reason is either "local", "remote" or "network".
|
||||
* We just capitalise that to create a nice reason string.
|
||||
*/
|
||||
g_string_assign (reason, ofono_reason);
|
||||
reason->str[0] = g_ascii_toupper (reason->str[0]);
|
||||
g_string_append (reason, " disconnection");
|
||||
}
|
||||
|
||||
remove_call (self, ofono_call, reason->str);
|
||||
|
||||
g_string_free (reason, TRUE);
|
||||
|
||||
g_debug ("Removed call `%s'", path);
|
||||
}
|
||||
|
||||
static void
|
||||
get_calls_cb (GDBOVoiceCallManager *voice,
|
||||
GAsyncResult *res,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
gboolean ok;
|
||||
GVariant *calls_with_properties = NULL;
|
||||
|
||||
g_autoptr (GError) error = NULL;
|
||||
GVariantIter *iter = NULL;
|
||||
const gchar *path;
|
||||
GVariant *properties;
|
||||
|
||||
ok = gdbo_voice_call_manager_call_get_calls_finish
|
||||
(voice, &calls_with_properties, res, &error);
|
||||
if (!ok) {
|
||||
g_warning ("Error getting calls from oFono"
|
||||
" VoiceCallManager `%s': %s",
|
||||
self->name, error->message);
|
||||
CALLS_ERROR (self, error);
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
char *text = g_variant_print (calls_with_properties, TRUE);
|
||||
g_debug ("Received calls from oFono"
|
||||
" VoiceCallManager `%s': %s",
|
||||
self->name, text);
|
||||
g_free (text);
|
||||
}
|
||||
|
||||
g_variant_get (calls_with_properties, "a(oa{sv})", &iter);
|
||||
while (g_variant_iter_loop (iter, "(&o@a{sv})",
|
||||
&path, &properties))
|
||||
{
|
||||
g_debug ("Got call object path `%s'", path);
|
||||
call_added_cb (voice, path, properties, self);
|
||||
}
|
||||
g_variant_iter_free (iter);
|
||||
|
||||
g_variant_unref (calls_with_properties);
|
||||
}
|
||||
|
||||
static void
|
||||
voice_new_cb (GDBusConnection *connection,
|
||||
GAsyncResult *res,
|
||||
CallsOfonoOrigin *self)
|
||||
{
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
||||
self->voice = gdbo_voice_call_manager_proxy_new_finish
|
||||
(res, &error);
|
||||
if (!self->voice) {
|
||||
g_warning ("Error creating oFono"
|
||||
" VoiceCallManager `%s' proxy: %s",
|
||||
self->name, error->message);
|
||||
CALLS_ERROR (self, error);
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_connect (self->voice, "call-added",
|
||||
G_CALLBACK (call_added_cb), self);
|
||||
g_signal_connect (self->voice, "call-removed",
|
||||
G_CALLBACK (call_removed_cb), self);
|
||||
|
||||
gdbo_voice_call_manager_call_get_calls
|
||||
(self->voice,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) get_calls_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
constructed (GObject *object)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (object);
|
||||
GDBusProxy *modem_proxy;
|
||||
gchar *name;
|
||||
|
||||
g_return_if_fail (self->modem != NULL);
|
||||
|
||||
modem_proxy = G_DBUS_PROXY (self->modem);
|
||||
|
||||
self->connection = g_dbus_proxy_get_connection (modem_proxy);
|
||||
g_object_ref (self->connection);
|
||||
|
||||
name = g_object_get_data (G_OBJECT (self->modem),
|
||||
"calls-modem-name");
|
||||
if (name)
|
||||
self->name = g_strdup (name);
|
||||
|
||||
gdbo_voice_call_manager_proxy_new
|
||||
(self->connection,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
g_dbus_proxy_get_name (modem_proxy),
|
||||
g_dbus_proxy_get_object_path (modem_proxy),
|
||||
NULL,
|
||||
(GAsyncReadyCallback) voice_new_cb,
|
||||
self);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_origin_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dispose (GObject *object)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (object);
|
||||
|
||||
remove_calls (self, NULL);
|
||||
g_clear_object (&self->modem);
|
||||
g_clear_object (&self->connection);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_origin_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
finalize (GObject *object)
|
||||
{
|
||||
CallsOfonoOrigin *self = CALLS_OFONO_ORIGIN (object);
|
||||
|
||||
if (self->tone_queue) {
|
||||
g_string_free (self->tone_queue, TRUE);
|
||||
}
|
||||
g_free (self->name);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_origin_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_origin_class_init (CallsOfonoOriginClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->get_property = get_property;
|
||||
object_class->set_property = set_property;
|
||||
object_class->constructed = constructed;
|
||||
object_class->dispose = dispose;
|
||||
object_class->finalize = finalize;
|
||||
|
||||
props[PROP_MODEM] =
|
||||
g_param_spec_object ("modem",
|
||||
"Modem",
|
||||
"A GDBO proxy object for the underlying modem object",
|
||||
GDBO_TYPE_MODEM,
|
||||
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY);
|
||||
g_object_class_install_property (object_class, PROP_MODEM, props[PROP_MODEM]);
|
||||
|
||||
#define IMPLEMENTS(ID, NAME) \
|
||||
g_object_class_override_property (object_class, ID, NAME); \
|
||||
props[ID] = g_object_class_find_property(object_class, NAME);
|
||||
|
||||
IMPLEMENTS (PROP_NAME, "id");
|
||||
IMPLEMENTS (PROP_NAME, "name");
|
||||
IMPLEMENTS (PROP_CALLS, "calls");
|
||||
IMPLEMENTS (PROP_COUNTRY_CODE, "country-code");
|
||||
|
||||
#undef IMPLEMENTS
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_origin_message_source_interface_init (CallsOriginInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_origin_origin_interface_init (CallsOriginInterface *iface)
|
||||
{
|
||||
iface->dial = dial;
|
||||
iface->supports_protocol = supports_protocol;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_origin_init (CallsOfonoOrigin *self)
|
||||
{
|
||||
self->calls = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
g_free, g_object_unref);
|
||||
}
|
||||
44
plugins/provider/ofono/calls-ofono-origin.h
Normal file
44
plugins/provider/ofono/calls-ofono-origin.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CALLS_OFONO_ORIGIN_H__
|
||||
#define CALLS_OFONO_ORIGIN_H__
|
||||
|
||||
#include <libgdbofono/gdbo-modem.h>
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CALLS_TYPE_OFONO_ORIGIN (calls_ofono_origin_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (CallsOfonoOrigin, calls_ofono_origin, CALLS, OFONO_ORIGIN, GObject);
|
||||
|
||||
CallsOfonoOrigin *calls_ofono_origin_new (GDBOModem *modem);
|
||||
gboolean calls_ofono_origin_matches (CallsOfonoOrigin *self,
|
||||
const char *path);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* CALLS_OFONO_ORIGIN_H__ */
|
||||
558
plugins/provider/ofono/calls-ofono-provider.c
Normal file
558
plugins/provider/ofono/calls-ofono-provider.c
Normal file
@@ -0,0 +1,558 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#define G_LOG_DOMAIN "CallsOfonoProvider"
|
||||
|
||||
#include "calls-ofono-provider.h"
|
||||
#include "calls-provider.h"
|
||||
#include "calls-ofono-origin.h"
|
||||
#include "calls-message-source.h"
|
||||
#include "util.h"
|
||||
|
||||
#include <libgdbofono/gdbo-manager.h>
|
||||
#include <libgdbofono/gdbo-modem.h>
|
||||
|
||||
#include <glib/gi18n.h>
|
||||
#include <libpeas/peas.h>
|
||||
|
||||
static const char * const supported_protocols[] = {
|
||||
"tel",
|
||||
NULL
|
||||
};
|
||||
|
||||
struct _CallsOfonoProvider {
|
||||
CallsProvider parent_instance;
|
||||
|
||||
/* The status property */
|
||||
gchar *status;
|
||||
/** ID for the D-Bus watch */
|
||||
guint watch_id;
|
||||
/** D-Bus connection */
|
||||
GDBusConnection *connection;
|
||||
/** D-Bus proxy for the oFono Manager object */
|
||||
GDBOManager *manager;
|
||||
/** Map of D-Bus object paths to a struct CallsModemData */
|
||||
GHashTable *modems;
|
||||
/* A list of CallsOrigins */
|
||||
GListStore *origins;
|
||||
};
|
||||
|
||||
|
||||
static void calls_ofono_provider_message_source_interface_init (CallsMessageSourceInterface *iface);
|
||||
|
||||
|
||||
G_DEFINE_DYNAMIC_TYPE_EXTENDED
|
||||
(CallsOfonoProvider, calls_ofono_provider, CALLS_TYPE_PROVIDER, 0,
|
||||
G_IMPLEMENT_INTERFACE_DYNAMIC (CALLS_TYPE_MESSAGE_SOURCE,
|
||||
calls_ofono_provider_message_source_interface_init))
|
||||
|
||||
|
||||
static void
|
||||
set_status (CallsOfonoProvider *self,
|
||||
const gchar *new_status)
|
||||
{
|
||||
if (strcmp (self->status, new_status) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
g_free (self->status);
|
||||
self->status = g_strdup (new_status);
|
||||
g_object_notify (G_OBJECT (self), "status");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
update_status (CallsOfonoProvider *self)
|
||||
{
|
||||
const gchar *s;
|
||||
GListModel *model;
|
||||
|
||||
model = G_LIST_MODEL (self->origins);
|
||||
|
||||
if (!self->connection) {
|
||||
s = _("DBus unavailable");
|
||||
} else if (g_list_model_get_n_items (model) == 0) {
|
||||
s = _("No voice-capable modem available");
|
||||
} else {
|
||||
s = _("Normal");
|
||||
}
|
||||
|
||||
set_status (self, s);
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
ofono_find_origin_index (CallsOfonoProvider *self,
|
||||
const char *path,
|
||||
guint *index)
|
||||
{
|
||||
GListModel *model;
|
||||
guint n_items;
|
||||
|
||||
g_assert (CALLS_IS_OFONO_PROVIDER (self));
|
||||
|
||||
model = G_LIST_MODEL (self->origins);
|
||||
n_items = g_list_model_get_n_items (model);
|
||||
|
||||
for (guint i = 0; i < n_items; i++) {
|
||||
g_autoptr (CallsOfonoOrigin) origin = NULL;
|
||||
|
||||
origin = g_list_model_get_item (model, i);
|
||||
|
||||
if (calls_ofono_origin_matches (origin, path)) {
|
||||
if (index)
|
||||
*index = i;
|
||||
|
||||
update_status (self);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
object_array_includes (GVariantIter *iter,
|
||||
const gchar *needle)
|
||||
{
|
||||
const gchar *str;
|
||||
gboolean found = FALSE;
|
||||
|
||||
while (g_variant_iter_loop (iter, "&s", &str))
|
||||
{
|
||||
if (g_strcmp0 (str, needle) == 0) {
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_variant_iter_free (iter);
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
modem_check_ifaces (CallsOfonoProvider *self,
|
||||
GDBOModem *modem,
|
||||
const gchar *modem_name,
|
||||
GVariant *ifaces)
|
||||
{
|
||||
gboolean voice;
|
||||
GVariantIter *iter = NULL;
|
||||
const gchar *path;
|
||||
guint index;
|
||||
gboolean has_origin;
|
||||
|
||||
g_variant_get (ifaces, "as", &iter);
|
||||
|
||||
voice = object_array_includes (iter, "org.ofono.VoiceCallManager");
|
||||
|
||||
path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (modem));
|
||||
|
||||
has_origin = ofono_find_origin_index (self, path, &index);
|
||||
if (voice && !has_origin) {
|
||||
g_autoptr (CallsOfonoOrigin) origin = NULL;
|
||||
|
||||
g_debug ("Adding oFono Origin with path `%s'", path);
|
||||
|
||||
origin = calls_ofono_origin_new (modem);
|
||||
g_list_store_append (self->origins, origin);
|
||||
} else if (!voice && has_origin) {
|
||||
g_list_store_remove (self->origins, index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
modem_property_changed_cb (GDBOModem *modem,
|
||||
const gchar *name,
|
||||
GVariant *value,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
gchar *modem_name;
|
||||
|
||||
g_debug ("Modem property `%s' changed", name);
|
||||
|
||||
if (g_strcmp0 (name, "Interfaces") != 0)
|
||||
return;
|
||||
|
||||
modem_name = g_object_get_data (G_OBJECT (modem),
|
||||
"calls-modem-name");
|
||||
|
||||
/* PropertyChanged gives us a variant gvariant containing a string array,
|
||||
but modem_check_ifaces expects the inner string array gvariant */
|
||||
value = g_variant_get_variant (value);
|
||||
modem_check_ifaces (self, modem, modem_name, value);
|
||||
}
|
||||
|
||||
|
||||
struct CallsModemProxyNewData {
|
||||
CallsOfonoProvider *self;
|
||||
gchar *name;
|
||||
GVariant *ifaces;
|
||||
};
|
||||
|
||||
|
||||
static void
|
||||
modem_proxy_new_cb (GDBusConnection *connection,
|
||||
GAsyncResult *res,
|
||||
struct CallsModemProxyNewData *data)
|
||||
{
|
||||
GDBOModem *modem;
|
||||
GError *error = NULL;
|
||||
const gchar *path;
|
||||
|
||||
modem = gdbo_modem_proxy_new_finish (res, &error);
|
||||
if (!modem) {
|
||||
g_variant_unref (data->ifaces);
|
||||
g_free (data->name);
|
||||
g_free (data);
|
||||
g_error ("Error creating oFono Modem proxy: %s",
|
||||
error->message);
|
||||
return;
|
||||
}
|
||||
|
||||
g_signal_connect (modem, "property-changed",
|
||||
G_CALLBACK (modem_property_changed_cb),
|
||||
data->self);
|
||||
|
||||
|
||||
/* We want to store the oFono modem's Name property so we can pass it
|
||||
to our Origin when we create it */
|
||||
g_object_set_data_full (G_OBJECT (modem), "calls-modem-name",
|
||||
data->name, g_free);
|
||||
|
||||
path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (modem));
|
||||
|
||||
g_hash_table_insert (data->self->modems, g_strdup (path), modem);
|
||||
|
||||
|
||||
if (data->ifaces) {
|
||||
modem_check_ifaces (data->self, modem,
|
||||
data->name, data->ifaces);
|
||||
g_variant_unref (data->ifaces);
|
||||
}
|
||||
|
||||
g_free (data);
|
||||
|
||||
g_debug ("Modem `%s' added", path);
|
||||
}
|
||||
|
||||
|
||||
static gchar *
|
||||
modem_properties_get_name (GVariant *properties)
|
||||
{
|
||||
gchar *name = NULL;
|
||||
gboolean ok;
|
||||
|
||||
#define try(prop) \
|
||||
ok = g_variant_lookup (properties, prop, "s", &name); \
|
||||
if (ok) { \
|
||||
return name; \
|
||||
}
|
||||
|
||||
try ("Name");
|
||||
try ("Model");
|
||||
try ("Manufacturer");
|
||||
try ("Serial");
|
||||
try ("SystemPath");
|
||||
|
||||
#undef try
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *const *
|
||||
calls_ofono_provider_get_protocols (CallsProvider *provider)
|
||||
{
|
||||
return supported_protocols;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
calls_ofono_provider_is_modem (CallsProvider *provider)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
modem_added_cb (GDBOManager *manager,
|
||||
const gchar *path,
|
||||
GVariant *properties,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
struct CallsModemProxyNewData *data;
|
||||
|
||||
g_debug ("Adding modem `%s'", path);
|
||||
|
||||
if (g_hash_table_lookup (self->modems, path)) {
|
||||
g_warning ("Modem `%s' already exists", path);
|
||||
return;
|
||||
}
|
||||
|
||||
data = g_new0 (struct CallsModemProxyNewData, 1);
|
||||
data->self = self;
|
||||
data->name = modem_properties_get_name (properties);
|
||||
|
||||
data->ifaces = g_variant_lookup_value
|
||||
(properties, "Interfaces", G_VARIANT_TYPE_ARRAY);
|
||||
if (data->ifaces) {
|
||||
g_variant_ref (data->ifaces);
|
||||
}
|
||||
|
||||
gdbo_modem_proxy_new
|
||||
(self->connection,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
g_dbus_proxy_get_name (G_DBUS_PROXY (manager)),
|
||||
path,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) modem_proxy_new_cb,
|
||||
data);
|
||||
|
||||
g_debug ("Modem `%s' addition in progress", path);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
modem_removed_cb (GDBOManager *manager,
|
||||
const gchar *path,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
guint index;
|
||||
|
||||
g_debug ("Removing modem `%s'", path);
|
||||
|
||||
if (ofono_find_origin_index (self, path, &index))
|
||||
g_list_store_remove (self->origins, index);
|
||||
|
||||
g_hash_table_remove (self->modems, path);
|
||||
|
||||
g_debug ("Modem `%s' removed", path);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
get_modems_cb (GDBOManager *manager,
|
||||
GAsyncResult *res,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
g_autoptr (GError) error = NULL;
|
||||
|
||||
gboolean ok;
|
||||
GVariant *modems;
|
||||
GVariantIter *modems_iter = NULL;
|
||||
const gchar *path;
|
||||
GVariant *properties;
|
||||
|
||||
ok = gdbo_manager_call_get_modems_finish (manager, &modems,
|
||||
res, &error);
|
||||
if (!ok) {
|
||||
g_warning ("Error getting modems from oFono Manager: %s",
|
||||
error->message);
|
||||
CALLS_ERROR (self, error);
|
||||
return;
|
||||
}
|
||||
|
||||
{
|
||||
char *text = g_variant_print (modems, TRUE);
|
||||
g_debug ("Received modems from oFono Manager: %s", text);
|
||||
g_free (text);
|
||||
}
|
||||
|
||||
g_variant_get (modems, "a(oa{sv})", &modems_iter);
|
||||
while (g_variant_iter_loop (modems_iter, "(&o@a{sv})",
|
||||
&path, &properties))
|
||||
{
|
||||
g_debug ("Got modem object path `%s'", path);
|
||||
modem_added_cb (manager, path, properties, self);
|
||||
}
|
||||
g_variant_iter_free (modems_iter);
|
||||
|
||||
g_variant_unref (modems);
|
||||
}
|
||||
|
||||
static const char *
|
||||
calls_ofono_provider_get_name (CallsProvider *provider)
|
||||
{
|
||||
return "Ofono";
|
||||
}
|
||||
|
||||
static const char *
|
||||
calls_ofono_provider_get_status (CallsProvider *provider)
|
||||
{
|
||||
CallsOfonoProvider *self = CALLS_OFONO_PROVIDER (provider);
|
||||
|
||||
return self->status;
|
||||
}
|
||||
|
||||
static GListModel *
|
||||
calls_ofono_provider_get_origins (CallsProvider *provider)
|
||||
{
|
||||
CallsOfonoProvider *self = CALLS_OFONO_PROVIDER (provider);
|
||||
|
||||
return G_LIST_MODEL (self->origins);
|
||||
}
|
||||
|
||||
static void
|
||||
ofono_appeared_cb (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
const gchar *name_owner,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
g_autoptr (GError) error = NULL;
|
||||
self->connection = connection;
|
||||
if (!self->connection) {
|
||||
g_error ("Error creating D-Bus connection: %s",
|
||||
error->message);
|
||||
}
|
||||
|
||||
self->manager = gdbo_manager_proxy_new_sync
|
||||
(self->connection,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
"org.ofono",
|
||||
"/",
|
||||
NULL,
|
||||
&error);
|
||||
if (!self->manager) {
|
||||
g_error ("Error creating ModemManager object manager proxy: %s",
|
||||
error->message);
|
||||
}
|
||||
|
||||
g_signal_connect (self->manager, "modem-added",
|
||||
G_CALLBACK (modem_added_cb), self);
|
||||
g_signal_connect (self->manager, "modem-removed",
|
||||
G_CALLBACK (modem_removed_cb), self);
|
||||
|
||||
gdbo_manager_call_get_modems
|
||||
(self->manager,
|
||||
NULL,
|
||||
(GAsyncReadyCallback) get_modems_cb,
|
||||
self);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
ofono_vanished_cb (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
CallsOfonoProvider *self)
|
||||
{
|
||||
g_debug ("Ofono vanished from D-Bus");
|
||||
g_list_store_remove_all (self->origins);
|
||||
update_status (self);
|
||||
}
|
||||
|
||||
static void
|
||||
constructed (GObject *object)
|
||||
{
|
||||
CallsOfonoProvider *self = CALLS_OFONO_PROVIDER (object);
|
||||
|
||||
self->watch_id =
|
||||
g_bus_watch_name (G_BUS_TYPE_SYSTEM,
|
||||
"org.ofono",
|
||||
G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
|
||||
(GBusNameAppearedCallback) ofono_appeared_cb,
|
||||
(GBusNameVanishedCallback) ofono_vanished_cb,
|
||||
self, NULL);
|
||||
|
||||
g_debug ("Watching for Ofono");
|
||||
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_provider_parent_class)->constructed (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
dispose (GObject *object)
|
||||
{
|
||||
CallsOfonoProvider *self = CALLS_OFONO_PROVIDER (object);
|
||||
|
||||
g_clear_object (&self->manager);
|
||||
g_clear_object (&self->connection);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_provider_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
finalize (GObject *object)
|
||||
{
|
||||
CallsOfonoProvider *self = CALLS_OFONO_PROVIDER (object);
|
||||
|
||||
g_object_unref (self->origins);
|
||||
g_free (self->status);
|
||||
g_hash_table_unref (self->modems);
|
||||
|
||||
G_OBJECT_CLASS (calls_ofono_provider_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_provider_class_init (CallsOfonoProviderClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
CallsProviderClass *provider_class = CALLS_PROVIDER_CLASS (klass);
|
||||
|
||||
object_class->constructed = constructed;
|
||||
object_class->dispose = dispose;
|
||||
object_class->finalize = finalize;
|
||||
|
||||
provider_class->get_name = calls_ofono_provider_get_name;
|
||||
provider_class->get_status = calls_ofono_provider_get_status;
|
||||
provider_class->get_origins = calls_ofono_provider_get_origins;
|
||||
provider_class->get_protocols = calls_ofono_provider_get_protocols;
|
||||
provider_class->is_modem = calls_ofono_provider_is_modem;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_provider_class_finalize (CallsOfonoProviderClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_provider_message_source_interface_init (CallsMessageSourceInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
calls_ofono_provider_init (CallsOfonoProvider *self)
|
||||
{
|
||||
self->status = g_strdup (_("Initialized"));
|
||||
self->modems = g_hash_table_new_full (g_str_hash, g_str_equal,
|
||||
g_free, g_object_unref);
|
||||
self->origins = g_list_store_new (CALLS_TYPE_ORIGIN);
|
||||
}
|
||||
|
||||
|
||||
G_MODULE_EXPORT void
|
||||
peas_register_types (PeasObjectModule *module)
|
||||
{
|
||||
calls_ofono_provider_register_type (G_TYPE_MODULE (module));
|
||||
|
||||
peas_object_module_register_extension_type (module,
|
||||
CALLS_TYPE_PROVIDER,
|
||||
CALLS_TYPE_OFONO_PROVIDER);
|
||||
}
|
||||
44
plugins/provider/ofono/calls-ofono-provider.h
Normal file
44
plugins/provider/ofono/calls-ofono-provider.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2018 Purism SPC
|
||||
*
|
||||
* This file is part of Calls.
|
||||
*
|
||||
* Calls 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 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Bob Ham <bob.ham@puri.sm>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CALLS_OFONO_PROVIDER_H__
|
||||
#define CALLS_OFONO_PROVIDER_H__
|
||||
|
||||
#include "calls-provider.h"
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gio/gio.h>
|
||||
#include <libpeas/peas.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define CALLS_TYPE_OFONO_PROVIDER (calls_ofono_provider_get_type ())
|
||||
|
||||
G_DECLARE_FINAL_TYPE (CallsOfonoProvider, calls_ofono_provider, CALLS, OFONO_PROVIDER, CallsProvider)
|
||||
|
||||
void peas_register_types (PeasObjectModule *module);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* CALLS_OFONO_PROVIDER_H__ */
|
||||
12
plugins/provider/ofono/libgdbofono/call.xml
Normal file
12
plugins/provider/ofono/libgdbofono/call.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
|
||||
<interface name="org.ofono.VoiceCall"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="Deflect"><arg name="number" type="s" direction="in"/>
|
||||
</method><method name="Hangup"></method><method name="Answer"></method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="DisconnectReason"><arg name="reason" type="s"/>
|
||||
</signal>
|
||||
</interface></node>
|
||||
11
plugins/provider/ofono/libgdbofono/dbus-introspect.sh
Executable file
11
plugins/provider/ofono/libgdbofono/dbus-introspect.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEST="$1"
|
||||
OBJ_PATH="$2"
|
||||
METHOD="$3"
|
||||
shift 3
|
||||
|
||||
dbus-send "$@" --print-reply --dest="$DEST" "$OBJ_PATH" "$METHOD" | \
|
||||
grep -v '^method return' | \
|
||||
sed -e 's/^[[:space:]]\+string "</</' \
|
||||
-e 's_</node>"_</node>_'
|
||||
13
plugins/provider/ofono/libgdbofono/manager.xml
Normal file
13
plugins/provider/ofono/libgdbofono/manager.xml
Normal file
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
|
||||
<interface name="org.ofono.Manager"><method name="GetModems"><arg name="modems" type="a(oa{sv})" direction="out"/>
|
||||
</method><signal name="ModemAdded"><arg name="path" type="o"/>
|
||||
<arg name="properties" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="ModemRemoved"><arg name="path" type="o"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
</node>
|
||||
51
plugins/provider/ofono/libgdbofono/meson.build
Normal file
51
plugins/provider/ofono/libgdbofono/meson.build
Normal file
@@ -0,0 +1,51 @@
|
||||
#
|
||||
# Copyright (C) 2018 Purism SPC
|
||||
#
|
||||
# This file is part of Calls.
|
||||
#
|
||||
# Calls 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Author: Bob Ham <bob.ham@puri.sm>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
|
||||
|
||||
gnome = import('gnome')
|
||||
dbus_interfaces = ['manager', 'modem', 'call']
|
||||
|
||||
gdbofono_src = []
|
||||
gdbofono_headers = []
|
||||
foreach iface: dbus_interfaces
|
||||
src = gnome.gdbus_codegen(
|
||||
'gdbo-' + iface,
|
||||
iface + '.xml',
|
||||
interface_prefix: 'org.ofono.',
|
||||
namespace: 'GDBO'
|
||||
)
|
||||
gdbofono_src += src
|
||||
gdbofono_headers += src[1]
|
||||
endforeach
|
||||
|
||||
gdbofono_deps = [
|
||||
dependency('gio-2.0'),
|
||||
dependency('gio-unix-2.0'),
|
||||
]
|
||||
|
||||
gdbofono_lib = static_library(
|
||||
'gdbofono',
|
||||
gdbofono_src,
|
||||
include_directories: top_include,
|
||||
dependencies: gdbofono_deps
|
||||
)
|
||||
249
plugins/provider/ofono/libgdbofono/modem-full.xml
Normal file
249
plugins/provider/ofono/libgdbofono/modem-full.xml
Normal file
@@ -0,0 +1,249 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
|
||||
<interface name="org.ofono.Modem"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.SimManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><method name="ChangePin"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="oldpin" type="s" direction="in"/>
|
||||
<arg name="newpin" type="s" direction="in"/>
|
||||
</method><method name="EnterPin"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="pin" type="s" direction="in"/>
|
||||
</method><method name="ResetPin"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="puk" type="s" direction="in"/>
|
||||
<arg name="newpin" type="s" direction="in"/>
|
||||
</method><method name="LockPin"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="pin" type="s" direction="in"/>
|
||||
</method><method name="UnlockPin"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="pin" type="s" direction="in"/>
|
||||
</method><method name="GetIcon"><arg name="id" type="y" direction="in"/>
|
||||
<arg name="icon" type="ay" direction="out"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.VoiceCallManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="Dial"><arg name="number" type="s" direction="in"/>
|
||||
<arg name="hide_callerid" type="s" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method><method name="DialLast"></method><method name="DialMemory"><arg name="memory_location" type="u" direction="in"/>
|
||||
</method><method name="Transfer"></method><method name="SwapCalls"></method><method name="ReleaseAndAnswer"></method><method name="ReleaseAndSwap"></method><method name="HoldAndAnswer"></method><method name="HangupAll"></method><method name="PrivateChat"><arg name="call" type="o" direction="in"/>
|
||||
<arg name="calls" type="ao" direction="out"/>
|
||||
</method><method name="CreateMultiparty"><arg name="calls" type="ao" direction="out"/>
|
||||
</method><method name="HangupMultiparty"></method><method name="SendTones"><arg name="SendTones" type="s" direction="in"/>
|
||||
</method><method name="GetCalls"><arg name="calls_with_properties" type="a(oa{sv})" direction="out"/>
|
||||
</method><signal name="Forwarded"><arg name="type" type="s"/>
|
||||
</signal>
|
||||
<signal name="BarringActive"><arg name="type" type="s"/>
|
||||
</signal>
|
||||
<signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="CallAdded"><arg name="path" type="o"/>
|
||||
<arg name="properties" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="CallRemoved"><arg name="path" type="o"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.AllowedAccessPoints"><method name="GetAllowedAccessPoints"><arg name="apnlist" type="as" direction="out"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.SimAuthentication"><method name="GetApplications"><arg name="applications" type="a{oa{sv}}" direction="out"/>
|
||||
</method><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.SimToolkit"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SelectItem"><arg name="item" type="y" direction="in"/>
|
||||
<arg name="agent" type="o" direction="in"/>
|
||||
</method><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CallForwarding"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><method name="DisableAll"><arg name="type" type="s" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.RadioSettings"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.TextTelephony"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.Phonebook"><method name="Import"><arg name="entries" type="s" direction="out"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.MessageManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><method name="SendMessage"><arg name="to" type="s" direction="in"/>
|
||||
<arg name="text" type="s" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method><method name="GetMessages"><arg name="messages" type="a(oa{sv})" direction="out"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="IncomingMessage"><arg name="message" type="s"/>
|
||||
<arg name="info" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="ImmediateMessage"><arg name="message" type="s"/>
|
||||
<arg name="info" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="MessageAdded"><arg name="path" type="o"/>
|
||||
<arg name="properties" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="MessageRemoved"><arg name="path" type="o"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.PushNotification"><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.SmartMessaging"><method name="RegisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method><method name="UnregisterAgent"><arg name="path" type="o" direction="in"/>
|
||||
</method><method name="SendBusinessCard"><arg name="to" type="s" direction="in"/>
|
||||
<arg name="card" type="ay" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method><method name="SendAppointment"><arg name="to" type="s" direction="in"/>
|
||||
<arg name="appointment" type="ay" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.MessageWaiting"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CallSettings"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="property" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CallBarring"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
<arg name="pin2" type="s" direction="in"/>
|
||||
</method><method name="DisableAll"><arg name="password" type="s" direction="in"/>
|
||||
</method><method name="DisableAllIncoming"><arg name="password" type="s" direction="in"/>
|
||||
</method><method name="DisableAllOutgoing"><arg name="password" type="s" direction="in"/>
|
||||
</method><method name="ChangePassword"><arg name="old" type="s" direction="in"/>
|
||||
<arg name="new" type="s" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.SupplementaryServices"><method name="Initiate"><arg name="command" type="s" direction="in"/>
|
||||
<arg name="result_name" type="s" direction="out"/>
|
||||
<arg name="value" type="v" direction="out"/>
|
||||
</method><method name="Respond"><arg name="reply" type="s" direction="in"/>
|
||||
<arg name="result" type="s" direction="out"/>
|
||||
</method><method name="Cancel"></method><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><signal name="NotificationReceived"><arg name="message" type="s"/>
|
||||
</signal>
|
||||
<signal name="RequestReceived"><arg name="message" type="s"/>
|
||||
</signal>
|
||||
<signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CallMeter"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
<arg name="password" type="s" direction="in"/>
|
||||
</method><method name="Reset"><arg name="passoword" type="s" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="property" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="NearMaximumWarning"></signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CallVolume"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="property" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.NetworkRegistration"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="Register"></method><method name="GetOperators"><arg name="operators_with_properties" type="a(oa{sv})" direction="out"/>
|
||||
</method><method name="Scan"><arg name="operators_with_properties" type="a(oa{sv})" direction="out"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.CellBroadcast"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="property" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="IncomingBroadcast"><arg name="message" type="s"/>
|
||||
<arg name="channel" type="q"/>
|
||||
</signal>
|
||||
<signal name="EmergencyBroadcast"><arg name="message" type="s"/>
|
||||
<arg name="dict" type="a{sv}"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.AssistedSatelliteNavigation"><method name="SendPositioningElement"><arg name="xml_elements" type="(null)" direction="in"/>
|
||||
</method><method name="RegisterPositioningRequestAgent"><arg name="agent" type="o" direction="in"/>
|
||||
</method><method name="UnregisterPositioningRequestAgent"><arg name="agent" type="o" direction="in"/>
|
||||
</method></interface>
|
||||
|
||||
<interface name="org.ofono.ConnectionManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><method name="AddContext"><arg name="type" type="s" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method><method name="RemoveContext"><arg name="path" type="o" direction="in"/>
|
||||
</method><method name="DeactivateAll"></method><method name="GetContexts"><arg name="contexts_with_properties" type="a(oa{sv})" direction="out"/>
|
||||
</method><method name="ResetContexts"></method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="ContextAdded"><arg name="path" type="o"/>
|
||||
<arg name="properties" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="ContextRemoved"><arg name="path" type="o"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
</node>
|
||||
37
plugins/provider/ofono/libgdbofono/modem.xml
Normal file
37
plugins/provider/ofono/libgdbofono/modem.xml
Normal file
@@ -0,0 +1,37 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
||||
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
|
||||
<interface name="org.ofono.Modem"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="SetProperty"><arg name="property" type="s" direction="in"/>
|
||||
<arg name="value" type="v" direction="in"/>
|
||||
</method><signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
<interface name="org.ofono.VoiceCallManager"><method name="GetProperties"><arg name="properties" type="a{sv}" direction="out"/>
|
||||
</method><method name="Dial"><arg name="number" type="s" direction="in"/>
|
||||
<arg name="hide_callerid" type="s" direction="in"/>
|
||||
<arg name="path" type="o" direction="out"/>
|
||||
</method><method name="DialLast"></method><method name="DialMemory"><arg name="memory_location" type="u" direction="in"/>
|
||||
</method><method name="Transfer"></method><method name="SwapCalls"></method><method name="ReleaseAndAnswer"></method><method name="ReleaseAndSwap"></method><method name="HoldAndAnswer"></method><method name="HangupAll"></method><method name="PrivateChat"><arg name="call" type="o" direction="in"/>
|
||||
<arg name="calls" type="ao" direction="out"/>
|
||||
</method><method name="CreateMultiparty"><arg name="calls" type="ao" direction="out"/>
|
||||
</method><method name="HangupMultiparty"></method><method name="SendTones"><arg name="SendTones" type="s" direction="in"/>
|
||||
</method><method name="GetCalls"><arg name="calls_with_properties" type="a(oa{sv})" direction="out"/>
|
||||
</method><signal name="Forwarded"><arg name="type" type="s"/>
|
||||
</signal>
|
||||
<signal name="BarringActive"><arg name="type" type="s"/>
|
||||
</signal>
|
||||
<signal name="PropertyChanged"><arg name="name" type="s"/>
|
||||
<arg name="value" type="v"/>
|
||||
</signal>
|
||||
<signal name="CallAdded"><arg name="path" type="o"/>
|
||||
<arg name="properties" type="a{sv}"/>
|
||||
</signal>
|
||||
<signal name="CallRemoved"><arg name="path" type="o"/>
|
||||
</signal>
|
||||
</interface>
|
||||
|
||||
</node>
|
||||
60
plugins/provider/ofono/meson.build
Normal file
60
plugins/provider/ofono/meson.build
Normal file
@@ -0,0 +1,60 @@
|
||||
#
|
||||
# Copyright (C) 2018 Purism SPC
|
||||
#
|
||||
# This file is part of Calls.
|
||||
#
|
||||
# Calls 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 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Calls 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 Calls. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# Author: Bob Ham <bob.ham@puri.sm>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
#
|
||||
|
||||
subdir('libgdbofono')
|
||||
|
||||
ofono_install_dir = join_paths(full_calls_plugin_libdir, 'ofono')
|
||||
|
||||
ofono_plugin = configure_file(
|
||||
input: 'ofono.plugin.in',
|
||||
output: 'ofono.plugin',
|
||||
configuration: config_data,
|
||||
install_dir: ofono_install_dir
|
||||
)
|
||||
|
||||
ofono_deps = [
|
||||
dependency('gobject-2.0'),
|
||||
dependency('gtk+-3.0'),
|
||||
dependency('libpeas-1.0'),
|
||||
]
|
||||
|
||||
ofono_sources = files(
|
||||
[
|
||||
'calls-ofono-call.c', 'calls-ofono-call.h',
|
||||
'calls-ofono-origin.c', 'calls-ofono-origin.h',
|
||||
'calls-ofono-provider.c', 'calls-ofono-provider.h'
|
||||
]
|
||||
)
|
||||
|
||||
calls_ofono = shared_module(
|
||||
'ofono',
|
||||
ofono_sources, gdbofono_headers,
|
||||
dependencies: ofono_deps,
|
||||
include_directories: [
|
||||
src_include,
|
||||
include_directories('.')
|
||||
],
|
||||
link_with: [gdbofono_lib, libcalls],
|
||||
install: true,
|
||||
install_dir: ofono_install_dir
|
||||
)
|
||||
7
plugins/provider/ofono/ofono.plugin.in
Normal file
7
plugins/provider/ofono/ofono.plugin.in
Normal file
@@ -0,0 +1,7 @@
|
||||
[Plugin]
|
||||
Module=ofono
|
||||
Name=oFono
|
||||
Description=oFono calls provider
|
||||
Authors=Bob Ham <rah@settrans.net>
|
||||
Copyright=Copyright (C) 2018 Purism SPC
|
||||
Website=@PACKAGE_URL_RAW@
|
||||
Reference in New Issue
Block a user