blob: 0d7ce75d2a296d530ef0a7e42a698c1ddf69bb46 [file] [log] [blame]
/* -*- 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"
#include "mm-log.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;
}
/* Can't have a TTY subsystem port that's unknown */
if ( priv->subsys != MM_PORT_SUBSYS_NET
&& 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);
mm_dbg ("(%s): port now %s",
priv->device,
connected ? "connected" : "disconnected");
}
}
/*****************************************************************************/
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));
}