summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/packagemanager/ChangeLog3
-rw-r--r--noncore/settings/packagemanager/oipkg.cpp2
-rw-r--r--noncore/settings/packagemanager/opackagemanager.cpp101
-rw-r--r--noncore/settings/packagemanager/opackagemanager.h3
-rw-r--r--noncore/settings/packagemanager/opie-packagemanager.control2
-rw-r--r--noncore/settings/packagemanager/promptdlg.cpp2
6 files changed, 103 insertions, 10 deletions
diff --git a/noncore/settings/packagemanager/ChangeLog b/noncore/settings/packagemanager/ChangeLog
index 6ad724f..d53a2b3 100644
--- a/noncore/settings/packagemanager/ChangeLog
+++ b/noncore/settings/packagemanager/ChangeLog
@@ -1,25 +1,28 @@
12004-02-13 Dan Williams <drw@handhelds.org> 12004-02-13 Dan Williams <drw@handhelds.org>
2 2
3 * Released version 0.3.0
3 * Fix handling of filtering options in View menu 4 * Fix handling of filtering options in View menu
5 * Do proper version string comparison
6 * Fix string alignment code in PromptDlg to eliminate QT warning messages
4 7
52004-02-12 Dan Williams <drw@handhelds.org> 82004-02-12 Dan Williams <drw@handhelds.org>
6 9
7 * Package information dialog implemented 10 * Package information dialog implemented
8 * What's This app icon enabled 11 * What's This app icon enabled
9 * Changed all QDialog::exec() occurences to QPEApplication::execDialog() 12 * Changed all QDialog::exec() occurences to QPEApplication::execDialog()
10 13
112004-01-23 Dan Williams <drw@handhelds.org> 142004-01-23 Dan Williams <drw@handhelds.org>
12 15
13 * Added package download functionality 16 * Added package download functionality
14 * Have Opie update links after install/removal so that apps 17 * Have Opie update links after install/removal so that apps
15 will display properly in Launcher 18 will display properly in Launcher
16 19
172004-01-20 Dan Williams <drw@handhelds.org> 202004-01-20 Dan Williams <drw@handhelds.org>
18 21
19 * Released version 0.2.0 22 * Released version 0.2.0
20 * Converted to use libipkg in place of spawning ipkg process 23 * Converted to use libipkg in place of spawning ipkg process
21 24
222004-01-13 Dan Williams <drw@handhelds.org> 252004-01-13 Dan Williams <drw@handhelds.org>
23 26
24 * Released version 0.1.0 27 * Released version 0.1.0
25 * Initial check-in of new package management client to eventually replace AQPkg 28 * Initial check-in of new package management client to eventually replace AQPkg
diff --git a/noncore/settings/packagemanager/oipkg.cpp b/noncore/settings/packagemanager/oipkg.cpp
index eb07a61..086e91b 100644
--- a/noncore/settings/packagemanager/oipkg.cpp
+++ b/noncore/settings/packagemanager/oipkg.cpp
@@ -1,136 +1,134 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 3
4              Copyright (c) 2003 Dan Williams <drw@handhelds.org> 4              Copyright (c) 2003 Dan Williams <drw@handhelds.org>
5 =. 5 =.
6 .=l. 6 .=l.
7           .>+-= 7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can 8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under 9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software 11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License, 12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version. 13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_. 14    .%`+i>       _;_.
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 <stdio.h>
35#include <stdlib.h> 34#include <stdlib.h>
36#include <string.h> 35#include <string.h>
37 36
38#include <qdir.h> 37#include <qdir.h>
39#include <qfile.h> 38#include <qfile.h>
40#include <qmessagebox.h> 39#include <qmessagebox.h>
41#include <qtextstream.h> 40#include <qtextstream.h>
42 41
43const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file 42const QString IPKG_CONF = "/etc/ipkg.conf"; // Fully-qualified name of Ipkg primary configuration file
44const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files 43const QString IPKG_CONF_DIR = "/etc/ipkg"; // Directory of secondary Ipkg configuration files
45const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists 44const QString IPKG_PKG_PATH = "/usr/lib/ipkg/lists"; // Directory containing server package lists
46const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location 45const QString IPKG_STATUS_PATH = "usr/lib/ipkg/status"; // Destination status file location
47 46
48OIpkg *oipkg; 47OIpkg *oipkg;
49 48
50// Ipkg callback functions 49// Ipkg callback functions
51 50
52int fsignalIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg ) 51int fsignalIpkgMessage( ipkg_conf_t */*conf*/, message_level_t /*level*/, char *msg )
53{ 52{
54 oipkg->ipkgMessage( msg ); 53 oipkg->ipkgMessage( msg );
55 return 0; 54 return 0;
56} 55}
57 56
58char *fIpkgResponse( char */*question*/ ) 57char *fIpkgResponse( char */*question*/ )
59{ 58{
60 return 0x0; 59 return 0x0;
61} 60}
62 61
63int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ ) 62int fIpkgStatus( char */*name*/, int /*status*/, char *desc, void */*userdata*/ )
64{ 63{
65 oipkg->ipkgStatus( desc ); 64 oipkg->ipkgStatus( desc );
66 return 0; 65 return 0;
67} 66}
68 67
69int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/, 68int fIpkgFiles( char */*name*/, char *desc, char */*version*/, pkg_state_status_t /*status*/,
70 void */*userdata*/ ) 69 void */*userdata*/ )
71{ 70{
72printf( "*****List*****\n%s\n", desc );
73 oipkg->ipkgList( desc ); 71 oipkg->ipkgList( desc );
74 return 0; 72 return 0;
75} 73}
76 74
77OIpkg::OIpkg( Config *config, QObject *parent, const char *name ) 75OIpkg::OIpkg( Config *config, QObject *parent, const char *name )
78 : QObject( parent, name ) 76 : QObject( parent, name )
79 , m_config( config ) 77 , m_config( config )
80 , m_confInfo( NULL ) 78 , m_confInfo( NULL )
81 , m_ipkgExecOptions( 0 ) 79 , m_ipkgExecOptions( 0 )
82 , m_ipkgExecVerbosity( 1 ) 80 , m_ipkgExecVerbosity( 1 )
83{ 81{
84 oipkg = this; 82 oipkg = this;
85 83
86 // Initialize libipkg 84 // Initialize libipkg
87 if ( ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ) ) 85 if ( ipkg_init( &fsignalIpkgMessage, &fIpkgResponse, &m_ipkgArgs ) )
88 QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error initialing libipkg" ) ); 86 QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error initialing libipkg" ) );
89 87
90 // Default ipkg run-time arguments 88 // Default ipkg run-time arguments
91 m_ipkgArgs.noaction = false; 89 m_ipkgArgs.noaction = false;
92 m_ipkgArgs.force_defaults = true; 90 m_ipkgArgs.force_defaults = true;
93} 91}
94 92
95OIpkg::~OIpkg() 93OIpkg::~OIpkg()
96{ 94{
97 // Upon destruction, ensure that items in config list are deleted with list 95 // Upon destruction, ensure that items in config list are deleted with list
98 if ( m_confInfo ) 96 if ( m_confInfo )
99 m_confInfo->setAutoDelete( true ); 97 m_confInfo->setAutoDelete( true );
100 98
101 // Free up libipkg resources 99 // Free up libipkg resources
102 if ( ipkg_deinit( &m_ipkgArgs ) ) 100 if ( ipkg_deinit( &m_ipkgArgs ) )
103 QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error freeing libipkg" ) ); 101 QMessageBox::critical( 0, tr( "OIpkg" ), tr( "Error freeing libipkg" ) );
104} 102}
105 103
106OConfItemList *OIpkg::configItems() 104OConfItemList *OIpkg::configItems()
107{ 105{
108 // Retrieve all configuration items 106 // Retrieve all configuration items
109 return filterConfItems(); 107 return filterConfItems();
110} 108}
111 109
112OConfItemList *OIpkg::servers() 110OConfItemList *OIpkg::servers()
113{ 111{
114 // Retrieve only servers 112 // Retrieve only servers
115 return filterConfItems( OConfItem::Source ); 113 return filterConfItems( OConfItem::Source );
116} 114}
117 115
118OConfItemList *OIpkg::destinations() 116OConfItemList *OIpkg::destinations()
119{ 117{
120 // Retrieve only destinations 118 // Retrieve only destinations
121 return filterConfItems( OConfItem::Destination ); 119 return filterConfItems( OConfItem::Destination );
122} 120}
123 121
124OConfItemList *OIpkg::options() 122OConfItemList *OIpkg::options()
125{ 123{
126 // Retrieve only destinations 124 // Retrieve only destinations
127 return filterConfItems( OConfItem::Option ); 125 return filterConfItems( OConfItem::Option );
128} 126}
129 127
130void OIpkg::setConfigItems( OConfItemList *configList ) 128void OIpkg::setConfigItems( OConfItemList *configList )
131{ 129{
132 if ( m_confInfo ) 130 if ( m_confInfo )
133 delete m_confInfo; 131 delete m_confInfo;
134 132
135 m_confInfo = configList; 133 m_confInfo = configList;
136} 134}
diff --git a/noncore/settings/packagemanager/opackagemanager.cpp b/noncore/settings/packagemanager/opackagemanager.cpp
index ad2fe02..3633e05 100644
--- a/noncore/settings/packagemanager/opackagemanager.cpp
+++ b/noncore/settings/packagemanager/opackagemanager.cpp
@@ -1,95 +1,97 @@
1/* 1/*
2                This file is part of the Opie Project 2                This file is part of the Opie Project
3 3
4              Copyright (c) 2003 Dan Williams <drw@handhelds.org> 4              Copyright (c) 2003 Dan Williams <drw@handhelds.org>
5 =. 5 =.
6 .=l. 6 .=l.
7           .>+-= 7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can 8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under 9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software 11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License, 12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version. 13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_. 14    .%`+i>       _;_.
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 <ctype.h>
33
32#include <qpe/qpeapplication.h> 34#include <qpe/qpeapplication.h>
33 35
34#include "opackagemanager.h" 36#include "opackagemanager.h"
35#include "oipkgconfigdlg.h" 37#include "oipkgconfigdlg.h"
36 38
37OPackageManager::OPackageManager( Config *config, QObject *parent, const char *name ) 39OPackageManager::OPackageManager( Config *config, QObject *parent, const char *name )
38 : QObject( parent, name ) 40 : QObject( parent, name )
39 , m_config( config ) 41 , m_config( config )
40 , m_ipkg( m_config, this ) 42 , m_ipkg( m_config, this )
41 , m_packages( 9973 ) 43 , m_packages( 9973 )
42 , m_categories() 44 , m_categories()
43{ 45{
44 m_packages.setAutoDelete( true ); 46 m_packages.setAutoDelete( true );
45} 47}
46 48
47void OPackageManager::loadAvailablePackages() 49void OPackageManager::loadAvailablePackages()
48{ 50{
49 m_packages.clear(); 51 m_packages.clear();
50 52
51 OConfItemList *serverList = m_ipkg.servers(); 53 OConfItemList *serverList = m_ipkg.servers();
52 54
53 if ( serverList ) 55 if ( serverList )
54 { 56 {
55 // Initialize status messaging 57 // Initialize status messaging
56 emit initStatus( serverList->count() ); 58 emit initStatus( serverList->count() );
57 int serverCount = 0; 59 int serverCount = 0;
58 60
59 bool categoryAdded = false; 61 bool categoryAdded = false;
60 62
61 for ( OConfItemListIterator serverIt( *serverList ); serverIt.current(); ++serverIt ) 63 for ( OConfItemListIterator serverIt( *serverList ); serverIt.current(); ++serverIt )
62 { 64 {
63 OConfItem *server = serverIt.current(); 65 OConfItem *server = serverIt.current();
64 66
65 // Process server only if it is active 67 // Process server only if it is active
66 if ( server->active() ) 68 if ( server->active() )
67 { 69 {
68 // Update status 70 // Update status
69 QString status = tr( "Reading available packages:\n\t" ); 71 QString status = tr( "Reading available packages:\n\t" );
70 status.append( server->name() ); 72 status.append( server->name() );
71 emit statusText( status ); 73 emit statusText( status );
72 ++serverCount; 74 ++serverCount;
73 emit statusBar( serverCount ); 75 emit statusBar( serverCount );
74 qApp->processEvents(); 76 qApp->processEvents();
75 77
76 OPackageList *packageList = m_ipkg.availablePackages( server->name() ); 78 OPackageList *packageList = m_ipkg.availablePackages( server->name() );
77 if ( packageList ) 79 if ( packageList )
78 { 80 {
79 for ( OPackageListIterator packageIt( *packageList ); packageIt.current(); ++packageIt ) 81 for ( OPackageListIterator packageIt( *packageList ); packageIt.current(); ++packageIt )
80 { 82 {
81 OPackage *package = packageIt.current(); 83 OPackage *package = packageIt.current();
82 84
83 // Load package info 85 // Load package info
84 if ( !m_packages.find( package->name() ) ) 86 if ( !m_packages.find( package->name() ) )
85 m_packages.insert( package->name(), package ); 87 m_packages.insert( package->name(), package );
86 else 88 else
87 { 89 {
88 // If new package is newer version, replace existing package 90 // If new package is newer version, replace existing package
89 OPackage *currPackage = m_packages[package->name()]; 91 OPackage *currPackage = m_packages[package->name()];
90 if ( compareVersions( package->version(), currPackage->version() ) == 1 ) 92 if ( compareVersions( package->version(), currPackage->version() ) == 1 )
91 m_packages.replace( package->name(), package ); 93 m_packages.replace( package->name(), package );
92 } 94 }
93 95
94 // Add category to list if it doesn't already exist 96 // Add category to list if it doesn't already exist
95 if ( m_categories.grep( package->category() ).isEmpty() ) 97 if ( m_categories.grep( package->category() ).isEmpty() )
@@ -232,92 +234,179 @@ QStringList *OPackageManager::servers()
232 OConfItemList *serverList = m_ipkg.servers(); 234 OConfItemList *serverList = m_ipkg.servers();
233 if ( serverList ) 235 if ( serverList )
234 { 236 {
235 for ( OConfItemListIterator serverIt( *serverList ); serverIt.current(); ++serverIt ) 237 for ( OConfItemListIterator serverIt( *serverList ); serverIt.current(); ++serverIt )
236 { 238 {
237 OConfItem *server = serverIt.current(); 239 OConfItem *server = serverIt.current();
238 240
239 // Add only active servers 241 // Add only active servers
240 if ( server->active() ) 242 if ( server->active() )
241 *sl << server->name(); 243 *sl << server->name();
242 } 244 }
243 } 245 }
244 246
245 return sl; 247 return sl;
246} 248}
247 249
248QStringList *OPackageManager::destinations() 250QStringList *OPackageManager::destinations()
249{ 251{
250 QStringList *dl = new QStringList(); 252 QStringList *dl = new QStringList();
251 253
252 OConfItemList *destList = m_ipkg.destinations(); 254 OConfItemList *destList = m_ipkg.destinations();
253 if ( destList ) 255 if ( destList )
254 { 256 {
255 for ( OConfItemListIterator destIt( *destList ); destIt.current(); ++destIt ) 257 for ( OConfItemListIterator destIt( *destList ); destIt.current(); ++destIt )
256 { 258 {
257 OConfItem *destination = destIt.current(); 259 OConfItem *destination = destIt.current();
258 260
259 // Add only active destinations 261 // Add only active destinations
260 if ( destination->active() ) 262 if ( destination->active() )
261 *dl << destination->name(); 263 *dl << destination->name();
262 } 264 }
263 } 265 }
264 266
265 return dl; 267 return dl;
266} 268}
267 269
268OConfItem *OPackageManager::findConfItem( OConfItem::Type type, const QString &name ) 270OConfItem *OPackageManager::findConfItem( OConfItem::Type type, const QString &name )
269{ 271{
270 OConfItem *confItem = 0x0; 272 OConfItem *confItem = 0x0;
271 OConfItemList *confList = m_ipkg.configItems(); 273 OConfItemList *confList = m_ipkg.configItems();
272 if ( confList ) 274 if ( confList )
273 { 275 {
274 for ( OConfItemListIterator confIt( *confList ); confIt.current(); ++confIt ) 276 for ( OConfItemListIterator confIt( *confList ); confIt.current(); ++confIt )
275 { 277 {
276 OConfItem *conf = confIt.current(); 278 OConfItem *conf = confIt.current();
277 279
278 // Add only active confinations 280 // Add only active confinations
279 if ( conf->type() == type && conf->name() == name ) 281 if ( conf->type() == type && conf->name() == name )
280 { 282 {
281 confItem = conf; 283 confItem = conf;
282 break; 284 break;
283 } 285 }
284 } 286 }
285 } 287 }
286 288
287 return confItem; 289 return confItem;
288 290
289} 291}
290 292
291OPackage *OPackageManager::findPackage( const QString &name ) 293OPackage *OPackageManager::findPackage( const QString &name )
292{ 294{
293 return m_packages[ name ]; 295 return m_packages[ name ];
294} 296}
295 297
296int OPackageManager::compareVersions( const QString &version1, const QString &version2 ) 298int OPackageManager::compareVersions( const QString &ver1, const QString &ver2 )
297{ 299{
298 // TODO - do proper compare! 300 // TODO - should this be in OIpkg???
299 if ( version1 < version2 ) 301
300 return -1; 302 int epoch1, epoch2;
301 else if ( version1 > version2 ) 303 QString version1, revision1;
304 QString version2, revision2;
305
306 parseVersion( ver1, &epoch1, &version1, &revision1 );
307 parseVersion( ver2, &epoch2, &version2, &revision2 );
308
309 if ( epoch1 > epoch2 )
302 return 1; 310 return 1;
311 else if ( epoch1 < epoch2 )
312 return -1;
303 313
304 return 0; 314 int r = verrevcmp( version1.latin1(), version2.latin1() );
315 if (r)
316 return r;
317
318 r = verrevcmp( revision1.latin1(), revision2.latin1() );
319 return r;
305} 320}
306 321
307bool OPackageManager::configureDlg( bool installOptions ) 322bool OPackageManager::configureDlg( bool installOptions )
308{ 323{
309 OIpkgConfigDlg dlg( &m_ipkg, installOptions, static_cast<QWidget *>(parent()) ); 324 OIpkgConfigDlg dlg( &m_ipkg, installOptions, static_cast<QWidget *>(parent()) );
310 return ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ); 325 return ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted );
311} 326}
312 327
313void OPackageManager::saveSettings() 328void OPackageManager::saveSettings()
314{ 329{
315 m_ipkg.saveSettings(); 330 m_ipkg.saveSettings();
316} 331}
317 332
318bool OPackageManager::executeCommand( OPackage::Command command, QStringList *packages, 333bool OPackageManager::executeCommand( OPackage::Command command, QStringList *packages,
319 const QString &destination, const QObject *receiver, 334 const QString &destination, const QObject *receiver,
320 const char *slotOutput, bool rawOutput ) 335 const char *slotOutput, bool rawOutput )
321{ 336{
322 return m_ipkg.executeCommand( command, packages, destination, receiver, slotOutput, rawOutput ); 337 return m_ipkg.executeCommand( command, packages, destination, receiver, slotOutput, rawOutput );
323} 338}
339
340void OPackageManager::parseVersion( const QString &verstr, int *epoch, QString *version,
341 QString *revision )
342{
343 *epoch = 0;
344 *revision = QString::null;
345
346 // Version string is in the format "ee:vv-rv", where ee=epoch, vv=version, rv=revision
347
348 // Get epoch
349 int colonpos = verstr.find( ':' );
350 if ( colonpos > -1 )
351 {
352 *epoch = verstr.left( colonpos ).toInt();
353 }
354
355 // Get version and revision
356 int hyphenpos = verstr.find( '-', colonpos + 1 );
357 int verlen = verstr.length();
358 if ( hyphenpos > -1 )
359 {
360 *version = verstr.mid( colonpos + 1, hyphenpos - colonpos - 1 );
361 *revision = verstr.right( verlen - hyphenpos - 1 );
362 }
363 else
364 {
365 *version = verstr.right( verlen - colonpos );
366 }
367}
368
369/*
370 * libdpkg - Debian packaging suite library routines
371 * vercmp.c - comparison of version numbers
372 *
373 * Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
374 */
375int OPackageManager::verrevcmp( const char *val, const char *ref )
376{
377 int vc, rc;
378 long vl, rl;
379 const char *vp, *rp;
380 const char *vsep, *rsep;
381
382 if (!val) val= "";
383 if (!ref) ref= "";
384 for (;;) {
385 vp= val; while (*vp && !isdigit(*vp)) vp++;
386 rp= ref; while (*rp && !isdigit(*rp)) rp++;
387 for (;;) {
388 vc= (val == vp) ? 0 : *val++;
389 rc= (ref == rp) ? 0 : *ref++;
390 if (!rc && !vc) break;
391 if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */
392 if (rc && !isalpha(rc)) rc += 256;
393 if (vc != rc) return vc - rc;
394 }
395 val= vp;
396 ref= rp;
397 vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10);
398 rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10);
399 if (vl != rl) return vl - rl;
400
401 vc = *val;
402 rc = *ref;
403 vsep = strchr(".-", vc);
404 rsep = strchr(".-", rc);
405 if (vsep && !rsep) return -1;
406 if (!vsep && rsep) return +1;
407
408 if (!*val && !*ref) return 0;
409 if (!*val) return -1;
410 if (!*ref) return +1;
411 }
412}
diff --git a/noncore/settings/packagemanager/opackagemanager.h b/noncore/settings/packagemanager/opackagemanager.h
index 871af0c..b710a51 100644
--- a/noncore/settings/packagemanager/opackagemanager.h
+++ b/noncore/settings/packagemanager/opackagemanager.h
@@ -19,71 +19,74 @@
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#ifndef OPACKAGEMANAGER_H 32#ifndef OPACKAGEMANAGER_H
33#define OPACKAGEMANAGER_H 33#define OPACKAGEMANAGER_H
34 34
35#include <qdict.h> 35#include <qdict.h>
36#include <qobject.h> 36#include <qobject.h>
37#include <qstringlist.h> 37#include <qstringlist.h>
38 38
39#include <qpe/config.h> 39#include <qpe/config.h>
40 40
41#include "oipkg.h" 41#include "oipkg.h"
42 42
43class OPackageManager : public QObject 43class OPackageManager : public QObject
44{ 44{
45 Q_OBJECT 45 Q_OBJECT
46 46
47public: 47public:
48 OPackageManager( Config *config = 0x0, QObject *parent = 0x0, const char *name = 0x0 ); 48 OPackageManager( Config *config = 0x0, QObject *parent = 0x0, const char *name = 0x0 );
49 49
50 void loadAvailablePackages(); 50 void loadAvailablePackages();
51 void loadInstalledPackages(); 51 void loadInstalledPackages();
52 52
53 enum Status { All, NotInstalled, Installed, Updated, NotDefined }; 53 enum Status { All, NotInstalled, Installed, Updated, NotDefined };
54 54
55 OPackageList *packages(); 55 OPackageList *packages();
56 OPackageList *filterPackages( const QString &name = 0x0,const QString &server = 0x0, 56 OPackageList *filterPackages( const QString &name = 0x0,const QString &server = 0x0,
57 const QString &destination = 0x0, Status status = NotDefined, 57 const QString &destination = 0x0, Status status = NotDefined,
58 const QString &category = 0x0 ); 58 const QString &category = 0x0 );
59 59
60 const QStringList &categories() { return m_categories; } 60 const QStringList &categories() { return m_categories; }
61 QStringList *servers(); 61 QStringList *servers();
62 QStringList *destinations(); 62 QStringList *destinations();
63 63
64 int compareVersions( const QString &version1, const QString &version2 ); 64 int compareVersions( const QString &version1, const QString &version2 );
65 65
66 OConfItem *findConfItem( OConfItem::Type type = OConfItem::NotDefined, 66 OConfItem *findConfItem( OConfItem::Type type = OConfItem::NotDefined,
67 const QString &name = QString::null ); 67 const QString &name = QString::null );
68 OPackage *findPackage( const QString &name = QString::null ); 68 OPackage *findPackage( const QString &name = QString::null );
69 69
70 bool configureDlg( bool installOptions = false ); 70 bool configureDlg( bool installOptions = false );
71 void saveSettings(); 71 void saveSettings();
72 72
73 bool executeCommand( OPackage::Command command = OPackage::NotDefined, QStringList *parameters = 0x0, 73 bool executeCommand( OPackage::Command command = OPackage::NotDefined, QStringList *parameters = 0x0,
74 const QString &destination = QString::null, const QObject *receiver = 0x0, 74 const QString &destination = QString::null, const QObject *receiver = 0x0,
75 const char *slotOutput = 0x0, bool rawOutput = true ); 75 const char *slotOutput = 0x0, bool rawOutput = true );
76 76
77private: 77private:
78 Config *m_config; // Pointer to application configuration file 78 Config *m_config; // Pointer to application configuration file
79 OIpkg m_ipkg; // OIpkg object to retrieve package/configuration information 79 OIpkg m_ipkg; // OIpkg object to retrieve package/configuration information
80 QDict<OPackage> m_packages; // Global list of available packages 80 QDict<OPackage> m_packages; // Global list of available packages
81 QStringList m_categories; // List of all categories 81 QStringList m_categories; // List of all categories
82 82
83 void parseVersion( const QString &verstr, int *epoch, QString *version, QString *revision );
84 int verrevcmp( const char *val, const char *ref );
85
83signals: 86signals:
84 void initStatus( int numSteps ); 87 void initStatus( int numSteps );
85 void statusText( const QString &status ); 88 void statusText( const QString &status );
86 void statusBar( int currStep ); 89 void statusBar( int currStep );
87}; 90};
88 91
89#endif 92#endif
diff --git a/noncore/settings/packagemanager/opie-packagemanager.control b/noncore/settings/packagemanager/opie-packagemanager.control
index 095e3be..5a3908e 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: Settings 4Section: Settings
5Depends: task-opie-minimal 5Depends: task-opie-minimal
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.2.0 10Version: 0.3.0
diff --git a/noncore/settings/packagemanager/promptdlg.cpp b/noncore/settings/packagemanager/promptdlg.cpp
index 128e88e..4e82ba9 100644
--- a/noncore/settings/packagemanager/promptdlg.cpp
+++ b/noncore/settings/packagemanager/promptdlg.cpp
@@ -1,112 +1,112 @@
1/* 1/*
2                This file is part of the OPIE Project 2                This file is part of the OPIE Project
3 3
4 =. Copyright (c) 2003 Dan Williams <drw@handhelds.org> 4 =. Copyright (c) 2003 Dan Williams <drw@handhelds.org>
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 "promptdlg.h" 30#include "promptdlg.h"
31 31
32#include <qlabel.h> 32#include <qlabel.h>
33#include <qlayout.h> 33#include <qlayout.h>
34#include <qpushbutton.h> 34#include <qpushbutton.h>
35#include <qwidgetlist.h> 35#include <qwidgetlist.h>
36 36
37#include <qpe/qpeapplication.h> 37#include <qpe/qpeapplication.h>
38 38
39PromptDlg::PromptDlg( const QString &caption, const QString &text, const QString &btn1, const QString &btn2, 39PromptDlg::PromptDlg( const QString &caption, const QString &text, const QString &btn1, const QString &btn2,
40 QWidget *parent ) 40 QWidget *parent )
41 : QWidget( parent, QString::null, WType_Modal | WType_TopLevel | WStyle_Dialog ) 41 : QWidget( parent, QString::null, WType_Modal | WType_TopLevel | WStyle_Dialog )
42 , m_btnClicked( -1 ) 42 , m_btnClicked( -1 )
43{ 43{
44 setCaption( caption ); 44 setCaption( caption );
45 45
46 QGridLayout *layout = new QGridLayout( this, 2, 2, 4, 2 ); 46 QGridLayout *layout = new QGridLayout( this, 2, 2, 4, 2 );
47 QLabel *label = new QLabel( text, this ); 47 QLabel *label = new QLabel( text, this );
48 label->setAlignment( AlignCenter | AlignTop | WordBreak ); 48 label->setAlignment( AlignCenter | WordBreak );
49 layout->addMultiCellWidget( label, 0, 0, 0, 1 ); 49 layout->addMultiCellWidget( label, 0, 0, 0, 1 );
50 50
51 QPushButton *btn = new QPushButton( btn1, this ); 51 QPushButton *btn = new QPushButton( btn1, this );
52 layout->addWidget( btn, 1, 0 ); 52 layout->addWidget( btn, 1, 0 );
53 connect( btn, SIGNAL(clicked()), this, SLOT(slotBtn1Clicked()) ); 53 connect( btn, SIGNAL(clicked()), this, SLOT(slotBtn1Clicked()) );
54 54
55 btn = new QPushButton( btn2, this ); 55 btn = new QPushButton( btn2, this );
56 layout->addWidget( btn, 1, 1 ); 56 layout->addWidget( btn, 1, 1 );
57 connect( btn, SIGNAL(clicked()), this, SLOT(slotBtn2Clicked()) ); 57 connect( btn, SIGNAL(clicked()), this, SLOT(slotBtn2Clicked()) );
58} 58}
59 59
60int PromptDlg::display() 60int PromptDlg::display()
61{ 61{
62 // Determine position of dialog. Derived from QT's QDialog::show() method. 62 // Determine position of dialog. Derived from QT's QDialog::show() method.
63 QWidget *w = parentWidget(); 63 QWidget *w = parentWidget();
64 QPoint p( 0, 0 ); 64 QPoint p( 0, 0 );
65 int extraw = 0, extrah = 0; 65 int extraw = 0, extrah = 0;
66 QWidget * desk = QApplication::desktop(); 66 QWidget * desk = QApplication::desktop();
67 if ( w ) 67 if ( w )
68 w = w->topLevelWidget(); 68 w = w->topLevelWidget();
69 69
70 QWidgetList *list = QApplication::topLevelWidgets(); 70 QWidgetList *list = QApplication::topLevelWidgets();
71 QWidgetListIt it( *list ); 71 QWidgetListIt it( *list );
72 while ( (extraw == 0 || extrah == 0) && it.current() != 0 ) 72 while ( (extraw == 0 || extrah == 0) && it.current() != 0 )
73 { 73 {
74 int w, h; 74 int w, h;
75 QWidget * current = it.current(); 75 QWidget * current = it.current();
76 ++it; 76 ++it;
77 w = current->geometry().x() - current->x(); 77 w = current->geometry().x() - current->x();
78 h = current->geometry().y() - current->y(); 78 h = current->geometry().y() - current->y();
79 79
80 extraw = QMAX( extraw, w ); 80 extraw = QMAX( extraw, w );
81 extrah = QMAX( extrah, h ); 81 extrah = QMAX( extrah, h );
82 } 82 }
83 delete list; 83 delete list;
84 84
85 // sanity check for decoration frames. With embedding, we 85 // sanity check for decoration frames. With embedding, we
86 // might get extraordinary values 86 // might get extraordinary values
87 if ( extraw >= 10 || extrah >= 40 ) 87 if ( extraw >= 10 || extrah >= 40 )
88 extraw = extrah = 0; 88 extraw = extrah = 0;
89 89
90 if ( w ) 90 if ( w )
91 { 91 {
92 // Use mapToGlobal rather than geometry() in case w might 92 // Use mapToGlobal rather than geometry() in case w might
93 // be embedded in another application 93 // be embedded in another application
94 QPoint pp = w->mapToGlobal( QPoint(0,0) ); 94 QPoint pp = w->mapToGlobal( QPoint(0,0) );
95 p = QPoint( pp.x() + w->width()/2, pp.y() + w->height()/ 2 ); 95 p = QPoint( pp.x() + w->width()/2, pp.y() + w->height()/ 2 );
96 } 96 }
97 else 97 else
98 p = QPoint( desk->width()/2, desk->height()/2 ); 98 p = QPoint( desk->width()/2, desk->height()/2 );
99 99
100 p = QPoint( p.x()-width()/2 - extraw, p.y()-height()/2 - extrah ); 100 p = QPoint( p.x()-width()/2 - extraw, p.y()-height()/2 - extrah );
101 101
102 if ( p.x() + extraw + width() > desk->width() ) 102 if ( p.x() + extraw + width() > desk->width() )
103 p.setX( desk->width() - width() - extraw ); 103 p.setX( desk->width() - width() - extraw );
104 if ( p.x() < 0 ) 104 if ( p.x() < 0 )
105 p.setX( 0 ); 105 p.setX( 0 );
106 106
107 if ( p.y() + extrah + height() > desk->height() ) 107 if ( p.y() + extrah + height() > desk->height() )
108 p.setY( desk->height() - height() - extrah ); 108 p.setY( desk->height() - height() - extrah );
109 if ( p.y() < 0 ) 109 if ( p.y() < 0 )
110 p.setY( 0 ); 110 p.setY( 0 );
111 111
112 move( p ); 112 move( p );