mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	Registry: implement registry
Make GET_REGISTRY method to create a registry resource, send global added and removed to this resource. Use map for storing proxies and resources.
This commit is contained in:
		
							parent
							
								
									3dada4731c
								
							
						
					
					
						commit
						7c29209023
					
				
					 15 changed files with 221 additions and 59 deletions
				
			
		| 
						 | 
					@ -710,10 +710,16 @@ pinos_connection_parse_message (PinosConnection *conn,
 | 
				
			||||||
      memcpy (message, conn->in.data, sizeof (PinosMessageNotifyDone));
 | 
					      memcpy (message, conn->in.data, sizeof (PinosMessageNotifyDone));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case PINOS_MESSAGE_SUBSCRIBE:
 | 
					    case PINOS_MESSAGE_GET_REGISTRY:
 | 
				
			||||||
      if (conn->in.size < sizeof (PinosMessageSubscribe))
 | 
					      if (conn->in.size < sizeof (PinosMessageGetRegistry))
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
      memcpy (message, conn->in.data, sizeof (PinosMessageSubscribe));
 | 
					      memcpy (message, conn->in.data, sizeof (PinosMessageGetRegistry));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_BIND:
 | 
				
			||||||
 | 
					      if (conn->in.size < sizeof (PinosMessageBind))
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      memcpy (message, conn->in.data, sizeof (PinosMessageBind));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
					    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
				
			||||||
| 
						 | 
					@ -749,6 +755,17 @@ pinos_connection_parse_message (PinosConnection *conn,
 | 
				
			||||||
      d->datafd = connection_get_fd (conn, d->datafd);
 | 
					      d->datafd = connection_get_fd (conn, d->datafd);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY:
 | 
				
			||||||
 | 
					      if (conn->in.size < sizeof (PinosMessageDestroy))
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      memcpy (message, conn->in.data, sizeof (PinosMessageDestroy));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY_DONE:
 | 
				
			||||||
 | 
					      if (conn->in.size < sizeof (PinosMessageDestroyDone))
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      memcpy (message, conn->in.data, sizeof (PinosMessageDestroyDone));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* C -> S */
 | 
					    /* C -> S */
 | 
				
			||||||
    case PINOS_MESSAGE_NODE_UPDATE:
 | 
					    case PINOS_MESSAGE_NODE_UPDATE:
 | 
				
			||||||
| 
						 | 
					@ -865,9 +882,14 @@ pinos_connection_add_message (PinosConnection  *conn,
 | 
				
			||||||
      memcpy (p, message, sizeof (PinosMessageNotifyDone));
 | 
					      memcpy (p, message, sizeof (PinosMessageNotifyDone));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case PINOS_MESSAGE_SUBSCRIBE:
 | 
					    case PINOS_MESSAGE_GET_REGISTRY:
 | 
				
			||||||
      p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageSubscribe));
 | 
					      p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageGetRegistry));
 | 
				
			||||||
      memcpy (p, message, sizeof (PinosMessageSubscribe));
 | 
					      memcpy (p, message, sizeof (PinosMessageGetRegistry));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_BIND:
 | 
				
			||||||
 | 
					      p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageBind));
 | 
				
			||||||
 | 
					      memcpy (p, message, sizeof (PinosMessageBind));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
					    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
				
			||||||
