author | ar <ar> | 2004-05-02 21:32:48 (UTC) |
---|---|---|
committer | ar <ar> | 2004-05-02 21:32:48 (UTC) |
commit | 0a4cac124105a5732e55cb34c6b37be75083a395 (patch) (side-by-side diff) | |
tree | 33b4d2cab08c9b58893540b4ddee089b69fc9c61 | |
parent | 109ed5f2a1cdfeb3680c9ec057a1083fcf8fab95 (diff) | |
download | opie-0a4cac124105a5732e55cb34c6b37be75083a395.zip opie-0a4cac124105a5732e55cb34c6b37be75083a395.tar.gz opie-0a4cac124105a5732e55cb34c6b37be75083a395.tar.bz2 |
- convert qWarning to owarn
-rw-r--r-- | core/launcher/launcher.cpp | 296 | ||||
-rw-r--r-- | core/launcher/packageslave.cpp | 191 | ||||
-rw-r--r-- | core/launcher/transferserver.cpp | 3 | ||||
-rw-r--r-- | core/obex/obex.cc | 47 | ||||
-rw-r--r-- | core/opie-login/loginapplication.cpp | 315 | ||||
-rw-r--r-- | core/pim/addressbook/namelineedit.cpp | 6 | ||||
-rw-r--r-- | core/qws/transferserver.cpp | 6 |
7 files changed, 439 insertions, 425 deletions
diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp index 6afbcd8..779fe54 100644 --- a/core/launcher/launcher.cpp +++ b/core/launcher/launcher.cpp @@ -37,750 +37,750 @@ #include <qtopia/qpeapplication.h> #include <qtopia/mimetype.h> #include <qtopia/private/categories.h> #define QTOPIA_INTERNAL_FSLP #include <qtopia/lnkproperties.h> /* QT */ #include <qdir.h> #ifdef Q_WS_QWS #include <qkeyboard_qws.h> #include <qwindowsystem_qws.h> #endif #include <qtimer.h> #include <qcombobox.h> #include <qvbox.h> #include <qlayout.h> #include <qstyle.h> #include <qpushbutton.h> #include <qtabbar.h> #include <qwidgetstack.h> #include <qregexp.h> #include <qmessagebox.h> #include <qframe.h> #include <qpainter.h> #include <qlabel.h> #include <qtextstream.h> #include <qpopupmenu.h> /* STD */ #include <stdlib.h> #include <assert.h> #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) #include <unistd.h> #include <stdio.h> #include <sys/vfs.h> #include <mntent.h> #endif static bool isVisibleWindow( int ); //=========================================================================== LauncherTabWidget::LauncherTabWidget( Launcher* parent ) : QVBox( parent ), docview( 0 ) { docLoadingWidgetEnabled = false; docLoadingWidget = 0; docLoadingWidgetProgress = 0; launcher = parent; categoryBar = new LauncherTabBar( this ); QPalette pal = categoryBar->palette(); pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) ); pal.setColor( QColorGroup::Background, pal.active().background().light(110) ); categoryBar->setPalette( pal ); stack = new QWidgetStack(this); connect( categoryBar, SIGNAL(selected(int)), this, SLOT(raiseTabWidget()) ); categoryBar->show(); stack->show(); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) QCopChannel *channel = new QCopChannel( "QPE/Launcher", this ); connect( channel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(launcherMessage(const QCString&,const QByteArray&)) ); connect( qApp, SIGNAL(appMessage(const QCString&,const QByteArray&)), - this, SLOT(appMessage(const QCString&,const QByteArray&))); + this, SLOT(appMessage(const QCString&,const QByteArray&))); #endif createDocLoadingWidget(); } void LauncherTabWidget::createDocLoadingWidget() { // Construct the 'doc loading widget' shown when finding documents // ### LauncherView class needs changing to be more generic so // this widget can change its background similar to the iconviews // so the background for this matches docLoadingWidget = new LauncherView( stack ); docLoadingWidget->hideIcons(); QVBox *docLoadingVBox = new QVBox( docLoadingWidget ); docLoadingVBox->setSpacing( 20 ); docLoadingVBox->setMargin( 10 ); QWidget *space1 = new QWidget( docLoadingVBox ); docLoadingVBox->setStretchFactor( space1, 1 ); QLabel *waitPixmap = new QLabel( docLoadingVBox ); waitPixmap->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)5, waitPixmap->sizePolicy().hasHeightForWidth() ) ); waitPixmap->setPixmap( Resource::loadPixmap( "bigwait" ) ); waitPixmap->setAlignment( int( QLabel::AlignCenter ) ); Config cfg( "Launcher" ); cfg.setGroup( "DocTab" ); bool docTabEnabled = cfg.readBoolEntry( "Enable", true ); QLabel *textLabel = new QLabel( docLoadingVBox ); textLabel->setAlignment( int( QLabel::AlignCenter ) ); docLoadingWidgetProgress = new QProgressBar( docLoadingVBox ); docLoadingWidgetProgress->setProgress( 0 ); docLoadingWidgetProgress->setCenterIndicator( TRUE ); docLoadingWidgetProgress->setBackgroundMode( NoBackground ); // No flicker setProgressStyle(); if ( docTabEnabled ) { textLabel->setText( tr( "<b>Finding Documents...</b>" ) ); } else { textLabel->setText( tr( "<b>The Documents Tab<p>has been disabled.<p>" "Use Settings->Launcher->DocTab<p>to reenable it.</b></center>" ) ); docLoadingWidgetProgress->hide(); docLoadingWidgetEnabled = true; } QWidget *space2 = new QWidget( docLoadingVBox ); docLoadingVBox->setStretchFactor( space2, 1 ); cfg.setGroup( "Tab Documents" ); // No tr setTabViewAppearance( docLoadingWidget, cfg ); stack->addWidget( docLoadingWidget, 0 ); } void LauncherTabWidget::initLayout() { layout()->activate(); docView()->setFocus(); categoryBar->showTab("Documents"); } void LauncherTabWidget::appMessage(const QCString& message, const QByteArray&) { if ( message == "nextView()" ) - categoryBar->nextTab(); + categoryBar->nextTab(); } void LauncherTabWidget::raiseTabWidget() { if ( categoryBar->currentView() == docView() - && docLoadingWidgetEnabled ) { - stack->raiseWidget( docLoadingWidget ); - docLoadingWidget->updateGeometry(); + && docLoadingWidgetEnabled ) { + stack->raiseWidget( docLoadingWidget ); + docLoadingWidget->updateGeometry(); } else { - stack->raiseWidget( categoryBar->currentView() ); + stack->raiseWidget( categoryBar->currentView() ); } } void LauncherTabWidget::tabProperties() { LauncherView *view = categoryBar->currentView(); QPopupMenu *m = new QPopupMenu( this ); m->insertItem( tr("Icon View"), LauncherView::Icon ); m->insertItem( tr("List View"), LauncherView::List ); m->setItemChecked( (int)view->viewMode(), TRUE ); int rv = m->exec( QCursor::pos() ); if ( rv >= 0 && rv != view->viewMode() ) { - view->setViewMode( (LauncherView::ViewMode)rv ); + view->setViewMode( (LauncherView::ViewMode)rv ); } delete m; } void LauncherTabWidget::deleteView( const QString& id ) { LauncherTab *t = categoryBar->launcherTab(id); if ( t ) { - stack->removeWidget( t->view ); - delete t->view; - categoryBar->removeTab( t ); + stack->removeWidget( t->view ); + delete t->view; + categoryBar->removeTab( t ); } } LauncherView* LauncherTabWidget::newView( const QString& id, const QPixmap& pm, const QString& label ) { LauncherView* view = new LauncherView( stack ); connect( view, SIGNAL(clicked(const AppLnk*)), - this, SIGNAL(clicked(const AppLnk*))); + this, SIGNAL(clicked(const AppLnk*))); connect( view, SIGNAL(rightPressed(AppLnk*)), - this, SIGNAL(rightPressed(AppLnk*))); + this, SIGNAL(rightPressed(AppLnk*))); int n = categoryBar->count(); stack->addWidget( view, n ); LauncherTab *tab = new LauncherTab( id, view, pm, label ); categoryBar->insertTab( tab, n-1 ); if ( id == "Documents" ) - docview = view; + docview = view; odebug << "inserting " << id << " at " << n-1 << "" << oendl; Config cfg("Launcher"); setTabAppearance( tab, cfg ); cfg.setGroup( "GUI" ); view->setBusyIndicatorType( cfg.readEntry( "BusyType", QString::null ) ); return view; } LauncherView *LauncherTabWidget::view( const QString &id ) { LauncherTab *t = categoryBar->launcherTab(id); if ( !t ) - return 0; + return 0; return t->view; } LauncherView *LauncherTabWidget::docView() { return docview; } void LauncherTabWidget::setLoadingWidgetEnabled( bool v ) { if ( v != docLoadingWidgetEnabled && docLoadingWidget ) { - docLoadingWidgetEnabled = v; - raiseTabWidget(); + docLoadingWidgetEnabled = v; + raiseTabWidget(); } } void LauncherTabWidget::setLoadingProgress( int percent ) { docLoadingWidgetProgress->setProgress( (percent / 4) * 4 ); } // ### this function could more to LauncherView void LauncherTabWidget::setTabViewAppearance( LauncherView *v, Config &cfg ) { // View QString view = cfg.readEntry( "View", "Icon" ); if ( view == "List" ) // No tr - v->setViewMode( LauncherView::List ); + v->setViewMode( LauncherView::List ); QString bgType = cfg.readEntry( "BackgroundType", "Image" ); if ( bgType == "Image" ) { // No tr - QString pm = cfg.readEntry( "BackgroundImage", "launcher/opie-background" ); - v->setBackgroundType( LauncherView::Image, pm ); + QString pm = cfg.readEntry( "BackgroundImage", "launcher/opie-background" ); + v->setBackgroundType( LauncherView::Image, pm ); } else if ( bgType == "SolidColor" ) { - QString c = cfg.readEntry( "BackgroundColor" ); - v->setBackgroundType( LauncherView::SolidColor, c ); + QString c = cfg.readEntry( "BackgroundColor" ); + v->setBackgroundType( LauncherView::SolidColor, c ); } else { - v->setBackgroundType( LauncherView::Ruled, QString::null ); + v->setBackgroundType( LauncherView::Ruled, QString::null ); } QString textCol = cfg.readEntry( "TextColor" ); if ( textCol.isEmpty() ) - v->setTextColor( QColor() ); + v->setTextColor( QColor() ); else - v->setTextColor( QColor(textCol) ); + v->setTextColor( QColor(textCol) ); // bool customFont = cfg.readBoolEntry( "CustomFont", FALSE ); QStringList font = cfg.readListEntry( "Font", ',' ); if ( font.count() == 4 ) v->setViewFont( QFont(font[0], font[1].toInt(), font[2].toInt(), font[3].toInt()!=0) ); // ### FIXME TabColor TabTextColor } // ### Could move to LauncherTab void LauncherTabWidget::setTabAppearance( LauncherTab *tab, Config &cfg ) { cfg.setGroup( QString( "Tab %1" ).arg(tab->type) ); // No tr setTabViewAppearance( tab->view, cfg ); // Tabs QString tabCol = cfg.readEntry( "TabColor" ); if ( tabCol.isEmpty() ) - tab->bgColor = QColor(); + tab->bgColor = QColor(); else - tab->bgColor = QColor(tabCol); + tab->bgColor = QColor(tabCol); QString tabTextCol = cfg.readEntry( "TabTextColor" ); if ( tabTextCol.isEmpty() ) - tab->fgColor = QColor(); + tab->fgColor = QColor(); else - tab->fgColor = QColor(tabTextCol); + tab->fgColor = QColor(tabTextCol); } void LauncherTabWidget::paletteChange( const QPalette &p ) { QVBox::paletteChange( p ); QPalette pal = palette(); pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) ); pal.setColor( QColorGroup::Background, pal.active().background().light(110) ); categoryBar->setPalette( pal ); categoryBar->update(); } void LauncherTabWidget::styleChange( QStyle & ) { QTimer::singleShot( 0, this, SLOT(setProgressStyle()) ); } void LauncherTabWidget::setProgressStyle() { if (docLoadingWidgetProgress) { - docLoadingWidgetProgress->setFrameShape( QProgressBar::Box ); - docLoadingWidgetProgress->setFrameShadow( QProgressBar::Plain ); - docLoadingWidgetProgress->setMargin( 1 ); - docLoadingWidgetProgress->setLineWidth( 1 ); + docLoadingWidgetProgress->setFrameShape( QProgressBar::Box ); + docLoadingWidgetProgress->setFrameShadow( QProgressBar::Plain ); + docLoadingWidgetProgress->setMargin( 1 ); + docLoadingWidgetProgress->setLineWidth( 1 ); } } void LauncherTabWidget::setBusy(bool on) { if ( on ) - currentView()->setBusy(TRUE); + currentView()->setBusy(TRUE); else { - for ( int i = 0; i < categoryBar->count(); i++ ) { - LauncherView *view = ((LauncherTab *)categoryBar->tab(i))->view; - view->setBusy( FALSE ); - } + for ( int i = 0; i < categoryBar->count(); i++ ) { + LauncherView *view = ((LauncherTab *)categoryBar->tab(i))->view; + view->setBusy( FALSE ); + } } } void LauncherTabWidget::setBusyIndicatorType( const QString& str ) { for (int i = 0; i < categoryBar->count(); i++ ) { LauncherView* view = static_cast<LauncherTab*>( categoryBar->tab(i) )->view; view->setBusyIndicatorType( str ); } } LauncherView *LauncherTabWidget::currentView(void) { return (LauncherView*)stack->visibleWidget(); } void LauncherTabWidget::launcherMessage( const QCString &msg, const QByteArray &data) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "setTabView(QString,int)" ) { - QString id; - stream >> id; - int mode; - stream >> mode; - if ( view(id) ) - view(id)->setViewMode( (LauncherView::ViewMode)mode ); + QString id; + stream >> id; + int mode; + stream >> mode; + if ( view(id) ) + view(id)->setViewMode( (LauncherView::ViewMode)mode ); } else if ( msg == "setTabBackground(QString,int,QString)" ) { - QString id; - stream >> id; - int mode; - stream >> mode; - QString pixmapOrColor; - stream >> pixmapOrColor; - if ( view(id) ) - view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); - if ( id == "Documents" ) - docLoadingWidget->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); + QString id; + stream >> id; + int mode; + stream >> mode; + QString pixmapOrColor; + stream >> pixmapOrColor; + if ( view(id) ) + view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); + if ( id == "Documents" ) + docLoadingWidget->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor ); } else if ( msg == "setTextColor(QString,QString)" ) { - QString id; - stream >> id; - QString color; - stream >> color; - if ( view(id) ) - view(id)->setTextColor( QColor(color) ); - if ( id == "Documents" ) - docLoadingWidget->setTextColor( QColor(color) ); + QString id; + stream >> id; + QString color; + stream >> color; + if ( view(id) ) + view(id)->setTextColor( QColor(color) ); + if ( id == "Documents" ) + docLoadingWidget->setTextColor( QColor(color) ); } else if ( msg == "setFont(QString,QString,int,int,int)" ) { - QString id; - stream >> id; - QString fam; - stream >> fam; - int size; - stream >> size; - int weight; - stream >> weight; - int italic; - stream >> italic; - if ( view(id) ) { - if ( !fam.isEmpty() ) { - view(id)->setViewFont( QFont(fam, size, weight, italic!=0) ); + QString id; + stream >> id; + QString fam; + stream >> fam; + int size; + stream >> size; + int weight; + stream >> weight; + int italic; + stream >> italic; + if ( view(id) ) { + if ( !fam.isEmpty() ) { + view(id)->setViewFont( QFont(fam, size, weight, italic!=0) ); odebug << "setFont: " << fam << ", " << size << ", " << weight << ", " << italic << "" << oendl; - } else { - view(id)->clearViewFont(); - } - } + } else { + view(id)->clearViewFont(); + } + } }else if ( msg == "setBusyIndicatorType(QString)" ) { QString type; stream >> type; setBusyIndicatorType( type ); }else if ( msg == "home()" ) { if ( isVisibleWindow( static_cast<QWidget*>(parent())->winId() ) ) { if (categoryBar) categoryBar->nextTab(); }else static_cast<QWidget*>(parent())->raise(); } } //--------------------------------------------------------------------------- Launcher::Launcher() : QMainWindow( 0, "PDA User Interface", QWidget::WStyle_Customize | QWidget::WGroupLeader ) { tabs = 0; tb = 0; Config cfg( "Launcher" ); cfg.setGroup( "DocTab" ); docTabEnabled = cfg.readBoolEntry( "Enable", true ); } void Launcher::createGUI() { setCaption( tr("Launcher") ); // we have a pretty good idea how big we'll be setGeometry( 0, 0, qApp->desktop()->width(), qApp->desktop()->height() ); tb = new TaskBar; tabs = new LauncherTabWidget( this ); setCentralWidget( tabs ); ServerInterface::dockWidget( tb, ServerInterface::Bottom ); tb->show(); qApp->installEventFilter( this ); connect( qApp, SIGNAL(symbol()), this, SLOT(toggleSymbolInput()) ); connect( qApp, SIGNAL(numLockStateToggle()), this, SLOT(toggleNumLockState()) ); connect( qApp, SIGNAL(capsLockStateToggle()), this, SLOT(toggleCapsLockState()) ); connect( tb, SIGNAL(tabSelected(const QString&)), - this, SLOT(showTab(const QString&)) ); + this, SLOT(showTab(const QString&)) ); connect( tabs, SIGNAL(selected(const QString&)), - this, SLOT(viewSelected(const QString&)) ); + this, SLOT(viewSelected(const QString&)) ); connect( tabs, SIGNAL(clicked(const AppLnk*)), - this, SLOT(select(const AppLnk*))); + this, SLOT(select(const AppLnk*))); connect( tabs, SIGNAL(rightPressed(AppLnk*)), - this, SLOT(properties(AppLnk*))); + this, SLOT(properties(AppLnk*))); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) QCopChannel* sysChannel = new QCopChannel( "QPE/System", this ); connect( sysChannel, SIGNAL(received(const QCString&,const QByteArray&)), this, SLOT(systemMessage(const QCString&,const QByteArray&)) ); #endif // all documents QImage img( Resource::loadImage( "DocsIcon" ) ); QPixmap pm; pm = img.smoothScale( AppLnk::smallIconSize(), AppLnk::smallIconSize() ); // It could add this itself if it handles docs tabs->newView("Documents", pm, tr("Documents") )->setToolsEnabled( TRUE ); QTimer::singleShot( 0, tabs, SLOT( initLayout() ) ); qApp->setMainWidget( this ); QTimer::singleShot( 500, this, SLOT( makeVisible() ) ); } Launcher::~Launcher() { if ( tb ) - destroyGUI(); + destroyGUI(); } bool Launcher::requiresDocuments() const { Config cfg( "Launcher" ); cfg.setGroup( "DocTab" ); return cfg.readBoolEntry( "Enable", true ); } void Launcher::makeVisible() { showMaximized(); } void Launcher::destroyGUI() { delete tb; tb = 0; delete tabs; tabs =0; } bool Launcher::eventFilter( QObject*, QEvent *ev ) { #ifdef QT_QWS_CUSTOM if ( ev->type() == QEvent::KeyPress ) { - QKeyEvent *ke = (QKeyEvent *)ev; - if ( ke->key() == Qt::Key_F11 ) { // menu key - QWidget *active = qApp->activeWindow(); - if ( active && active->isPopup() ) - active->close(); - else { - Global::terminateBuiltin("calibrate"); // No tr - tb->launchStartMenu(); - } - return TRUE; - } + QKeyEvent *ke = (QKeyEvent *)ev; + if ( ke->key() == Qt::Key_F11 ) { // menu key + QWidget *active = qApp->activeWindow(); + if ( active && active->isPopup() ) + active->close(); + else { + Global::terminateBuiltin("calibrate"); // No tr + tb->launchStartMenu(); + } + return TRUE; + } } #else Q_UNUSED(ev); #endif return FALSE; } void Launcher::toggleSymbolInput() { tb->toggleSymbolInput(); } void Launcher::toggleNumLockState() { tb->toggleNumLockState(); } void Launcher::toggleCapsLockState() { tb->toggleCapsLockState(); } static bool isVisibleWindow(int wid) { #ifdef Q_WS_QWS const QList<QWSWindow> &list = qwsServer->clientWindows(); QWSWindow* w; for (QListIterator<QWSWindow> it(list); (w=it.current()); ++it) { - if ( w->winId() == wid ) - return !w->isFullyObscured(); + if ( w->winId() == wid ) + return !w->isFullyObscured(); } #endif return FALSE; } void Launcher::viewSelected(const QString& s) { setCaption( s + tr(" - Launcher") ); } void Launcher::showTab(const QString& id) { tabs->categoryBar->showTab(id); raise(); } void Launcher::select( const AppLnk *appLnk ) { if ( appLnk->type() == "Folder" ) { // No tr - // Not supported: flat is simpler for the user + // Not supported: flat is simpler for the user } else { - if ( appLnk->exec().isNull() ) { - int i = QMessageBox::information(this,tr("No application"), - tr("<p>No application is defined for this document." - "<p>Type is %1.").arg(appLnk->type()), tr("OK"), tr("View as text"), 0, 0, 1); + if ( appLnk->exec().isNull() ) { + int i = QMessageBox::information(this,tr("No application"), + tr("<p>No application is defined for this document." + "<p>Type is %1.").arg(appLnk->type()), tr("OK"), tr("View as text"), 0, 0, 1); /* ### Fixme */ - if ( i == 1 ) - Global::execute("textedit",appLnk->file()); - - return; - } - tabs->setBusy(TRUE); - emit executing( appLnk ); - appLnk->execute(); + if ( i == 1 ) + Global::execute("textedit",appLnk->file()); + + return; + } + tabs->setBusy(TRUE); + emit executing( appLnk ); + appLnk->execute(); } } void Launcher::properties( AppLnk *appLnk ) { if ( appLnk->type() == "Folder" ) { // No tr - // Not supported: flat is simpler for the user + // Not supported: flat is simpler for the user } else { /* ### libqtopia FIXME also moving docLnks... */ - LnkProperties prop(appLnk,0 ); + LnkProperties prop(appLnk,0 ); - QPEApplication::execDialog( &prop ); + QPEApplication::execDialog( &prop ); } } void Launcher::storageChanged( const QList<FileSystem> &fs ) { // ### update combo boxes if we had a combo box for the storage type } void Launcher::systemMessage( const QCString &msg, const QByteArray &data) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "busy()" ) { - tb->startWait(); + tb->startWait(); } else if ( msg == "notBusy(QString)" ) { - QString app; - stream >> app; - tabs->setBusy(FALSE); - tb->stopWait(app); + QString app; + stream >> app; + tabs->setBusy(FALSE); + tb->stopWait(app); } else if (msg == "applyStyle()") { - tabs->currentView()->relayout(); + tabs->currentView()->relayout(); } } // These are the update functions from the server void Launcher::typeAdded( const QString& type, const QString& name, - const QPixmap& pixmap, const QPixmap& ) + const QPixmap& pixmap, const QPixmap& ) { tabs->newView( type, pixmap, name ); ids.append( type ); /* this will be called in applicationScanningProgress with value 100! */ // tb->refreshStartMenu(); static bool first = TRUE; if ( first ) { - first = FALSE; + first = FALSE; tabs->categoryBar->showTab(type); } tabs->view( type )->setUpdatesEnabled( FALSE ); tabs->view( type )->setSortEnabled( FALSE ); } void Launcher::typeRemoved( const QString& type ) { tabs->view( type )->removeAllItems(); tabs->deleteView( type ); ids.remove( type ); /* this will be called in applicationScanningProgress with value 100! */ // tb->refreshStartMenu(); } void Launcher::applicationAdded( const QString& type, const AppLnk& app ) { if ( app.type() == "Separator" ) // No tr - return; + return; LauncherView *view = tabs->view( type ); if ( view ) - view->addItem( new AppLnk( app ), FALSE ); + view->addItem( new AppLnk( app ), FALSE ); else - qWarning("addAppLnk: No view for type %s. Can't add app %s!", - type.latin1(),app.name().latin1() ); + owarn << "addAppLnk: No view for type " << type.latin1() << ". Can't add app " + << app.name().latin1() << "!", MimeType::registerApp( app ); } void Launcher::applicationRemoved( const QString& type, const AppLnk& app ) { LauncherView *view = tabs->view( type ); if ( view ) - view->removeLink( app.linkFile() ); + view->removeLink( app.linkFile() ); else owarn << "removeAppLnk: No view for " << type << "!" << oendl; } void Launcher::allApplicationsRemoved() { MimeType::clear(); for ( QStringList::ConstIterator it=ids.begin(); it!= ids.end(); ++it) - tabs->view( (*it) )->removeAllItems(); + tabs->view( (*it) )->removeAllItems(); } void Launcher::documentAdded( const DocLnk& doc ) { tabs->docView()->addItem( new DocLnk( doc ), FALSE ); } void Launcher::aboutToAddBegin() { tabs->docView()->setUpdatesEnabled( false ); } void Launcher::aboutToAddEnd() { tabs->docView()->setUpdatesEnabled( true ); } void Launcher::showLoadingDocs() { tabs->docView()->hide(); } void Launcher::showDocTab() { if ( tabs->categoryBar->currentView() == tabs->docView() ) - tabs->docView()->show(); + tabs->docView()->show(); } void Launcher::documentRemoved( const DocLnk& doc ) { tabs->docView()->removeLink( doc.linkFile() ); } void Launcher::documentChanged( const DocLnk& oldDoc, const DocLnk& newDoc ) { documentRemoved( oldDoc ); documentAdded( newDoc ); } void Launcher::allDocumentsRemoved() { tabs->docView()->removeAllItems(); } void Launcher::applicationStateChanged( const QString& name, ApplicationState state ) { tb->setApplicationState( name, state ); } void Launcher::applicationScanningProgress( int percent ) { switch ( percent ) { case 0: { - for ( QStringList::ConstIterator it=ids.begin(); it!= ids.end(); ++it) { - tabs->view( (*it) )->setUpdatesEnabled( FALSE ); - tabs->view( (*it) )->setSortEnabled( FALSE ); - } - break; + for ( QStringList::ConstIterator it=ids.begin(); it!= ids.end(); ++it) { + tabs->view( (*it) )->setUpdatesEnabled( FALSE ); + tabs->view( (*it) )->setSortEnabled( FALSE ); + } + break; } case 100: { - for ( QStringList::ConstIterator it=ids.begin(); it!= ids.end(); ++it) { - tabs->view( (*it) )->setUpdatesEnabled( TRUE ); - tabs->view( (*it) )->setSortEnabled( TRUE ); - } + for ( QStringList::ConstIterator it=ids.begin(); it!= ids.end(); ++it) { + tabs->view( (*it) )->setUpdatesEnabled( TRUE ); + tabs->view( (*it) )->setSortEnabled( TRUE ); + } tb->refreshStartMenu(); - break; + break; } default: break; } } void Launcher::documentScanningProgress( int percent ) { switch ( percent ) { case 0: { - tabs->setLoadingProgress( 0 ); - tabs->setLoadingWidgetEnabled( TRUE ); - tabs->docView()->setUpdatesEnabled( FALSE ); - tabs->docView()->setSortEnabled( FALSE ); - break; + tabs->setLoadingProgress( 0 ); + tabs->setLoadingWidgetEnabled( TRUE ); + tabs->docView()->setUpdatesEnabled( FALSE ); + tabs->docView()->setSortEnabled( FALSE ); + break; } case 100: { - tabs->docView()->updateTools(); - tabs->docView()->setSortEnabled( TRUE ); - tabs->docView()->setUpdatesEnabled( TRUE ); - tabs->setLoadingWidgetEnabled( FALSE ); - break; + tabs->docView()->updateTools(); + tabs->docView()->setSortEnabled( TRUE ); + tabs->docView()->setUpdatesEnabled( TRUE ); + tabs->setLoadingWidgetEnabled( FALSE ); + break; } default: - tabs->setLoadingProgress( percent ); + tabs->setLoadingProgress( percent ); break; } } diff --git a/core/launcher/packageslave.cpp b/core/launcher/packageslave.cpp index a11ac86..0461432 100644 --- a/core/launcher/packageslave.cpp +++ b/core/launcher/packageslave.cpp @@ -1,339 +1,338 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia 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. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "packageslave.h" /* OPIE */ #include <opie2/odebug.h> #include <qtopia/qprocess.h> #ifdef Q_WS_QWS #include <qtopia/qcopenvelope_qws.h> #endif using namespace Opie::Core; /* QT */ #ifdef Q_WS_QWS #include <qcopchannel_qws.h> #endif #include <qtextstream.h> /* STD */ #include <stdlib.h> #include <sys/stat.h> // mkdir() #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) #include <unistd.h> #include <sys/vfs.h> #include <mntent.h> #elif defined(Q_OS_MACX) #include <unistd.h> #endif PackageHandler::PackageHandler( QObject *parent, char* name ) : QObject( parent, name ), packageChannel( 0 ), currentProcess( 0 ), mNoSpaceLeft( FALSE ) { // setup qcop channel #ifndef QT_NO_COP packageChannel = new QCopChannel( "QPE/Package", this ); connect( packageChannel, SIGNAL( received(const QCString&,const QByteArray&) ), - this, SLOT( qcopMessage(const QCString&,const QByteArray&) ) ); + this, SLOT( qcopMessage(const QCString&,const QByteArray&) ) ); #endif } void PackageHandler::qcopMessage( const QCString &msg, const QByteArray &data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "installPackage(QString)" ) { QString file; stream >> file; installPackage( file ); } else if ( msg == "removePackage(QString)" ) { - QString file; + QString file; stream >> file; removePackage( file ); } else if ( msg == "addPackageFiles(QString,QString)" ) { - QString location, listfile; + QString location, listfile; stream >> location >> listfile; addPackageFiles( location, listfile); } else if ( msg == "addPackages(QString)" ) { - QString location; + QString location; stream >> location; addPackages( location ); } else if ( msg == "cleanupPackageFiles(QString)" ) { - QString listfile; + QString listfile; stream >> listfile; - cleanupPackageFiles( listfile ); + cleanupPackageFiles( listfile ); } else if ( msg == "cleanupPackages(QString)" ) { - QString location; + QString location; stream >> location; cleanupPackages( location ); } else if ( msg == "prepareInstall(QString,QString)" ) { - QString size, path; - stream >> size; - stream >> path; - prepareInstall( size, path ); + QString size, path; + stream >> size; + stream >> path; + prepareInstall( size, path ); } } void PackageHandler::installPackage( const QString &package ) { if ( mNoSpaceLeft ) { - mNoSpaceLeft = FALSE; - // Don't emit that for now, I still couldn't test it (Wener) - //sendReply( "installFailed(QString)", package ); - //return; + mNoSpaceLeft = FALSE; + // Don't emit that for now, I still couldn't test it (Wener) + //sendReply( "installFailed(QString)", package ); + //return; } - + currentProcess = new QProcess( QStringList() << "ipkg" << "install" << package ); // No tr connect( currentProcess, SIGNAL( processExited() ), SLOT( iProcessExited() ) ); connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) ); connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) ); currentPackage = package; currentProcessError=""; sendReply( "installStarted(QString)", package ); currentProcess->start(); } void PackageHandler::removePackage( const QString &package ) { currentProcess = new QProcess( QStringList() << "ipkg" << "remove" << package ); // No tr connect( currentProcess, SIGNAL( processExited() ), SLOT( rmProcessExited() ) ); connect( currentProcess, SIGNAL( readyReadStdout() ), SLOT( readyReadStdout() ) ); connect( currentProcess, SIGNAL( readyReadStderr() ), SLOT( readyReadStderr() ) ); currentPackage = package; currentProcessError=""; sendReply( "removeStarted(QString)", package ); currentProcess->start(); } void PackageHandler::sendReply( const QCString& msg, const QString& arg ) { #ifndef QT_NO_COP QCopEnvelope e( "QPE/Desktop", msg ); e << arg; #endif } -void PackageHandler::addPackageFiles( const QString &location, - const QString &listfile ) +void PackageHandler::addPackageFiles( const QString &location, + const QString &listfile ) { QFile f(listfile); #ifndef Q_OS_WIN32 //make a copy so we can remove the symlinks later mkdir( ("/usr/lib/ipkg/info/"+location).ascii(), 0777 ); system(("cp " + f.name() + " /usr/lib/ipkg/info/"+location).ascii()); #else QDir d; - //#### revise + //#### revise odebug << "Copy file at " << __FILE__ << ": " << __LINE__ << "" << oendl; - d.mkdir(("/usr/lib/ipkg/info/" + location).ascii()); + d.mkdir(("/usr/lib/ipkg/info/" + location).ascii()); system(("copy " + f.name() + " /usr/lib/ipkg/info/"+location).ascii()); #endif - - if ( f.open(IO_ReadOnly) ) { - QTextStream ts(&f); - QString s; - while ( !ts.eof() ) { // until end of file... - s = ts.readLine(); // line of text excluding '\n' - // for s, do link/mkdir. - if ( s.right(1) == "/" ) { + if ( f.open(IO_ReadOnly) ) { + QTextStream ts(&f); + + QString s; + while ( !ts.eof() ) { // until end of file... + s = ts.readLine(); // line of text excluding '\n' + // for s, do link/mkdir. + if ( s.right(1) == "/" ) { odebug << "do mkdir for " << s.ascii() << "" << oendl; #ifndef Q_OS_WIN32 - mkdir( s.ascii(), 0777 ); - //possible optimization: symlink directories - //that don't exist already. -- Risky. + mkdir( s.ascii(), 0777 ); + //possible optimization: symlink directories + //that don't exist already. -- Risky. #else - d.mkdir( s.ascii()); + d.mkdir( s.ascii()); #endif - } else { + } else { #ifndef Q_OS_WIN32 odebug << "do symlink for " << s.ascii() << "" << oendl; - symlink( (location + s).ascii(), s.ascii() ); + symlink( (location + s).ascii(), s.ascii() ); #else odebug << "Copy file instead of a symlink for WIN32" << oendl; - if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE)) - qWarning("Unable to create symlinkfor %s", - (location + s).ascii()); + if (!CopyFile((TCHAR*)qt_winTchar((location + s), TRUE), (TCHAR*)qt_winTchar(s, TRUE), FALSE)) + owarn << "Unable to create symlinkfor " << (location + s).ascii() << oendl; #endif - } - } - f.close(); - } + } + } + f.close(); + } } void PackageHandler::addPackages( const QString &location ) { // get list of *.list in location/usr/lib/ipkg/info/*.list QDir dir(location + "/usr/lib/ipkg/info", "*.list", // No tr - QDir::Name, QDir::Files); + QDir::Name, QDir::Files); if ( !dir.exists() ) - return; - + return; + QStringList packages = dir.entryList(); for ( QStringList::Iterator it = packages.begin(); - it != packages.end(); ++it ) { - addPackageFiles( location, *it ); + it != packages.end(); ++it ) { + addPackageFiles( location, *it ); } } void PackageHandler::cleanupPackageFiles( const QString &listfile ) { QFile f(listfile); - - if ( f.open(IO_ReadOnly) ) { - QTextStream ts(&f); - - QString s; - while ( !ts.eof() ) { // until end of file... - s = ts.readLine(); // line of text excluding '\n' - // for s, do link/mkdir. - if ( s.right(1) == "/" ) { - //should rmdir if empty, after all files have been removed - } else { + + if ( f.open(IO_ReadOnly) ) { + QTextStream ts(&f); + + QString s; + while ( !ts.eof() ) { // until end of file... + s = ts.readLine(); // line of text excluding '\n' + // for s, do link/mkdir. + if ( s.right(1) == "/" ) { + //should rmdir if empty, after all files have been removed + } else { #ifndef Q_OS_WIN32 odebug << "remove symlink for " << s.ascii() << "" << oendl; - //check if it is a symlink first (don't remove /etc/passwd...) - char buf[10]; //we don't care about the contents - if ( ::readlink( s.ascii(),buf, 10 >= 0 ) ) - ::unlink( s.ascii() ); -#else - // ### revise + //check if it is a symlink first (don't remove /etc/passwd...) + char buf[10]; //we don't care about the contents + if ( ::readlink( s.ascii(),buf, 10 >= 0 ) ) + ::unlink( s.ascii() ); +#else + // ### revise owarn << "Unable to remove symlink " << __FILE__ << ":" << __LINE__ << "" << oendl; #endif - } - } - f.close(); + } + } + f.close(); //remove the list file - ::unlink( listfile.ascii() ); - - } + ::unlink( listfile.ascii() ); + + } } void PackageHandler::cleanupPackages( const QString &location ) { // get list of *.list in location/usr/lib/ipkg/info/*.list QDir dir( "/usr/lib/ipkg/info/"+location, "*.list", // No tr - QDir::Name, QDir::Files); + QDir::Name, QDir::Files); if ( !dir.exists() ) - return; - + return; + QStringList packages = dir.entryList(); for ( QStringList::Iterator it = packages.begin(); - it != packages.end(); ++it ) { - cleanupPackageFiles( *it ); + it != packages.end(); ++it ) { + cleanupPackageFiles( *it ); } - - //remove the backup directory + + //remove the backup directory //### } void PackageHandler::prepareInstall( const QString& size, const QString& path ) { // Check whether there will be enough space to install the next package. bool ok; unsigned int s = size.toUInt( &ok ); - + if ( !ok ) - return; + return; // Shamelessly stolen from the sysinfo application (Werner) #if defined(_OS_LINUX_) || defined(Q_OS_LINUX) struct statfs fs; if ( statfs( path.latin1(), &fs ) == 0 ) - if ( s > fs.f_bsize * fs.f_bavail ) { + if ( s > fs.f_bsize * fs.f_bavail ) { //odebug << "############### Not enough space left ###############" << oendl; - mNoSpaceLeft = TRUE; - } + mNoSpaceLeft = TRUE; + } #endif } void PackageHandler::iProcessExited() { if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 ) - sendReply( "installDone(QString)", currentPackage ); + sendReply( "installDone(QString)", currentPackage ); else { #ifndef QT_NO_COP - QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" ); - e << currentPackage << currentProcess->exitStatus() - << currentProcessError; + QCopEnvelope e( "QPE/Desktop", "installFailed(QString,int,QString)" ); + e << currentPackage << currentProcess->exitStatus() + << currentProcessError; #endif } - + delete currentProcess; currentProcess = 0; #ifndef QT_NO_COP QCopEnvelope e("QPE/System", "linkChanged(QString)"); QString lf = QString::null; e << lf; #endif unlink( currentPackage ); } void PackageHandler::rmProcessExited() { if ( currentProcess->normalExit() && currentProcess->exitStatus() == 0 ) - sendReply( "removeDone(QString)", currentPackage ); + sendReply( "removeDone(QString)", currentPackage ); else - sendReply( "removeFailed(QString)", currentPackage ); + sendReply( "removeFailed(QString)", currentPackage ); #ifndef QT_NO_COP QCopEnvelope e("QPE/System", "linkChanged(QString)"); QString lf = QString::null; e << lf; #endif } void PackageHandler::readyReadStdout() { while ( currentProcess->canReadLineStdout() ) { - QString line = currentProcess->readLineStdout(); - currentProcessError.append("OUT:"+line); - if ( line.contains( "Unpacking" ) ) // No tr - sendReply( "installStep(QString)", "one" ); // No tr - else if ( line.contains( "Configuring" ) ) // No tr - sendReply( "installStep(QString)", "two" ); // No tr + QString line = currentProcess->readLineStdout(); + currentProcessError.append("OUT:"+line); + if ( line.contains( "Unpacking" ) ) // No tr + sendReply( "installStep(QString)", "one" ); // No tr + else if ( line.contains( "Configuring" ) ) // No tr + sendReply( "installStep(QString)", "two" ); // No tr } } void PackageHandler::readyReadStderr() { while ( currentProcess->canReadLineStderr() ) { - QString line = currentProcess->readLineStderr(); - currentProcessError.append("ERR:"+line); + QString line = currentProcess->readLineStderr(); + currentProcessError.append("ERR:"+line); } } void PackageHandler::redoPackages() { //get list of filesystems //call cleanupPackages for the ones that have disappeared //call addPackageFiles for the new ones } diff --git a/core/launcher/transferserver.cpp b/core/launcher/transferserver.cpp index c3f936e..1d4ca40 100644 --- a/core/launcher/transferserver.cpp +++ b/core/launcher/transferserver.cpp @@ -1095,130 +1095,129 @@ ServerDTP::ServerDTP( QObject *parent, const char* name) ServerDTP::~ServerDTP() { buf.close(); if ( RetrieveFile == mode && file.isOpen() ) { // We're being shutdown before the client closed. file.close(); if ( recvFileSize >= 0 && (int)file.size() != recvFileSize ) { odebug << "STOR incomplete" << oendl; file.remove(); } } else { file.close(); } createTargzProc->kill(); } void ServerDTP::extractTarDone() { odebug << "extract done" << oendl; #ifndef QT_NO_COP QCopEnvelope e( "QPE/System", "restoreDone(QString)" ); e << file.name(); #endif } void ServerDTP::connected() { // send file mode switch ( mode ) { case SendFile : if ( !file.exists() || !file.open( IO_ReadOnly) ) { emit failed(); mode = Idle; return; } //odebug << "Debug: Sending file '" << file.name() << "'" << oendl; bytes_written = 0; if ( file.size() == 0 ) { //make sure it doesn't hang on empty files file.close(); emit completed(); mode = Idle; } else { // Don't write more if there is plenty buffered already. if ( bytesToWrite() <= block_size && !file.atEnd() ) { QCString s; s.resize( block_size ); int bytes = file.readBlock( s.data(), block_size ); writeBlock( s.data(), bytes ); } } break; case SendGzipFile: if ( createTargzProc->isRunning() ) { // SHOULDN'T GET HERE, BUT DOING A SAFETY CHECK ANYWAY owarn << "Previous tar --gzip process is still running; killing it..." << oendl; createTargzProc->kill(); } bytes_written = 0; odebug << "==>start send tar process" << oendl; if ( !createTargzProc->start() ) - qWarning("Error starting %s", - createTargzProc->arguments().join(" ").latin1()); + owarn << "Error starting " << createTargzProc->arguments().join(" ").latin1() << oendl; break; case SendBuffer: if ( !buf.open( IO_ReadOnly) ) { emit failed(); mode = Idle; return; } // odebug << "Debug: Sending byte array" << oendl; bytes_written = 0; while( !buf.atEnd() ) putch( buf.getch() ); buf.close(); break; case RetrieveFile: // retrieve file mode if ( file.exists() && !file.remove() ) { emit failed(); mode = Idle; return; } if ( !file.open( IO_WriteOnly) ) { emit failed(); mode = Idle; return; } // odebug << "Debug: Retrieving file " << file.name() << "" << oendl; break; case RetrieveGzipFile: odebug << "=-> starting tar process to receive .tgz file" << oendl; break; case RetrieveBuffer: // retrieve buffer mode if ( !buf.open( IO_WriteOnly) ) { emit failed(); mode = Idle; return; } // odebug << "Debug: Retrieving byte array" << oendl; break; case Idle: odebug << "connection established but mode set to Idle; BUG!" << oendl; break; } } void ServerDTP::connectionClosed() { //odebug << "Debug: Data connection closed " << bytes_written << " bytes written" << oendl; // send file mode if ( SendFile == mode ) { if ( bytes_written == file.size() ) emit completed(); else emit failed(); } // send buffer mode else if ( SendBuffer == mode ) { if ( bytes_written == buf.size() ) emit completed(); else diff --git a/core/obex/obex.cc b/core/obex/obex.cc index 3c99af6..7c40b90 100644 --- a/core/obex/obex.cc +++ b/core/obex/obex.cc @@ -1,200 +1,205 @@ +#include "obex.h" + +/* OPIE */ +#include <opie2/oprocess.h> +#include <opie2/odebug.h> + +/* QT */ #include <qfileinfo.h> -#include <opie2/oprocess.h> -#include "obex.h" using namespace OpieObex; using namespace Opie::Core; /* TRANSLATOR OpieObex::Obex */ Obex::Obex( QObject *parent, const char* name ) : QObject(parent, name ) { m_rec = 0; m_send=0; m_count = 0; m_receive = false; connect( this, SIGNAL(error(int) ), // for recovering to receive SLOT(slotError() ) ); connect( this, SIGNAL(sent(bool) ), SLOT(slotError() ) ); }; Obex::~Obex() { delete m_rec; delete m_send; } void Obex::receive() { m_receive = true; m_outp = QString::null; - qWarning("Receive" ); + owarn << "Receive" << oendl; m_rec = new OProcess(); *m_rec << "irobex_palm3"; // connect to the necessary slots connect(m_rec, SIGNAL(processExited(Opie::Core::OProcess*) ), this, SLOT(slotExited(Opie::Core::OProcess*) ) ); connect(m_rec, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int ) ), this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); if(!m_rec->start(OProcess::NotifyOnExit, OProcess::AllOutput) ) { - qWarning("could not start :("); + owarn << "could not start :(" oendl; emit done( false ); delete m_rec; m_rec = 0; } // emit currentTry(m_count ); } void Obex::send( const QString& fileName) { // if currently receiving stop it send receive m_count = 0; m_file = fileName; - qWarning("send %s", fileName.latin1() ); + owarn << "send " << fileName.latin1() << oendl; if (m_rec != 0 ) { - qWarning("running"); + owarn << "running" oendl; if (m_rec->isRunning() ) { emit error(-1 ); - qWarning("is running"); + owarn << "is running" << oendl; delete m_rec; m_rec = 0; }else{ - qWarning("is not running"); + owarn << "is not running" << oendl; emit error( -1 ); // we did not delete yet but it's not running slotExited is pending return; } } sendNow(); } void Obex::sendNow(){ - qWarning("sendNow"); + owarn << "sendNow" << oendl; if ( m_count >= 25 ) { // could not send emit error(-1 ); emit sent(false); return; } // OProcess inititialisation m_send = new OProcess(); *m_send << "irobex_palm3"; *m_send << QFile::encodeName(m_file); // connect to slots Exited and and StdOut connect(m_send, SIGNAL(processExited(Opie::Core::OProcess*) ), this, SLOT(slotExited(Opie::Core::OProcess*)) ); connect(m_send, SIGNAL(receivedStdout(Opie::Core::OProcess*, char*, int )), this, SLOT(slotStdOut(Opie::Core::OProcess*, char*, int) ) ); // now start it if (!m_send->start(/*OProcess::NotifyOnExit, OProcess::AllOutput*/ ) ) { - qWarning("could not send" ); + owarn << "could not send" << oendl; m_count = 25; emit error(-1 ); delete m_send; m_send=0; } // end m_count++; emit currentTry( m_count ); } void Obex::slotExited(OProcess* proc ){ if (proc == m_rec ) { // receive process received(); }else if ( proc == m_send ) { sendEnd(); } } void Obex::slotStdOut(OProcess* proc, char* buf, int len){ if ( proc == m_rec ) { // only receive QByteArray ar( len ); memcpy( ar.data(), buf, len ); - qWarning("parsed: %s", ar.data() ); + owarn << "parsed: " << ar.data() << oendl; m_outp.append( ar ); } } void Obex::received() { if (m_rec->normalExit() ) { if ( m_rec->exitStatus() == 0 ) { // we got one QString filename = parseOut(); - qWarning("ACHTUNG %s", filename.latin1() ); + owarn << "ACHTUNG " << filename.latin1() << oendl; emit receivedFile( filename ); } }else{ emit done(false); }; delete m_rec; m_rec = 0; receive(); } void Obex::sendEnd() { if (m_send->normalExit() ) { if ( m_send->exitStatus() == 0 ) { delete m_send; m_send=0; - qWarning("done" ); + owarn << "done" << oendl; emit sent(true); }else if (m_send->exitStatus() == 255 ) { // it failed maybe the other side wasn't ready // let's try it again delete m_send; m_send = 0; - qWarning("try sending again" ); + owarn << "try sending again" << oendl; sendNow(); } }else { emit error( -1 ); delete m_send; m_send = 0; } } QString Obex::parseOut( ){ QString path; QStringList list = QStringList::split("\n", m_outp); QStringList::Iterator it; for (it = list.begin(); it != list.end(); ++it ) { if ( (*it).startsWith("Wrote" ) ) { int pos = (*it).findRev('(' ); if ( pos > 0 ) { - qWarning( "%d %s", pos, (*it).mid(6 ).latin1() ) ; - qWarning("%d %d", (*it).length(), (*it).length()-pos ); + owarn << pos << " " << (*it).mid(6 ).latin1() << oendl; + owarn << (*it).length() << " " << (*it).length()-pos << oendl; path = (*it).remove( pos, (*it).length() - pos ); - qWarning("%s", path.latin1() ); + owarn << path.latin1() << oendl; path = path.mid(6 ); path = path.stripWhiteSpace(); - qWarning("path %s", path.latin1() ); + owarn << "path " << path.latin1() << oendl; } } } return path; } /** * when sent is done slotError is called we will start receive again */ void Obex::slotError() { - qWarning("slotError"); + owarn << "slotError" << oendl; if ( m_receive ) receive(); }; void Obex::setReceiveEnabled( bool receive ) { if ( !receive ) { // m_receive = false; shutDownReceive(); } } void Obex::shutDownReceive() { if (m_rec != 0 ) { - qWarning("running"); + owarn << "running" << oendl; if (m_rec->isRunning() ) { emit error(-1 ); - qWarning("is running"); + owarn << "is running" << oendl; delete m_rec; m_rec = 0; } } } diff --git a/core/opie-login/loginapplication.cpp b/core/opie-login/loginapplication.cpp index 1facf2d..764b24b 100644 --- a/core/opie-login/loginapplication.cpp +++ b/core/opie-login/loginapplication.cpp @@ -1,281 +1,288 @@ /* =. This file is part of the OPIE Project .=l. Copyright (c) 2002 Robert Griebl <sandman@handhelds.org> .>+-= _;:, .> :=|. This file is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU 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 file 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 General ..}^=.= = ; Public License for more details. ++= -. .` .: : = ...= . :.=- You should have received a copy of the GNU -. .:....=;==+<; General Public License along with this file; -_. . . )=. = see the file COPYING. If not, write to the -- :-=` Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include "loginapplication.h" + +/* OPIE */ +#include <opie2/odebug.h> + +/* QT */ + +/* STD */ #include <pwd.h> #include <grp.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <sys/stat.h> #include <sys/wait.h> #ifdef USEPAM extern "C" { #include <security/pam_appl.h> } #else #include <crypt.h> #include <shadow.h> #endif -#include "loginapplication.h" LoginApplication *lApp; LoginApplication::LoginApplication ( int &argc, char **argv, pid_t parentpid ) - : QPEApplication ( argc, argv, GuiServer ) + : QPEApplication ( argc, argv, GuiServer ) { - lApp = this; - m_parentpid = parentpid; + lApp = this; + m_parentpid = parentpid; } const char *LoginApplication::s_username = 0; #ifdef USEPAM const char *LoginApplication::s_pam_password = 0; int LoginApplication::pam_helper ( int num_msg, const struct pam_message **msg, struct pam_response **resp, void * ) { - int replies = 0; - struct pam_response *reply = 0; - int size = sizeof( struct pam_response ); - - for ( int i = 0; i < num_msg; i++ ) { - switch ( msg [i]-> msg_style ) { - case PAM_PROMPT_ECHO_ON: // user name given to PAM already - return PAM_CONV_ERR; - - case PAM_PROMPT_ECHO_OFF: // wants password - reply = (struct pam_response *) ::realloc ( reply, size ); - if ( !reply ) - return PAM_CONV_ERR; - size += sizeof( struct pam_response ); - - reply [replies]. resp_retcode = PAM_SUCCESS; - reply [replies]. resp = ::strdup ( s_pam_password ); - replies++; // PAM frees resp - break; - - case PAM_TEXT_INFO: - break; - - default: - /* unknown or PAM_ERROR_MSG */ - if ( reply ) - ::free ( reply ); - return PAM_CONV_ERR; - } - } - if ( reply ) - *resp = reply; - return PAM_SUCCESS; + int replies = 0; + struct pam_response *reply = 0; + int size = sizeof( struct pam_response ); + + for ( int i = 0; i < num_msg; i++ ) { + switch ( msg [i]-> msg_style ) { + case PAM_PROMPT_ECHO_ON: // user name given to PAM already + return PAM_CONV_ERR; + + case PAM_PROMPT_ECHO_OFF: // wants password + reply = (struct pam_response *) ::realloc ( reply, size ); + if ( !reply ) + return PAM_CONV_ERR; + size += sizeof( struct pam_response ); + + reply [replies]. resp_retcode = PAM_SUCCESS; + reply [replies]. resp = ::strdup ( s_pam_password ); + replies++; // PAM frees resp + break; + + case PAM_TEXT_INFO: + break; + + default: + /* unknown or PAM_ERROR_MSG */ + if ( reply ) + ::free ( reply ); + return PAM_CONV_ERR; + } + } + if ( reply ) + *resp = reply; + return PAM_SUCCESS; } bool LoginApplication::checkPassword ( const char *user, const char *pass ) { - static struct pam_conv conv = { &LoginApplication::pam_helper, 0 }; - - int pam_error; - pam_handle_t *pamh = 0; - - pam_error = ::pam_start( "xdm", user, &conv, &pamh ); - if ( pam_error == PAM_SUCCESS ) { - s_pam_password = pass; - pam_error = ::pam_authenticate ( pamh, 0 ); - s_pam_password = 0; - } - ::pam_end ( pamh, pam_error ); - return ( pam_error == PAM_SUCCESS ); + static struct pam_conv conv = { &LoginApplication::pam_helper, 0 }; + + int pam_error; + pam_handle_t *pamh = 0; + + pam_error = ::pam_start( "xdm", user, &conv, &pamh ); + if ( pam_error == PAM_SUCCESS ) { + s_pam_password = pass; + pam_error = ::pam_authenticate ( pamh, 0 ); + s_pam_password = 0; + } + ::pam_end ( pamh, pam_error ); + return ( pam_error == PAM_SUCCESS ); } #else bool LoginApplication::checkPassword ( const char *user, const char *pass ) { - char *encrypted, *correct; - struct passwd *pw; + char *encrypted, *correct; + struct passwd *pw; - if ( !user || !pass ) - return false; + if ( !user || !pass ) + return false; - pw = ::getpwnam ( user ); + pw = ::getpwnam ( user ); - if ( !pw ) - return false; + if ( !pw ) + return false; - if (( ::strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( ::strcmp ( pw-> pw_passwd, "*" ) == 0 )) { - struct spwd *sp = ::getspnam ( pw-> pw_name ); + if (( ::strcmp ( pw-> pw_passwd, "x" ) == 0 ) || ( ::strcmp ( pw-> pw_passwd, "*" ) == 0 )) { + struct spwd *sp = ::getspnam ( pw-> pw_name ); - if ( !sp ) - return false; + if ( !sp ) + return false; - correct = sp-> sp_pwdp; - } - else - correct = pw-> pw_passwd; + correct = sp-> sp_pwdp; + } + else + correct = pw-> pw_passwd; - if ( correct == 0 || correct[0] == '\0' ) - return true; + if ( correct == 0 || correct[0] == '\0' ) + return true; - encrypted = ::crypt ( pass, correct ); - return ( ::strcmp ( encrypted, correct ) == 0 ); + encrypted = ::crypt ( pass, correct ); + return ( ::strcmp ( encrypted, correct ) == 0 ); } #endif bool LoginApplication::changeIdentity ( ) { - const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin"; - const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin"; - - if ( !s_username ) - return false; - struct passwd *pw = ::getpwnam ( s_username ); - if ( !pw ) - return false; - - // we are still root at this point - try to run the pre-session script - if ( !runRootScript ( "OPIEDIR", "share/opie-login/pre-session", s_username )) - qWarning ( "failed to run $OPIEDIR/share/opie-login/pre-session" ); - - bool fail = false; - fail |= ( ::initgroups ( pw-> pw_name, pw-> pw_gid )); - ::endgrent ( ); - fail |= ( ::setgid ( pw-> pw_gid )); - fail |= ( ::setuid ( pw-> pw_uid )); - - fail |= ( ::chdir ( pw-> pw_dir ) && ::chdir ( "/" )); - - fail |= ( ::setenv ( "HOME", pw-> pw_dir, 1 )); - fail |= ( ::setenv ( "SHELL", pw-> pw_shell, 1 )); - fail |= ( ::setenv ( "USER", pw-> pw_name, 1 )); - fail |= ( ::setenv ( "LOGNAME", pw-> pw_name, 1 )); - fail |= ( ::setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); - - return !fail; + const char *DEFAULT_LOGIN_PATH = "/bin:/usr/bin"; + const char *DEFAULT_ROOT_LOGIN_PATH = "/usr/sbin:/bin:/usr/bin:/sbin"; + + if ( !s_username ) + return false; + struct passwd *pw = ::getpwnam ( s_username ); + if ( !pw ) + return false; + + // we are still root at this point - try to run the pre-session script + if ( !runRootScript ( "OPIEDIR", "share/opie-login/pre-session", s_username )) + owarn << "failed to run $OPIEDIR/share/opie-login/pre-session" << oendl; + + bool fail = false; + fail |= ( ::initgroups ( pw-> pw_name, pw-> pw_gid )); + ::endgrent ( ); + fail |= ( ::setgid ( pw-> pw_gid )); + fail |= ( ::setuid ( pw-> pw_uid )); + + fail |= ( ::chdir ( pw-> pw_dir ) && ::chdir ( "/" )); + + fail |= ( ::setenv ( "HOME", pw-> pw_dir, 1 )); + fail |= ( ::setenv ( "SHELL", pw-> pw_shell, 1 )); + fail |= ( ::setenv ( "USER", pw-> pw_name, 1 )); + fail |= ( ::setenv ( "LOGNAME", pw-> pw_name, 1 )); + fail |= ( ::setenv ( "PATH", ( pw-> pw_uid ? DEFAULT_LOGIN_PATH : DEFAULT_ROOT_LOGIN_PATH ), 1 )); + + return !fail; } bool LoginApplication::login ( ) { - execUserScript ( "HOME", ".opie-session" ); - execUserScript ( "OPIEDIR", "share/opie-login/opie-session" ); - execUserScript ( "OPIEDIR", "bin/qpe" ); - - qWarning ( "failed to start an Opie session" ); - return false; + execUserScript ( "HOME", ".opie-session" ); + execUserScript ( "OPIEDIR", "share/opie-login/opie-session" ); + execUserScript ( "OPIEDIR", "bin/qpe" ); + + owarn << "failed to start an Opie session" << oendl; + return false; } void LoginApplication::logout ( ) { - // we are now root again - try to run the post-session script - if ( !runRootScript ( "OPIEDIR", "share/opie-login/post-session" )) - qWarning ( "failed to run $OPIEDIR/scripts/post-session" ); + // we are now root again - try to run the post-session script + if ( !runRootScript ( "OPIEDIR", "share/opie-login/post-session" )) + owarn << "failed to run $OPIEDIR/scripts/post-session" << oendl; } static char *buildarg ( const char *base, const char *script ) { - const char *dir = base ? ::getenv ( base ) : "/"; - char *arg = new char [::strlen ( dir ) + ::strlen ( script ) + 2]; + const char *dir = base ? ::getenv ( base ) : "/"; + char *arg = new char [::strlen ( dir ) + ::strlen ( script ) + 2]; - ::strcpy ( arg, dir ); - ::strcat ( arg, "/" ); - ::strcat ( arg, script ); + ::strcpy ( arg, dir ); + ::strcat ( arg, "/" ); + ::strcat ( arg, script ); - return arg; + return arg; } bool LoginApplication::runRootScript ( const char *base, const char *script, const char *param ) { - bool res = false; - char *arg = buildarg ( base, script ); - - struct stat st; - if (( ::stat ( arg, &st ) == 0 ) && ( st. st_uid == 0 )) { - pid_t child = ::fork ( ); - - if ( child == 0 ) { - ::execl ( "/bin/sh", "-sh", arg, param, 0 ); - ::_exit ( -1 ); - } - else if ( child > 0 ) { - int status = 0; - - while ( ::waitpid ( child, &status, 0 ) < 0 ) { } - res = ( WIFEXITED( status )) && ( WEXITSTATUS( status ) == 0 ); - } - } - - delete [] arg; - return res; + bool res = false; + char *arg = buildarg ( base, script ); + + struct stat st; + if (( ::stat ( arg, &st ) == 0 ) && ( st. st_uid == 0 )) { + pid_t child = ::fork ( ); + + if ( child == 0 ) { + ::execl ( "/bin/sh", "-sh", arg, param, 0 ); + ::_exit ( -1 ); + } + else if ( child > 0 ) { + int status = 0; + + while ( ::waitpid ( child, &status, 0 ) < 0 ) { } + res = ( WIFEXITED( status )) && ( WEXITSTATUS( status ) == 0 ); + } + } + + delete [] arg; + return res; } void LoginApplication::execUserScript ( const char *base, const char *script ) { - char *arg = buildarg ( base, script ); - - struct stat st; - if ( ::stat ( arg, &st ) == 0 ) { - if ( st. st_mode & S_IXUSR ) - ::execl ( "/bin/sh", "-sh", "-c", arg, 0 ); - else - ::execl ( "/bin/sh", "-sh", arg, 0 ); - } + char *arg = buildarg ( base, script ); + + struct stat st; + if ( ::stat ( arg, &st ) == 0 ) { + if ( st. st_mode & S_IXUSR ) + ::execl ( "/bin/sh", "-sh", "-c", arg, 0 ); + else + ::execl ( "/bin/sh", "-sh", arg, 0 ); + } } const char *LoginApplication::loginAs ( ) { - return s_username; + return s_username; } void LoginApplication::setLoginAs ( const char *name ) { - s_username = name; + s_username = name; } QStringList LoginApplication::allUsers ( ) { - struct passwd *pwd; - QStringList sl; + struct passwd *pwd; + QStringList sl; - while (( pwd = ::getpwent ( ))) { - if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 )) - sl << QString ( pwd-> pw_name ); - } + while (( pwd = ::getpwent ( ))) { + if (( pwd-> pw_uid == 0 ) || ( pwd-> pw_uid >= 500 && pwd-> pw_uid < 65534 )) + sl << QString ( pwd-> pw_name ); + } - ::endpwent ( ); + ::endpwent ( ); - return sl; + return sl; } void LoginApplication::quitToConsole ( ) { - QPEApplication::quit ( ); - ::kill ( m_parentpid, SIGTERM ); + QPEApplication::quit ( ); + ::kill ( m_parentpid, SIGTERM ); } diff --git a/core/pim/addressbook/namelineedit.cpp b/core/pim/addressbook/namelineedit.cpp index ba16e2c..81b959b 100644 --- a/core/pim/addressbook/namelineedit.cpp +++ b/core/pim/addressbook/namelineedit.cpp @@ -1,55 +1,59 @@ #include "namelineedit.h" +/* OPIE */ +#include <opie2/odebug.h> + + namespace ABOOK { NameLineEdit::NameLineEdit( QWidget* parent, const char* name ) : QLineEdit( parent, name ), m_prevSpace( true ) { } NameLineEdit::NameLineEdit( const QString& str, QWidget* par, const char* name ) : QLineEdit( str, par, name ),m_prevSpace( true ) { } NameLineEdit::~NameLineEdit() { } void NameLineEdit::keyPressEvent( QKeyEvent* ev ) { QString t = ev->text(); int key = ev->key(); int ascii = ev->ascii(); // ### FIXME with composed events if ( !t.isEmpty() && ( !ev->ascii() || ev->ascii()>=32 ) && key != Key_Delete && key != Key_Backspace && key != Key_Return && key != Key_Enter ) { - qWarning( "str " + ev->text() + " %d", m_prevSpace ); + owarn << "str " << ev->text() << " " << m_prevSpace << oendl; if ( m_prevSpace ) { t = t.upper(); m_prevSpace = false; } if ( key == Key_Space ) m_prevSpace = true; QKeyEvent nEv(ev->type(), key, ascii, ev->state(), t, ev->isAutoRepeat(), ev->count() ); QLineEdit::keyPressEvent( &nEv ); if ( !nEv.isAccepted() ) ev->ignore(); }else { QLineEdit::keyPressEvent( ev ); /* if key was a backspace lets see if we should * capitalize the next letter */ if ( key == Key_Backspace ) { QString te = text(); /* if string is empty capitalize the first letter */ /* else see if we're at the end of the string */ if ( te.isEmpty() || cursorPosition() == te.length() ) m_prevSpace = true; } } } } diff --git a/core/qws/transferserver.cpp b/core/qws/transferserver.cpp index 777c384..7bf6719 100644 --- a/core/qws/transferserver.cpp +++ b/core/qws/transferserver.cpp @@ -1,87 +1,88 @@ /********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of the Qtopia 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. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ /* OPIE */ #include <opie2/odebug.h> +/* STD */ #define _XOPEN_SOURCE #include <pwd.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #ifndef Q_OS_MACX #include <shadow.h> #endif /* Q_OS_MACX */ /* we need the _OS_LINUX stuff first ! */ #ifndef _OS_LINUX_ // Is anybody able to review this ? The include "uuid/uuid.h" couldn't be found // anywhere ? Therfore I removed it completely.. // I think it should be made permanentyl !? (eilers) #warning "Where should uuid/uuid.h be found ? Removed this part .. (eilers)" #if 0 extern "C" { #include <uuid/uuid.h> #define UUID_H_INCLUDED } #endif #endif // not defined linux #if defined(_OS_LINUX_) #include <shadow.h> #elif defined(Q_OS_MACX) #include <stdlib.h> #endif #include <qtextstream.h> #include <qmessagebox.h> //#include <qpe/qcopchannel_qws.h> #include <qpe/process.h> #include <qpe/global.h> #include <qpe/config.h> #include <qpe/contact.h> #include <qpe/version.h> #include <qpe/qcopenvelope_qws.h> #include "transferserver.h" #include <opie2/oprocess.h> using namespace Opie::Core; const int block_size = 51200; TransferServer::TransferServer( Q_UINT16 port, QObject *parent , const char* name ) : QServerSocket( port, 1, parent, name ) { if ( !ok() ) owarn << "Failed to bind to port " << port << "" << oendl; } TransferServer::~TransferServer() { } @@ -1066,131 +1067,130 @@ ServerDTP::ServerDTP( QObject *parent, const char* name) retrieveTargzProc->setWorkingDirectory( QDir::rootDirPath() ); connect( retrieveTargzProc, SIGNAL( processExited(Opie::Core::OProcess*) ), SIGNAL( completed() ) ); connect( retrieveTargzProc, SIGNAL( processExited(Opie::Core::OProcess*) ), SLOT( extractTarDone() ) ); } ServerDTP::~ServerDTP() { buf.close(); file.close(); createTargzProc->kill(); } void ServerDTP::extractTarDone() { odebug << "extract done" << oendl; #ifndef QT_NO_COP QCopEnvelope e( "QPE/Desktop", "restoreDone(QString)" ); e << file.name(); #endif } void ServerDTP::connected() { // send file mode switch ( mode ) { case SendFile : if ( !file.exists() || !file.open( IO_ReadOnly) ) { emit failed(); mode = Idle; return ; } //odebug << "Debug: Sending file '" << file.name() << "'" << oendl; bytes_written = 0; if ( file.size() == 0 ) { //make sure it doesn't hang on empty files file.close(); emit completed(); mode = Idle; } else { if ( !file.atEnd() ) { QCString s; s.resize( block_size ); int bytes = file.readBlock( s.data(), block_size ); writeBlock( s.data(), bytes ); } } break; case SendGzipFile: if ( createTargzProc->isRunning() ) { // SHOULDN'T GET HERE, BUT DOING A SAFETY CHECK ANYWAY owarn << "Previous tar --gzip process is still running; killing it..." << oendl; createTargzProc->kill(); } bytes_written = 0; odebug << "==>start send tar process" << oendl; if ( !createTargzProc->start(Opie::Core::OProcess::NotifyOnExit, Opie::Core::OProcess::Stdout) ) - qWarning("Error starting %s or %s", - createTargzProc->args()[0].data(), - gzipProc->args()[0].data()); + owarn << "Error starting " << createTargzProc->args()[0].data() + << " or " << gzipProc->args()[0].data() << oendl; break; case SendBuffer: if ( !buf.open( IO_ReadOnly) ) { emit failed(); mode = Idle; return ; } // odebug << "Debug: Sending byte array" << oendl; bytes_written = 0; while ( !buf.atEnd() ) putch( buf.getch() ); buf.close(); break; case RetrieveFile: // retrieve file mode if ( file.exists() && !file.remove() ) { emit failed(); mode = Idle; return ; } if ( !file.open( IO_WriteOnly) ) { emit failed(); mode = Idle; return ; } // odebug << "Debug: Retrieving file " << file.name() << "" << oendl; break; case RetrieveGzipFile: odebug << "=-> starting tar process to receive .tgz file" << oendl; break; case RetrieveBuffer: // retrieve buffer mode if ( !buf.open( IO_WriteOnly) ) { emit failed(); mode = Idle; return ; } // odebug << "Debug: Retrieving byte array" << oendl; break; case Idle: odebug << "connection established but mode set to Idle; BUG!" << oendl; break; } } void ServerDTP::connectionClosed() { //odebug << "Debug: Data connection closed " << bytes_written << " bytes written" << oendl; // send file mode if ( SendFile == mode ) { if ( bytes_written == file.size() ) emit completed(); else emit failed(); } // send buffer mode else if ( SendBuffer == mode ) { if ( bytes_written == buf.size() ) emit completed(); else |