summaryrefslogtreecommitdiff
authordrw <drw>2003-04-26 22:42:19 (UTC)
committer drw <drw>2003-04-26 22:42:19 (UTC)
commit98a9291263e167b8882ac916330e7215ebd884b4 (patch) (side-by-side diff)
tree882a909e9381ab4cc97e77377fd61361d7f21eab
parent64c48b637c1bd1bef679bff500f3e0ce5365358d (diff)
downloadopie-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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/installdlgimpl.cpp130
-rw-r--r--noncore/settings/aqpkg/installdlgimpl.h8
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp17
-rw-r--r--noncore/settings/aqpkg/ipkg.h4
-rw-r--r--noncore/settings/aqpkg/mainwin.cpp8
-rw-r--r--noncore/settings/aqpkg/mainwin.h2
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();