| 
						 | 
					@ -900,6 +922,16 @@ pinos_connection_add_message (PinosConnection  *conn,
 | 
				
			||||||
      d->datafd = connection_add_fd (conn, d->datafd);
 | 
					      d->datafd = connection_add_fd (conn, d->datafd);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY:
 | 
				
			||||||
 | 
					      p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageDestroy));
 | 
				
			||||||
 | 
					      memcpy (p, message, sizeof (PinosMessageDestroy));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY_DONE:
 | 
				
			||||||
 | 
					      p = connection_add_message (conn, dest_id, type, sizeof (PinosMessageDestroyDone));
 | 
				
			||||||
 | 
					      memcpy (p, message, sizeof (PinosMessageDestroyDone));
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* C -> S */
 | 
					    /* C -> S */
 | 
				
			||||||
    case PINOS_MESSAGE_NODE_UPDATE:
 | 
					    case PINOS_MESSAGE_NODE_UPDATE:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,8 +37,9 @@ typedef enum {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PINOS_MESSAGE_SYNC,
 | 
					  PINOS_MESSAGE_SYNC,
 | 
				
			||||||
  PINOS_MESSAGE_NOTIFY_DONE,
 | 
					  PINOS_MESSAGE_NOTIFY_DONE,
 | 
				
			||||||
 | 
					  PINOS_MESSAGE_GET_REGISTRY,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PINOS_MESSAGE_SUBSCRIBE,
 | 
					  PINOS_MESSAGE_BIND,
 | 
				
			||||||
  PINOS_MESSAGE_NOTIFY_GLOBAL,
 | 
					  PINOS_MESSAGE_NOTIFY_GLOBAL,
 | 
				
			||||||
  PINOS_MESSAGE_NOTIFY_GLOBAL_REMOVE,
 | 
					  PINOS_MESSAGE_NOTIFY_GLOBAL_REMOVE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +49,9 @@ typedef enum {
 | 
				
			||||||
  PINOS_MESSAGE_CREATE_CLIENT_NODE,
 | 
					  PINOS_MESSAGE_CREATE_CLIENT_NODE,
 | 
				
			||||||
  PINOS_MESSAGE_CREATE_CLIENT_NODE_DONE,
 | 
					  PINOS_MESSAGE_CREATE_CLIENT_NODE_DONE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PINOS_MESSAGE_DESTROY,
 | 
				
			||||||
 | 
					  PINOS_MESSAGE_DESTROY_DONE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* client to server */
 | 
					  /* client to server */
 | 
				
			||||||
  PINOS_MESSAGE_NODE_UPDATE,
 | 
					  PINOS_MESSAGE_NODE_UPDATE,
 | 
				
			||||||
  PINOS_MESSAGE_PORT_UPDATE,
 | 
					  PINOS_MESSAGE_PORT_UPDATE,
 | 
				
			||||||
| 
						 | 
					@ -84,10 +88,17 @@ typedef struct {
 | 
				
			||||||
  uint32_t     seq;
 | 
					  uint32_t     seq;
 | 
				
			||||||
} PinosMessageNotifyDone;
 | 
					} PinosMessageNotifyDone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PINOS_MESSAGE_SUBSCRIBE */
 | 
					/* PINOS_MESSAGE_GET_REGISTRY */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  uint32_t     seq;
 | 
					  uint32_t     seq;
 | 
				
			||||||
} PinosMessageSubscribe;
 | 
					  uint32_t     new_id;
 | 
				
			||||||
 | 
					} PinosMessageGetRegistry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PINOS_MESSAGE_BIND */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  uint32_t     id;
 | 
				
			||||||
 | 
					  uint32_t     new_id;
 | 
				
			||||||
 | 
					} PinosMessageBind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PINOS_MESSAGE_NOTIFY_GLOBAL */
 | 
					/* PINOS_MESSAGE_NOTIFY_GLOBAL */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -106,7 +117,7 @@ typedef struct {
 | 
				
			||||||
  const char  *factory_name;
 | 
					  const char  *factory_name;
 | 
				
			||||||
  const char  *name;
 | 
					  const char  *name;
 | 
				
			||||||
  SpaDict     *props;
 | 
					  SpaDict     *props;
 | 
				
			||||||
  uint32_t     id;
 | 
					  uint32_t     new_id;
 | 
				
			||||||
} PinosMessageCreateNode;
 | 
					} PinosMessageCreateNode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PINOS_MESSAGE_CREATE_NODE_DONE */
 | 
					/* PINOS_MESSAGE_CREATE_NODE_DONE */
 | 
				
			||||||
| 
						 | 
					@ -119,7 +130,7 @@ typedef struct {
 | 
				
			||||||
  uint32_t     seq;
 | 
					  uint32_t     seq;
 | 
				
			||||||
  const char  *name;
 | 
					  const char  *name;
 | 
				
			||||||
  SpaDict     *props;
 | 
					  SpaDict     *props;
 | 
				
			||||||
  uint32_t     id;
 | 
					  uint32_t     new_id;
 | 
				
			||||||
} PinosMessageCreateClientNode;
 | 
					} PinosMessageCreateClientNode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* PINOS_MESSAGE_CREATE_CLIENT_NODE_DONE */
 | 
					/* PINOS_MESSAGE_CREATE_CLIENT_NODE_DONE */
 | 
				
			||||||
| 
						 | 
					@ -128,6 +139,18 @@ typedef struct {
 | 
				
			||||||
  int          datafd;
 | 
					  int          datafd;
 | 
				
			||||||
} PinosMessageCreateClientNodeDone;
 | 
					} PinosMessageCreateClientNodeDone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PINOS_MESSAGE_DESTROY */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  uint32_t     seq;
 | 
				
			||||||
 | 
					  uint32_t     id;
 | 
				
			||||||
 | 
					} PinosMessageDestroy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* PINOS_MESSAGE_DESTROY_DONE */
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  uint32_t     seq;
 | 
				
			||||||
 | 
					  uint32_t     id;
 | 
				
			||||||
 | 
					} PinosMessageDestroyDone;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*  PINOS_MESSAGE_NODE_UPDATE */
 | 
					/*  PINOS_MESSAGE_NODE_UPDATE */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
