mobile: move old MM modem properties parsing in NMModemOld
This commit is contained in:
@@ -102,121 +102,47 @@ clear_modem_manager_support (NMModemManager *self)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
get_modem_properties (DBusGConnection *connection,
|
|
||||||
const char *path,
|
|
||||||
char **device,
|
|
||||||
char **data_device,
|
|
||||||
char **driver,
|
|
||||||
guint32 *type,
|
|
||||||
guint32 *ip_method,
|
|
||||||
guint32 *ip_timeout,
|
|
||||||
MMOldModemState *state)
|
|
||||||
{
|
|
||||||
DBusGProxy *proxy;
|
|
||||||
GError *err = NULL;
|
|
||||||
GHashTable *props = NULL;
|
|
||||||
GHashTableIter iter;
|
|
||||||
const char *prop;
|
|
||||||
GValue *value;
|
|
||||||
|
|
||||||
proxy = dbus_g_proxy_new_for_name (connection,
|
|
||||||
MM_OLD_DBUS_SERVICE,
|
|
||||||
path,
|
|
||||||
"org.freedesktop.DBus.Properties");
|
|
||||||
|
|
||||||
if (!dbus_g_proxy_call_with_timeout (proxy, "GetAll", 15000, &err,
|
|
||||||
G_TYPE_STRING, MM_OLD_DBUS_INTERFACE_MODEM,
|
|
||||||
G_TYPE_INVALID,
|
|
||||||
DBUS_TYPE_G_MAP_OF_VARIANT, &props,
|
|
||||||
G_TYPE_INVALID)) {
|
|
||||||
nm_log_warn (LOGD_MB, "could not get modem properties: %s %s",
|
|
||||||
err ? dbus_g_error_get_name (err) : "(none)",
|
|
||||||
err ? err->message : "(unknown)");
|
|
||||||
g_clear_error (&err);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!props) {
|
|
||||||
nm_log_warn (LOGD_MB, "no modem properties found");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, props);
|
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer) &prop, (gpointer) &value)) {
|
|
||||||
if (g_strcmp0 (prop, "Type") == 0)
|
|
||||||
*type = g_value_get_uint (value);
|
|
||||||
else if (g_strcmp0 (prop, "MasterDevice") == 0)
|
|
||||||
*device = g_value_dup_string (value);
|
|
||||||
else if (g_strcmp0 (prop, "IpMethod") == 0)
|
|
||||||
*ip_method = g_value_get_uint (value);
|
|
||||||
else if (g_strcmp0 (prop, "Device") == 0)
|
|
||||||
*data_device = g_value_dup_string (value);
|
|
||||||
else if (g_strcmp0 (prop, "Driver") == 0)
|
|
||||||
*driver = g_value_dup_string (value);
|
|
||||||
else if (g_strcmp0 (prop, "IpTimeout") == 0)
|
|
||||||
*ip_timeout = g_value_get_uint (value);
|
|
||||||
else if (g_strcmp0 (prop, "State") == 0)
|
|
||||||
*state = g_value_get_uint (value);
|
|
||||||
}
|
|
||||||
g_hash_table_unref (props);
|
|
||||||
|
|
||||||
out:
|
|
||||||
g_object_unref (proxy);
|
|
||||||
|
|
||||||
return *data_device && *driver;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
create_modem (NMModemManager *self, const char *path)
|
create_modem (NMModemManager *self, const char *path)
|
||||||
{
|
{
|
||||||
|
DBusGProxy *proxy;
|
||||||
|
GError *error = NULL;
|
||||||
NMModem *modem = NULL;
|
NMModem *modem = NULL;
|
||||||
char *data_device = NULL, *driver = NULL, *master_device = NULL;
|
GHashTable *properties;
|
||||||
uint modem_type = MM_OLD_MODEM_TYPE_UNKNOWN;
|
|
||||||
uint ip_method = MM_MODEM_IP_METHOD_PPP;
|
|
||||||
uint ip_timeout = 0;
|
|
||||||
MMOldModemState state = MM_OLD_MODEM_STATE_UNKNOWN;
|
|
||||||
|
|
||||||
if (g_hash_table_lookup (self->priv->modems, path)) {
|
if (g_hash_table_lookup (self->priv->modems, path)) {
|
||||||
nm_log_warn (LOGD_MB, "modem with path %s already exists, ignoring", path);
|
nm_log_warn (LOGD_MB, "modem with path %s already exists, ignoring", path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_modem_properties (nm_dbus_manager_get_connection (self->priv->dbus_mgr),
|
proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (self->priv->dbus_mgr),
|
||||||
path, &master_device, &data_device, &driver,
|
MM_OLD_DBUS_SERVICE,
|
||||||
&modem_type, &ip_method, &ip_timeout, &state))
|
path,
|
||||||
return;
|
DBUS_INTERFACE_PROPERTIES);
|
||||||
|
g_assert (proxy);
|
||||||
if (modem_type == MM_OLD_MODEM_TYPE_UNKNOWN) {
|
if (dbus_g_proxy_call_with_timeout (proxy, "GetAll", 15000, &error,
|
||||||
nm_log_warn (LOGD_MB, "modem with path %s has unknown type, ignoring", path);
|
G_TYPE_STRING, MM_OLD_DBUS_INTERFACE_MODEM,
|
||||||
return;
|
G_TYPE_INVALID,
|
||||||
|
DBUS_TYPE_G_MAP_OF_VARIANT, &properties,
|
||||||
|
G_TYPE_INVALID)) {
|
||||||
|
/* Success, create the modem */
|
||||||
|
modem = nm_modem_old_new (path, properties, &error);
|
||||||
|
if (modem) {
|
||||||
|
g_hash_table_insert (self->priv->modems, g_strdup (path), modem);
|
||||||
|
g_signal_emit (self, signals[MODEM_ADDED], 0, modem, nm_modem_get_driver (modem));
|
||||||
|
} else {
|
||||||
|
nm_log_warn (LOGD_MB, "failed to create modem: %s",
|
||||||
|
error ? error->message : "(unknown)");
|
||||||
|
}
|
||||||
|
g_hash_table_destroy (properties);
|
||||||
|
} else {
|
||||||
|
nm_log_warn (LOGD_MB, "could not get modem properties: %s %s",
|
||||||
|
error ? dbus_g_error_get_name (error) : "(none)",
|
||||||
|
error ? error->message : "(unknown)");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!master_device || !strlen (master_device)) {
|
g_object_unref (proxy);
|
||||||
nm_log_warn (LOGD_MB, "modem with path %s has unknown device, ignoring", path);
|
g_clear_error (&error);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!driver || !strlen (driver)) {
|
|
||||||
nm_log_warn (LOGD_MB, "modem with path %s has unknown driver, ignoring", path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!data_device || !strlen (data_device)) {
|
|
||||||
nm_log_warn (LOGD_MB, "modem with path %s has unknown data device, ignoring", path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
modem = nm_modem_old_new (path, data_device, ip_method, modem_type, state);
|
|
||||||
g_free (data_device);
|
|
||||||
|
|
||||||
if (modem) {
|
|
||||||
g_object_set (G_OBJECT (modem), NM_MODEM_IP_TIMEOUT, ip_timeout, NULL);
|
|
||||||
g_hash_table_insert (self->priv->modems, g_strdup (path), modem);
|
|
||||||
g_signal_emit (self, signals[MODEM_ADDED], 0, modem, driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (driver);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -969,25 +969,74 @@ nm_modem_old_get_capabilities (NMModemOld *self,
|
|||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
NMModem *
|
NMModem *
|
||||||
nm_modem_old_new (const char *path,
|
nm_modem_old_new (const char *path, GHashTable *properties, GError **error)
|
||||||
const char *data_device,
|
|
||||||
guint32 ip_method,
|
|
||||||
guint32 modem_type,
|
|
||||||
MMOldModemState state)
|
|
||||||
{
|
{
|
||||||
NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE;
|
NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE;
|
||||||
NMModemOld *self;
|
NMModemOld *self;
|
||||||
|
GHashTableIter iter;
|
||||||
|
const char *prop;
|
||||||
|
GValue *value;
|
||||||
|
const char *data_device = NULL;
|
||||||
|
const char *driver = NULL;
|
||||||
|
const char *master_device = NULL;
|
||||||
|
guint32 modem_type = MM_OLD_MODEM_TYPE_UNKNOWN;
|
||||||
|
guint32 ip_method = MM_MODEM_IP_METHOD_PPP;
|
||||||
|
guint32 ip_timeout = 0;
|
||||||
|
MMOldModemState state = MM_OLD_MODEM_STATE_UNKNOWN;
|
||||||
|
|
||||||
g_return_val_if_fail (path != NULL, NULL);
|
g_return_val_if_fail (path != NULL, NULL);
|
||||||
g_return_val_if_fail (data_device != NULL, NULL);
|
g_return_val_if_fail (properties != NULL, NULL);
|
||||||
g_return_val_if_fail (modem_type != MM_OLD_MODEM_TYPE_UNKNOWN, NULL);
|
|
||||||
|
g_hash_table_iter_init (&iter, properties);
|
||||||
|
while (g_hash_table_iter_next (&iter, (gpointer) &prop, (gpointer) &value)) {
|
||||||
|
if (g_strcmp0 (prop, "Type") == 0)
|
||||||
|
modem_type = g_value_get_uint (value);
|
||||||
|
else if (g_strcmp0 (prop, "MasterDevice") == 0)
|
||||||
|
master_device = g_value_get_string (value);
|
||||||
|
else if (g_strcmp0 (prop, "IpMethod") == 0)
|
||||||
|
ip_method = g_value_get_uint (value);
|
||||||
|
else if (g_strcmp0 (prop, "Device") == 0)
|
||||||
|
data_device = g_value_get_string (value);
|
||||||
|
else if (g_strcmp0 (prop, "Driver") == 0)
|
||||||
|
driver = g_value_get_string (value);
|
||||||
|
else if (g_strcmp0 (prop, "IpTimeout") == 0)
|
||||||
|
ip_timeout = g_value_get_uint (value);
|
||||||
|
else if (g_strcmp0 (prop, "State") == 0)
|
||||||
|
state = g_value_get_uint (value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modem_type == MM_OLD_MODEM_TYPE_UNKNOWN) {
|
||||||
|
g_set_error (error, NM_MODEM_ERROR, NM_MODEM_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"Unhandled modem type %d", modem_type);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!master_device || !strlen (master_device)) {
|
||||||
|
g_set_error_literal (error, NM_MODEM_ERROR, NM_MODEM_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"Failed to retrieve modem master device.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!driver || !strlen (driver)) {
|
||||||
|
g_set_error_literal (error, NM_MODEM_ERROR, NM_MODEM_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"Failed to retrieve modem driver.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data_device || !strlen (data_device)) {
|
||||||
|
g_set_error_literal (error, NM_MODEM_ERROR, NM_MODEM_ERROR_INITIALIZATION_FAILED,
|
||||||
|
"Failed to retrieve modem data device.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
self = (NMModemOld *) g_object_new (NM_TYPE_MODEM_OLD,
|
self = (NMModemOld *) g_object_new (NM_TYPE_MODEM_OLD,
|
||||||
NM_MODEM_PATH, path,
|
NM_MODEM_PATH, path,
|
||||||
|
NM_MODEM_DRIVER, driver,
|
||||||
NM_MODEM_UID, data_device,
|
NM_MODEM_UID, data_device,
|
||||||
NM_MODEM_CONTROL_PORT, NULL,
|
NM_MODEM_CONTROL_PORT, NULL,
|
||||||
NM_MODEM_DATA_PORT, data_device,
|
NM_MODEM_DATA_PORT, data_device,
|
||||||
NM_MODEM_IP_METHOD, ip_method,
|
NM_MODEM_IP_METHOD, ip_method,
|
||||||
|
NM_MODEM_IP_TIMEOUT, ip_timeout,
|
||||||
NM_MODEM_CONNECTED, (state == MM_OLD_MODEM_STATE_CONNECTED),
|
NM_MODEM_CONNECTED, (state == MM_OLD_MODEM_STATE_CONNECTED),
|
||||||
NULL);
|
NULL);
|
||||||
if (self) {
|
if (self) {
|
||||||
|
@@ -46,11 +46,7 @@ typedef struct {
|
|||||||
|
|
||||||
GType nm_modem_old_get_type (void);
|
GType nm_modem_old_get_type (void);
|
||||||
|
|
||||||
NMModem *nm_modem_old_new (const char *path,
|
NMModem *nm_modem_old_new (const char *path, GHashTable *properties, GError **error);
|
||||||
const char *data_device,
|
|
||||||
guint32 ip_method,
|
|
||||||
guint32 modem_type,
|
|
||||||
MMOldModemState state);
|
|
||||||
|
|
||||||
void nm_modem_old_get_capabilities (NMModemOld *self,
|
void nm_modem_old_get_capabilities (NMModemOld *self,
|
||||||
NMDeviceModemCapabilities *modem_caps,
|
NMDeviceModemCapabilities *modem_caps,
|
||||||
|
@@ -42,6 +42,7 @@ enum {
|
|||||||
PROP_DATA_PORT,
|
PROP_DATA_PORT,
|
||||||
PROP_PATH,
|
PROP_PATH,
|
||||||
PROP_UID,
|
PROP_UID,
|
||||||
|
PROP_DRIVER,
|
||||||
PROP_IP_METHOD,
|
PROP_IP_METHOD,
|
||||||
PROP_IP_TIMEOUT,
|
PROP_IP_TIMEOUT,
|
||||||
PROP_ENABLED,
|
PROP_ENABLED,
|
||||||
@@ -53,6 +54,7 @@ enum {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
char *uid;
|
char *uid;
|
||||||
char *path;
|
char *path;
|
||||||
|
char *driver;
|
||||||
char *control_port;
|
char *control_port;
|
||||||
char *data_port;
|
char *data_port;
|
||||||
char *ppp_iface;
|
char *ppp_iface;
|
||||||
@@ -633,6 +635,14 @@ nm_modem_get_path (NMModem *self)
|
|||||||
return NM_MODEM_GET_PRIVATE (self)->path;
|
return NM_MODEM_GET_PRIVATE (self)->path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
nm_modem_get_driver (NMModem *self)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_MODEM (self), NULL);
|
||||||
|
|
||||||
|
return NM_MODEM_GET_PRIVATE (self)->driver;
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
nm_modem_get_control_port (NMModem *self)
|
nm_modem_get_control_port (NMModem *self)
|
||||||
{
|
{
|
||||||
@@ -704,6 +714,9 @@ get_property (GObject *object, guint prop_id,
|
|||||||
case PROP_PATH:
|
case PROP_PATH:
|
||||||
g_value_set_string (value, priv->path);
|
g_value_set_string (value, priv->path);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DRIVER:
|
||||||
|
g_value_set_string (value, priv->driver);
|
||||||
|
break;
|
||||||
case PROP_CONTROL_PORT:
|
case PROP_CONTROL_PORT:
|
||||||
g_value_set_string (value, priv->control_port);
|
g_value_set_string (value, priv->control_port);
|
||||||
break;
|
break;
|
||||||
@@ -742,6 +755,10 @@ set_property (GObject *object, guint prop_id,
|
|||||||
/* Construct only */
|
/* Construct only */
|
||||||
priv->path = g_value_dup_string (value);
|
priv->path = g_value_dup_string (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DRIVER:
|
||||||
|
/* Construct only */
|
||||||
|
priv->driver = g_value_dup_string (value);
|
||||||
|
break;
|
||||||
case PROP_CONTROL_PORT:
|
case PROP_CONTROL_PORT:
|
||||||
priv->control_port = g_value_dup_string (value);
|
priv->control_port = g_value_dup_string (value);
|
||||||
break;
|
break;
|
||||||
@@ -790,6 +807,7 @@ finalize (GObject *object)
|
|||||||
|
|
||||||
g_free (priv->uid);
|
g_free (priv->uid);
|
||||||
g_free (priv->path);
|
g_free (priv->path);
|
||||||
|
g_free (priv->driver);
|
||||||
g_free (priv->control_port);
|
g_free (priv->control_port);
|
||||||
g_free (priv->data_port);
|
g_free (priv->data_port);
|
||||||
|
|
||||||
@@ -831,6 +849,14 @@ nm_modem_class_init (NMModemClass *klass)
|
|||||||
NULL,
|
NULL,
|
||||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_DRIVER,
|
||||||
|
g_param_spec_string (NM_MODEM_DRIVER,
|
||||||
|
"Driver",
|
||||||
|
"Driver",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||||
|
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class, PROP_CONTROL_PORT,
|
(object_class, PROP_CONTROL_PORT,
|
||||||
g_param_spec_string (NM_MODEM_CONTROL_PORT,
|
g_param_spec_string (NM_MODEM_CONTROL_PORT,
|
||||||
|
@@ -38,6 +38,7 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
#define NM_MODEM_UID "uid"
|
#define NM_MODEM_UID "uid"
|
||||||
#define NM_MODEM_PATH "path"
|
#define NM_MODEM_PATH "path"
|
||||||
|
#define NM_MODEM_DRIVER "driver"
|
||||||
#define NM_MODEM_CONTROL_PORT "control-port"
|
#define NM_MODEM_CONTROL_PORT "control-port"
|
||||||
#define NM_MODEM_DATA_PORT "data-port"
|
#define NM_MODEM_DATA_PORT "data-port"
|
||||||
#define NM_MODEM_IP_METHOD "ip-method"
|
#define NM_MODEM_IP_METHOD "ip-method"
|
||||||
@@ -61,6 +62,7 @@ typedef enum {
|
|||||||
NM_MODEM_ERROR_CONNECTION_NOT_CDMA, /*< nick=ConnectionNotCdma >*/
|
NM_MODEM_ERROR_CONNECTION_NOT_CDMA, /*< nick=ConnectionNotCdma >*/
|
||||||
NM_MODEM_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/
|
NM_MODEM_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/
|
||||||
NM_MODEM_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/
|
NM_MODEM_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/
|
||||||
|
NM_MODEM_ERROR_INITIALIZATION_FAILED, /*< nick=InitializationFailed >*/
|
||||||
} NMModemError;
|
} NMModemError;
|
||||||
|
|
||||||
#define NM_MODEM_ERROR (nm_modem_error_quark ())
|
#define NM_MODEM_ERROR (nm_modem_error_quark ())
|
||||||
@@ -121,6 +123,7 @@ const char *nm_modem_get_path (NMModem *modem);
|
|||||||
const char *nm_modem_get_uid (NMModem *modem);
|
const char *nm_modem_get_uid (NMModem *modem);
|
||||||
const char *nm_modem_get_control_port (NMModem *modem);
|
const char *nm_modem_get_control_port (NMModem *modem);
|
||||||
const char *nm_modem_get_data_port (NMModem *modem);
|
const char *nm_modem_get_data_port (NMModem *modem);
|
||||||
|
const char *nm_modem_get_driver (NMModem *modem);
|
||||||
|
|
||||||
gboolean nm_modem_check_connection_compatible (NMModem *self,
|
gboolean nm_modem_check_connection_compatible (NMModem *self,
|
||||||
NMConnection *connection,
|
NMConnection *connection,
|
||||||
|
Reference in New Issue
Block a user