genode/repos/gems/src/app/sculpt_manager/model/access_point.h
2018-08-28 16:45:22 +02:00

84 lines
2.1 KiB
C++

/*
* \brief Representation of a wireless access point
* \author Norman Feske
* \date 2018-05-07
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _MODEL__ACCESS_POINT_H_
#define _MODEL__ACCESS_POINT_H_
#include "types.h"
namespace Sculpt {
struct Access_point;
struct Access_point_update_policy;
typedef List_model<Access_point> Access_points;
};
struct Sculpt::Access_point : List_model<Access_point>::Element
{
typedef String<32> Bssid;
typedef String<32> Ssid;
enum Protection { UNKNOWN, UNPROTECTED, WPA_PSK };
Bssid const bssid;
Ssid const ssid;
Protection const protection;
unsigned quality = 0;
Access_point(Bssid const &bssid, Ssid const &ssid, Protection protection)
: bssid(bssid), ssid(ssid), protection(protection) { }
bool unprotected() const { return protection == UNPROTECTED; }
bool wpa_protected() const { return protection == WPA_PSK; }
};
/**
* Policy for transforming a 'accesspoints' report into a list model
*/
struct Sculpt::Access_point_update_policy : List_model<Access_point>::Update_policy
{
Allocator &_alloc;
Access_point_update_policy(Allocator &alloc) : _alloc(alloc) { }
void destroy_element(Access_point &elem) { destroy(_alloc, &elem); }
Access_point &create_element(Xml_node node)
{
auto const protection = node.attribute_value("protection", String<16>());
bool const use_protection = protection == "WPA" || protection == "WPA2";
return *new (_alloc)
Access_point(node.attribute_value("bssid", Access_point::Bssid()),
node.attribute_value("ssid", Access_point::Ssid()),
use_protection ? Access_point::Protection::WPA_PSK
: Access_point::Protection::UNPROTECTED);
}
void update_element(Access_point &ap, Xml_node node)
{
ap.quality = node.attribute_value("quality", 0UL);
}
static bool element_matches_xml_node(Access_point const &elem, Xml_node node)
{
return node.attribute_value("ssid", Access_point::Ssid()) == elem.ssid;
}
};
#endif /* _MODEL__ACCESS_POINT_H_ */