Implement subscription with a signal

Use a signal for subscription events
Work on handling OOM errors and other errors.
This commit is contained in:
Wim Taymans 2016-12-22 16:50:01 +01:00
parent 1b66bbcffd
commit 85d375e4bb
32 changed files with 531 additions and 176 deletions

View file

@ -98,6 +98,17 @@ connection_parse_client_update (PinosConnection *conn, PinosMessageClientUpdate
m->props = pinos_serialize_dict_deserialize (p, SPA_PTR_TO_INT (m->props));
}
static void
connection_parse_error (PinosConnection *conn, PinosMessageError *m)
{
void *p;
p = conn->in.data;
memcpy (m, p, sizeof (PinosMessageError));
if (m->error)
m->error = SPA_MEMBER (p, SPA_PTR_TO_INT (m->error), const char);
}
static void
connection_parse_notify_global (PinosConnection *conn, PinosMessageNotifyGlobal *ng)
{
@ -198,6 +209,8 @@ connection_parse_node_info (PinosConnection *conn, PinosMessageNodeInfo *m)
if (m->info->name)
m->info->name = SPA_MEMBER (di, SPA_PTR_TO_INT (m->info->name), const char);
if (m->info->error)
m->info->error = SPA_MEMBER (di, SPA_PTR_TO_INT (m->info->error), const char);
if (m->info->props)
m->info->props = pinos_serialize_dict_deserialize (di, SPA_PTR_TO_INT (m->info->props));
}
@ -374,6 +387,29 @@ connection_add_client_update (PinosConnection *conn,
}
}
static void
connection_add_error (PinosConnection *conn,
uint32_t dest_id,
PinosMessageError *m)
{
size_t len;
void *p;
PinosMessageError *d;
/* calc len */
len = sizeof (PinosMessageError);
len += m->error ? strlen (m->error) + 1 : 0;
p = connection_add_message (conn, dest_id, PINOS_MESSAGE_ERROR, len);
memcpy (p, m, sizeof (PinosMessageError));
d = p;
if (m->error) {
strcpy (p, m->error);
d->error = SPA_INT_TO_PTR (SPA_PTRDIFF (p, d));
}
}
static void
connection_add_notify_global (PinosConnection *conn,
uint32_t dest_id,
@ -593,6 +629,7 @@ connection_add_node_info (PinosConnection *conn, uint32_t dest_id, PinosMessageN
if (m->info) {
len += sizeof (PinosNodeInfo);
len += m->info->name ? strlen (m->info->name) + 1 : 0;
len += m->info->error ? strlen (m->info->error) + 1 : 0;
len += pinos_serialize_dict_get_size (m->info->props);
}
@ -615,6 +652,12 @@ connection_add_node_info (PinosConnection *conn, uint32_t dest_id, PinosMessageN
di->name = SPA_INT_TO_PTR (SPA_PTRDIFF (p, di));
p += slen;
}
if (m->info->error) {
slen = strlen (m->info->error) + 1;
memcpy (p, m->info->error, slen);
di->error = SPA_INT_TO_PTR (SPA_PTRDIFF (p, di));
p += slen;
}
if (m->info->props) {
len = pinos_serialize_dict_serialize (p, m->info->props);
di->props = SPA_INT_TO_PTR (SPA_PTRDIFF (p, di));
@ -952,7 +995,11 @@ pinos_connection_new (int fd)
PinosConnection *c;
c = calloc (1, sizeof (PinosConnection));
if (c == NULL)
return NULL;
pinos_log_debug ("connection %p: new", c);
c->fd = fd;
c->out.buffer_data = malloc (MAX_BUFFER_SIZE);
c->out.buffer_maxsize = MAX_BUFFER_SIZE;
@ -960,7 +1007,16 @@ pinos_connection_new (int fd)
c->in.buffer_maxsize = MAX_BUFFER_SIZE;
c->in.update = true;
if (c->out.buffer_data == NULL || c->in.buffer_data == NULL)
goto no_mem;
return c;
no_mem:
free (c->out.buffer_data);
free (c->in.buffer_data);
free (c);
return NULL;
}
void
@ -1069,6 +1125,10 @@ pinos_connection_parse_message (PinosConnection *conn,
memcpy (message, conn->in.data, sizeof (PinosMessageNotifyDone));
break;
case PINOS_MESSAGE_ERROR:
connection_parse_error (conn, message);
break;
case PINOS_MESSAGE_GET_REGISTRY:
if (conn->in.size < sizeof (PinosMessageGetRegistry))
return false;
@ -1265,6 +1325,10 @@ pinos_connection_add_message (PinosConnection *conn,
memcpy (p, message, sizeof (PinosMessageNotifyDone));
break;
case PINOS_MESSAGE_ERROR:
connection_add_error (conn, dest_id, message);
break;
case PINOS_MESSAGE_GET_REGISTRY:
p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageGetRegistry));
memcpy (p, message, sizeof (PinosMessageGetRegistry));