2016-06-14 23:32:35 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include <ifaddrs.h>
|
|
|
|
#include <iwlib.h>
|
|
|
|
|
|
|
|
#ifdef inline
|
|
|
|
#undef inline
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "common.hpp"
|
|
|
|
#include "config.hpp"
|
|
|
|
|
|
|
|
LEMONBUDDY_NS
|
|
|
|
|
|
|
|
namespace net {
|
|
|
|
DEFINE_ERROR(network_error);
|
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
bool is_wireless_interface(string ifname);
|
|
|
|
|
2016-06-14 23:32:35 -04:00
|
|
|
// types {{{
|
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
struct quality_range {
|
|
|
|
int val = 0;
|
|
|
|
int max = 0;
|
|
|
|
|
|
|
|
int percentage() const {
|
|
|
|
if (max < 0)
|
|
|
|
return 2 * (val + 100);
|
|
|
|
return static_cast<float>(val) / max * 100.0f + 0.5f;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
using bytes_t = unsigned int;
|
|
|
|
|
|
|
|
struct link_activity {
|
|
|
|
bytes_t transmitted = 0;
|
|
|
|
bytes_t received = 0;
|
|
|
|
chrono::system_clock::time_point time;
|
2016-06-14 23:32:35 -04:00
|
|
|
};
|
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
struct link_status {
|
|
|
|
string ip;
|
|
|
|
link_activity previous;
|
|
|
|
link_activity current;
|
2016-06-14 23:32:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
// }}}
|
2016-11-02 15:22:45 -04:00
|
|
|
// class : network {{{
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
class network {
|
|
|
|
public:
|
2016-11-02 15:22:45 -04:00
|
|
|
explicit network(string interface);
|
|
|
|
virtual ~network();
|
2016-06-14 23:32:35 -04:00
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
virtual bool query();
|
2016-10-18 03:34:35 -04:00
|
|
|
virtual bool connected() const = 0;
|
2016-11-02 15:22:45 -04:00
|
|
|
virtual bool ping() const;
|
2016-10-18 03:34:35 -04:00
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
string ip() const;
|
|
|
|
string downspeed(int minwidth = 3) const;
|
|
|
|
string upspeed(int minwidth = 3) const;
|
2016-06-14 23:32:35 -04:00
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
protected:
|
2016-11-02 15:22:45 -04:00
|
|
|
bool test_interface() const;
|
|
|
|
string format_speedrate(float bytes_diff, int minwidth) const;
|
2016-06-14 23:32:35 -04:00
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
int m_socketfd = 0;
|
|
|
|
link_status m_status;
|
2016-06-14 23:32:35 -04:00
|
|
|
string m_interface;
|
|
|
|
};
|
|
|
|
|
|
|
|
// }}}
|
2016-11-02 15:22:45 -04:00
|
|
|
// class : wired_network {{{
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
class wired_network : public network {
|
|
|
|
public:
|
2016-10-18 03:34:35 -04:00
|
|
|
explicit wired_network(string interface) : network(interface) {}
|
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
bool query() override;
|
|
|
|
bool connected() const override;
|
|
|
|
string linkspeed() const;
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
int m_linkspeed = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
// }}}
|
2016-11-02 15:22:45 -04:00
|
|
|
// class : wireless_network {{{
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
class wireless_network : public network {
|
|
|
|
public:
|
2016-10-18 03:34:35 -04:00
|
|
|
wireless_network(string interface) : network(interface) {}
|
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
bool query() override;
|
|
|
|
bool connected() const override;
|
2016-06-14 23:32:35 -04:00
|
|
|
|
2016-11-02 15:22:45 -04:00
|
|
|
string essid() const;
|
|
|
|
int signal() const;
|
|
|
|
int quality() const;
|
2016-06-14 23:32:35 -04:00
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
protected:
|
2016-11-02 15:22:45 -04:00
|
|
|
void query_essid(const int& socket_fd);
|
|
|
|
void query_quality(const int& socket_fd);
|
2016-06-14 23:32:35 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
shared_ptr<wireless_info> m_info;
|
2016-10-18 03:34:35 -04:00
|
|
|
string m_essid;
|
|
|
|
quality_range m_signalstrength;
|
|
|
|
quality_range m_linkquality;
|
2016-06-14 23:32:35 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
// }}}
|
|
|
|
|
2016-10-18 03:34:35 -04:00
|
|
|
using wireless_t = unique_ptr<wireless_network>;
|
|
|
|
using wired_t = unique_ptr<wired_network>;
|
2016-06-14 23:32:35 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
LEMONBUDDY_NS_END
|