For the finale, this is the libnm-glib and nmcli part of the support,
with this you can now make a full pppoatm connection from NetworkManager
by configuring it in system scope in a keyfile.

As an example, here is mine:
(password and username snipped for obvious reasons)

[connection]
id=MYISP
uuid=34d04e69-fdd9-4231-af2c-25ed1f34dc1e
type=adsl
timestamp=1304621332

[adsl]
username=u...@myisp.com
password=mypassword
vpi=8
vci=35
encapsulation=vcmux
protocol=pppoa

[ipv6]
method=ignore

[ipv4]
method=auto

Extract from logs:
NetworkManager[29155]: <info> Activation (ueagle-atm0) starting connection 
'MYISP'
NetworkManager[29155]: <info> (ueagle-atm0): device state change: disconnected 
-> prepare (reason 'none') [30 40 0]
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 1 of 5 (Device 
Prepare) scheduled...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 1 of 5 (Device 
Prepare) started...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 2 of 5 (Device 
Configure) scheduled...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 1 of 5 (Device 
Prepare) complete.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 2 of 5 (Device 
Configure) starting...
NetworkManager[29155]: <info> (ueagle-atm0): device state change: prepare -> 
config (reason 'none') [40 50 0]
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 2 of 5 (Device 
Configure) successful.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 3 of 5 (IP 
Configure Start) scheduled.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 2 of 5 (Device 
Configure) complete.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 3 of 5 (IP 
Configure Start) started...
NetworkManager[29155]: <info> (ueagle-atm0): device state change: config -> 
ip-config (reason 'none') [50 70 0]
NetworkManager[29155]: <info> starting PPP connection
NetworkManager[29155]: <debug> [1304671146.590156] [nm-ppp-manager.c:1047] 
nm_ppp_manager_start(): command line: /usr/sbin/pppd nodetach lock 
nodefaultroute user u...@myisp.com plugin pppoatm.so 8.35 noipdefault noauth 
usepeerdns lcp-echo-failure 0 lcp-echo-interval 0 ipparam 
/org/freedesktop/NetworkManager/PPP/0 plugin 
/opt/nmadsl/lib/pppd/2.4.5/nm-pppd-plugin.so
NetworkManager[29155]: <info> pppd started with pid 29175
NetworkManager[29155]: <debug> [1304671146.591235] [NetworkManagerUtils.c:816] 
nm_utils_get_proc_sys_net_value(): (ueagle-atm0): error reading 
/proc/sys/net/ipv6/conf/ueagle-atm0/accept_ra: (4) Failed to open file 
'/proc/sys/net/ipv6/conf/ueagle-atm0/accept_ra': No such file or directory
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 3 of 5 (IP 
Configure Start) complete.
Plugin pppoatm.so loaded.
Plugin /opt/nmadsl/lib/pppd/2.4.5/nm-pppd-plugin.so loaded.
** Message: nm-ppp-plugin: (plugin_init): initializing
** Message: nm-ppp-plugin: (nm_phasechange): status 3 / phase 'serial 
connection'
NetworkManager[29155]: <debug> [1304671146.612937] [nm-udev-manager.c:621] 
handle_uevent(): UDEV event: action 'add' subsys 'net' device 'ppp0'
NetworkManager[29155]: <debug> [1304671146.613134] [nm-udev-manager.c:525] 
net_add(): ignoring interface with type 512
NetworkManager[29155]: <debug> [1304671146.617308] [nm-netlink-monitor.c:117] 
link_msg_handler(): netlink link message: iface idx 35 flags 0x1090
Using interface ppp0
Connect: ppp0 <--> 8.35
** Message: nm-ppp-plugin: (nm_phasechange): status 5 / phase 'establish'
** Message: nm-ppp-plugin: (nm_phasechange): status 6 / phase 'authenticate'
** Message: nm-ppp-plugin: (get_credentials): passwd-hook, requesting 
credentials...
NetworkManager[29155]: <debug> [1304671149.639511] [nm-agent-manager.c:1044] 
nm_agent_manager_get_secrets(): Secrets requested for connection 
/org/freedesktop/NetworkManager/Settings/0 (adsl)
NetworkManager[29155]: <debug> [1304671149.639684] 
[nm-settings-connection.c:717] nm_settings_connection_get_secrets(): 
(34d04e69-fdd9-4231-af2c-25ed1f34dc1e/adsl:1) secrets requested flags 0x1 hint 
'password'
NetworkManager[29155]: <debug> [1304671149.640950] [nm-agent-manager.c:959] 
get_start(): (0x9b4ad10/adsl) system settings secrets sufficient
NetworkManager[29155]: <debug> [1304671149.641332] 
[nm-settings-connection.c:573] agent_secrets_done_cb(): 
(34d04e69-fdd9-4231-af2c-25ed1f34dc1e/adsl:1) existing secrets returned
NetworkManager[29155]: <debug> [1304671149.641541] 
[nm-settings-connection.c:579] agent_secrets_done_cb(): 
(34d04e69-fdd9-4231-af2c-25ed1f34dc1e/adsl:1) secrets request completed
NetworkManager[29155]: <debug> [1304671149.643074] 
[nm-settings-connection.c:618] agent_secrets_done_cb(): 
(34d04e69-fdd9-4231-af2c-25ed1f34dc1e/adsl:1) new agent secrets processed
** Message: nm-ppp-plugin: (get_credentials): got credentials from 
NetworkManager
PAP authentication succeeded
** Message: nm-ppp-plugin: (nm_phasechange): status 8 / phase 'network'
local  IP address 94.70.90.201
remote IP address 80.106.108.12
primary   DNS address 195.170.0.1
secondary DNS address 195.170.2.2
** Message: nm-ppp-plugin: (nm_phasechange): status 9 / phase 'running'
** Message: nm-ppp-plugin: (nm_ip_up): ip-up event
** Message: nm-ppp-plugin: (nm_ip_up): sending Ip4Config to NetworkManager...
NetworkManager[29155]: <debug> [1304671150.607440] [nm-netlink-monitor.c:117] 
link_msg_handler(): netlink link message: iface idx 35 flags 0x110D1
NetworkManager[29155]: <info> PPP manager(IP Config Get) reply received.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 4 of 5 (IP4 
Configure Get) scheduled...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 4 of 5 (IP4 
Configure Get) started...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 5 of 5 (IP 
Configure Commit) scheduled...
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 4 of 5 (IP4 
Configure Get) complete.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 5 of 5 (IP 
Configure Commit) started...
NetworkManager[29155]: <debug> [1304671150.608918] [nm-system.c:222] 
sync_addresses(): (ppp0): syncing addresses (family 2)
NetworkManager[29155]: <info> (ueagle-atm0): device state change: ip-config -> 
activated (reason 'none') [70 100 0]
NetworkManager[29155]: <info> Policy set 'MYISP' (ppp0) as default for IPv4 
routing and DNS.
NetworkManager[29155]: <info> Activation (ueagle-atm0) successful, device 
activated.
NetworkManager[29155]: <info> Activation (ueagle-atm0) Stage 5 of 5 (IP 
Configure Commit) complete.

Signed-off-by: Pantelis Koukousoulas <pkt...@gmail.com>
---
 cli/src/connections.c       |   66 ++++++++++--
 cli/src/devices.c           |    4 +
 cli/src/settings.c          |   50 +++++++++
 cli/src/settings.h          |    2 +
 libnm-glib/Makefile.am      |    6 +
 libnm-glib/libnm-glib.ver   |    4 +-
 libnm-glib/nm-device-adsl.c |  236 +++++++++++++++++++++++++++++++++++++++++++
 libnm-glib/nm-device-adsl.h |   62 +++++++++++
 libnm-glib/nm-device.c      |   10 ++-
 libnm-util/nm-connection.c  |   25 +++++-
 libnm-util/nm-connection.h  |    2 +
 11 files changed, 451 insertions(+), 16 deletions(-)
 create mode 100644 libnm-glib/nm-device-adsl.c
 create mode 100644 libnm-glib/nm-device-adsl.h

diff --git a/cli/src/connections.c b/cli/src/connections.c
index 2646aa9..5308f04 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -34,6 +34,7 @@
 #include <nm-client.h>
 #include <nm-setting-connection.h>
 #include <nm-setting-wired.h>
+#include <nm-setting-adsl.h>
 #include <nm-setting-pppoe.h>
 #include <nm-setting-wireless.h>
 #include <nm-setting-gsm.h>
@@ -44,6 +45,7 @@
 #include <nm-setting-wimax.h>
 #endif
 #include <nm-device-ethernet.h>
+#include <nm-device-adsl.h>
 #include <nm-device-wifi.h>
 #if WITH_WIMAX
 #include <nm-device-wimax.h>
@@ -104,12 +106,13 @@ static NmcOutputField nmc_fields_settings_names[] = {
        SETTING_FIELD (NM_SETTING_SERIAL_SETTING_NAME, 0),                /* 7 
*/
        SETTING_FIELD (NM_SETTING_PPP_SETTING_NAME, 0),                   /* 8 
*/
        SETTING_FIELD (NM_SETTING_PPPOE_SETTING_NAME, 0),                 /* 9 
*/
-       SETTING_FIELD (NM_SETTING_GSM_SETTING_NAME, 0),                   /* 10 
*/
-       SETTING_FIELD (NM_SETTING_CDMA_SETTING_NAME, 0),                  /* 11 
*/
-       SETTING_FIELD (NM_SETTING_BLUETOOTH_SETTING_NAME, 0),             /* 12 
*/
-       SETTING_FIELD (NM_SETTING_OLPC_MESH_SETTING_NAME, 0),             /* 13 
*/
-       SETTING_FIELD (NM_SETTING_VPN_SETTING_NAME, 0),                   /* 14 
*/
-       SETTING_FIELD (NM_SETTING_WIMAX_SETTING_NAME, 0),                 /* 15 
*/
+       SETTING_FIELD (NM_SETTING_ADSL_SETTING_NAME, 0),                  /* 10 
*/
+       SETTING_FIELD (NM_SETTING_GSM_SETTING_NAME, 0),                   /* 11 
*/
+       SETTING_FIELD (NM_SETTING_CDMA_SETTING_NAME, 0),                  /* 12 
*/
+       SETTING_FIELD (NM_SETTING_BLUETOOTH_SETTING_NAME, 0),             /* 13 
*/
+       SETTING_FIELD (NM_SETTING_OLPC_MESH_SETTING_NAME, 0),             /* 14 
*/
+       SETTING_FIELD (NM_SETTING_VPN_SETTING_NAME, 0),                   /* 15 
*/
+       SETTING_FIELD (NM_SETTING_WIMAX_SETTING_NAME, 0),                 /* 16 
*/
        {NULL, NULL, 0, NULL, 0}
 };
 #define NMC_FIELDS_SETTINGS_NAMES_ALL_X  NM_SETTING_CONNECTION_SETTING_NAME","\
@@ -122,6 +125,7 @@ static NmcOutputField nmc_fields_settings_names[] = {
                                          NM_SETTING_SERIAL_SETTING_NAME","\
                                          NM_SETTING_PPP_SETTING_NAME","\
                                          NM_SETTING_PPPOE_SETTING_NAME","\
+                                         NM_SETTING_ADSL_SETTING_NAME","\
                                          NM_SETTING_GSM_SETTING_NAME","\
                                          NM_SETTING_CDMA_SETTING_NAME","\
                                          NM_SETTING_BLUETOOTH_SETTING_NAME","\
@@ -331,6 +335,15 @@ nmc_connection_detail (NMConnection *connection, NmCli 
*nmc)
                }
 
                if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[10].name)) {
+                       setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_ADSL);
+                       if (setting) {
+                               setting_adsl_details (setting, nmc);
+                               was_output = TRUE;
+                               continue;
+                       }
+               }
+
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[11].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_GSM);
                        if (setting) {
                                setting_gsm_details (setting, nmc);
@@ -339,7 +352,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
                        }
                }
 
-               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[11].name)) {
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[12].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_CDMA);
                        if (setting) {
                                setting_cdma_details (setting, nmc);
@@ -348,7 +361,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
                        }
                }
 
-               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[12].name)) {
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[13].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_BLUETOOTH);
                        if (setting) {
                                setting_bluetooth_details (setting, nmc);
@@ -357,7 +370,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
                        }
                }
 
-               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[13].name)) {
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[14].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_OLPC_MESH);
                        if (setting) {
                                setting_olpc_mesh_details (setting, nmc);
@@ -366,7 +379,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
                        }
                }
 
-               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[14].name)) {
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[15].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_VPN);
                        if (setting) {
                                setting_vpn_details (setting, nmc);
@@ -376,7 +389,7 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
                }
 
 #if WITH_WIMAX
