serial: allow creating serial ports with a given file descriptor

To enable better unit testing of MMSerialPort and subclasses
behavior.
This commit is contained in:
Dan Williams
2010-10-14 00:08:14 -05:00
parent add7fa705c
commit ad4e2fc656
2 changed files with 23 additions and 4 deletions

View File

@@ -43,6 +43,7 @@ enum {
PROP_PARITY, PROP_PARITY,
PROP_STOPBITS, PROP_STOPBITS,
PROP_SEND_DELAY, PROP_SEND_DELAY,
PROP_FD,
LAST_PROP LAST_PROP
}; };
@@ -706,10 +707,13 @@ mm_serial_port_open (MMSerialPort *self, GError **error)
} else } else
g_message ("(%s) opening serial port...", device); g_message ("(%s) opening serial port...", device);
/* Only open a new file descriptor if we weren't given one already */
if (priv->fd < 0) {
devfile = g_strdup_printf ("/dev/%s", device); devfile = g_strdup_printf ("/dev/%s", device);
errno = 0; errno = 0;
priv->fd = open (devfile, O_RDWR | O_EXCL | O_NONBLOCK | O_NOCTTY); priv->fd = open (devfile, O_RDWR | O_EXCL | O_NONBLOCK | O_NOCTTY);
g_free (devfile); g_free (devfile);
}
if (priv->fd < 0) { if (priv->fd < 0) {
/* nozomi isn't ready yet when the port appears, and it'll return /* nozomi isn't ready yet when the port appears, and it'll return
@@ -1222,6 +1226,9 @@ set_property (GObject *object, guint prop_id,
MMSerialPortPrivate *priv = MM_SERIAL_PORT_GET_PRIVATE (object); MMSerialPortPrivate *priv = MM_SERIAL_PORT_GET_PRIVATE (object);
switch (prop_id) { switch (prop_id) {
case PROP_FD:
priv->fd = g_value_get_int (value);
break;
case PROP_BAUD: case PROP_BAUD:
priv->baud = g_value_get_uint (value); priv->baud = g_value_get_uint (value);
break; break;
@@ -1250,6 +1257,9 @@ get_property (GObject *object, guint prop_id,
MMSerialPortPrivate *priv = MM_SERIAL_PORT_GET_PRIVATE (object); MMSerialPortPrivate *priv = MM_SERIAL_PORT_GET_PRIVATE (object);
switch (prop_id) { switch (prop_id) {
case PROP_FD:
g_value_set_int (value, priv->fd);
break;
case PROP_BAUD: case PROP_BAUD:
g_value_set_uint (value, priv->baud); g_value_set_uint (value, priv->baud);
break; break;
@@ -1312,6 +1322,14 @@ mm_serial_port_class_init (MMSerialPortClass *klass)
klass->handle_response = real_handle_response; klass->handle_response = real_handle_response;
/* Properties */ /* Properties */
g_object_class_install_property
(object_class, PROP_FD,
g_param_spec_int (MM_SERIAL_PORT_FD,
"File descriptor",
"Fiel descriptor",
-1, G_MAXINT, -1,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property g_object_class_install_property
(object_class, PROP_BAUD, (object_class, PROP_BAUD,
g_param_spec_uint (MM_SERIAL_PORT_BAUD, g_param_spec_uint (MM_SERIAL_PORT_BAUD,

View File

@@ -35,6 +35,7 @@
#define MM_SERIAL_PORT_PARITY "parity" #define MM_SERIAL_PORT_PARITY "parity"
#define MM_SERIAL_PORT_STOPBITS "stopbits" #define MM_SERIAL_PORT_STOPBITS "stopbits"
#define MM_SERIAL_PORT_SEND_DELAY "send-delay" #define MM_SERIAL_PORT_SEND_DELAY "send-delay"
#define MM_SERIAL_PORT_FD "fd" /* Construct-only */
typedef struct _MMSerialPort MMSerialPort; typedef struct _MMSerialPort MMSerialPort;
typedef struct _MMSerialPortClass MMSerialPortClass; typedef struct _MMSerialPortClass MMSerialPortClass;