author | mickeyl <mickeyl> | 2003-03-02 16:38:17 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2003-03-02 16:38:17 (UTC) |
commit | d0e64d0c7961de1c3ecb886ae76c6701f268d767 (patch) (side-by-side diff) | |
tree | 2ea00b7cd496bb0720b9730bbf993f2013a87d3e | |
parent | a0ae7d2b8cfef3f643c4aa536bdf25d7da510142 (diff) | |
download | opie-d0e64d0c7961de1c3ecb886ae76c6701f268d767.zip opie-d0e64d0c7961de1c3ecb886ae76c6701f268d767.tar.gz opie-d0e64d0c7961de1c3ecb886ae76c6701f268d767.tar.bz2 |
first attempt to add session persistence
-rw-r--r-- | noncore/net/wellenreiter/cornucopia/README | 127 | ||||
-rw-r--r-- | noncore/net/wellenreiter/cornucopia/olistview.cpp | 151 | ||||
-rw-r--r-- | noncore/net/wellenreiter/cornucopia/olistview.h | 87 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/gui.pro | 2 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/mainwindow.cpp | 36 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/mainwindow.h | 1 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/scanlist.cpp | 130 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/scanlist.h | 77 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/scanlistitem.cpp | 121 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/scanlistitem.h | 83 | ||||
-rw-r--r-- | noncore/net/wellenreiter/gui/wellenreiter.cpp | 8 |
11 files changed, 578 insertions, 245 deletions
diff --git a/noncore/net/wellenreiter/cornucopia/README b/noncore/net/wellenreiter/cornucopia/README index 36a6954..486dc67 100644 --- a/noncore/net/wellenreiter/cornucopia/README +++ b/noncore/net/wellenreiter/cornucopia/README @@ -1,3 +1,124 @@ ---------------------------------------------------------------- -Dies ist ein Testballon für opielibs1.2 - Codename: Cornucopia ---------------------------------------------------------------- +/******************************************************************** +/* This is an overview of the opielibs 1.2 project +/********************************************************************/ + + Origin: opielibs is about creating classes to + * optimize Qt classes for the embedded environment + * provide sophisticated abstractions for developers + * provide complete documentation and working examples + * provide end users with a common look and feel + * reduce memory footprint through sharing code + * reduce possible bugs through reusing tested code + +-------------------------------------------------------- +1. General Overview +-------------------------------------------------------- + +Separation into the following libraries: + - libopiecore + - libopieui + - libopiepim + - libopienet + +1.1 Contents of libopiecore [ opiecore ] +-------------------------------------------------------- + + - oprocctrl + - oprocess + - odevice + - odevicebutton + + - oconfig + - oconfiggroupsaver + - ocompletionbase + - ocompletion + - ocomptreenodelist + - ocomptreenode + - ocompletionwrapper + - oglobal + - oglobalsettings + - osortableitem + - osortablevaluelist + +1.2 Contents of libopieui [ opieui ] +-------------------------------------------------------- + + - oapplication + + - ofiledialog + - colordialog + - oclickablelabel + - ocolorbutton + - colorpopupmenu + - otabinfo + - otabbar + - otabwidget + - ofontmenu + - ofontselector + - ofileview + - oticker + + - olistview + - olistviewitem + - oversatileview + - oversatileviewitem + - ocompletionbox + - olineedit + - ocombobox + - ohistorycombo + + - omessagebox + - odialogbase + + - todayconfigwidget (rather into opiepim?) + - orecurrancewidget (rather into opiepim?) + - otimepicker (rather into opiepim?) + +1.3 Contents of libopiepim [ opiepim ] +-------------------------------------------------------- + + - ocheckitem + - todoevent + - todoresource + - todayplugininterface + - todovcalresource + +1.4 Contents of libopiedb [ opiedb ] +-------------------------------------------------------- + + - tododb + - xmltree + +1.5 Contents of libopienet [ opienet ] +-------------------------------------------------------- + + <libmail stuff> + <libbend stuff> + <libftp stuff> + +-------------------------------------------------------- +2.0 Feature Description +-------------------------------------------------------- + +2.1 libopiecore + +... + +2.2 libopieui + +... + +2.2.x OListView, OListViewItem, OListViewFactory + +... + +2.3 libopiepim + +... + +2.4 libopiedb + +... + +2.5 libopienet + diff --git a/noncore/net/wellenreiter/cornucopia/olistview.cpp b/noncore/net/wellenreiter/cornucopia/olistview.cpp index 8bc59de..f2d3730 100644 --- a/noncore/net/wellenreiter/cornucopia/olistview.cpp +++ b/noncore/net/wellenreiter/cornucopia/olistview.cpp @@ -102,48 +102,124 @@ void OListView::removeColumn( int index ) } const QColor& OListView::alternateBackground() const { return m_alternateBackground; } void OListView::setAlternateBackground( const QColor &c ) { m_alternateBackground = c; repaint(); } const QPen& OListView::columnSeparator() const { return m_columnSeparator; } void OListView::setColumnSeparator( const QPen& p ) { m_columnSeparator = p; repaint(); } +#ifndef QT_NO_DATASTREAM +void OListView::serializeTo( QDataStream& s ) const +{ + #warning Caution... the binary format is still under construction... + qDebug( "storing OListView..." ); + + // store number of columns and the labels + s << columns(); + for ( int i = 0; i < columns(); ++i ) + s << columnText( i ); + + // calculate the number of top-level items to serialize + int items = 0; + QListViewItem* item = firstChild(); + while ( item ) + { + item = item->nextSibling(); + items++; + } + + // store number of items and the items itself + s << items; + item = firstChild(); + for ( int i = 0; i < items; ++i ) + { + s << *static_cast<OListViewItem*>( item ); + item = item->nextSibling(); + } + + qDebug( "OListview stored." ); +} + +void OListView::serializeFrom( QDataStream& s ) +{ + #warning Caution... the binary format is still under construction... + qDebug( "loading OListView..." ); + + int cols; + s >> cols; + qDebug( "read number of columns = %d", cols ); + + while ( columns() < cols ) addColumn( QString::null ); + + for ( int i = 0; i < cols; ++i ) + { + QString coltext; + s >> coltext; + qDebug( "read text '%s' for column %d", (const char*) coltext, i ); + setColumnText( i, coltext ); + } + + int items; + s >> items; + qDebug( "read number of items = %d", items ); + + for ( int i = 0; i < items; ++i ) + { + OListViewItem* item = new OListViewItem( this ); + s >> *item; + } + + qDebug( "OListView loaded." ); + +} + +QDataStream& operator<<( QDataStream& s, const OListView& lv ) +{ + lv.serializeTo( s ); +} + +QDataStream& operator>>( QDataStream& s, OListView& lv ) +{ + lv.serializeFrom( s ); +} +#endif // QT_NO_DATASTREAM + //****************************** OListViewItem *********************************************************************** OListViewItem::OListViewItem(QListView *parent) : QListViewItem(parent) { init(); } OListViewItem::OListViewItem(QListViewItem *parent) : QListViewItem(parent) { init(); } OListViewItem::OListViewItem(QListView *parent, QListViewItem *after) : QListViewItem(parent, after) { init(); } OListViewItem::OListViewItem(QListViewItem *parent, QListViewItem *after) : QListViewItem(parent, after) { init(); @@ -224,39 +300,108 @@ bool OListViewItem::isAlternate() /* if ( !item.inherits( "OListViewItem" ) item = 0; */ } else { item = static_cast<OListViewItem *>(lv->firstChild()); } while(item) { item->m_odd = previous = !previous; item->m_known = true; item = static_cast<OListViewItem *>(item->nextSibling()); /* if (!item.inherits( "OListViewItem" ) ) break; */ } } return m_odd; } void OListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment) { QColorGroup _cg = cg; const QPixmap *pm = listView()->viewport()->backgroundPixmap(); if (pm && !pm->isNull()) { - _cg.setBrush(QColorGroup::Base, QBrush(backgroundColor(), *pm)); + _cg.setBrush( QColorGroup::Base, QBrush(backgroundColor(), *pm) ); p->setBrushOrigin( -listView()->contentsX(), -listView()->contentsY() ); } else if ( isAlternate() ) { _cg.setColor( QColorGroup::Base, static_cast<OListView*>( listView() )->alternateBackground() ); } - QListViewItem::paintCell(p, _cg, column, width, alignment); + QListViewItem::paintCell( p, _cg, column, width, alignment ); - //FIXME: Use styling here? + //FIXME: Use styling here! const QPen& pen = static_cast<OListView*>( listView() )->columnSeparator(); p->setPen( pen ); p->drawLine( width-1, 0, width-1, height() ); } + +#ifndef QT_NO_DATASTREAM +void OListViewItem::serializeTo( QDataStream& s ) const +{ + #warning Caution... the binary format is still under construction... + qDebug( "storing OListViewItem..." ); + + // store item text + for ( int i = 0; i < listView()->columns(); ++i ) + { + s << text( i ); + } + + // calculate the number of children to serialize + int items = 0; + QListViewItem* item = firstChild(); + while ( item ) + { + item = item->nextSibling(); + items++; + } + + // store number of items and the items itself + s << items; + item = firstChild(); + for ( int i = 0; i < items; ++i ) + { + s << *static_cast<OListViewItem*>( item ); + item = item->nextSibling(); + } + + qDebug( "OListviewItem stored." ); +} +void OListViewItem::serializeFrom( QDataStream& s ) +{ + #warning Caution... the binary format is still under construction... + qDebug( "loading OListViewItem..." ); + + for ( int i = 0; i < listView()->columns(); ++i ) + { + QString coltext; + s >> coltext; + qDebug( "read text '%s' for column %d", (const char*) coltext, i ); + setText( i, coltext ); + } + + int items; + s >> items; + qDebug( "read number of items = %d", items ); + + for ( int i = 0; i < items; ++i ) + { + OListViewItem* item = new OListViewItem( this ); + s >> (*item); + } + + qDebug( "OListViewItem loaded." ); +} + +QDataStream& operator<<( QDataStream& s, const OListViewItem& lvi ) +{ + lvi.serializeTo( s ); +} + +QDataStream& operator>>( QDataStream& s, OListViewItem& lvi ) +{ + lvi.serializeFrom( s ); +} +#endif // QT_NO_DATASTREAM diff --git a/noncore/net/wellenreiter/cornucopia/olistview.h b/noncore/net/wellenreiter/cornucopia/olistview.h index 4b9e4b0..9df5500 100644 --- a/noncore/net/wellenreiter/cornucopia/olistview.h +++ b/noncore/net/wellenreiter/cornucopia/olistview.h @@ -12,56 +12,59 @@ .="- .-=="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 OLISTVIEW_H #define OLISTVIEW_H -#include <qlistview.h> #include <qcolor.h> +#include <qlistview.h> #include <qpen.h> +#include <qdatastream.h> + +class OListViewFactory; /** - * A @ref QListView variant featuring visual enhancements - * like an alternate background for odd rows and an autostretch - * mode for the width of the widget. + * A @ref QListView variant featuring visual and functional enhancements + * like an alternate background for odd rows, an autostretch mode + * for the width of the widget ( >= Qt 3 only ) and persistence capabilities. * * @author Michael 'Mickey' Lauer <mickey@tm.informatik.uni-frankfurt.de> * @short OListView list/tree widget. */ class OListView: public QListView { public: /** * Constructor. * * The parameters @p parent and @p name are handled by * @ref QListView, as usual. */ OListView ( QWidget *parent = 0, const char *name = 0 ); /** * Destructor. */ virtual ~OListView(); /** * Let the last column fit exactly all the available width. */ void setFullWidth( bool fullWidth ); @@ -91,78 +94,144 @@ * This only has an effect if the items are OListViewItems * * @param c the color to use for every other item. Set to an invalid * color to disable alternate colors. */ void setAlternateBackground( const QColor &c ); /** * sets the column separator pen. * * @param p the pen used to draw the column separator. */ void setColumnSeparator( const QPen &p ); /** * @return the alternate background color */ const QColor& alternateBackground() const; /** * @return the column separator pen */ const QPen& columnSeparator() const; + #ifndef QT_NO_DATASTREAM + /** + * serialize this object to a @ref QDataStream + * @param s the stream used to serialize this object. + */ + virtual void serializeTo( QDataStream& s ) const; + + /** + * serialize this object from a @ref QDataStream + * @param s the stream used to serialize this object. + */ + virtual void serializeFrom( QDataStream& s ); + #endif + + /** + * returns a factory for OListView classes + * creates one on the fly if it doesn't exist + * @return the XML Factory + */ + #ifndef QT_NO_XML + //OListViewFactory* Factory(); + #endif + private: QColor m_alternateBackground; bool m_fullWidth; QPen m_columnSeparator; - + #ifndef QT_NO_XML + //OListViewFactory* m_Factory; + #endif }; +#ifndef QT_NO_DATASTREAM +/** + * \relates QListView + * Writes a listview to the stream and returns a reference to the stream. + */ +QDataStream& operator<<( QDataStream& s, const OListView& lv ); +/** + * \relates QListView + * Reads a listview from the stream and returns a reference to the stream. + */ +QDataStream& operator>>( QDataStream& s, OListView& lv ); +#endif // QT_NO_DATASTREAM + //****************************** OListViewItem ****************************************************************** class OListViewItem: public QListViewItem { public: OListViewItem( QListView * parent ); OListViewItem( QListViewItem * parent ); OListViewItem( QListView * parent, QListViewItem * after ); OListViewItem( QListViewItem * parent, QListViewItem * after ); OListViewItem( QListView * parent, QString, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null ); OListViewItem( QListViewItem * parent, QString, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null ); OListViewItem( QListView * parent, QListViewItem * after, QString, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null ); - + OListViewItem( QListViewItem * parent, QListViewItem * after, QString, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null, QString = QString::null ); - + virtual ~OListViewItem(); - + const QColor& backgroundColor(); bool isAlternate(); void paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment ); void init(); + #ifndef QT_NO_DATASTREAM + /** + * serialize this object to or from a @ref QDataStream + * @param s the stream used to serialize this object. + */ + virtual void serializeTo( QDataStream& s ) const; + + /** + * serialize this object to or from a @ref QDataStream + * @param s the stream used to serialize this object. + */ + virtual void serializeFrom( QDataStream& s ); + #endif + private: bool m_known; bool m_odd; }; -#endif +#ifndef QT_NO_DATASTREAM +/** + * \relates QListViewItem + * Writes a listview item and all subitems recursively to the stream + * and returns a reference to the stream. + */ +QDataStream& operator<<( QDataStream &s, const OListViewItem& lvi ); +/** + * \relates QListViewItem + * Reads a listview item from the stream and returns a reference to the stream. + */ +QDataStream& operator>>( QDataStream &s, OListViewItem& lvi ); +#endif // QT_NO_DATASTREAM + +#endif // OLISTVIEW_H diff --git a/noncore/net/wellenreiter/gui/gui.pro b/noncore/net/wellenreiter/gui/gui.pro index 6037661..8861a50 100644 --- a/noncore/net/wellenreiter/gui/gui.pro +++ b/noncore/net/wellenreiter/gui/gui.pro @@ -1,47 +1,45 @@ MOC_DIR = ./tmp OBJECTS_DIR = ./tmp DESTDIR = $(OPIEDIR)/bin TEMPLATE = app CONFIG = qt warn_on debug HEADERS = wellenreiterbase.h \ mainwindow.h \ wellenreiter.h \ - scanlistitem.h \ scanlist.h \ logwindow.h \ hexwindow.h \ configwindow.h \ wlan.h \ cardconfig.h \ manufacturers.h SOURCES = main.cpp \ mainwindow.cpp \ wellenreiterbase.cpp \ wellenreiter.cpp \ - scanlistitem.cpp \ scanlist.cpp \ logwindow.cpp \ hexwindow.cpp \ configwindow.cpp \ wlan.cpp \ cardconfig.cpp \ manufacturers.cpp INCLUDEPATH += $(OPIEDIR)/include ../ DEPENDPATH += $(OPIEDIR)/include ../ LIBS += -L. -lwellenreiter -lcornucopia INTERFACES = configbase.ui TARGET = wellenreiter !contains( platform, x11 ) { message( qws ) include ( $(OPIEDIR)/include.pro ) LIBS += -lqpe -lopie } contains( platform, x11 ) { LIBS += -L$(OPIEDIR)/lib -Wl,-rpath,$(OPIEDIR)/lib SOURCES += resource.cpp HEADERS += resource.h diff --git a/noncore/net/wellenreiter/gui/mainwindow.cpp b/noncore/net/wellenreiter/gui/mainwindow.cpp index e388fc5..0ef89d4 100644 --- a/noncore/net/wellenreiter/gui/mainwindow.cpp +++ b/noncore/net/wellenreiter/gui/mainwindow.cpp @@ -1,70 +1,78 @@ /********************************************************************** ** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. ** ** This file is part of Opie Environment. ** ** 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 ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #include "configwindow.h" #include "logwindow.h" #include "mainwindow.h" #include "wellenreiter.h" #include "scanlist.h" #include <qcombobox.h> +#include <qdatastream.h> #include <qfile.h> #include <qiconset.h> #include <qmenubar.h> #include <qmessagebox.h> #include <qpopupmenu.h> #include <qstatusbar.h> #include <qtextstream.h> #include <qtoolbutton.h> #ifdef QWS #include <qpe/resource.h> #else #include "resource.h" #endif WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * name, WFlags f ) :QMainWindow( parent, name, f ) { cw = new WellenreiterConfigWindow( this ); mw = new Wellenreiter( this ); mw->setConfigWindow( cw ); setCentralWidget( mw ); + // setup application icon + + #ifndef QWS + setIcon( Resource::loadPixmap( "wellenreiter/appicon-trans" ) ); + setIconText( "Wellenreiter/X11" ); + #endif + // setup icon sets infoIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/InfoIcon" ) ); settingsIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/SettingsIcon" ) ); #ifdef QWS searchIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/SearchIcon" ) ); cancelIconSet = new QIconSet( Resource::loadPixmap( "wellenreiter/CancelIcon" ) ); #else startStopIconSet = new QIconSet(); startStopIconSet->setPixmap( Resource::loadPixmap( "wellenreiter/SearchIcon" ), QIconSet::Automatic, QIconSet::Normal, QIconSet::Off ); startStopIconSet->setPixmap( Resource::loadPixmap( "wellenreiter/CancelIcon" ), QIconSet::Automatic, QIconSet::Normal, QIconSet::On ); #endif // setup tool buttons startStopButton = new QToolButton( 0 ); #ifdef QWS startStopButton->setAutoRaise( true ); #endif #ifdef QWS startStopButton->setOnIconSet( *cancelIconSet ); startStopButton->setOffIconSet( *searchIconSet ); #else startStopButton->setIconSet( *startStopIconSet ); @@ -78,53 +86,52 @@ WellenreiterMainWindow::WellenreiterMainWindow( QWidget * parent, const char * n c->setAutoRaise( true ); #endif c->setIconSet( *infoIconSet ); c->setEnabled( false ); QToolButton* d = new QToolButton( 0 ); #ifdef QWS d->setAutoRaise( true ); #endif d->setIconSet( *settingsIconSet ); connect( d, SIGNAL( clicked() ), this, SLOT( showConfigure() ) ); // setup menu bar int id; QMenuBar* mb = menuBar(); QPopupMenu* fileSave = new QPopupMenu( mb ); fileSave->insertItem( "&Session", this, SLOT( fileSaveSession() ) ); fileSave->insertItem( "&Log", this, SLOT( fileSaveLog() ) ); QPopupMenu* fileLoad = new QPopupMenu( mb ); fileLoad->insertItem( "&Session", this, SLOT( fileLoadSession() ) ); - fileLoad->insertItem( "&Log", this, SLOT( fileLoadLog() ) ); + //fileLoad->insertItem( "&Log", this, SLOT( fileLoadLog() ) ); QPopupMenu* file = new QPopupMenu( mb ); id = file->insertItem( "&Load", fileLoad ); - file->setItemEnabled( id, false ); file->insertItem( "&Save", fileSave ); QPopupMenu* view = new QPopupMenu( mb ); view->insertItem( "&Configure..." ); QPopupMenu* sniffer = new QPopupMenu( mb ); sniffer->insertItem( "&Configure..." ); sniffer->insertSeparator(); QPopupMenu* demo = new QPopupMenu( mb ); demo->insertItem( "&Add something", this, SLOT( demoAddStations() ) ); id = mb->insertItem( "&File", file ); id = mb->insertItem( "&View", view ); mb->setItemEnabled( id, false ); id = mb->insertItem( "&Sniffer", sniffer ); mb->setItemEnabled( id, false ); id = mb->insertItem( "&Demo", demo ); mb->setItemEnabled( id, true ); #ifdef QWS mb->insertItem( startStopButton ); mb->insertItem( c ); mb->insertItem( d ); @@ -164,77 +171,96 @@ void WellenreiterMainWindow::showConfigure() //TODO ... else startStopButton->setEnabled( false ); //TODO ... } } WellenreiterMainWindow::~WellenreiterMainWindow() { delete infoIconSet; delete settingsIconSet; #ifdef QWS delete searchIconSet; delete cancelIconSet; #else delete startStopIconSet; #endif }; void WellenreiterMainWindow::demoAddStations() { mw->netView()->addNewItem( "managed", "Vanille", "00:00:20:EF:A6:43", true, 6, 80 ); - mw->netView()->addNewItem( "managed", "Vanille", "00:00:1c:EF:A6:23", true, 11, 10 ); + mw->netView()->addNewItem( "managed", "Vanille", "00:30:6D:EF:A6:23", true, 11, 10 ); mw->netView()->addNewItem( "adhoc", "ELAN", "00:A0:F8:E7:16:22", false, 3, 10 ); mw->netView()->addNewItem( "adhoc", "ELAN", "00:AA:01:E7:56:62", false, 3, 15 ); mw->netView()->addNewItem( "adhoc", "ELAN", "00:B0:8E:E7:56:E2", false, 3, 20 ); } void WellenreiterMainWindow::fileSaveLog() { const QString fname( "/tmp/log.txt" ); QFile f( fname ); if ( f.open(IO_WriteOnly) ) { QTextStream t( &f ); t << mw->logWindow()->getLog(); f.close(); qDebug( "Saved log to file '%s'", (const char*) fname ); } else { qDebug( "Problem saving log to file '%s'", (const char*) fname ); } } void WellenreiterMainWindow::fileSaveSession() { const QString fname( "/tmp/session.xml" ); QFile f( fname ); if ( f.open(IO_WriteOnly) ) { - QTextStream t( &f ); - mw->netView()->dump( t ); + QDataStream t( &f ); + t << *mw->netView(); f.close(); qDebug( "Saved session to file '%s'", (const char*) fname ); } else { qDebug( "Problem saving session to file '%s'", (const char*) fname ); } } +void WellenreiterMainWindow::fileLoadSession() +{ + const QString fname( "/tmp/session.xml" ); + QFile f( fname ); + + if ( f.open(IO_ReadOnly) ) + { + QDataStream t( &f ); + t >> *mw->netView(); + f.close(); + qDebug( "Loaded session from file '%s'", (const char*) fname ); + } + else + { + qDebug( "Problem loading session from file '%s'", (const char*) fname ); + } + +} + void WellenreiterMainWindow::closeEvent( QCloseEvent* e ) { if ( mw->isDaemonRunning() ) { QMessageBox::warning( this, "Wellenreiter/Opie", "Sniffing in progress!\nPlease stop sniffing before closing." ); e->ignore(); } else { QMainWindow::closeEvent( e ); } } diff --git a/noncore/net/wellenreiter/gui/mainwindow.h b/noncore/net/wellenreiter/gui/mainwindow.h index 8bfccf3..59f259d 100644 --- a/noncore/net/wellenreiter/gui/mainwindow.h +++ b/noncore/net/wellenreiter/gui/mainwindow.h @@ -30,27 +30,28 @@ class WellenreiterMainWindow: public QMainWindow public: WellenreiterMainWindow( QWidget * parent = 0, const char * name = "mainwindow", WFlags f = 0 ); ~WellenreiterMainWindow(); protected: Wellenreiter* mw; WellenreiterConfigWindow* cw; QIconSet* startStopIconSet; const QIconSet* searchIconSet; const QIconSet* infoIconSet; const QIconSet* settingsIconSet; const QIconSet* cancelIconSet; QToolButton* startStopButton; protected: virtual void closeEvent( QCloseEvent* ); public slots: void showConfigure(); void demoAddStations(); void fileSaveLog(); void fileSaveSession(); + void fileLoadSession(); }; #endif diff --git a/noncore/net/wellenreiter/gui/scanlist.cpp b/noncore/net/wellenreiter/gui/scanlist.cpp index cdc2c48..58a04fb 100644 --- a/noncore/net/wellenreiter/gui/scanlist.cpp +++ b/noncore/net/wellenreiter/gui/scanlist.cpp @@ -1,167 +1,263 @@ /********************************************************************** ** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. ** ** This file is part of Opie Environment. ** ** 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 ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #include "scanlist.h" -#include "scanlistitem.h" #include <assert.h> - #include "manufacturers.h" - +#include <qdatetime.h> #include <qtextstream.h> MScanListView::MScanListView( QWidget* parent, const char* name ) :OListView( parent, name ), _manufacturerdb( 0 ) { setFrameShape( QListView::StyledPanel ); setFrameShadow( QListView::Sunken ); addColumn( tr( "Net/Station" ) ); setColumnAlignment( 0, AlignLeft || AlignVCenter ); addColumn( tr( "B" ) ); setColumnAlignment( 1, AlignCenter ); addColumn( tr( "AP" ) ); setColumnAlignment( 2, AlignCenter ); addColumn( tr( "Chn" ) ); setColumnAlignment( 3, AlignCenter ); addColumn( tr( "W" ) ); setColumnAlignment( 4, AlignCenter ); addColumn( tr( "T" ) ); setColumnAlignment( 5, AlignCenter ); addColumn( tr( "Manufacturer" ) ); setColumnAlignment( 6, AlignCenter ); addColumn( tr( "First Seen" ) ); setColumnAlignment( 7, AlignCenter ); addColumn( tr( "Last Seen" ) ); setColumnAlignment( 8, AlignCenter ); setRootIsDecorated( true ); setAllColumnsShowFocus( true ); }; - + MScanListView::~MScanListView() { }; +void MScanListView::serializeTo( QDataStream& s) const +{ + qDebug( "serializing MScanListView" ); + OListView::serializeTo( s ); +} + +void MScanListView::serializeFrom( QDataStream& s) +{ + qDebug( "serializing MScanListView" ); + OListView::serializeFrom( s ); +} + void MScanListView::setManufacturerDB( ManufacturerDB* manufacturerdb ) { _manufacturerdb = manufacturerdb; } void MScanListView::addNewItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ) { // FIXME: scanlistitem needs a proper encapsulation and not such a damn dealing with text(...) qDebug( "MScanList::addNewItem( %s / %s / %s [%d]", (const char*) type, (const char*) essid, (const char*) macaddr, channel ); - + // search, if we already have seen this net - + QString s; MScanListItem* network; MScanListItem* item = static_cast<MScanListItem*> ( firstChild() ); while ( item && ( item->text( 0 ) != essid ) ) { qDebug( "itemtext: %s", (const char*) item->text( 0 ) ); item = static_cast<MScanListItem*> ( item->itemBelow() ); } if ( item ) { // animate the item /* const QPixmap* pixmap = item->pixmap( 0 ); const QPixmap* nextpixmap = ani2; if ( pixmap == ani1 ) nextpixmap = ani2; else if ( pixmap == ani2 ) nextpixmap = ani3; else if ( pixmap == ani3 ) nextpixmap = ani4; else if ( pixmap == ani4 ) nextpixmap = ani1; item->setPixmap( 0, *nextpixmap ); */ - + //qDebug( "current pixmap %d, next %d", pixmap, nextpixmap ); - + // we have already seen this net, check all childs if MAC exists network = item; item = static_cast<MScanListItem*> ( item->firstChild() ); assert( item ); // this shouldn't fail while ( item && ( item->text( 2 ) != macaddr ) ) { qDebug( "subitemtext: %s", (const char*) item->text( 2 ) ); item = static_cast<MScanListItem*> ( item->itemBelow() ); } - + if ( item ) { // we have already seen this item, it's a dupe #ifdef DEBUG qDebug( "%s is a dupe - ignoring...", (const char*) macaddr ); #endif item->receivedBeacon(); return; } } else { s.sprintf( "(i) new network: '%s'", (const char*) essid ); network = new MScanListItem( this, "networks", essid, QString::null, 0, 0, 0 ); } // insert new station as child from network // no essid to reduce clutter, maybe later we have a nick or stationname to display!? qDebug( "inserting new station %s", (const char*) macaddr ); MScanListItem* station = new MScanListItem( network, type, "", macaddr, wep, channel, signal ); if ( _manufacturerdb ) station->setManufacturer( _manufacturerdb->lookup( macaddr ) ); if ( type == "managed" ) { s.sprintf( "(i) new AP in '%s' [%d]", (const char*) essid, channel ); } else { s.sprintf( "(i) new adhoc station in '%s' [%d]", (const char*) essid, channel ); } } -void MScanListView::dump( QTextStream& t ) const +#ifdef QWS +#include <qpe/resource.h> +#else +#include "resource.h" +#endif + +const int col_type = 0; +const int col_essid = 0; +const int col_sig = 1; +const int col_ap = 2; +const int col_channel = 3; +const int col_wep = 4; +const int col_traffic = 5; +const int col_manuf = 6; +const int col_firstseen = 7; +const int col_lastseen = 8; + +MScanListItem::MScanListItem( QListView* parent, QString type, QString essid, QString macaddr, + bool wep, int channel, int signal ) + :OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null ), + _type( type ), _essid( essid ), _macaddr( macaddr ), _wep( wep ), + _channel( channel ), _signal( signal ), _beacons( 0 ) { - qDebug( "dumping scanlist..." ); + qDebug( "creating scanlist item" ); + decorateItem( type, essid, macaddr, wep, channel, signal ); +} - QListViewItemIterator it( const_cast<MScanListView*>( this ) ); - for ( ; it.current(); ++it ) - { - static_cast<MScanListItem*>( it.current() )->dump( t ); - } +MScanListItem::MScanListItem( QListViewItem* parent, QString type, QString essid, QString macaddr, + bool wep, int channel, int signal ) + :OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null ) +{ + qDebug( "creating scanlist item" ); + decorateItem( type, essid, macaddr, wep, channel, signal ); +} - qDebug( "dump finished." ); +void MScanListItem::serializeTo( QDataStream& s ) const +{ + OListViewItem::serializeTo( s ); +} + +void MScanListItem::serializeFrom( QDataStream& s ) +{ + OListViewItem::serializeFrom( s ); } + +void MScanListItem::decorateItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ) +{ + qDebug( "decorating scanlist item %s / %s / %s [%d]", + (const char*) type, + (const char*) essid, + (const char*) macaddr, + channel ); + + // set icon for managed or adhoc mode + QString name; + name.sprintf( "wellenreiter/%s", (const char*) type ); + setPixmap( col_type, Resource::loadPixmap( name ) ); + + // set icon for wep (wireless encryption protocol) + if ( wep ) + setPixmap( col_wep, Resource::loadPixmap( "wellenreiter/cracked" ) ); //FIXME: rename the pixmap! + + // set channel and signal text + + if ( signal != -1 ) + setText( col_sig, QString::number( signal ) ); + if ( channel != -1 ) + setText( col_channel, QString::number( channel ) ); + + setText( col_firstseen, QTime::currentTime().toString() ); + //setText( col_lastseen, QTime::currentTime().toString() ); + + listView()->triggerUpdate(); + + this->type = type; + _type = type; + _essid = essid; + _macaddr = macaddr; + _channel = channel; + _beacons = 0; + _signal = 0; +} + +void MScanListItem::setManufacturer( const QString& manufacturer ) +{ + setText( col_manuf, manufacturer ); +} + +void MScanListItem::receivedBeacon() +{ + _beacons++; + #ifdef DEBUG + qDebug( "MScanListItem %s: received beacon #%d", (const char*) _macaddr, _beacons ); + #endif + setText( col_sig, QString::number( _beacons ) ); + setText( col_lastseen, QTime::currentTime().toString() ); +} + diff --git a/noncore/net/wellenreiter/gui/scanlist.h b/noncore/net/wellenreiter/gui/scanlist.h index f06f251..66c701b 100644 --- a/noncore/net/wellenreiter/gui/scanlist.h +++ b/noncore/net/wellenreiter/gui/scanlist.h @@ -11,36 +11,109 @@ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** **********************************************************************/ #ifndef SCANLIST_H #define SCANLIST_H #include <cornucopia/olistview.h> #include <qtextstream.h> class QString; class ManufacturerDB; class MScanListView: public OListView { Q_OBJECT public: MScanListView( QWidget* parent = 0, const char* name = 0 ); virtual ~MScanListView(); void setManufacturerDB( ManufacturerDB* manufacturerdb ); - void dump( QTextStream& t ) const; + + virtual void serializeTo( QDataStream& s ) const; + virtual void serializeFrom( QDataStream& s ); public slots: void addNewItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ); - + private: ManufacturerDB* _manufacturerdb; }; +//****************************** MScanListItem **************************************************************** + +class MScanListItem: public OListViewItem +{ + public: + MScanListItem::MScanListItem( QListView* parent, + QString type, + QString essid, + QString macaddr, + bool wep, + int channel, + int signal ); + + MScanListItem::MScanListItem( QListViewItem* parent, + QString type, + QString essid, + QString macaddr, + bool wep, + int channel, + int signal ); + + + protected: + virtual void decorateItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ); + + public: + QString type; + + public: + //const QString& type() { return _type; }; + const QString& essid() { return _essid; }; + const QString& macaddr() { return _macaddr; }; + bool wep() { return _wep; }; + int channel() { return _channel; }; + int signal() { return _signal; }; + int beacons() { return _beacons; }; + + void setSignal( int signal ) { /* TODO */ }; + void receivedBeacon(); + + void setManufacturer( const QString& manufacturer ); + + virtual void serializeTo( QDataStream& s ) const; + virtual void serializeFrom( QDataStream& s ); + + private: + QString _type; + QString _essid; + QString _macaddr; + bool _wep; + int _channel; + int _signal; + int _beacons; + +}; + +//****************************** MScanListViewFactory **************************************************************** + +/* + +class MScanListViewFactory : public OListViewFactory +{ +public: + virtual QListView* listViewFactory(); + virtual QListViewItem* listViewItemFactory( QListView* lv ); + virtual QListViewItem* listViewItemFactory( QListViewItem* lvi ); + virtual void setColumnText( int depth, QListViewItem* lvi, int column, const QString& text ); + virtual void setCustomData( int depth, QListViewItem* lvi, const QString& text ); +} +*/ + #endif diff --git a/noncore/net/wellenreiter/gui/scanlistitem.cpp b/noncore/net/wellenreiter/gui/scanlistitem.cpp deleted file mode 100644 index 4aecd2b..0000000 --- a/noncore/net/wellenreiter/gui/scanlistitem.cpp +++ b/dev/null @@ -1,121 +0,0 @@ -/********************************************************************** -** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. -** -** This file is part of Opie Environment. -** -** 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 -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -**********************************************************************/ - -#include "scanlistitem.h" -#include <assert.h> -#include <qdatetime.h> -#include <qpixmap.h> - -#ifdef QWS -#include <qpe/resource.h> -#else -#include "resource.h" -#endif - -const int col_type = 0; -const int col_essid = 0; -const int col_sig = 1; -const int col_ap = 2; -const int col_channel = 3; -const int col_wep = 4; -const int col_traffic = 5; -const int col_manuf = 6; -const int col_firstseen = 7; -const int col_lastseen = 8; - -MScanListItem::MScanListItem( QListView* parent, QString type, QString essid, QString macaddr, - bool wep, int channel, int signal ) - :OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null ), - _type( type ), _essid( essid ), _macaddr( macaddr ), _wep( wep ), - _channel( channel ), _signal( signal ), _beacons( 0 ) -{ - qDebug( "creating scanlist item" ); - decorateItem( type, essid, macaddr, wep, channel, signal ); -} - -MScanListItem::MScanListItem( QListViewItem* parent, QString type, QString essid, QString macaddr, - bool wep, int channel, int signal ) - :OListViewItem( parent, essid, QString::null, macaddr, QString::null, QString::null ) -{ - qDebug( "creating scanlist item" ); - decorateItem( type, essid, macaddr, wep, channel, signal ); -} - -void MScanListItem::decorateItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ) -{ - qDebug( "decorating scanlist item %s / %s / %s [%d]", - (const char*) type, - (const char*) essid, - (const char*) macaddr, - channel ); - - // set icon for managed or adhoc mode - QString name; - name.sprintf( "wellenreiter/%s", (const char*) type ); - setPixmap( col_type, Resource::loadPixmap( name ) ); - - // set icon for wep (wireless encryption protocol) - if ( wep ) - setPixmap( col_wep, Resource::loadPixmap( "wellenreiter/cracked" ) ); //FIXME: rename the pixmap! - - // set channel and signal text - - if ( signal != -1 ) - setText( col_sig, QString::number( signal ) ); - if ( channel != -1 ) - setText( col_channel, QString::number( channel ) ); - - setText( col_firstseen, QTime::currentTime().toString() ); - //setText( col_lastseen, QTime::currentTime().toString() ); - - listView()->triggerUpdate(); - - this->type = type; - _type = type; - _essid = essid; - _macaddr = macaddr; - _channel = channel; - _beacons = 0; - _signal = 0; -} - -void MScanListItem::setManufacturer( const QString& manufacturer ) -{ - setText( col_manuf, manufacturer ); -} - -void MScanListItem::receivedBeacon() -{ - _beacons++; - #ifdef DEBUG - qDebug( "MScanListItem %s: received beacon #%d", (const char*) _macaddr, _beacons ); - #endif - setText( col_sig, QString::number( _beacons ) ); - setText( col_lastseen, QTime::currentTime().toString() ); -} - -void MScanListItem::dump( QTextStream& t ) const -{ - qDebug( "dumping scanlistitem at <%d>", this ); - t << "<ITEM type=" << _type; - t << " ESSID='" << _essid; - t << "' MAC=" << _macaddr; - t << " WEP=" << _wep; - t << " CHANNEL=" << _channel; - t << " SIGNAL=" << _signal; - t << " BEACONS=" << _beacons; - t << ">\n"; -} - diff --git a/noncore/net/wellenreiter/gui/scanlistitem.h b/noncore/net/wellenreiter/gui/scanlistitem.h deleted file mode 100644 index 5f6ae40..0000000 --- a/noncore/net/wellenreiter/gui/scanlistitem.h +++ b/dev/null @@ -1,83 +0,0 @@ -/********************************************************************** -** Copyright (C) 2002 Michael 'Mickey' Lauer. All rights reserved. -** -** This file is part of Opie Environment. -** -** 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 -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -**********************************************************************/ - -#ifndef SCANLISTITEM_H -#define SCANLISTITEM_H - -#include <cornucopia/olistview.h> - -#include <qtextstream.h> - -class QString; - -class MScanListItem: public OListViewItem -{ - public: - - MScanListItem::MScanListItem( QListView* parent, - QString type, - QString essid, - QString macaddr, - bool wep, - int channel, - int signal ); - - MScanListItem::MScanListItem( QListViewItem* parent, - QString type, - QString essid, - QString macaddr, - bool wep, - int channel, - int signal ); - - - protected: - - virtual void decorateItem( QString type, QString essid, QString macaddr, bool wep, int channel, int signal ); - - public: - - QString type; - - public: - - //const QString& type() { return _type; }; - const QString& essid() { return _essid; }; - const QString& macaddr() { return _macaddr; }; - bool wep() { return _wep; }; - int channel() { return _channel; }; - int signal() { return _signal; }; - int beacons() { return _beacons; }; - - void setSignal( int signal ) { /* TODO */ }; - void receivedBeacon(); - - void setManufacturer( const QString& manufacturer ); - - void dump( QTextStream& t ) const; - - private: - QString _type; - QString _essid; - QString _macaddr; - bool _wep; - int _channel; - int _signal; - int _beacons; - -}; - -#endif - diff --git a/noncore/net/wellenreiter/gui/wellenreiter.cpp b/noncore/net/wellenreiter/gui/wellenreiter.cpp index 1ccf971..dd8a365 100644 --- a/noncore/net/wellenreiter/gui/wellenreiter.cpp +++ b/noncore/net/wellenreiter/gui/wellenreiter.cpp @@ -102,53 +102,61 @@ Wellenreiter::Wellenreiter( QWidget* parent ) logwindow->log( "(E) Couldn't get file descriptor for commsocket." ); } else { int flags; flags = fcntl( daemon_fd, F_GETFL, 0 ); fcntl( daemon_fd, F_SETFL, flags | O_NONBLOCK ); QSocketNotifier *sn = new QSocketNotifier( daemon_fd, QSocketNotifier::Read, parent ); connect( sn, SIGNAL( activated( int ) ), this, SLOT( dataReceived() ) ); } // setup GUI netview->setColumnWidthMode( 1, QListView::Manual ); if ( manufacturerdb ) netview->setManufacturerDB( manufacturerdb ); } Wellenreiter::~Wellenreiter() { // no need to delete child widgets, Qt does it all for us delete manufacturerdb; + + // X11-only - Hmm... Closing the socket here segfaults on exit, + // Maybe because the notifier still has a handle to it!? Seems not to + // occur on Qt/Embedded + + #ifdef QWS if ( daemon_fd != -1 ) { qDebug( "closing comm socket" ); close( daemon_fd ); } + #endif + } void Wellenreiter::setConfigWindow( WellenreiterConfigWindow* cw ) { configwindow = cw; } void Wellenreiter::handleMessage() { // FIXME: receive message and handle it qDebug( "received message from daemon." ); /*char buffer[10000]; memset( &buffer, 0, sizeof( buffer ) );*/ char buffer[WL_SOCKBUF]; // int result = #wl_recv( &daemon_fd, (char*) &buffer, sizeof(buffer) ); /* struct sockaddr from; socklen_t len; |