vcpe/l2tp/xl2tpd/contrib/system_tray/main.cpp

161 lines
4.4 KiB
C++
Raw Normal View History

2022-08-09 03:06:08 +00:00
// reading file
#include <iostream>
#include <fstream>
// trimming string
#include <algorithm>
#include <cctype>
#include <locale>
#include <stdlib.h>
// regex
#include <regex>
// gtk
#include <gtk/gtk.h>
static std::string logfilepath = "";
// trim from start (in place)
static inline void ltrim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) {
return !std::isspace(ch);
}));
}
// trim from end (in place)
static inline void rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) {
return !std::isspace(ch);
}).base(), s.end());
}
// trim from both ends (in place)
static inline void trim(std::string &s) {
ltrim(s);
rtrim(s);
}
// с++ read file to string
std::string readfile(std::string filepath) {
std::fstream f(filepath, std::fstream::in );
std::string s;
getline( f, s, '\0');
f.close();
return s;
}
// c++ regex example
std::string whereIsLogFile() {
std::string xl2tpd=readfile("/etc/xl2tpd/xl2tpd.conf");
if (xl2tpd!="") {
xl2tpd = std::regex_replace (xl2tpd, std::regex("(^|\n);[^\n]*(?=\n|$)"), "");
std::string options = "";
std::smatch match;
if (std::regex_search(xl2tpd, match, std::regex("(^|\n)pppoptfile\\s*=\\s*([^\n]+)(\n|$)")) && match.size() > 1) {
options=readfile(match.str(2));
if (options!="") {
options = std::regex_replace (options, std::regex("(^|\n)#[^\n]*(?=\n|$)"), "");
if (std::regex_search(options, match, std::regex("(^|\n)logfile\\s*([^\n]+)(\n|$)")) && match.size() > 1) {
return match.str(2);
}
}
}
}
return "/home/user/beeline.xl2tpd.log";
}
// c++ search string in file
int get_status_from_file() {
std::string s = readfile(logfilepath);
// split file by string
std::string delimiter = "Modem hangup";
// select last element of array
size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
s.erase(0, pos + delimiter.length());
}
trim(s);
if (s=="") {
return 0;
}
else {
delimiter = "status = 0x0";
token = "1";
while ((pos = s.find(delimiter)) != std::string::npos) {
token = "3";
s.erase(0, pos + delimiter.length());
}
trim(s);
if (s=="") {
return 2;
}
if (token == "1") {
return 1;
}
else {
return 3;
}
}
}
// c++ convert gchar std::string
const gchar* convertstring2gchar(std::string s) {
const gchar* x;
const char* cv = s.c_str();
x = (const gchar*) cv;
return x;
}
// с++ system tray icon
static gboolean updateIcon(gpointer data) {
GtkStatusIcon *icon = (GtkStatusIcon*)data;
int m = get_status_from_file();
std::string icon_name;
std::string icontext;
std::string icons_path = "/usr/share/xl2tpd-tray-icon/";
std::string ext = ".png";
switch (m) {
case 0: icon_name="offline"; icontext = "Internet offline"; break;
case 1: icon_name="connect"; icontext = "Trying to connect to internet"; break;
case 2: icon_name="online"; icontext = "Internet works"; break;
case 3: icon_name="disconnect"; icontext = "Disconnecting internet"; break;
}
gtk_status_icon_set_from_file (icon, convertstring2gchar(icons_path+icon_name + ext));
gtk_status_icon_set_tooltip (icon, convertstring2gchar(icontext));
return true;
}
static void trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popUpMenu) {
gtk_menu_popup(GTK_MENU(popUpMenu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time);
}
static void trayExit(GtkMenuItem *item, gpointer user_data) {
exit(0);
}
int main(int argc, char **argv) {
gtk_init(&argc,&argv);
GtkStatusIcon *icon = gtk_status_icon_new_from_file ("connect.png");
gtk_status_icon_set_visible(icon, 1);
gtk_status_icon_set_tooltip(icon, "Icon");
GtkWidget *menu, *menuItemView, *menuItemExit;
menu = gtk_menu_new();
menuItemExit = gtk_menu_item_new_with_label ("Exit");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemExit);
gtk_widget_show_all (menu);
g_signal_connect(GTK_STATUS_ICON (icon), "popup-menu", GTK_SIGNAL_FUNC (trayIconPopup), menu);
g_signal_connect (G_OBJECT (menuItemExit), "activate", G_CALLBACK (trayExit), NULL);
logfilepath = whereIsLogFile();
// redraw status icon every 2 seconds
g_timeout_add_seconds(2, updateIcon, icon);
gtk_main();
return 0;
}