mobile: move old MM modem properties parsing in NMModemOld

This commit is contained in:
Dan Williams
2013-05-29 14:20:45 -05:00
parent 88b26172d6
commit d6f1d09604
5 changed files with 115 additions and 115 deletions

View File

@@ -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
create_modem (NMModemManager *self, const char *path)
{
DBusGProxy *proxy;
GError *error = NULL;
NMModem *modem = NULL;
char *data_device = NULL, *driver = NULL, *master_device = NULL;
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;
GHashTable *properties;
if (g_hash_table_lookup (self->priv->modems, path)) {
nm_log_warn (LOGD_MB, "modem with path %s already exists, ignoring", path);
return;
}
if (!get_modem_properties (nm_dbus_manager_get_connection (self->priv->dbus_mgr),
path, &master_device, &data_device, &driver,
&modem_type, &ip_method, &ip_timeout, &state))
return;
if (modem_type == MM_OLD_MODEM_TYPE_UNKNOWN) {
nm_log_warn (LOGD_MB, "modem with path %s has unknown type, ignoring", path);
return;
proxy = dbus_g_proxy_new_for_name (nm_dbus_manager_get_connection (self->priv->dbus_mgr),
MM_OLD_DBUS_SERVICE,
path,
DBUS_INTERFACE_PROPERTIES);
g_assert (proxy);
if (dbus_g_proxy_call_with_timeout (proxy, "GetAll", 15000, &error,
G_TYPE_STRING, MM_OLD_DBUS_INTERFACE_MODEM,
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)) {
nm_log_warn (LOGD_MB, "modem with path %s has unknown device, ignoring", path);
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);
g_object_unref (proxy);
g_clear_error (&error);
}
static void

View File

@@ -969,25 +969,74 @@ nm_modem_old_get_capabilities (NMModemOld *self,
/*****************************************************************************/
NMModem *
nm_modem_old_new (const char *path,
const char *data_device,
guint32 ip_method,
guint32 modem_type,
MMOldModemState state)
nm_modem_old_new (const char *path, GHashTable *properties, GError **error)
{
NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE;
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 (data_device != NULL, NULL);
g_return_val_if_fail (modem_type != MM_OLD_MODEM_TYPE_UNKNOWN, NULL);
g_return_val_if_fail (properties != NULL, 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,
NM_MODEM_PATH, path,
NM_MODEM_DRIVER, driver,
NM_MODEM_UID, data_device,
NM_MODEM_CONTROL_PORT, NULL,
NM_MODEM_DATA_PORT, data_device,
NM_MODEM_IP_METHOD, ip_method,
NM_MODEM_IP_TIMEOUT, ip_timeout,
NM_MODEM_CONNECTED, (state == MM_OLD_MODEM_STATE_CONNECTED),
NULL);
if (self) {

View File

@@ -46,11 +46,7 @@ typedef struct {
GType nm_modem_old_get_type (void);
NMModem *nm_modem_old_new (const char *path,
const char *data_device,
guint32 ip_method,
guint32 modem_type,
MMOldModemState state);
NMModem *nm_modem_old_new (const char *path, GHashTable *properties, GError **error);
void nm_modem_old_get_capabilities (NMModemOld *self,
NMDeviceModemCapabilities *modem_caps,

View File

@@ -42,6 +42,7 @@ enum {
PROP_DATA_PORT,
PROP_PATH,
PROP_UID,
PROP_DRIVER,
PROP_IP_METHOD,
PROP_IP_TIMEOUT,
PROP_ENABLED,
@@ -53,6 +54,7 @@ enum {
typedef struct {
char *uid;
char *path;
char *driver;
char *control_port;
char *data_port;
char *ppp_iface;
@@ -633,6 +635,14 @@ nm_modem_get_path (NMModem *self)
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 *
nm_modem_get_control_port (NMModem *self)
{
@@ -704,6 +714,9 @@ get_property (GObject *object, guint prop_id,
case PROP_PATH:
g_value_set_string (value, priv->path);
break;
case PROP_DRIVER:
g_value_set_string (value, priv->driver);
break;
case PROP_CONTROL_PORT:
g_value_set_string (value, priv->control_port);
break;
@@ -742,6 +755,10 @@ set_property (GObject *object, guint prop_id,
/* Construct only */
priv->path = g_value_dup_string (value);
break;
case PROP_DRIVER:
/* Construct only */
priv->driver = g_value_dup_string (value);
break;
case PROP_CONTROL_PORT:
priv->control_port = g_value_dup_string (value);
break;
@@ -790,6 +807,7 @@ finalize (GObject *object)
g_free (priv->uid);
g_free (priv->path);
g_free (priv->driver);
g_free (priv->control_port);
g_free (priv->data_port);
@@ -831,6 +849,14 @@ nm_modem_class_init (NMModemClass *klass)
NULL,
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
(object_class, PROP_CONTROL_PORT,
g_param_spec_string (NM_MODEM_CONTROL_PORT,

View File

@@ -38,6 +38,7 @@ G_BEGIN_DECLS
#define NM_MODEM_UID "uid"
#define NM_MODEM_PATH "path"
#define NM_MODEM_DRIVER "driver"
#define NM_MODEM_CONTROL_PORT "control-port"
#define NM_MODEM_DATA_PORT "data-port"
#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_INVALID, /*< nick=ConnectionInvalid >*/
NM_MODEM_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/
NM_MODEM_ERROR_INITIALIZATION_FAILED, /*< nick=InitializationFailed >*/
} NMModemError;
#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_control_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,
NMConnection *connection,