-               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[15].name)) {
+               if (!strcasecmp (nmc_fields_settings_names[section_idx].name, 
nmc_fields_settings_names[16].name)) {
                        setting = nm_connection_get_setting (connection, 
NM_TYPE_SETTING_WIMAX);
                        if (setting) {
                                setting_wimax_details (setting, nmc);
@@ -968,6 +981,35 @@ check_modem_compatible (NMDeviceModem *device, 
NMConnection *connection, GError
 }
 
 static gboolean
+check_adsl_compatible (NMDeviceAdsl *device, NMConnection *connection, GError 
**error)
+{
+       NMSettingConnection *s_con;
+       NMSettingAdsl *s_adsl;
+       const char *connection_type;
+
+       g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+       s_con = nm_connection_get_setting_connection (connection);
+       g_assert (s_con);
+
+       connection_type = nm_setting_connection_get_connection_type (s_con);
+       if (strcmp (connection_type, NM_SETTING_ADSL_SETTING_NAME)) {
+               g_set_error (error, 0, 0,
+                            "The connection was not an ADSL connection.");
+               return FALSE;
+       }
+
+       s_adsl = nm_connection_get_setting_adsl (connection);
+       if (!s_adsl) {
+               g_set_error (error, 0, 0,
+                            "The connection was not a valid ADSL connection.");
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+static gboolean
 nm_device_is_connection_compatible (NMDevice *device, NMConnection 
*connection, GError **error)
 {
        g_return_val_if_fail (NM_IS_DEVICE (device), FALSE);
@@ -987,6 +1029,8 @@ nm_device_is_connection_compatible (NMDevice *device, 
NMConnection *connection,
 #endif
        else if (NM_IS_DEVICE_MODEM (device))
                return check_modem_compatible (NM_DEVICE_MODEM (device), 
connection, error);
+       else if (NM_IS_DEVICE_ADSL (device))
+               return check_adsl_compatible (NM_DEVICE_ADSL (device), 
connection, error);
 
        g_set_error (error, 0, 0, "unhandled device type '%s'", 
G_OBJECT_TYPE_NAME (device));
        return FALSE;
diff --git a/cli/src/devices.c b/cli/src/devices.c
index c6228ba..7d55c43 100644
--- a/cli/src/devices.c
+++ b/cli/src/devices.c
@@ -34,6 +34,7 @@
 #include <nm-client.h>
 #include <nm-device.h>
 #include <nm-device-ethernet.h>
+#include <nm-device-adsl.h>
 #include <nm-device-wifi.h>
 #include <nm-device-modem.h>
 #include <nm-device-bt.h>
@@ -47,6 +48,7 @@
 #include <nm-vpn-connection.h>
 #include <nm-setting-connection.h>
 #include <nm-setting-wired.h>
+#include <nm-setting-adsl.h>
 #include <nm-setting-pppoe.h>
 #include <nm-setting-wireless.h>
 #include <nm-setting-gsm.h>
@@ -320,6 +322,8 @@ device_type_to_string (NMDevice *device)
        switch (nm_device_get_device_type (device)) {
        case NM_DEVICE_TYPE_ETHERNET:
                return NM_SETTING_WIRED_SETTING_NAME;
+       case NM_DEVICE_TYPE_ADSL:
+               return NM_SETTING_ADSL_SETTING_NAME;
        case NM_DEVICE_TYPE_WIFI:
                return NM_SETTING_WIRELESS_SETTING_NAME;
        case NM_DEVICE_TYPE_MODEM:
diff --git a/cli/src/settings.c b/cli/src/settings.c
index c238537..1283b5b 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -320,6 +320,26 @@ static NmcOutputField nmc_fields_setting_pppoe[] = {
                                          NM_SETTING_PPPOE_PASSWORD
 #define NMC_FIELDS_SETTING_PPPOE_COMMON  NMC_FIELDS_SETTING_PPP_ALL
 
+/* Available fields for NM_SETTING_ADSL_SETTING_NAME */
+static NmcOutputField nmc_fields_setting_adsl[] = {
+       SETTING_FIELD ("name", 10),                                /* 0 */
+       SETTING_FIELD (NM_SETTING_ADSL_USERNAME, 15),              /* 1 */
+       SETTING_FIELD (NM_SETTING_ADSL_PASSWORD, 15),              /* 2 */
+       SETTING_FIELD (NM_SETTING_ADSL_VPI, 10),                   /* 3 */
+       SETTING_FIELD (NM_SETTING_ADSL_VCI, 10),                   /* 4 */
+       SETTING_FIELD (NM_SETTING_ADSL_ENCAPSULATION, 10),         /* 5 */
+       SETTING_FIELD (NM_SETTING_ADSL_PROTOCOL, 10),              /* 6 */
+       {NULL, NULL, 0, NULL, 0}
+};
+#define NMC_FIELDS_SETTING_ADSL_ALL     "name"","\
+                                        NM_SETTING_ADSL_USERNAME","\
+                                        NM_SETTING_ADSL_PASSWORD","\
+                                        NM_SETTING_ADSL_VPI","\
+                                        NM_SETTING_ADSL_VCI","\
+                                        NM_SETTING_ADSL_ENCAPSULATION","\
+                                        NM_SETTING_ADSL_PROTOCOL
+#define NMC_FIELDS_SETTING_ADSL_COMMON  NMC_FIELDS_SETTING_ADSL_ALL
+
 /* Available fields for NM_SETTING_GSM_SETTING_NAME */
 static NmcOutputField nmc_fields_setting_gsm[] = {
        SETTING_FIELD ("name", 10),                                        /* 0 
*/
@@ -1204,6 +1224,36 @@ setting_pppoe_details (NMSetting *setting, NmCli *nmc)
 }
 
 gboolean
+setting_adsl_details (NMSetting *setting, NmCli *nmc)
+{
+       NMSettingAdsl *s_adsl;
+       guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? 
NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE 
: 0;
+       guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE 
: 0;
+       guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+       g_return_val_if_fail (NM_IS_SETTING_ADSL (setting), FALSE);
+       s_adsl = (NMSettingAdsl *) setting;
+
+       nmc->allowed_fields = nmc_fields_setting_adsl;
+       nmc->print_fields.indices = parse_output_fields 
(NMC_FIELDS_SETTING_ADSL_ALL, nmc->allowed_fields, NULL);
+       nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | 
NMC_PF_FLAG_FIELD_NAMES;
+       print_fields (nmc->print_fields, nmc->allowed_fields);  /* Print field 
names */
+
+       nmc->allowed_fields[0].value = NM_SETTING_ADSL_SETTING_NAME;
+       nmc->allowed_fields[1].value = nm_setting_adsl_get_username (s_adsl);
+       nmc->allowed_fields[2].value = nm_setting_adsl_get_password (s_adsl);
+       nmc->allowed_fields[3].value = g_strdup_printf ("%s", 
nm_setting_adsl_get_vpi (s_adsl));
+       nmc->allowed_fields[4].value = g_strdup_printf ("%s", 
nm_setting_adsl_get_vci (s_adsl));
+       nmc->allowed_fields[5].value = nm_setting_adsl_get_encapsulation 
(s_adsl);
+       nmc->allowed_fields[6].value = nm_setting_adsl_get_protocol (s_adsl);
+
+       nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | 
NMC_PF_FLAG_SECTION_PREFIX;
+       print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values 
*/
+
+       return TRUE;
+}
+
+gboolean
 setting_gsm_details (NMSetting *setting, NmCli *nmc)
 {
        NMSettingGsm *s_gsm;
diff --git a/cli/src/settings.h b/cli/src/settings.h
index 4901bf2..61c9557 100644
--- a/cli/src/settings.h
+++ b/cli/src/settings.h
@@ -22,6 +22,7 @@
 
 #include <nm-setting-connection.h>
 #include <nm-setting-wired.h>
+#include <nm-setting-adsl.h>
 #include <nm-setting-8021x.h>
 #include <nm-setting-wireless.h>
 #include <nm-setting-wireless-security.h>
@@ -51,6 +52,7 @@ gboolean setting_ip6_config_details (NMSetting *setting, 
NmCli *nmc);
 gboolean setting_serial_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_ppp_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_pppoe_details (NMSetting *setting, NmCli *nmc);
+gboolean setting_adsl_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_gsm_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_cdma_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_bluetooth_details (NMSetting *setting, NmCli *nmc);
diff --git a/libnm-glib/Makefile.am b/libnm-glib/Makefile.am
index 08a61cc..5955564 100644
--- a/libnm-glib/Makefile.am
+++ b/libnm-glib/Makefile.am
@@ -10,6 +10,7 @@ BUILT_SOURCES = \
        nm-client-bindings.h \
        nm-device-bindings.h \
        nm-device-ethernet-bindings.h \
+       nm-device-adsl-bindings.h \
        nm-device-wifi-bindings.h \
        nm-device-bt-bindings.h \
        nm-settings-connection-bindings.h \
@@ -70,6 +71,7 @@ libnminclude_HEADERS = \
        nm-client.h \
        nm-device.h \
        nm-device-ethernet.h \
+       nm-device-adsl.h \
        nm-device-wifi.h \
        nm-device-bt.h \
        nm-access-point.h \
@@ -98,6 +100,7 @@ libnm_glib_la_csources = \
        nm-dbus-utils.c \
        nm-device.c \
        nm-device-ethernet.c \
+       nm-device-adsl.c \
        nm-device-wifi.c \
        nm-device-bt.c \
        nm-access-point.c \
@@ -189,6 +192,9 @@ nm-device-bindings.h: 
$(top_srcdir)/introspection/nm-device.xml
 nm-device-ethernet-bindings.h: 
$(top_srcdir)/introspection/nm-device-ethernet.xml
        $(AM_V_GEN) dbus-binding-tool --prefix=nm_device_ethernet 
--mode=glib-client --output=$@ $<
 
+nm-device-adsl-bindings.h: $(top_srcdir)/introspection/nm-device-adsl.xml
+       $(AM_V_GEN) dbus-binding-tool --prefix=nm_device_adsl 
--mode=glib-client --output=$@ $<
+
 nm-device-wifi-bindings.h: $(top_srcdir)/introspection/nm-device-wifi.xml
        $(AM_V_GEN) dbus-binding-tool --prefix=nm_device_wifi 
--mode=glib-client --output=$@ $<
 
diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver
index a59bec9..3b17c66 100644
--- a/libnm-glib/libnm-glib.ver
+++ b/libnm-glib/libnm-glib.ver
@@ -65,6 +65,9 @@ global:
        nm_device_ethernet_get_speed;
        nm_device_ethernet_get_type;
        nm_device_ethernet_new;
+       nm_device_adsl_get_carrier;
+       nm_device_adsl_get_type;
+       nm_device_adsl_new;
        nm_device_filter_connections;
        nm_device_get_capabilities;
        nm_device_get_device_type;
@@ -75,7 +78,6 @@ global:
        nm_device_get_iface;
        nm_device_get_ip4_config;
        nm_device_get_ip6_config;
-       nm_device_get_ip_iface;
        nm_device_get_managed;
        nm_device_get_product;
        nm_device_get_state;
diff --git a/libnm-glib/nm-device-adsl.c b/libnm-glib/nm-device-adsl.c
new file mode 100644
index 0000000..e0d5da5
--- /dev/null
+++ b/libnm-glib/nm-device-adsl.c
@@ -0,0 +1,236 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * libnm_glib -- Access network status & information from glib applications
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * author: Pantelis Koukousoulas <pkt...@gmail.com>
+ * Copyright 2009 - 2011 Red Hat, Inc.
+ */
+
+#include "nm-device-adsl.h"
+#include "nm-device-private.h"
+#include "nm-object-private.h"
+
+#include "nm-setting-adsl.h"
+
+#include <string.h>
+
+#include "nm-device-adsl-bindings.h"
+
+G_DEFINE_TYPE (NMDeviceAdsl, nm_device_adsl, NM_TYPE_DEVICE)
+
+#define NM_DEVICE_ADSL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), 
NM_TYPE_DEVICE_ADSL, NMDeviceAdslPrivate))
+
+typedef struct {
+       DBusGProxy *proxy;
+
+       gboolean carrier;
+
+       gboolean disposed;
+} NMDeviceAdslPrivate;
+
+enum {
+       PROP_0,
+       PROP_CARRIER,
+       LAST_PROP
+};
+#define DBUS_PROP_CARRIER "Carrier"
+
+/**
+ * nm_device_adsl_new:
+ * @connection: the #DBusGConnection
+ * @path: the DBus object path of the device
+ *
+ * Creates a new #NMDeviceAdsl.
+ *
+ * Returns: a new device
+ **/
+GObject *
+nm_device_adsl_new (DBusGConnection *connection, const char *path)
+{
+       g_return_val_if_fail (connection != NULL, NULL);
+       g_return_val_if_fail (path != NULL, NULL);
+
+       return g_object_new (NM_TYPE_DEVICE_ADSL,
+                            NM_OBJECT_DBUS_CONNECTION, connection,
+                            NM_OBJECT_DBUS_PATH, path,
+                            NULL);
+}
+
+/**
+ * nm_device_adsl_get_carrier:
+ * @device: a #NMDeviceAdsl
+ *
+ * Whether the device has carrier.
+ *
+ * Returns: %TRUE if the device has carrier
+ **/
+gboolean
+nm_device_adsl_get_carrier (NMDeviceAdsl *device)
+{
+       NMDeviceAdslPrivate *priv;
+
+       g_return_val_if_fail (NM_IS_DEVICE_ADSL (device), FALSE);
+
+       priv = NM_DEVICE_ADSL_GET_PRIVATE (device);
+       priv->carrier = _nm_object_get_boolean_property (NM_OBJECT (device),
+                                                               
NM_DBUS_INTERFACE_DEVICE_ADSL,
+                                                               
DBUS_PROP_CARRIER,
+                                                               NULL);
+       return priv->carrier;
+}
+
+static gboolean
+connection_valid (NMDevice *device, NMConnection *connection)
+{
+       NMSettingConnection *s_con;
+       NMSettingAdsl *s_adsl;
+       const char *ctype;
+
+       s_con = nm_connection_get_setting_connection (connection);
+       g_assert (s_con);
+
+       ctype = nm_setting_connection_get_connection_type (s_con);
+       if (strcmp (ctype, NM_SETTING_ADSL_SETTING_NAME) != 0)
+               return FALSE;
+
+       s_adsl = nm_connection_get_setting_adsl (connection);
+       if (!s_adsl)
+               return FALSE;
+
+       return TRUE;
+}
+
+static void
+nm_device_adsl_init (NMDeviceAdsl *device)
+{
+       NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (device);
+
+       priv->disposed = FALSE;
+       priv->carrier = FALSE;
+}
+
+static void
+register_for_property_changed (NMDeviceAdsl *device)
+{
+       NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (device);
+       const NMPropertiesChangedInfo property_changed_info[] = {
+               { NM_DEVICE_ADSL_CARRIER,              
_nm_object_demarshal_generic, &priv->carrier },
+               { NULL },
+       };
+
+       _nm_object_handle_properties_changed (NM_OBJECT (device),
+                                            priv->proxy,
+                                            property_changed_info);
+}
+
+static GObject*
+constructor (GType type,
+                        guint n_construct_params,
+                        GObjectConstructParam *construct_params)
+{
+       GObject *object;
+       NMDeviceAdslPrivate *priv;
+
+       object = G_OBJECT_CLASS (nm_device_adsl_parent_class)->constructor 
(type,
+                                                                               
                                                                
n_construct_params,
+                                                                               
                                                                
construct_params);
+       if (!object)
+               return NULL;
+
+       priv = NM_DEVICE_ADSL_GET_PRIVATE (object);
+
+       priv->proxy = dbus_g_proxy_new_for_name (nm_object_get_connection 
(NM_OBJECT (object)),
+                                                NM_DBUS_SERVICE,
+                                                nm_object_get_path (NM_OBJECT 
(object)),
+                                                NM_DBUS_INTERFACE_DEVICE_ADSL);
+
+       register_for_property_changed (NM_DEVICE_ADSL (object));
+
+       return object;
+}
+
+static void
+dispose (GObject *object)
+{
+       NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (object);
+
+       if (priv->disposed) {
+               G_OBJECT_CLASS (nm_device_adsl_parent_class)->dispose (object);
+               return;
+       }
+
+       priv->disposed = TRUE;
+
+       g_object_unref (priv->proxy);
+
+       G_OBJECT_CLASS (nm_device_adsl_parent_class)->dispose (object);
+}
+
+static void
+finalize (GObject *object)
+{
+       G_OBJECT_CLASS (nm_device_adsl_parent_class)->finalize (object);
+}
+
+static void
+get_property (GObject *object,
+              guint prop_id,
+              GValue *value,
+              GParamSpec *pspec)
+{
+       NMDeviceAdsl *device = NM_DEVICE_ADSL (object);
+
+       switch (prop_id) {
+       case PROP_CARRIER:
+               g_value_set_boolean (value, nm_device_adsl_get_carrier 
(device));
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+               break;
+       }
+}
+
+static void
+nm_device_adsl_class_init (NMDeviceAdslClass *adsl_class)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (adsl_class);
+       NMDeviceClass *device_class = NM_DEVICE_CLASS (adsl_class);
+
+       g_type_class_add_private (object_class, sizeof (NMDeviceAdslPrivate));
+
+       /* virtual methods */
+       object_class->constructor = constructor;
+       object_class->dispose = dispose;
+       object_class->finalize = finalize;
+       object_class->get_property = get_property;
+       device_class->connection_valid = connection_valid;
+
+       /* properties */
+       /**
+        * NMDeviceAdsl:carrier:
+        *
+        * Whether the device has carrier.
+        **/
+       g_object_class_install_property
+               (object_class, PROP_CARRIER,
+                g_param_spec_boolean (NM_DEVICE_ADSL_CARRIER,
+                                           "Carrier",
+                                           "Carrier",
+                                           FALSE,
+                                           G_PARAM_READABLE));
+}
diff --git a/libnm-glib/nm-device-adsl.h b/libnm-glib/nm-device-adsl.h
new file mode 100644
index 0000000..73223cd
--- /dev/null
+++ b/libnm-glib/nm-device-adsl.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/*
+ * libnm_glib -- Access network status & information from glib applications
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2011 Pantelis Koukousoulas <pkt...@gmail.com>
+ */
+
+#ifndef NM_DEVICE_ADSL_H
+#define NM_DEVICE_ADSL_H
+
+#include "nm-device.h"
+
+G_BEGIN_DECLS
+
+#define NM_TYPE_DEVICE_ADSL            (nm_device_adsl_get_type ())
+#define NM_DEVICE_ADSL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NM_TYPE_DEVICE_ADSL, NMDeviceAdsl))
+#define NM_DEVICE_ADSL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
NM_TYPE_DEVICE_ADSL, NMDeviceAdslClass))
+#define NM_IS_DEVICE_ADSL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NM_TYPE_DEVICE_ADSL))
+#define NM_IS_DEVICE_ADSL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), 
NM_TYPE_DEVICE_ADSL))
+#define NM_DEVICE_ADSL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), 
NM_TYPE_DEVICE_ADSL, NMDeviceAdslClass))
+
+#define NM_DEVICE_ADSL_CARRIER "carrier"
+
+typedef struct {
+       NMDevice parent;
+} NMDeviceAdsl;
+
+typedef struct {
+       NMDeviceClass parent;
+
+       /* Padding for future expansion */
+       void (*_reserved1) (void);
+       void (*_reserved2) (void);
+       void (*_reserved3) (void);
+       void (*_reserved4) (void);
+       void (*_reserved5) (void);
+       void (*_reserved6) (void);
+} NMDeviceAdslClass;
+
+GType nm_device_adsl_get_type (void);
+
+GObject *nm_device_adsl_new (DBusGConnection *connection, const char *path);
+gboolean nm_device_adsl_get_carrier (NMDeviceAdsl *device);
+
+G_END_DECLS
+
+#endif /* NM_DEVICE_ADSL_H */
diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c
index 57aa2cf..ac0da9d 100644
--- a/libnm-glib/nm-device.c
+++ b/libnm-glib/nm-device.c
@@ -27,6 +27,7 @@
 
 #include "NetworkManager.h"
 #include "nm-device-ethernet.h"
+#include "nm-device-adsl.h"
 #include "nm-device-wifi.h"
 #include "nm-device-modem.h"
 #include "nm-device-bt.h"
@@ -748,6 +749,9 @@ nm_device_new (DBusGConnection *connection, const char 
*path)
        case NM_DEVICE_TYPE_ETHERNET:
                dtype = NM_TYPE_DEVICE_ETHERNET;
                break;
+       case NM_DEVICE_TYPE_ADSL:
+               dtype = NM_TYPE_DEVICE_ADSL;
+               break;
        case NM_DEVICE_TYPE_WIFI:
                dtype = NM_TYPE_DEVICE_WIFI;
                break;
@@ -1203,7 +1207,7 @@ get_decoded_property (GUdevDevice *device, const char 
*property)
 }
 
 static void
