diff options
Diffstat (limited to 'src/mm-port.c')
-rw-r--r-- | src/mm-port.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/src/mm-port.c b/src/mm-port.c new file mode 100644 index 0000000..7e8edc4 --- /dev/null +++ b/src/mm-port.c @@ -0,0 +1,278 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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: + * + * Copyright (C) 2009 Red Hat, Inc. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> + +#include "mm-port.h" + +G_DEFINE_TYPE (MMPort, mm_port, G_TYPE_OBJECT) + +enum { + PROP_0, + PROP_DEVICE, + PROP_SUBSYS, + PROP_TYPE, + PROP_CARRIER_DETECT, + PROP_CONNECTED, + + LAST_PROP +}; + +#define MM_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_PORT, MMPortPrivate)) + +typedef struct { + char *device; + MMPortSubsys subsys; + MMPortType ptype; + gboolean carrier_detect; + gboolean connected; +} MMPortPrivate; + +/*****************************************************************************/ + +static GObject* +constructor (GType type, + guint n_construct_params, + GObjectConstructParam *construct_params) +{ + GObject *object; + MMPortPrivate *priv; + + object = G_OBJECT_CLASS (mm_port_parent_class)->constructor (type, + n_construct_params, + construct_params); + if (!object) + return NULL; + + priv = MM_PORT_GET_PRIVATE (object); + + if (!priv->device) { + g_warning ("MMPort: no device provided"); + g_object_unref (object); + return NULL; + } + + if (priv->subsys == MM_PORT_SUBSYS_UNKNOWN) { + g_warning ("MMPort: invalid port subsystem"); + g_object_unref (object); + return NULL; + } + + if (priv->ptype == MM_PORT_TYPE_UNKNOWN) { + g_warning ("MMPort: invalid port type"); + g_object_unref (object); + return NULL; + } + + return object; +} + + +const char * +mm_port_get_device (MMPort *self) +{ + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (MM_IS_PORT (self), NULL); + + return MM_PORT_GET_PRIVATE (self)->device; +} + +MMPortSubsys +mm_port_get_subsys (MMPort *self) +{ + g_return_val_if_fail (self != NULL, MM_PORT_SUBSYS_UNKNOWN); + g_return_val_if_fail (MM_IS_PORT (self), MM_PORT_SUBSYS_UNKNOWN); + + return MM_PORT_GET_PRIVATE (self)->subsys; +} + +MMPortType +mm_port_get_port_type (MMPort *self) +{ + g_return_val_if_fail (self != NULL, MM_PORT_TYPE_UNKNOWN); + g_return_val_if_fail (MM_IS_PORT (self), MM_PORT_TYPE_UNKNOWN); + + return MM_PORT_GET_PRIVATE (self)->ptype; +} + +gboolean +mm_port_get_carrier_detect (MMPort *self) +{ + g_return_val_if_fail (self != NULL, MM_PORT_TYPE_UNKNOWN); + g_return_val_if_fail (MM_IS_PORT (self), MM_PORT_TYPE_UNKNOWN); + + return MM_PORT_GET_PRIVATE (self)->carrier_detect; +} + +gboolean +mm_port_get_connected (MMPort *self) +{ + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (MM_IS_PORT (self), FALSE); + + return MM_PORT_GET_PRIVATE (self)->connected; +} + +void +mm_port_set_connected (MMPort *self, gboolean connected) +{ + MMPortPrivate *priv; + + g_return_if_fail (self != NULL); + g_return_if_fail (MM_IS_PORT (self)); + + priv = MM_PORT_GET_PRIVATE (self); + if (priv->connected != connected) { + priv->connected = connected; + g_object_notify (G_OBJECT (self), MM_PORT_CONNECTED); + } +} + +/*****************************************************************************/ + +static void +mm_port_init (MMPort *self) +{ +} + +static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + MMPortPrivate *priv = MM_PORT_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_DEVICE: + /* Construct only */ + priv->device = g_value_dup_string (value); + break; + case PROP_SUBSYS: + /* Construct only */ + priv->subsys = g_value_get_uint (value); + break; + case PROP_TYPE: + /* Construct only */ + priv->ptype = g_value_get_uint (value); + break; + case PROP_CARRIER_DETECT: + priv->carrier_detect = g_value_get_boolean (value); + break; + case PROP_CONNECTED: + priv->connected = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + MMPortPrivate *priv = MM_PORT_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_DEVICE: + g_value_set_string (value, priv->device); + break; + case PROP_SUBSYS: + g_value_set_uint (value, priv->subsys); + break; + case PROP_TYPE: + g_value_set_uint (value, priv->ptype); + break; + case PROP_CARRIER_DETECT: + g_value_set_boolean (value, priv->carrier_detect); + break; + case PROP_CONNECTED: + g_value_set_boolean (value, priv->connected); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +finalize (GObject *object) +{ + MMPortPrivate *priv = MM_PORT_GET_PRIVATE (object); + + g_free (priv->device); + + G_OBJECT_CLASS (mm_port_parent_class)->finalize (object); +} + +static void +mm_port_class_init (MMPortClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (MMPortPrivate)); + + /* Virtual methods */ + object_class->constructor = constructor; + object_class->set_property = set_property; + object_class->get_property = get_property; + object_class->finalize = finalize; + + g_object_class_install_property + (object_class, PROP_DEVICE, + g_param_spec_string (MM_PORT_DEVICE, + "Device", + "Device", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property + (object_class, PROP_SUBSYS, + g_param_spec_uint (MM_PORT_SUBSYS, + "Subsystem", + "Subsystem", + MM_PORT_SUBSYS_UNKNOWN, + MM_PORT_SUBSYS_LAST, + MM_PORT_SUBSYS_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property + (object_class, PROP_TYPE, + g_param_spec_uint (MM_PORT_TYPE, + "Type", + "Type", + MM_PORT_TYPE_UNKNOWN, + MM_PORT_TYPE_LAST, + MM_PORT_TYPE_UNKNOWN, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + g_object_class_install_property + (object_class, PROP_CARRIER_DETECT, + g_param_spec_boolean (MM_PORT_CARRIER_DETECT, + "Carrier Detect", + "Has Carrier Detect", + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property + (object_class, PROP_CONNECTED, + g_param_spec_boolean (MM_PORT_CONNECTED, + "Connected", + "Is connected for data and not usable for control", + FALSE, + G_PARAM_READWRITE)); +} |