#define PINOS_MESSAGE_NODE_UPDATE_MAX_INPUTS   (1 << 0)
 | 
					#define PINOS_MESSAGE_NODE_UPDATE_MAX_INPUTS   (1 << 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -113,12 +113,32 @@ core_dispatch_func (void             *object,
 | 
				
			||||||
        context_set_state (context, PINOS_CONTEXT_STATE_CONNECTED, NULL);
 | 
					        context_set_state (context, PINOS_CONTEXT_STATE_CONNECTED, NULL);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      pinos_log_warn ("unhandled message %d", type);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SpaResult
 | 
				
			||||||
 | 
					registry_dispatch_func (void             *object,
 | 
				
			||||||
 | 
					                        PinosMessageType  type,
 | 
				
			||||||
 | 
					                        void             *message,
 | 
				
			||||||
 | 
					                        void             *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  switch (type) {
 | 
				
			||||||
    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
					    case PINOS_MESSAGE_NOTIFY_GLOBAL:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      PinosMessageNotifyGlobal *ng = message;
 | 
					      PinosMessageNotifyGlobal *ng = message;
 | 
				
			||||||
      pinos_log_debug ("got global %u %s", ng->id, ng->type);
 | 
					      pinos_log_debug ("got global %u %s", ng->id, ng->type);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_NOTIFY_GLOBAL_REMOVE:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      PinosMessageNotifyGlobalRemove *ng = message;
 | 
				
			||||||
 | 
					      pinos_log_debug ("got global remove %u", ng->id);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
      pinos_log_warn ("unhandled message %d", type);
 | 
					      pinos_log_warn ("unhandled message %d", type);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					@ -292,7 +312,7 @@ pinos_context_connect (PinosContext      *context)
 | 
				
			||||||
  socklen_t size;
 | 
					  socklen_t size;
 | 
				
			||||||
  const char *runtime_dir, *name = NULL;
 | 
					  const char *runtime_dir, *name = NULL;
 | 
				
			||||||
  int name_size, fd;
 | 
					  int name_size, fd;
 | 
				
			||||||
  PinosMessageSubscribe sm;
 | 
					  PinosMessageGetRegistry grm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  context_set_state (context, PINOS_CONTEXT_STATE_CONNECTING, NULL);
 | 
					  context_set_state (context, PINOS_CONTEXT_STATE_CONNECTING, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -349,10 +369,17 @@ pinos_context_connect (PinosContext      *context)
 | 
				
			||||||
  context->core_proxy->dispatch_func = core_dispatch_func;
 | 
					  context->core_proxy->dispatch_func = core_dispatch_func;
 | 
				
			||||||
  context->core_proxy->dispatch_data = context;
 | 
					  context->core_proxy->dispatch_data = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  sm.seq = 0;
 | 
					  context->registry_proxy = pinos_proxy_new (context,
 | 
				
			||||||
 | 
					                                             SPA_ID_INVALID,
 | 
				
			||||||
 | 
					                                             0);
 | 
				
			||||||
 | 
					  context->registry_proxy->dispatch_func = registry_dispatch_func;
 | 
				
			||||||
 | 
					  context->registry_proxy->dispatch_data = context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  grm.seq = 0;
 | 
				
			||||||
 | 
					  grm.new_id = context->registry_proxy->id;
 | 
				
			||||||
  pinos_proxy_send_message (context->core_proxy,
 | 
					  pinos_proxy_send_message (context->core_proxy,
 | 
				
			||||||
                            PINOS_MESSAGE_SUBSCRIBE,
 | 
					                            PINOS_MESSAGE_GET_REGISTRY,
 | 
				
			||||||
                            &sm,
 | 
					                            &grm,
 | 
				
			||||||
                            true);
 | 
					                            true);
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +63,7 @@ struct _PinosContext {
 | 
				
			||||||
  PinosLoop       *loop;
 | 
					  PinosLoop       *loop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosProxy      *core_proxy;
 | 
					  PinosProxy      *core_proxy;
 | 
				
			||||||
 | 
					  PinosProxy      *registry_proxy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosMap   objects;
 | 
					  PinosMap   objects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,7 +45,8 @@ struct _PinosMap {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define pinos_map_get_size(m)            pinos_array_get_len (&(m)->items, PinosMapItem)
 | 
					#define pinos_map_get_size(m)            pinos_array_get_len (&(m)->items, PinosMapItem)
 | 
				
			||||||
#define pinos_map_get_item(m,id)         pinos_array_get_unchecked(&(m)->items,id,PinosMapItem)
 | 
					#define pinos_map_get_item(m,id)         pinos_array_get_unchecked(&(m)->items,id,PinosMapItem)
 | 
				
			||||||
#define pinos_map_item_is_free(m,id)     (pinos_map_get_item(m,id)->next & 0x1)
 | 
					#define pinos_map_item_is_free(item)     ((item)->next & 0x1)
 | 
				
			||||||
 | 
					#define pinos_map_id_is_free(m,id)       (pinos_map_item_is_free (pinos_map_get_item(m,id)))
 | 
				
			||||||
#define pinos_map_check_id(m,id)         ((id) < pinos_map_get_size (m))
 | 
					#define pinos_map_check_id(m,id)         ((id) < pinos_map_get_size (m))
 | 
				
			||||||
#define pinos_map_has_item(m,id)         (pinos_map_check_id(m,id) && !pinos_map_item_is_free(m, id))
 | 
					#define pinos_map_has_item(m,id)         (pinos_map_check_id(m,id) && !pinos_map_item_is_free(m, id))
 | 
				
			||||||
#define pinos_map_lookup_unchecked(m,id) pinos_map_get_item(m,id)->data
 | 
					#define pinos_map_lookup_unchecked(m,id) pinos_map_get_item(m,id)->data
 | 
				
			||||||
| 
						 | 
					@ -104,6 +105,19 @@ pinos_map_lookup (PinosMap *map,
 | 
				
			||||||
  return NULL;
 | 
					  return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void
 | 
				
			||||||
 | 
					pinos_map_for_each (PinosMap *map,
 | 
				
			||||||
 | 
					                    void     (*func) (void *, void *),
 | 
				
			||||||
 | 
					                    void     *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  PinosMapItem *item;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinos_array_for_each (item, &map->items) {
 | 
				
			||||||
 | 
					    if (!pinos_map_item_is_free (item))
 | 
				
			||||||
 | 
					      func (item->data, data);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}  /* extern "C" */
 | 
					}  /* extern "C" */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -607,7 +607,10 @@ stream_dispatch_func (void             *object,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (type) {
 | 
					  switch (type) {
 | 
				
			||||||
    case PINOS_MESSAGE_SYNC:
 | 
					    case PINOS_MESSAGE_SYNC:
 | 
				
			||||||
    case PINOS_MESSAGE_SUBSCRIBE:
 | 
					    case PINOS_MESSAGE_GET_REGISTRY:
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_BIND:
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY:
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_DESTROY_DONE:
 | 
				
			||||||
    case PINOS_MESSAGE_CREATE_NODE:
 | 
					    case PINOS_MESSAGE_CREATE_NODE:
 | 
				
			||||||
    case PINOS_MESSAGE_CREATE_CLIENT_NODE:
 | 
					    case PINOS_MESSAGE_CREATE_CLIENT_NODE:
 | 
				
			||||||
    case PINOS_MESSAGE_NODE_UPDATE:
 | 
					    case PINOS_MESSAGE_NODE_UPDATE:
 | 
				
			||||||
| 
						 | 
					@ -899,7 +902,7 @@ pinos_stream_connect (PinosStream      *stream,
 | 
				
			||||||
  items[0].key = "pinos.target.node";
 | 
					  items[0].key = "pinos.target.node";
 | 
				
			||||||
  items[0].value = port_path;
 | 
					  items[0].value = port_path;
 | 
				
			||||||
  ccn.props = &dict;
 | 
					  ccn.props = &dict;
 | 
				
			||||||
  ccn.id = impl->node_proxy->id;
 | 
					  ccn.new_id = impl->node_proxy->id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_proxy_send_message (stream->context->core_proxy,
 | 
					  pinos_proxy_send_message (stream->context->core_proxy,
 | 
				
			||||||
                            PINOS_MESSAGE_CREATE_CLIENT_NODE,
 | 
					                            PINOS_MESSAGE_CREATE_CLIENT_NODE,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,6 +171,29 @@ client_destroy (PinosProtocolNativeClient *this)
 | 
				
			||||||
  close (this->fd);
 | 
					  close (this->fd);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					destroy_registry_resource (void *object)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  PinosResource *resource = object;
 | 
				
			||||||
 | 
					  spa_list_remove (&resource->link);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static SpaResult
 | 
				
			||||||
 | 
					registry_dispatch_func (void             *object,
 | 
				
			||||||
 | 
					                        PinosMessageType  type,
 | 
				
			||||||
 | 
					                        void             *message,
 | 
				
			||||||
 | 
					                        void             *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  switch (type) {
 | 
				
			||||||
 | 
					    case PINOS_MESSAGE_BIND:
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      pinos_log_error ("unhandled message %d", type);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SpaResult
 | 
					static SpaResult
 | 
				
			||||||
core_dispatch_func (void             *object,
 | 
					core_dispatch_func (void             *object,
 | 
				
			||||||
                    PinosMessageType  type,
 | 
					                    PinosMessageType  type,
 | 
				
			||||||
| 
						 | 
					@ -182,18 +205,30 @@ core_dispatch_func (void             *object,
 | 
				
			||||||
  PinosClient *c = client->parent.global->object;
 | 
					  PinosClient *c = client->parent.global->object;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (type) {
 | 
					  switch (type) {
 | 
				
			||||||
    case PINOS_MESSAGE_SUBSCRIBE:
 | 
					    case PINOS_MESSAGE_GET_REGISTRY:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      PinosMessageSubscribe *m = message;
 | 
					      PinosMessageGetRegistry *m = message;
 | 
				
			||||||
      PinosGlobal *global;
 | 
					      PinosGlobal *global;
 | 
				
			||||||
      PinosMessageNotifyDone nd;
 | 
					      PinosMessageNotifyDone nd;
 | 
				
			||||||
 | 
					      PinosResource *registry_resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      registry_resource = pinos_resource_new (c,
 | 
				
			||||||
 | 
					                                              SPA_ID_INVALID,
 | 
				
			||||||
 | 
					                                              impl->core->uri.registry,
 | 
				
			||||||
 | 
					                                              impl->core,
 | 
				
			||||||
 | 
					                                              destroy_registry_resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      registry_resource->dispatch_func = registry_dispatch_func;
 | 
				
			||||||
 | 
					      registry_resource->dispatch_data = client;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      spa_list_insert (impl->core->registry_resource_list.prev, ®istry_resource->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      spa_list_for_each (global, &impl->core->global_list, link) {
 | 
					      spa_list_for_each (global, &impl->core->global_list, link) {
 | 
				
			||||||
        PinosMessageNotifyGlobal ng;
 | 
					        PinosMessageNotifyGlobal ng;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ng.id = global->id;
 | 
					        ng.id = global->id;
 | 
				
			||||||
        ng.type = spa_id_map_get_uri (impl->core->uri.map, global->type);
 | 
					        ng.type = spa_id_map_get_uri (impl->core->uri.map, global->type);
 | 
				
			||||||
        pinos_resource_send_message (client->core_resource,
 | 
					        pinos_resource_send_message (registry_resource,
 | 
				
			||||||
                                     PINOS_MESSAGE_NOTIFY_GLOBAL,
 | 
					                                     PINOS_MESSAGE_NOTIFY_GLOBAL,
 | 
				
			||||||
                                     &ng,
 | 
					                                     &ng,
 | 
				
			||||||
                                     false);
 | 
					                                     false);
 | 
				
			||||||
| 
						 | 
					@ -221,7 +256,7 @@ core_dispatch_func (void             *object,
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      node = pinos_client_node_new (c,
 | 
					      node = pinos_client_node_new (c,
 | 
				
			||||||
                                    m->id,
 | 
					                                    m->new_id,
 | 
				
			||||||
                                    m->name,
 | 
					                                    m->name,
 | 
				
			||||||
                                    props);
 | 
					                                    props);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -267,18 +302,6 @@ client_send_func (void             *object,
 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static PinosResource *
 | 
					 | 
				
			||||||
find_resource (PinosClient *client, uint32_t id)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  PinosResource *resource;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  spa_list_for_each (resource, &client->resource_list, link) {
 | 
					 | 
				
			||||||
    if (resource->id == id)
 | 
					 | 
				
			||||||
      return resource;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return NULL;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
connection_data (SpaSource *source,
 | 
					connection_data (SpaSource *source,
 | 
				
			||||||
                 int        fd,
 | 
					                 int        fd,
 | 
				
			||||||
| 
						 | 
					@ -290,6 +313,7 @@ connection_data (SpaSource *source,
 | 
				
			||||||
  PinosMessageType type;
 | 
					  PinosMessageType type;
 | 
				
			||||||
  uint32_t id;
 | 
					  uint32_t id;
 | 
				
			||||||
  size_t size;
 | 
					  size_t size;
 | 
				
			||||||
 | 
					  PinosClient *c = client->parent.global->object;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (mask & (SPA_IO_ERR | SPA_IO_HUP)) {
 | 
					  if (mask & (SPA_IO_ERR | SPA_IO_HUP)) {
 | 
				
			||||||
    pinos_log_debug ("protocol-native %p: got connection error", client->parent.impl);
 | 
					    pinos_log_debug ("protocol-native %p: got connection error", client->parent.impl);
 | 
				
			||||||
| 
						 | 
					@ -311,7 +335,7 @@ connection_data (SpaSource *source,
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resource = find_resource (client->parent.global->object, id);
 | 
					    resource = pinos_map_lookup (&c->objects, id);
 | 
				
			||||||
    if (resource == NULL) {
 | 
					    if (resource == NULL) {
 | 
				
			||||||
      pinos_log_error ("protocol-native %p: unknown resource %u", client->parent.impl, id);
 | 
					      pinos_log_error ("protocol-native %p: unknown resource %u", client->parent.impl, id);
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
| 
						 | 
					@ -376,6 +400,8 @@ on_global_added (PinosListener *listener,
 | 
				
			||||||
                 PinosGlobal   *global)
 | 
					                 PinosGlobal   *global)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PinosProtocolNative *impl = SPA_CONTAINER_OF (listener, PinosProtocolNative, global_added);
 | 
					  PinosProtocolNative *impl = SPA_CONTAINER_OF (listener, PinosProtocolNative, global_added);
 | 
				
			||||||
 | 
					  PinosMessageNotifyGlobal ng;
 | 
				
			||||||
 | 
					  PinosResource *registry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (global->type == impl->core->uri.client) {
 | 
					  if (global->type == impl->core->uri.client) {
 | 
				
			||||||
    object_new (sizeof (PinosProtocolNativeClient),
 | 
					    object_new (sizeof (PinosProtocolNativeClient),
 | 
				
			||||||
| 
						 | 
					@ -389,6 +415,16 @@ on_global_added (PinosListener *listener,
 | 
				
			||||||
                NULL);
 | 
					                NULL);
 | 
				
			||||||
  } else if (global->type == impl->core->uri.link) {
 | 
					  } else if (global->type == impl->core->uri.link) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ng.id = global->id;
 | 
				
			||||||
 | 
					  ng.type = spa_id_map_get_uri (impl->core->uri.map, global->type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  spa_list_for_each (registry, &core->registry_resource_list, link) {
 | 
				
			||||||
 | 
					    pinos_resource_send_message (registry,
 | 
				
			||||||
 | 
					                                 PINOS_MESSAGE_NOTIFY_GLOBAL,
 | 
				
			||||||
 | 
					                                 &ng,
 | 
				
			||||||
 | 
					                                 true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -398,10 +434,20 @@ on_global_removed (PinosListener *listener,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PinosProtocolNative *impl = SPA_CONTAINER_OF (listener, PinosProtocolNative, global_removed);
 | 
					  PinosProtocolNative *impl = SPA_CONTAINER_OF (listener, PinosProtocolNative, global_removed);
 | 
				
			||||||
  PinosProtocolNativeObject *object;
 | 
					  PinosProtocolNativeObject *object;
 | 
				
			||||||
 | 
					  PinosMessageNotifyGlobalRemove ng;
 | 
				
			||||||
 | 
					  PinosResource *registry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ((object = find_object (impl, global->object))) {
 | 
					  if ((object = find_object (impl, global->object))) {
 | 
				
			||||||
    object_destroy (object);
 | 
					    object_destroy (object);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ng.id = global->id;
 | 
				
			||||||
 | 
					  spa_list_for_each (registry, &core->registry_resource_list, link) {
 | 
				
			||||||
 | 
					    pinos_resource_send_message (registry,
 | 
				
			||||||
 | 
					                                 PINOS_MESSAGE_NOTIFY_GLOBAL_REMOVE,
 | 
				
			||||||
 | 
					                                 &ng,
 | 
				
			||||||
 | 
					                                 true);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Socket *
 | 
					static Socket *
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1208,6 +1208,12 @@ proxy_clear (SpaProxy *this)
 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					client_node_resource_destroy (PinosResource *resource)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  pinos_client_node_destroy (resource->object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * pinos_client_node_new:
 | 
					 * pinos_client_node_new:
 | 
				
			||||||
 * @daemon: a #PinosDaemon
 | 
					 * @daemon: a #PinosDaemon
 | 
				
			||||||
| 
						 | 
					@ -1257,7 +1263,7 @@ pinos_client_node_new (PinosClient     *client,
 | 
				
			||||||
                                       id,
 | 
					                                       id,
 | 
				
			||||||
                                       client->core->uri.client_node,
 | 
					                                       client->core->uri.client_node,
 | 
				
			||||||
                                       this,
 | 
					                                       this,
 | 
				
			||||||
                                       (PinosDestroy) pinos_client_node_destroy);
 | 
					                                       (PinosDestroy) client_node_resource_destroy);
 | 
				
			||||||
  impl->proxy.resource = this->resource;
 | 
					  impl->proxy.resource = this->resource;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  this->resource->dispatch_func = client_node_dispatch_func;
 | 
					  this->resource->dispatch_func = client_node_dispatch_func;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ pinos_client_new (PinosCore       *core,
 | 
				
			||||||
  this->core = core;
 | 
					  this->core = core;
 | 
				
			||||||
  this->properties = properties;
 | 
					  this->properties = properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_init (&this->resource_list);
 | 
					  pinos_map_init (&this->objects, 64);
 | 
				
			||||||
  pinos_signal_init (&this->destroy_signal);
 | 
					  pinos_signal_init (&this->destroy_signal);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_insert (core->client_list.prev, &this->link);
 | 
					  spa_list_insert (core->client_list.prev, &this->link);
 | 
				
			||||||
| 
						 | 
					@ -80,6 +80,13 @@ sync_destroy (void      *object,
 | 
				
			||||||
  free (impl);
 | 
					  free (impl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					destroy_resource (void *object,
 | 
				
			||||||
 | 
					                  void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  pinos_resource_destroy (object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * pinos_client_destroy:
 | 
					 * pinos_client_destroy:
 | 
				
			||||||
 * @client: a #PinosClient
 | 
					 * @client: a #PinosClient
 | 
				
			||||||
| 
						 | 
					@ -89,13 +96,10 @@ sync_destroy (void      *object,
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
pinos_client_destroy (PinosClient * client)
 | 
					pinos_client_destroy (PinosClient * client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PinosResource *resource, *tmp;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pinos_log_debug ("client %p: destroy", client);
 | 
					  pinos_log_debug ("client %p: destroy", client);
 | 
				
			||||||
  pinos_signal_emit (&client->destroy_signal, client);
 | 
					  pinos_signal_emit (&client->destroy_signal, client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_for_each_safe (resource, tmp, &client->resource_list, link)
 | 
					  pinos_map_for_each (&client->objects, destroy_resource, client);
 | 
				
			||||||
    pinos_resource_destroy (resource);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_global_destroy (client->global);
 | 
					  pinos_global_destroy (client->global);
 | 
				
			||||||
  spa_list_remove (&client->link);
 | 
					  spa_list_remove (&client->link);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,7 +44,7 @@ struct _PinosClient {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosProperties *properties;
 | 
					  PinosProperties *properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SpaList resource_list;
 | 
					  PinosMap objects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosSendFunc   send_func;
 | 
					  PinosSendFunc   send_func;
 | 
				
			||||||
  void           *send_data;
 | 
					  void           *send_data;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,6 +56,7 @@ pinos_core_new (PinosMainLoop *main_loop)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_data_loop_start (this->data_loop);
 | 
					  pinos_data_loop_start (this->data_loop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  spa_list_init (&this->registry_resource_list);
 | 
				
			||||||
  spa_list_init (&this->global_list);
 | 
					  spa_list_init (&this->global_list);
 | 
				
			||||||
  spa_list_init (&this->client_list);
 | 
					  spa_list_init (&this->client_list);
 | 
				
			||||||
  spa_list_init (&this->node_list);
 | 
					  spa_list_init (&this->node_list);
 | 
				
			||||||
| 
						 | 
					@ -111,6 +112,8 @@ pinos_core_add_global (PinosCore           *core,
 | 
				
			||||||
  spa_list_insert (core->global_list.prev, &global->link);
 | 
					  spa_list_insert (core->global_list.prev, &global->link);
 | 
				
			||||||
  pinos_signal_emit (&core->global_added, core, global);
 | 
					  pinos_signal_emit (&core->global_added, core, global);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pinos_log_debug ("global %p: new %u", global, global->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return global;
 | 
					  return global;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ typedef struct _PinosGlobal PinosGlobal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PINOS_CORE_URI                            "http://pinos.org/ns/core"
 | 
					#define PINOS_CORE_URI                            "http://pinos.org/ns/core"
 | 
				
			||||||
#define PINOS_CORE_PREFIX                         PINOS_CORE_URI "#"
 | 
					#define PINOS_CORE_PREFIX                         PINOS_CORE_URI "#"
 | 
				
			||||||
 | 
					#define PINOS_CORE_REGISTRY                       PINOS_CORE_PREFIX "Registry"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <spa/include/spa/log.h>
 | 
					#include <spa/include/spa/log.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +63,7 @@ struct _PinosCore {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PinosMap objects;
 | 
					  PinosMap objects;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SpaList registry_resource_list;
 | 
				
			||||||
  SpaList global_list;
 | 
					  SpaList global_list;
 | 
				
			||||||
  SpaList client_list;
 | 
					  SpaList client_list;
 | 
				
			||||||
  SpaList node_list;
 | 
					  SpaList node_list;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,26 +28,25 @@ pinos_resource_new (PinosClient *client,
 | 
				
			||||||
                    void        *object,
 | 
					                    void        *object,
 | 
				
			||||||
                    PinosDestroy destroy)
 | 
					                    PinosDestroy destroy)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  PinosResource *resource;
 | 
					  PinosResource *this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  resource = calloc (1, sizeof (PinosResource));
 | 
					  this = calloc (1, sizeof (PinosResource));
 | 
				
			||||||
  pinos_log_debug ("resource %p: new for client %p", resource, client);
 | 
					  this->core = client->core;
 | 
				
			||||||
 | 
					  this->client = client;
 | 
				
			||||||
 | 
					  this->id = id;
 | 
				
			||||||
 | 
					  this->type = type;
 | 
				
			||||||
 | 
					  this->object = object;
 | 
				
			||||||
 | 
					  this->destroy = destroy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  resource->core = client->core;
 | 
					  this->send_func = client->send_func;
 | 
				
			||||||
  resource->client = client;
 | 
					  this->send_data = client->send_data;
 | 
				
			||||||
  resource->id = id;
 | 
					 | 
				
			||||||
  resource->type = type;
 | 
					 | 
				
			||||||
  resource->object = object;
 | 
					 | 
				
			||||||
  resource->destroy = destroy;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  resource->send_func = client->send_func;
 | 
					  pinos_signal_init (&this->destroy_signal);
 | 
				
			||||||
  resource->send_data = client->send_data;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_signal_init (&resource->destroy_signal);
 | 
					  this->id = pinos_map_insert_new (&client->objects, this);
 | 
				
			||||||
 | 
					  pinos_log_debug ("resource %p: new for client %p id %u", this, client, this->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_insert (client->resource_list.prev, &resource->link);
 | 
					  return this;
 | 
				
			||||||
 | 
					 | 
				
			||||||
  return resource;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
| 
						 | 
					@ -67,10 +66,10 @@ pinos_resource_destroy (PinosResource *resource)
 | 
				
			||||||
  pinos_log_debug ("resource %p: destroy", resource);
 | 
					  pinos_log_debug ("resource %p: destroy", resource);
 | 
				
			||||||
  pinos_signal_emit (&resource->destroy_signal, resource);
 | 
					  pinos_signal_emit (&resource->destroy_signal, resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_list_remove (&resource->link);
 | 
					  pinos_map_remove (&resource->client->objects, resource->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (resource->destroy)
 | 
					  if (resource->destroy)
 | 
				
			||||||
    resource->destroy (resource->object);
 | 
					    resource->destroy (resource);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pinos_main_loop_defer (resource->core->main_loop,
 | 
					  pinos_main_loop_defer (resource->core->main_loop,
 | 
				
			||||||
                         resource,
 | 
					                         resource,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,6 +36,7 @@ pinos_uri_init (PinosURI *uri)
 | 
				
			||||||
  uri->map = pinos_id_map_get_default();
 | 
					  uri->map = pinos_id_map_get_default();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uri->core = spa_id_map_get_id (uri->map, PINOS_CORE_URI);
 | 
					  uri->core = spa_id_map_get_id (uri->map, PINOS_CORE_URI);
 | 
				
			||||||
 | 
					  uri->registry = spa_id_map_get_id (uri->map, PINOS_CORE_REGISTRY);
 | 
				
			||||||
  uri->node = spa_id_map_get_id (uri->map, PINOS_NODE_URI);
 | 
					  uri->node = spa_id_map_get_id (uri->map, PINOS_NODE_URI);
 | 
				
			||||||
  uri->node_factory = spa_id_map_get_id (uri->map, PINOS_NODE_FACTORY_URI);
 | 
					  uri->node_factory = spa_id_map_get_id (uri->map, PINOS_NODE_FACTORY_URI);
 | 
				
			||||||
  uri->link = spa_id_map_get_id (uri->map, PINOS_LINK_URI);
 | 
					  uri->link = spa_id_map_get_id (uri->map, PINOS_LINK_URI);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +41,7 @@ struct _PinosURI {
 | 
				
			||||||
  SpaIDMap *map;
 | 
					  SpaIDMap *map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  uint32_t core;
 | 
					  uint32_t core;
 | 
				
			||||||
 | 
					  uint32_t registry;
 | 
				
			||||||
  uint32_t node;
 | 
					  uint32_t node;
 | 
				
			||||||
  uint32_t node_factory;
 | 
					  uint32_t node_factory;
 | 
				
			||||||
  uint32_t link;
 | 
					  uint32_t link;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue