author | sandman <sandman> | 2002-06-27 12:56:22 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-06-27 12:56:22 (UTC) |
commit | 56d22ac17fdc194a20fd0deba673943f85e940ea (patch) (side-by-side diff) | |
tree | 564c333bfa77e1dbae9a553e2c208eecefdeea1e | |
parent | 88b644d1c106008fc15f6a3c496e40296e9029d4 (diff) | |
download | opie-56d22ac17fdc194a20fd0deba673943f85e940ea.zip opie-56d22ac17fdc194a20fd0deba673943f85e940ea.tar.gz opie-56d22ac17fdc194a20fd0deba673943f85e940ea.tar.bz2 |
Fix an endless loop error when device is lost.
-rw-r--r-- | core/applets/irdaapplet/irda.cpp | 376 | ||||
-rw-r--r-- | core/applets/irdaapplet/irda.h | 73 |
2 files changed, 197 insertions, 252 deletions
diff --git a/core/applets/irdaapplet/irda.cpp b/core/applets/irdaapplet/irda.cpp index 42bed5e..c3ddff2 100644 --- a/core/applets/irdaapplet/irda.cpp +++ b/core/applets/irdaapplet/irda.cpp @@ -1,7 +1,7 @@ /********************************************************************** ** Copyright (C) 2002 David Woodhouse <dwmw2@infradead.org> -** Heavily based on volumeapplet, (C) 2002 L.J. Potter ljp@llornkcor.com -** All rights reserved. +** Max Reiss <harlekin@handhelds.org> [trivial stuff] +** Robert Griebl <sandman@handhelds.org> ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software @@ -13,132 +13,122 @@ ** **********************************************************************/ -#include "irda.h" -#include <qapplication.h> -#include <stdlib.h> - - -#include <qpe/resource.h> #include <qpe/qpeapplication.h> -#include <qpe/timestring.h> #include <qpe/resource.h> -#include <qpe/config.h> -#include <qpe/applnk.h> -#include <qpe/config.h> #include <qpe/ir.h> #include <qpe/qcopenvelope_qws.h> +#include <qpe/sound.h> -#include <qdir.h> -#include <qfileinfo.h> -#include <qpoint.h> -#include <qpushbutton.h> #include <qpainter.h> -#include <qcombobox.h> -#include <qspinbox.h> -#include <qslider.h> -#include <qlayout.h> -#include <qframe.h> -#include <qpixmap.h> -#include <qstring.h> #include <qfile.h> #include <qtimer.h> #include <qtextstream.h> #include <qpopupmenu.h> -#include <qsound.h> +#include <unistd.h> #include <net/if.h> #include <netinet/in.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> +#include "irda.h" //=========================================================================== IrdaApplet::IrdaApplet( QWidget *parent, const char *name ) - : QWidget( parent, name ) { - setFixedHeight( 14 ); + : QWidget ( parent, name ) +{ + setFixedHeight ( 18 ); setFixedWidth( 14 ); - sockfd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); - irdaOnPixmap = Resource::loadPixmap( "irdaapplet/irdaon" ); - irdaOffPixmap = Resource::loadPixmap( "irdaapplet/irdaoff" ); - irdaDiscoveryOnPixmap = Resource::loadPixmap( "irdaapplet/magglass" ); - receiveActivePixmap = Resource::loadPixmap("irdaapplet/receive"); - receiveActive = false; - popupMenu = 0; - devicesAvailable.setAutoDelete(TRUE); + + m_sockfd = ::socket ( PF_INET, SOCK_DGRAM, IPPROTO_IP ); + + m_irdaOnPixmap = Resource::loadPixmap( "irdaapplet/irdaon" ); + m_irdaOffPixmap = Resource::loadPixmap( "irdaapplet/irdaoff" ); + m_irdaDiscoveryOnPixmap = Resource::loadPixmap( "irdaapplet/magglass" ); + m_receiveActivePixmap = Resource::loadPixmap( "irdaapplet/receive" ); + + m_irda_active = false; + m_irda_discovery_active = false; + m_receive_active = false; + m_receive_state_changed = false; + m_popup = 0; } -void IrdaApplet::show() { +void IrdaApplet::show() +{ QWidget::show(); startTimer(2000); } -IrdaApplet::~IrdaApplet() { - close(sockfd); - if( popupMenu ) { delete popupMenu; } +IrdaApplet::~IrdaApplet() +{ + if ( m_sockfd >= 0 ) + ::close ( m_sockfd ); } -void IrdaApplet::popup(QString message, QString icon="") { - if ( ! popupMenu ) { - popupMenu = new QPopupMenu(); - } - popupMenu->clear(); - if( icon == "" ) { - popupMenu->insertItem( message, 0 ); - } else { - popupMenu->insertItem( QIconSet ( Resource::loadPixmap ( icon )), - message, 0 ); - } +void IrdaApplet::popup ( QString message, QString icon ) +{ + if ( !m_popup ) + m_popup = new QPopupMenu ( this ); + + m_popup-> clear ( ); + + if ( icon. isEmpty ( )) + m_popup-> insertItem ( message, 0 ); + else + m_popup-> insertItem ( QIconSet ( Resource::loadPixmap ( icon )), message, 0 ); QPoint p = mapToGlobal ( QPoint ( 0, 0 )); - QSize s = popupMenu->sizeHint ( ); - popupMenu->popup( QPoint ( - p. x ( ) + ( width ( ) / 2 ) - ( s. width ( ) / 2 ), - p. y ( ) - s. height ( ) ), 0); + QSize s = m_popup-> sizeHint ( ); + m_popup-> popup ( QPoint ( p. x ( ) + ( width ( ) / 2 ) - ( s. width ( ) / 2 ), + p. y ( ) - s. height ( ))); QTimer::singleShot( 2000, this, SLOT(popupTimeout()) ); } -void IrdaApplet::popupTimeout() { - popupMenu->hide(); +void IrdaApplet::popupTimeout ( ) +{ + m_popup-> hide ( ); } -int IrdaApplet::checkIrdaStatus() { +bool IrdaApplet::checkIrdaStatus ( ) +{ struct ifreq ifr; - strcpy(ifr.ifr_name, "irda0"); - if (ioctl(sockfd, SIOCGIFFLAGS, &ifr)) - return -1; + if ( ::ioctl ( m_sockfd, SIOCGIFFLAGS, &ifr ) < 0 ) + return false; - return (ifr.ifr_flags & IFF_UP)?1:0; + return ( ifr. ifr_flags & IFF_UP ); } -int IrdaApplet::setIrdaStatus(int c) { +bool IrdaApplet::setIrdaStatus ( bool b ) +{ struct ifreq ifr; - strcpy(ifr.ifr_name, "irda0"); - if (ioctl(sockfd, SIOCGIFFLAGS, &ifr)) - return -1; + if ( ::ioctl ( m_sockfd, SIOCGIFFLAGS, &ifr ) < 0 ) + return false; - if (c) { + if ( b ) { ifr.ifr_flags |= IFF_UP; - } else { + } + else { setIrdaDiscoveryStatus(0); setIrdaReceiveStatus(0); ifr.ifr_flags &= ~IFF_UP; } - if (ioctl(sockfd, SIOCSIFFLAGS, &ifr)) - return -1; + if ( ::ioctl ( m_sockfd, SIOCSIFFLAGS, &ifr ) < 0 ) + return false; - return 0; + return true; } -int IrdaApplet::checkIrdaDiscoveryStatus() { - +bool IrdaApplet::checkIrdaDiscoveryStatus ( ) +{ QFile discovery("/proc/sys/net/irda/discovery"); QString streamIn = "0"; @@ -148,222 +138,176 @@ int IrdaApplet::checkIrdaDiscoveryStatus() { streamIn = stream.read(); } - discovery.close(); - - return( streamIn.toInt() ); + return streamIn. toInt ( ) > 0; } -int IrdaApplet::setIrdaDiscoveryStatus(int d) { +bool IrdaApplet::setIrdaDiscoveryStatus ( bool d ) +{ QFile discovery("/proc/sys/net/irda/discovery"); - discovery.open( IO_WriteOnly|IO_Raw ); + if ( discovery. open ( IO_WriteOnly | IO_Raw )) { + discovery.putch ( d ? '1' : '0' ); + return true; + } + return false; +} - if (d) - discovery.putch('1'); - else - discovery.putch('0'); - discovery.close(); +bool IrdaApplet::setIrdaReceiveStatus ( bool d ) +{ + QCopEnvelope e ( "QPE/Obex", "receive(int)" ); + e << ( d ? 1 : 0 ); - return 0; -} + m_receive_active = d; + m_receive_state_changed = true; -int IrdaApplet::setIrdaReceiveStatus(int d) { - if(d) { - qWarning("Enable receive" ); - QCopEnvelope e("QPE/Obex", "receive(int)" ); - e << 1; - receiveActive = true; - receiveStateChanged = true; - } else { - qWarning("Disable receive" ); - QCopEnvelope e("QPE/Obex", "receive(int)" ); - e << 0; - receiveActive = false; - receiveStateChanged = true; - } - return 0; + return true; } -void IrdaApplet::showDiscovered() { + +void IrdaApplet::showDiscovered ( ) +{ + static Sound snd_found ( "irdaapplet/irdaon" ); + static Sound snd_lost ( "irdaapplet/irdaoff" ); + QFile discovery("/proc/net/irda/discovery"); if (discovery.open(IO_ReadOnly) ) { - int qcopsend = FALSE; + bool qcopsend = false; QString discoveredDevice; QString deviceAddr; - QStringList list; + // since it is /proc we _must_ use QTextStream - QTextStream stream ( &discovery); - QString streamIn; - streamIn = stream.read(); - list = QStringList::split("\n", streamIn); - - QDictIterator<QString> it( devicesAvailable ); - while ( it.current() ) { - devicesAvailable.replace( it.currentKey(), new QString("+++" + *devicesAvailable[it.currentKey()]) ); - //qDebug("IrdaMon: " + it.currentKey()); - //qDebug(" =" + *devicesAvailable[it.currentKey()] ); - ++it; - } + QStringList list = QStringList::split ( "\n", QTextStream ( &discovery ). read ( )); + + QMap <QString, QString>::Iterator it; + + for ( it = m_devices. begin ( ); it != m_devices. end ( ); ++it ) + it. data ( ). prepend ( "+++" ); + + for ( QStringList::Iterator lit = list. begin ( ); lit != list. end ( ); ++lit ) { + const QString &line = *lit; - for(QStringList::Iterator line=list.begin(); line!=list.end(); line++) { - // qDebug( (*line) ); - if( (*line).startsWith("nickname:") ){ - discoveredDevice = (*line).mid(((*line).find(':'))+2,(*line).find(',')-(*line).find(':')-2); - deviceAddr = (*line).mid( (*line).find( "daddr:" )+9, 8 ); + if ( line. startsWith ( "nickname:" )) { + discoveredDevice = line. mid ( line. find ( ':' ) + 2, line. find ( ',' ) - line. find ( ':' ) - 2 ); + deviceAddr = line. mid ( line. find ( "daddr:" ) + 9, 8 ); // qDebug(discoveredDevice + "(" + deviceAddr + ")"); - if( ! devicesAvailable.find(deviceAddr) ) { + if ( !m_devices. contains ( deviceAddr )) { popup( tr("Found:") + " " + discoveredDevice ); - QSound::play(Resource::findSound("irdaapplet/irdaon")); - qcopsend = TRUE; + snd_found. play ( ); + qcopsend = true; } - devicesAvailable.replace( deviceAddr, new QString(discoveredDevice) ); - // qDebug("IrdaMon: " + deviceAddr + "=" + *devicesAvailable[deviceAddr] ); + m_devices. replace ( deviceAddr, discoveredDevice ); } } - it.toFirst(); - while ( it.current() ) { + for ( it = m_devices. begin ( ); it != m_devices. end ( ); ) { // qDebug("IrdaMon: delete " + it.currentKey() + "=" + *devicesAvailable[it.currentKey()] + "?"); - if ( (*it.current()).left(3) == "+++" ) { - popup( tr("Lost:") + " " + (*devicesAvailable[it.currentKey()]).mid(3) ); - QSound::play(Resource::findSound("irdaapplet/irdaoff")); - devicesAvailable.remove( it.currentKey() ); - // qDebug("IrdaMon: delete " + it.currentKey() + "!"); - qcopsend = TRUE; + + if ( it. data ( ). left ( 3 ) == "+++" ) { + popup ( tr( "Lost:" ) + " " + it. data ( ). mid ( 3 )); + snd_lost. play ( ); + + QMap <QString, QString>::Iterator tmp = it; + tmp++; + m_devices. remove ( it ); // in contrast to QValueListIterator this remove doesn't return the next Iterator + it = tmp; + + qcopsend = true; } - ++it; + else + it++; } - /* XXX if( qcopsend ) { + // XXX if( qcopsend ) { QCopEnvelope e("QPE/Network", "irdaSend(bool)" ); - e << (devicesAvailable.count() > 0) ; - } */ + e << ( m_devices. count ( ) > 0 ); + // } } } -void IrdaApplet::mousePressEvent( QMouseEvent *) { - QPopupMenu *menu = new QPopupMenu(); +void IrdaApplet::mousePressEvent ( QMouseEvent * ) +{ + QPopupMenu *menu = new QPopupMenu ( this ); QString cmd; - int ret=0; /* Refresh active state */ - timerEvent(NULL); + timerEvent ( 0 ); // menu->insertItem( tr("More..."), 4 ); - if (irdaactive && devicesAvailable.count() > 0) { + if ( m_irda_active && !m_devices. isEmpty ( )) { menu->insertItem( tr("Discovered Device:"), 9); - QDictIterator<QString> it( devicesAvailable ); - while ( it.current() ) { - menu->insertItem( *devicesAvailable[it.currentKey()]); - ++it; - } - menu->insertSeparator(); - } - if (irdaactive) { - menu->insertItem( tr("Disable IrDA"), 0 ); - } else { - menu->insertItem( tr("Enable IrDA"), 1 ); - } + for ( QMap<QString, QString>::Iterator it = m_devices. begin ( ); it != m_devices. end ( ); ++it ) + menu-> insertItem ( *it ); - if (irdaactive) { - if (irdaDiscoveryActive) { - menu->insertItem( tr("Disable Discovery"), 2 ); - } else { - menu->insertItem( tr("Enable Discovery"), 3 ); + menu-> insertSeparator ( ); } - if( receiveActive ){ - menu->insertItem( tr("Disable Receive"), 4 ); - } else { - menu->insertItem( tr("Enable Receive"), 5 ); - } + menu-> insertItem ( m_irda_active ? tr( "Disable IrDA" ) : tr( "Enable IrDA" ), 0 ); + + if ( m_irda_active ) { + menu-> insertItem ( m_irda_discovery_active ? tr( "Disable Discovery" ) : tr( "Enable Discovery" ), 1 ); + menu-> insertItem ( m_receive_active ? tr( "Disable Receive" ) : tr( "Enable Receive" ), 2 ); } QPoint p = mapToGlobal ( QPoint ( 0, 0 )); QSize s = menu-> sizeHint ( ); - ret = menu->exec( QPoint ( - p. x ( ) + ( width ( ) / 2 ) - ( s. width ( ) / 2 ), - p. y ( ) - s. height ( ) ), 0); - // qDebug("ret was %d\n", ret); + p = QPoint ( p. x ( ) + ( width ( ) / 2 ) - ( s. width ( ) / 2 ), p. y ( ) - s. height ( )); - switch(ret) { + switch ( menu-> exec ( p )) { case 0: - setIrdaStatus(0); - timerEvent(NULL); + setIrdaStatus ( !m_irda_active ); + timerEvent ( 0 ); break; case 1: - setIrdaStatus(1); - timerEvent(NULL); + setIrdaDiscoveryStatus ( !m_irda_discovery_active ); + timerEvent ( 0 ); break; case 2: - setIrdaDiscoveryStatus(0); - timerEvent(NULL); + setIrdaReceiveStatus ( !m_receive_active ); + timerEvent( 0 ); break; - case 3: - setIrdaDiscoveryStatus(1); - timerEvent(NULL); // NULL is undefined in c++ use 0 or 0l - break; - case 4: { // enable receive - setIrdaReceiveStatus(0); - timerEvent(NULL); - break; - } - case 5: { // disable receive - setIrdaReceiveStatus(1); - timerEvent(NULL); - break; - } } - delete menu; // Can somebody explain why use a QPopupMenu* and not QPopupMenu nor QAction. with out delete we will leak cause QPopupMenu doesn't have a parent in this case + + delete menu; } -void IrdaApplet::timerEvent( QTimerEvent * ) { - int oldactive = irdaactive; - int olddiscovery = irdaDiscoveryActive; +void IrdaApplet::timerEvent ( QTimerEvent * ) +{ + bool oldactive = m_irda_active; + bool olddiscovery = m_irda_discovery_active; bool receiveUpdate = false; - if (receiveStateChanged) { + if ( m_receive_state_changed ) { receiveUpdate = true; - receiveStateChanged = false; + m_receive_state_changed = false; } - irdaactive = checkIrdaStatus(); - irdaDiscoveryActive = checkIrdaDiscoveryStatus(); - + m_irda_active = checkIrdaStatus ( ); + m_irda_discovery_active = checkIrdaDiscoveryStatus ( ); - if (irdaDiscoveryActive) { + if ( m_irda_discovery_active ) showDiscovered(); - } - - if ((irdaactive != oldactive) || (irdaDiscoveryActive != olddiscovery) || receiveUpdate ) { - paintEvent(NULL); - } + if (( m_irda_active != oldactive ) || ( m_irda_discovery_active != olddiscovery ) || receiveUpdate ) + update ( ); } -void IrdaApplet::paintEvent( QPaintEvent* ) { +void IrdaApplet::paintEvent ( QPaintEvent * ) +{ QPainter p(this); - // qDebug("paint irda pixmap"); - p.eraseRect ( 0, 0, this->width(), this->height() ); - if (irdaactive > 0) { - p.drawPixmap( 0, 0, irdaOnPixmap ); - } else { - p.drawPixmap( 0, 0, irdaOffPixmap ); - } + p. drawPixmap ( 0, 1, m_irda_active ? m_irdaOnPixmap : m_irdaOffPixmap ); - if (irdaDiscoveryActive > 0) { - p.drawPixmap( 0, 0, irdaDiscoveryOnPixmap ); - } - if (receiveActive) { - p.drawPixmap( 0, 0, receiveActivePixmap); - } + if ( m_irda_discovery_active ) + p. drawPixmap( 0, 1, m_irdaDiscoveryOnPixmap ); + + if ( m_receive_active ) + p. drawPixmap( 0, 1, m_receiveActivePixmap ); } diff --git a/core/applets/irdaapplet/irda.h b/core/applets/irdaapplet/irda.h index e878946..1b5faa6 100644 --- a/core/applets/irdaapplet/irda.h +++ b/core/applets/irdaapplet/irda.h @@ -1,5 +1,6 @@ /********************************************************************** -** Copyright (C) 2002 L.J. Potter ljp@llornkcor.com +** Copyright (C) 2002 L.J. Potter ljp@llornkcor.com, +** Robert Griebl sandman@handhelds.org ** All rights reserved. ** ** This file may be distributed and/or modified under the terms of the @@ -12,60 +13,60 @@ ** **********************************************************************/ -#ifndef SCREENSHOT_APPLET_H__ -#define SCREENSHOT_APPLET_H__ - - +#ifndef __OPIE_IRDA_APPLET_H__ +#define __OPIE_IRDA_APPLET_H__ #include <qwidget.h> -#include <qframe.h> #include <qpixmap.h> -#include <qguardedptr.h> -#include <qtimer.h> -#include <qfile.h> #include <qpopupmenu.h> -#include <qdict.h> +#include <qmap.h> class IrdaApplet : public QWidget { Q_OBJECT + public: IrdaApplet( QWidget *parent = 0, const char *name=0 ); ~IrdaApplet(); + virtual void show ( ); + protected: - void timerEvent(QTimerEvent *te ); + virtual void timerEvent ( QTimerEvent * ); + virtual void mousePressEvent ( QMouseEvent * ); + virtual void paintEvent ( QPaintEvent* ); + +private slots: + void popupTimeout ( ); private: - void mousePressEvent( QMouseEvent * ); - void paintEvent( QPaintEvent* ); - int checkIrdaStatus(); - int setIrdaStatus(int); - int checkIrdaDiscoveryStatus(); - int setIrdaDiscoveryStatus(int); - int setIrdaReceiveStatus(int); - void showDiscovered(); - int sockfd; + void popup( QString message, QString icon = QString::null ); -public slots: - void show(); + bool checkIrdaStatus ( ); + bool setIrdaStatus ( bool ); + bool checkIrdaDiscoveryStatus (); + bool setIrdaDiscoveryStatus ( bool ); + bool setIrdaReceiveStatus ( bool ); -private slots: - void popupTimeout(); + void showDiscovered(); private: - QPixmap irdaOnPixmap; - QPixmap irdaOffPixmap; - QPixmap irdaDiscoveryOnPixmap; - QPixmap receiveActivePixmap; - int irdaactive; // bool and bitfields later bool irdaactive :1 ; - int irdaDiscoveryActive; - bool receiveActive : 1; - bool receiveStateChanged; - QPopupMenu *popupMenu; - void popup(QString message, QString icon=""); - QDict<QString> devicesAvailable; + QPixmap m_irdaOnPixmap; + QPixmap m_irdaOffPixmap; + QPixmap m_irdaDiscoveryOnPixmap; + QPixmap m_receiveActivePixmap; + + bool m_irda_active; + bool m_irda_discovery_active; + bool m_receive_active; + bool m_receive_state_changed; + + QPopupMenu *m_popup; + + int m_sockfd; + + QMap <QString, QString> m_devices; }; -#endif // __SCREENSHOT_APPLET_H__ +#endif // __OPIE_IRDA_APPLET_H__ |