-rw-r--r-- | core/applets/cardmon/cardmon.cpp | 230 | ||||
-rw-r--r-- | core/applets/cardmon/cardmon.h | 52 | ||||
-rw-r--r-- | core/applets/cardmon/cardmon.pro | 23 | ||||
-rw-r--r-- | core/applets/cardmon/cardmonimpl.cpp | 40 | ||||
-rw-r--r-- | core/applets/cardmon/cardmonimpl.h | 19 | ||||
-rw-r--r-- | core/applets/cardmon/opie-cardmon.control | 9 | ||||
-rwxr-xr-x | core/applets/cardmon/qpe-cardmon.postinst | 2 | ||||
-rwxr-xr-x | core/applets/cardmon/qpe-cardmon.postrm | 2 |
8 files changed, 377 insertions, 0 deletions
diff --git a/core/applets/cardmon/cardmon.cpp b/core/applets/cardmon/cardmon.cpp new file mode 100644 index 0000000..9522b88 --- a/dev/null +++ b/core/applets/cardmon/cardmon.cpp @@ -0,0 +1,230 @@ +/* + * cardmon.cpp + * + * --------------------- + * + * copyright : (c) 2002 by Maximilian Reiss + * email : max.reiss@gmx.de + * based on two apps by Devin Butterfield + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "cardmon.h" + +#include <qpe/resource.h> + +#include <qcopchannel_qws.h> +#include <qpainter.h> +#include <qmessagebox.h> +#include <qpopupmenu.h> +#include <qfile.h> +#include <qtextstream.h> + +#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 + +CardMonitor::CardMonitor( QWidget *parent ) : QWidget( parent ), + pm( Resource::loadPixmap( "cardmon/pcmcia" ) ) { + + 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 &)) ); + + + setFixedSize( pm.size() ); + hide(); + getStatusPcmcia(); +} + +CardMonitor::~CardMonitor() { +} + +void CardMonitor::mousePressEvent( QMouseEvent * ) { + QPopupMenu *menu = new QPopupMenu(); + QString cmd; + int err=0; + + if ( cardInSd ) { + menu->insertItem( tr("Eject SD/ MMC card"), 0 ); + } + + if ( cardInPcmcia0 ) { + menu->insertItem( tr("Eject card (0) %1").arg(cardInPcmcia0Name), 1 ); + } + + if ( cardInPcmcia1 ) { + menu->insertItem( tr("Eject card (1) %1").arg(cardInPcmcia1Name), 2 ); + } + + QPoint p = mapToGlobal( QPoint(1, -menu->sizeHint().height()-1) ); + + if ( menu->exec( p, 1 ) == 1 ) { + + cmd = "/sbin/cardctl eject 0"; + err = system( (const char *) cmd ); + if ( ( err == 127 ) || ( err < 0 ) ) { + qDebug("Could not execute `/sbin/cardctl eject 0'! err=%d", err); + QMessageBox::warning( this, tr("CardMonitor"), tr("CF/PCMCIA card eject failed!"), + tr("&OK") ); + } + } else if ( menu->exec( p, 1 ) == 0 ) { + cmd = "/etc/sdcontrol compeject"; + err = system( (const char *) cmd ); + if ( ( err != 0 ) ) { + qDebug("Could not execute `/etc/sdcontrol comeject'! err=%d", err); + QMessageBox::warning( this, tr("CardMonitor"), tr("SD/MMC card eject failed!"), + tr("&OK") ); + } + } else if ( menu->exec( p, 1 ) == 2 ) { + cmd = "/sbin/cardctl eject 1"; + err = system( (const char *) cmd ); + if ( ( err == 127 ) || ( err < 0 ) ) { + qDebug("Could not execute `/sbin/cardctl eject 1'! err=%d", err); + QMessageBox::warning( this, tr("CardMonitor"), tr("CF/PCMCIA card eject failed!"), + tr("&OK") ); + } + } + + delete menu; +} + + +void CardMonitor::cardMessage( const QCString &msg, const QByteArray & ) { + if ( msg == "stabChanged()" ) { + if ( getStatusPcmcia() ) { + repaint(FALSE); + } + } else if ( msg == "mtabChanged()" ) { + if ( getStatusSd() ) { + repaint(FALSE); + } + } +} + +bool CardMonitor::getStatusPcmcia( void ) { + + bool cardWas0 = cardInPcmcia0; // remember last state + bool cardWas1 = cardInPcmcia1; + + QString fileName; + + // one of these 3 files should exist + 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:") ){ + // extendable, maybe read out card name + if( (*line).startsWith("Socket 0: empty") && cardInPcmcia0 ){ + cardInPcmcia0 = FALSE; + hide(); + } else if ( !(*line).startsWith("Socket 0: empty") && !cardInPcmcia0 ){ + cardInPcmcia0Name = (*line).mid(((*line).find(':')+1), (*line).length()-9 ); + cardInPcmcia0 = TRUE; + show(); + } + } + if( (*line).startsWith("Socket 1:") ){ + if( (*line).startsWith("Socket 1: empty") && cardInPcmcia1 ){ + cardInPcmcia1 = FALSE; + hide(); + } else if ( !(*line).startsWith("Socket 1: empty") && !cardInPcmcia1 ){ + cardInPcmcia1Name = (*line).mid(((*line).find(':')+1), (*line).length()-9 ); + cardInPcmcia1 = TRUE; + show(); + } + } + } + } else { + // no file found + qDebug("no file found"); + cardInPcmcia0 = FALSE; + cardInPcmcia1 = FALSE; + hide(); + return FALSE; + + } + + f.close(); + + return ((cardWas0 == cardInPcmcia0 || cardWas1 == cardInPcmcia1) ? FALSE : TRUE); +} + + +bool CardMonitor::getStatusSd( void ) { + + bool cardWas=cardInSd; // remember last state + cardInSd=false; + +#if defined(_OS_LINUX_) || defined(Q_OS_LINUX) + struct mntent *me; + FILE *mntfp = setmntent( "/etc/mtab", "r" ); + + if ( mntfp ) { + while ( (me = getmntent( mntfp )) != 0 ) { + QString fs = me->mnt_fsname; + if ( fs.left(7)=="/dev/sd" || fs.left(9) == "/dev/mmcd" ) { + cardInSd=true; + } + } + endmntent( mntfp ); + if (cardInSd!=cardWas) { + if (cardInSd) { + show(); + } else { + hide(); + } + } + } else { + hide(); + } +#else +#error "Not on Linux" +#endif + return ((cardWas == cardInSd) ? FALSE : TRUE); +} + +void CardMonitor::paintEvent( QPaintEvent * ) { + QPainter p( this ); + + if ( cardInPcmcia0 || cardInPcmcia1 || cardInSd ) { + p.drawPixmap( 0, 0, pm ); + } else { + p.eraseRect( rect() ); + } +} + + diff --git a/core/applets/cardmon/cardmon.h b/core/applets/cardmon/cardmon.h new file mode 100644 index 0000000..2a90c90 --- a/dev/null +++ b/core/applets/cardmon/cardmon.h @@ -0,0 +1,52 @@ +/* + * cardmon.h + * + * --------------------- + * + * copyright : (c) 2002 by Maximilian Reiss + * email : max.reiss@gmx.de + * based on two apps by Devin Butterfield + */ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef CARDMON_H +#define CARDMON_H + +#include <qwidget.h> +#include <qpixmap.h> + +class CardMonitor : public QWidget { + Q_OBJECT +public: + CardMonitor( QWidget *parent = 0 ); + ~CardMonitor(); + bool getStatusPcmcia( void ); + bool getStatusSd( void ); + +private slots: + void cardMessage( const QCString &msg, const QByteArray & ); + +protected: + void paintEvent( QPaintEvent* ); + void mousePressEvent( QMouseEvent * ); +private: + QPixmap pm; + // pcmcia socket 0 + bool cardInPcmcia0; + QString cardInPcmcia0Name; + // pcmcia socket 1 + bool cardInPcmcia1; + QString cardInPcmcia1Name; + bool cardInSd; + +}; + +#endif + diff --git a/core/applets/cardmon/cardmon.pro b/core/applets/cardmon/cardmon.pro new file mode 100644 index 0000000..bda051b --- a/dev/null +++ b/core/applets/cardmon/cardmon.pro @@ -0,0 +1,23 @@ +TEMPLATE = lib +CONFIG += qt warn_on release +HEADERS = cardmon.h cardmonimpl.h +SOURCES = cardmon.cpp cardmonimpl.cpp +TARGET = cardmonapplet +DESTDIR = $(OPIEDIR)/plugins/applets +INCLUDEPATH += $(OPIEDIR)/include +DEPENDPATH += $(OPIEDIR)/include ../launcher +LIBS += -lqpe +VERSION = 1.0.0 + +TRANSLATIONS = ../i18n/de/libcardmonapplet.ts +TRANSLATIONS += ../i18n/pt_BR/libcardmonapplet.ts +TRANSLATIONS += ../i18n/en/libcardmonapplet.ts +TRANSLATIONS += ../i18n/hu/libcardmonapplet.ts +TRANSLATIONS += ../i18n/sl/libcardmonapplet.ts +TRANSLATIONS += ../i18n/pl/libcardmonapplet.ts +TRANSLATIONS += ../i18n/ja/libcardmonapplet.ts +TRANSLATIONS += ../i18n/fr/libcardmonapplet.ts +TRANSLATIONS += ../i18n/ko/libcardmonapplet.ts +TRANSLATIONS += ../i18n/no/libcardmonapplet.ts +TRANSLATIONS += ../i18n/zh_CN/libcardmonapplet.ts +TRANSLATIONS += ../i18n/zh_TW/libcardmonapplet.ts diff --git a/core/applets/cardmon/cardmonimpl.cpp b/core/applets/cardmon/cardmonimpl.cpp new file mode 100644 index 0000000..0aa55de --- a/dev/null +++ b/core/applets/cardmon/cardmonimpl.cpp @@ -0,0 +1,40 @@ +#include "cardmon.h" +#include "cardmonimpl.h" + + +CardMonitorImpl::CardMonitorImpl() + : cardMonitor(0), ref(0) { +} + +CardMonitorImpl::~CardMonitorImpl() { + delete cardMonitor; +} + +QWidget *CardMonitorImpl::applet( QWidget *parent ) { + if ( !cardMonitor ) { + cardMonitor = new CardMonitor( parent ); + } + return cardMonitor; +} + +int CardMonitorImpl::position() const { + return 7; +} + +QRESULT CardMonitorImpl::queryInterface( const QUuid &uuid, QUnknownInterface **iface ) { + *iface = 0; + if ( uuid == IID_QUnknown ) { + *iface = this; + } else if ( uuid == IID_TaskbarApplet ) { + *iface = this; + } + + if ( *iface ) { + (*iface)->addRef(); + } + return QS_OK; +} + +Q_EXPORT_INTERFACE() { + Q_CREATE_INSTANCE( CardMonitorImpl ) +} diff --git a/core/applets/cardmon/cardmonimpl.h b/core/applets/cardmon/cardmonimpl.h new file mode 100644 index 0000000..ec2d871 --- a/dev/null +++ b/core/applets/cardmon/cardmonimpl.h @@ -0,0 +1,19 @@ +#include <qpe/taskbarappletinterface.h> + +class CardMonitor; + +class CardMonitorImpl : public TaskbarAppletInterface { +public: + CardMonitorImpl(); + virtual ~CardMonitorImpl(); + + QRESULT queryInterface( const QUuid&, QUnknownInterface** ); + Q_REFCOUNT + + virtual QWidget *applet( QWidget *parent ); + virtual int position() const; + +private: + CardMonitor *cardMonitor; + ulong ref; +}; diff --git a/core/applets/cardmon/opie-cardmon.control b/core/applets/cardmon/opie-cardmon.control new file mode 100644 index 0000000..9f941f8 --- a/dev/null +++ b/core/applets/cardmon/opie-cardmon.control @@ -0,0 +1,9 @@ +Files: plugins/applets/libcardmonapplet.so* pics/cardmon/pcmcia.png +Priority: optional +Section: opie/taskbar +Maintainer: Maximilian Reiß <max.reiss@gmx.de> +Architecture: arm +Version: $QPE_VERSION-$SUB_VERSION +Depends: opie-base ($QPE_VERSION) +Description: CF/PCMCIA Card Monitor applet + SD/MMC/CF/PCMCIA Card Monitor applet for the Opie environment taskbar. diff --git a/core/applets/cardmon/qpe-cardmon.postinst b/core/applets/cardmon/qpe-cardmon.postinst new file mode 100755 index 0000000..ba76ffa --- a/dev/null +++ b/core/applets/cardmon/qpe-cardmon.postinst @@ -0,0 +1,2 @@ +#!/bin/sh +/opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()" diff --git a/core/applets/cardmon/qpe-cardmon.postrm b/core/applets/cardmon/qpe-cardmon.postrm new file mode 100755 index 0000000..ba76ffa --- a/dev/null +++ b/core/applets/cardmon/qpe-cardmon.postrm @@ -0,0 +1,2 @@ +#!/bin/sh +/opt/QtPalmtop/bin/qcop QPE/TaskBar "reloadApplets()" |