-_device_update_description (NMDevice *device)
+nm_device_update_description (NMDevice *device)
 {
        NMDevicePrivate *priv;
        const char *subsys[3] = { "net", "tty", NULL };
@@ -1318,7 +1322,7 @@ nm_device_get_product (NMDevice *device)
 
        priv = NM_DEVICE_GET_PRIVATE (device);
        if (!priv->product)
-               _device_update_description (device);
+               nm_device_update_description (device);
        return priv->product;
 }
 
@@ -1340,7 +1344,7 @@ nm_device_get_vendor (NMDevice *device)
 
        priv = NM_DEVICE_GET_PRIVATE (device);
        if (!priv->vendor)
-               _device_update_description (device);
+               nm_device_update_description (device);
        return priv->vendor;
 }
 
diff --git a/libnm-util/nm-connection.c b/libnm-util/nm-connection.c
index cd9d53f..e2e5988 100644
--- a/libnm-util/nm-connection.c
+++ b/libnm-util/nm-connection.c
@@ -40,6 +40,7 @@
 #include "nm-setting-pppoe.h"
 #include "nm-setting-wimax.h"
 #include "nm-setting-wired.h"
+#include "nm-setting-adsl.h"
 #include "nm-setting-wireless.h"
 #include "nm-setting-wireless-security.h"
 #include "nm-setting-vpn.h"
@@ -134,7 +135,7 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 static GHashTable *registered_settings = NULL;
 
-#define DEFAULT_MAP_SIZE 16
+#define DEFAULT_MAP_SIZE 17
 
 static struct SettingInfo {
        const char *name;
@@ -261,6 +262,11 @@ register_default_settings (void)
                              NM_SETTING_PPPOE_ERROR,
                              3, TRUE);
 
+       register_one_setting (NM_SETTING_ADSL_SETTING_NAME,
+                             NM_TYPE_SETTING_ADSL,
+                             NM_SETTING_ADSL_ERROR,
+                             3, TRUE);
+
        register_one_setting (NM_SETTING_802_1X_SETTING_NAME,
                              NM_TYPE_SETTING_802_1X,
                              NM_SETTING_802_1X_ERROR,
@@ -1453,6 +1459,23 @@ nm_connection_get_setting_wired (NMConnection 
*connection)
 }
 
 /**
+ * nm_connection_get_setting_adsl:
+ * @connection: the #NMConnection
+ *
+ * A shortcut to return any #NMSettingAdsl the connection might contain.
+ *
+ * Returns: (transfer none): an #NMSettingAdsl if the connection contains one, 
otherwise NULL
+ **/
+NMSettingAdsl *
+nm_connection_get_setting_adsl (NMConnection *connection)
+{
+       g_return_val_if_fail (connection != NULL, NULL);
+       g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+
+       return (NMSettingAdsl *) nm_connection_get_setting (connection, 
NM_TYPE_SETTING_ADSL);
+}
+
+/**
  * nm_connection_get_setting_wireless:
  * @connection: the #NMConnection
  *
diff --git a/libnm-util/nm-connection.h b/libnm-util/nm-connection.h
index 87b053c..2e42265 100644
--- a/libnm-util/nm-connection.h
+++ b/libnm-util/nm-connection.h
@@ -43,6 +43,7 @@
 #include <nm-setting-vpn.h>
 #include <nm-setting-wimax.h>
 #include <nm-setting-wired.h>
+#include <nm-setting-adsl.h>
 #include <nm-setting-wireless.h>
 #include <nm-setting-wireless-security.h>
 
@@ -184,6 +185,7 @@ NMSettingPPP *             nm_connection_get_setting_ppp    
           (NMConnec
 NMSettingPPPOE *           nm_connection_get_setting_pppoe             
(NMConnection *connection);
 NMSettingVPN *             nm_connection_get_setting_vpn               
(NMConnection *connection);
 NMSettingWimax *           nm_connection_get_setting_wimax             
(NMConnection *connection);
+NMSettingAdsl *            nm_connection_get_setting_adsl              
(NMConnection *connection);
 NMSettingWired *           nm_connection_get_setting_wired             
(NMConnection *connection);
 NMSettingWireless *        nm_connection_get_setting_wireless          
(NMConnection *connection);
 NMSettingWirelessSecurity *nm_connection_get_setting_wireless_security 
(NMConnection *connection);
-- 
1.7.4.1

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
http://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to