📄 myview.cpp
字号:
#include <klocale.h>#include <kprocess.h>#include <kstandarddirs.h>#include <kmessagebox.h>#include "myview.h"#include <qpushbutton.h>#include <qlayout.h>#include <qvariant.h>#include <qtooltip.h>#include <qwhatsthis.h>#include <qpixmap.h>#include <qpainter.h>#include <qlabel.h>#include <qvbox.h>#include <qfile.h>#include <netinet/in.h>#include <arpa/inet.h>#include <time.h>bool ALREADY_WARNED=false;intget_range_info (int skfd, const char *ifname, iwrange * range){ struct iwreq wrq; char buffer[sizeof (iwrange) * 2]; /* Large enough */ memset (buffer, 0, sizeof (range)); strncpy (wrq.ifr_name, ifname, IFNAMSIZ); wrq.u.data.pointer = (caddr_t) buffer; wrq.u.data.length = 0; wrq.u.data.flags = 0; if (ioctl (skfd, SIOCGIWRANGE, &wrq) < 0) return (-1); memcpy ((char *) range, buffer, sizeof (iwrange)); if ((WIRELESS_EXT > 10) && (wrq.u.data.length >= 300)) {#if WIRELESS_EXT > 10 if ((range->we_version_compiled != WIRELESS_EXT)&&(!ALREADY_WARNED)) { fprintf (stderr, "Warning : Device %s has been compiled with version %d\n", ifname, range->we_version_compiled); fprintf (stderr, "of Wireless Extension, while we are using version %d.\n", WIRELESS_EXT); fprintf (stderr, "Some things may be broken...\n\n"); ALREADY_WARNED=true; }#endif /* WIRELESS_EXT > 10 */ } else { if ((wrq.u.data.length != sizeof (iwrange))&&(!ALREADY_WARNED)) { fprintf (stderr, "Warning : Device %s has been compiled with a different version\n", ifname); fprintf (stderr, "of Wireless Extension than ours (we are using version %d).\n", WIRELESS_EXT); fprintf (stderr, "Some things may be broken...\n\n"); ALREADY_WARNED=true; } } return (0);}intiw_getstats (const char *ifname, iwstats * stats){ FILE *f = fopen ("/proc/net/wireless", "r"); char buf[256]; char *bp; int t; if (f == NULL) return -1; /* Loop on all devices */ while (fgets (buf, 255, f)) { bp = buf; while (*bp && isspace (*bp)) bp++; /* Is it the good device ? */ if (strncmp (bp, ifname, strlen (ifname)) == 0 && bp[strlen (ifname)] == ':') { /* Skip ethX: */ bp = strchr (bp, ':'); bp++; /* -- status -- */ bp = strtok (bp, " "); sscanf (bp, "%X", &t); stats->status = (unsigned short) t; /* -- link quality -- */ bp = strtok (NULL, " "); if (strchr (bp, '.') != NULL) stats->qual.updated |= 1; sscanf (bp, "%d", &t); stats->qual.qual = (unsigned char) t; /* -- signal level -- */ bp = strtok (NULL, " "); if (strchr (bp, '.') != NULL) stats->qual.updated |= 2; sscanf (bp, "%d", &t); stats->qual.level = (unsigned char) t; /* -- noise level -- */ bp = strtok (NULL, " "); if (strchr (bp, '.') != NULL) stats->qual.updated += 4; sscanf (bp, "%d", &t); stats->qual.noise = (unsigned char) t; /* -- discarded packets -- */ bp = strtok (NULL, " "); sscanf (bp, "%d", &stats->discard.nwid); bp = strtok (NULL, " "); sscanf (bp, "%d", &stats->discard.code); bp = strtok (NULL, " "); sscanf (bp, "%d", &stats->discard.misc); fclose (f); return 0; } } fclose (f); return -1;}intget_info (int skfd, const char *ifname, struct wireless_info *info){ struct iwreq wrq; memset ((char *) info, 0, sizeof (struct wireless_info)); /* Get wireless name */ strncpy (wrq.ifr_name, ifname, IFNAMSIZ); if (ioctl (skfd, SIOCGIWNAME, &wrq) < 0) /* If no wireless name : no wireless extensions */ return (-1); else strcpy (info->name, wrq.u.name); /* Get frequency / channel */ strncpy (wrq.ifr_name, ifname, IFNAMSIZ); if (ioctl (skfd, SIOCGIWFREQ, &wrq) >= 0) { info->has_freq = 1; } /* Get operation mode */ strncpy (wrq.ifr_name, ifname, IFNAMSIZ); if (ioctl (skfd, SIOCGIWMODE, &wrq) >= 0) { if (wrq.u.mode < 6) info->has_mode = 1; info->mode = wrq.u.mode; } /* get range info */ if (get_range_info (skfd, ifname, &(info->range)) >= 0) info->has_range = 1; /* get network name */ strncpy (wrq.ifr_name, ifname, IFNAMSIZ); wrq.u.essid.pointer = (caddr_t) info->essid; wrq.u.essid.length = 0; wrq.u.essid.flags = 0; if (ioctl (skfd, SIOCGIWESSID, &wrq) >= 0) { info->has_essid = 1; info->essid_on = wrq.u.data.flags; }; return 0;};myview::myview (int socketnumber, bool allow1, bool allow2, bool allow3, QWidget * parent, const char *name, WFlags fl):QWidget (parent, name, fl){ if (!name) setName ("KWiFiManager Kicker Applet"); resize (178, 48); socket = socketnumber; KStandardDirs finder; kdedir = finder.findResourceDir ("data", "kwifimanager/pics/no_card.png"); kdedir += "kwifimanager/pics/"; setMaximumSize (QSize (32767, 48)); setMinimumSize (QSize (16, 16)); setSizePolicy (QSizePolicy ((QSizePolicy::SizeType) 5, (QSizePolicy::SizeType) 5, sizePolicy ().hasHeightForWidth ())); setCaption (i18n ("Status Bar")); infocontainer = new wireless_info; infocontainer2 = new iwstats; standardfarbe = backgroundColor (); blink = false; zeit = 0; allow_flash_low = allow1; allow_flash_crit = allow2; allow_flash_dropped = allow3; offline = new QPixmap (kdedir + "offline.png"); excellent = new QPixmap (kdedir + "excellent.png"); good = new QPixmap (kdedir + "good.png"); marginal = new QPixmap (kdedir + "marginal.png"); oor_down = new QPixmap (kdedir + "oor_down.png"); oor_minimum = new QPixmap (kdedir + "oor_minimum.png");}voidmyview::paintEvent (QPaintEvent *){ QFile procnetdev ("/proc/net/dev"); procnetdev.open (IO_ReadOnly); QStringList liste; QString temp = ""; QString temptrash = "X"; int end = 1; while ((end != 0) && (temp != temptrash)) { end = procnetdev.readLine (temp, 9999); temptrash = temp; temp.truncate (temp.find (":") > 0 ? temp.find (":") : 0); temp = temp.stripWhiteSpace (); if ((end != 0) && (temp != "")) liste += temp; }; for (QStringList::Iterator it = liste.begin (); it != liste.end (); ++it) { if (get_info (socket, *it, infocontainer) != -1) { iw_getstats (*it, infocontainer2); interfc = *it; break; }; interfc = ""; }; int tempstrength = infocontainer2->qual.qual; if ((infocontainer->mode==2) && (infocontainer->has_range==1) && (infocontainer->range.max_qual.qual!=0)) tempstrength = (int) tempstrength *92 / (int) infocontainer->range.max_qual.qual; QPainter *strengthpainter = new QPainter (this); if (infocontainer->has_freq == 0) { strengthpainter->drawPixmap (0, 0, *offline); if (blink) { setBackgroundColor (standardfarbe); blink=false;}; } else if (infocontainer->mode == 1) { strengthpainter->drawPixmap (0, 0, *offline); if (blink) { setBackgroundColor (standardfarbe); blink=false;}; } else if (tempstrength > 25) { strengthpainter->drawPixmap (0, 0, *excellent); if (blink) { setBackgroundColor (standardfarbe); blink=false;}; } else if (tempstrength > 15) { strengthpainter->drawPixmap (0, 0, *good); if (blink) { setBackgroundColor (standardfarbe); blink=false;}; } else if (tempstrength > 5) { if ((zeit!=time(0)) && (blink)) { setBackgroundColor (standardfarbe); zeit=time(0); blink = false; } else if ((zeit!=time(0)) && (allow_flash_low)) { setBackgroundColor (QColor (255, 255, 0)); zeit=time(0); blink = true; }; strengthpainter->drawPixmap (0, 0, *marginal); } else if (tempstrength > 0) { if ((zeit!=time(0)) && (blink)) { setBackgroundColor (standardfarbe); zeit=time(0); blink = false; } else if ((zeit!=time(0)) && (allow_flash_crit)) { setBackgroundColor (QColor (255, 128, 0)); zeit=time(0); blink = true; }; strengthpainter->drawPixmap (0, 0, *oor_minimum); } else if ((tempstrength == 0) && (infocontainer->mode == 2)) { if ((zeit!=time(0)) && (blink)) { setPaletteBackgroundColor (standardfarbe); zeit=time(0); blink = false; } else if ((zeit!=time(0)) && (allow_flash_dropped)) { setPaletteBackgroundColor (QColor (255, 0, 0)); blink = true; }; strengthpainter->drawPixmap (0, 0, *oor_down); } else { strengthpainter->drawPixmap (0, 0, *offline); if (blink) { setBackgroundColor (standardfarbe); blink=false; }; }; QString sstrength2 = "%1"; if (infocontainer->has_freq == 1) { if (infocontainer->mode == 2) { sstrength2 = sstrength2.arg (tempstrength); } else sstrength2 = sstrength2.arg (i18n ("N/A")); } else sstrength2 = sstrength2.arg (i18n ("N/A")); strengthpainter->drawText (0, 38, sstrength2); delete strengthpainter;}voidmyview::mousePressEvent (QMouseEvent *aktion){ if (aktion->button()==QMouseEvent::LeftButton) { KProcess launch; launch << "kwifimanager"; launch.start (KProcess::DontCare); };}voidmyview::enterEvent (QEvent *){ QString IP = "Local IP: %1"; QString NET = "Network : %1"; struct sockaddr *sa; struct sockaddr_in *sin; struct ifreq ifr; strncpy (ifr.ifr_name, interfc.latin1 (), IFNAMSIZ); if (ioctl (socket, SIOCGIFADDR, &ifr) == -1) { IP = IP.arg (i18n ("unavailable")); } else { sa = (struct sockaddr *) &(ifr.ifr_addr); if (sa->sa_family == AF_INET) { sin = (struct sockaddr_in *) sa; IP = IP.arg ((QString) inet_ntoa (sin->sin_addr)); } else { IP = IP.arg (i18n ("unavailable")); }; }; NET = NET.arg (infocontainer->essid); QToolTip::add (this, IP + "\n" + NET);}/* * Destroys the object and frees any allocated resources */myview::~myview (){ delete offline; delete excellent; delete good; delete marginal; delete oor_down; delete oor_minimum; // no need to delete child widgets, Qt does it all for us}#include "myview.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -