# HG changeset patch # User Markus Bröker # Date 1229179518 -3600 # Node ID 826dd5531eb046f4749f322ab47e61bb83a4af5a svn copy of qmonitor diff --git a/PacketParser.cpp b/PacketParser.cpp new file mode 100644 --- /dev/null +++ b/PacketParser.cpp @@ -0,0 +1,179 @@ +/* + * $Id: PacketParser.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/PacketParser.cpp $ + */ + +#include +#include + +PacketParser::PacketParser (int tm) +:PacketReader (tm) +{ + protocol = IPPROTO_IP; + port = 0; +} + +PacketParser::PacketParser (std::string filename) +: PacketReader (filename) +{ + protocol = IPPROTO_IP; + port = 0; +} + +PacketParser::~PacketParser () +{ +} + +std::string PacketParser::getProtocol (int i) +{ + proto = getprotobynumber (i); + return ((proto != NULL) ? proto->p_name : "unknown"); +} + +std::string PacketParser::getPacket () +{ + if (port != 0) + if ((sport != port) && (dport != port)) + return ""; + + return str; +} + +void PacketParser::setPort (unsigned short p) +{ + port = p; +} + +void PacketParser::setProtocol (int proto) +{ + protocol = proto; +} + +std::string PacketParser::read () +{ + std::ostringstream s; + struct iphdr *iph; + struct tcphdr *tcph; + struct udphdr *udph; + + struct in_addr src; + struct in_addr dst; + + int size = 0; + + uint i; + + str = PacketReader::read (); + + iph = (struct iphdr *)(str.c_str () + sizeof (struct ethhdr)); + + switch (iph->protocol) { + case IPPROTO_TCP: + size = sizeof (tcphdr); + break; + case IPPROTO_UDP: + size = sizeof (udphdr); + break; + case IPPROTO_ICMP: + size = sizeof (icmphdr); + break; + case IPPROTO_IP: + size += (sizeof (ethhdr) + sizeof (iphdr)); + break; + default: + size += (sizeof (ethhdr) + sizeof (iphdr)); + } + + src.s_addr = (iph->saddr); + dst.s_addr = (iph->daddr); + + dhost = inet_ntoa (dst); + shost = inet_ntoa (src); + + s.str () = ""; + + if (protocol != iph->protocol) { + switch (protocol) { + case IPPROTO_IP: + /* + * filter the content later + */ + break; + + case IPPROTO_RAW: + for (i = size; i < str.length (); i++) { + if (!isgraph (str[i])) + s << "."; + else + s << str[i]; + } + return s.str (); + break; + default: + /* + * discard packet + */ + return s.str (); + } + } + + switch (iph->protocol) { + case IPPROTO_IP: + s << getProtocol (iph->protocol) << " " << std::setw (15) << shost << " ==> " << std::setw (15) << dhost; + break; + + case IPPROTO_ICMP: + s << getProtocol (iph->protocol) << " " << std::setw (15) << shost << " ==> " << std::setw (15) << dhost; + + break; + + case IPPROTO_TCP: + tcph = (struct tcphdr *)(str.c_str () + sizeof (struct ethhdr) + sizeof (struct iphdr)); + + sport = ntohs (tcph->source); + dport = ntohs (tcph->dest); + + s << getProtocol (iph->protocol) << " " + << std::setw (15) << shost << ":" << std::setw (5) << sport + << " ==> " << std::setw (15) << dhost << ":" << std::setw (5) << dport; + + if (tcph->urg) + s << (" urg "); + if (tcph->ack) { + s << (" ack ") << ntohl (tcph->ack_seq); + } + if (tcph->psh) + s << (" psh "); + if (tcph->rst) + s << (" rst "); + if (tcph->syn) { + s << (" syn ") << ntohl (tcph->seq); + } + if (tcph->fin) + s << (" fin "); + + break; + + case IPPROTO_UDP: + udph = (struct udphdr *)(str.c_str () + sizeof (struct ethhdr) + sizeof (struct iphdr)); + + sport = ntohs (udph->source); + dport = ntohs (udph->dest); + + s << getProtocol (iph->protocol) << " " + << std::setw (15) << shost << ":" << std::setw (5) << sport + << " ==> " << std::setw (15) << dhost << ":" << std::setw (5) << dport; + + break; + + default: + s << getProtocol (iph->protocol); + break; + } + + if (port != 0) + if ((sport != port) && (dport != port)) + s.str (""); + + return (s.str ()); +} diff --git a/PacketReader.cpp b/PacketReader.cpp new file mode 100644 --- /dev/null +++ b/PacketReader.cpp @@ -0,0 +1,63 @@ +/* + * $Id: PacketReader.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/PacketReader.cpp $ + */ + +#include + +PacketReader::PacketReader (int tm) +{ + timeout = tm; + + if ((p_socket = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL))) == -1) { + perror ("SocketException"); + throw std::runtime_error ("SocketException: root access required"); + } +} + +PacketReader::PacketReader (std::string filename) +{ + if ((p_socket = open (filename.c_str (), O_RDONLY)) == -1) { + throw std::runtime_error ("FileException"); + } + + timeout = -1; +} + +PacketReader::~PacketReader () +{ + close (p_socket); +} + +std::string PacketReader::read () +{ + static char s[IP_MAXPACKET + 1]; + int c; + + c =::read (p_socket, s, IP_MAXPACKET); + s[c] = 0; + return std::string (s, c); +} + +bool PacketReader::ready () +{ + if (p_socket) + return true; + + return false; +} + +bool PacketReader::dataAvailable () +{ + pollfd fdin; + int event = 1; + + fdin.fd = p_socket; + fdin.events = POLLIN; + fdin.revents = 0; + + if (poll (&fdin, event, timeout) > 0) + return true; + + return false; +} diff --git a/PacketWriter.cpp b/PacketWriter.cpp new file mode 100644 --- /dev/null +++ b/PacketWriter.cpp @@ -0,0 +1,48 @@ +/* + * $Id: PacketWriter.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/PacketWriter.cpp $ + */ + +#include + +extern "C" { +#include +#include +#include +#include +} PacketWriter::PacketWriter (char *hostname, int port) +{ + unsigned int size; + unsigned int fd; + struct hostent *host = gethostbyname (hostname); + + if (host == NULL) { + perror ("GETHOSTBYNAME"); + exit (0); + } + + ca.sin_family = PF_INET; + ca.sin_addr = *((struct in_addr *)host->h_addr_list[0]); + ca.sin_port = htons (port); + + size = sizeof (ca); + fd = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); + p_socket = connect (fd, (sockaddr *) & ca, size); +} + +PacketWriter::~PacketWriter () +{ + close (p_socket); +} + +void PacketWriter::write (char s[], int len) +{ + int c; + + c =::write (p_socket, s, len); +} + +bool PacketWriter::ready () +{ + return true; +} diff --git a/build b/build new file mode 100755 --- /dev/null +++ b/build @@ -0,0 +1,21 @@ +#!/bin/bash + +# This works for qmake version 4.x and fails for qmake version 3 ! +# + +rm -rf .moc .obj Makefile +find -name *~ -exec rm -f {} \; + +rm -f *.o +qmake-qt4 -project .ui +qmake-qt4 -makefile + +make all + +if [ ! -f /etc/gentoo-release ] +then + ./post-install; +else + echo "Skipping post-install, handled by ebuild"; +fi + diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,6 @@ +qmonitor for Debian +------------------- + + + + -- Markus Broeker Fri, 07 Mar 2008 00:36:15 +0100 diff --git a/debian/changelog b/debian/changelog new file mode 100644 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,6 @@ +qmonitor (0.10-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Markus Broeker Fri, 07 Mar 2008 00:36:15 +0100 + diff --git a/debian/compat b/debian/compat new file mode 100644 --- /dev/null +++ b/debian/compat @@ -0,0 +1,1 @@ +5 diff --git a/debian/control b/debian/control new file mode 100644 --- /dev/null +++ b/debian/control @@ -0,0 +1,12 @@ +Source: qmonitor +Section: net +Priority: extra +Maintainer: Markus Broeker +Build-Depends: debhelper (>= 5) +Standards-Version: 3.7.2 + +Package: qmonitor +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: qmonitor is a full featured network sniffer + qmonitor is a network sniffer written in qt diff --git a/debian/copyright b/debian/copyright new file mode 100644 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,24 @@ +This package was debianized by Markus Broeker on +Fri, 07 Mar 2008 00:36:15 +0100. + +It was downloaded from + +Upstream Author(s): + + + + +Copyright: + + + + +License: + + + +The Debian packaging is (C) 2008, Markus Broeker and +is licensed under the GPL, see `/usr/share/common-licenses/GPL'. + +# Please also look if there are files or directories which have a +# different copyright/license attached and list them here. diff --git a/debian/dirs b/debian/dirs new file mode 100644 --- /dev/null +++ b/debian/dirs @@ -0,0 +1,2 @@ +usr/share/icons +usr/share/pixmaps diff --git a/debian/rules b/debian/rules new file mode 100755 --- /dev/null +++ b/debian/rules @@ -0,0 +1,93 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + + + +configure: configure-stamp +configure-stamp: + dh_testdir + # Add here commands to configure the package. + + touch configure-stamp + + +build: build-stamp + +build-stamp: configure-stamp + dh_testdir + + # Add here commands to compile the package. + ./build + #docbook-to-man debian/qmonitor.sgml > qmonitor.1 + + touch $@ + +clean: + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + if [ -f Makefile ]; then $(MAKE) distclean; fi + rm -f qmonitor qmonitor-0.10.pro + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/qmonitor. + mv qmonitor-0 qmonitor + install -d debian/qmonitor/usr/sbin/ + install qmonitor debian/qmonitor/usr/sbin/ + ./post-install; + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs + dh_installdocs + dh_installexamples +# dh_install +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_python +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install configure diff --git a/images/icon.png b/images/icon.png new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dc313bc91d62d9771051782bf19d1f4fac0d141c GIT binary patch literal 214 zc%17D@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP`BdfTuUM}M@S)hzopr0BFQN Ang9R* diff --git a/images/sideBar.png b/images/sideBar.png new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..18d1764872ae89f5c35f9a9f22313b00239e74cc GIT binary patch literal 11300 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 +#include +#include +#include + +extern "C" { +#include +#include +#include +#include +#include +} + +class PacketParser : public PacketReader +{ + public: + PacketParser ( int tm=500 ); + PacketParser ( std::string ); + ~PacketParser (); + std::string read(); + std::string getPacket(); + void setPort(unsigned short); + void setProtocol(int); + std::string getProtocol(int); + + private: + std::string str; + int protocol; + unsigned short port; + + std::string shost; + std::string dhost; + unsigned short sport, dport; + struct protoent *proto; +}; + +#endif + diff --git a/include/PacketReader.h b/include/PacketReader.h new file mode 100644 --- /dev/null +++ b/include/PacketReader.h @@ -0,0 +1,37 @@ +/* + * $Id: PacketReader.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/PacketReader.h $ + */ + +#ifndef PacketReader_H +#define PacketReader_H + +#include +#include +#include + +extern "C" { + #include + #include + #include + #include + #include + #include + #include +}; + +class PacketReader { +protected: + int p_socket; + private: + int timeout; +public: + PacketReader ( int tm = 500 ); + PacketReader ( std::string ); + ~PacketReader(); + std::string read(); + bool ready(); + bool dataAvailable(); +}; + +#endif diff --git a/include/PacketWriter.h b/include/PacketWriter.h new file mode 100644 --- /dev/null +++ b/include/PacketWriter.h @@ -0,0 +1,28 @@ +/* + * $Id: PacketWriter.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/PacketWriter.h $ + */ + +#ifndef PACKETWRITER_H +#define PACKETWRITER_H 0x20053008 +#include + +#include +#include +#include +#include + +class PacketWriter : PacketReader { +private: + struct sockaddr_in ca; + +public: + PacketWriter(char *, int); + ~PacketWriter(); + + void write(char *s, int); + bool ready(); +}; + +#endif + diff --git a/include/monitor.h b/include/monitor.h new file mode 100644 --- /dev/null +++ b/include/monitor.h @@ -0,0 +1,38 @@ +/* + * $Id: monitor.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/monitor.h $ + */ + +#ifndef MONITOR_H +#define MONITOR_H + +#include +#include +#include "../ui_monitor.h" + +class readerThread; + +class Monitor : public QWidget, private Ui::qMonitor +{ + Q_OBJECT + + public: + Monitor(QWidget *parent = 0); + virtual ~Monitor(); + int getPort(); + int getProtocol(); + + protected: + virtual void customEvent( QEvent* ); + std::map Protocol; + + private: + readerThread *reader; + + public slots: + virtual void startCapture(); + virtual void stopCapture(); + +}; + +#endif diff --git a/include/readerthread.h b/include/readerthread.h new file mode 100644 --- /dev/null +++ b/include/readerthread.h @@ -0,0 +1,40 @@ +/* + * $Id: readerthread.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/readerthread.h $ + */ + +#ifndef READERTHREAD_H +#define READERTHREAD_H + +#include "monitor.h" +#include +#include +#include "PacketParser.h" + +#define MSG_EVENT 65432 + +class Monitor; + +class DataChangeEvent : public QEvent { + public: + DataChangeEvent(QString msg_) + : QEvent((QEvent::Type)MSG_EVENT) + { + msg = msg_; + + } + + QString Text() const { return msg; } + private: + QString msg; +}; + +class readerThread : public QThread { + public: + readerThread(Monitor*); + virtual void run(); + private: + Monitor *handle; +}; + +#endif diff --git a/include/tools.h b/include/tools.h new file mode 100644 --- /dev/null +++ b/include/tools.h @@ -0,0 +1,13 @@ +/* + * $Id: tools.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/tools.h $ + */ + +#ifndef TOOLS_H +#define TOOLS_H + +#include + +std::string itoa(const int& i); + +#endif diff --git a/include/version.h b/include/version.h new file mode 100644 --- /dev/null +++ b/include/version.h @@ -0,0 +1,11 @@ +/* + * $Id: version.h 2 2007-12-22 14:15:30Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/include/version.h $ + */ + +#ifndef VERSION_H +#define VERSION_H + +#define VERSION_STRING "qMonitor Revision 0.90" +#endif + diff --git a/main.cpp b/main.cpp new file mode 100644 --- /dev/null +++ b/main.cpp @@ -0,0 +1,41 @@ +/* + * $Id: main.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/main.cpp $ + */ + +#include + +#include "include/monitor.h" +#include + +int main (int argc, char *argv[]) +{ + int i; + + while ((i = getopt (argc, argv, "hv")) >= 0) { + switch (i) { + case 'h': + std::cout << "Usage: " << argv[0] << " [OPTIONS]" << std::endl; + std::cout << "qMonitor displays the online traffic." << std::endl << std::endl; + std::cout << "Options:" << std::endl << std::endl; + std::cout << "-h: \t\t\tShow this help" << std::endl; + std::cout << "-v: \t\t\tShow Version" << std::endl; + + exit (0); + break; + case 'v': + std::cout << VERSION_STRING << std::endl; + exit (0); + break; + + default: + ; + } + } + + QApplication app (argc, argv); + Monitor *dialog = new Monitor; + + dialog->show (); + return app.exec (); +} diff --git a/man/man1/qMonitor.1 b/man/man1/qMonitor.1 new file mode 100644 --- /dev/null +++ b/man/man1/qMonitor.1 @@ -0,0 +1,14 @@ +.\" qMonitor.1 +.TH qMonitor 1 "Feb. 2005" "Markus Broeker" +.SH Name +qMonitor \- Ein qt-basierender Netzwerkmonitor +.SH SYNTAX +qMonitor +.SH BESCHREIBUNG +.fi +Der auf qt-basierende Netzwerkmonitor \fBqMonitor\fR zeigt ihnen den +Traffic im Netz an. +.nf +.SH AUTOR +Markus Broker ( broeker.markus@freenet.de ) + diff --git a/monitor.cpp b/monitor.cpp new file mode 100644 --- /dev/null +++ b/monitor.cpp @@ -0,0 +1,104 @@ +/* + * $Id: monitor.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/monitor.cpp $ + */ + +#include "include/monitor.h" +#include "include/readerthread.h" + +#ifndef ICON_PATH +#define ICON_PATH "/usr/share/icons/qMonitor_icon.png" +#endif + +#define HTML_MESSAGE \ +"

qMonitor


" \ +"

" \ +"

  • Wählen Sie das Protokoll
  • " \ +"
  • Wählen Sie einen Port (0=ALLE)
  • " \ +"
  • Drücken Sie Start
  • " \ +"

    " \ +"
    Dieses Programm zeigt den Traffic im Netz an und unterstützt Sie bei täglichen Aufgaben:


    " \ +"
  • Kontrolle der TCP/UDP Verbindungen
  • " \ +"
  • Überwachung von textbasierten Serverdiensten
  • " \ +"
  • Protokollanalyse
  • " \ +"

    " + +Monitor::Monitor (QWidget * parent) +{ + setupUi ((QDialog *) this); + textEdit->setReadOnly (true); + + listWidget1->insertItem (0, "TCP"); + listWidget1->insertItem (1, "UDP"); + listWidget1->insertItem (2, "ICMP"); + listWidget1->insertItem (3, "RAW"); + listWidget1->insertItem (4, "IP"); + + Protocol["TCP"] = IPPROTO_TCP; + Protocol["UDP"] = IPPROTO_UDP; + Protocol["ICMP"] = IPPROTO_ICMP; + Protocol["RAW"] = IPPROTO_RAW; + Protocol["IP"] = IPPROTO_IP; + + listWidget1->setCurrentRow (0); + lineEdit1->setText ("0"); + + setWindowIcon (QPixmap (ICON_PATH)); + + textEdit->insertHtml (HTML_MESSAGE); + + try { + reader = new readerThread (this); + } + catch (std::exception const &e) { + textEdit->append (e.what ()); + reader = NULL; + } + + connect (pushButton1, SIGNAL (clicked ()), this, SLOT (startCapture ())); + connect (pushButton2, SIGNAL (clicked ()), this, SLOT (stopCapture ())); + +} + +Monitor::~Monitor () +{ + if (reader != NULL) + delete reader; +} + +void Monitor::startCapture () +{ + textEdit->clear (); + + if (reader != NULL) { + if (!reader->isRunning ()) + reader->start (QThread::NormalPriority); + } +} + +void Monitor::stopCapture () +{ + if (reader != NULL) { + if (reader->isRunning ()) + reader->terminate (); + } +} + +int Monitor::getProtocol () +{ + return Protocol[listWidget1->item (listWidget1->currentRow ())->text ()]; +} + +int Monitor::getPort () +{ + return lineEdit1->text ().toInt (); +} + +void Monitor::customEvent (QEvent * e) +{ + if (e->type () == MSG_EVENT) { + DataChangeEvent *me = (DataChangeEvent *) e; + + textEdit->append (me->Text ()); + } +} diff --git a/post-install b/post-install new file mode 100755 --- /dev/null +++ b/post-install @@ -0,0 +1,45 @@ +#!/bin/bash + +PDIRECTORY=/usr/share/pixmaps +IDIRECTORY=/usr/share/icons + +FILE=qMonitor_sideBar.png +ICON=qMonitor_icon.png + +echo -n "Checking, whether ${PDIRECTORY} exists... [ " +if [ ! -d ${PDIRECTORY} ] +then + install -d ${PDIRECTORY}; + echo "creating ]"; +else + echo "yes ]"; +fi + +echo -n "Checking, whether ${PDIRECTORY}/${FILE} exists... [ " +if [ ! -r ${PDIRECTORY}/${FILE} ] +then + install -m 644 images/sideBar.png \ + ${PDIRECTORY}/${FILE}; + echo "installing ]" + else + echo "yes ]"; +fi + +echo -n "Checking, whether ${IDIRECTORY} exists... [ " +if [ ! -d ${IDIRECTORY} ] +then + install -d ${IDIRECTORY}; + echo "creating ]"; +else + echo "yes ]"; +fi + +echo -n "Checking, whether ${IDIRECTORY}/${ICON} exists... [ " +if [ ! -r ${IDIRECTORY}/${ICON} ] +then + install -m 644 images/icon.png \ + ${IDIRECTORY}/${ICON}; + echo "installing ]" + else + echo "yes ]"; +fi diff --git a/readerthread.cpp b/readerthread.cpp new file mode 100644 --- /dev/null +++ b/readerthread.cpp @@ -0,0 +1,41 @@ +/* + * $Id: readerthread.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/readerthread.cpp $ + */ + +#include "include/readerthread.h" +#include + +readerThread::readerThread (Monitor * parent) +{ + handle = parent; +} + +void readerThread::run () +{ + std::string s; + DataChangeEvent *dce; + + try { + PacketParser reader (-1); + + for (;;) { + while (reader.dataAvailable ()) { + reader.setProtocol (handle->getProtocol ()); + reader.setPort (handle->getPort ()); + + s = reader.read (); + + if (s != "") { + dce = new DataChangeEvent (s.c_str ()); + QApplication::postEvent ((QObject *) handle, (QEvent *) dce); + } + } + } + } + catch (std::exception const &e) { + dce = new DataChangeEvent (e.what ()); + QApplication::postEvent ((QObject *) handle, (QEvent *) dce); + std::cerr << e.what () << std::endl; + } +} diff --git a/tools.cpp b/tools.cpp new file mode 100644 --- /dev/null +++ b/tools.cpp @@ -0,0 +1,15 @@ +/* + * $Id: tools.cpp 54 2008-01-10 00:24:52Z mbroeker $ + * $URL: http://localhost/svn/cpp/qMonitor/trunk/tools.cpp $ + */ + +#include + +std::string itoa (const int &i) +{ + std::stringstream o; + + if (!(o << i)) + return "ERROR"; + return o.str (); +}