-rw-r--r-- | core/applets/cardmon/pcmcia.cpp | 264 | ||||
-rw-r--r-- | core/applets/cardmon/pcmcia.h | 25 |
2 files changed, 76 insertions, 213 deletions
diff --git a/core/applets/cardmon/pcmcia.cpp b/core/applets/cardmon/pcmcia.cpp index 2486f17..5183572 100644 --- a/core/applets/cardmon/pcmcia.cpp +++ b/core/applets/cardmon/pcmcia.cpp @@ -1,371 +1,249 @@ /* This file is part of the Opie Project =. (C) 2005 Michael 'Mickey' Lauer <mickey@Vanille.de> .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. This program is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "pcmcia.h" /* OPIE */ #include <opie2/odebug.h> #include <opie2/odevice.h> +#include <opie2/oconfig.h> #include <opie2/oprocess.h> +#include <opie2/opcmciasystem.h> #include <opie2/oresource.h> #include <opie2/otaskbarapplet.h> #include <qpe/applnk.h> #include <qpe/resource.h> using namespace Opie::Core; using namespace Opie::Ui; /* QT */ #include <qcopchannel_qws.h> #include <qpainter.h> #include <qfile.h> #include <qtextstream.h> +#include <qmessagebox.h> #include <qsound.h> #include <qtimer.h> /* STD */ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) #include <sys/vfs.h> #include <mntent.h> #endif PcmciaManager::PcmciaManager( QWidget * parent ) : QWidget( parent ) { - pm = Opie::Core::OResource::loadPixmap( "cardmon/pcmcia", Opie::Core::OResource::SmallIcon ); -#if 0 - QCopChannel *channel = new QCopChannel("QPE/System", this); - connect(channel, SIGNAL(received(const QCString&,const QByteArray&)), - this, SLOT(systemMsg(const QCString&,const QByteArray&)) ); -#endif QCopChannel * pcmciaChannel = new QCopChannel( "QPE/Card", this ); connect( pcmciaChannel, SIGNAL( received(const QCString&,const QByteArray&) ), this, SLOT( cardMessage(const QCString&,const QByteArray&) ) ); - QCopChannel *sdChannel = new QCopChannel( "QPE/Card", this ); - connect( sdChannel, - SIGNAL( received(const QCString&,const QByteArray&) ), this, - SLOT( cardMessage(const QCString&,const QByteArray&) ) ); - - cardInPcmcia0 = FALSE; - cardInPcmcia1 = FALSE; - cardInSd = FALSE; - setFocusPolicy( NoFocus ); - setFixedWidth ( AppLnk::smallIconSize() ); setFixedHeight ( AppLnk::smallIconSize() ); - - getStatusPcmcia( TRUE ); - getStatusSd( TRUE ); - repaint( FALSE ); - popupMenu = 0; + pm = Opie::Core::OResource::loadPixmap( "cardmon/pcmcia", Opie::Core::OResource::SmallIcon ); } PcmciaManager::~PcmciaManager() { - delete popupMenu; } void PcmciaManager::popUp( QString message, QString icon ) { if ( !popupMenu ) { popupMenu = new QPopupMenu( this ); } popupMenu->clear(); if ( icon.isEmpty() ) { popupMenu->insertItem( message, 0 ); } else { popupMenu->insertItem( QIconSet( Opie::Core::OResource::loadPixmap( icon, Opie::Core::OResource::SmallIcon ) ), 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 ); QTimer::singleShot( 2000, this, SLOT( popupTimeout() ) ); } void PcmciaManager::popupTimeout() { popupMenu->hide(); } void PcmciaManager::mousePressEvent( QMouseEvent * ) { QPopupMenu * menu = new QPopupMenu( this ); QStringList cmd; bool execute = true; + OPcmciaSystem* sys = OPcmciaSystem::instance(); + OPcmciaSystem::CardIterator it = sys->iterator(); + if ( !sys->count() ) return; + + int i = 0; + while ( it.current() ) + { + menu->insertItem( tr( "Eject card %1: %2" ).arg( i++ ).arg( it.currentKey() ), 1 ); + ++it; + } + + + /* insert items depending on number of cards etc. + if ( cardInSd ) { menu->insertItem( QIconSet( Opie::Core::OResource::loadPixmap( "cardmon/ide", Opie::Core::OResource::SmallIcon ) ), tr( "Eject SD/MMC card" ), 0 ); } + + if ( cardInPcmcia0 ) { menu-> insertItem( QIconSet ( Opie::Core::OResource::loadPixmap( "cardmon/" + cardInPcmcia0Type, Opie::Core::OResource::SmallIcon ) ), tr( "Eject card 0: %1" ).arg( cardInPcmcia0Name ), 1 ); } if ( cardInPcmcia1 ) { menu-> insertItem( QIconSet ( Opie::Core::OResource::loadPixmap( "cardmon/" + cardInPcmcia1Type, Opie::Core::OResource::SmallIcon ) ), tr( "Eject card 1: %1" ).arg( cardInPcmcia1Name ), 2 ); } + */ QPoint p = mapToGlobal( QPoint( 0, 0 ) ); QSize s = menu->sizeHint(); - int opt = menu->exec( QPoint( p.x() + ( width() / 2 ) - ( s.width() / 2 ), - p.y() - s.height() ), 0 ); - - if ( opt == 1 ) { - m_commandOrig = PCMCIA_Socket1; - cmd << "/sbin/cardctl" << "eject" << "0"; - } else if ( opt == 0 ) { - m_commandOrig = MMC_Socket; - cmd << "umount" << cardSdName; - } else if ( opt == 2 ) { - m_commandOrig = PCMCIA_Socket2; - cmd << "/sbin/cardctl" << "eject" << "1"; - }else - execute = false; - - if ( execute ) - execCommand( cmd ); - + int opt = menu->exec( QPoint( p.x() + ( width() / 2 ) - ( s.width() / 2 ), p.y() - s.height() ), 0 ); + qDebug( "pcmcia: menu result = %d", opt ); delete menu; } void PcmciaManager::cardMessage( const QCString & msg, const QByteArray & ) { - if ( msg == "stabChanged()" ) { - // odebug << "Pcmcia: stabchanged" << oendl; - getStatusPcmcia(); - } else if ( msg == "mtabChanged()" ) { - // odebug << "CARDMONAPPLET: mtabchanged" << oendl; - getStatusSd(); - } -} + odebug << "PcmciaManager::cardMessage( '" << msg << "' )" << oendl; + if ( msg != "stabChanged()" ) return; + /* check if a previously unknown card has been inserted */ + OPcmciaSystem::instance()->synchronize(); -bool PcmciaManager::getStatusPcmcia( int showPopUp ) { - - bool cardWas0 = cardInPcmcia0; // remember last state - bool cardWas1 = cardInPcmcia1; - - QString fileName; - - if ( QFile::exists( "/var/run/stab" ) ) { fileName = "/var/run/stab"; } - else if ( QFile::exists( "/var/state/pcmcia/stab" ) ) { fileName = "/var/state/pcmcia/stab"; } - else { fileName = "/var/lib/pcmcia/stab"; } - - QFile f( fileName ); - - if ( f.open( IO_ReadOnly ) ) { - QStringList list; - QTextStream stream( &f ); - QString streamIn; - streamIn = stream.read(); - list = QStringList::split( "\n", streamIn ); - for ( QStringList::Iterator line = list.begin(); line != list.end(); - line++ ) { - if ( ( *line ).startsWith( "Socket 0:" ) ) { - if ( ( *line ).startsWith( "Socket 0: empty" ) && cardInPcmcia0 ) { - cardInPcmcia0 = FALSE; - } else if ( !( *line ).startsWith( "Socket 0: empty" ) - && !cardInPcmcia0 ) { - cardInPcmcia0Name = - ( *line ).mid( ( ( *line ).find( ':' ) + 1 ), - ( *line ).length() - 9 ); - cardInPcmcia0Name.stripWhiteSpace(); - cardInPcmcia0 = TRUE; - show(); - line++; - int pos = ( *line ).find( '\t' ) + 1; - cardInPcmcia0Type = - ( *line ).mid( pos, ( *line ).find( "\t", pos ) - pos ); - } - } else if ( ( *line ).startsWith( "Socket 1:" ) ) { - if ( ( *line ).startsWith( "Socket 1: empty" ) && cardInPcmcia1 ) { - cardInPcmcia1 = FALSE; - } else if ( !( *line ).startsWith( "Socket 1: empty" ) - && !cardInPcmcia1 ) { - cardInPcmcia1Name = - ( *line ).mid( ( ( *line ).find( ':' ) + 1 ), - ( *line ).length() - 9 ); - cardInPcmcia1Name.stripWhiteSpace(); - cardInPcmcia1 = TRUE; - show(); - line++; - int pos = ( *line ).find( '\t' ) + 1; - cardInPcmcia1Type = - ( *line ).mid( pos, ( *line ).find( "\t", pos ) - pos ); - } - } - } - f.close(); + if ( !OPcmciaSystem::instance()->count() ) return; - if ( !showPopUp - && ( cardWas0 != cardInPcmcia0 || cardWas1 != cardInPcmcia1 ) ) { - QString text = QString::null; - QString what = QString::null; - if ( cardWas0 != cardInPcmcia0 ) { - if ( cardInPcmcia0 ) { - text += tr( "New card: " ); - what = "on"; - } else { - text += tr( "Ejected: " ); - what = "off"; - } - text += cardInPcmcia0Name; - popUp( text, "cardmon/" + cardInPcmcia0Type ); - } + OConfig cfg( "PCMCIA" ); + cfg.setGroup( "Global" ); + int nCards = cfg.readNumEntry( "nCards", 0 ); - if ( cardWas1 != cardInPcmcia1 ) { - if ( cardInPcmcia1 ) { - text += tr( "New card: " ); - what = "on"; - } else { - text += tr( "Ejected: " ); - what = "off"; - } - text += cardInPcmcia1Name; - popUp( text, "cardmon/" + cardInPcmcia1Type ); - } - #ifndef QT_NO_SOUND - QSound::play( Resource::findSound( "cardmon/card" + what ) ); - #endif + OPcmciaSystem* sys = OPcmciaSystem::instance(); + OPcmciaSystem::CardIterator it = sys->iterator(); + bool newCard = true; + while ( it.current() && newCard ) + { + QString name = it.currentKey(); + for ( int i = 0; i < nCards; ++i ) + { + QString cardSection = QString( "Card_%1" ).arg( i ); + cfg.setGroup( cardSection ); + QString cardName = cfg.readEntry( "name" ); + odebug << "comparing card '" << name << "' with known card '" << cardName << "'" << oendl; + if ( cardName == name ) + { + newCard = false; + break; } - } else { - // no file found - odebug << "no file found" << oendl; - cardInPcmcia0 = FALSE; - cardInPcmcia1 = FALSE; } - - repaint( FALSE ); - return ( ( cardWas0 == cardInPcmcia0 - && cardWas1 == cardInPcmcia1 ) ? FALSE : TRUE ); - + if ( !newCard ) ++it; else break; } + QString newCardName = it.currentKey(); - -bool PcmciaManager::getStatusSd( int showPopUp ) + if ( newCard ) { + odebug << "pcmcia: new card detected" << oendl; + cfg.setGroup( QString( "Card_%1" ).arg( nCards ) ); + cfg.writeEntry( "name", newCardName ); + cfg.setGroup( "Global" ); + cfg.writeEntry( "nCards", nCards+1 ); + cfg.write(); - bool cardWas = cardInSd; // remember last state - cardInSd = FALSE; - - #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) + int result = QMessageBox::information( qApp->desktop(), + tr( "PCMCIA/CF Subsystem" ), + tr( "You have inserted a new card\n%1\nDo you want to configure this card?" ).arg( newCardName ), + tr( "Yes" ), tr( "No" ), 0, 0, 1 ); + odebug << "result = " << result << oendl; - struct mntent *me; - FILE *mntfp = setmntent( "/etc/mtab", "r" ); - - if ( mntfp ) { - while ( ( me = getmntent( mntfp ) ) != 0 ) { - QString fs = QFile::decodeName( me->mnt_fsname ); - //odebug << fs << oendl; - if ( fs.left( 14 ) == "/dev/mmc/part1" || fs.left( 7 ) == "/dev/sd" - || fs.left( 9 ) == "/dev/mmcd" || fs.left(11) == "/dev/mmcblk" ) { - cardInSd = TRUE; - cardSdName = fs; - show(); } - // else { - // cardInSd = FALSE; - // } + else + { + odebug << "pcmcia: card has been previously inserted" << oendl; } - endmntent( mntfp ); + repaint( TRUE ); } - if ( !showPopUp && cardWas != cardInSd ) { - QString text = QString::null; - QString what = QString::null; - if ( cardInSd ) { - text += tr("New card: SD/MMC"); - what = "on"; - } else { - text += tr("Ejected: SD/MMC"); - what = "off"; - } - //odebug << "TEXT: " + text << oendl; - #ifndef QT_NO_SOUND - QSound::play( Resource::findSound( "cardmon/card" + what ) ); - #endif - - popUp( text, "cardmon/ide" ); // XX add SD pic - } - #else - #error "Not on Linux" - #endif - repaint( FALSE ); - return ( ( cardWas == cardInSd ) ? FALSE : TRUE ); -} void PcmciaManager::paintEvent( QPaintEvent * ) { - QPainter p( this ); - - if ( cardInPcmcia0 || cardInPcmcia1 || cardInSd ) { + qDebug( "count = %d", (OPcmciaSystem::instance()->count() ) ); + if ( OPcmciaSystem::instance()->count() ) + { p.drawPixmap( 0, 0, pm ); show(); - } else { - //p.eraseRect(rect()); + } + else + { hide(); } } int PcmciaManager::position() { return 7; } void PcmciaManager::execCommand( const QStringList &strList ) { } EXPORT_OPIE_APPLET_v1( PcmciaManager ) diff --git a/core/applets/cardmon/pcmcia.h b/core/applets/cardmon/pcmcia.h index 58a2d42..5c20433 100644 --- a/core/applets/cardmon/pcmcia.h +++ b/core/applets/cardmon/pcmcia.h @@ -1,80 +1,65 @@ /* This file is part of the Opie Project =. (C) 2005 Michael 'Mickey' Lauer <mickey@Vanille.de> .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU Library General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -<s. This program is distributed in the hope that + . -:. = it will be useful, but WITHOUT ANY WARRANTY; : .. .:, . . . without even the implied warranty of =_ + =;=|` MERCHANTABILITY or FITNESS FOR A _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PCMCIA_H #define PCMCIA_H #include <qwidget.h> #include <qpixmap.h> #include <qpopupmenu.h> class PcmciaManager : public QWidget { Q_OBJECT public: - enum { - PCMCIA_Socket1, - PCMCIA_Socket2, - MMC_Socket - }; - PcmciaManager( QWidget *parent = 0 ); ~PcmciaManager(); - bool getStatusPcmcia( int showPopUp = FALSE ); - bool getStatusSd( int showPopUp = FALSE ); static int position(); + private slots: void cardMessage( const QCString &msg, const QByteArray & ); void popupTimeout(); protected: void paintEvent( QPaintEvent* ); void mousePressEvent( QMouseEvent * ); private: void execCommand( const QStringList &command ); + void popUp(QString message, QString icon = QString::null ); + + private: int m_commandOrig; QPixmap pm; - // pcmcia socket 0 - bool cardInPcmcia0; - QString cardInPcmcia0Name; - QString cardInPcmcia0Type; - // pcmcia socket 1 - bool cardInPcmcia1; - QString cardInPcmcia1Name; - QString cardInPcmcia1Type; - bool cardInSd; - QString cardSdName; // the device which is mounted - void iconShow(); QPopupMenu *popupMenu; - void popUp(QString message, QString icon = QString::null ); + }; #endif |