summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/datamgr.cpp19
-rw-r--r--noncore/settings/aqpkg/datamgr.h8
-rw-r--r--noncore/settings/aqpkg/global.h4
-rw-r--r--noncore/settings/aqpkg/installdlgimpl.cpp4
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp139
-rw-r--r--noncore/settings/aqpkg/main.cpp9
-rw-r--r--noncore/settings/aqpkg/mainwin.cpp6
-rw-r--r--noncore/settings/aqpkg/mem.cpp2
-rw-r--r--noncore/settings/aqpkg/package.cpp35
-rw-r--r--noncore/settings/aqpkg/version.cpp39
10 files changed, 107 insertions, 158 deletions
diff --git a/noncore/settings/aqpkg/datamgr.cpp b/noncore/settings/aqpkg/datamgr.cpp
index cd0c78f..67f90a3 100644
--- a/noncore/settings/aqpkg/datamgr.cpp
+++ b/noncore/settings/aqpkg/datamgr.cpp
@@ -1,19 +1,19 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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.
@@ -27,40 +27,43 @@
27 27
28*/ 28*/
29 29
30#ifdef QWS 30#ifdef QWS
31#include <qpe/config.h> 31#include <qpe/config.h>
32#include <qpe/qpeapplication.h> 32#include <qpe/qpeapplication.h>
33#else 33#else
34#include <qapplication.h> 34#include <qapplication.h>
35#endif 35#endif
36 36
37#include <qfile.h> 37#include <qfile.h>
38#include <qtextstream.h> 38#include <qtextstream.h>
39 39
40#include "datamgr.h" 40#include "datamgr.h"
41#include "global.h" 41#include "global.h"
42 42
43QString LOCAL_SERVER;
44QString LOCAL_IPKGS;
45
43 46
44QString DataManager::availableCategories = ""; 47QString DataManager::availableCategories = "";
45DataManager::DataManager() 48DataManager::DataManager()
46 : QObject( 0x0, 0x0 ) 49 : QObject( 0x0, 0x0 )
47{ 50{
48 activeServer = ""; 51 activeServer = "";
49 availableCategories = "#"; 52 availableCategories = "#";
50 53
51 serverList.setAutoDelete( TRUE ); 54 serverList.setAutoDelete( TRUE );
52 destList.setAutoDelete( TRUE ); 55 destList.setAutoDelete( TRUE );
53} 56}
54 57
55DataManager::~DataManager() 58DataManager::~DataManager()
56{ 59{
57} 60}
58 61
59Server *DataManager :: getServer( const char *name ) 62Server *DataManager :: getServer( const char *name )
60{ 63{
61 QListIterator<Server> it( serverList ); 64 QListIterator<Server> it( serverList );
62 while ( it.current() && it.current()->getServerName() != name ) 65 while ( it.current() && it.current()->getServerName() != name )
63 { 66 {
64 ++it; 67 ++it;
65 } 68 }
66 69
@@ -124,33 +127,33 @@ void DataManager :: loadServers()
124 serverList.append( s ); 127 serverList.append( s );
125 128
126 } 129 }
127 else if ( lineStr.startsWith( "dest" ) ) 130 else if ( lineStr.startsWith( "dest" ) )
128 { 131 {
129 char alias[20]; 132 char alias[20];
130 char path[50]; 133 char path[50];
131 sscanf( lineStr, "%*[^ ] %s %s", alias, path ); 134 sscanf( lineStr, "%*[^ ] %s %s", alias, path );
132 Destination *d = new Destination( alias, path ); 135 Destination *d = new Destination( alias, path );
133 bool linkToRoot = true; 136 bool linkToRoot = true;
134#ifdef QWS 137#ifdef QWS
135 QString key = alias; 138 QString key = alias;
136 key += "_linkToRoot"; 139 key += "_linkToRoot";
137 linkToRoot = cfg.readBoolEntry( key, true ); 140 linkToRoot = cfg.readBoolEntry( key, true );
138#endif 141#endif
139 d->linkToRoot( linkToRoot ); 142 d->linkToRoot( linkToRoot );
140 143
141 destList.append( d ); 144 destList.append( d );
142 } 145 }
143 else if ( lineStr.startsWith( "option" ) || lineStr.startsWith( "#option" ) ) 146 else if ( lineStr.startsWith( "option" ) || lineStr.startsWith( "#option" ) )
144 { 147 {
145 char type[20]; 148 char type[20];
146 char val[100]; 149 char val[100];
147 sscanf( lineStr, "%*[^ ] %s %s", type, val ); 150 sscanf( lineStr, "%*[^ ] %s %s", type, val );
148 if ( stricmp( type, "http_proxy" ) == 0 ) 151 if ( stricmp( type, "http_proxy" ) == 0 )
149 { 152 {
150 httpProxy = val; 153 httpProxy = val;
151 if ( lineStr.startsWith( "#" ) ) 154 if ( lineStr.startsWith( "#" ) )
152 httpProxyEnabled = false; 155 httpProxyEnabled = false;
153 else 156 else
154 httpProxyEnabled = true; 157 httpProxyEnabled = true;
155 } 158 }
156 if ( stricmp( type, "ftp_proxy" ) == 0 ) 159 if ( stricmp( type, "ftp_proxy" ) == 0 )
@@ -167,65 +170,65 @@ void DataManager :: loadServers()
167 proxyPassword = val; 170 proxyPassword = val;
168 } 171 }
169 } 172 }
170 } 173 }
171 fclose( fp ); 174 fclose( fp );
172 175
173 reloadServerData( ); 176 reloadServerData( );
174} 177}
175 178
176void DataManager :: reloadServerData( ) 179void DataManager :: reloadServerData( )
177{ 180{
178 emit progressSetSteps( serverList.count() ); 181 emit progressSetSteps( serverList.count() );
179 emit progressSetMessage( tr( "Reading configuration..." ) ); 182 emit progressSetMessage( tr( "Reading configuration..." ) );
180 183
181 QString serverName; 184 QString serverName;
182 int i = 0; 185 int i = 0;
183 186
184 Server *server; 187 Server *server;
185 QListIterator<Server> it( serverList ); 188 QListIterator<Server> it( serverList );
186 for ( ; it.current(); ++it ) 189 for ( ; it.current(); ++it )
187 { 190 {
188 server = it.current(); 191 server = it.current();
189 serverName = server->getServerName(); 192 serverName = server->getServerName();
190 i++; 193 i++;
191 emit progressUpdate( i ); 194 emit progressUpdate( i );
192 qApp->processEvents(); 195 qApp->processEvents();
193 196
194 // Now we've read the config file in we need to read the servers 197 // Now we've read the config file in we need to read the servers
195 // The local server is a special case. This holds the contents of the 198 // The local server is a special case. This holds the contents of the
196 // status files the number of which depends on how many destinations 199 // status files the number of which depends on how many destinations
197 // we've set up 200 // we've set up
198 // The other servers files hold the contents of the server package list 201 // The other servers files hold the contents of the server package list
199 if ( serverName == LOCAL_SERVER ) 202 if ( serverName == LOCAL_SERVER )
200 server->readStatusFile( destList ); 203 server->readStatusFile( destList );
201 else if ( serverName == LOCAL_IPKGS ) 204 else if ( serverName == LOCAL_IPKGS )
202 server->readLocalIpks( getServer( LOCAL_SERVER ) ); 205 server->readLocalIpks( getServer( LOCAL_SERVER ) );
203 else 206 else
204 server->readPackageFile( getServer( LOCAL_SERVER ) ); 207 server->readPackageFile( getServer( LOCAL_SERVER ) );
205 } 208 }
206} 209}
207 210
208void DataManager :: writeOutIpkgConf() 211void DataManager :: writeOutIpkgConf()
209{ 212{
210 QFile f( IPKG_CONF ); 213 QFile f( IPKG_CONF );
211 if ( !f.open( IO_WriteOnly ) ) 214 if ( !f.open( IO_WriteOnly ) )
212 { 215 {
213 return; 216 return;
214 } 217 }
215 218
216 QTextStream t( &f ); 219 QTextStream t( &f );
217/* 220/*
218 QString ipkg_conf = IPKG_CONF; 221 QString ipkg_conf = IPKG_CONF;
219 ofstream out( ipkg_conf ); 222 ofstream out( ipkg_conf );
220*/ 223*/
221 t << "# Written by AQPkg\n"; 224 t << "# Written by AQPkg\n";
222 t << "# Must have one or more source entries of the form:\n"; 225 t << "# Must have one or more source entries of the form:\n";
223 t << "#\n"; 226 t << "#\n";
224 t << "# src <src-name> <source-url>\n"; 227 t << "# src <src-name> <source-url>\n";
225 t << "#\n"; 228 t << "#\n";
226 t << "# and one or more destination entries of the form:\n"; 229 t << "# and one or more destination entries of the form:\n";
227 t << "#\n"; 230 t << "#\n";
228 t << "# dest <dest-name> <target-path>\n"; 231 t << "# dest <dest-name> <target-path>\n";
229 t << "#\n"; 232 t << "#\n";
230 t << "# where <src-name> and <dest-names> are identifiers that\n"; 233 t << "# where <src-name> and <dest-names> are identifiers that\n";
231 t << "# should match [a-zA-Z0-9._-]+, <source-url> should be a\n"; 234 t << "# should match [a-zA-Z0-9._-]+, <source-url> should be a\n";
@@ -281,32 +284,32 @@ void DataManager :: writeOutIpkgConf()
281 { 284 {
282 if ( !ftpProxyEnabled ) 285 if ( !ftpProxyEnabled )
283 t << "#"; 286 t << "#";
284 t << "option ftp_proxy " << ftpProxy << endl; 287 t << "option ftp_proxy " << ftpProxy << endl;
285 } 288 }
286 if ( proxyUsername == "" || (!httpProxyEnabled && !ftpProxyEnabled) ) 289 if ( proxyUsername == "" || (!httpProxyEnabled && !ftpProxyEnabled) )
287 t << "#option proxy_username <username>\n"; 290 t << "#option proxy_username <username>\n";
288 else 291 else
289 t << "option proxy_username " << proxyUsername << endl; 292 t << "option proxy_username " << proxyUsername << endl;
290 if ( proxyPassword == "" || (!httpProxyEnabled && !ftpProxyEnabled) ) 293 if ( proxyPassword == "" || (!httpProxyEnabled && !ftpProxyEnabled) )
291 t << "#option proxy_password <password>\n\n"; 294 t << "#option proxy_password <password>\n\n";
292 else 295 else
293 t << "option proxy_password " << proxyPassword << endl<< endl; 296 t << "option proxy_password " << proxyPassword << endl<< endl;
294 297
295 t << "# Offline mode (for use in constructing flash images offline)\n"; 298 t << "# Offline mode (for use in constructing flash images offline)\n";
296 t << "#option offline_root target\n"; 299 t << "#option offline_root target\n";
297 300
298 f.close(); 301 f.close();
299} 302}
300 303
301 304
302void DataManager :: setAvailableCategories( QString section ) 305void DataManager :: setAvailableCategories( QString section )
303{ 306{
304 QString sectstr = "#"; 307 QString sectstr = "#";
305 sectstr.append( section.lower() ); 308 sectstr.append( section.lower() );
306 sectstr.append( "#" ); 309 sectstr.append( "#" );
307 if ( availableCategories.find( sectstr ) == -1 ) 310 if ( availableCategories.find( sectstr ) == -1 )
308 { 311 {
309 availableCategories.append( section ); 312 availableCategories.append( section );
310 availableCategories.append( "#" ); 313 availableCategories.append( "#" );
311 } 314 }
312} 315}
diff --git a/noncore/settings/aqpkg/datamgr.h b/noncore/settings/aqpkg/datamgr.h
index 32a1e57..9f8920d 100644
--- a/noncore/settings/aqpkg/datamgr.h
+++ b/noncore/settings/aqpkg/datamgr.h
@@ -1,19 +1,19 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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.
@@ -27,34 +27,36 @@
27 27
28*/ 28*/
29 29
30#ifndef DATAMGR_H 30#ifndef DATAMGR_H
31#define DATAMGR_H 31#define DATAMGR_H
32 32
33#include <map> 33#include <map>
34using namespace std; 34using namespace std;
35 35
36#include <qlist.h> 36#include <qlist.h>
37#include <qobject.h> 37#include <qobject.h>
38#include <qstring.h> 38#include <qstring.h>
39 39
40#include "server.h" 40#include "server.h"
41#include "destination.h" 41#include "destination.h"
42 42
43 #define LOCAL_SERVER "Installed Pkgs" 43 //#define LOCAL_SERVER "Installed Pkgs"
44 #define LOCAL_IPKGS "local IPKG" 44 //#define LOCAL_IPKGS "local IPKG"
45extern QString LOCAL_SERVER;
46extern QString LOCAL_IPKGS;
45 47
46/** 48/**
47 *@author Andy Qua 49 *@author Andy Qua
48 */ 50 */
49 51
50 52
51class DataManager : public QObject 53class DataManager : public QObject
52{ 54{
53 Q_OBJECT 55 Q_OBJECT
54public: 56public:
55 DataManager(); 57 DataManager();
56 ~DataManager(); 58 ~DataManager();
57 59
58 void setActiveServer( const QString &act ) { activeServer = act; } 60 void setActiveServer( const QString &act ) { activeServer = act; }
59 QString &getActiveServer( ) { return activeServer; } 61 QString &getActiveServer( ) { return activeServer; }
60 62
diff --git a/noncore/settings/aqpkg/global.h b/noncore/settings/aqpkg/global.h
index 4fdd51d..0325a59 100644
--- a/noncore/settings/aqpkg/global.h
+++ b/noncore/settings/aqpkg/global.h
@@ -1,49 +1,49 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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#ifndef __GLOBAL_H 30#ifndef __GLOBAL_H
31#define __GLOBAL_H 31#define __GLOBAL_H
32 32
33#define VERSION_TEXT "AQPkg Version 1.11" 33//extern QString VERSION_TEXT;
34 34
35// Uncomment the below line to run on a Linux box rather than a Zaurus 35// Uncomment the below line to run on a Linux box rather than a Zaurus
36// box this allows you to change where root is, and where to load config files from 36// box this allows you to change where root is, and where to load config files from
37// #define X86 37// #define X86
38 38
39// Sets up location of ipkg.conf and root directory 39// Sets up location of ipkg.conf and root directory
40#ifdef QWS 40#ifdef QWS
41 41
42#ifndef X86 42#ifndef X86
43 43
44// Running QT/Embedded on an arm processor 44// Running QT/Embedded on an arm processor
45#define IPKG_CONF "/etc/ipkg.conf" 45#define IPKG_CONF "/etc/ipkg.conf"
46#define ROOT "/" 46#define ROOT "/"
47#define IPKG_DIR "/usr/lib/ipkg/" 47#define IPKG_DIR "/usr/lib/ipkg/"
48 48
49#else 49#else
diff --git a/noncore/settings/aqpkg/installdlgimpl.cpp b/noncore/settings/aqpkg/installdlgimpl.cpp
index 17f7b08..ea2c47f 100644
--- a/noncore/settings/aqpkg/installdlgimpl.cpp
+++ b/noncore/settings/aqpkg/installdlgimpl.cpp
@@ -381,37 +381,35 @@ void InstallDlgImpl :: displayText(const QString &text )
381void InstallDlgImpl :: displayAvailableSpace( const QString &text ) 381void InstallDlgImpl :: displayAvailableSpace( const QString &text )
382{ 382{
383 Destination *d = dataMgr->getDestination( text ); 383 Destination *d = dataMgr->getDestination( text );
384 QString destDir = d->getDestinationPath(); 384 QString destDir = d->getDestinationPath();
385 385
386 long blockSize = 0; 386 long blockSize = 0;
387 long totalBlocks = 0; 387 long totalBlocks = 0;
388 long availBlocks = 0; 388 long availBlocks = 0;
389 QString space; 389 QString space;
390 if ( Utils::getStorageSpace( (const char *)destDir, &blockSize, &totalBlocks, &availBlocks ) ) 390 if ( Utils::getStorageSpace( (const char *)destDir, &blockSize, &totalBlocks, &availBlocks ) )
391 { 391 {
392 long mult = blockSize / 1024; 392 long mult = blockSize / 1024;
393 long div = 1024 / blockSize; 393 long div = 1024 / blockSize;
394 394
395 if ( !mult ) mult = 1; 395 if ( !mult ) mult = 1;
396 if ( !div ) div = 1; 396 if ( !div ) div = 1;
397// long total = totalBlocks * mult / div;
398 long avail = availBlocks * mult / div; 397 long avail = availBlocks * mult / div;
399// long used = total - avail;
400 398
401 space.sprintf( "%ld Kb", avail ); 399 space = tr( "%1 Kb" ).arg( avail );
402 } 400 }
403 else 401 else
404 space = tr( "Unknown" ); 402 space = tr( "Unknown" );
405 403
406 if ( txtAvailableSpace ) 404 if ( txtAvailableSpace )
407 txtAvailableSpace->setText( space ); 405 txtAvailableSpace->setText( space );
408} 406}
409 407
410void InstallDlgImpl :: ipkgFinished() 408void InstallDlgImpl :: ipkgFinished()
411{ 409{
412 InstallData *item; 410 InstallData *item;
413 if ( firstPackage ) 411 if ( firstPackage )
414 item = packages.first(); 412 item = packages.first();
415 else 413 else
416 { 414 {
417 // Create symlinks if necessary before moving on to next package 415 // Create symlinks if necessary before moving on to next package
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index 3df569b..43eaaae 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -1,19 +1,19 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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.
@@ -98,137 +98,137 @@ void Ipkg :: runIpkg()
98 if ( flags & FORCE_OVERWRITE ) 98 if ( flags & FORCE_OVERWRITE )
99 commands << "-force-overwrite"; 99 commands << "-force-overwrite";
100 if ( infoLevel == 3 ) 100 if ( infoLevel == 3 )
101 commands << "-verbose_wget"; 101 commands << "-verbose_wget";
102 102
103 // Handle make links 103 // Handle make links
104 // Rules - If make links is switched on, create links to root 104 // Rules - If make links is switched on, create links to root
105 // if destDir is NOT / 105 // if destDir is NOT /
106 if ( flags & MAKE_LINKS ) 106 if ( flags & MAKE_LINKS )
107 { 107 {
108 // If destDir == / turn off make links as package is being insalled 108 // If destDir == / turn off make links as package is being insalled
109 // to root already. 109 // to root already.
110 if ( destDir == "/" ) 110 if ( destDir == "/" )
111 flags ^= MAKE_LINKS; 111 flags ^= MAKE_LINKS;
112 } 112 }
113 } 113 }
114 114
115#ifdef X86 115#ifdef X86
116 commands << "-f"; 116 commands << "-f";
117 commands << IPKG_CONF; 117 commands << IPKG_CONF;
118#endif 118#endif
119 119
120 120
121 if ( option == "reinstall" ) 121 if ( option == "reinstall" )
122 commands << "install"; 122 commands << "install";
123 else 123 else
124 commands << option; 124 commands << option;
125 if ( package != "" ) 125 if ( package != "" )
126 commands << package; 126 commands << package;
127 127
128 128
129 if ( package != "" ) 129 if ( package != "" )
130 emit outputText( QString( "Dealing with package " ) + package ); 130 emit outputText( tr( "Dealing with package %1" ).arg( package) );
131 131
132 qApp->processEvents(); 132 qApp->processEvents();
133 133
134 // If we are removing, reinstalling or upgrading packages and make links option is selected 134 // If we are removing, reinstalling or upgrading packages and make links option is selected
135 // create the links 135 // create the links
136 if ( option == "remove" || option == "reinstall" || option == "upgrade" ) 136 if ( option == "remove" || option == "reinstall" || option == "upgrade" )
137 { 137 {
138 createLinks = false; 138 createLinks = false;
139 if ( flags & MAKE_LINKS ) 139 if ( flags & MAKE_LINKS )
140 { 140 {
141 emit outputText( QString( "Removing symbolic links...\n" ) ); 141 emit outputText( tr( "Removing symbolic links...\n" ) );
142 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 142 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
143 emit outputText( QString( " " ) ); 143 emit outputText( QString( " " ) );
144 } 144 }
145 } 145 }
146 146
147 // Execute command 147 // Execute command
148 dependantPackages = new QList<QString>; 148 dependantPackages = new QList<QString>;
149 dependantPackages->setAutoDelete( true ); 149 dependantPackages->setAutoDelete( true );
150 150
151 executeIpkgCommand( commands, option ); 151 executeIpkgCommand( commands, option );
152 152
153} 153}
154 154
155void Ipkg :: createSymLinks() 155void Ipkg :: createSymLinks()
156{ 156{
157 if ( option == "install" || option == "reinstall" || option == "upgrade" ) 157 if ( option == "install" || option == "reinstall" || option == "upgrade" )
158 { 158 {
159 // If we are not removing packages and make links option is selected 159 // If we are not removing packages and make links option is selected
160 // create the links 160 // create the links
161 createLinks = true; 161 createLinks = true;
162 if ( flags & MAKE_LINKS ) 162 if ( flags & MAKE_LINKS )
163 { 163 {
164 emit outputText( " " ); 164 emit outputText( " " );
165 emit outputText( QString( "Creating symbolic links for " )+ package ); 165 emit outputText( tr( "Creating symbolic links for %1." ).arg( package) );
166 166
167 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 167 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
168 168
169 // link dependant packages that were installed with this release 169 // link dependant packages that were installed with this release
170 QString *pkg; 170 QString *pkg;
171 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) 171 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
172 { 172 {
173 if ( *pkg == package ) 173 if ( *pkg == package )
174 continue; 174 continue;
175 emit outputText( " " ); 175 emit outputText( " " );
176 emit outputText( QString( "Creating symbolic links for " )+ (*pkg) ); 176 emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) );
177 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); 177 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
178 } 178 }
179 } 179 }
180 } 180 }
181 181
182 delete dependantPackages; 182 delete dependantPackages;
183 183
184 emit outputText( "Finished" ); 184 emit outputText( tr("Finished") );
185 emit outputText( "" ); 185 emit outputText( "" );
186} 186}
187 187
188void Ipkg :: removeStatusEntry() 188void Ipkg :: removeStatusEntry()
189{ 189{
190 QString statusFile = destDir; 190 QString statusFile = destDir;
191 if ( statusFile.right( 1 ) != "/" ) 191 if ( statusFile.right( 1 ) != "/" )
192 statusFile.append( "/" ); 192 statusFile.append( "/" );
193 statusFile.append( "usr/lib/ipkg/status" ); 193 statusFile.append( "usr/lib/ipkg/status" );
194 QString outStatusFile = statusFile; 194 QString outStatusFile = statusFile;
195 outStatusFile.append( ".tmp" ); 195 outStatusFile.append( ".tmp" );
196 196
197 emit outputText( "" ); 197 emit outputText( "" );
198 emit outputText( "Removing status entry..." ); 198 emit outputText( tr("Removing status entry...") );
199 QString tempstr = "status file - "; 199 QString tempstr = tr("status file - ");
200 tempstr.append( statusFile ); 200 tempstr.append( statusFile );
201 emit outputText( tempstr ); 201 emit outputText( tempstr );
202 tempstr = "package - "; 202 tempstr = tr("package - ");
203 tempstr.append( package ); 203 tempstr.append( package );
204 emit outputText( tempstr ); 204 emit outputText( tempstr );
205 205
206 ifstream in( statusFile ); 206 ifstream in( statusFile );
207 ofstream out( outStatusFile ); 207 ofstream out( outStatusFile );
208 if ( !in.is_open() ) 208 if ( !in.is_open() )
209 { 209 {
210 tempstr = "Couldn't open status file - "; 210 tempstr = tr("Couldn't open status file - ");
211 tempstr.append( statusFile ); 211 tempstr.append( statusFile );
212 emit outputText( tempstr ); 212 emit outputText( tempstr );
213 return; 213 return;
214 } 214 }
215 215
216 if ( !out.is_open() ) 216 if ( !out.is_open() )
217 { 217 {
218 tempstr = "Couldn't create tempory status file - "; 218 tempstr = tr("Couldn't create tempory status file - ");
219 tempstr.append( outStatusFile ); 219 tempstr.append( outStatusFile );
220 emit outputText( tempstr ); 220 emit outputText( tempstr );
221 return; 221 return;
222 } 222 }
223 223
224 char line[1001]; 224 char line[1001];
225 char k[21]; 225 char k[21];
226 char v[1001]; 226 char v[1001];
227 QString key; 227 QString key;
228 QString value; 228 QString value;
229 vector<QString> lines; 229 vector<QString> lines;
230 int i = 0; 230 int i = 0;
231 do 231 do
232 { 232 {
233 in.getline( line, 1000 ); 233 in.getline( line, 1000 );
234 if ( in.eof() ) 234 if ( in.eof() )
@@ -243,260 +243,194 @@ void Ipkg :: removeStatusEntry()
243 key = key.stripWhiteSpace(); 243 key = key.stripWhiteSpace();
244 value = value.stripWhiteSpace(); 244 value = value.stripWhiteSpace();
245 if ( key == "Package" && value == package ) 245 if ( key == "Package" && value == package )
246 { 246 {
247 // Ignore all lines up to next empty 247 // Ignore all lines up to next empty
248 do 248 do
249 { 249 {
250 in.getline( line, 1000 ); 250 in.getline( line, 1000 );
251 if ( in.eof() || QString( line ).stripWhiteSpace() == "" ) 251 if ( in.eof() || QString( line ).stripWhiteSpace() == "" )
252 continue; 252 continue;
253 } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" ); 253 } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" );
254 } 254 }
255 255
256 lines.push_back( QString( line ) ); 256 lines.push_back( QString( line ) );
257 out << line << endl; 257 out << line << endl;
258 258
259 // Improve UI responsiveness 259 // Improve UI responsiveness
260 i++; 260 i++;
261 if ( ( i % 50 ) == 0 ) 261 if ( ( i % 50 ) == 0 )
262 qApp->processEvents(); 262 qApp->processEvents();
263 } while ( !in.eof() ); 263 } while ( !in.eof() );
264 264
265 // Write lines out 265 // Write lines out
266 vector<QString>::iterator it; 266 vector<QString>::iterator it;
267 for ( it = lines.begin() ; it != lines.end() ; ++it ) 267 for ( it = lines.begin() ; it != lines.end() ; ++it )
268 { 268 {
269 out << (const char *)(*it) << endl; 269 out << (const char *)(*it) << endl;
270 270
271 // Improve UI responsiveness 271 // Improve UI responsiveness
272 i++; 272 i++;
273 if ( ( i % 50 ) == 0 ) 273 if ( ( i % 50 ) == 0 )
274 qApp->processEvents(); 274 qApp->processEvents();
275 } 275 }
276 276
277 in.close(); 277 in.close();
278 out.close(); 278 out.close();
279 279
280 // Remove old status file and put tmp stats file in its place 280 // Remove old status file and put tmp stats file in its place
281 remove( statusFile ); 281 remove( statusFile );
282 rename( outStatusFile, statusFile ); 282 rename( outStatusFile, statusFile );
283} 283}
284 284
285int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) 285int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
286{ 286{
287 // If one is already running - should never be but just to be safe 287 // If one is already running - should never be but just to be safe
288 if ( proc ) 288 if ( proc )
289 { 289 {
290 delete proc; 290 delete proc;
291 proc = 0; 291 proc = 0;
292 } 292 }
293 293
294 // OK we're gonna use OProcess to run this thing 294 // OK we're gonna use OProcess to run this thing
295 proc = new OProcess(); 295 proc = new OProcess();
296 aborted = false; 296 aborted = false;
297 297
298 298
299 // Connect up our slots 299 // Connect up our slots
300 connect(proc, SIGNAL(processExited(OProcess *)), 300 connect(proc, SIGNAL(processExited(OProcess *)),
301 this, SLOT( processFinished())); 301 this, SLOT( processFinished()));
302 302
303 connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)), 303 connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)),
304 this, SLOT(commandStdout(OProcess *, char *, int))); 304 this, SLOT(commandStdout(OProcess *, char *, int)));
305 305
306 connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)), 306 connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)),
307 this, SLOT(commandStderr(OProcess *, char *, int))); 307 this, SLOT(commandStderr(OProcess *, char *, int)));
308 308
309 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) 309 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it )
310 { 310 {
311 *proc << (*it).latin1(); 311 *proc << (*it).latin1();
312 } 312 }
313 313
314 // Start the process going 314 // Start the process going
315 finished = false; 315 finished = false;
316 if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) 316 if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
317 { 317 {
318 emit outputText( QString( "Couldn't start ipkg process" ) ); 318 emit outputText( tr("Couldn't start ipkg process" ) );
319 } 319 }
320} 320}
321 321
322void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) 322void Ipkg::commandStdout(OProcess*, char *buffer, int buflen)
323{ 323{
324 QString lineStr = buffer; 324 QString lineStr = buffer;
325 if ( lineStr[buflen-1] == '\n' ) 325 if ( lineStr[buflen-1] == '\n' )
326 buflen --; 326 buflen --;
327 lineStr = lineStr.left( buflen ); 327 lineStr = lineStr.left( buflen );
328 emit outputText( lineStr ); 328 emit outputText( lineStr );
329 329
330 // check if we are installing dependant packages 330 // check if we are installing dependant packages
331 if ( option == "install" || option == "reinstall" ) 331 if ( option == "install" || option == "reinstall" )
332 { 332 {
333 // Need to keep track of any dependant packages that get installed 333 // Need to keep track of any dependant packages that get installed
334 // so that we can create links to them as necessary 334 // so that we can create links to them as necessary
335 if ( lineStr.startsWith( "Installing " ) ) 335 if ( lineStr.startsWith( "Installing " ) )
336 { 336 {
337 int start = lineStr.find( " " ) + 1; 337 int start = lineStr.find( " " ) + 1;
338 int end = lineStr.find( " ", start ); 338 int end = lineStr.find( " ", start );
339 QString *package = new QString( lineStr.mid( start, end-start ) ); 339 QString *package = new QString( lineStr.mid( start, end-start ) );
340 dependantPackages->append( package ); 340 dependantPackages->append( package );
341 } 341 }
342 } 342 }
343 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && 343 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) &&
344 lineStr.find( "is depended upon by packages:" ) != -1 ) 344 lineStr.find( "is depended upon by packages:" ) != -1 )
345 { 345 {
346 // Ipkg should send this to STDERR, but doesn't - so trap here 346 // Ipkg should send this to STDERR, but doesn't - so trap here
347 error = true; 347 error = true;
348 } 348 }
349 349
350 buffer[0] = '\0'; 350 buffer[0] = '\0';
351} 351}
352 352
353void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) 353void Ipkg::commandStderr(OProcess*, char *buffer, int buflen)
354{ 354{
355 QString lineStr = buffer; 355 QString lineStr = buffer;
356 if ( lineStr[buflen-1] == '\n' ) 356 if ( lineStr[buflen-1] == '\n' )
357 buflen --; 357 buflen --;
358 lineStr=lineStr.left( buflen ); 358 lineStr=lineStr.left( buflen );
359 emit outputText( lineStr ); 359 emit outputText( lineStr );
360 buffer[0] = '\0'; 360 buffer[0] = '\0';
361 error = true; 361 error = true;
362} 362}
363 363
364void Ipkg::processFinished() 364void Ipkg::processFinished()
365{ 365{
366 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file 366 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file
367 // to workaround an ipkg bug which stops reinstall to a different location 367 // to workaround an ipkg bug which stops reinstall to a different location
368 368
369 if ( !error && option == "remove" ) 369 if ( !error && option == "remove" )
370 removeStatusEntry(); 370 removeStatusEntry();
371 371
372 delete proc; 372 delete proc;
373 proc = 0; 373 proc = 0;
374 finished = true; 374 finished = true;
375 375
376 emit ipkgFinished(); 376 emit ipkgFinished();
377} 377}
378 378
379 379
380void Ipkg :: abort() 380void Ipkg :: abort()
381{ 381{
382 if ( proc ) 382 if ( proc )
383 { 383 {
384 proc->kill(); 384 proc->kill();
385 aborted = true; 385 aborted = true;
386 } 386 }
387} 387}
388 388
389/*
390int Ipkg :: executeIpkgCommand( QString &cmd, const QString option )
391{
392 FILE *fp = NULL;
393 char line[130];
394 QString lineStr, lineStrOld;
395 int ret = false;
396
397 fp = popen( (const char *) cmd, "r");
398 if ( fp == NULL )
399 {
400 QString text;
401 text.sprintf( "Couldn't execute %s! See stdout for error code", (const char *)cmd );
402 emit outputText( text );
403 }
404 else
405 {
406 while ( fgets( line, sizeof line, fp) != NULL )
407 {
408 lineStr = line;
409 lineStr=lineStr.left( lineStr.length()-1 );
410
411 if ( lineStr != lineStrOld )
412 {
413 //See if we're finished
414 if ( option == "install" || option == "reinstall" )
415 {
416 // Need to keep track of any dependant packages that get installed
417 // so that we can create links to them as necessary
418 if ( lineStr.startsWith( "Installing " ) )
419 {
420 int start = lineStr.find( " " ) + 1;
421 int end = lineStr.find( " ", start );
422 QString *package = new QString( lineStr.mid( start, end-start ) );
423 dependantPackages->append( package );
424 }
425 }
426
427 if ( option == "update" )
428 {
429 if (lineStr.contains("Updated list"))
430 ret = true;
431 }
432 else if ( option == "download" )
433 {
434 if (lineStr.contains("Downloaded"))
435 ret = true;
436 }
437 else
438 {
439 if (lineStr.contains("Done"))
440 ret = true;
441 }
442
443 emit outputText( lineStr );
444 }
445 lineStrOld = lineStr;
446 qApp->processEvents();
447 }
448 pclose(fp);
449 }
450
451 return ret;
452}
453*/
454
455void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) 389void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
456{ 390{
457 if ( dest == "root" || dest == "/" ) 391 if ( dest == "root" || dest == "/" )
458 return; 392 return;
459 393
460 qApp->processEvents(); 394 qApp->processEvents();
461 QStringList *fileList = getList( packFileName, destDir ); 395 QStringList *fileList = getList( packFileName, destDir );
462 qApp->processEvents(); 396 qApp->processEvents();
463 processFileList( fileList, destDir ); 397 processFileList( fileList, destDir );
464 delete fileList; 398 delete fileList;
465} 399}
466 400
467QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) 401QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
468{ 402{
469 QString packageFileDir = destDir; 403 QString packageFileDir = destDir;
470 packageFileDir.append( "/usr/lib/ipkg/info/" ); 404 packageFileDir.append( "/usr/lib/ipkg/info/" );
471 packageFileDir.append( packageFilename ); 405 packageFileDir.append( packageFilename );
472 packageFileDir.append( ".list" ); 406 packageFileDir.append( ".list" );
473 QFile f( packageFileDir ); 407 QFile f( packageFileDir );
474 408
475 if ( !f.open(IO_ReadOnly) ) 409 if ( !f.open(IO_ReadOnly) )
476 { 410 {
477 // Couldn't open from dest, try from / 411 // Couldn't open from dest, try from /
478 f.close(); 412 f.close();
479 413
480 packageFileDir = "/usr/lib/ipkg/info/"; 414 packageFileDir = "/usr/lib/ipkg/info/";
481 packageFileDir.append( packageFilename ); 415 packageFileDir.append( packageFilename );
482 packageFileDir.append( ".list" ); 416 packageFileDir.append( ".list" );
483 f.setName( packageFileDir ); 417 f.setName( packageFileDir );
484 if ( ! f.open(IO_ReadOnly) ) 418 if ( ! f.open(IO_ReadOnly) )
485 { 419 {
486 QString tempstr = "Could not open :"; 420 QString tempstr = tr("Could not open :");
487 tempstr.append( packageFileDir ); 421 tempstr.append( packageFileDir );
488 emit outputText( tempstr ); 422 emit outputText( tempstr );
489 return (QStringList*)0; 423 return (QStringList*)0;
490 } 424 }
491 } 425 }
492 QStringList *fileList = new QStringList(); 426 QStringList *fileList = new QStringList();
493 QTextStream t( &f ); 427 QTextStream t( &f );
494 while ( !t.eof() ) 428 while ( !t.eof() )
495 *fileList += t.readLine(); 429 *fileList += t.readLine();
496 430
497 f.close(); 431 f.close();
498 return fileList; 432 return fileList;
499} 433}
500 434
501void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) 435void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir )
502{ 436{
@@ -515,84 +449,81 @@ void Ipkg :: processFileList( const QStringList *fileList, const QString &destDi
515 } 449 }
516 else 450 else
517 { 451 {
518 for ( int i = fileList->count()-1; i >= 0 ; i-- ) 452 for ( int i = fileList->count()-1; i >= 0 ; i-- )
519 { 453 {
520 processLinkDir( (*fileList)[i], baseDir, destDir ); 454 processLinkDir( (*fileList)[i], baseDir, destDir );
521 qApp->processEvents(); 455 qApp->processEvents();
522 } 456 }
523 } 457 }
524} 458}
525 459
526void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) 460void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir )
527{ 461{
528 462
529 QString sourceFile = baseDir; 463 QString sourceFile = baseDir;
530 sourceFile.append( file ); 464 sourceFile.append( file );
531 465
532 QString linkFile = destDir; 466 QString linkFile = destDir;
533 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" ) 467 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" )
534 { 468 {
535 linkFile.append( file.mid( 1 ) ); 469 linkFile.append( file.mid( 1 ) );
536 } 470 }
537 else 471 else
538 { 472 {
539 linkFile.append( file ); 473 linkFile.append( file );
540 } 474 }
541 QString text; 475 QString text;
542 if ( createLinks ) 476 if ( createLinks )
543 { 477 {
544 // If this file is a directory (ends with a /) and it doesn't exist, 478 // If this file is a directory (ends with a /) and it doesn't exist,
545 // we need to create it 479 // we need to create it
546 if ( file.right(1) == "/" ) 480 if ( file.right(1) == "/" )
547 { 481 {
548 QFileInfo f( linkFile ); 482 QFileInfo f( linkFile );
549 if ( !f.exists() ) 483 if ( !f.exists() )
550 { 484 {
551 QString tempstr = "Creating directory "; 485 QString tempstr = tr("Creating directory ");
552 tempstr.append( linkFile ); 486 tempstr.append( linkFile );
553 emit outputText( tempstr ); 487 emit outputText( tempstr );
554 QDir d; 488 QDir d;
555 d.mkdir( linkFile, true ); 489 d.mkdir( linkFile, true );
556 } 490 }
557// else 491// else
558// emit outputText( QString( "Directory " ) + linkFile + " already exists" ); 492// emit outputText( QString( "Directory " ) + linkFile + " already exists" );
559 493
560 } 494 }
561 else 495 else
562 { 496 {
563 int rc = symlink( sourceFile, linkFile ); 497 int rc = symlink( sourceFile, linkFile );
564 text = (rc == 0 ? "Linked " : "Failed to link "); 498 text = ( rc == 0 ? tr( "Linked %1 to %2" ) : tr( "Failed to link %1 to %2" ) ).
565 text.append( sourceFile ); 499 arg( sourceFile ).
566 text.append( " to " ); 500 arg( linkFile );
567 text.append( linkFile );
568 emit outputText( text ); 501 emit outputText( text );
569 } 502 }
570 } 503 }
571 else 504 else
572 { 505 {
573 QFileInfo f( linkFile ); 506 QFileInfo f( linkFile );
574 if ( f.exists() ) 507 if ( f.exists() )
575 { 508 {
576 if ( f.isFile() ) 509 if ( f.isFile() )
577 { 510 {
578 QFile f( linkFile ); 511 QFile f( linkFile );
579 bool rc = f.remove(); 512 bool rc = f.remove();
580 513
581 text = (rc ? "Removed " : "Failed to remove "); 514 text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile );
582 text.append( linkFile );
583 emit outputText( text ); 515 emit outputText( text );
584 } 516 }
585 else if ( f.isDir() ) 517 else if ( f.isDir() )
586 { 518 {
587 QDir d; 519 QDir d;
588 bool rc = d.rmdir( linkFile, true ); 520 bool rc = d.rmdir( linkFile, true );
589 if ( rc ) 521 if ( rc )
590 { 522 {
591 text = (rc ? "Removed " : "Failed to remove "); 523 text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile );
592 text.append( linkFile );
593 emit outputText( text ); 524 emit outputText( text );
594 } 525 }
595 } 526 }
596 } 527 }
597 } 528 }
598} 529}
diff --git a/noncore/settings/aqpkg/main.cpp b/noncore/settings/aqpkg/main.cpp
index 066d79f..b7f8b7b 100644
--- a/noncore/settings/aqpkg/main.cpp
+++ b/noncore/settings/aqpkg/main.cpp
@@ -1,19 +1,19 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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.
@@ -29,43 +29,50 @@
29 29
30#ifdef QWS 30#ifdef QWS
31#include <qpe/qpeapplication.h> 31#include <qpe/qpeapplication.h>
32#include <qpe/qcopenvelope_qws.h> 32#include <qpe/qcopenvelope_qws.h>
33#else 33#else
34#include <qapplication.h> 34#include <qapplication.h>
35#endif 35#endif
36 36
37#include <qobjectdefs.h> 37#include <qobjectdefs.h>
38 38
39#include "mainwin.h" 39#include "mainwin.h"
40#include "server.h" 40#include "server.h"
41 41
42#include "global.h" 42#include "global.h"
43 43
44 44
45/* be less intrusive for translation -zecke */
46extern QString LOCAL_SERVER;
47extern QString LOCAL_IPKGS;
48
45int main(int argc, char *argv[]) 49int main(int argc, char *argv[])
46{ 50{
47#ifdef QWS 51#ifdef QWS
48 QPEApplication a( argc, argv ); 52 QPEApplication a( argc, argv );
49#else 53#else
50 QApplication a( argc, argv ); 54 QApplication a( argc, argv );
51#endif 55#endif
52 56
53#ifdef QWS 57#ifdef QWS
54 // Disable suspend mode 58 // Disable suspend mode
55 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend; 59 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::DisableSuspend;
56#endif 60#endif
57 61
62 LOCAL_SERVER = QObject::tr( "Installed packages" );
63 LOCAL_IPKGS = QObject::tr( "Local packages" );
64
58 MainWindow *win = new MainWindow(); 65 MainWindow *win = new MainWindow();
59 a.setMainWidget(win); 66 a.setMainWidget(win);
60 win->showMaximized(); 67 win->showMaximized();
61 68
62 a.exec(); 69 a.exec();
63 70
64#ifdef QWS 71#ifdef QWS
65 // Reenable suspend mode 72 // Reenable suspend mode
66 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 73 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
67#endif 74#endif
68 #ifdef _DEBUG 75 #ifdef _DEBUG
69 DumpUnfreed(); 76 DumpUnfreed();
70 #endif 77 #endif
71} 78}
diff --git a/noncore/settings/aqpkg/mainwin.cpp b/noncore/settings/aqpkg/mainwin.cpp
index 0efa1e0..45a6663 100644
--- a/noncore/settings/aqpkg/mainwin.cpp
+++ b/noncore/settings/aqpkg/mainwin.cpp
@@ -1041,51 +1041,49 @@ InstallData *MainWindow :: dealWithItem( QCheckListItem *item )
1041 { 1041 {
1042 // Version available is older - remove only 1042 // Version available is older - remove only
1043 newitem->option = "D"; 1043 newitem->option = "D";
1044 } 1044 }
1045 else 1045 else
1046 { 1046 {
1047 QString caption; 1047 QString caption;
1048 QString text; 1048 QString text;
1049 QString secondButton; 1049 QString secondButton;
1050 QString secondOption; 1050 QString secondOption;
1051 if ( val == 0 ) 1051 if ( val == 0 )
1052 { 1052 {
1053 // Version available is the same - option to remove or reinstall 1053 // Version available is the same - option to remove or reinstall
1054 caption = tr( "Do you wish to remove or reinstall\n%1?" ); 1054 caption = tr( "Do you wish to remove or reinstall\n%1?" );
1055 text = tr( "Remove or ReInstall" ); 1055 text = tr( "Remove or ReInstall" );
1056 secondButton = tr( "ReInstall" ); 1056 secondButton = tr( "ReInstall" );
1057 secondOption = tr( "R" ); 1057 secondOption = "R"; // Internal action code, do not translate
1058 } 1058 }
1059 else if ( val == 1 ) 1059 else if ( val == 1 )
1060 { 1060 {
1061 // Version available is newer - option to remove or upgrade 1061 // Version available is newer - option to remove or upgrade
1062 caption = tr( "Do you wish to remove or upgrade\n%1?" ); 1062 caption = tr( "Do you wish to remove or upgrade\n%1?" );
1063 text = tr( "Remove or Upgrade" ); 1063 text = tr( "Remove or Upgrade" );
1064 secondButton = tr( "Upgrade" ); 1064 secondButton = tr( "Upgrade" );
1065 secondOption = tr( "U" ); 1065 secondOption = "U"; // Internal action code, do not translate
1066 } 1066 }
1067 1067
1068 // Sticky option not implemented yet, but will eventually allow 1068 // Sticky option not implemented yet, but will eventually allow
1069 // the user to say something like 'remove all' 1069 // the user to say something like 'remove all'
1070 if ( stickyOption == "" ) 1070 if ( stickyOption == "" )
1071 { 1071 {
1072 QString msgtext; 1072 QString msgtext;
1073 msgtext = caption.arg( ( const char * )name ); 1073 msgtext = caption.arg( ( const char * )name );
1074// switch( QMessageBox::information( this, text,
1075// msgtext, tr( "Remove" ), secondButton ) )
1076 QuestionDlg dlg( text, msgtext, secondButton ); 1074 QuestionDlg dlg( text, msgtext, secondButton );
1077 switch( dlg.exec() ) 1075 switch( dlg.exec() )
1078 { 1076 {
1079 case 0: // Cancel 1077 case 0: // Cancel
1080 delete newitem; 1078 delete newitem;
1081 return 0x0; 1079 return 0x0;
1082 break; 1080 break;
1083 case 1: // Remove 1081 case 1: // Remove
1084 newitem->option = "D"; 1082 newitem->option = "D";
1085 break; 1083 break;
1086 case 2: // Reinstall or Upgrade 1084 case 2: // Reinstall or Upgrade
1087 newitem->option = secondOption; 1085 newitem->option = secondOption;
1088 break; 1086 break;
1089 } 1087 }
1090 } 1088 }
1091 else 1089 else
diff --git a/noncore/settings/aqpkg/mem.cpp b/noncore/settings/aqpkg/mem.cpp
index 5f32a26..4c6117b 100644
--- a/noncore/settings/aqpkg/mem.cpp
+++ b/noncore/settings/aqpkg/mem.cpp
@@ -86,25 +86,25 @@ void RemoveTrack(long addr)
86 for(i = allocList.begin(); i != allocList.end(); i++) 86 for(i = allocList.begin(); i != allocList.end(); i++)
87 { 87 {
88 if((*i)->address == addr) 88 if((*i)->address == addr)
89 { 89 {
90 allocList.remove((*i)); 90 allocList.remove((*i));
91 found = true; 91 found = true;
92 break; 92 break;
93 } 93 }
94 } 94 }
95} 95}
96 96
97void DumpUnfreed() 97void DumpUnfreed()
98{ 98{
99 AllocList::iterator i; 99 AllocList::iterator i;
100 long totalSize = 0; 100 long totalSize = 0;
101 char buf[1024]; 101 char buf[1024];
102 102 // Debug output, okay to leave untranslated
103 for(i = allocList.begin(); i != allocList.end(); i++) { 103 for(i = allocList.begin(); i != allocList.end(); i++) {
104 sprintf(buf, "%-15s: LINE %ld, ADDRESS %ld %ld unfreed", 104 sprintf(buf, "%-15s: LINE %ld, ADDRESS %ld %ld unfreed",
105 (*i)->file, (*i)->line, (*i)->address, (*i)->size); 105 (*i)->file, (*i)->line, (*i)->address, (*i)->size);
106 totalSize += (*i)->size; 106 totalSize += (*i)->size;
107 } 107 }
108 sprintf(buf, "-----------------------------------------------------------\n"); 108 sprintf(buf, "-----------------------------------------------------------\n");
109 sprintf(buf, "Total Unfreed: %ld bytes\n", totalSize); 109 sprintf(buf, "Total Unfreed: %ld bytes\n", totalSize);
110}; 110};
diff --git a/noncore/settings/aqpkg/package.cpp b/noncore/settings/aqpkg/package.cpp
index 4c27c65..adda832 100644
--- a/noncore/settings/aqpkg/package.cpp
+++ b/noncore/settings/aqpkg/package.cpp
@@ -1,106 +1,111 @@
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) 2002 Andy Qua <andy.qua@blueyonder.co.uk> 4 =. Copyright (c) 2002 Andy Qua <andy.qua@blueyonder.co.uk>
5             .=l. Dan Williams <drw@handhelds.org> 5             .=l. Dan Williams <drw@handhelds.org>
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 "package.h" 30#include "package.h"
31#include "global.h" 31#include "global.h"
32 32
33#include <qobject.h>
34
33Package::Package( QString &name ) 35Package::Package( QString &name )
34{ 36{
35 packageName = name; 37 packageName = name;
36 38
37 version = "N/A"; 39 QString tempstr = QObject::tr( "N/A" );
38 description = "N/A"; 40 version = tempstr;
39 packageSize = "N/A"; 41 description = tempstr;
40 section = "N/A"; 42 packageSize = tempstr;
41 43 section = tempstr;
44
42 localPackage = 0; 45 localPackage = 0;
43 installed = false; 46 installed = false;
44 packageStoredLocally = false; 47 packageStoredLocally = false;
45 installedToRoot = false; 48 installedToRoot = false;
46 installed = false; 49 installed = false;
47 installedTo = 0; 50 installedTo = 0;
48} 51}
49 52
50Package::Package( char *name ) 53Package::Package( char *name )
51{ 54{
52 packageName = name; 55 packageName = name;
53 56
54 version = "N/A"; 57 QString tempstr = QObject::tr( "N/A" );
55 description = "N/A"; 58 version = tempstr;
56 packageSize = "N/A"; 59 description = tempstr;
57 section = "N/A"; 60 packageSize = tempstr;
58 61 section = tempstr;
62
59 localPackage = 0; 63 localPackage = 0;
60 installed = false; 64 installed = false;
61 packageStoredLocally = false; 65 packageStoredLocally = false;
62 installedToRoot = false; 66 installedToRoot = false;
63 installed = false; 67 installed = false;
64 installedTo = 0; 68 installedTo = 0;
65 differentVersionAvailable = false; 69 differentVersionAvailable = false;
66} 70}
67 71
68Package::~Package() 72Package::~Package()
69{ 73{
70} 74}
71 75
72QString Package :: toString() 76QString Package :: toString()
73{ 77{
74 QString ret = "Package - " + getPackageName() + 78 QString ret = QObject::tr( "Package - %1\n version - %2" ).
75 "\n version - " + getVersion(); 79 arg( getPackageName() ).
80 arg( getVersion() );
76 81
77 if ( localPackage ) 82 if ( localPackage )
78 ret += "\n inst version - " + localPackage->getVersion(); 83 ret.append( QObject::tr( "\n inst version - %1" ).arg( localPackage->getVersion() ) );
79 84
80 85
81 return ret; 86 return ret;
82} 87}
83 88
84void Package :: setStatus( const QString &s ) 89void Package :: setStatus( const QString &s )
85{ 90{
86 QString state_status; 91 QString state_status;
87 int two, three; 92 int two, three;
88 93
89 status = s.simplifyWhiteSpace( ); 94 status = s.simplifyWhiteSpace( );
90 95
91 two = status.find( " " ); // find second column 96 two = status.find( " " ); // find second column
92 three = status.find( " ", two + 1 ); // find third column 97 three = status.find( " ", two + 1 ); // find third column
93 98
94 state_status = status.mid( three ).stripWhiteSpace( ); 99 state_status = status.mid( three ).stripWhiteSpace( );
95 100
96 if ( state_status == "installed" ) 101 if ( state_status == "installed" )
97 installed = true; 102 installed = true;
98} 103}
99 104
100void Package :: setLocalPackage( Package *p ) 105void Package :: setLocalPackage( Package *p )
101{ 106{
102 localPackage = p; 107 localPackage = p;
103 108
104 if ( localPackage ) 109 if ( localPackage )
105 if ( localPackage->getVersion() < getVersion() && !installed ) 110 if ( localPackage->getVersion() < getVersion() && !installed )
106 differentVersionAvailable = true; 111 differentVersionAvailable = true;
diff --git a/noncore/settings/aqpkg/version.cpp b/noncore/settings/aqpkg/version.cpp
index e836da1..59e6f3f 100644
--- a/noncore/settings/aqpkg/version.cpp
+++ b/noncore/settings/aqpkg/version.cpp
@@ -10,205 +10,210 @@
10 * or (at your option) any later version. 10 * or (at your option) any later version.
11 * 11 *
12 * This is distributed in the hope that it will be useful, but 12 * This is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details. 15 * GNU General Public License for more details.
16 * 16 *
17 * You should have received a copy of the GNU General Public 17 * You should have received a copy of the GNU General Public
18 * License along with dpkg; if not, write to the Free Software 18 * License along with dpkg; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */ 20 */
21#include <stdio.h> 21#include <stdio.h>
22#include <stdlib.h> 22#include <stdlib.h>
23#include <ctype.h> 23#include <ctype.h>
24#include <string.h> 24#include <string.h>
25 25
26# define _(Text) Text 26#include <qobject.h>
27
28//# define _(Text) Text
27 29
28class versionrevision 30class versionrevision
29{ 31{
30public: 32public:
31 versionrevision() 33 versionrevision()
32 { 34 {
33 version = 0; 35 version = 0;
34 } 36 }
35 37
36 ~versionrevision() 38 ~versionrevision()
37 { 39 {
38 if ( version ) 40 if ( version )
39 delete version; 41 delete version;
40 } 42 }
41 43
42 void setVersion( const char *str ) 44 void setVersion( const char *str )
43 { 45 {
44 version = new char[(strlen(str)+1)]; 46 version = new char[(strlen(str)+1)];
45 strcpy( version, str ); 47 strcpy( version, str );
46 } 48 }
47 49
48 unsigned long epoch; 50 unsigned long epoch;
49 char *version; 51 char *version;
50 const char *revision; 52 const char *revision;
51 const char *familiar_revision; 53 const char *familiar_revision;
52}; 54};
53 55
54static int verrevcmp(const char *val, const char *ref) 56static int verrevcmp(const char *val, const char *ref)
55{ 57{
56 int vc, rc; 58 int vc, rc;
57 long vl, rl; 59 long vl, rl;
58 const char *vp, *rp; 60 const char *vp, *rp;
59 61
60 if (!val) val= ""; 62 if (!val) val= "";
61 if (!ref) ref= ""; 63 if (!ref) ref= "";
62 for (;;) { 64 for (;;) {
63 vp= val; while (*vp && !isdigit(*vp)) vp++; 65 vp= val; while (*vp && !isdigit(*vp)) vp++;
64 rp= ref; while (*rp && !isdigit(*rp)) rp++; 66 rp= ref; while (*rp && !isdigit(*rp)) rp++;
65 for (;;) { 67 for (;;) {
66 vc= val == vp ? 0 : *val++; 68 vc= val == vp ? 0 : *val++;
67 rc= ref == rp ? 0 : *ref++; 69 rc= ref == rp ? 0 : *ref++;
68 if (!rc && !vc) break; 70 if (!rc && !vc) break;
69 if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */ 71 if (vc && !isalpha(vc)) vc += 256; /* assumes ASCII character set */
70 if (rc && !isalpha(rc)) rc += 256; 72 if (rc && !isalpha(rc)) rc += 256;
71 if (vc != rc) return vc - rc; 73 if (vc != rc) return vc - rc;
72 } 74 }
73 val= vp; 75 val= vp;
74 ref= rp; 76 ref= rp;
75 vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10); 77 vl=0; if (isdigit(*vp)) vl= strtol(val,(char**)&val,10);
76 rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10); 78 rl=0; if (isdigit(*rp)) rl= strtol(ref,(char**)&ref,10);
77 if (vl != rl) return vl - rl; 79 if (vl != rl) return vl - rl;
78 if (!*val && !*ref) return 0; 80 if (!*val && !*ref) return 0;
79 if (!*val) return -1; 81 if (!*val) return -1;
80 if (!*ref) return +1; 82 if (!*ref) return +1;
81 } 83 }
82} 84}
83 85
84int versioncompare(const struct versionrevision *version, 86int versioncompare(const struct versionrevision *version,
85 const struct versionrevision *refversion) 87 const struct versionrevision *refversion)
86{ 88{
87 int r; 89 int r;
88 90
89 if (version->epoch > refversion->epoch) return 1; 91 if (version->epoch > refversion->epoch) return 1;
90 if (version->epoch < refversion->epoch) return -1; 92 if (version->epoch < refversion->epoch) return -1;
91 r= verrevcmp(version->version,refversion->version); if (r) return r; 93 r= verrevcmp(version->version,refversion->version); if (r) return r;
92 r= verrevcmp(version->revision,refversion->revision); if (r) return r; 94 r= verrevcmp(version->revision,refversion->revision); if (r) return r;
93 return verrevcmp(version->familiar_revision,refversion->familiar_revision); 95 return verrevcmp(version->familiar_revision,refversion->familiar_revision);
94} 96}
95 97
96int versionsatisfied3(const struct versionrevision *it, 98int versionsatisfied3(const struct versionrevision *it,
97 const struct versionrevision *ref, 99 const struct versionrevision *ref,
98 const char *op) 100 const char *op)
99{ 101{
100 int r; 102 int r;
101 r= versioncompare(it,ref); 103 r= versioncompare(it,ref);
102 if (strcmp(op, "<=") == 0 || strcmp(op, "<") == 0) 104 if (strcmp(op, "<=") == 0 || strcmp(op, "<") == 0)
103 return r <= 0; 105 return r <= 0;
104 if (strcmp(op, ">=") == 0 || strcmp(op, ">") == 0) 106 if (strcmp(op, ">=") == 0 || strcmp(op, ">") == 0)
105 return r >= 0; 107 return r >= 0;
106 if (strcmp(op, "<<") == 0) 108 if (strcmp(op, "<<") == 0)
107 return r < 0; 109 return r < 0;
108 if (strcmp(op, ">>") == 0) 110 if (strcmp(op, ">>") == 0)
109 return r > 0; 111 return r > 0;
110 if (strcmp(op, "=") == 0) 112 if (strcmp(op, "=") == 0)
111 return r == 0; 113 return r == 0;
112 fprintf(stderr, "unknown operator: %s", op); 114// fprintf(stderr, "unknown operator: %s", op);
113 115
114 exit(1); 116 exit(1);
115} 117}
116 118
117const char *parseversion(struct versionrevision *rversion, const char *string) 119const char *parseversion(struct versionrevision *rversion, const char *string)
118{ 120{
119 char *hyphen, *colon, *eepochcolon; 121 char *hyphen, *colon, *eepochcolon;
120 unsigned long epoch; 122 unsigned long epoch;
121 123
122 if (!*string) return _("version string is empty"); 124 if ( !*string )
123 125 return QObject::tr( "Version string is empty." );
126
124 colon= strchr(string,':'); 127 colon= strchr(string,':');
125 if (colon) { 128 if (colon) {
126 epoch= strtoul(string,&eepochcolon,10); 129 epoch= strtoul(string,&eepochcolon,10);
127 if (colon != eepochcolon) return _("epoch in version is not number"); 130 if ( colon != eepochcolon )
128 if (!*++colon) return _("nothing after colon in version number"); 131 return QObject::tr( "Epoch in version is not number." );
132 if ( !*++colon )
133 return QObject::tr( "Nothing after colon in version number." );
129 string= colon; 134 string= colon;
130 rversion->epoch= epoch; 135 rversion->epoch= epoch;
131 } else { 136 } else {
132 rversion->epoch= 0; 137 rversion->epoch= 0;
133 } 138 }
134 139
135 rversion->revision = ""; 140 rversion->revision = "";
136 rversion->familiar_revision = ""; 141 rversion->familiar_revision = "";
137 142
138 rversion->setVersion( string ); 143 rversion->setVersion( string );
139 hyphen= strrchr(rversion->version,'-'); 144 hyphen= strrchr(rversion->version,'-');
140 if (hyphen) { 145 if (hyphen) {
141 *hyphen++= 0; 146 *hyphen++= 0;
142 if (strncmp("fam", hyphen, 3) == 0) { 147 if (strncmp("fam", hyphen, 3) == 0) {
143 rversion->familiar_revision=hyphen+3; 148 rversion->familiar_revision=hyphen+3;
144 hyphen= strrchr(rversion->version,'-'); 149 hyphen= strrchr(rversion->version,'-');
145 if (hyphen) { 150 if (hyphen) {
146 *hyphen++= 0; 151 *hyphen++= 0;
147 rversion->revision = hyphen; 152 rversion->revision = hyphen;
148 } 153 }
149 } else { 154 } else {
150 rversion->revision = hyphen; 155 rversion->revision = hyphen;
151 } 156 }
152 } 157 }
153/* 158/*
154 fprintf(stderr,"Parsed version: %lu, %s, %s, %s\n", 159 fprintf(stderr,"Parsed version: %lu, %s, %s, %s\n",
155 rversion->epoch, 160 rversion->epoch,
156 rversion->version, 161 rversion->version,
157 rversion->revision, 162 rversion->revision,
158 rversion->familiar_revision); 163 rversion->familiar_revision);
159*/ 164*/
160 return 0; 165 return 0;
161} 166}
162 167
163int compareVersions( const char *v1, const char *v2 ) 168int compareVersions( const char *v1, const char *v2 )
164{ 169{
165 const char *err; 170 const char *err;
166 versionrevision ver, ref; 171 versionrevision ver, ref;
167 172
168 err = parseversion(&ref, v1); 173 err = parseversion(&ref, v1);
169 if (err) { 174 if (err) {
170 fprintf(stderr, "Invalid version `%s': %s\n", v2, err); 175// fprintf(stderr, "Invalid version `%s': %s\n", v2, err);
171 return -2; 176 return -2;
172 } 177 }
173 178
174 err = parseversion(&ver, v2); 179 err = parseversion(&ver, v2);
175 if (err) { 180 if (err) {
176 fprintf(stderr, "Invalid version `%s': %s\n", v1, err); 181// fprintf(stderr, "Invalid version `%s': %s\n", v1, err);
177 return -2; 182 return -2;
178 } 183 }
179 184
180 if ( versionsatisfied3( &ver, &ref, "=" ) ) 185 if ( versionsatisfied3( &ver, &ref, "=" ) )
181 return 0; 186 return 0;
182 else if ( versionsatisfied3( &ver, &ref, "<" ) ) 187 else if ( versionsatisfied3( &ver, &ref, "<" ) )
183 return -1; 188 return -1;
184 else 189 else
185 return 1; 190 return 1;
186} 191}
187 192
188/* 193/*
189int main(int argc, char *argv[]) 194int main(int argc, char *argv[])
190{ 195{
191 const char *err; 196 const char *err;
192 versionrevision ver, ref; 197 versionrevision ver, ref;
193 198
194 if (argc < 4) { 199 if (argc < 4) {
195 fprintf(stderr, "usage: %s: version op refversion\n", argv[0]); 200 fprintf(stderr, "usage: %s: version op refversion\n", argv[0]);
196 return 2; 201 return 2;
197 } 202 }
198 203
199 err = parseversion(&ver, argv[1]); 204 err = parseversion(&ver, argv[1]);
200 if (err) { 205 if (err) {
201 fprintf(stderr, "Invalid version `%s': %s\n", argv[1], err); 206 fprintf(stderr, "Invalid version `%s': %s\n", argv[1], err);
202 return 2; 207 return 2;
203 } 208 }
204 209
205 err = parseversion(&ref, argv[3]); 210 err = parseversion(&ref, argv[3]);
206 if (err) { 211 if (err) {
207 fprintf(stderr, "Invalid version `%s': %s\n", argv[3], err); 212 fprintf(stderr, "Invalid version `%s': %s\n", argv[3], err);
208 return 2; 213 return 2;
209 } 214 }
210 215
211 printf( "Result: %d\n", versionsatisfied3(&ver, &ref, argv[2]) ); 216 printf( "Result: %d\n", versionsatisfied3(&ver, &ref, argv[2]) );
212} 217}
213 218
214*/ 219*/