diff options
author | Dan Winship <danw@gnome.org> | 2014-09-24 09:12:46 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2014-10-03 09:36:28 -0400 |
commit | a91e60902eabae1de93d61323dae6ac894b5d40f (patch) | |
tree | c70786c4c4a0ed28cb713ad42627a67916ec42d2 | |
parent | fcfb4b40badbb5cd944cee0c9819cb2649d0bb58 (diff) | |
download | NetworkManager-a91e60902eabae1de93d61323dae6ac894b5d40f.tar.gz |
libnm-core: make NMSettingSerial:parity an enum
NMSettingSerial:parity was defined as a char-typed property that could
have the (case-sensitive!) values 'n', 'E', or 'o'. This is zany. Add
an NMSettingSerialParity enum, and use that instead.
-rw-r--r-- | clients/cli/settings.c | 25 | ||||
-rw-r--r-- | libnm-core/nm-setting-serial.c | 50 | ||||
-rw-r--r-- | libnm-core/nm-setting-serial.h | 26 | ||||
-rw-r--r-- | libnm-core/tests/test-general.c | 35 | ||||
-rw-r--r-- | libnm-util/nm-setting-serial.c | 10 | ||||
-rw-r--r-- | libnm/libnm.ver | 1 | ||||
-rw-r--r-- | src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c | 2 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/reader.c | 54 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_BT | 1 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_Plain | 1 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/test-keyfile.c | 16 |
11 files changed, 201 insertions, 20 deletions
diff --git a/clients/cli/settings.c b/clients/cli/settings.c index 370b9d38da..4810b75e78 100644 --- a/clients/cli/settings.c +++ b/clients/cli/settings.c @@ -1425,7 +1425,6 @@ DEFINE_SECRET_FLAGS_GETTER (nmc_property_pppoe_get_password_flags, NM_SETTING_PP /* --- NM_SETTING_SERIAL_SETTING_NAME property get functions --- */ DEFINE_GETTER (nmc_property_serial_get_baud, NM_SETTING_SERIAL_BAUD) DEFINE_GETTER (nmc_property_serial_get_bits, NM_SETTING_SERIAL_BITS) -DEFINE_GETTER (nmc_property_serial_get_parity, NM_SETTING_SERIAL_PARITY) DEFINE_GETTER (nmc_property_serial_get_stopbits, NM_SETTING_SERIAL_STOPBITS) DEFINE_GETTER (nmc_property_serial_get_send_delay, NM_SETTING_SERIAL_SEND_DELAY) @@ -3680,17 +3679,33 @@ nmc_property_olpc_set_channel (NMSetting *setting, const char *prop, const char /* --- NM_SETTING_SERIAL_SETTING_NAME property setter functions --- */ +static char * +nmc_property_serial_get_parity (NMSetting *setting) +{ + NMSettingSerial *s_serial = NM_SETTING_SERIAL (setting); + + switch (nm_setting_serial_get_parity (s_serial)) { + case NM_SETTING_SERIAL_PARITY_EVEN: + return g_strdup ("even"); + case NM_SETTING_SERIAL_PARITY_ODD: + return g_strdup ("odd"); + default: + case NM_SETTING_SERIAL_PARITY_NONE: + return g_strdup ("none"); + } +} + static gboolean nmc_property_serial_set_parity (NMSetting *setting, const char *prop, const char *val, GError **error) { - char parity; + NMSettingSerialParity parity; if (val[0] == 'E' || val[0] == 'e') - parity = 'E'; + parity = NM_SETTING_SERIAL_PARITY_EVEN; else if (val[0] == 'O' || val[0] == 'o') - parity = 'o'; + parity = NM_SETTING_SERIAL_PARITY_ODD; else if (val[0] == 'N' || val[0] == 'n') - parity = 'n'; + parity = NM_SETTING_SERIAL_PARITY_NONE; else { g_set_error (error, 1, 0, _("'%s' is not valid; use [e, o, n]"), val); return FALSE; diff --git a/libnm-core/nm-setting-serial.c b/libnm-core/nm-setting-serial.c index 7ee2eb710b..f2651a1821 100644 --- a/libnm-core/nm-setting-serial.c +++ b/libnm-core/nm-setting-serial.c @@ -127,7 +127,7 @@ nm_setting_serial_get_bits (NMSettingSerial *setting) * * Returns: the #NMSettingSerial:parity property of the setting **/ -char +NMSettingSerialParity nm_setting_serial_get_parity (NMSettingSerial *setting) { g_return_val_if_fail (NM_IS_SETTING_SERIAL (setting), 0); @@ -174,6 +174,37 @@ nm_setting_serial_init (NMSettingSerial *setting) { } +static GVariant * +parity_to_dbus (const GValue *from) +{ + switch (g_value_get_enum (from)) { + case NM_SETTING_SERIAL_PARITY_EVEN: + return g_variant_new_byte ('E'); + case NM_SETTING_SERIAL_PARITY_ODD: + return g_variant_new_byte ('o'); + case NM_SETTING_SERIAL_PARITY_NONE: + default: + return g_variant_new_byte ('n'); + } +} + +static void +parity_from_dbus (GVariant *from, GValue *to) +{ + switch (g_variant_get_byte (from)) { + case 'E': + g_value_set_enum (to, NM_SETTING_SERIAL_PARITY_EVEN); + break; + case 'o': + g_value_set_enum (to, NM_SETTING_SERIAL_PARITY_ODD); + break; + case 'n': + default: + g_value_set_enum (to, NM_SETTING_SERIAL_PARITY_NONE); + break; + } +} + static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) @@ -188,7 +219,7 @@ set_property (GObject *object, guint prop_id, priv->bits = g_value_get_uint (value); break; case PROP_PARITY: - priv->parity = g_value_get_schar (value); + priv->parity = g_value_get_enum (value); break; case PROP_STOPBITS: priv->stopbits = g_value_get_uint (value); @@ -216,7 +247,7 @@ get_property (GObject *object, guint prop_id, g_value_set_uint (value, nm_setting_serial_get_bits (setting)); break; case PROP_PARITY: - g_value_set_schar (value, nm_setting_serial_get_parity (setting)); + g_value_set_enum (value, nm_setting_serial_get_parity (setting)); break; case PROP_STOPBITS: g_value_set_uint (value, nm_setting_serial_get_stopbits (setting)); @@ -276,16 +307,21 @@ nm_setting_serial_class_init (NMSettingSerialClass *setting_class) /** * NMSettingSerial:parity: * - * Parity setting of the serial port. Either 'E' for even parity, 'o' for - * odd parity, or 'n' for no parity. + * Parity setting of the serial port. **/ g_object_class_install_property (object_class, PROP_PARITY, - g_param_spec_char (NM_SETTING_SERIAL_PARITY, "", "", - 'E', 'o', 'n', + g_param_spec_enum (NM_SETTING_SERIAL_PARITY, "", "", + NM_TYPE_SETTING_SERIAL_PARITY, + NM_SETTING_SERIAL_PARITY_NONE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + _nm_setting_class_transform_property (parent_class, + NM_SETTING_SERIAL_PARITY, + G_VARIANT_TYPE_BYTE, + parity_to_dbus, + parity_from_dbus); /** * NMSettingSerial:stopbits: diff --git a/libnm-core/nm-setting-serial.h b/libnm-core/nm-setting-serial.h index b1274a86cb..80600ff80f 100644 --- a/libnm-core/nm-setting-serial.h +++ b/libnm-core/nm-setting-serial.h @@ -59,6 +59,20 @@ typedef enum { #define NM_SETTING_SERIAL_ERROR nm_setting_serial_error_quark () GQuark nm_setting_serial_error_quark (void); +/** + * NMSettingSerialParity: + * @NM_SETTING_SERIAL_PARITY_NONE: No parity bits (default) + * @NM_SETTING_SERIAL_PARITY_EVEN: Even parity + * @NM_SETTING_SERIAL_PARITY_ODD: Odd parity + * + * The parity setting of a serial port. + */ +typedef enum { + NM_SETTING_SERIAL_PARITY_NONE = 0, + NM_SETTING_SERIAL_PARITY_EVEN, + NM_SETTING_SERIAL_PARITY_ODD +} NMSettingSerialParity; + #define NM_SETTING_SERIAL_BAUD "baud" #define NM_SETTING_SERIAL_BITS "bits" #define NM_SETTING_SERIAL_PARITY "parity" @@ -78,12 +92,12 @@ typedef struct { GType nm_setting_serial_get_type (void); -NMSetting *nm_setting_serial_new (void); -guint nm_setting_serial_get_baud (NMSettingSerial *setting); -guint nm_setting_serial_get_bits (NMSettingSerial *setting); -char nm_setting_serial_get_parity (NMSettingSerial *setting); -guint nm_setting_serial_get_stopbits (NMSettingSerial *setting); -guint64 nm_setting_serial_get_send_delay (NMSettingSerial *setting); +NMSetting *nm_setting_serial_new (void); +guint nm_setting_serial_get_baud (NMSettingSerial *setting); +guint nm_setting_serial_get_bits (NMSettingSerial *setting); +NMSettingSerialParity nm_setting_serial_get_parity (NMSettingSerial *setting); +guint nm_setting_serial_get_stopbits (NMSettingSerial *setting); +guint64 nm_setting_serial_get_send_delay (NMSettingSerial *setting); G_END_DECLS diff --git a/libnm-core/tests/test-general.c b/libnm-core/tests/test-general.c index efd3686d0f..2cb6137866 100644 --- a/libnm-core/tests/test-general.c +++ b/libnm-core/tests/test-general.c @@ -710,7 +710,7 @@ test_setting_to_dbus_transform (void) static void test_setting_to_dbus_enum (void) { - NMSetting *s_ip6, *s_wsec; + NMSetting *s_ip6, *s_wsec, *s_serial; GVariant *dict, *val; /* enum */ @@ -754,6 +754,23 @@ test_setting_to_dbus_enum (void) g_variant_unref (dict); g_object_unref (s_wsec); + + /* another transformed enum */ + s_serial = nm_setting_serial_new (); + g_object_set (s_serial, + NM_SETTING_SERIAL_PARITY, NM_SETTING_SERIAL_PARITY_ODD, + NULL); + + dict = _nm_setting_to_dbus (s_serial, NULL, NM_CONNECTION_SERIALIZE_ALL); + g_assert (dict != NULL); + + val = g_variant_lookup_value (dict, NM_SETTING_SERIAL_PARITY, G_VARIANT_TYPE_BYTE); + g_assert (val != NULL); + g_assert_cmpint (g_variant_get_byte (val), ==, 'o'); + g_variant_unref (val); + + g_variant_unref (dict); + g_object_unref (s_serial); } static void @@ -887,6 +904,7 @@ test_setting_new_from_dbus_enum (void) { NMSettingIP6Config *s_ip6; NMSettingWirelessSecurity *s_wsec; + NMSettingSerial *s_serial; GVariant *dict; GVariantBuilder builder; GError *error = NULL; @@ -926,6 +944,21 @@ test_setting_new_from_dbus_enum (void) g_variant_unref (dict); g_object_unref (s_wsec); + + /* another transformed enum */ + g_variant_builder_init (&builder, NM_VARIANT_TYPE_SETTING); + g_variant_builder_add (&builder, "{sv}", + NM_SETTING_SERIAL_PARITY, + g_variant_new_byte ('E')); + dict = g_variant_builder_end (&builder); + + s_serial = (NMSettingSerial *) _nm_setting_new_from_dbus (NM_TYPE_SETTING_SERIAL, dict, NULL, &error); + g_assert_no_error (error); + + g_assert_cmpint (nm_setting_serial_get_parity (s_serial), ==, NM_SETTING_SERIAL_PARITY_EVEN); + + g_variant_unref (dict); + g_object_unref (s_serial); } static NMConnection * diff --git a/libnm-util/nm-setting-serial.c b/libnm-util/nm-setting-serial.c index 4a7ee89e65..0f03e29ffe 100644 --- a/libnm-util/nm-setting-serial.c +++ b/libnm-util/nm-setting-serial.c @@ -283,6 +283,16 @@ nm_setting_serial_class_init (NMSettingSerialClass *setting_class) * Parity setting of the serial port. Either 'E' for even parity, 'o' for * odd parity, or 'n' for no parity. **/ + /* plugins docs + * ---keyfile--- + * property: parity + * format: 'e', 'o', or 'n' + * description: The connection parity; even, odd, or none. Note that older + * versions of NetworkManager stored this as an integer: 69 ('E') for even, + * 111 ('o') for odd, or 110 ('n') for none. + * example: parity=n + * ---end--- + */ g_object_class_install_property (object_class, PROP_PARITY, g_param_spec_char (NM_SETTING_SERIAL_PARITY, "", "", diff --git a/libnm/libnm.ver b/libnm/libnm.ver index 98a80082df..08182f8c09 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -742,6 +742,7 @@ global: nm_setting_serial_get_stopbits; nm_setting_serial_get_type; nm_setting_serial_new; + nm_setting_serial_parity_get_type; nm_setting_set_secret_flags; nm_setting_team_error_get_type; nm_setting_team_error_quark; diff --git a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c index c48e9ed44e..c27f50a033 100644 --- a/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c +++ b/src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh.c @@ -11331,7 +11331,7 @@ test_write_mobile_broadband (gboolean gsm) g_object_set (s_serial, NM_SETTING_SERIAL_BAUD, 115200, NM_SETTING_SERIAL_BITS, 8, - NM_SETTING_SERIAL_PARITY, 'n', + NM_SETTING_SERIAL_PARITY, NM_SETTING_SERIAL_PARITY_NONE, NM_SETTING_SERIAL_STOPBITS, 1, NULL); diff --git a/src/settings/plugins/keyfile/reader.c b/src/settings/plugins/keyfile/reader.c index 15410bbf6d..c925dc5028 100644 --- a/src/settings/plugins/keyfile/reader.c +++ b/src/settings/plugins/keyfile/reader.c @@ -893,6 +893,56 @@ cert_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char g_bytes_unref (bytes); } +static void +parity_parser (NMSetting *setting, const char *key, GKeyFile *keyfile, const char *keyfile_path) +{ + const char *setting_name = nm_setting_get_name (setting); + NMSettingSerialParity parity; + int int_val; + char *str_val; + + /* Keyfile traditionally stored this as the ASCII value for 'E', 'o', or 'n'. + * We now accept either that or the (case-insensitive) character itself (but + * still always write it the old way, for backward compatibility). + */ + int_val = nm_keyfile_plugin_kf_get_integer (keyfile, setting_name, key, NULL); + if (!int_val) { + str_val = nm_keyfile_plugin_kf_get_string (keyfile, setting_name, key, NULL); + if (str_val) { + if (str_val[0] && !str_val[1]) + int_val = str_val[0]; + else { + /* This will hit the warning below */ + int_val = 'X'; + } + } + } + + if (!int_val) + return; + + switch (int_val) { + case 'E': + case 'e': + parity = NM_SETTING_SERIAL_PARITY_EVEN; + break; + case 'O': + case 'o': + parity = NM_SETTING_SERIAL_PARITY_ODD; + break; + case 'N': + case 'n': + parity = NM_SETTING_SERIAL_PARITY_NONE; + break; + default: + nm_log_warn (LOGD_SETTINGS, "%s: ignoring invalid value for %s / %s", + __func__, setting_name, key); + return; + } + + g_object_set (setting, key, parity, NULL); +} + typedef struct { const char *setting_name; const char *key; @@ -1003,6 +1053,10 @@ static KeyParser key_parsers[] = { NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, TRUE, cert_parser }, + { NM_SETTING_SERIAL_SETTING_NAME, + NM_SETTING_SERIAL_PARITY, + TRUE, + parity_parser }, { NULL, NULL, FALSE } }; diff --git a/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_BT b/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_BT index cc8a9ee390..162bf72e58 100644 --- a/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_BT +++ b/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_BT @@ -16,6 +16,7 @@ apn=ISP.CINGULAR [serial] baud=115200 +parity=o [bluetooth] bdaddr=00:11:22:33:44:55 diff --git a/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_Plain b/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_Plain index 236cca0edf..902b842797 100644 --- a/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_Plain +++ b/src/settings/plugins/keyfile/tests/keyfiles/ATT_Data_Connect_Plain @@ -18,3 +18,4 @@ pin=2345 [serial] baud=115200 +parity=111 diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c index 5fbea1204b..ab705503bb 100644 --- a/src/settings/plugins/keyfile/tests/test-keyfile.c +++ b/src/settings/plugins/keyfile/tests/test-keyfile.c @@ -1724,6 +1724,7 @@ test_read_bt_dun_connection (void) const char *bdaddr; const guint8 expected_bdaddr[ETH_ALEN] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }; const char *tmp; + NMSettingSerialParity parity; const char *expected_id = "AT&T Data Connect BT"; const char *expected_uuid = "089130ab-ce28-46e4-ad77-d44869b03d19"; const char *expected_apn = "ISP.CINGULAR"; @@ -1860,6 +1861,13 @@ test_read_bt_dun_connection (void) TEST_BT_DUN_FILE, NM_SETTING_SERIAL_SETTING_NAME); + parity = nm_setting_serial_get_parity (s_serial); + ASSERT (parity == NM_SETTING_SERIAL_PARITY_ODD, + "connection-verify-serial", "failed to verify %s: unexpected %s / %s key value", + TEST_BT_DUN_FILE, + NM_SETTING_SERIAL_SETTING_NAME, + NM_SETTING_SERIAL_PARITY); + g_object_unref (connection); } @@ -1965,6 +1973,7 @@ test_read_gsm_connection (void) NMSettingBluetooth *s_bluetooth; GError *error = NULL; const char *tmp; + NMSettingSerialParity parity; const char *expected_id = "AT&T Data Connect"; const char *expected_apn = "ISP.CINGULAR"; const char *expected_username = "ISP@CINGULARGPRS.COM"; @@ -2102,6 +2111,13 @@ test_read_gsm_connection (void) TEST_GSM_FILE, NM_SETTING_SERIAL_SETTING_NAME); + parity = nm_setting_serial_get_parity (s_serial); + ASSERT (parity == NM_SETTING_SERIAL_PARITY_ODD, + "connection-verify-serial", "failed to verify %s: unexpected %s / %s key value", + TEST_GSM_FILE, + NM_SETTING_SERIAL_SETTING_NAME, + NM_SETTING_SERIAL_PARITY); + g_object_unref (connection); } |