1
0
Fork 0
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:
David Herrmann 2014-02-10 15:57:02 +01:00
parent 14ca5829b2
commit 5d5ab7761f
5 changed files with 73 additions and 0 deletions

View file

@ -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 */

View file

@ -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
*/

View file

@ -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;
}

View file

@ -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);

View file

@ -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 */