summaryrefslogtreecommitdiff
authordrw <drw>2003-04-17 20:19:52 (UTC)
committer drw <drw>2003-04-17 20:19:52 (UTC)
commitfabadbc7caba39006fcdda5167c29fa287e23cc3 (patch) (side-by-side diff)
treebcd0fe44cd443001514ff4f9e50af5e9da093fcc
parent187e3c56ab0bb2f562c9d6347a99edb440c18d6c (diff)
downloadopie-fabadbc7caba39006fcdda5167c29fa287e23cc3.zip
opie-fabadbc7caba39006fcdda5167c29fa287e23cc3.tar.gz
opie-fabadbc7caba39006fcdda5167c29fa287e23cc3.tar.bz2
Added better verbosity options and option to save ipkg output to a file (per 'bugs' #856 & #857). Also fixed Ok/Cancel behavior on install options dialog.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/installdlgimpl.cpp58
-rw-r--r--noncore/settings/aqpkg/installdlgimpl.h1
-rw-r--r--noncore/settings/aqpkg/instoptionsimpl.cpp27
-rw-r--r--noncore/settings/aqpkg/instoptionsimpl.h5
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp6
-rw-r--r--noncore/settings/aqpkg/ipkg.h3
6 files changed, 79 insertions, 21 deletions
diff --git a/noncore/settings/aqpkg/installdlgimpl.cpp b/noncore/settings/aqpkg/installdlgimpl.cpp
index 2bb8b4d..76d0a80 100644
--- a/noncore/settings/aqpkg/installdlgimpl.cpp
+++ b/noncore/settings/aqpkg/installdlgimpl.cpp
@@ -1,366 +1,402 @@
/***************************************************************************
installdlgimpl.cpp - description
-------------------
begin : Mon Aug 26 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <stdio.h>
+
+#include <opie/ofiledialog.h>
#ifdef QWS
#include <qpe/config.h>
+#include <qpe/fileselector.h>
#include <qpe/qpeapplication.h>
#include <qpe/resource.h>
#include <qpe/storage.h>
#endif
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qdialog.h>
+#include <qfileinfo.h>
#include <qgroupbox.h>
#include <qmultilineedit.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include "datamgr.h"
#include "destination.h"
#include "instoptionsimpl.h"
#include "installdlgimpl.h"
#include "ipkg.h"
#include "utils.h"
#include "global.h"
enum {
MAXLINES = 100,
};
InstallDlgImpl::InstallDlgImpl( QList<InstallData> &packageList, DataManager *dataManager, const char *title )
: QWidget( 0, 0, 0 )
{
setCaption( title );
init( TRUE );
pIpkg = 0;
upgradePackages = false;
dataMgr = dataManager;
QString defaultDest = "root";
#ifdef QWS
Config cfg( "aqpkg" );
cfg.setGroup( "settings" );
defaultDest = cfg.readEntry( "dest", "root" );
// Grab flags - Turn MAKE_LINKS on by default (if no flags found)
flags = cfg.readNumEntry( "installFlags", 0 );
+ infoLevel = cfg.readNumEntry( "infoLevel", 1 );
#else
flags = 0;
#endif
// Output text is read only
output->setReadOnly( true );
// QFont f( "helvetica" );
// f.setPointSize( 10 );
// output->setFont( f );
// setup destination data
int defIndex = 0;
int i;
QListIterator<Destination> dit( dataMgr->getDestinationList() );
for ( i = 0; dit.current(); ++dit, ++i )
{
destination->insertItem( dit.current()->getDestinationName() );
if ( dit.current()->getDestinationName() == defaultDest )
defIndex = i;
}
destination->setCurrentItem( defIndex );
QListIterator<InstallData> it( packageList );
// 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" )
{
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 ) );
displayAvailableSpace( destination->currentText() );
}
InstallDlgImpl::InstallDlgImpl( Ipkg *ipkg, QString initialText, const char *title )
: QWidget( 0, 0, 0 )
{
setCaption( title );
init( FALSE );
pIpkg = ipkg;
output->setText( initialText );
}
InstallDlgImpl::~InstallDlgImpl()
{
if ( pIpkg )
delete pIpkg;
}
void InstallDlgImpl :: init( bool displayextrainfo )
{
QGridLayout *layout = new QGridLayout( this );
layout->setSpacing( 4 );
layout->setMargin( 4 );
if ( displayextrainfo )
{
QLabel *label = new QLabel( tr( "Destination" ), this );
layout->addWidget( label, 0, 0 );
destination = new QComboBox( FALSE, this );
layout->addWidget( destination, 0, 1 );
connect( destination, SIGNAL( highlighted( const QString & ) ),
this, SLOT( displayAvailableSpace( const QString & ) ) );
QLabel *label2 = new QLabel( tr( "Space Avail" ), this );
layout->addWidget( label2, 1, 0 );
txtAvailableSpace = new QLabel( "", this );
layout->addWidget( txtAvailableSpace, 1, 1 );
}
else
{
destination = 0x0;
txtAvailableSpace = 0x0;
}
QGroupBox *GroupBox2 = new QGroupBox( 0, Qt::Vertical, tr( "Output" ), this );
GroupBox2->layout()->setSpacing( 0 );
GroupBox2->layout()->setMargin( 4 );
QVBoxLayout *GroupBox2Layout = new QVBoxLayout( GroupBox2->layout() );
output = new QMultiLineEdit( GroupBox2 );
GroupBox2Layout->addWidget( output );
layout->addMultiCellWidget( GroupBox2, 2, 2, 0, 1 );
btnInstall = new QPushButton( Resource::loadPixmap( "aqpkg/apply" ), tr( "Start" ), this );
layout->addWidget( btnInstall, 3, 0 );
connect( btnInstall, SIGNAL( clicked() ), this, SLOT( installSelected() ) );
btnOptions = new QPushButton( Resource::loadPixmap( "SettingsIcon" ), tr( "Options" ), this );
layout->addWidget( btnOptions, 3, 1 );
connect( btnOptions, SIGNAL( clicked() ), this, SLOT( optionsSelected() ) );
}
void InstallDlgImpl :: optionsSelected()
{
- InstallOptionsDlgImpl opt( flags, this, "Option", true );
- opt.exec();
-
- // set options selected from dialog
- flags = opt.getFlags();
+ if ( btnOptions->text() == tr( "Options" ) )
+ {
+ InstallOptionsDlgImpl opt( flags, infoLevel, this, "Option", true );
+ if ( opt.exec() == QDialog::Accepted )
+ {
+ // set options selected from dialog
+ flags = opt.getFlags();
+ infoLevel = opt.getInfoLevel();
#ifdef QWS
- Config cfg( "aqpkg" );
- cfg.setGroup( "settings" );
- cfg.writeEntry( "installFlags", flags );
+ Config cfg( "aqpkg" );
+ cfg.setGroup( "settings" );
+ cfg.writeEntry( "installFlags", flags );
+ cfg.writeEntry( "infoLevel", infoLevel );
#endif
+ }
+ }
+ else // Save output
+ {
+ QMap<QString, QStringList> map;
+ map.insert( tr( "All" ), QStringList() );
+ QStringList text;
+ text << "text/*";
+ map.insert(tr( "Text" ), text );
+ text << "*";
+ map.insert( tr( "All" ), text );
+
+ QString filename = OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map );
+ if( !filename.isEmpty() )
+ {
+ QString currentFileName = QFileInfo( filename ).fileName();
+ DocLnk doc;
+ doc.setType( "text/plain" );
+ doc.setFile( filename );
+ doc.setName( currentFileName );
+ FileManager fm;
+ fm.saveFile( doc, output->text() );
+ }
+ }
}
void InstallDlgImpl :: installSelected()
{
if ( btnInstall->text() == tr( "Abort" ) )
{
if ( pIpkg )
{
displayText( tr( "\n**** User Clicked ABORT ***" ) );
pIpkg->abort();
displayText( tr( "**** Process Aborted ****" ) );
}
btnInstall->setText( tr( "Close" ) );
btnInstall->setIconSet( Resource::loadPixmap( "enter" ) );
return;
}
else if ( btnInstall->text() == tr( "Close" ) )
{
emit reloadData( this );
return;
}
// Disable buttons
btnOptions->setEnabled( false );
// btnInstall->setEnabled( false );
btnInstall->setText( tr( "Abort" ) );
btnInstall->setIconSet( Resource::loadPixmap( "close" ) );
if ( pIpkg )
{
output->setText( "" );
connect( pIpkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &)));
pIpkg->runIpkg();
}
else
{
output->setText( "" );
Destination *d = dataMgr->getDestination( destination->currentText() );
QString dest = d->getDestinationName();
QString destDir = d->getDestinationPath();
int instFlags = flags;
if ( d->linkToRoot() )
instFlags |= MAKE_LINKS;
#ifdef QWS
// 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 &)));
// First run through the remove list, then the install list then the upgrade list
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 );
int tmpFlags = flags;
if ( idata->destination->linkToRoot() )
tmpFlags |= MAKE_LINKS;
- pIpkg->setFlags( tmpFlags );
+ pIpkg->setFlags( tmpFlags, infoLevel );
pIpkg->runIpkg();
}
pIpkg->setOption( "install" );
pIpkg->setDestination( dest );
pIpkg->setDestinationDir( destDir );
- pIpkg->setFlags( instFlags );
+ pIpkg->setFlags( instFlags, infoLevel );
QListIterator<InstallData> it2( installList );
for ( ; it2.current(); ++it2 )
{
pIpkg->setPackage( it2.current()->packageName );
pIpkg->runIpkg();
}
flags |= FORCE_REINSTALL;
QListIterator<InstallData> it3( updateList );
for ( ; it3.current() ; ++it3 )
{
idata = it3.current();
if ( idata->option == "R" )
pIpkg->setOption( "reinstall" );
else
pIpkg->setOption( "upgrade" );
pIpkg->setDestination( idata->destination->getDestinationName() );
pIpkg->setDestinationDir( idata->destination->getDestinationPath() );
pIpkg->setPackage( idata->packageName );
int tmpFlags = flags;
if ( idata->destination->linkToRoot() && idata->recreateLinks )
tmpFlags |= MAKE_LINKS;
- pIpkg->setFlags( tmpFlags );
+ 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
* performance issues when line count gets extreme.
*/
if(output->numLines() >= MAXLINES)
output->removeLine(0);
output->setText( newtext );
output->setCursorPosition( output->numLines(), 0 );
}
void InstallDlgImpl :: displayAvailableSpace( const QString &text )
{
Destination *d = dataMgr->getDestination( text );
QString destDir = d->getDestinationPath();
long blockSize = 0;
long totalBlocks = 0;
long availBlocks = 0;
QString space;
if ( Utils::getStorageSpace( (const char *)destDir, &blockSize, &totalBlocks, &availBlocks ) )
{
long mult = blockSize / 1024;
long div = 1024 / blockSize;
if ( !mult ) mult = 1;
if ( !div ) div = 1;
// long total = totalBlocks * mult / div;
long avail = availBlocks * mult / div;
// long used = total - avail;
space.sprintf( "%ld Kb", avail );
}
else
space = tr( "Unknown" );
if ( txtAvailableSpace )
txtAvailableSpace->setText( space );
}
diff --git a/noncore/settings/aqpkg/installdlgimpl.h b/noncore/settings/aqpkg/installdlgimpl.h
index c30963e..15cf427 100644
--- a/noncore/settings/aqpkg/installdlgimpl.h
+++ b/noncore/settings/aqpkg/installdlgimpl.h
@@ -1,85 +1,86 @@
/***************************************************************************
installdlgimpl.h - description
-------------------
begin : Mon Aug 26 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef INSTALLDLGIMPL_H
#define INSTALLDLGIMPL_H
using namespace std;
#include <qlist.h>
#include <qstring.h>
#include <qwidget.h>
class QComboBox;
class QLabel;
class QMultiLineEdit;
class QPushButton;
class DataManager;
class Destination;
class Ipkg;
class InstallData
{
public:
QString option; // I - install, D - delete, R- reinstall U - upgrade
QString packageName;
Destination *destination;
bool recreateLinks;
};
class InstallDlgImpl : public QWidget
{
Q_OBJECT
public:
InstallDlgImpl( 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;
int flags;
+ int infoLevel;
Ipkg *pIpkg;
bool upgradePackages;
QComboBox *destination;
QPushButton *btnInstall;
QPushButton *btnOptions;
QMultiLineEdit *output;
QLabel *txtAvailableSpace;
void init( bool );
bool runIpkg( QString &option, const QString& package, const QString& dest, int flags );
signals:
void reloadData( InstallDlgImpl * );
public slots:
void optionsSelected();
void installSelected();
void displayText(const QString &text );
void displayAvailableSpace( const QString &text);
};
#endif
diff --git a/noncore/settings/aqpkg/instoptionsimpl.cpp b/noncore/settings/aqpkg/instoptionsimpl.cpp
index 47b250d..72d794f 100644
--- a/noncore/settings/aqpkg/instoptionsimpl.cpp
+++ b/noncore/settings/aqpkg/instoptionsimpl.cpp
@@ -1,99 +1,116 @@
/***************************************************************************
instoptionsimpl.cpp - description
-------------------
begin : Mon Aug 26 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifdef QWS
#include <qpe/config.h>
#endif
#include <qcheckbox.h>
+#include <qcombobox.h>
#include <qgroupbox.h>
+#include <qlabel.h>
#include <qlayout.h>
#include "global.h"
#include "instoptionsimpl.h"
#include "ipkg.h"
-InstallOptionsDlgImpl::InstallOptionsDlgImpl( int flags, QWidget * parent, const char* name, bool modal, WFlags fl )
+InstallOptionsDlgImpl::InstallOptionsDlgImpl( int flags, int verb, QWidget * parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )
{
setCaption( tr( "Options" ) );
QVBoxLayout *layout = new QVBoxLayout( this );
layout->setMargin( 2 );
layout->setSpacing( 4 );
QGroupBox *grpbox = new QGroupBox( 0, Qt::Vertical, tr( "Options" ), this );
grpbox->layout()->setSpacing( 2 );
grpbox->layout()->setMargin( 4 );
layout->addWidget( grpbox );
QVBoxLayout *grplayout = new QVBoxLayout( grpbox->layout() );
forceDepends = new QCheckBox( tr( "Force Depends" ), grpbox );
grplayout->addWidget( forceDepends );
forceReinstall = new QCheckBox( tr( "Force Reinstall" ), grpbox );
grplayout->addWidget( forceReinstall );
forceRemove = new QCheckBox( tr( "Force Remove" ), grpbox );
grplayout->addWidget( forceRemove );
forceOverwrite = new QCheckBox( tr( "Force Overwrite" ), grpbox );
grplayout->addWidget( forceOverwrite );
- verboseWget = new QCheckBox( tr( "Verbose WGet" ), grpbox );
- grplayout->addWidget( verboseWget );
+ QLabel *l = new QLabel( tr( "Information Level" ), grpbox );
+ grplayout->addWidget( l );
+
+ verboseIpkg = new QComboBox( grpbox );
+ verboseIpkg->insertItem( tr( "Errors only" ) );
+ verboseIpkg->insertItem( tr( "Normal messages" ) );
+ verboseIpkg->insertItem( tr( "Informative messages" ) );
+ verboseIpkg->insertItem( tr( "Troubleshooting output" ) );
+ verboseIpkg->setCurrentItem( verb );
+ grplayout->addWidget( verboseIpkg );
+
+ grplayout->addItem( new QSpacerItem( 1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding ) );
if ( flags & FORCE_DEPENDS )
forceDepends->setChecked( true );
if ( flags & FORCE_REINSTALL )
forceReinstall->setChecked( true );
if ( flags & FORCE_REMOVE )
forceRemove->setChecked( true );
if ( flags & FORCE_OVERWRITE )
forceOverwrite->setChecked( true );
- if ( flags & VERBOSE_WGET )
- verboseWget->setChecked( true );
+// if ( flags & VERBOSE_WGET )
+// verboseWget->setChecked( true );
// if ( flags & MAKE_LINKS )
// makeLinks->setChecked( true );
showMaximized();
}
InstallOptionsDlgImpl::~InstallOptionsDlgImpl()
{
}
int InstallOptionsDlgImpl :: getFlags()
{
int flags = 0;
if ( forceDepends->isChecked() )
flags |= FORCE_DEPENDS;
if ( forceReinstall->isChecked() )
flags |= FORCE_REINSTALL;
if ( forceRemove->isChecked() )
flags |= FORCE_REMOVE;
if ( forceOverwrite->isChecked() )
flags |= FORCE_OVERWRITE;
if ( verboseWget->isChecked() )
flags |= VERBOSE_WGET;
return flags;
}
+
+int InstallOptionsDlgImpl :: getInfoLevel()
+{
+ return verboseIpkg->currentItem();
+}
diff --git a/noncore/settings/aqpkg/instoptionsimpl.h b/noncore/settings/aqpkg/instoptionsimpl.h
index f4724a0..1312afd 100644
--- a/noncore/settings/aqpkg/instoptionsimpl.h
+++ b/noncore/settings/aqpkg/instoptionsimpl.h
@@ -1,40 +1,43 @@
/***************************************************************************
installoptionsimpl.h - description
-------------------
begin : Mon Aug 26 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef INSTALLOPTIONSIMPL_H
#define INSTALLOPTIONSIMPL_H
#include <qdialog.h>
class QCheckBox;
+class QComboBox;
class InstallOptionsDlgImpl : public QDialog
{
Q_OBJECT
public:
- InstallOptionsDlgImpl( int flags, QWidget * parent = 0, const char* name = 0, bool modal = false, WFlags fl = 0 );
+ InstallOptionsDlgImpl( int, int, QWidget * = 0, const char * = 0, bool = false, WFlags = 0 );
~InstallOptionsDlgImpl();
int getFlags();
+ int getInfoLevel();
private:
QCheckBox* forceDepends;
QCheckBox* forceReinstall;
QCheckBox* forceRemove;
QCheckBox* forceOverwrite;
QCheckBox* verboseWget;
+ QComboBox* verboseIpkg;
};
#endif
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index e66c02d..7df643e 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -1,566 +1,566 @@
/***************************************************************************
ipkg.cpp - description
-------------------
begin : Sat Aug 31 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
#include <stdio.h>
#include <unistd.h>
#ifdef QWS
#include <qpe/qpeapplication.h>
#else
#include <qapplication.h>
#endif
#include <qdir.h>
#include <qtextstream.h>
#include <opie/oprocess.h>
#include "utils.h"
#include "ipkg.h"
#include "global.h"
Ipkg :: Ipkg()
{
proc = 0;
}
Ipkg :: ~Ipkg()
{
}
// Option is what we are going to do - install, upgrade, download, reinstall
// 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( )
{
error = false;
bool ret = false;
QStringList commands;
QDir::setCurrent( "/tmp" );
if ( runtimeDir != "" )
{
commands << "cd ";
commands << runtimeDir;
commands << ";";
}
- commands << "ipkg" << "-force-defaults";
+ commands << "ipkg" << "-V" << QString::number( infoLevel ) << "-force-defaults";
// only set the destination for an install operation
if ( option == "install" )
commands << "-dest" << destination;
if ( option != "update" && option != "download" )
{
if ( flags & FORCE_DEPENDS )
commands << "-force-depends";
if ( flags & FORCE_REINSTALL )
commands << "-force-reinstall";
if ( flags & FORCE_REMOVE )
commands << "-force-removal-of-essential-packages";
if ( flags & FORCE_OVERWRITE )
commands << "-force-overwrite";
- if ( flags & VERBOSE_WGET )
+ if ( infoLevel == 3 )
commands << "-verbose_wget";
// Handle make links
// Rules - If make links is switched on, create links to root
// if destDir is NOT /
if ( flags & MAKE_LINKS )
{
// If destDir == / turn off make links as package is being insalled
// to root already.
if ( destDir == "/" )
flags ^= MAKE_LINKS;
}
}
#ifdef X86
commands << "-f";
commands << IPKG_CONF;
#endif
if ( option == "reinstall" )
commands << "install";
else
commands << option;
if ( package != "" )
commands << package;
if ( package != "" )
emit outputText( QString( "Dealing with package " ) + package );
qApp->processEvents();
// If we are removing, reinstalling or upgrading packages and make links option is selected
// create the links
if ( option == "remove" || option == "reinstall" || option == "upgrade" )
{
createLinks = false;
if ( flags & MAKE_LINKS )
{
emit outputText( QString( "Removing symbolic links...\n" ) );
linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
emit outputText( QString( " " ) );
}
}
// Execute command
dependantPackages = new QList<QString>;
dependantPackages->setAutoDelete( true );
ret = executeIpkgCommand( commands, option );
if ( aborted )
return false;
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( " " );
emit outputText( QString( "Creating symbolic links for " )+ package );
linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
// link dependant packages that were installed with this release
QString *pkg;
for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
{
if ( *pkg == package )
continue;
emit outputText( " " );
emit outputText( QString( "Creating symbolic links for " )+ (*pkg) );
linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
}
}
}
delete dependantPackages;
emit outputText( "Finished" );
emit outputText( "" );
return ret;
}
void Ipkg :: removeStatusEntry()
{
QString statusFile = destDir;
if ( statusFile.right( 1 ) != "/" )
statusFile += "/";
statusFile += "usr/lib/ipkg/status";
QString outStatusFile = statusFile + ".tmp";
emit outputText( "" );
emit outputText( "Removing status entry..." );
emit outputText( QString( "status file - " )+ statusFile );
emit outputText( QString( "package - " )+ package );
ifstream in( statusFile );
ofstream out( outStatusFile );
if ( !in.is_open() )
{
emit outputText( QString( "Couldn't open status file - " )+ statusFile );
return;
}
if ( !out.is_open() )
{
emit outputText( QString( "Couldn't create tempory status file - " )+ outStatusFile );
return;
}
char line[1001];
char k[21];
char v[1001];
QString key;
QString value;
vector<QString> lines;
do
{
in.getline( line, 1000 );
if ( in.eof() )
continue;
k[0] = '\0';
v[0] = '\0';
sscanf( line, "%[^:]: %[^\n]", k, v );
key = k;
value = v;
key = key.stripWhiteSpace();
value = value.stripWhiteSpace();
if ( key == "Package" && value == package )
{
// Ignore all lines up to next empty
do
{
in.getline( line, 1000 );
if ( in.eof() || QString( line ).stripWhiteSpace() == "" )
continue;
} while ( !in.eof() && QString( line ).stripWhiteSpace() != "" );
}
lines.push_back( QString( line ) );
// out << line << endl;
} while ( !in.eof() );
// Write lines out
vector<QString>::iterator it;
for ( it = lines.begin() ; it != lines.end() ; ++it )
{
cout << "Writing " << (const char *)(*it) << endl;
out << (const char *)(*it) << endl;
}
in.close();
out.close();
// Remove old status file and put tmp stats file in its place
remove( statusFile );
rename( outStatusFile, statusFile );
}
-int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString option )
+int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
{
// If one is already running - should never be but just to be safe
if ( proc )
{
delete proc;
proc = 0;
}
// OK we're gonna use OProcess to run this thing
proc = new OProcess();
aborted = false;
// Connect up our slots
connect(proc, SIGNAL(processExited(OProcess *)),
this, SLOT( processFinished()));
connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)),
this, SLOT(commandStdout(OProcess *, char *, int)));
connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)),
this, SLOT(commandStderr(OProcess *, char *, int)));
for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it )
{
qDebug( "%s ", (*it).latin1() );
*proc << (*it).latin1();
}
cout << endl;
// Start the process going
finished = false;
if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
{
emit outputText( QString( "Couldn't start ipkg process" ) );
qDebug( "Couldn't start ipkg process!" );
}
// Now wait for it to finish
while ( !finished )
qApp->processEvents();
}
void Ipkg::commandStdout(OProcess*, char *buffer, int buflen)
{
qDebug("received stdout %d bytes", buflen);
QString lineStr = buffer;
if ( lineStr[buflen-1] == '\n' )
buflen --;
lineStr = lineStr.left( buflen );
emit outputText( lineStr );
// check if we are installing dependant packages
if ( option == "install" || option == "reinstall" )
{
// Need to keep track of any dependant packages that get installed
// so that we can create links to them as necessary
if ( lineStr.startsWith( "Installing " ) )
{
int start = lineStr.find( " " ) + 1;
int end = lineStr.find( " ", start );
QString *package = new QString( lineStr.mid( start, end-start ) );
dependantPackages->append( package );
}
}
qDebug(lineStr);
buffer[0] = '\0';
}
void Ipkg::commandStderr(OProcess*, char *buffer, int buflen)
{
qDebug("received stderrt %d bytes", buflen);
QString lineStr = buffer;
if ( lineStr[buflen-1] == '\n' )
buflen --;
lineStr=lineStr.left( buflen );
emit outputText( lineStr );
buffer[0] = '\0';
error = true;
}
void Ipkg::processFinished()
{
// Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file
// to workaround an ipkg bug which stops reinstall to a different location
if ( !error && option == "remove" )
removeStatusEntry();
delete proc;
proc = 0;
finished = true;
}
void Ipkg :: abort()
{
if ( proc )
{
proc->kill();
aborted = true;
}
}
/*
int Ipkg :: executeIpkgCommand( QString &cmd, const QString option )
{
FILE *fp = NULL;
char line[130];
QString lineStr, lineStrOld;
int ret = false;
fp = popen( (const char *) cmd, "r");
if ( fp == NULL )
{
cout << "Couldn't execute " << cmd << "! err = " << fp << endl;
QString text;
text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd );
emit outputText( text );
}
else
{
while ( fgets( line, sizeof line, fp) != NULL )
{
lineStr = line;
lineStr=lineStr.left( lineStr.length()-1 );
if ( lineStr != lineStrOld )
{
//See if we're finished
if ( option == "install" || option == "reinstall" )
{
// Need to keep track of any dependant packages that get installed
// so that we can create links to them as necessary
if ( lineStr.startsWith( "Installing " ) )
{
int start = lineStr.find( " " ) + 1;
int end = lineStr.find( " ", start );
QString *package = new QString( lineStr.mid( start, end-start ) );
dependantPackages->append( package );
}
}
if ( option == "update" )
{
if (lineStr.contains("Updated list"))
ret = true;
}
else if ( option == "download" )
{
if (lineStr.contains("Downloaded"))
ret = true;
}
else
{
if (lineStr.contains("Done"))
ret = true;
}
emit outputText( lineStr );
}
lineStrOld = lineStr;
qApp->processEvents();
}
pclose(fp);
}
return ret;
}
*/
void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
{
if ( dest == "root" || dest == "/" )
return;
qApp->processEvents();
QStringList *fileList = getList( packFileName, destDir );
qApp->processEvents();
processFileList( fileList, destDir );
delete fileList;
}
QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
{
QString packageFileDir = destDir+"/usr/lib/ipkg/info/"+packageFilename+".list";
QFile f( packageFileDir );
cout << "Try to open " << packageFileDir << endl;
if ( !f.open(IO_ReadOnly) )
{
// Couldn't open from dest, try from /
cout << "Could not open:" << packageFileDir << endl;
f.close();
packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list";
f.setName( packageFileDir );
qDebug( "Try to open %s", packageFileDir.latin1() );
if ( ! f.open(IO_ReadOnly) )
{
qDebug( "Could not open: %s", packageFileDir.latin1() );
emit outputText( QString( "Could not open :" ) + packageFileDir );
return (QStringList*)0;
}
}
QStringList *fileList = new QStringList();
QTextStream t( &f );
while ( !t.eof() )
*fileList += t.readLine();
f.close();
return fileList;
}
void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir )
{
if ( !fileList || fileList->isEmpty() )
return;
QString baseDir = ROOT;
if ( createLinks == true )
{
for ( uint i=0; i < fileList->count(); i++ )
{
processLinkDir( (*fileList)[i], baseDir, destDir );
qApp->processEvents();
}
}
else
{
for ( int i = fileList->count()-1; i >= 0 ; i-- )
{
processLinkDir( (*fileList)[i], baseDir, destDir );
qApp->processEvents();
}
}
}
void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir )
{
QString sourceFile = baseDir + file;
QString linkFile = destDir;
if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" )
{
linkFile += file.mid( 1 );
}
else
{
linkFile += file;
}
QString text;
if ( createLinks )
{
// If this file is a directory (ends with a /) and it doesn't exist,
// we need to create it
if ( file.right(1) == "/" )
{
QFileInfo f( linkFile );
if ( !f.exists() )
{
emit outputText( QString( "Creating directory " ) + linkFile );
QDir d;
d.mkdir( linkFile, true );
}
// else
// emit outputText( QString( "Directory " ) + linkFile + " already exists" );
}
else
{
int rc = symlink( sourceFile, linkFile );
text = (rc == 0 ? "Linked " : "Failed to link ");
text += sourceFile + " to " + linkFile;
emit outputText( text );
}
}
else
{
QFileInfo f( linkFile );
if ( f.exists() )
{
if ( f.isFile() )
{
QFile f( linkFile );
bool rc = f.remove();
text = (rc ? "Removed " : "Failed to remove ");
text += linkFile;
emit outputText( text );
}
else if ( f.isDir() )
{
QDir d;
bool rc = d.rmdir( linkFile, true );
if ( rc )
{
text = (rc ? "Removed " : "Failed to remove ");
text += linkFile;
emit outputText( text );
}
}
}
}
}
diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h
index d49bb04..531bfc0 100644
--- a/noncore/settings/aqpkg/ipkg.h
+++ b/noncore/settings/aqpkg/ipkg.h
@@ -1,89 +1,90 @@
/***************************************************************************
ipkg.h - description
-------------------
begin : Sat Aug 31 2002
copyright : (C) 2002 by Andy Qua
email : andy.qua@blueyonder.co.uk
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef IPKG_H
#define IPKG_H
/**
*@author Andy Qua
*/
#include <qobject.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qlist.h>
#define FORCE_DEPENDS 0x0001
#define FORCE_REMOVE 0x0002
#define FORCE_REINSTALL 0x0004
#define FORCE_OVERWRITE 0x0008
#define MAKE_LINKS 0x0010
#define VERBOSE_WGET 0x0020
class OProcess;
class Ipkg : public QObject
{
Q_OBJECT
public:
Ipkg();
~Ipkg();
bool runIpkg( );
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 ) { flags = fl; }
+ void setFlags( int fl, int il ) { flags = fl; infoLevel = il; }
void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; }
signals:
void outputText( const QString &text );
public slots:
void commandStdout(OProcess*, char *buffer, int buflen);
void commandStderr(OProcess*, char *buffer, int buflen);
void processFinished();
void abort();
private:
bool createLinks;
bool aborted;
bool error;
QString option;
QString package;
QString destination;
QString destDir;
QString runtimeDir;
OProcess *proc;
int flags;
+ int infoLevel;
bool finished;
QList<QString> *dependantPackages;
int executeIpkgCommand( QStringList &cmd, const QString option );
void removeStatusEntry();
void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir );
QStringList* getList( const QString &packageFilename, const QString &destDir );
void processFileList( const QStringList *fileList, const QString &destDir );
void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir );
};
#endif