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:
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.
|
* 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 */
|
||||||
|
|
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue