author | drw <drw> | 2003-04-26 22:42:19 (UTC) |
---|---|---|
committer | drw <drw> | 2003-04-26 22:42:19 (UTC) |
commit | 98a9291263e167b8882ac916330e7215ebd884b4 (patch) (side-by-side diff) | |
tree | 882a909e9381ab4cc97e77377fd61361d7f21eab | |
parent | 64c48b637c1bd1bef679bff500f3e0ce5365358d (diff) | |
download | opie-98a9291263e167b8882ac916330e7215ebd884b4.zip opie-98a9291263e167b8882ac916330e7215ebd884b4.tar.gz opie-98a9291263e167b8882ac916330e7215ebd884b4.tar.bz2 |
1. Fix for bug #872 - reduce CPU useage while ipkg is doing its thing 2. Re-enable setDocument function for identifying local ipks
-rw-r--r-- | noncore/settings/aqpkg/installdlgimpl.cpp | 130 | ||||
-rw-r--r-- | noncore/settings/aqpkg/installdlgimpl.h | 8 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 17 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.h | 4 | ||||
-rw-r--r-- | noncore/settings/aqpkg/mainwin.cpp | 8 | ||||
-rw-r--r-- | noncore/settings/aqpkg/mainwin.h | 2 |
6 files changed, 116 insertions, 53 deletions
diff --git a/noncore/settings/aqpkg/installdlgimpl.cpp b/noncore/settings/aqpkg/installdlgimpl.cpp index 76d0a80..896e370 100644 --- a/noncore/settings/aqpkg/installdlgimpl.cpp +++ b/noncore/settings/aqpkg/installdlgimpl.cpp @@ -44,17 +44,17 @@ #include "ipkg.h" #include "utils.h" #include "global.h" enum { MAXLINES = 100, }; -InstallDlgImpl::InstallDlgImpl( QList<InstallData> &packageList, DataManager *dataManager, const char *title ) +InstallDlgImpl::InstallDlgImpl( const QList<InstallData> &packageList, DataManager *dataManager, const char *title ) : QWidget( 0, 0, 0 ) { setCaption( title ); init( TRUE ); pIpkg = 0; upgradePackages = false; dataMgr = dataManager; @@ -96,46 +96,45 @@ InstallDlgImpl::InstallDlgImpl( QList<InstallData> &packageList, DataManager *da // setup package data QString remove = tr( "Remove\n" ); QString install = tr( "Install\n" ); QString upgrade = tr( "Upgrade\n" ); for ( ; it.current(); ++it ) { InstallData *item = it.current(); InstallData *newitem = new InstallData(); - - newitem->option = item->option; - newitem->packageName = item->packageName; - newitem->destination = item->destination; - newitem->recreateLinks = item->recreateLinks; - - if ( item->option == "I" ) + + newitem->option = item->option; + newitem->packageName = item->packageName; + newitem->destination = item->destination; + newitem->recreateLinks = item->recreateLinks; + packages.append( newitem ); + + if ( item->option == "I" ) { - installList.append( newitem ); install.append( QString( " %1\n" ).arg( item->packageName ) ); } else if ( item->option == "D" ) { - removeList.append( newitem ); remove.append( QString( " %1\n" ).arg( item->packageName ) ); } else if ( item->option == "U" || item->option == "R" ) { - updateList.append( newitem ); - QString type; - if ( item->option == "R" ) - type = tr( "(ReInstall)" ); - else - type = tr( "(Upgrade)" ); - upgrade.append( QString( " %1 %2\n" ).arg( item->packageName ).arg( type ) ); - } - } - output->setText( QString( "%1\n%2\n%3\n" ).arg( remove ).arg( install ).arg( upgrade ) ); + QString type; + if ( item->option == "R" ) + type = tr( "(ReInstall)" ); + else + type = tr( "(Upgrade)" ); + upgrade.append( QString( " %1 %2\n" ).arg( item->packageName ).arg( type ) ); + } + } - displayAvailableSpace( destination->currentText() ); + output->setText( QString( "%1\n%2\n%3\n" ).arg( remove ).arg( install ).arg( upgrade ) ); + + displayAvailableSpace( destination->currentText() ); } InstallDlgImpl::InstallDlgImpl( Ipkg *ipkg, QString initialText, const char *title ) : QWidget( 0, 0, 0 ) { setCaption( title ); init( FALSE ); pIpkg = ipkg; @@ -263,16 +262,17 @@ void InstallDlgImpl :: installSelected() btnInstall->setText( tr( "Abort" ) ); btnInstall->setIconSet( Resource::loadPixmap( "close" ) ); if ( pIpkg ) { output->setText( "" ); connect( pIpkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); + connect( pIpkg, SIGNAL(ipkgFinished()), this, SLOT(ipkgFinished())); pIpkg->runIpkg(); } else { output->setText( "" ); Destination *d = dataMgr->getDestination( destination->currentText() ); QString dest = d->getDestinationName(); QString destDir = d->getDestinationPath(); @@ -284,19 +284,24 @@ void InstallDlgImpl :: installSelected() // Save settings Config cfg( "aqpkg" ); cfg.setGroup( "settings" ); cfg.writeEntry( "dest", dest ); #endif pIpkg = new Ipkg; connect( pIpkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); + connect( pIpkg, SIGNAL(ipkgFinished()), this, SLOT(ipkgFinished())); + + firstPackage = TRUE; + ipkgFinished(); // First run through the remove list, then the install list then the upgrade list - pIpkg->setOption( "remove" ); +/* + pIpkg->setOption( "remove" ); QListIterator<InstallData> it( removeList ); InstallData *idata; for ( ; it.current(); ++it ) { idata = it.current(); pIpkg->setDestination( idata->destination->getDestinationName() ); pIpkg->setDestinationDir( idata->destination->getDestinationPath() ); pIpkg->setPackage( idata->packageName ); @@ -337,28 +342,18 @@ void InstallDlgImpl :: installSelected() if ( idata->destination->linkToRoot() && idata->recreateLinks ) tmpFlags |= MAKE_LINKS; pIpkg->setFlags( tmpFlags, infoLevel ); pIpkg->runIpkg(); } delete pIpkg; pIpkg = 0; +*/ } - - btnOptions->setEnabled( true ); -// btnInstall->setEnabled( true ); - btnInstall->setText( tr( "Close" ) ); - btnInstall->setIconSet( Resource::loadPixmap( "enter" ) ); - - btnOptions->setText( tr( "Save output" ) ); - btnOptions->setIconSet( Resource::loadPixmap( "save" ) ); - - if ( destination && destination->currentText() != 0 && destination->currentText() != "" ) - displayAvailableSpace( destination->currentText() ); } void InstallDlgImpl :: displayText(const QString &text ) { QString newtext = QString( "%1\n%2" ).arg( output->text() ).arg( text ); /* Set a max line count for the QMultiLineEdit, as users have reported @@ -395,8 +390,77 @@ void InstallDlgImpl :: displayAvailableSpace( const QString &text ) } else space = tr( "Unknown" ); if ( txtAvailableSpace ) txtAvailableSpace->setText( space ); } +void InstallDlgImpl :: ipkgFinished() +{ + InstallData *item; + if ( firstPackage ) + item = packages.first(); + else + { + // Create symlinks if necessary before moving on to next package + pIpkg->createSymLinks(); + + item = packages.next(); + } + + firstPackage = FALSE; + if ( item ) + { + pIpkg->setPackage( item->packageName ); + int tmpFlags = flags; + + if ( item->option == "I" ) + { + pIpkg->setOption( "install" ); + Destination *d = dataMgr->getDestination( destination->currentText() ); + pIpkg->setDestination( d->getDestinationName() ); + pIpkg->setDestinationDir( d->getDestinationPath() ); + + if ( d->linkToRoot() ) + tmpFlags |= MAKE_LINKS; + } + else if ( item->option == "D" ) + { + pIpkg->setOption( "remove" ); + pIpkg->setDestination( item->destination->getDestinationName() ); + pIpkg->setDestinationDir( item->destination->getDestinationPath() ); + + if ( item->destination->linkToRoot() ) + tmpFlags |= MAKE_LINKS; + } + else + { + if ( item->option == "R" ) + pIpkg->setOption( "reinstall" ); + else + pIpkg->setOption( "upgrade" ); + + pIpkg->setDestination( item->destination->getDestinationName() ); + pIpkg->setDestinationDir( item->destination->getDestinationPath() ); + pIpkg->setPackage( item->packageName ); + + tmpFlags |= FORCE_REINSTALL; + if ( item->destination->linkToRoot() && item->recreateLinks ) + tmpFlags |= MAKE_LINKS; + } + pIpkg->setFlags( tmpFlags, infoLevel ); + pIpkg->runIpkg(); + } + else + { + btnOptions->setEnabled( true ); + btnInstall->setText( tr( "Close" ) ); + btnInstall->setIconSet( Resource::loadPixmap( "enter" ) ); + + btnOptions->setText( tr( "Save output" ) ); + btnOptions->setIconSet( Resource::loadPixmap( "save" ) ); + + if ( destination && destination->currentText() != 0 && destination->currentText() != "" ) + displayAvailableSpace( destination->currentText() ); + } +}
\ No newline at end of file diff --git a/noncore/settings/aqpkg/installdlgimpl.h b/noncore/settings/aqpkg/installdlgimpl.h index 15cf427..9a7dbff 100644 --- a/noncore/settings/aqpkg/installdlgimpl.h +++ b/noncore/settings/aqpkg/installdlgimpl.h @@ -40,29 +40,28 @@ public: Destination *destination; bool recreateLinks; }; class InstallDlgImpl : public QWidget { Q_OBJECT public: - InstallDlgImpl( QList<InstallData> &packageList, DataManager *dataManager, const char *title = 0 ); + InstallDlgImpl( const QList<InstallData> &packageList, DataManager *dataManager, const char *title = 0 ); InstallDlgImpl( Ipkg *ipkg, QString initialText, const char *title = 0 ); ~InstallDlgImpl(); bool upgradeServer( QString &server ); protected: private: DataManager *dataMgr; - QList<InstallData> installList; - QList<InstallData> removeList; - QList<InstallData> updateList; + QList<InstallData> packages; + bool firstPackage; int flags; int infoLevel; Ipkg *pIpkg; bool upgradePackages; QComboBox *destination; QPushButton *btnInstall; QPushButton *btnOptions; @@ -76,11 +75,12 @@ private: signals: void reloadData( InstallDlgImpl * ); public slots: void optionsSelected(); void installSelected(); void displayText(const QString &text ); void displayAvailableSpace( const QString &text); + void ipkgFinished(); }; #endif diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index e906653..34999ad 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp @@ -50,20 +50,19 @@ Ipkg :: ~Ipkg() // package is the package name to install - either a fully qualified path and ipk // file (if stored locally) or just the name of the package (for a network package) // packageName is the package name - (for a network package this will be the same as // package parameter) // dest is the destination alias (from ipk.conf) // destDir is the dir that the destination alias points to (used to link to root) // flags is the ipkg options flags // dir is the directory to run ipkg in (defaults to "") -bool Ipkg :: runIpkg( ) +void Ipkg :: runIpkg() { error = false; - bool ret = false; QStringList commands; QDir::setCurrent( "/tmp" ); if ( runtimeDir != "" ) { commands << "cd "; commands << runtimeDir; @@ -132,21 +131,22 @@ bool Ipkg :: runIpkg( ) emit outputText( QString( " " ) ); } } // Execute command dependantPackages = new QList<QString>; dependantPackages->setAutoDelete( true ); - ret = executeIpkgCommand( commands, option ); + executeIpkgCommand( commands, option ); - if ( aborted ) - return false; +} +void Ipkg :: createSymLinks() +{ if ( option == "install" || option == "reinstall" || option == "upgrade" ) { // If we are not removing packages and make links option is selected // create the links createLinks = true; if ( flags & MAKE_LINKS ) { emit outputText( " " ); @@ -166,17 +166,16 @@ bool Ipkg :: runIpkg( ) } } } delete dependantPackages; emit outputText( "Finished" ); emit outputText( "" ); - return ret; } void Ipkg :: removeStatusEntry() { QString statusFile = destDir; if ( statusFile.right( 1 ) != "/" ) statusFile.append( "/" ); statusFile.append( "usr/lib/ipkg/status" ); @@ -290,20 +289,16 @@ int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) } // Start the process going finished = false; if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) { emit outputText( QString( "Couldn't start ipkg process" ) ); } - - // Now wait for it to finish - while ( !finished ) - qApp->processEvents(); } void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) { QString lineStr = buffer; if ( lineStr[buflen-1] == '\n' ) buflen --; lineStr = lineStr.left( buflen ); @@ -349,16 +344,18 @@ void Ipkg::processFinished() // to workaround an ipkg bug which stops reinstall to a different location if ( !error && option == "remove" ) removeStatusEntry(); delete proc; proc = 0; finished = true; + + emit ipkgFinished(); } void Ipkg :: abort() { if ( proc ) { proc->kill(); diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h index 531bfc0..a0d38e3 100644 --- a/noncore/settings/aqpkg/ipkg.h +++ b/noncore/settings/aqpkg/ipkg.h @@ -38,27 +38,29 @@ class OProcess; class Ipkg : public QObject { Q_OBJECT public: Ipkg(); ~Ipkg(); - bool runIpkg( ); + void runIpkg(); + void createSymLinks(); void setOption( const char *opt ) { option = opt; } void setPackage( const char *pkg ) { package = pkg; } void setDestination( const char *dest ) { destination = dest; } void setDestinationDir( const char *dir ) { destDir = dir; } void setFlags( int fl, int il ) { flags = fl; infoLevel = il; } void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; } signals: void outputText( const QString &text ); + void ipkgFinished(); public slots: void commandStdout(OProcess*, char *buffer, int buflen); void commandStderr(OProcess*, char *buffer, int buflen); void processFinished(); void abort(); diff --git a/noncore/settings/aqpkg/mainwin.cpp b/noncore/settings/aqpkg/mainwin.cpp index 1aec6a8..58f6feb 100644 --- a/noncore/settings/aqpkg/mainwin.cpp +++ b/noncore/settings/aqpkg/mainwin.cpp @@ -292,17 +292,17 @@ void MainWindow :: init() showInstalledPkgs = false; showUpgradedPkgs = false; categoryFilterEnabled = false; updateData(); stack->raiseWidget( networkPkgWindow ); } -/* + void MainWindow :: setDocument( const QString &doc ) { // Remove path from package QString package = Utils::getPackageNameFromIpkFilename( doc ); // std::cout << "Selecting package " << package << std::endl; // First select local server for ( int i = 0 ; i < serversList->count() ; ++i ) @@ -322,17 +322,17 @@ void MainWindow :: setDocument( const QString &doc ) { if ( item->text().startsWith( package ) ) { item->setOn( true ); break; } } } -*/ + void MainWindow :: displaySettings() { SettingsImpl *dlg = new SettingsImpl( mgr, this, "Settings", true ); if ( dlg->showDlg() ) { stack->raiseWidget( progressWindow ); updateData(); stack->raiseWidget( networkPkgWindow ); @@ -987,24 +987,24 @@ InstallData *MainWindow :: dealWithItem( QCheckListItem *item ) // If the package has a filename then it is a local file if ( p->isPackageStoredLocally() ) name = p->getFilename(); QString option; QString dest = "root"; if ( !p->isInstalled() ) { - InstallData *newitem = new InstallData();; + InstallData *newitem = new InstallData(); newitem->option = "I"; newitem->packageName = name; return newitem; } else { - InstallData *newitem = new InstallData();; + InstallData *newitem = new InstallData(); newitem->option = "D"; if ( !p->isPackageStoredLocally() ) newitem->packageName = p->getInstalledPackageName(); else newitem->packageName = name; if ( p->getInstalledTo() ) { diff --git a/noncore/settings/aqpkg/mainwin.h b/noncore/settings/aqpkg/mainwin.h index 0295519..c4548b1 100644 --- a/noncore/settings/aqpkg/mainwin.h +++ b/noncore/settings/aqpkg/mainwin.h @@ -101,17 +101,17 @@ private: // Progress widget QWidget *progressWindow; QLabel *m_status; QProgressBar *m_progress; void initProgressWidget(); public slots: -// void setDocument( const QString &doc ); + void setDocument( const QString &doc ); void displayFindBar(); void displayJumpBar(); void repeatFind(); void findPackage( const QString & ); void hideFindBar(); void hideJumpBar(); void displaySettings(); void filterUninstalledPackages(); |