mirror of
https://github.com/albfan/miraclecast.git
synced 2025-02-12 16:31:54 +00:00
miracled: implement PropertiesChanged signals
We need to send PropertiesChanged signals whenever we change properties that are annotated as such. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
parent
14ca5829b2
commit
5d5ab7761f
5 changed files with 73 additions and 0 deletions
|
@ -23,9 +23,11 @@
|
|||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <alloca.h>
|
||||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <systemd/sd-bus.h>
|
||||
#include "shl_log.h"
|
||||
#include "shl_macro.h"
|
||||
|
@ -94,4 +96,29 @@ static inline int bus_message_read_basic_variant(sd_bus_message *m,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define strv_from_stdarg_alloca(first) ({ \
|
||||
char **_l; \
|
||||
if (!first) { \
|
||||
_l = (char**)&first; \
|
||||
} else { \
|
||||
unsigned _n; \
|
||||
va_list _ap; \
|
||||
_n = 1; \
|
||||
va_start(_ap, first); \
|
||||
while (va_arg(_ap, char*)) \
|
||||
_n++; \
|
||||
va_end(_ap); \
|
||||
_l = alloca(sizeof(char*) * (_n + 1)); \
|
||||
_l[_n = 0] = (char*)first; \
|
||||
va_start(_ap, first); \
|
||||
for (;;) { \
|
||||
_l[++_n] = va_arg(_ap, char*); \
|
||||
if (!_l[_n]) \
|
||||
break; \
|
||||
} \
|
||||
va_end(_ap); \
|
||||
} \
|
||||
_l; \
|
||||
})
|
||||
|
||||
#endif /* MIRACLE_H */
|
||||
|
|
|
@ -264,6 +264,25 @@ static int peer_dbus_find(sd_bus *bus,
|
|||
return 1;
|
||||
}
|
||||
|
||||
void peer_dbus_properties_changed(struct peer *p, const char *prop, ...)
|
||||
{
|
||||
_cleanup_free_ char *path = NULL;
|
||||
char **strv;
|
||||
int r;
|
||||
|
||||
path = shl_strcat("/org/freedesktop/miracle/peer/", p->name);
|
||||
if (!path)
|
||||
return log_vENOMEM();
|
||||
|
||||
strv = strv_from_stdarg_alloca(prop);
|
||||
r = sd_bus_emit_properties_changed_strv(p->l->m->bus,
|
||||
path,
|
||||
"org.freedesktop.miracle.Peer",
|
||||
strv);
|
||||
if (r < 0)
|
||||
log_vERR(r);
|
||||
}
|
||||
|
||||
/*
|
||||
* Link DBus
|
||||
*/
|
||||
|
@ -407,6 +426,25 @@ static int link_dbus_find(sd_bus *bus,
|
|||
return 1;
|
||||
}
|
||||
|
||||
void link_dbus_properties_changed(struct link *l, const char *prop, ...)
|
||||
{
|
||||
_cleanup_free_ char *path = NULL;
|
||||
char **strv;
|
||||
int r;
|
||||
|
||||
path = shl_strcat("/org/freedesktop/miracle/link/", l->name);
|
||||
if (!path)
|
||||
return log_vENOMEM();
|
||||
|
||||
strv = strv_from_stdarg_alloca(prop);
|
||||
r = sd_bus_emit_properties_changed_strv(l->m->bus,
|
||||
path,
|
||||
"org.freedesktop.miracle.Link",
|
||||
strv);
|
||||
if (r < 0)
|
||||
log_vERR(r);
|
||||
}
|
||||
|
||||
/*
|
||||
* Manager DBus
|
||||
*/
|
||||
|
|
|
@ -301,6 +301,7 @@ int link_set_friendly_name(struct link *l, const char *name)
|
|||
|
||||
free(l->friendly_name);
|
||||
l->friendly_name = dup;
|
||||
link_dbus_properties_changed(l, "Name", NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -204,8 +204,10 @@ void peer_process_wifi(struct peer *p, struct wifi_event *ev)
|
|||
case WIFI_DEV_PROVISION:
|
||||
break;
|
||||
case WIFI_DEV_CONNECT:
|
||||
peer_dbus_properties_changed(p, "Connected", NULL);
|
||||
break;
|
||||
case WIFI_DEV_DISCONNECT:
|
||||
peer_dbus_properties_changed(p, "Connected", NULL);
|
||||
break;
|
||||
default:
|
||||
log_debug("unhandled WIFI event: %u", ev->type);
|
||||
|
|
|
@ -138,4 +138,9 @@ void manager_dbus_disconnect(struct manager *m);
|
|||
struct link *manager_find_link(struct manager *m, const char *name);
|
||||
struct peer *manager_find_peer(struct manager *m, const char *name);
|
||||
|
||||
/* dbus */
|
||||
|
||||
void peer_dbus_properties_changed(struct peer *p, const char *prop, ...);
|
||||
void link_dbus_properties_changed(struct link *l, const char *prop, ...);
|
||||
|
||||
#endif /* MIRACLED_H */
|
||||
|
|
Loading…
Reference in a new issue