mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-19 08:57:14 -05:00
Implement subscription with a signal
Use a signal for subscription events Work on handling OOM errors and other errors.
This commit is contained in:
parent
1b66bbcffd
commit
85d375e4bb
32 changed files with 531 additions and 176 deletions
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue