mirror of
https://github.com/albfan/miraclecast.git
synced 2025-03-09 23:38:56 +00:00
miracled: implement peer properties
Implement basic peer properties and hook them up with dbus. Also add a device_name parser to the wifi implementation so we correctly read the friendly-name of remote devices. Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
parent
7457a7cf90
commit
fde71e7352
5 changed files with 159 additions and 12 deletions
|
@ -87,7 +87,6 @@ static int peer_dbus_get_link(sd_bus *bus,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
static int peer_dbus_get_name(sd_bus *bus,
|
static int peer_dbus_get_name(sd_bus *bus,
|
||||||
const char *path,
|
const char *path,
|
||||||
const char *interface,
|
const char *interface,
|
||||||
|
@ -96,7 +95,16 @@ static int peer_dbus_get_name(sd_bus *bus,
|
||||||
void *data,
|
void *data,
|
||||||
sd_bus_error *err)
|
sd_bus_error *err)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
struct peer *p = data;
|
||||||
|
const char *name;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
name = peer_get_friendly_name(p);
|
||||||
|
r = sd_bus_message_append_basic(reply, 's', name ? name : "<unknown>");
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int peer_dbus_get_connected(sd_bus *bus,
|
static int peer_dbus_get_connected(sd_bus *bus,
|
||||||
|
@ -107,7 +115,15 @@ static int peer_dbus_get_connected(sd_bus *bus,
|
||||||
void *data,
|
void *data,
|
||||||
sd_bus_error *err)
|
sd_bus_error *err)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
struct peer *p = data;
|
||||||
|
int r, val;
|
||||||
|
|
||||||
|
val = peer_is_connected(p);
|
||||||
|
r = sd_bus_message_append_basic(reply, 'b', &val);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int peer_dbus_get_interface(sd_bus *bus,
|
static int peer_dbus_get_interface(sd_bus *bus,
|
||||||
|
@ -118,7 +134,16 @@ static int peer_dbus_get_interface(sd_bus *bus,
|
||||||
void *data,
|
void *data,
|
||||||
sd_bus_error *err)
|
sd_bus_error *err)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
struct peer *p = data;
|
||||||
|
const char *val;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
val = peer_get_interface(p);
|
||||||
|
r = sd_bus_message_append_basic(reply, 's', val ? : "");
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int peer_dbus_get_local_address(sd_bus *bus,
|
static int peer_dbus_get_local_address(sd_bus *bus,
|
||||||
|
@ -129,7 +154,16 @@ static int peer_dbus_get_local_address(sd_bus *bus,
|
||||||
void *data,
|
void *data,
|
||||||
sd_bus_error *err)
|
sd_bus_error *err)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
struct peer *p = data;
|
||||||
|
const char *val;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
val = peer_get_local_address(p);
|
||||||
|
r = sd_bus_message_append_basic(reply, 's', val ? : "");
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int peer_dbus_get_remote_address(sd_bus *bus,
|
static int peer_dbus_get_remote_address(sd_bus *bus,
|
||||||
|
@ -140,9 +174,17 @@ static int peer_dbus_get_remote_address(sd_bus *bus,
|
||||||
void *data,
|
void *data,
|
||||||
sd_bus_error *err)
|
sd_bus_error *err)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
struct peer *p = data;
|
||||||
|
const char *val;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
val = peer_get_remote_address(p);
|
||||||
|
r = sd_bus_message_append_basic(reply, 's', val ? : "");
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
static const sd_bus_vtable peer_dbus_vtable[] = {
|
static const sd_bus_vtable peer_dbus_vtable[] = {
|
||||||
SD_BUS_VTABLE_START(0),
|
SD_BUS_VTABLE_START(0),
|
||||||
|
@ -171,7 +213,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = {
|
||||||
peer_dbus_get_link,
|
peer_dbus_get_link,
|
||||||
0,
|
0,
|
||||||
SD_BUS_VTABLE_PROPERTY_CONST),
|
SD_BUS_VTABLE_PROPERTY_CONST),
|
||||||
/*
|
|
||||||
SD_BUS_PROPERTY("Name",
|
SD_BUS_PROPERTY("Name",
|
||||||
"s",
|
"s",
|
||||||
peer_dbus_get_name,
|
peer_dbus_get_name,
|
||||||
|
@ -197,7 +238,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = {
|
||||||
peer_dbus_get_remote_address,
|
peer_dbus_get_remote_address,
|
||||||
0,
|
0,
|
||||||
0),
|
0),
|
||||||
*/
|
|
||||||
SD_BUS_SIGNAL("ProvisionRequest", "ss", 0),
|
SD_BUS_SIGNAL("ProvisionRequest", "ss", 0),
|
||||||
SD_BUS_VTABLE_END
|
SD_BUS_VTABLE_END
|
||||||
};
|
};
|
||||||
|
|
|
@ -140,6 +140,61 @@ void peer_free(struct peer *p)
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *peer_get_friendly_name(struct peer *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (p->d)
|
||||||
|
return wifi_dev_get_name(p->d);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool peer_is_connected(struct peer *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (p->d)
|
||||||
|
return wifi_dev_is_ready(p->d);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *peer_get_interface(struct peer *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (p->d)
|
||||||
|
return wifi_dev_get_interface(p->d);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *peer_get_local_address(struct peer *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (p->d)
|
||||||
|
return wifi_dev_get_local_address(p->d);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *peer_get_remote_address(struct peer *p)
|
||||||
|
{
|
||||||
|
if (!p)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (p->d)
|
||||||
|
return wifi_dev_get_remote_address(p->d);
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void peer_process_wifi(struct peer *p, struct wifi_event *ev)
|
void peer_process_wifi(struct peer *p, struct wifi_event *ev)
|
||||||
{
|
{
|
||||||
if (!p || !p->d)
|
if (!p || !p->d)
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include "miracled-wifi.h"
|
#include "miracled-wifi.h"
|
||||||
#include "shl_dlist.h"
|
#include "shl_dlist.h"
|
||||||
#include "shl_log.h"
|
#include "shl_log.h"
|
||||||
|
#include "shl_util.h"
|
||||||
|
|
||||||
struct wifi {
|
struct wifi {
|
||||||
sd_event *event;
|
sd_event *event;
|
||||||
|
@ -69,6 +70,8 @@ struct wifi_dev {
|
||||||
char pin[WIFI_PIN_STRLEN + 1];
|
char pin[WIFI_PIN_STRLEN + 1];
|
||||||
unsigned int provision;
|
unsigned int provision;
|
||||||
|
|
||||||
|
char *name;
|
||||||
|
|
||||||
char *ifname;
|
char *ifname;
|
||||||
unsigned int role;
|
unsigned int role;
|
||||||
|
|
||||||
|
@ -301,7 +304,7 @@ static ssize_t wifi_requestf_retry(struct wifi *w, const char *format, ...)
|
||||||
static int wifi_parse_peer(struct wifi *w, size_t len, struct wifi_dev **out)
|
static int wifi_parse_peer(struct wifi *w, size_t len, struct wifi_dev **out)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[512];
|
||||||
char *pos, *next;
|
char *pos, *next, *val;
|
||||||
int x1, x2, x3, x4, x5, x6, r;
|
int x1, x2, x3, x4, x5, x6, r;
|
||||||
struct wifi_dev *d;
|
struct wifi_dev *d;
|
||||||
|
|
||||||
|
@ -336,7 +339,13 @@ static int wifi_parse_peer(struct wifi *w, size_t len, struct wifi_dev **out)
|
||||||
if (next)
|
if (next)
|
||||||
*next = 0;
|
*next = 0;
|
||||||
|
|
||||||
log_debug("add info: %s", pos);
|
if ((val = shl_startswith(pos, "device_name="))) {
|
||||||
|
val = strdup(val);
|
||||||
|
if (val) {
|
||||||
|
free(d->name);
|
||||||
|
d->name = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*out = d;
|
*out = d;
|
||||||
|
@ -1139,6 +1148,7 @@ void wifi_dev_unref(struct wifi_dev *d)
|
||||||
|
|
||||||
wifi_dev_set_connected(d, false, false);
|
wifi_dev_set_connected(d, false, false);
|
||||||
wifi_dev_lost(d);
|
wifi_dev_lost(d);
|
||||||
|
free(d->name);
|
||||||
free(d);
|
free(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1244,3 +1254,35 @@ void wifi_dev_disconnect(struct wifi_dev *d)
|
||||||
wifi_dev_set_connected(d, false, false);
|
wifi_dev_set_connected(d, false, false);
|
||||||
wifi_dev_stop(d);
|
wifi_dev_stop(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *wifi_dev_get_name(struct wifi_dev *d)
|
||||||
|
{
|
||||||
|
if (!d)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return d->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *wifi_dev_get_interface(struct wifi_dev *d)
|
||||||
|
{
|
||||||
|
if (!wifi_dev_is_ready(d))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return d->ifname;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *wifi_dev_get_local_address(struct wifi_dev *d)
|
||||||
|
{
|
||||||
|
if (!wifi_dev_is_ready(d))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return d->local_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *wifi_dev_get_remote_address(struct wifi_dev *d)
|
||||||
|
{
|
||||||
|
if (!wifi_dev_is_ready(d))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return d->remote_addr;
|
||||||
|
}
|
||||||
|
|
|
@ -123,4 +123,9 @@ int wifi_dev_connect(struct wifi_dev *d, unsigned int provision,
|
||||||
const char *pin);
|
const char *pin);
|
||||||
void wifi_dev_disconnect(struct wifi_dev *d);
|
void wifi_dev_disconnect(struct wifi_dev *d);
|
||||||
|
|
||||||
|
const char *wifi_dev_get_name(struct wifi_dev *d);
|
||||||
|
const char *wifi_dev_get_interface(struct wifi_dev *d);
|
||||||
|
const char *wifi_dev_get_local_address(struct wifi_dev *d);
|
||||||
|
const char *wifi_dev_get_remote_address(struct wifi_dev *d);
|
||||||
|
|
||||||
#endif /* MIRACLED_WIFI_H */
|
#endif /* MIRACLED_WIFI_H */
|
||||||
|
|
|
@ -63,8 +63,13 @@ int peer_make_name(unsigned int id, char **out);
|
||||||
int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out);
|
int peer_new_wifi(struct link *l, struct wifi_dev *d, struct peer **out);
|
||||||
void peer_free(struct peer *p);
|
void peer_free(struct peer *p);
|
||||||
|
|
||||||
void peer_process_wifi(struct peer *p, struct wifi_event *ev);
|
const char *peer_get_friendly_name(struct peer *p);
|
||||||
|
bool peer_is_connected(struct peer *p);
|
||||||
|
const char *peer_get_interface(struct peer *p);
|
||||||
|
const char *peer_get_local_address(struct peer *p);
|
||||||
|
const char *peer_get_remote_address(struct peer *p);
|
||||||
|
|
||||||
|
void peer_process_wifi(struct peer *p, struct wifi_event *ev);
|
||||||
|
|
||||||
/* link */
|
/* link */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue