1
0
Fork 0
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:
David Herrmann 2014-02-10 14:58:32 +01:00
parent 7457a7cf90
commit fde71e7352
5 changed files with 159 additions and 12 deletions

View file

@ -87,7 +87,6 @@ static int peer_dbus_get_link(sd_bus *bus,
return 1;
}
/*
static int peer_dbus_get_name(sd_bus *bus,
const char *path,
const char *interface,
@ -96,7 +95,16 @@ static int peer_dbus_get_name(sd_bus *bus,
void *data,
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,
@ -107,7 +115,15 @@ static int peer_dbus_get_connected(sd_bus *bus,
void *data,
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,
@ -118,7 +134,16 @@ static int peer_dbus_get_interface(sd_bus *bus,
void *data,
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,
@ -129,7 +154,16 @@ static int peer_dbus_get_local_address(sd_bus *bus,
void *data,
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,
@ -140,9 +174,17 @@ static int peer_dbus_get_remote_address(sd_bus *bus,
void *data,
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[] = {
SD_BUS_VTABLE_START(0),
@ -171,7 +213,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = {
peer_dbus_get_link,
0,
SD_BUS_VTABLE_PROPERTY_CONST),
/*
SD_BUS_PROPERTY("Name",
"s",
peer_dbus_get_name,
@ -197,7 +238,6 @@ static const sd_bus_vtable peer_dbus_vtable[] = {
peer_dbus_get_remote_address,
0,
0),
*/
SD_BUS_SIGNAL("ProvisionRequest", "ss", 0),
SD_BUS_VTABLE_END
};

View file

@ -140,6 +140,61 @@ void peer_free(struct peer *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)
{
if (!p || !p->d)

View file

@ -42,6 +42,7 @@
#include "miracled-wifi.h"
#include "shl_dlist.h"
#include "shl_log.h"
#include "shl_util.h"
struct wifi {
sd_event *event;
@ -69,6 +70,8 @@ struct wifi_dev {
char pin[WIFI_PIN_STRLEN + 1];
unsigned int provision;
char *name;
char *ifname;
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)
{
char buf[512];
char *pos, *next;
char *pos, *next, *val;
int x1, x2, x3, x4, x5, x6, r;
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)
*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;
@ -1139,6 +1148,7 @@ void wifi_dev_unref(struct wifi_dev *d)
wifi_dev_set_connected(d, false, false);
wifi_dev_lost(d);
free(d->name);
free(d);
}
@ -1244,3 +1254,35 @@ void wifi_dev_disconnect(struct wifi_dev *d)
wifi_dev_set_connected(d, false, false);
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;
}

View file

@ -123,4 +123,9 @@ int wifi_dev_connect(struct wifi_dev *d, unsigned int provision,
const char *pin);
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 */

View file

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