/* -*- 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 #include #include #include #include "mm-port.h" #include "mm-log.h" G_DEFINE_TYPE (MMPort, mm_port, G_TYPE_OBJECT) enum { PROP_0, PROP_DEVICE, PROP_SUBSYS, PROP_TYPE, PROP_CONNECTED, PROP_PARENT_PATH, LAST_PROP }; struct _MMPortPrivate { gchar *device; MMPortSubsys subsys; MMPortType ptype; gboolean connected; gchar *parent_path; }; /*****************************************************************************/ 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 self->priv->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 self->priv->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 self->priv->ptype; } 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 self->priv->connected; } void mm_port_set_connected (MMPort *self, gboolean connected) { g_return_if_fail (self != NULL); g_return_if_fail (MM_IS_PORT (self)); if (self->priv->connected != connected) { self->priv->connected = connected; g_object_notify (G_OBJECT (self), MM_PORT_CONNECTED); mm_dbg ("(%s): port now %s", self->priv->device, connected ? "connected" : "disconnected"); } } const gchar * mm_port_get_parent_path (MMPort *self) { g_return_val_if_fail (MM_IS_PORT (self), NULL); return self->priv->parent_path; } /*****************************************************************************/ static void mm_port_init (MMPort *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_PORT, MMPortPrivate); } static void set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { MMPort *self = MM_PORT (object); switch (prop_id) { case PROP_DEVICE: /* Construct only */ self->priv->device = g_value_dup_string (value); break; case PROP_SUBSYS: /* Construct only */ self->priv->subsys = g_value_get_uint (value); break; case PROP_TYPE: /* Construct only */ self->priv->ptype = g_value_get_uint (value); break; case PROP_CONNECTED: self->priv->connected = g_value_get_boolean (value); break; case PROP_PARENT_PATH: g_free (self->priv->parent_path); self->priv->parent_path = g_value_dup_string (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) { MMPort *self = MM_PORT (object); switch (prop_id) { case PROP_DEVICE: g_value_set_string (value, self->priv->device); break; case PROP_SUBSYS: g_value_set_uint (value, self->priv->subsys); break; case PROP_TYPE: g_value_set_uint (value, self->priv->ptype); break; case PROP_CONNECTED: g_value_set_boolean (value, self->priv->connected); break; case PROP_PARENT_PATH: g_value_set_string (value, self->priv->parent_path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void finalize (GObject *object) { MMPort *self = MM_PORT (object); g_free (self->priv->device); g_free (self->priv->parent_path); 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->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_CONNECTED, g_param_spec_boolean (MM_PORT_CONNECTED, "Connected", "Is connected for data and not usable for control", FALSE, G_PARAM_READWRITE)); g_object_class_install_property (object_class, PROP_PARENT_PATH, g_param_spec_string (MM_PORT_PARENT_PATH, "Parent path", "sysfs path of the parent device", NULL, G_PARAM_READWRITE)); }