summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/settings/packagemanager/ChangeLog8
-rw-r--r--noncore/settings/packagemanager/README2
-rw-r--r--noncore/settings/packagemanager/TODO14
-rw-r--r--noncore/settings/packagemanager/installdlg.cpp84
-rw-r--r--noncore/settings/packagemanager/installdlg.h7
-rw-r--r--noncore/settings/packagemanager/mainwindow.cpp25
-rw-r--r--noncore/settings/packagemanager/opie-packagemanager.control4
7 files changed, 93 insertions, 51 deletions
diff --git a/noncore/settings/packagemanager/ChangeLog b/noncore/settings/packagemanager/ChangeLog
index c9e33c4..7799136 100644
--- a/noncore/settings/packagemanager/ChangeLog
+++ b/noncore/settings/packagemanager/ChangeLog
@@ -1,37 +1,45 @@
12004-11-18 Dan Williams <drw@handhelds.org>
2
3 * Released version 0.5.0
4 * All v1.0 functionality implemented
5 * Implemented installation of local packages
6 * Implemented linking of non-root apps (using ipkg-link)
7 * Many UI tweaks for installation and filter dialogs
8
12004-04-21 Dan Williams <drw@handhelds.org> 92004-04-21 Dan Williams <drw@handhelds.org>
2 10
3 * Released version 0.4.0 11 * Released version 0.4.0
4 * Added saving of ipkg configuration information 12 * Added saving of ipkg configuration information
5 * Re-initialize ipkg when configuration information changes 13 * Re-initialize ipkg when configuration information changes
6 * Added QWhatsThis for all UI controls 14 * Added QWhatsThis for all UI controls
7 * Remove Location from OConfItem as it is not used/needed 15 * Remove Location from OConfItem as it is not used/needed
8 * Re-ordered includes to follow Opie standards 16 * Re-ordered includes to follow Opie standards
9 17
102004-02-13 Dan Williams <drw@handhelds.org> 182004-02-13 Dan Williams <drw@handhelds.org>
11 19
12 * Released version 0.3.0 20 * Released version 0.3.0
13 * Fix handling of filtering options in View menu 21 * Fix handling of filtering options in View menu
14 * Do proper version string comparison 22 * Do proper version string comparison
15 * Fix string alignment code in PromptDlg to eliminate QT warning messages 23 * Fix string alignment code in PromptDlg to eliminate QT warning messages
16 24
172004-02-12 Dan Williams <drw@handhelds.org> 252004-02-12 Dan Williams <drw@handhelds.org>
18 26
19 * Package information dialog implemented 27 * Package information dialog implemented
20 * What's This app icon enabled 28 * What's This app icon enabled
21 * Changed all QDialog::exec() occurences to QPEApplication::execDialog() 29 * Changed all QDialog::exec() occurences to QPEApplication::execDialog()
22 30
232004-01-23 Dan Williams <drw@handhelds.org> 312004-01-23 Dan Williams <drw@handhelds.org>
24 32
25 * Added package download functionality 33 * Added package download functionality
26 * Have Opie update links after install/removal so that apps 34 * Have Opie update links after install/removal so that apps
27 will display properly in Launcher 35 will display properly in Launcher
28 36
292004-01-20 Dan Williams <drw@handhelds.org> 372004-01-20 Dan Williams <drw@handhelds.org>
30 38
31 * Released version 0.2.0 39 * Released version 0.2.0
32 * Converted to use libipkg in place of spawning ipkg process 40 * Converted to use libipkg in place of spawning ipkg process
33 41
342004-01-13 Dan Williams <drw@handhelds.org> 422004-01-13 Dan Williams <drw@handhelds.org>
35 43
36 * Released version 0.1.0 44 * Released version 0.1.0
37 * Initial check-in of new package management client to eventually replace AQPkg 45 * Initial check-in of new package management client to eventually replace AQPkg
diff --git a/noncore/settings/packagemanager/README b/noncore/settings/packagemanager/README
index bf93c98..c34a6af 100644
--- a/noncore/settings/packagemanager/README
+++ b/noncore/settings/packagemanager/README
@@ -1,53 +1,53 @@
1/************************************************************************ 1/************************************************************************
2/* 2/*
3/* Opie - Package Manager 3/* Opie - Package Manager
4/* ======================== 4/* ========================
5/* Version 0.4.0 5/* Version 0.5.0
6/* 6/*
7/* A package management client for Opie 7/* A package management client for Opie
8/* 8/*
9/************************************************************************ 9/************************************************************************
10 10
11------------------------------------------------------- 11-------------------------------------------------------
12 Release Notes for Opie-PackageManager - January, 2004 12 Release Notes for Opie-PackageManager - January, 2004
13------------------------------------------------------- 13-------------------------------------------------------
14 14
15====================== 15======================
16= To-do = 16= To-do =
17====================== 17======================
18 18
19- See $OPIEDIR/noncore/settings/packagemanager/TODO for more info. 19- See $OPIEDIR/noncore/settings/packagemanager/TODO for more info.
20 20
21====================== 21======================
22= Build = 22= Build =
23====================== 23======================
24 24
25In order to build opie-packagemanager, libipkg needs to be present on 25In order to build opie-packagemanager, libipkg needs to be present on
26the build system along with the appropriate headers. 26the build system along with the appropriate headers.
27 27
28- libipkg source (best to use version 109 or greater): 28- libipkg source (best to use version 109 or greater):
29 - Familiar CVS directory: familiar/dist/ipkg/C (e.g. 'cvs co familiar/dist/ipkg/C') 29 - Familiar CVS directory: familiar/dist/ipkg/C (e.g. 'cvs co familiar/dist/ipkg/C')
30 - FTP: ftp://handhelds.org/linux/packages/ipkg 30 - FTP: ftp://handhelds.org/linux/packages/ipkg
31 31
32- before building opie-packagemanager, define the environmental variable 32- before building opie-packagemanager, define the environmental variable
33 IPKGDIR to point to the directory containing the ipkg source code 33 IPKGDIR to point to the directory containing the ipkg source code
34 - e.g. 'export IPKGDIR=$HOME/familiar/dist/ipkg/C' 34 - e.g. 'export IPKGDIR=$HOME/familiar/dist/ipkg/C'
35 35
36====================== 36======================
37= Run = 37= Run =
38====================== 38======================
39 39
40- In order to use opie-packagemanager, libipkg must be installed 40- In order to use opie-packagemanager, libipkg must be installed
41 on the system. 41 on the system.
42 42
43====================== 43======================
44= Credits = 44= Credits =
45====================== 45======================
46 46
47- Opie-PackageManager is (C) 2003-2004 Dan Williams 47- Opie-PackageManager is (C) 2003-2004 Dan Williams
48 48
49====================== 49======================
50= Links = 50= Links =
51====================== 51======================
52 52
53- Opie Project: http://opie.handhelds.org 53- Opie Project: http://opie.handhelds.org
diff --git a/noncore/settings/packagemanager/TODO b/noncore/settings/packagemanager/TODO
index 633c589..265beda 100644
--- a/noncore/settings/packagemanager/TODO
+++ b/noncore/settings/packagemanager/TODO
@@ -1,27 +1,25 @@
1/************************************************************************ 1/************************************************************************
2/* 2/*
3/* Opie - Package Manager 3/* Opie - Package Manager
4/* ======================== 4/* ========================
5/* Version 0.4.0 5/* Version 0.5.0
6/* 6/*
7/* A package management client for Opie 7/* A package management client for Opie
8/* 8/*
9/************************************************************************ 9/************************************************************************
10 10
11--------------------------------------------- 11-----------------------------------------------
12 To-do for Opie-PackageManager - April, 2004 12 To-do for Opie-PackageManager - November, 2004
13--------------------------------------------- 13-----------------------------------------------
14 14
15====================== 15======================
16= Current release = 16= Current release =
17====================== 17======================
18 18
191. Link non-root destination apps 191. Re-work package download dialog
202. Implement QCOP interface for installing, removing, etc.
213. Redesign configuration dialog
22 20
23====================== 21======================
24= Future releases = 22= Future releases =
25====================== 23======================
26 24
271. ??? \ No newline at end of file 251. Re-work server and destination tabs in configuration dialog \ No newline at end of file
diff --git a/noncore/settings/packagemanager/installdlg.cpp b/noncore/settings/packagemanager/installdlg.cpp
index 781f8f5..494603b 100644
--- a/noncore/settings/packagemanager/installdlg.cpp
+++ b/noncore/settings/packagemanager/installdlg.cpp
@@ -5,133 +5,143 @@
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7_;:, .> :=|. This file is free software; you can 7_;:, .> :=|. This file is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU General Public 9:`=1 )Y*s>-.-- : the terms of the GNU General Public
10.="- .-=="i, .._ License as published by the Free Software 10.="- .-=="i, .._ License as published by the Free Software
11- . .-<_> .<> Foundation; either version 2 of the License, 11- . .-<_> .<> Foundation; either version 2 of the License,
12 ._= =} : or (at your option) any later version. 12 ._= =} : or (at your option) any later version.
13 .%`+i> _;_. 13 .%`+i> _;_.
14 .i_,=:_. -<s. This file is distributed in the hope that 14 .i_,=:_. -<s. This file is distributed in the hope that
15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
16 : .. .:, . . . without even the implied warranty of 16 : .. .:, . . . without even the implied warranty of
17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General 18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General
19..}^=.= = ; Public License for more details. 19..}^=.= = ; Public License for more details.
20++= -. .` .: 20++= -. .` .:
21: = ...= . :.=- You should have received a copy of the GNU 21: = ...= . :.=- You should have received a copy of the GNU
22-. .:....=;==+<; General Public License along with this file; 22-. .:....=;==+<; General Public License along with this file;
23 -_. . . )=. = see the file COPYING. If not, write to the 23 -_. . . )=. = see the file COPYING. If not, write to the
24 -- :-=` Free Software Foundation, Inc., 24 -- :-=` Free Software Foundation, Inc.,
25 59 Temple Place - Suite 330, 25 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27 27
28*/ 28*/
29 29
30#include "installdlg.h" 30#include "installdlg.h"
31 31
32#include <opie2/ofiledialog.h> 32#include <opie2/ofiledialog.h>
33#include <opie2/oprocess.h> 33#include <opie2/oprocess.h>
34 34
35#include <qpe/fileselector.h> 35#include <qpe/fileselector.h>
36#include <qpe/resource.h> 36#include <qpe/resource.h>
37#include <qpe/storage.h> 37#include <qpe/storage.h>
38 38
39#include <qapplication.h> 39#include <qapplication.h>
40#include <qcombobox.h> 40#include <qcombobox.h>
41#include <qfileinfo.h> 41#include <qfileinfo.h>
42#include <qgroupbox.h> 42#include <qgroupbox.h>
43#include <qlabel.h> 43#include <qlabel.h>
44#include <qlayout.h> 44#include <qlayout.h>
45#include <qmap.h> 45#include <qmap.h>
46#include <qmultilineedit.h> 46#include <qmultilineedit.h>
47#include <qpushbutton.h> 47#include <qpushbutton.h>
48 48
49#include <sys/vfs.h> 49#include <sys/vfs.h>
50 50
51#include "opackagemanager.h" 51#include "opackagemanager.h"
52 52
53InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &caption, bool showDestInfo, 53InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &caption,
54 OPackage::Command command1, const QStringList &packages1, 54 OPackage::Command command1, const QStringList &packages1,
55 OPackage::Command command2, const QStringList &packages2, 55 OPackage::Command command2, const QStringList &packages2,
56 OPackage::Command command3, const QStringList &packages3 ) 56 OPackage::Command command3, const QStringList &packages3 )
57 : QWidget( 0x0 ) 57 : QWidget( 0x0 )
58 , m_packman( pm ) 58 , m_packman( pm )
59 , m_installFound( false )
59 , m_numCommands( 0 ) 60 , m_numCommands( 0 )
60 , m_currCommand( 0 ) 61 , m_currCommand( 0 )
61 , m_destItem( 0x0 ) 62 , m_destItem( 0x0 )
62{ 63{
63 // Save command/package list information 64 // Save command/package list information
64 if ( command1 != OPackage::NotDefined ) 65 if ( command1 != OPackage::NotDefined )
65 { 66 {
66 m_command[ m_numCommands ] = command1; 67 m_command[ m_numCommands ] = command1;
67 m_packages[ m_numCommands ] = packages1; 68 m_packages[ m_numCommands ] = packages1;
68 ++m_numCommands; 69 ++m_numCommands;
70
71 if ( command1 == OPackage::Install )
72 m_installFound = true;
69 } 73 }
70 if ( command2 != OPackage::NotDefined ) 74 if ( command2 != OPackage::NotDefined )
71 { 75 {
72 m_command[ m_numCommands ] = command2; 76 m_command[ m_numCommands ] = command2;
73 m_packages[ m_numCommands ] = packages2; 77 m_packages[ m_numCommands ] = packages2;
74 ++m_numCommands; 78 ++m_numCommands;
79
80 if ( command2 == OPackage::Install )
81 m_installFound = true;
75 } 82 }
76 if ( command3 != OPackage::NotDefined ) 83 if ( command3 != OPackage::NotDefined )
77 { 84 {
78 m_command[ m_numCommands ] = command3; 85 m_command[ m_numCommands ] = command3;
79 m_packages[ m_numCommands ] = packages3; 86 m_packages[ m_numCommands ] = packages3;
80 ++m_numCommands; 87 ++m_numCommands;
88
89 if ( command3 == OPackage::Install )
90 m_installFound = true;
81 } 91 }
82 92
83 // Initialize UI 93 // Initialize UI
84 if ( parent ) 94 if ( parent )
85 parent->setCaption( caption ); 95 parent->setCaption( caption );
86 96
87 QGridLayout *layout = new QGridLayout( this, 4, 2, 2, 4 ); 97 QGridLayout *layout = new QGridLayout( this, 4, 2, 2, 4 );
88 98
89 if ( showDestInfo ) 99 if ( m_installFound )
90 { 100 {
91 QLabel *label = new QLabel( tr( "Destination" ), this ); 101 QLabel *label = new QLabel( tr( "Destination" ), this );
92 layout->addWidget( label, 0, 0 ); 102 layout->addWidget( label, 0, 0 );
93 m_destination = new QComboBox( this ); 103 m_destination = new QComboBox( this );
94 m_destination->insertStringList( m_packman->destinations() ); 104 m_destination->insertStringList( m_packman->destinations() );
95 layout->addWidget( m_destination, 0, 1 ); 105 layout->addWidget( m_destination, 0, 1 );
96 connect( m_destination, SIGNAL(highlighted(const QString&)), 106 connect( m_destination, SIGNAL(highlighted(const QString&)),
97 this, SLOT(slotDisplayAvailSpace(const QString&)) ); 107 this, SLOT(slotDisplayAvailSpace(const QString&)) );
98 108
99 label = new QLabel( tr( "Space Avail" ), this ); 109 label = new QLabel( tr( "Space Avail" ), this );
100 layout->addWidget( label, 1, 0 ); 110 layout->addWidget( label, 1, 0 );
101 m_availSpace = new QLabel( this ); 111 m_availSpace = new QLabel( this );
102 layout->addWidget( m_availSpace, 1, 1 ); 112 layout->addWidget( m_availSpace, 1, 1 );
103 113
104 // TODO - select correct destination 114 // TODO - select correct destination
105 slotDisplayAvailSpace( m_destination->currentText() ); 115 slotDisplayAvailSpace( m_destination->currentText() );
106 } 116 }
107 else 117 else
108 { 118 {
109 m_destination = 0x0; 119 m_destination = 0x0;
110 m_availSpace = 0x0; 120 m_availSpace = 0x0;
111 } 121 }
112 122
113 QGroupBox *groupBox = new QGroupBox( 0, Qt::Vertical, tr( "Output" ), this ); 123 QGroupBox *groupBox = new QGroupBox( 0, Qt::Vertical, tr( "Output" ), this );
114 groupBox->layout()->setSpacing( 0 ); 124 groupBox->layout()->setSpacing( 0 );
115 groupBox->layout()->setMargin( 4 ); 125 groupBox->layout()->setMargin( 4 );
116 126
117 QVBoxLayout *groupBoxLayout = new QVBoxLayout( groupBox->layout() ); 127 QVBoxLayout *groupBoxLayout = new QVBoxLayout( groupBox->layout() );
118 m_output = new QMultiLineEdit( groupBox ); 128 m_output = new QMultiLineEdit( groupBox );
119 m_output->setReadOnly( true ); 129 m_output->setReadOnly( true );
120 groupBoxLayout->addWidget( m_output ); 130 groupBoxLayout->addWidget( m_output );
121 layout->addMultiCellWidget( groupBox, 2, 2, 0, 1 ); 131 layout->addMultiCellWidget( groupBox, 2, 2, 0, 1 );
122 132
123 m_btnStart = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), tr( "Start" ), this ); 133 m_btnStart = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), tr( "Start" ), this );
124 layout->addWidget( m_btnStart, 3, 0 ); 134 layout->addWidget( m_btnStart, 3, 0 );
125 connect( m_btnStart, SIGNAL(clicked()), this, SLOT(slotBtnStart()) ); 135 connect( m_btnStart, SIGNAL(clicked()), this, SLOT(slotBtnStart()) );
126 136
127 m_btnOptions = new QPushButton( Resource::loadPixmap( "SettingsIcon" ), tr( "Options" ), this ); 137 m_btnOptions = new QPushButton( Resource::loadPixmap( "SettingsIcon" ), tr( "Options" ), this );
128 layout->addWidget( m_btnOptions, 3, 1 ); 138 layout->addWidget( m_btnOptions, 3, 1 );
129 connect( m_btnOptions, SIGNAL( clicked() ), this, SLOT(slotBtnOptions()) ); 139 connect( m_btnOptions, SIGNAL( clicked() ), this, SLOT(slotBtnOptions()) );
130 140
131 // Display packages being acted upon in output widget 141 // Display packages being acted upon in output widget
132 for( int i = 0; i < m_numCommands; i++ ) 142 for( int i = 0; i < m_numCommands; i++ )
133 { 143 {
134 if ( !m_packages[ i ].isEmpty() ) 144 if ( !m_packages[ i ].isEmpty() )
135 { 145 {
136 QString lineStr = tr( "Packages to " ); 146 QString lineStr = tr( "Packages to " );
137 147
@@ -175,154 +185,180 @@ void InstallDlg::slotDisplayAvailSpace( const QString &destination )
175 185
176 // Get destination 186 // Get destination
177 if ( !destination.isNull() ) 187 if ( !destination.isNull() )
178 m_destItem = m_packman->findConfItem( OConfItem::Destination, destination ); 188 m_destItem = m_packman->findConfItem( OConfItem::Destination, destination );
179 189
180 if ( m_destItem ) 190 if ( m_destItem )
181 { 191 {
182 // Calculate available space 192 // Calculate available space
183 struct statfs fs; 193 struct statfs fs;
184 if ( !statfs( m_destItem->value(), &fs ) ) 194 if ( !statfs( m_destItem->value(), &fs ) )
185 { 195 {
186 long mult = fs.f_bsize / 1024; 196 long mult = fs.f_bsize / 1024;
187 long div = 1024 / fs.f_bsize; 197 long div = 1024 / fs.f_bsize;
188 198
189 if ( !mult ) mult = 1; 199 if ( !mult ) mult = 1;
190 if ( !div ) div = 1; 200 if ( !div ) div = 1;
191 long avail = fs.f_bavail * mult / div; 201 long avail = fs.f_bavail * mult / div;
192 202
193 space = tr( "%1 Kb" ).arg( avail ); 203 space = tr( "%1 Kb" ).arg( avail );
194 } 204 }
195 } 205 }
196 206
197 // Display available space 207 // Display available space
198 m_availSpace->setText( space ); 208 m_availSpace->setText( space );
199} 209}
200 210
201void InstallDlg::slotBtnStart() 211void InstallDlg::slotBtnStart()
202{ 212{
203 QString btnText = m_btnStart->text(); 213 QString btnText = m_btnStart->text();
204 if ( btnText == tr( "Abort" ) ) 214 if ( btnText == tr( "Abort" ) )
205 { 215 {
206 // Prevent unexecuted commands from executing 216 // Prevent unexecuted commands from executing
207 m_currCommand = 999; 217 m_currCommand = 999;
208 218
209 // Allow user to close dialog 219 // Allow user to close dialog
210 m_btnStart->setText( tr( "Close" ) ); 220 m_btnStart->setText( tr( "Close" ) );
211 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) ); 221 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) );
212 return; 222 return;
213 } 223 }
214 else if ( btnText == tr( "Close" ) ) 224 else if ( btnText == tr( "Close" ) )
215 { 225 {
216 // TODO - force reload of package data 226 // TODO - force reload of package data
217 emit closeInstallDlg(); 227 emit closeInstallDlg();
218 return; 228 return;
219 } 229 }
220 230
221 // Start was clicked, start executing 231 // Start was clicked, start executing
222 QString dest; 232 QString dest;
223 if ( m_destination ) 233 if ( m_installFound )
224 { 234 {
225 dest = m_destination->currentText(); 235 dest = m_destination->currentText();
226 m_destination->setEnabled( false ); 236 m_destination->setEnabled( false );
227 } 237 }
228 238
229 m_btnOptions->setEnabled( false ); 239 m_btnOptions->setEnabled( false );
230 if ( m_numCommands > 1 ) 240 if ( m_numCommands > 1 )
231 { 241 {
232 m_btnStart->setText( tr( "Abort" ) ); 242 m_btnStart->setText( tr( "Abort" ) );
233 m_btnStart->setIconSet( Resource::loadPixmap( "close" ) ); 243 m_btnStart->setIconSet( Resource::loadPixmap( "close" ) );
234 } 244 }
235 else 245 else
236 { 246 {
237 m_btnStart->setEnabled( false ); 247 m_btnStart->setEnabled( false );
238 } 248 }
239 249
250 Opie::Core::OProcess process( this );
240 for ( m_currCommand = 0; m_currCommand < m_numCommands; m_currCommand++ ) 251 for ( m_currCommand = 0; m_currCommand < m_numCommands; m_currCommand++ )
241 { 252 {
242 // Execute next command 253 // Execute next command
243 m_packman->executeCommand( m_command[ m_currCommand ], m_packages[ m_currCommand ], dest, 254 m_packman->executeCommand( m_command[ m_currCommand ], m_packages[ m_currCommand ], dest,
244 this, SLOT(slotOutput(char*)), true ); 255 this, SLOT(slotOutput(char*)), true );
245 }
246 slotProcessDone(0l);
247 256
248 // Get destination 257 // Link/Unlink application if the package was removed from or installed to a destination
249/* 258 // other than root
250 if ( dest == "root" ) 259 if ( ( m_command[ m_currCommand ] == OPackage::Install && dest != "root" ) ||
260 ( m_command[ m_currCommand ] == OPackage::Remove ) )
251 { 261 {
252 slotProcessDone(0l); 262 //m_packman->findPackage( m_packages[ m_currCommand ]->destination() != "root"*/ )
253 return;
254 }
255 263
256 m_destItem = m_packman->findConfItem( OConfItem::Destination, dest ); 264 // Loop through all package names in the command group
257 if ( m_destItem ) 265 for ( QStringList::Iterator it = m_packages[ m_currCommand ].begin();
266 it != m_packages[ m_currCommand ].end();
267 ++it )
258 { 268 {
259 QString path = m_destItem->value(); 269 OPackage *currPackage = m_packman->findPackage( (*it) );
260 Opie::Core::OProcess *process = new Opie::Core::OProcess( this, "ipkg-link process" );
261 connect( process, SIGNAL(processExited(Opie::Core::OProcess*)),
262 this, SLOT(slotProcessDone(Opie::Core::OProcess*)) );
263 270
264 *process << "ipkg-link" << "mount" << path; 271 // Skip package if it is not found or being removed from 'root'
265 if ( !process->start( Opie::Core::OProcess::NotifyOnExit, 272 if ( !currPackage || ( m_command[ m_currCommand ] == OPackage::Remove &&
273 currPackage->destination() == "root" ) )
274 continue;
275
276 // Display feedback to user
277 if ( m_command[ m_currCommand ] == OPackage::Install )
278 m_output->append( tr( QString( "Running ipkg-link to link package '%1'." )
279 .arg( currPackage->name() ) ) );
280 else
281 m_output->append( tr( QString( "Running ipkg-link to remove links for package '%1'." )
282 .arg( currPackage->name() ) ) );
283 m_output->setCursorPosition( m_output->numLines(), 0 );
284
285 // Execute ipkg-link
286 process.clearArguments();
287 process << "ipkg-link"
288 << ( ( m_command[ m_currCommand ] == OPackage::Install ) ? "add" : "remove" )
289 << currPackage->name();
290 if ( !process.start( Opie::Core::OProcess::Block,
266 Opie::Core::OProcess::NoCommunication ) ) 291 Opie::Core::OProcess::NoCommunication ) )
267 slotProcessDone( 0l ); 292 {
268 m_output->append( tr( "Starting ipkg-link to link installed applications." ) ); 293 slotProcessDone( 0x0 );
294 m_output->append( tr( "Unable to run ipkg-link." ) );
269 m_output->setCursorPosition( m_output->numLines(), 0 ); 295 m_output->setCursorPosition( m_output->numLines(), 0 );
296 return;
270 } 297 }
271*/ 298 }
299
300 }
301 }
302
303 slotProcessDone( 0x0 );
272} 304}
273 305
274void InstallDlg::slotProcessDone( Opie::Core::OProcess *proc ) 306void InstallDlg::slotProcessDone( Opie::Core::OProcess *proc )
275{ 307{
276 delete proc; 308 if ( proc )
277 309 {
310 // Display message pnly if linking was done
278 m_output->append( tr( "The package linking is done." ) ); 311 m_output->append( tr( "The package linking is done." ) );
279 m_output->setCursorPosition( m_output->numLines(), 0 ); 312 m_output->setCursorPosition( m_output->numLines(), 0 );
280 313
314 delete proc;
315 }
316
281 // All commands executed, allow user to close dialog 317 // All commands executed, allow user to close dialog
282 m_btnStart->setEnabled( true ); 318 m_btnStart->setEnabled( true );
283 m_btnStart->setText( tr( "Close" ) ); 319 m_btnStart->setText( tr( "Close" ) );
284 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) ); 320 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) );
285 321
286 m_btnOptions->setEnabled( true ); 322 m_btnOptions->setEnabled( true );
287 m_btnOptions->setText( tr( "Save output" ) ); 323 m_btnOptions->setText( tr( "Save output" ) );
288 m_btnOptions->setIconSet( Resource::loadPixmap( "save" ) ); 324 m_btnOptions->setIconSet( Resource::loadPixmap( "save" ) );
289} 325}
290 326
291void InstallDlg::slotBtnOptions() 327void InstallDlg::slotBtnOptions()
292{ 328{
293 QString btnText = m_btnOptions->text(); 329 QString btnText = m_btnOptions->text();
294 if ( btnText == tr( "Options" ) ) 330 if ( btnText == tr( "Options" ) )
295 { 331 {
296 // Display configuration dialog (only options tab is enabled) 332 // Display configuration dialog (only options tab is enabled)
297 m_packman->configureDlg( true ); 333 m_packman->configureDlg( true );
298 return; 334 return;
299 } 335 }
300 336
301 // Save output was clicked 337 // Save output was clicked
302 QMap<QString, QStringList> map; 338 QMap<QString, QStringList> map;
303 map.insert( tr( "All" ), QStringList() ); 339 map.insert( tr( "All" ), QStringList() );
304 QStringList text; 340 QStringList text;
305 text << "text/*"; 341 text << "text/*";
306 map.insert(tr( "Text" ), text ); 342 map.insert(tr( "Text" ), text );
307 text << "*"; 343 text << "*";
308 map.insert( tr( "All" ), text ); 344 map.insert( tr( "All" ), text );
309 345
310 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map ); 346 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map );
311 if( !filename.isEmpty() ) 347 if( !filename.isEmpty() )
312 { 348 {
313 QString currentFileName = QFileInfo( filename ).fileName(); 349 QString currentFileName = QFileInfo( filename ).fileName();
314 DocLnk doc; 350 DocLnk doc;
315 doc.setType( "text/plain" ); 351 doc.setType( "text/plain" );
316 doc.setFile( filename ); 352 doc.setFile( filename );
317 doc.setName( currentFileName ); 353 doc.setName( currentFileName );
318 FileManager fm; 354 FileManager fm;
319 fm.saveFile( doc, m_output->text() ); 355 fm.saveFile( doc, m_output->text() );
320 } 356 }
321} 357}
322 358
323void InstallDlg::slotOutput( char *msg ) 359void InstallDlg::slotOutput( char *msg )
324{ 360{
325 // Allow processing of other events 361 // Allow processing of other events
326 qApp->processEvents(); 362 qApp->processEvents();
327 363
328 QString lineStr = msg; 364 QString lineStr = msg;
diff --git a/noncore/settings/packagemanager/installdlg.h b/noncore/settings/packagemanager/installdlg.h
index f45c17c..eabb717 100644
--- a/noncore/settings/packagemanager/installdlg.h
+++ b/noncore/settings/packagemanager/installdlg.h
@@ -10,89 +10,92 @@ _;:, .> :=|. This file is free software; you can
10.="- .-=="i, .._ License as published by the Free Software 10.="- .-=="i, .._ License as published by the Free Software
11- . .-<_> .<> Foundation; either version 2 of the License, 11- . .-<_> .<> Foundation; either version 2 of the License,
12 ._= =} : or (at your option) any later version. 12 ._= =} : or (at your option) any later version.
13 .%`+i> _;_. 13 .%`+i> _;_.
14 .i_,=:_. -<s. This file is distributed in the hope that 14 .i_,=:_. -<s. This file is distributed in the hope that
15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
16 : .. .:, . . . without even the implied warranty of 16 : .. .:, . . . without even the implied warranty of
17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General 18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General
19..}^=.= = ; Public License for more details. 19..}^=.= = ; Public License for more details.
20++= -. .` .: 20++= -. .` .:
21: = ...= . :.=- You should have received a copy of the GNU 21: = ...= . :.=- You should have received a copy of the GNU
22-. .:....=;==+<; General Public License along with this file; 22-. .:....=;==+<; General Public License along with this file;
23 -_. . . )=. = see the file COPYING. If not, write to the 23 -_. . . )=. = see the file COPYING. If not, write to the
24 -- :-=` Free Software Foundation, Inc., 24 -- :-=` Free Software Foundation, Inc.,
25 59 Temple Place - Suite 330, 25 59 Temple Place - Suite 330,
26 Boston, MA 02111-1307, USA. 26 Boston, MA 02111-1307, USA.
27 27
28*/ 28*/
29 29
30#ifndef INSTALLDLG_H 30#ifndef INSTALLDLG_H
31#define INSTALLDLG_H 31#define INSTALLDLG_H
32 32
33#include <qwidget.h> 33#include <qwidget.h>
34 34
35#include "opackage.h" 35#include "opackage.h"
36 36
37class QComboBox; 37class QComboBox;
38class QLabel; 38class QLabel;
39class QMultiLineEdit; 39class QMultiLineEdit;
40class QPushButton; 40class QPushButton;
41 41
42class OConfItem; 42class OConfItem;
43class OPackageManager; 43class OPackageManager;
44 44
45namespace Opie 45namespace Opie
46{ 46{
47 namespace Core 47 namespace Core
48 { 48 {
49 class OProcess; 49 class OProcess;
50 } 50 }
51} 51}
52 52
53class InstallDlg : public QWidget 53class InstallDlg : public QWidget
54{ 54{
55 Q_OBJECT 55 Q_OBJECT
56 56
57public: 57public:
58 InstallDlg( QWidget *parent = 0x0, OPackageManager *pm = 0x0, const QString &caption = QString::null, 58 InstallDlg( QWidget *parent = 0x0, OPackageManager *pm = 0x0,
59 bool showDestInfo = true, 59 const QString &caption = QString::null,
60 OPackage::Command command1 = OPackage::NotDefined, 60 OPackage::Command command1 = OPackage::NotDefined,
61 const QStringList &packages1 = QStringList(), 61 const QStringList &packages1 = QStringList(),
62 OPackage::Command command2 = OPackage::NotDefined, 62 OPackage::Command command2 = OPackage::NotDefined,
63 const QStringList &packages2 = QStringList(), 63 const QStringList &packages2 = QStringList(),
64 OPackage::Command command3 = OPackage::NotDefined, 64 OPackage::Command command3 = OPackage::NotDefined,
65 const QStringList &packages3 = QStringList() ); 65 const QStringList &packages3 = QStringList() );
66 66
67private: 67private:
68 OPackageManager *m_packman; // Pointer to application instance of package manager 68 OPackageManager *m_packman; // Pointer to application instance of package manager
69 69
70 bool m_installFound; // Indicates if an install is being done, controls display of
71 // destination selection, available space
72
70 // UI controls 73 // UI controls
71 QComboBox *m_destination; // Destination selection list 74 QComboBox *m_destination; // Destination selection list
72 QLabel *m_availSpace; // Text label to display available space on selected destination 75 QLabel *m_availSpace; // Text label to display available space on selected destination
73 QMultiLineEdit *m_output; // Multi-line edit to display status 76 QMultiLineEdit *m_output; // Multi-line edit to display status
74 QPushButton *m_btnStart; // Start/abort/close button 77 QPushButton *m_btnStart; // Start/abort/close button
75 QPushButton *m_btnOptions; // Installation options button 78 QPushButton *m_btnOptions; // Installation options button
76 79
77 // Commands and packages to execute 80 // Commands and packages to execute
78 int m_numCommands; // Number of commands to be executed 81 int m_numCommands; // Number of commands to be executed
79 int m_currCommand; // Number of currently executing command 82 int m_currCommand; // Number of currently executing command
80 OPackage::Command m_command[3]; // List of commands to be executed 83 OPackage::Command m_command[3]; // List of commands to be executed
81 QStringList m_packages[3]; // Lists of package names associated to commands (m_command[]) 84 QStringList m_packages[3]; // Lists of package names associated to commands (m_command[])
82 OConfItem *m_destItem; // Pointer to destination for package installation 85 OConfItem *m_destItem; // Pointer to destination for package installation
83 86
84private slots: 87private slots:
85 // UI control slots 88 // UI control slots
86 void slotDisplayAvailSpace( const QString &destination ); 89 void slotDisplayAvailSpace( const QString &destination );
87 void slotBtnStart(); 90 void slotBtnStart();
88 void slotBtnOptions(); 91 void slotBtnOptions();
89 void slotProcessDone( Opie::Core::OProcess *proc ); 92 void slotProcessDone( Opie::Core::OProcess *proc );
90 93
91 // Execution slots 94 // Execution slots
92 void slotOutput( char *msg ); 95 void slotOutput( char *msg );
93 96
94signals: 97signals:
95 void closeInstallDlg(); 98 void closeInstallDlg();
96}; 99};
97 100
98#endif 101#endif
diff --git a/noncore/settings/packagemanager/mainwindow.cpp b/noncore/settings/packagemanager/mainwindow.cpp
index 459a75b..8a5b90c 100644
--- a/noncore/settings/packagemanager/mainwindow.cpp
+++ b/noncore/settings/packagemanager/mainwindow.cpp
@@ -267,316 +267,313 @@ void MainWindow::loadPackageList( OPackageList *packages, bool clearList )
267 for ( OPackageListIterator packageIt( *packages ); packageIt.current(); ++packageIt ) 267 for ( OPackageListIterator packageIt( *packages ); packageIt.current(); ++packageIt )
268 { 268 {
269 OPackage *package = packageIt.current(); 269 OPackage *package = packageIt.current();
270 QCheckListItem *item = new QCheckListItem( &m_packageList, package->name(), 270 QCheckListItem *item = new QCheckListItem( &m_packageList, package->name(),
271 QCheckListItem::CheckBox ); 271 QCheckListItem::CheckBox );
272 m_packageList.insertItem( item ); 272 m_packageList.insertItem( item );
273 273
274 // If a different version of package is available, show update available icon 274 // If a different version of package is available, show update available icon
275 // Otherwise, show installed icon 275 // Otherwise, show installed icon
276 if ( !package->versionInstalled().isNull() ) 276 if ( !package->versionInstalled().isNull() )
277 { 277 {
278 if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 ) 278 if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 )
279 item->setPixmap( 0, m_iconUpdated ); 279 item->setPixmap( 0, m_iconUpdated );
280 else 280 else
281 item->setPixmap( 0, m_iconInstalled ); 281 item->setPixmap( 0, m_iconInstalled );
282 } 282 }
283 else 283 else
284 item->setPixmap( 0, m_iconNull ); 284 item->setPixmap( 0, m_iconNull );
285 } 285 }
286 } 286 }
287} 287}
288 288
289void MainWindow::searchForPackage( const QString &text ) 289void MainWindow::searchForPackage( const QString &text )
290{ 290{
291 if ( !text.isEmpty() ) 291 if ( !text.isEmpty() )
292 { 292 {
293 // look through package list for text startng at current position 293 // look through package list for text startng at current position
294 QCheckListItem *start = static_cast<QCheckListItem *>(m_packageList.currentItem()); 294 QCheckListItem *start = static_cast<QCheckListItem *>(m_packageList.currentItem());
295 if ( start == 0 ) 295 if ( start == 0 )
296 start = static_cast<QCheckListItem *>(m_packageList.firstChild()); 296 start = static_cast<QCheckListItem *>(m_packageList.firstChild());
297 297
298// for ( QCheckListItem *item = static_cast<QCheckListItem *>(start->nextSibling()); item != 0 ; 298// for ( QCheckListItem *item = static_cast<QCheckListItem *>(start->nextSibling()); item != 0 ;
299 for ( QCheckListItem *item = static_cast<QCheckListItem *>(start); item != 0 ; 299 for ( QCheckListItem *item = static_cast<QCheckListItem *>(start); item != 0 ;
300 item = static_cast<QCheckListItem *>(item->nextSibling()) ) 300 item = static_cast<QCheckListItem *>(item->nextSibling()) )
301 { 301 {
302 if ( item->text().lower().find( text ) != -1 ) 302 if ( item->text().lower().find( text ) != -1 )
303 { 303 {
304 m_packageList.ensureItemVisible( item ); 304 m_packageList.ensureItemVisible( item );
305 m_packageList.setCurrentItem( item ); 305 m_packageList.setCurrentItem( item );
306 break; 306 break;
307 } 307 }
308 } 308 }
309 } 309 }
310} 310}
311 311
312void MainWindow::installLocalPackage( const QString &ipkFile ) 312void MainWindow::installLocalPackage( const QString &ipkFile )
313{ 313{
314 // Install selected file 314 // Install selected file
315 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Install local package" ), true, 315 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Install local package" ),
316 OPackage::Install, ipkFile ); 316 OPackage::Install, ipkFile );
317 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) ); 317 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
318 318
319 // Display widget 319 // Display widget
320 m_widgetStack.addWidget( dlg, 3 ); 320 m_widgetStack.addWidget( dlg, 3 );
321 m_widgetStack.raiseWidget( dlg ); 321 m_widgetStack.raiseWidget( dlg );
322} 322}
323 323
324void MainWindow::setDocument( const QString &ipkFile ) 324void MainWindow::setDocument( const QString &ipkFile )
325{ 325{
326 QString file = ipkFile; 326 QString file = ipkFile;
327 DocLnk lnk( ipkFile ); 327 DocLnk lnk( ipkFile );
328 if ( lnk.isValid() ) 328 if ( lnk.isValid() )
329 file = lnk.file(); 329 file = lnk.file();
330 330
331 installLocalPackage( file ); 331 installLocalPackage( file );
332} 332}
333 333
334void MainWindow::initPackageInfo() 334void MainWindow::initPackageInfo()
335{ 335{
336 m_widgetStack.raiseWidget( &m_statusWidget ); 336 m_widgetStack.raiseWidget( &m_statusWidget );
337 337
338 // Load package list 338 // Load package list
339 m_packman.loadAvailablePackages(); 339 m_packman.loadAvailablePackages();
340 m_packman.loadInstalledPackages(); 340 m_packman.loadInstalledPackages();
341 341
342 OPackageList *packageList = m_packman.packages(); 342 OPackageList *packageList = m_packman.packages();
343 if ( packageList ) 343 if ( packageList )
344 { 344 {
345 loadPackageList( packageList, true ); 345 loadPackageList( packageList, true );
346 delete packageList; 346 delete packageList;
347 } 347 }
348 348
349 QWidget *widget = m_widgetStack.widget( 3 ); 349 QWidget *widget = m_widgetStack.widget( 3 );
350 if ( !widget ) 350 if ( !widget )
351 widget = &m_packageList; 351 widget = &m_packageList;
352 m_widgetStack.raiseWidget( widget ); 352 m_widgetStack.raiseWidget( widget );
353} 353}
354 354
355void MainWindow::slotWidgetStackShow( QWidget *widget ) 355void MainWindow::slotWidgetStackShow( QWidget *widget )
356{ 356{
357 if ( widget == &m_packageList ) 357 if ( widget == &m_packageList )
358 { 358 {
359 setCaption( tr( "Package Manager" ) ); 359 setCaption( tr( "Package Manager" ) );
360 360
361 m_menuBar.show(); 361 m_menuBar.show();
362 m_toolBar.show(); 362 m_toolBar.show();
363 } 363 }
364 else 364 else
365 { 365 {
366 m_menuBar.hide(); 366 m_menuBar.hide();
367 m_toolBar.hide(); 367 m_toolBar.hide();
368 } 368 }
369} 369}
370 370
371void MainWindow::slotInitStatusBar( int numSteps ) 371void MainWindow::slotInitStatusBar( int numSteps )
372{ 372{
373 m_statusBar.setTotalSteps( numSteps ); 373 m_statusBar.setTotalSteps( numSteps );
374} 374}
375 375
376void MainWindow::slotStatusText( const QString &status ) 376void MainWindow::slotStatusText( const QString &status )
377{ 377{
378 m_statusText.setText( status ); 378 m_statusText.setText( status );
379} 379}
380 380
381void MainWindow::slotStatusBar( int currStep ) 381void MainWindow::slotStatusBar( int currStep )
382{ 382{
383 m_statusBar.setProgress( currStep ); 383 m_statusBar.setProgress( currStep );
384} 384}
385 385
386void MainWindow::slotUpdate() 386void MainWindow::slotUpdate()
387{ 387{
388 // Create package manager output widget 388 // Create package manager output widget
389 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Update package information" ), false, 389 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Update package information" ),
390 OPackage::Update ); 390 OPackage::Update );
391 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) ); 391 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
392 392
393 // Display widget 393 // Display widget
394 m_widgetStack.addWidget( dlg, 3 ); 394 m_widgetStack.addWidget( dlg, 3 );
395 m_widgetStack.raiseWidget( dlg ); 395 m_widgetStack.raiseWidget( dlg );
396} 396}
397 397
398void MainWindow::slotUpgrade() 398void MainWindow::slotUpgrade()
399{ 399{
400 // Create package manager output widget 400 // Create package manager output widget
401 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Upgrade installed packages" ), false, 401 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Upgrade installed packages" ),
402 OPackage::Upgrade ); 402 OPackage::Upgrade );
403 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) ); 403 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
404 404
405 // Display widget 405 // Display widget
406 m_widgetStack.addWidget( dlg, 3 ); 406 m_widgetStack.addWidget( dlg, 3 );
407 m_widgetStack.raiseWidget( dlg ); 407 m_widgetStack.raiseWidget( dlg );
408} 408}
409 409
410void MainWindow::slotDownload() 410void MainWindow::slotDownload()
411{ 411{
412 // Retrieve list of packages selected for download (if any) 412 // Retrieve list of packages selected for download (if any)
413 QStringList workingPackages; 413 QStringList workingPackages;
414 414
415 for ( QCheckListItem *item = static_cast<QCheckListItem *>(m_packageList.firstChild()); 415 for ( QCheckListItem *item = static_cast<QCheckListItem *>(m_packageList.firstChild());
416 item != 0 ; 416 item != 0 ;
417 item = static_cast<QCheckListItem *>(item->nextSibling()) ) 417 item = static_cast<QCheckListItem *>(item->nextSibling()) )
418 { 418 {
419 if ( item->isOn() ) 419 if ( item->isOn() )
420 workingPackages.append( item->text() ); 420 workingPackages.append( item->text() );
421 } 421 }
422 422
423 if ( workingPackages.isEmpty() ) 423 if ( workingPackages.isEmpty() )
424 { 424 {
425 QMessageBox::information( this, tr( "Nothing to do" ), tr( "No packages selected" ), tr( "OK" ) ); 425 QMessageBox::information( this, tr( "Nothing to do" ), tr( "No packages selected" ), tr( "OK" ) );
426 return; 426 return;
427 } 427 }
428 else 428 else
429 { 429 {
430 // Download selected packages 430 // Download selected packages
431 m_config.setGroup( "settings" ); 431 m_config.setGroup( "settings" );
432 QString workingDir = m_config.readEntry( "DownloadDir", "/tmp" ); 432 QString workingDir = m_config.readEntry( "DownloadDir", "/tmp" );
433 433
434 bool ok = false; 434 bool ok = false;
435 QString text = EntryDlg::getText( tr( "Download" ), tr( "Enter path to download package to:" ), workingDir, &ok, this ); 435 QString text = EntryDlg::getText( tr( "Download" ), tr( "Enter path to download package to:" ), workingDir, &ok, this );
436 if ( ok && !text.isEmpty() ) 436 if ( ok && !text.isEmpty() )
437 workingDir = text; // user entered something and pressed ok 437 workingDir = text; // user entered something and pressed ok
438 else 438 else
439 return; // user entered nothing or pressed cancel 439 return; // user entered nothing or pressed cancel
440 440
441 // Store download directory in config file 441 // Store download directory in config file
442 m_config.writeEntry( "DownloadDir", workingDir ); 442 m_config.writeEntry( "DownloadDir", workingDir );
443 443
444 // Get starting directory 444 // Get starting directory
445 QDir::setCurrent( workingDir ); 445 QDir::setCurrent( workingDir );
446 446
447 // Create package manager output widget 447 // Create package manager output widget
448 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Download packages" ), false, 448 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Download packages" ),
449 OPackage::Download, workingPackages ); 449 OPackage::Download, workingPackages );
450 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) ); 450 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
451 451
452 // Display widget 452 // Display widget
453 m_widgetStack.addWidget( dlg, 3 ); 453 m_widgetStack.addWidget( dlg, 3 );
454 m_widgetStack.raiseWidget( dlg ); 454 m_widgetStack.raiseWidget( dlg );
455 } 455 }
456} 456}
457 457
458void MainWindow::slotApply() 458void MainWindow::slotApply()
459{ 459{
460 QStringList removeList; 460 QStringList removeList;
461 QStringList installList; 461 QStringList installList;
462 QStringList upgradeList; 462 QStringList upgradeList;
463 463
464 for ( QCheckListItem *item = static_cast<QCheckListItem *>(m_packageList.firstChild()); 464 for ( QCheckListItem *item = static_cast<QCheckListItem *>(m_packageList.firstChild());
465 item != 0 ; 465 item != 0 ;
466 item = static_cast<QCheckListItem *>(item->nextSibling()) ) 466 item = static_cast<QCheckListItem *>(item->nextSibling()) )
467 { 467 {
468 if ( item->isOn() ) 468 if ( item->isOn() )
469 { 469 {
470 OPackage *package = m_packman.findPackage( item->text() ); 470 OPackage *package = m_packman.findPackage( item->text() );
471 if ( package ) 471 if ( package )
472 { 472 {
473 if ( !package->versionInstalled().isNull() ) 473 if ( !package->versionInstalled().isNull() )
474 { 474 {
475 if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 ) 475 if ( m_packman.compareVersions( package->version(), package->versionInstalled() ) == 1 )
476 { 476 {
477 // Remove/upgrade package 477 // Remove/upgrade package
478 int answer = PromptDlg::ask( tr( "Remove or upgrade" ), 478 int answer = PromptDlg::ask( tr( "Remove or upgrade" ),
479 tr( QString( "Do you wish to remove or upgrade\n%1?" ).arg( item->text() ) ), 479 tr( QString( "Do you wish to remove or upgrade\n%1?" ).arg( item->text() ) ),
480 tr( "Remove" ), tr( "Upgrade" ), this ); 480 tr( "Remove" ), tr( "Upgrade" ), this );
481 if ( answer == 1 ) // Remove 481 if ( answer == 1 ) // Remove
482 { 482 {
483 removeList.append( item->text() ); 483 removeList.append( item->text() );
484 } 484 }
485 else if ( answer == 2 ) // Upgrade 485 else if ( answer == 2 ) // Upgrade
486 { 486 {
487 upgradeList.append( item->text() ); 487 upgradeList.append( item->text() );
488 } 488 }
489 } 489 }
490 else 490 else
491 { 491 {
492 // Remove/reinstall package 492 // Remove/reinstall package
493 int answer = PromptDlg::ask( tr( "Remove or reinstall" ), 493 int answer = PromptDlg::ask( tr( "Remove or reinstall" ),
494 tr( QString( "Do you wish to remove or reinstall\n%1?" ).arg( item->text() ) ), 494 tr( QString( "Do you wish to remove or reinstall\n%1?" ).arg( item->text() ) ),
495 tr( "Remove" ), tr( "Reinstall" ), this ); 495 tr( "Remove" ), tr( "Reinstall" ), this );
496 if ( answer == 1 ) // Remove 496 if ( answer == 1 ) // Remove
497 { 497 {
498 removeList.append( item->text() ); 498 removeList.append( item->text() );
499 } 499 }
500 else if ( answer == 2 ) // Reinstall 500 else if ( answer == 2 ) // Reinstall
501 { 501 {
502 installList.append( item->text() ); 502 installList.append( item->text() );
503 } 503 }
504 } 504 }
505 } 505 }
506 else 506 else
507 { 507 {
508 // Install package 508 // Install package
509 installList.append( item->text() ); 509 installList.append( item->text() );
510 } 510 }
511 } 511 }
512 } 512 }
513 } 513 }
514 514
515 // If nothing is selected, display message and exit 515 // If nothing is selected, display message and exit
516 if ( removeList.isEmpty() && installList.isEmpty() && upgradeList.isEmpty() ) 516 if ( removeList.isEmpty() && installList.isEmpty() && upgradeList.isEmpty() )
517 { 517 {
518 QMessageBox::information( this, tr( "Nothing to do" ), tr( "No packages selected" ), tr( "OK" ) ); 518 QMessageBox::information( this, tr( "Nothing to do" ), tr( "No packages selected" ), tr( "OK" ) );
519 return; 519 return;
520 } 520 }
521 521
522 // Send command only if there are packages to process 522 // Send command only if there are packages to process
523 OPackage::Command removeCmd = OPackage::NotDefined; 523 OPackage::Command removeCmd = !removeList.isEmpty() ? OPackage::Remove
524 if ( !removeList.isEmpty() ) 524 : OPackage::NotDefined;
525 removeCmd = OPackage::Remove; 525 OPackage::Command installCmd = !installList.isEmpty() ? OPackage::Install
526 OPackage::Command installCmd = OPackage::NotDefined; 526 : OPackage::NotDefined;
527 if ( !installList.isEmpty() ) 527 OPackage::Command upgradeCmd = !upgradeList.isEmpty() ? OPackage::Upgrade
528 installCmd = OPackage::Install; 528 : OPackage::NotDefined;
529 OPackage::Command upgradeCmd = OPackage::NotDefined;
530 if ( !upgradeList.isEmpty() )
531 upgradeCmd = OPackage::Upgrade;
532 529
533 // Create package manager output widget 530 // Create package manager output widget
534 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Apply changes" ), !installList.isEmpty(), 531 InstallDlg *dlg = new InstallDlg( this, &m_packman, tr( "Apply changes" ),
535 removeCmd, removeList, 532 removeCmd, removeList,
536 installCmd, installList, 533 installCmd, installList,
537 upgradeCmd, upgradeList ); 534 upgradeCmd, upgradeList );
538 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) ); 535 connect( dlg, SIGNAL(closeInstallDlg()), this, SLOT(slotCloseDlg()) );
539 536
540 // Display widget 537 // Display widget
541 m_widgetStack.addWidget( dlg, 3 ); 538 m_widgetStack.addWidget( dlg, 3 );
542 m_widgetStack.raiseWidget( dlg ); 539 m_widgetStack.raiseWidget( dlg );
543} 540}
544 541
545void MainWindow::slotInstallLocal() 542void MainWindow::slotInstallLocal()
546{ 543{
547 // Display file open dialog with only package files 544 // Display file open dialog with only package files
548 MimeTypes type; 545 MimeTypes type;
549 QStringList packages; 546 QStringList packages;
550 packages << "application/ipkg"; 547 packages << "application/ipkg";
551 type.insert( tr( "Application Packages" ), packages ); 548 type.insert( tr( "Application Packages" ), packages );
552 QString package = Opie::Ui::OFileDialog::getOpenFileName( Opie::Ui::OFileSelector::NORMAL, 549 QString package = Opie::Ui::OFileDialog::getOpenFileName( Opie::Ui::OFileSelector::NORMAL,
553 "/", QString::null, type ); 550 "/", QString::null, type );
554 if ( !package.isNull() ) 551 if ( !package.isNull() )
555 installLocalPackage( package ); 552 installLocalPackage( package );
556} 553}
557 554
558void MainWindow::slotCloseDlg() 555void MainWindow::slotCloseDlg()
559{ 556{
560 // Close install dialog 557 // Close install dialog
561 delete m_widgetStack.visibleWidget(); 558 delete m_widgetStack.visibleWidget();
562 559
563 // Reload package list 560 // Reload package list
564 initPackageInfo(); 561 initPackageInfo();
565 562
566 // Update Opie launcher links 563 // Update Opie launcher links
567 QCopEnvelope e("QPE/System", "linkChanged(QString)"); 564 QCopEnvelope e("QPE/System", "linkChanged(QString)");
568 QString lf = QString::null; 565 QString lf = QString::null;
569 e << lf; 566 e << lf;
570 567
571 // Reapply any filters previously set 568 // Reapply any filters previously set
572 if ( m_actionShowNotInstalled->isOn() ) 569 if ( m_actionShowNotInstalled->isOn() )
573 slotShowNotInstalled(); 570 slotShowNotInstalled();
574 else if ( m_actionShowInstalled->isOn() ) 571 else if ( m_actionShowInstalled->isOn() )
575 slotShowInstalled(); 572 slotShowInstalled();
576 else if ( m_actionShowUpdated->isOn() ) 573 else if ( m_actionShowUpdated->isOn() )
577 slotShowUpdated(); 574 slotShowUpdated();
578 else if ( m_actionFilter->isOn() ) 575 else if ( m_actionFilter->isOn() )
579 slotFilter( true ); 576 slotFilter( true );
580} 577}
581 578
582void MainWindow::slotConfigure() 579void MainWindow::slotConfigure()
diff --git a/noncore/settings/packagemanager/opie-packagemanager.control b/noncore/settings/packagemanager/opie-packagemanager.control
index 5385ea5..aacd0ca 100644
--- a/noncore/settings/packagemanager/opie-packagemanager.control
+++ b/noncore/settings/packagemanager/opie-packagemanager.control
@@ -1,10 +1,10 @@
1Package: opie-packagemanager 1Package: opie-packagemanager
2Files: plugins/application/libpackagemanager.so* bin/packagemanager pics/packagemanager apps/Settings/packagemanager.desktop 2Files: plugins/application/libpackagemanager.so* bin/packagemanager pics/packagemanager apps/Settings/packagemanager.desktop
3Priority: optional 3Priority: optional
4Section: opie/settings 4Section: opie/settings
5Depends: task-opie-minimal, libopiecore2, libopieui2, libipkg (>=0.99.120) 5Depends: task-opie-minimal, libopiecore2, libopieui2, libipkg (>=0.99.120), ipkg-link
6Replaces: packagemanager 6Replaces: packagemanager
7Architecture: arm 7Architecture: arm
8Maintainer: Dan Williams (drw@handhelds.org) 8Maintainer: Dan Williams (drw@handhelds.org)
9Description: Opie package management client 9Description: Opie package management client
10Version: 0.4.0$EXTRAVERSION 10Version: 0.5.0$EXTRAVERSION