summaryrefslogtreecommitdiff
authordrw <drw>2005-01-02 20:26:01 (UTC)
committer drw <drw>2005-01-02 20:26:01 (UTC)
commite763e0cea060ae3a2dfb1c411f56354e27ac12a9 (patch) (unidiff)
tree37896734be7d2679c3f19635fe9fe3b52a549332
parent020ea2d54bcd0fc4420cb433b3e657cd13ae07e2 (diff)
downloadopie-e763e0cea060ae3a2dfb1c411f56354e27ac12a9.zip
opie-e763e0cea060ae3a2dfb1c411f56354e27ac12a9.tar.gz
opie-e763e0cea060ae3a2dfb1c411f56354e27ac12a9.tar.bz2
Implement native package linking code (removing need for ipkg-link and its shortcomings), move package linking code to OIpkg (proper place for ipkg specific code), many small code tweaks and bump version up to 0.6.1
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/packagemanager/ChangeLog7
-rw-r--r--noncore/settings/packagemanager/TODO8
-rw-r--r--noncore/settings/packagemanager/installdlg.cpp81
-rw-r--r--noncore/settings/packagemanager/installdlg.h11
-rw-r--r--noncore/settings/packagemanager/oipkg.cpp208
-rw-r--r--noncore/settings/packagemanager/oipkg.h20
-rw-r--r--noncore/settings/packagemanager/oipkgconfigdlg.cpp34
-rw-r--r--noncore/settings/packagemanager/oipkgconfigdlg.h3
-rw-r--r--noncore/settings/packagemanager/opackagemanager.cpp20
-rw-r--r--noncore/settings/packagemanager/opie-packagemanager.control4
-rw-r--r--noncore/settings/packagemanager/packageinfodlg.cpp10
-rw-r--r--noncore/settings/packagemanager/packageinfodlg.h4
12 files changed, 237 insertions, 173 deletions
diff --git a/noncore/settings/packagemanager/ChangeLog b/noncore/settings/packagemanager/ChangeLog
index c776ce5..608cd98 100644
--- a/noncore/settings/packagemanager/ChangeLog
+++ b/noncore/settings/packagemanager/ChangeLog
@@ -1,24 +1,31 @@
12005-01-02 Dan Williams <drw@handhelds.org>
2
3 * Released version 0.6.1
4 * Implemented native package linking code to remove need for ipkg-link
5 * Implement package in OIpkg (removed from InstallDlg) as this is ipkg specific
6 * Many small code tweaks
7
12004-12-21 Dan Williams <drw@handhelds.org> 82004-12-21 Dan Williams <drw@handhelds.org>
2 9
3 * Released version 0.6.0 10 * Released version 0.6.0
4 * Added support for Ipkg 'src/gz' feeds 11 * Added support for Ipkg 'src/gz' feeds
5 * Improve server and destination tabs UI's in configuration dialog 12 * Improve server and destination tabs UI's in configuration dialog
6 * Fix app linking to link all dependent packages as well as selected packages 13 * Fix app linking to link all dependent packages as well as selected packages
7 * Hide 'Retrive File List' button once list is retrieved in Package Info dialog 14 * Hide 'Retrive File List' button once list is retrieved in Package Info dialog
8 15
92004-11-18 Dan Williams <drw@handhelds.org> 162004-11-18 Dan Williams <drw@handhelds.org>
10 17
11 * Released version 0.5.0 18 * Released version 0.5.0
12 * All v1.0 functionality implemented 19 * All v1.0 functionality implemented
13 * Implemented installation of local packages 20 * Implemented installation of local packages
14 * Implemented linking of non-root apps (using ipkg-link) 21 * Implemented linking of non-root apps (using ipkg-link)
15 * Many UI tweaks for installation and filter dialogs 22 * Many UI tweaks for installation and filter dialogs
16 23
172004-04-21 Dan Williams <drw@handhelds.org> 242004-04-21 Dan Williams <drw@handhelds.org>
18 25
19 * Released version 0.4.0 26 * Released version 0.4.0
20 * Added saving of ipkg configuration information 27 * Added saving of ipkg configuration information
21 * Re-initialize ipkg when configuration information changes 28 * Re-initialize ipkg when configuration information changes
22 * Added QWhatsThis for all UI controls 29 * Added QWhatsThis for all UI controls
23 * Remove Location from OConfItem as it is not used/needed 30 * Remove Location from OConfItem as it is not used/needed
24 * Re-ordered includes to follow Opie standards 31 * Re-ordered includes to follow Opie standards
diff --git a/noncore/settings/packagemanager/TODO b/noncore/settings/packagemanager/TODO
index 744ad95..2512624 100644
--- a/noncore/settings/packagemanager/TODO
+++ b/noncore/settings/packagemanager/TODO
@@ -1,17 +1,15 @@
1/************************************************************************ 1/************************************************************************
2/* 2/*
3/* Opie - Package Manager 3/* Opie - Package Manager
4/* ======================== 4/* ========================
5/* Version 0.6.0 5/* Version 0.6.1
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 - December, 2004 12 To-do for Opie-PackageManager - January, 2005
13----------------------------------------------- 13-----------------------------------------------
14 14
151. Move ipkg-link code from InstallDlg to OIpkg 151. Re-work package download dialog
162. Code ipkg-link logic directly in OIpkg
173. Re-work package download dialog
diff --git a/noncore/settings/packagemanager/installdlg.cpp b/noncore/settings/packagemanager/installdlg.cpp
index 985e2bd..7dea591 100644
--- a/noncore/settings/packagemanager/installdlg.cpp
+++ b/noncore/settings/packagemanager/installdlg.cpp
@@ -9,49 +9,48 @@ _;:, .> :=|. This file is free software; you can
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>
34 33
35#include <qpe/fileselector.h> 34#include <qpe/fileselector.h>
36#include <qpe/resource.h> 35#include <qpe/resource.h>
37#include <qpe/storage.h> 36#include <qpe/storage.h>
38 37
39#include <qapplication.h> 38#include <qapplication.h>
40#include <qcombobox.h> 39#include <qcombobox.h>
41#include <qfileinfo.h> 40#include <qfileinfo.h>
42#include <qgroupbox.h> 41#include <qgroupbox.h>
43#include <qlabel.h> 42#include <qlabel.h>
44#include <qlayout.h> 43#include <qlayout.h>
45#include <qmap.h> 44#include <qmap.h>
46#include <qmultilineedit.h> 45#include <qmultilineedit.h>
47#include <qpushbutton.h> 46#include <qpushbutton.h>
48 47
49#include <sys/vfs.h> 48#include <sys/vfs.h>
50 49
51#include "opackagemanager.h" 50#include "opackagemanager.h"
52 51
53InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &caption, 52InstallDlg::InstallDlg( QWidget *parent, OPackageManager *pm, const QString &caption,
54 OPackage::Command command1, const QStringList &packages1, 53 OPackage::Command command1, const QStringList &packages1,
55 OPackage::Command command2, const QStringList &packages2, 54 OPackage::Command command2, const QStringList &packages2,
56 OPackage::Command command3, const QStringList &packages3 ) 55 OPackage::Command command3, const QStringList &packages3 )
57 : QWidget( 0l ) 56 : QWidget( 0l )
@@ -226,163 +225,87 @@ void InstallDlg::slotBtnStart()
226 // TODO - force reload of package data 225 // TODO - force reload of package data
227 emit closeInstallDlg(); 226 emit closeInstallDlg();
228 return; 227 return;
229 } 228 }
230 229
231 // Start was clicked, start executing 230 // Start was clicked, start executing
232 QString dest; 231 QString dest;
233 if ( m_installFound ) 232 if ( m_installFound )
234 { 233 {
235 dest = m_destination->currentText(); 234 dest = m_destination->currentText();
236 m_destination->setEnabled( false ); 235 m_destination->setEnabled( false );
237 } 236 }
238 237
239 m_btnOptions->setEnabled( false ); 238 m_btnOptions->setEnabled( false );
240 if ( m_numCommands > 1 ) 239 if ( m_numCommands > 1 )
241 { 240 {
242 m_btnStart->setText( tr( "Abort" ) ); 241 m_btnStart->setText( tr( "Abort" ) );
243 m_btnStart->setIconSet( Resource::loadPixmap( "close" ) ); 242 m_btnStart->setIconSet( Resource::loadPixmap( "close" ) );
244 } 243 }
245 else 244 else
246 { 245 {
247 m_btnStart->setEnabled( false ); 246 m_btnStart->setEnabled( false );
248 } 247 }
249 248
250 Opie::Core::OProcess process( this );
251 for ( m_currCommand = 0; m_currCommand < m_numCommands; m_currCommand++ ) 249 for ( m_currCommand = 0; m_currCommand < m_numCommands; m_currCommand++ )
252 { 250 {
253 // Execute next command 251 // Execute next command
254 m_packman->executeCommand( m_command[ m_currCommand ], m_packages[ m_currCommand ], dest, 252 m_packman->executeCommand( m_command[ m_currCommand ], m_packages[ m_currCommand ], dest,
255 this, SLOT(slotOutput(char*)), true ); 253 this, SLOT(slotOutput(const QString &)), true );
256
257 if ( m_command[ m_currCommand ] == OPackage::Remove )
258 {
259 // Unlink application if the package was removed
260
261 // Loop through all package names in the command group
262 for ( QStringList::Iterator it = m_packages[ m_currCommand ].begin();
263 it != m_packages[ m_currCommand ].end();
264 ++it )
265 {
266 OPackage *currPackage = m_packman->findPackage( (*it) );
267
268 // Skip package if it is not found or being removed from 'root'
269 if ( !currPackage || ( m_command[ m_currCommand ] == OPackage::Remove &&
270 currPackage->destination() == "root" ) )
271 continue;
272
273 // Display feedback to user
274 m_output->append( tr( QString( "Running ipkg-link to remove links for package '%1'." )
275 .arg( currPackage->name() ) ) );
276 m_output->setCursorPosition( m_output->numLines(), 0 );
277
278 // Execute ipkg-link
279 process.clearArguments();
280 process << "ipkg-link"
281 << ( ( m_command[ m_currCommand ] == OPackage::Install ) ? "add" : "remove" )
282 << currPackage->name();
283 if ( !process.start( Opie::Core::OProcess::Block,
284 Opie::Core::OProcess::NoCommunication ) )
285 {
286 slotProcessDone( 0l );
287 m_output->append( tr( "Unable to run ipkg-link." ) );
288 m_output->setCursorPosition( m_output->numLines(), 0 );
289 return;
290 }
291 }
292 }
293 else if ( m_command[ m_currCommand ] == OPackage::Install && dest != "root" )
294 {
295 // Link applications in the destination directory
296
297 m_output->append( tr( "Running ipkg-link to link packages in '%1'." ).arg( dest ) );
298 m_output->setCursorPosition( m_output->numLines(), 0 );
299
300 QString destPath;
301 OConfItem *destItem = m_packman->findConfItem( OConfItem::Destination, dest );
302
303 // Execute ipkg-link
304 process.clearArguments();
305 process << "ipkg-link"
306 << "mount"
307 << destItem->value();
308 if ( !process.start( Opie::Core::OProcess::Block,
309 Opie::Core::OProcess::NoCommunication ) )
310 {
311 slotProcessDone( 0l );
312 m_output->append( tr( "Unable to run ipkg-link." ) );
313 m_output->setCursorPosition( m_output->numLines(), 0 );
314 return;
315 }
316 }
317 }
318
319 slotProcessDone( 0l );
320}
321
322void InstallDlg::slotProcessDone( Opie::Core::OProcess *proc )
323{
324 if ( proc )
325 {
326 // Display message pnly if linking was done
327 m_output->append( tr( "The package linking is done." ) );
328 m_output->setCursorPosition( m_output->numLines(), 0 );
329
330 delete proc;
331 } 254 }
332 255
333 // All commands executed, allow user to close dialog 256 // All commands executed, allow user to close dialog
334 m_btnStart->setEnabled( true ); 257 m_btnStart->setEnabled( true );
335 m_btnStart->setText( tr( "Close" ) ); 258 m_btnStart->setText( tr( "Close" ) );
336 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) ); 259 m_btnStart->setIconSet( Resource::loadPixmap( "enter" ) );
337 260
338 m_btnOptions->setEnabled( true ); 261 m_btnOptions->setEnabled( true );
339 m_btnOptions->setText( tr( "Save output" ) ); 262 m_btnOptions->setText( tr( "Save output" ) );
340 m_btnOptions->setIconSet( Resource::loadPixmap( "save" ) ); 263 m_btnOptions->setIconSet( Resource::loadPixmap( "save" ) );
341} 264}
342 265
343void InstallDlg::slotBtnOptions() 266void InstallDlg::slotBtnOptions()
344{ 267{
345 QString btnText = m_btnOptions->text(); 268 QString btnText = m_btnOptions->text();
346 if ( btnText == tr( "Options" ) ) 269 if ( btnText == tr( "Options" ) )
347 { 270 {
348 // Display configuration dialog (only options tab is enabled) 271 // Display configuration dialog (only options tab is enabled)
349 m_packman->configureDlg( true ); 272 m_packman->configureDlg( true );
350 return; 273 return;
351 } 274 }
352 275
353 // Save output was clicked 276 // Save output was clicked
354 QMap<QString, QStringList> map; 277 QMap<QString, QStringList> map;
355 map.insert( tr( "All" ), QStringList() ); 278 map.insert( tr( "All" ), QStringList() );
356 QStringList text; 279 QStringList text;
357 text << "text/*"; 280 text << "text/*";
358 map.insert(tr( "Text" ), text ); 281 map.insert(tr( "Text" ), text );
359 text << "*"; 282 text << "*";
360 map.insert( tr( "All" ), text ); 283 map.insert( tr( "All" ), text );
361 284
362 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map ); 285 QString filename = Opie::Ui::OFileDialog::getSaveFileName( 2, "/", "ipkg-output", map );
363 if( !filename.isEmpty() ) 286 if( !filename.isEmpty() )
364 { 287 {
365 QString currentFileName = QFileInfo( filename ).fileName(); 288 QString currentFileName = QFileInfo( filename ).fileName();
366 DocLnk doc; 289 DocLnk doc;
367 doc.setType( "text/plain" ); 290 doc.setType( "text/plain" );
368 doc.setFile( filename ); 291 doc.setFile( filename );
369 doc.setName( currentFileName ); 292 doc.setName( currentFileName );
370 FileManager fm; 293 FileManager fm;
371 fm.saveFile( doc, m_output->text() ); 294 fm.saveFile( doc, m_output->text() );
372 } 295 }
373} 296}
374 297
375void InstallDlg::slotOutput( char *msg ) 298void InstallDlg::slotOutput( const QString &msg )
376{ 299{
377 // Allow processing of other events 300 // Allow processing of other events
378 qApp->processEvents(); 301 qApp->processEvents();
379 302
380 QString lineStr = msg; 303 QString lineStr = msg;
381 if ( lineStr[lineStr.length()-1] == '\n' ) 304 if ( lineStr[lineStr.length()-1] == '\n' )
382 lineStr.truncate( lineStr.length() - 1 ); 305 lineStr.truncate( lineStr.length() - 1 );
383 m_output->append( lineStr ); 306 m_output->append( lineStr );
384 m_output->setCursorPosition( m_output->numLines(), 0 ); 307 m_output->setCursorPosition( m_output->numLines(), 0 );
385 308
386 // Update available space 309 // Update available space
387 slotDisplayAvailSpace( QString::null ); 310 slotDisplayAvailSpace( QString::null );
388} 311}
diff --git a/noncore/settings/packagemanager/installdlg.h b/noncore/settings/packagemanager/installdlg.h
index 7a64fe0..e633809 100644
--- a/noncore/settings/packagemanager/installdlg.h
+++ b/noncore/settings/packagemanager/installdlg.h
@@ -21,81 +21,72 @@ _;:, .> :=|. This file is free software; you can
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
46{
47 namespace Core
48 {
49 class OProcess;
50 }
51}
52
53class InstallDlg : public QWidget 45class InstallDlg : public QWidget
54{ 46{
55 Q_OBJECT 47 Q_OBJECT
56 48
57public: 49public:
58 InstallDlg( QWidget *parent = 0l, OPackageManager *pm = 0l, 50 InstallDlg( QWidget *parent = 0l, OPackageManager *pm = 0l,
59 const QString &caption = QString::null, 51 const QString &caption = QString::null,
60 OPackage::Command command1 = OPackage::NotDefined, 52 OPackage::Command command1 = OPackage::NotDefined,
61 const QStringList &packages1 = QStringList(), 53 const QStringList &packages1 = QStringList(),
62 OPackage::Command command2 = OPackage::NotDefined, 54 OPackage::Command command2 = OPackage::NotDefined,
63 const QStringList &packages2 = QStringList(), 55 const QStringList &packages2 = QStringList(),
64 OPackage::Command command3 = OPackage::NotDefined, 56 OPackage::Command command3 = OPackage::NotDefined,
65 const QStringList &packages3 = QStringList() ); 57 const QStringList &packages3 = QStringList() );
66 58
67private: 59private:
68 OPackageManager *m_packman; // Pointer to application instance of package manager 60 OPackageManager *m_packman; // Pointer to application instance of package manager
69 61
70 bool m_installFound; // Indicates if an install is being done, controls display of 62 bool m_installFound; // Indicates if an install is being done, controls display of
71 // destination selection, available space 63 // destination selection, available space
72 64
73 // UI controls 65 // UI controls
74 QComboBox *m_destination; // Destination selection list 66 QComboBox *m_destination; // Destination selection list
75 QLabel *m_availSpace; // Text label to display available space on selected destination 67 QLabel *m_availSpace; // Text label to display available space on selected destination
76 QMultiLineEdit *m_output; // Multi-line edit to display status 68 QMultiLineEdit *m_output; // Multi-line edit to display status
77 QPushButton *m_btnStart; // Start/abort/close button 69 QPushButton *m_btnStart; // Start/abort/close button
78 QPushButton *m_btnOptions; // Installation options button 70 QPushButton *m_btnOptions; // Installation options button
79 71
80 // Commands and packages to execute 72 // Commands and packages to execute
81 int m_numCommands; // Number of commands to be executed 73 int m_numCommands; // Number of commands to be executed
82 int m_currCommand; // Number of currently executing command 74 int m_currCommand; // Number of currently executing command
83 OPackage::Command m_command[3]; // List of commands to be executed 75 OPackage::Command m_command[3]; // List of commands to be executed
84 QStringList m_packages[3]; // Lists of package names associated to commands (m_command[]) 76 QStringList m_packages[3]; // Lists of package names associated to commands (m_command[])
85 OConfItem *m_destItem; // Pointer to destination for package installation 77 OConfItem *m_destItem; // Pointer to destination for package installation
86 78
87private slots: 79private slots:
88 // UI control slots 80 // UI control slots
89 void slotDisplayAvailSpace( const QString &destination ); 81 void slotDisplayAvailSpace( const QString &destination );
90 void slotBtnStart(); 82 void slotBtnStart();
91 void slotBtnOptions(); 83 void slotBtnOptions();
92 void slotProcessDone( Opie::Core::OProcess *proc );
93 84
94 // Execution slots 85 // Execution slots
95 void slotOutput( char *msg ); 86 void slotOutput( const QString &msg );
96 87
97signals: 88signals:
98 void closeInstallDlg(); 89 void closeInstallDlg();
99}; 90};
100 91
101#endif 92#endif
diff --git a/noncore/settings/packagemanager/oipkg.cpp b/noncore/settings/packagemanager/oipkg.cpp
index a66bd51..f2d7e39 100644
--- a/noncore/settings/packagemanager/oipkg.cpp
+++ b/noncore/settings/packagemanager/oipkg.cpp
@@ -15,93 +15,97 @@ _;:, .> :=|. This program is free software; you can
15 .i_,=:_. -<s. This program is distributed in the hope that 15 .i_,=:_. -<s. This program is distributed in the hope that
16 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 16 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
17 : .. .:, . . . without even the implied warranty of 17 : .. .:, . . . without even the implied warranty of
18 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 18 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
19 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 19 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.= = ; Library General Public License for more 20..}^=.= = ; Library General Public License for more
21++= -. .` .: details. 21++= -. .` .: details.
22: = ...= . :.=- 22: = ...= . :.=-
23-. .:....=;==+<; You should have received a copy of the GNU 23-. .:....=;==+<; You should have received a copy of the GNU
24 -_. . . )=. = Library General Public License along with 24 -_. . . )=. = Library General Public License along with
25 -- :-=` this library; see the file COPYING.LIB. 25 -- :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation, 26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330, 27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA. 28 Boston, MA 02111-1307, USA.
29 29
30*/ 30*/
31 31
32#include "oipkg.h" 32#include "oipkg.h"
33 33
34#include <qdir.h> 34#include <qdir.h>
35#include <qfile.h> 35#include <qfile.h>
36#include <qtextstream.h> 36#include <qtextstream.h>
37 37
38#include <stdlib.h> 38#include <stdlib.h>
39#include <unistd.h>
39 40
40const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file 41const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file
41const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files 42const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files
42const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists 43const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists
43const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location 44const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location
45const QString IPKG_INFO_PATH = "usr/lib/ipkg/info"; // Package file lists location
44 46
45OIpkg *oipkg; 47OIpkg *oipkg;
46 48
47// Ipkg callback functions 49// Ipkg callback functions
48 50
49int fsignalIpkgMessage( ipkg_conf_t *conf, message_level_t level, char *msg ) 51int fsignalIpkgMessage( ipkg_conf_t *conf, message_level_t level, char *msg )
50{ 52{
53 // Display message only if it is below the message level threshold
51 if ( conf && ( conf->verbosity < level ) ) 54 if ( conf && ( conf->verbosity < level ) )
52 return 0; 55 return 0;
53 else 56 else
54 oipkg->ipkgMessage( msg ); 57 oipkg->ipkgMessage( msg );
55 58
56 return 0; 59 return 0;
57} 60}
58 61
59char *fIpkgResponse( char */*question*/ ) 62char *fIpkgResponse( char */*question*/ )
60{ 63{
61 return 0x0; 64 return 0l;
62} 65}
63 66
64int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ ) 67int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ )
65{ 68{
66 oipkg->ipkgStatus( desc ); 69 oipkg->ipkgStatus( desc );
67 return 0; 70 return 0;
68} 71}
69 72
70int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/, 73int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/,
71 void */*userdata*/ ) 74 void */*userdata*/ )
72{ 75{
73 oipkg->ipkgList( desc ); 76 oipkg->ipkgList( desc );
74 return 0; 77 return 0;
75} 78}
76 79
77OIpkg::OIpkg( Config *config, QObject *parent, const char *name ) 80OIpkg::OIpkg( Config *config, QObject *parent, const char *name )
78 : QObject( parent, name ) 81 : QObject( parent, name )
79 , m_config( config ) 82 , m_config( config )
80 , m_confInfo( NULL ) 83 , m_confInfo( NULL )
81 , m_ipkgExecOptions( 0 ) 84 , m_ipkgExecOptions( 0 )
82 , m_ipkgExecVerbosity( 1 ) 85 , m_ipkgExecVerbosity( 1 )
83{ 86{
87 // Keep pointer to self for the Ipkg callback functions
84 oipkg = this; 88 oipkg = this;
85 89
86 // Initialize libipkg 90 // Initialize libipkg
87 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ); 91 ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs );
88 92
89 // Default ipkg run-time arguments 93 // Default ipkg run-time arguments
90 m_ipkgArgs.noaction = false; 94 m_ipkgArgs.noaction = false;
91 m_ipkgArgs.force_defaults = true; 95 m_ipkgArgs.force_defaults = true;
92} 96}
93 97
94OIpkg::~OIpkg() 98OIpkg::~OIpkg()
95{ 99{
96 // Upon destruction, ensure that items in config list are deleted with list 100 // Upon destruction, ensure that items in config list are deleted with list
97 if ( m_confInfo ) 101 if ( m_confInfo )
98 m_confInfo->setAutoDelete( true ); 102 m_confInfo->setAutoDelete( true );
99 103
100 // Free up libipkg resources 104 // Free up libipkg resources
101 ipkg_deinit( &m_ipkgArgs ); 105 ipkg_deinit( &m_ipkgArgs );
102} 106}
103 107
104OConfItemList *OIpkg::configItems() 108OConfItemList *OIpkg::configItems()
105{ 109{
106 // Retrieve all configuration items 110 // Retrieve all configuration items
107 return filterConfItems(); 111 return filterConfItems();
@@ -341,128 +345,161 @@ OPackageList *OIpkg::installedPackages( const QString &destName, const QString &
341 name = value; 345 name = value;
342 else if ( key == "Version" ) 346 else if ( key == "Version" )
343 version = value; 347 version = value;
344 else if ( key == "Status" ) 348 else if ( key == "Status" )
345 status = value; 349 status = value;
346 else if ( key.isEmpty() && value.isEmpty() ) 350 else if ( key.isEmpty() && value.isEmpty() )
347 newPackage = true; 351 newPackage = true;
348 352
349 // Skip past all description lines 353 // Skip past all description lines
350 if ( key == "Description" ) 354 if ( key == "Description" )
351 { 355 {
352 line = t.readLine(); 356 line = t.readLine();
353 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() ) 357 while ( !line.isEmpty() && line.find( ':', 0 ) == -1 && !t.eof() )
354 line = t.readLine(); 358 line = t.readLine();
355 } 359 }
356 else 360 else
357 line = t.readLine(); 361 line = t.readLine();
358 } 362 }
359 363
360 f.close(); 364 f.close();
361 365
362 return pl; 366 return pl;
363} 367}
364 368
369OConfItem *OIpkg::findConfItem( OConfItem::Type type, const QString &name )
370{
371 // Find configuration item in list
372 OConfItemListIterator configIt( *m_confInfo );
373 OConfItem *config = 0l;
374 for ( ; configIt.current(); ++configIt )
375 {
376 config = configIt.current();
377 if ( config->type() == type && config->name() == name )
378 break;
379 }
380
381 if ( config && config->type() == type && config->name() == name )
382 return config;
383
384 return 0l;
385}
386
365bool OIpkg::executeCommand( OPackage::Command command, const QStringList &parameters, const QString &destination, 387bool OIpkg::executeCommand( OPackage::Command command, const QStringList &parameters, const QString &destination,
366 const QObject *receiver, const char *slotOutput, bool rawOutput ) 388 const QObject *receiver, const char *slotOutput, bool rawOutput )
367{ 389{
368 if ( command == OPackage::NotDefined ) 390 if ( command == OPackage::NotDefined )
369 return false; 391 return false;
370 392
371 // Set ipkg run-time options/arguments 393 // Set ipkg run-time options/arguments
372 m_ipkgArgs.force_depends = ( m_ipkgExecOptions & FORCE_DEPENDS ); 394 m_ipkgArgs.force_depends = ( m_ipkgExecOptions & FORCE_DEPENDS );
373 m_ipkgArgs.force_reinstall = ( m_ipkgExecOptions & FORCE_REINSTALL ); 395 m_ipkgArgs.force_reinstall = ( m_ipkgExecOptions & FORCE_REINSTALL );
374 // TODO m_ipkgArgs.force_remove = ( m_ipkgExecOptions & FORCE_REMOVE ); 396 // TODO m_ipkgArgs.force_remove = ( m_ipkgExecOptions & FORCE_REMOVE );
375 m_ipkgArgs.force_overwrite = ( m_ipkgExecOptions & FORCE_OVERWRITE ); 397 m_ipkgArgs.force_overwrite = ( m_ipkgExecOptions & FORCE_OVERWRITE );
376 m_ipkgArgs.verbosity = m_ipkgExecVerbosity; 398 m_ipkgArgs.verbosity = m_ipkgExecVerbosity;
377 if ( m_ipkgArgs.dest ) 399 if ( m_ipkgArgs.dest )
378 free( m_ipkgArgs.dest ); 400 free( m_ipkgArgs.dest );
379 if ( !destination.isNull() ) 401 if ( !destination.isNull() )
380 { 402 {
381 int len = destination.length() + 1; 403 int len = destination.length() + 1;
382 m_ipkgArgs.dest = (char *)malloc( len ); 404 m_ipkgArgs.dest = (char *)malloc( len );
383 strncpy( m_ipkgArgs.dest, destination, destination.length() ); 405 strncpy( m_ipkgArgs.dest, destination, destination.length() );
384 m_ipkgArgs.dest[ len - 1 ] = '\0'; 406 m_ipkgArgs.dest[ len - 1 ] = '\0';
385 } 407 }
386 else 408 else
387 m_ipkgArgs.dest = 0x0; 409 m_ipkgArgs.dest = 0l;
388 410
389 // Connect output signal to widget 411 // Connect output signal to widget
390 412
391 if ( rawOutput ) 413 if ( !rawOutput )
392 {
393// if ( slotOutput )
394// connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput );
395 }
396 else
397 { 414 {
398 // TODO - connect to local slot and parse output before emitting signalIpkgMessage 415 // TODO - connect to local slot and parse output before emitting signalIpkgMessage
399 } 416 }
400 417
401 switch( command ) 418 switch( command )
402 { 419 {
403 case OPackage::Update : { 420 case OPackage::Update : {
404 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 421 connect( this, SIGNAL(signalIpkgMessage(const QString &)), receiver, slotOutput );
405 ipkg_lists_update( &m_ipkgArgs ); 422 ipkg_lists_update( &m_ipkgArgs );
406 }; 423 };
407 break; 424 break;
408 case OPackage::Upgrade : { 425 case OPackage::Upgrade : {
409 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 426 connect( this, SIGNAL(signalIpkgMessage(const QString &)), receiver, slotOutput );
410 ipkg_packages_upgrade( &m_ipkgArgs ); 427 ipkg_packages_upgrade( &m_ipkgArgs );
428
429 // Re-link non-root destinations to make sure everything is in sync
430 OConfItemList *destList = destinations();
431 OConfItemListIterator it( *destList );
432 for ( ; it.current(); ++it )
433 {
434 OConfItem *dest = it.current();
435 if ( dest->name() != "root" )
436 linkPackageDir( dest->name() );
437 }
438 delete destList;
411 }; 439 };
412 break; 440 break;
413 case OPackage::Install : { 441 case OPackage::Install : {
414 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 442 connect( this, SIGNAL(signalIpkgMessage(const QString &)), receiver, slotOutput );
415 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it ) 443 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it )
416 { 444 {
417 ipkg_packages_install( &m_ipkgArgs, (*it) ); 445 ipkg_packages_install( &m_ipkgArgs, (*it) );
418 } 446 }
447 if ( destination != "root" )
448 linkPackageDir( destination );
419 }; 449 };
420 break; 450 break;
421 case OPackage::Remove : { 451 case OPackage::Remove : {
422 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 452 connect( this, SIGNAL(signalIpkgMessage(const QString &)), receiver, slotOutput );
453
454 // Get list of destinations for unlinking of packages not installed to root
455 OConfItemList *destList = destinations();
456
423 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it ) 457 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it )
424 { 458 {
459 unlinkPackage( (*it), destList );
425 ipkg_packages_remove( &m_ipkgArgs, (*it), true ); 460 ipkg_packages_remove( &m_ipkgArgs, (*it), true );
426 } 461 }
462
463 delete destList;
427 }; 464 };
428 break; 465 break;
429 case OPackage::Download : { 466 case OPackage::Download : {
430 connect( this, SIGNAL(signalIpkgMessage(char*)), receiver, slotOutput ); 467 connect( this, SIGNAL(signalIpkgMessage(const QString &)), receiver, slotOutput );
431 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it ) 468 for ( QStringList::ConstIterator it = parameters.begin(); it != parameters.end(); ++it )
432 { 469 {
433 ipkg_packages_download( &m_ipkgArgs, (*it) ); 470 ipkg_packages_download( &m_ipkgArgs, (*it) );
434 } 471 }
435 }; 472 };
436 break; 473 break;
437 case OPackage::Info : { 474 case OPackage::Info : {
438 connect( this, SIGNAL(signalIpkgStatus(char*)), receiver, slotOutput ); 475 connect( this, SIGNAL(signalIpkgStatus(const QString &)), receiver, slotOutput );
439 ipkg_packages_info( &m_ipkgArgs, (*parameters.begin()), &fIpkgStatus, 0x0 ); 476 ipkg_packages_info( &m_ipkgArgs, (*parameters.begin()), &fIpkgStatus, 0l );
440 }; 477 };
441 break; 478 break;
442 case OPackage::Files : { 479 case OPackage::Files : {
443 connect( this, SIGNAL(signalIpkgList(char*)), receiver, slotOutput ); 480 connect( this, SIGNAL(signalIpkgList(const QString &)), receiver, slotOutput );
444 ipkg_package_files( &m_ipkgArgs, (*parameters.begin()), &fIpkgFiles, 0x0 ); 481 ipkg_package_files( &m_ipkgArgs, (*parameters.begin()), &fIpkgFiles, 0l );
445 }; 482 };
446 break; 483 break;
447 default : break; 484 default : break;
448 }; 485 };
449 486
450 return true; 487 return true;
451} 488}
452 489
453void OIpkg::ipkgMessage( char *msg ) 490void OIpkg::ipkgMessage( char *msg )
454{ 491{
455 emit signalIpkgMessage( msg ); 492 emit signalIpkgMessage( msg );
456} 493}
457 494
458void OIpkg::ipkgStatus( char *status ) 495void OIpkg::ipkgStatus( char *status )
459{ 496{
460 emit signalIpkgStatus( status ); 497 emit signalIpkgStatus( status );
461} 498}
462 499
463void OIpkg::ipkgList( char *filelist ) 500void OIpkg::ipkgList( char *filelist )
464{ 501{
465 emit signalIpkgList( filelist ); 502 emit signalIpkgList( filelist );
466} 503}
467 504
468void OIpkg::loadConfiguration() 505void OIpkg::loadConfiguration()
@@ -568,24 +605,161 @@ OConfItemList *OIpkg::filterConfItems( OConfItem::Type typefilter )
568{ 605{
569 // Load Ipkg configuration info if not already cached 606 // Load Ipkg configuration info if not already cached
570 if ( !m_confInfo ) 607 if ( !m_confInfo )
571 loadConfiguration(); 608 loadConfiguration();
572 609
573 // Build new server list (caller is responsible for deleting) 610 // Build new server list (caller is responsible for deleting)
574 OConfItemList *sl = new OConfItemList; 611 OConfItemList *sl = new OConfItemList;
575 612
576 // If typefilter is empty, retrieve all items 613 // If typefilter is empty, retrieve all items
577 bool retrieveAll = ( typefilter == OConfItem::NotDefined ); 614 bool retrieveAll = ( typefilter == OConfItem::NotDefined );
578 615
579 // Parse configuration info for servers 616 // Parse configuration info for servers
580 OConfItemListIterator it( *m_confInfo ); 617 OConfItemListIterator it( *m_confInfo );
581 for ( ; it.current(); ++it ) 618 for ( ; it.current(); ++it )
582 { 619 {
583 OConfItem *item = it.current(); 620 OConfItem *item = it.current();
584 if ( retrieveAll || item->type() == typefilter ) 621 if ( retrieveAll || item->type() == typefilter )
585 { 622 {
586 sl->append( item ); 623 sl->append( item );
587 } 624 }
588 } 625 }
589 626
590 return sl; 627 return sl;
591} 628}
629
630const QString &OIpkg::rootPath()
631{
632 if ( m_rootPath.isEmpty() )
633 {
634 OConfItem *rootDest = findConfItem( OConfItem::Destination, "root" );
635 rootDest ? m_rootPath = rootDest->value()
636 : m_rootPath = '/';
637 if ( m_rootPath.right( 1 ) == '/' )
638 m_rootPath.truncate( m_rootPath.length() - 1 );
639 }
640 return m_rootPath;
641}
642
643void OIpkg::linkPackageDir( const QString &dest )
644{
645 if ( !dest.isNull() )
646 {
647 OConfItem *destConfItem = findConfItem( OConfItem::Destination, dest );
648
649 emit signalIpkgMessage( tr( "Linking packages installed in: %1" ).arg( dest ) );
650
651 // Set package destination directory
652 QString destDir = destConfItem->value();
653 QString destInfoDir = destDir;
654 if ( destInfoDir.right( 1 ) != '/' )
655 destInfoDir.append( '/' );
656 destInfoDir.append( IPKG_INFO_PATH );
657
658 // Get list of installed packages in destination
659 QDir packageDir( destInfoDir );
660 QStringList packageFiles;
661 if ( packageDir.exists() )
662 {
663 packageDir.setNameFilter( "*.list" );
664 packageDir.setFilter( QDir::Files );
665 packageFiles = packageDir.entryList( "*.list", QDir::Files );
666 }
667
668 // Link all files for every package installed in desination
669 QStringList::Iterator lastFile = packageFiles.end();
670 for ( QStringList::Iterator it = packageFiles.begin(); it != lastFile; ++it )
671 {
672 //emit signalIpkgMessage( QString( "Processing: %1/%2" ).arg( destInfoDir ).arg (*it) );
673 QString packageFileName = destInfoDir;
674 packageFileName.append( '/' );
675 packageFileName.append( (*it) );
676 QFile packageFile( packageFileName );
677 if ( packageFile.open( IO_ReadOnly ) )
678 {
679 QTextStream t( &packageFile );
680 QString linkFile;
681 while ( !t.eof() )
682 {
683 // Get the name of the file to link and build the sym link filename
684 linkFile = t.readLine();
685 QString linkDest( linkFile.right( linkFile.length() - destDir.length() ) );
686 linkDest.prepend( rootPath() );
687
688 // If file installed file is actually symbolic link, use actual file for linking
689 QFileInfo fileInfo( linkFile );
690 if ( fileInfo.isSymLink() && !fileInfo.readLink().isEmpty() )
691 linkFile = fileInfo.readLink();
692
693 // See if directory exists in 'root', if not, create
694 fileInfo.setFile( linkDest );
695 QString linkDestDirName = fileInfo.dirPath( true );
696 QDir linkDestDir( linkDestDirName );
697 if ( !linkDestDir.exists() )
698 {
699 linkDestDir.mkdir( linkDestDirName );
700 }
701 else
702 {
703 // Remove any previous link to make sure we will be pointing to the current version
704 if ( QFile::exists( linkDest ) )
705 QFile::remove( linkDest );
706 }
707
708 // Link the file
709 //emit signalIpkgMessage( QString( "Linking '%1' to '%2'" ).arg( linkFile ).arg( linkDest ) );
710 if ( symlink( linkFile, linkDest ) == -1 )
711 emit signalIpkgMessage( tr( "Error linkling '%1' to '%2'" )
712 .arg( linkFile )
713 .arg( linkDest ) );
714 }
715 packageFile.close();
716 }
717 }
718 }
719}
720
721void OIpkg::unlinkPackage( const QString &package, OConfItemList *destList )
722{
723 if ( !package.isNull() )
724 {
725 // Find destination package is installed in
726 if ( destList )
727 {
728 OConfItemListIterator it( *destList );
729 for ( ; it.current(); ++it )
730 {
731 OConfItem *dest = it.current();
732 QString destInfoFileName = QString( "%1/%2/%3.list" ).arg( dest->value() )
733 .arg( IPKG_INFO_PATH )
734 .arg( package );
735 //emit signalIpkgMessage( QString( "Looking for '%1'" ).arg ( destInfoFileName ) );
736
737 // If found and destination is not 'root', remove symbolic links
738 if ( QFile::exists( destInfoFileName ) && dest->name() != "root" )
739 {
740 QFile destInfoFile( destInfoFileName );
741 if ( destInfoFile.open( IO_ReadOnly ) )
742 {
743 QTextStream t( &destInfoFile );
744 QString linkFile;
745 while ( !t.eof() )
746 {
747 // Get the name of the file to link and build the sym link filename
748 linkFile = t.readLine();
749 QString linkDest( linkFile.right( linkFile.length() -
750 dest->value().length() ) );
751 linkDest.prepend( rootPath() );
752
753 //emit signalIpkgMessage( QString( "Deleting: '%1'" ).arg( linkDest ) );
754 QFile::remove( linkDest );
755 }
756 destInfoFile.close();
757 }
758
759 emit signalIpkgMessage( tr( "Links removed for: %1" ).arg( package ) );
760 return;
761 }
762 }
763 }
764 }
765}
diff --git a/noncore/settings/packagemanager/oipkg.h b/noncore/settings/packagemanager/oipkg.h
index 3c96200..0263f50 100644
--- a/noncore/settings/packagemanager/oipkg.h
+++ b/noncore/settings/packagemanager/oipkg.h
@@ -35,74 +35,82 @@ _;:, .> :=|. This program is free software; you can
35#include "oconfitem.h" 35#include "oconfitem.h"
36#include "opackage.h" 36#include "opackage.h"
37 37
38#include <qpe/config.h> 38#include <qpe/config.h>
39 39
40#include <qobject.h> 40#include <qobject.h>
41 41
42extern "C" { 42extern "C" {
43#include <libipkg.h> 43#include <libipkg.h>
44}; 44};
45 45
46// Ipkg execution options (m_ipkgExecOptions) 46// Ipkg execution options (m_ipkgExecOptions)
47#define FORCE_DEPENDS 0x0001 47#define FORCE_DEPENDS 0x0001
48#define FORCE_REMOVE 0x0002 48#define FORCE_REMOVE 0x0002
49#define FORCE_REINSTALL 0x0004 49#define FORCE_REINSTALL 0x0004
50#define FORCE_OVERWRITE 0x0008 50#define FORCE_OVERWRITE 0x0008
51 51
52class OConfItemList; 52class OConfItemList;
53 53
54class OIpkg : public QObject 54class OIpkg : public QObject
55{ 55{
56 Q_OBJECT 56 Q_OBJECT
57 57
58public: 58public:
59 OIpkg( Config *config = 0x0, QObject *parent = 0x0, const char *name = 0x0 ); 59 OIpkg( Config *config = 0l, QObject *parent = 0l, const char *name = 0l );
60 ~OIpkg(); 60 ~OIpkg();
61 61
62 OConfItemList *configItems(); 62 OConfItemList *configItems();
63 OConfItemList *servers(); 63 OConfItemList *servers();
64 OConfItemList *destinations(); 64 OConfItemList *destinations();
65 OConfItemList *options(); 65 OConfItemList *options();
66 66
67 int ipkgExecOptions() { return m_ipkgExecOptions; } 67 int ipkgExecOptions() { return m_ipkgExecOptions; }
68 int ipkgExecVerbosity() { return m_ipkgExecVerbosity; } 68 int ipkgExecVerbosity() { return m_ipkgExecVerbosity; }
69 69
70 void setConfigItems( OConfItemList *configList ); 70 void setConfigItems( OConfItemList *configList );
71 void setIpkgExecOptions( int options ) { m_ipkgExecOptions = options; } 71 void setIpkgExecOptions( int options ) { m_ipkgExecOptions = options; }
72 void setIpkgExecVerbosity( int verbosity ) { m_ipkgExecVerbosity = verbosity; } 72 void setIpkgExecVerbosity( int verbosity ) { m_ipkgExecVerbosity = verbosity; }
73 73
74 void saveSettings(); 74 void saveSettings();
75 75
76 OPackageList *availablePackages( const QString &server = QString::null ); 76 OPackageList *availablePackages( const QString &server = QString::null );
77 OPackageList *installedPackages( const QString &destName = QString::null, 77 OPackageList *installedPackages( const QString &destName = QString::null,
78 const QString &destPath = QString::null ); 78 const QString &destPath = QString::null );
79 79
80 OConfItem *findConfItem( OConfItem::Type type = OConfItem::NotDefined,
81 const QString &name = QString::null );
82
80 bool executeCommand( OPackage::Command command = OPackage::NotDefined, 83 bool executeCommand( OPackage::Command command = OPackage::NotDefined,
81 const QStringList &parameters = QStringList(), 84 const QStringList &parameters = QStringList(),
82 const QString &destination = QString::null, 85 const QString &destination = QString::null,
83 const QObject *receiver = 0x0, 86 const QObject *receiver = 0l,
84 const char *slotOutput = 0x0, 87 const char *slotOutput = 0l,
85 bool rawOutput = true ); 88 bool rawOutput = true );
86 void abortCommand(); 89 void abortCommand();
87 90
88 void ipkgMessage( char *msg ); 91 void ipkgMessage( char *msg );
89 void ipkgStatus( char *status ); 92 void ipkgStatus( char *status );
90 void ipkgList( char *filelist ); 93 void ipkgList( char *filelist );
91 94
92private: 95private:
93 Config *m_config; // Pointer to application configuration file 96 Config *m_config; // Pointer to application configuration file
94 args_t m_ipkgArgs; // libipkg configuration arguments 97 args_t m_ipkgArgs; // libipkg configuration arguments
95 OConfItemList *m_confInfo; // Contains info from all Ipkg configuration files 98 OConfItemList *m_confInfo; // Contains info from all Ipkg configuration files
96 int m_ipkgExecOptions; // Bit-mapped flags for Ipkg execution options 99 int m_ipkgExecOptions; // Bit-mapped flags for Ipkg execution options
97 int m_ipkgExecVerbosity; // Ipkg execution verbosity level 100 int m_ipkgExecVerbosity; // Ipkg execution verbosity level
101 QString m_rootPath; // Directory path where the 'root' destination is located
98 102
99 void loadConfiguration(); 103 void loadConfiguration();
100 OConfItemList *filterConfItems( OConfItem::Type typefilter = OConfItem::NotDefined ); 104 OConfItemList *filterConfItems( OConfItem::Type typefilter = OConfItem::NotDefined );
105 const QString &rootPath();
106 void linkPackageDir( const QString &dest = QString::null );
107 void unlinkPackage( const QString &package = QString::null,
108 OConfItemList *destList = 0l );
101 109
102signals: 110signals:
103 void signalIpkgMessage( char *msg ); 111 void signalIpkgMessage( const QString &msg );
104 void signalIpkgStatus( char *status ); 112 void signalIpkgStatus( const QString &status );
105 void signalIpkgList( char *filelist ); 113 void signalIpkgList( const QString &filelist );
106}; 114};
107 115
108#endif 116#endif
diff --git a/noncore/settings/packagemanager/oipkgconfigdlg.cpp b/noncore/settings/packagemanager/oipkgconfigdlg.cpp
index 77ad220..e6d6a81 100644
--- a/noncore/settings/packagemanager/oipkgconfigdlg.cpp
+++ b/noncore/settings/packagemanager/oipkgconfigdlg.cpp
@@ -71,78 +71,78 @@ OIpkgConfigDlg::OIpkgConfigDlg( OIpkg *ipkg, bool installOptions, QWidget *paren
71 initData(); 71 initData();
72 72
73 // Setup tabs for all info 73 // Setup tabs for all info
74 m_layout.addWidget( &m_tabWidget ); 74 m_layout.addWidget( &m_tabWidget );
75 if ( !m_installOptions ) 75 if ( !m_installOptions )
76 { 76 {
77 m_tabWidget.addTab( m_serverWidget, "packagemanager/servertab", tr( "Servers" ) ); 77 m_tabWidget.addTab( m_serverWidget, "packagemanager/servertab", tr( "Servers" ) );
78 m_tabWidget.addTab( m_destWidget, "packagemanager/desttab", tr( "Destinations" ) ); 78 m_tabWidget.addTab( m_destWidget, "packagemanager/desttab", tr( "Destinations" ) );
79 m_tabWidget.addTab( m_proxyWidget, "packagemanager/proxytab", tr( "Proxies" ) ); 79 m_tabWidget.addTab( m_proxyWidget, "packagemanager/proxytab", tr( "Proxies" ) );
80 m_tabWidget.addTab( m_optionsWidget, "exec", tr( "Options" ) ); 80 m_tabWidget.addTab( m_optionsWidget, "exec", tr( "Options" ) );
81 m_tabWidget.setCurrentTab( tr( "Servers" ) ); 81 m_tabWidget.setCurrentTab( tr( "Servers" ) );
82 } 82 }
83 else 83 else
84 { 84 {
85 m_tabWidget.addTab( m_optionsWidget, "exec", tr( "Options" ) ); 85 m_tabWidget.addTab( m_optionsWidget, "exec", tr( "Options" ) );
86 } 86 }
87} 87}
88 88
89void OIpkgConfigDlg::accept() 89void OIpkgConfigDlg::accept()
90{ 90{
91 // Save server, destination and proxy configuration 91 // Save server, destination and proxy configuration
92 if ( !m_installOptions ) 92 if ( !m_installOptions )
93 { 93 {
94 // Update proxy information before saving settings 94 // Update proxy information before saving settings
95 OConfItem *confItem = findConfItem( OConfItem::Option, "http_proxy" ); 95 OConfItem *confItem = m_ipkg->findConfItem( OConfItem::Option, "http_proxy" );
96 if ( confItem ) 96 if ( confItem )
97 { 97 {
98 confItem->setValue( m_proxyHttpServer->text() ); 98 confItem->setValue( m_proxyHttpServer->text() );
99 confItem->setActive( m_proxyHttpActive->isChecked() ); 99 confItem->setActive( m_proxyHttpActive->isChecked() );
100 } 100 }
101 else 101 else
102 m_configs->append( new OConfItem( OConfItem::Option, "http_proxy", 102 m_configs->append( new OConfItem( OConfItem::Option, "http_proxy",
103 m_proxyHttpServer->text(), QString::null, 103 m_proxyHttpServer->text(), QString::null,
104 m_proxyHttpActive->isChecked() ) ); 104 m_proxyHttpActive->isChecked() ) );
105 105
106 confItem = findConfItem( OConfItem::Option, "ftp_proxy" ); 106 confItem = m_ipkg->findConfItem( OConfItem::Option, "ftp_proxy" );
107 if ( confItem ) 107 if ( confItem )
108 { 108 {
109 confItem->setValue( m_proxyFtpServer->text() ); 109 confItem->setValue( m_proxyFtpServer->text() );
110 confItem->setActive( m_proxyFtpActive->isChecked() ); 110 confItem->setActive( m_proxyFtpActive->isChecked() );
111 } 111 }
112 else 112 else
113 m_configs->append( new OConfItem( OConfItem::Option, "ftp_proxy", 113 m_configs->append( new OConfItem( OConfItem::Option, "ftp_proxy",
114 m_proxyFtpServer->text(), QString::null, 114 m_proxyFtpServer->text(), QString::null,
115 m_proxyFtpActive->isChecked() ) ); 115 m_proxyFtpActive->isChecked() ) );
116 116
117 confItem = findConfItem( OConfItem::Option, "proxy_username" ); 117 confItem = m_ipkg->findConfItem( OConfItem::Option, "proxy_username" );
118 if ( confItem ) 118 if ( confItem )
119 confItem->setValue( m_proxyUsername->text() ); 119 confItem->setValue( m_proxyUsername->text() );
120 else 120 else
121 m_configs->append( new OConfItem( OConfItem::Option, "proxy_username", 121 m_configs->append( new OConfItem( OConfItem::Option, "proxy_username",
122 m_proxyUsername->text() ) ); 122 m_proxyUsername->text() ) );
123 123
124 confItem = findConfItem( OConfItem::Option, "proxy_password" ); 124 confItem = m_ipkg->findConfItem( OConfItem::Option, "proxy_password" );
125 if ( confItem ) 125 if ( confItem )
126 confItem->setValue( m_proxyPassword->text() ); 126 confItem->setValue( m_proxyPassword->text() );
127 else 127 else
128 m_configs->append( new OConfItem( OConfItem::Option, "proxy_password", 128 m_configs->append( new OConfItem( OConfItem::Option, "proxy_password",
129 m_proxyPassword->text() ) ); 129 m_proxyPassword->text() ) );
130 130
131 m_ipkg->setConfigItems( m_configs ); 131 m_ipkg->setConfigItems( m_configs );
132 } 132 }
133 133
134 // Save options configuration 134 // Save options configuration
135 int options = 0; 135 int options = 0;
136 if ( m_optForceDepends->isChecked() ) 136 if ( m_optForceDepends->isChecked() )
137 options |= FORCE_DEPENDS; 137 options |= FORCE_DEPENDS;
138 if ( m_optForceReinstall->isChecked() ) 138 if ( m_optForceReinstall->isChecked() )
139 options |= FORCE_REINSTALL; 139 options |= FORCE_REINSTALL;
140 if ( m_optForceRemove->isChecked() ) 140 if ( m_optForceRemove->isChecked() )
141 options |= FORCE_REMOVE; 141 options |= FORCE_REMOVE;
142 if ( m_optForceOverwrite->isChecked() ) 142 if ( m_optForceOverwrite->isChecked() )
143 options |= FORCE_OVERWRITE; 143 options |= FORCE_OVERWRITE;
144 m_ipkg->setIpkgExecOptions( options ); 144 m_ipkg->setIpkgExecOptions( options );
145 m_ipkg->setIpkgExecVerbosity( m_optVerboseIpkg->currentItem() ); 145 m_ipkg->setIpkgExecVerbosity( m_optVerboseIpkg->currentItem() );
146 146
147 QDialog::accept(); 147 QDialog::accept();
148} 148}
@@ -372,177 +372,159 @@ void OIpkgConfigDlg::initData()
372 else if ( config->name() == "proxy_password" ) 372 else if ( config->name() == "proxy_password" )
373 { 373 {
374 m_proxyPassword->setText( config->value() ); 374 m_proxyPassword->setText( config->value() );
375 } 375 }
376 } 376 }
377 } 377 }
378 } 378 }
379 } 379 }
380 } 380 }
381 381
382 // Get Ipkg execution options 382 // Get Ipkg execution options
383 int options = m_ipkg->ipkgExecOptions(); 383 int options = m_ipkg->ipkgExecOptions();
384 if ( options & FORCE_DEPENDS ) 384 if ( options & FORCE_DEPENDS )
385 m_optForceDepends->setChecked( true ); 385 m_optForceDepends->setChecked( true );
386 if ( options & FORCE_REINSTALL ) 386 if ( options & FORCE_REINSTALL )
387 m_optForceReinstall->setChecked( true ); 387 m_optForceReinstall->setChecked( true );
388 if ( options & FORCE_REMOVE ) 388 if ( options & FORCE_REMOVE )
389 m_optForceRemove->setChecked( true ); 389 m_optForceRemove->setChecked( true );
390 if ( options & FORCE_OVERWRITE ) 390 if ( options & FORCE_OVERWRITE )
391 m_optForceOverwrite->setChecked( true ); 391 m_optForceOverwrite->setChecked( true );
392 392
393 m_optVerboseIpkg->setCurrentItem( m_ipkg->ipkgExecVerbosity() ); 393 m_optVerboseIpkg->setCurrentItem( m_ipkg->ipkgExecVerbosity() );
394} 394}
395 395
396OConfItem *OIpkgConfigDlg::findConfItem( OConfItem::Type type, const QString &name )
397{
398 // Find selected server in list
399 OConfItemListIterator configIt( *m_configs );
400 OConfItem *config = 0l;
401 for ( ; configIt.current(); ++configIt )
402 {
403 config = configIt.current();
404 if ( config->type() == type && config->name() == name )
405 break;
406 }
407
408 if ( config && config->type() == type && config->name() == name )
409 return config;
410
411 return 0l;
412}
413
414void OIpkgConfigDlg::slotServerSelected( int index ) 396void OIpkgConfigDlg::slotServerSelected( int index )
415{ 397{
416 m_serverCurrent = index; 398 m_serverCurrent = index;
417 399
418 // Enable Edit and Delete buttons 400 // Enable Edit and Delete buttons
419 m_serverEditBtn->setEnabled( true ); 401 m_serverEditBtn->setEnabled( true );
420 m_serverDeleteBtn->setEnabled( true ); 402 m_serverDeleteBtn->setEnabled( true );
421} 403}
422 404
423void OIpkgConfigDlg::slotServerNew() 405void OIpkgConfigDlg::slotServerNew()
424{ 406{
425 OConfItem *server = new OConfItem( OConfItem::Source ); 407 OConfItem *server = new OConfItem( OConfItem::Source );
426 408
427 OIpkgServerDlg dlg( server, this ); 409 OIpkgServerDlg dlg( server, this );
428 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) 410 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted )
429 { 411 {
430 // Add to configuration option list 412 // Add to configuration option list
431 m_configs->append( server ); 413 m_configs->append( server );
432 m_configs->sort(); 414 m_configs->sort();
433 415
434 // Add to server list 416 // Add to server list
435 m_serverList->insertItem( server->name() ); 417 m_serverList->insertItem( server->name() );
436 m_serverList->setCurrentItem( m_serverList->count() ); 418 m_serverList->setCurrentItem( m_serverList->count() );
437 } 419 }
438 else 420 else
439 delete server; 421 delete server;
440} 422}
441 423
442void OIpkgConfigDlg::slotServerEdit() 424void OIpkgConfigDlg::slotServerEdit()
443{ 425{
444 // Find selected server in list 426 // Find selected server in list
445 OConfItem *server = findConfItem( OConfItem::Source, m_serverList->currentText() ); 427 OConfItem *server = m_ipkg->findConfItem( OConfItem::Source, m_serverList->currentText() );
446 428
447 // Edit server 429 // Edit server
448 if ( server ) 430 if ( server )
449 { 431 {
450 QString origName = server->name(); 432 QString origName = server->name();
451 OIpkgServerDlg dlg( server, this ); 433 OIpkgServerDlg dlg( server, this );
452 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) 434 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted )
453 { 435 {
454 // Check to see if name has changed, if so update the server list 436 // Check to see if name has changed, if so update the server list
455 if ( server->name() != origName ) 437 if ( server->name() != origName )
456 m_serverList->changeItem( server->name(), m_serverCurrent ); 438 m_serverList->changeItem( server->name(), m_serverCurrent );
457 } 439 }
458 } 440 }
459} 441}
460 442
461void OIpkgConfigDlg::slotServerDelete() 443void OIpkgConfigDlg::slotServerDelete()
462{ 444{
463 // Find selected server in list 445 // Find selected server in list
464 OConfItem *server = findConfItem( OConfItem::Source, m_serverList->currentText() ); 446 OConfItem *server = m_ipkg->findConfItem( OConfItem::Source, m_serverList->currentText() );
465 447
466 // Delete server 448 // Delete server
467 if ( server ) 449 if ( server )
468 { 450 {
469 m_configs->removeRef( server ); 451 m_configs->removeRef( server );
470 m_serverList->removeItem( m_serverCurrent ); 452 m_serverList->removeItem( m_serverCurrent );
471 } 453 }
472} 454}
473 455
474void OIpkgConfigDlg::slotDestSelected( int index ) 456void OIpkgConfigDlg::slotDestSelected( int index )
475{ 457{
476 m_destCurrent = index; 458 m_destCurrent = index;
477 459
478 // Enable Edit and Delete buttons 460 // Enable Edit and Delete buttons
479 m_destEditBtn->setEnabled( true ); 461 m_destEditBtn->setEnabled( true );
480 m_destDeleteBtn->setEnabled( true ); 462 m_destDeleteBtn->setEnabled( true );
481} 463}
482 464
483void OIpkgConfigDlg::slotDestNew() 465void OIpkgConfigDlg::slotDestNew()
484{ 466{
485 OConfItem *dest = new OConfItem( OConfItem::Destination ); 467 OConfItem *dest = new OConfItem( OConfItem::Destination );
486 468
487 OIpkgDestDlg dlg( dest, this ); 469 OIpkgDestDlg dlg( dest, this );
488 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) 470 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted )
489 { 471 {
490 // Add to configuration option list 472 // Add to configuration option list
491 m_configs->append( dest ); 473 m_configs->append( dest );
492 m_configs->sort(); 474 m_configs->sort();
493 475
494 // Add to destination list 476 // Add to destination list
495 m_destList->insertItem( dest->name() ); 477 m_destList->insertItem( dest->name() );
496 m_destList->setCurrentItem( m_destList->count() ); 478 m_destList->setCurrentItem( m_destList->count() );
497 } 479 }
498 else 480 else
499 delete dest; 481 delete dest;
500} 482}
501 483
502void OIpkgConfigDlg::slotDestEdit() 484void OIpkgConfigDlg::slotDestEdit()
503{ 485{
504 // Find selected destination in list 486 // Find selected destination in list
505 OConfItem *dest = findConfItem( OConfItem::Destination, m_destList->currentText() ); 487 OConfItem *dest = m_ipkg->findConfItem( OConfItem::Destination, m_destList->currentText() );
506 488
507 // Edit destination 489 // Edit destination
508 if ( dest ) 490 if ( dest )
509 { 491 {
510 QString origName = dest->name(); 492 QString origName = dest->name();
511 OIpkgDestDlg dlg( dest, this ); 493 OIpkgDestDlg dlg( dest, this );
512 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) 494 if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted )
513 { 495 {
514 // Check to see if name has changed, if so update the dest list 496 // Check to see if name has changed, if so update the dest list
515 if ( dest->name() != origName ) 497 if ( dest->name() != origName )
516 m_destList->changeItem( dest->name(), m_destCurrent ); 498 m_destList->changeItem( dest->name(), m_destCurrent );
517 } 499 }
518 } 500 }
519} 501}
520 502
521void OIpkgConfigDlg::slotDestDelete() 503void OIpkgConfigDlg::slotDestDelete()
522{ 504{
523 // Find selected destination in list 505 // Find selected destination in list
524 OConfItem *destination = findConfItem( OConfItem::Destination, m_destList->currentText() ); 506 OConfItem *destination = m_ipkg->findConfItem( OConfItem::Destination, m_destList->currentText() );
525 507
526 // Delete destination 508 // Delete destination
527 if ( destination ) 509 if ( destination )
528 { 510 {
529 m_configs->removeRef( destination ); 511 m_configs->removeRef( destination );
530 m_destList->removeItem( m_destCurrent ); 512 m_destList->removeItem( m_destCurrent );
531 } 513 }
532} 514}
533 515
534OIpkgServerDlg::OIpkgServerDlg( OConfItem *server, QWidget *parent ) 516OIpkgServerDlg::OIpkgServerDlg( OConfItem *server, QWidget *parent )
535 : QDialog( parent, QString::null, true, WStyle_ContextHelp ) 517 : QDialog( parent, QString::null, true, WStyle_ContextHelp )
536 , m_server( server ) 518 , m_server( server )
537{ 519{
538 setCaption( tr( "Edit Server" ) ); 520 setCaption( tr( "Edit Server" ) );
539 521
540 // Initialize UI 522 // Initialize UI
541 QVBoxLayout *layout = new QVBoxLayout( this, 2, 4 ); 523 QVBoxLayout *layout = new QVBoxLayout( this, 2, 4 );
542 524
543 m_active = new QCheckBox( tr( "Active" ), this ); 525 m_active = new QCheckBox( tr( "Active" ), this );
544 QWhatsThis::add( m_active, tr( "Tap here to indicate whether this entry is active or not." ) ); 526 QWhatsThis::add( m_active, tr( "Tap here to indicate whether this entry is active or not." ) );
545 layout->addWidget( m_active ); 527 layout->addWidget( m_active );
546 528
547 layout->addStretch(); 529 layout->addStretch();
548 530
diff --git a/noncore/settings/packagemanager/oipkgconfigdlg.h b/noncore/settings/packagemanager/oipkgconfigdlg.h
index 5b7e91d..0fb2e16 100644
--- a/noncore/settings/packagemanager/oipkgconfigdlg.h
+++ b/noncore/settings/packagemanager/oipkgconfigdlg.h
@@ -86,51 +86,48 @@ private:
86 QPushButton *m_destDeleteBtn; // Destination edit button 86 QPushButton *m_destDeleteBtn; // Destination edit button
87 87
88 // Proxy server configuration UI controls 88 // Proxy server configuration UI controls
89 QLineEdit *m_proxyHttpServer; // HTTP proxy server URL edit box 89 QLineEdit *m_proxyHttpServer; // HTTP proxy server URL edit box
90 QCheckBox *m_proxyHttpActive; // Activate HTTP proxy check box 90 QCheckBox *m_proxyHttpActive; // Activate HTTP proxy check box
91 QLineEdit *m_proxyFtpServer; // FTP proxy server edit box 91 QLineEdit *m_proxyFtpServer; // FTP proxy server edit box
92 QCheckBox *m_proxyFtpActive; // Activate FTP proxy check box 92 QCheckBox *m_proxyFtpActive; // Activate FTP proxy check box
93 QLineEdit *m_proxyUsername; // Proxy server username edit box 93 QLineEdit *m_proxyUsername; // Proxy server username edit box
94 QLineEdit *m_proxyPassword; // Proxy server password edit box 94 QLineEdit *m_proxyPassword; // Proxy server password edit box
95 95
96 // Options configuration UI controls 96 // Options configuration UI controls
97 QCheckBox *m_optForceDepends; // Force depends ipkg option checkbox 97 QCheckBox *m_optForceDepends; // Force depends ipkg option checkbox
98 QCheckBox *m_optForceReinstall; // Force reinstall ipkg option checkbox 98 QCheckBox *m_optForceReinstall; // Force reinstall ipkg option checkbox
99 QCheckBox *m_optForceRemove; // Force remove ipkg option checkbox 99 QCheckBox *m_optForceRemove; // Force remove ipkg option checkbox
100 QCheckBox *m_optForceOverwrite; // Force overwrite ipkg option checkbox 100 QCheckBox *m_optForceOverwrite; // Force overwrite ipkg option checkbox
101 QComboBox *m_optVerboseIpkg; // Ipkg verbosity option selection 101 QComboBox *m_optVerboseIpkg; // Ipkg verbosity option selection
102 102
103 void initServerWidget(); 103 void initServerWidget();
104 void initDestinationWidget(); 104 void initDestinationWidget();
105 void initProxyWidget(); 105 void initProxyWidget();
106 void initOptionsWidget(); 106 void initOptionsWidget();
107 107
108 void initData(); 108 void initData();
109 109
110 OConfItem *findConfItem( OConfItem::Type type = OConfItem::NotDefined,
111 const QString &name = QString::null );
112
113private slots: 110private slots:
114 void slotServerSelected( int index ); 111 void slotServerSelected( int index );
115 void slotServerNew(); 112 void slotServerNew();
116 void slotServerEdit(); 113 void slotServerEdit();
117 void slotServerDelete(); 114 void slotServerDelete();
118 115
119 void slotDestSelected( int index ); 116 void slotDestSelected( int index );
120 void slotDestNew(); 117 void slotDestNew();
121 void slotDestEdit(); 118 void slotDestEdit();
122 void slotDestDelete(); 119 void slotDestDelete();
123}; 120};
124 121
125class OIpkgServerDlg : public QDialog 122class OIpkgServerDlg : public QDialog
126{ 123{
127 Q_OBJECT 124 Q_OBJECT
128 125
129public: 126public:
130 OIpkgServerDlg( OConfItem *server = 0l, QWidget *parent = 0l ); 127 OIpkgServerDlg( OConfItem *server = 0l, QWidget *parent = 0l );
131 128
132protected slots: 129protected slots:
133 void accept(); 130 void accept();
134 131
135private: 132private:
136 OConfItem *m_server; 133 OConfItem *m_server;
diff --git a/noncore/settings/packagemanager/opackagemanager.cpp b/noncore/settings/packagemanager/opackagemanager.cpp
index cbddfe7..c9fdec1 100644
--- a/noncore/settings/packagemanager/opackagemanager.cpp
+++ b/noncore/settings/packagemanager/opackagemanager.cpp
@@ -248,67 +248,49 @@ QStringList OPackageManager::servers()
248} 248}
249 249
250QStringList OPackageManager::destinations() 250QStringList OPackageManager::destinations()
251{ 251{
252 QStringList dl; 252 QStringList dl;
253 253
254 OConfItemList *destList = m_ipkg.destinations(); 254 OConfItemList *destList = m_ipkg.destinations();
255 if ( destList ) 255 if ( destList )
256 { 256 {
257 for ( OConfItemListIterator destIt( *destList ); destIt.current(); ++destIt ) 257 for ( OConfItemListIterator destIt( *destList ); destIt.current(); ++destIt )
258 { 258 {
259 OConfItem *destination = destIt.current(); 259 OConfItem *destination = destIt.current();
260 260
261 // Add only active destinations 261 // Add only active destinations
262 if ( destination->active() ) 262 if ( destination->active() )
263 dl << destination->name(); 263 dl << destination->name();
264 } 264 }
265 } 265 }
266 266
267 return dl; 267 return dl;
268} 268}
269 269
270OConfItem *OPackageManager::findConfItem( OConfItem::Type type, const QString &name ) 270OConfItem *OPackageManager::findConfItem( OConfItem::Type type, const QString &name )
271{ 271{
272 OConfItem *confItem = 0x0; 272 return m_ipkg.findConfItem( type, name );
273 OConfItemList *confList = m_ipkg.configItems();
274 if ( confList )
275 {
276 for ( OConfItemListIterator confIt( *confList ); confIt.current(); ++confIt )
277 {
278 OConfItem *conf = confIt.current();
279
280 // Add only active confinations
281 if ( conf->type() == type && conf->name() == name )
282 {
283 confItem = conf;
284 break;
285 }
286 }
287 }
288
289 return confItem;
290
291} 273}
292 274
293OPackage *OPackageManager::findPackage( const QString &name ) 275OPackage *OPackageManager::findPackage( const QString &name )
294{ 276{
295 return m_packages[ name ]; 277 return m_packages[ name ];
296} 278}
297 279
298int OPackageManager::compareVersions( const QString &ver1, const QString &ver2 ) 280int OPackageManager::compareVersions( const QString &ver1, const QString &ver2 )
299{ 281{
300 // TODO - should this be in OIpkg??? 282 // TODO - should this be in OIpkg???
301 283
302 int epoch1, epoch2; 284 int epoch1, epoch2;
303 QString version1, revision1; 285 QString version1, revision1;
304 QString version2, revision2; 286 QString version2, revision2;
305 287
306 parseVersion( ver1, &epoch1, &version1, &revision1 ); 288 parseVersion( ver1, &epoch1, &version1, &revision1 );
307 parseVersion( ver2, &epoch2, &version2, &revision2 ); 289 parseVersion( ver2, &epoch2, &version2, &revision2 );
308 290
309 if ( epoch1 > epoch2 ) 291 if ( epoch1 > epoch2 )
310 return 1; 292 return 1;
311 else if ( epoch1 < epoch2 ) 293 else if ( epoch1 < epoch2 )
312 return -1; 294 return -1;
313 295
314 int r = verrevcmp( version1.latin1(), version2.latin1() ); 296 int r = verrevcmp( version1.latin1(), version2.latin1() );
diff --git a/noncore/settings/packagemanager/opie-packagemanager.control b/noncore/settings/packagemanager/opie-packagemanager.control
index cdf419c..da3ddfe 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), ipkg-link 5Depends: task-opie-minimal, libopiecore2, libopieui2, libipkg (>=0.99.120)
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.6.0$EXTRAVERSION 10Version: 0.6.1$EXTRAVERSION
diff --git a/noncore/settings/packagemanager/packageinfodlg.cpp b/noncore/settings/packagemanager/packageinfodlg.cpp
index 5f72a67..3eef939 100644
--- a/noncore/settings/packagemanager/packageinfodlg.cpp
+++ b/noncore/settings/packagemanager/packageinfodlg.cpp
@@ -55,49 +55,50 @@ PackageInfoDlg::PackageInfoDlg( QWidget *parent, OPackageManager *pm, const QStr
55 Opie::Ui::OTabWidget *tabWidget = new Opie::Ui::OTabWidget( this ); 55 Opie::Ui::OTabWidget *tabWidget = new Opie::Ui::OTabWidget( this );
56 layout->addWidget( tabWidget ); 56 layout->addWidget( tabWidget );
57 57
58 // Information tab 58 // Information tab
59 QWhatsThis::add( &m_information, tr( "This area contains information about the package." ) ); 59 QWhatsThis::add( &m_information, tr( "This area contains information about the package." ) );
60 m_information.reparent( tabWidget, QPoint( 0, 0 ) ); 60 m_information.reparent( tabWidget, QPoint( 0, 0 ) );
61 m_information.setReadOnly( true ); 61 m_information.setReadOnly( true );
62 tabWidget->addTab( &m_information, "UtilsIcon", tr( "Information" ) ); 62 tabWidget->addTab( &m_information, "UtilsIcon", tr( "Information" ) );
63 63
64 // Retrive package information 64 // Retrive package information
65 m_package = m_packman->findPackage( package ); 65 m_package = m_packman->findPackage( package );
66 if ( !m_package ) 66 if ( !m_package )
67 { 67 {
68 m_information.setText( tr( "Unable to retrieve package information." ) ); 68 m_information.setText( tr( "Unable to retrieve package information." ) );
69 return; 69 return;
70 } 70 }
71 71
72 // Display package information 72 // Display package information
73 if ( !m_package->information().isNull() ) 73 if ( !m_package->information().isNull() )
74 m_information.setText( m_package->information() ); 74 m_information.setText( m_package->information() );
75 else 75 else
76 { 76 {
77 // Package information is not cached, retrieve it 77 // Package information is not cached, retrieve it
78 QStringList list( package ); 78 QStringList list( package );
79 m_packman->executeCommand( OPackage::Info, list, QString::null, this, SLOT(slotInfo(char*)), true ); 79 m_packman->executeCommand( OPackage::Info, list, QString::null,
80 this, SLOT(slotInfo(const QString &)), true );
80 } 81 }
81 82
82 // Files tab (display only if package is installed) 83 // Files tab (display only if package is installed)
83 if ( !m_package->versionInstalled().isNull() ) 84 if ( !m_package->versionInstalled().isNull() )
84 { 85 {
85 QWidget *filesWidget = new QWidget( tabWidget ); 86 QWidget *filesWidget = new QWidget( tabWidget );
86 QVBoxLayout *filesLayout = new QVBoxLayout( filesWidget, 2, 2 ); 87 QVBoxLayout *filesLayout = new QVBoxLayout( filesWidget, 2, 2 );
87 QWhatsThis::add( &m_files, tr( "This area contains a list of files contained in this package." ) ); 88 QWhatsThis::add( &m_files, tr( "This area contains a list of files contained in this package." ) );
88 m_files.reparent( filesWidget, QPoint( 0, 0 ) ); 89 m_files.reparent( filesWidget, QPoint( 0, 0 ) );
89 m_files.setReadOnly( true ); 90 m_files.setReadOnly( true );
90 filesLayout->addWidget( &m_files ); 91 filesLayout->addWidget( &m_files );
91 92
92 // If file list is already cached, display 93 // If file list is already cached, display
93 if ( !m_package->files().isNull() ) 94 if ( !m_package->files().isNull() )
94 m_files.setText( m_package->files() ); 95 m_files.setText( m_package->files() );
95 else 96 else
96 { 97 {
97 m_retrieveFiles = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ), 98 m_retrieveFiles = new QPushButton( Resource::loadPixmap( "packagemanager/apply" ),
98 tr( "Retrieve file list" ), filesWidget ); 99 tr( "Retrieve file list" ), filesWidget );
99 QWhatsThis::add( m_retrieveFiles, tr( "Tap here to retrieve list of files contained in this package." ) ); 100 QWhatsThis::add( m_retrieveFiles, tr( "Tap here to retrieve list of files contained in this package." ) );
100 filesLayout->addWidget( m_retrieveFiles ); 101 filesLayout->addWidget( m_retrieveFiles );
101 connect( m_retrieveFiles, SIGNAL(clicked()), this, SLOT(slotBtnFileScan()) ); 102 connect( m_retrieveFiles, SIGNAL(clicked()), this, SLOT(slotBtnFileScan()) );
102 } 103 }
103 104
@@ -107,45 +108,46 @@ PackageInfoDlg::PackageInfoDlg( QWidget *parent, OPackageManager *pm, const QStr
107 } 108 }
108 else 109 else
109 m_files.hide(); 110 m_files.hide();
110} 111}
111 112
112PackageInfoDlg::~PackageInfoDlg() 113PackageInfoDlg::~PackageInfoDlg()
113{ 114{
114 if ( !m_package ) 115 if ( !m_package )
115 return; 116 return;
116 117
117 // Cache package information 118 // Cache package information
118 if ( !m_information.text().isNull() ) 119 if ( !m_information.text().isNull() )
119 m_package->setInformation( m_information.text() ); 120 m_package->setInformation( m_information.text() );
120 121
121 // Cache package file list 122 // Cache package file list
122 if ( !m_files.text().isEmpty() ) 123 if ( !m_files.text().isEmpty() )
123 m_package->setFiles( m_files.text() ); 124 m_package->setFiles( m_files.text() );
124} 125}
125 126
126void PackageInfoDlg::slotBtnFileScan() 127void PackageInfoDlg::slotBtnFileScan()
127{ 128{
128 m_files.clear(); 129 m_files.clear();
129 130
130 QStringList list( m_package->name() ); 131 QStringList list( m_package->name() );
131 m_packman->executeCommand( OPackage::Files, list, QString::null, this, SLOT(slotFiles(char*)), true ); 132 m_packman->executeCommand( OPackage::Files, list, QString::null,
133 this, SLOT(slotFiles(const QString &)), true );
132 134
133 if ( m_retrieveFiles ) 135 if ( m_retrieveFiles )
134 m_retrieveFiles->hide(); 136 m_retrieveFiles->hide();
135} 137}
136 138
137void PackageInfoDlg::slotInfo( char *info ) 139void PackageInfoDlg::slotInfo( const QString &info )
138{ 140{
139 m_information.append( info ); 141 m_information.append( info );
140} 142}
141 143
142void PackageInfoDlg::slotFiles( char *filelist ) 144void PackageInfoDlg::slotFiles( const QString &filelist )
143{ 145{
144 QString str = filelist; 146 QString str = filelist;
145 147
146 // Skip first line of output ("Package xxx is installed...") 148 // Skip first line of output ("Package xxx is installed...")
147 if ( str.startsWith( "Package " ) ) 149 if ( str.startsWith( "Package " ) )
148 str = str.right( str.length() - str.find( '\n' ) - 1 ); 150 str = str.right( str.length() - str.find( '\n' ) - 1 );
149 151
150 m_files.append( str ); 152 m_files.append( str );
151} 153}
diff --git a/noncore/settings/packagemanager/packageinfodlg.h b/noncore/settings/packagemanager/packageinfodlg.h
index d1830de..2962f9a 100644
--- a/noncore/settings/packagemanager/packageinfodlg.h
+++ b/noncore/settings/packagemanager/packageinfodlg.h
@@ -38,29 +38,29 @@ _;:, .> :=|. This file is free software; you can
38class QPushButton; 38class QPushButton;
39 39
40class OPackage; 40class OPackage;
41class OPackageManager; 41class OPackageManager;
42 42
43class PackageInfoDlg : public QWidget 43class PackageInfoDlg : public QWidget
44{ 44{
45 Q_OBJECT 45 Q_OBJECT
46 46
47public: 47public:
48 PackageInfoDlg( QWidget *parent = 0l, OPackageManager *pm = 0l, const QString &package = QString::null ); 48 PackageInfoDlg( QWidget *parent = 0l, OPackageManager *pm = 0l, const QString &package = QString::null );
49 ~PackageInfoDlg(); 49 ~PackageInfoDlg();
50 50
51private: 51private:
52 OPackageManager *m_packman; // Pointer to application instance of package manager 52 OPackageManager *m_packman; // Pointer to application instance of package manager
53 OPackage *m_package; // Pointer to package to display information for 53 OPackage *m_package; // Pointer to package to display information for
54 54
55 // UI controls 55 // UI controls
56 QMultiLineEdit m_information; // Multi-line edit to display package information 56 QMultiLineEdit m_information; // Multi-line edit to display package information
57 QMultiLineEdit m_files; // Multi-line edit to display package file list 57 QMultiLineEdit m_files; // Multi-line edit to display package file list
58 QPushButton *m_retrieveFiles; // Push button to retrieve file list 58 QPushButton *m_retrieveFiles; // Push button to retrieve file list
59 59
60private slots: 60private slots:
61 void slotBtnFileScan(); 61 void slotBtnFileScan();
62 void slotInfo( char *info ); 62 void slotInfo( const QString &info );
63 void slotFiles( char *filelist ); 63 void slotFiles( const QString &filelist );
64}; 64};
65 65
66#endif 66#endif