1
0
Fork 0
mirror of https://github.com/albfan/miraclecast.git synced 2025-03-09 23:38:56 +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. * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#include <alloca.h>
#include <errno.h> #include <errno.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h>
#include <systemd/sd-bus.h> #include <systemd/sd-bus.h>
#include "shl_log.h" #include "shl_log.h"
#include "shl_macro.h" #include "shl_macro.h"
@ -94,4 +96,29 @@ static inline int bus_message_read_basic_variant(sd_bus_message *m,
return 0; 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 */ #endif /* MIRACLE_H */

View file

@ -264,6 +264,25 @@ static int peer_dbus_find(sd_bus *bus,
return 1; 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 * Link DBus
*/ */
@ -407,6 +426,25 @@ static int link_dbus_find(sd_bus *bus,
return 1; 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 * Manager DBus
*/ */

View file

@ -301,6 +301,7 @@ int link_set_friendly_name(struct link *l, const char *name)
free(l->friendly_name); free(l->friendly_name);
l->friendly_name = dup; l->friendly_name = dup;
link_dbus_properties_changed(l, "Name", NULL);
return 0; return 0;
} }

View file

@ -204,8 +204,10 @@ void peer_process_wifi(struct peer *p, struct wifi_event *ev)
case WIFI_DEV_PROVISION: case WIFI_DEV_PROVISION:
break; break;
case WIFI_DEV_CONNECT: case WIFI_DEV_CONNECT:
peer_dbus_properties_changed(p, "Connected", NULL);
break; break;
case WIFI_DEV_DISCONNECT: case WIFI_DEV_DISCONNECT:
peer_dbus_properties_changed(p, "Connected", NULL);
break; break;
default: default:
log_debug("unhandled WIFI event: %u", ev->type); 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 link *manager_find_link(struct manager *m, const char *name);
struct peer *manager_find_peer(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 */ #endif /* MIRACLED_H */