summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp5
1 files changed, 5 insertions, 0 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp
index 17efda9..dd9e78d 100644
--- a/noncore/settings/aqpkg/ipkg.cpp
+++ b/noncore/settings/aqpkg/ipkg.cpp
@@ -1,606 +1,611 @@
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 <opie2/oprocess.h> 30#include <opie2/oprocess.h>
31 31
32#ifdef QWS 32#ifdef QWS
33#include <qpe/qpeapplication.h> 33#include <qpe/qpeapplication.h>
34#else 34#else
35#include <qapplication.h> 35#include <qapplication.h>
36#endif 36#endif
37#include <qdir.h> 37#include <qdir.h>
38#include <qfile.h> 38#include <qfile.h>
39#include <qtextstream.h> 39#include <qtextstream.h>
40 40
41#include "utils.h" 41#include "utils.h"
42#include "ipkg.h" 42#include "ipkg.h"
43#include "global.h" 43#include "global.h"
44 44
45using namespace Opie::Core; 45using namespace Opie::Core;
46Ipkg :: Ipkg() 46Ipkg :: Ipkg()
47{ 47{
48 proc = 0; 48 proc = 0;
49} 49}
50 50
51Ipkg :: ~Ipkg() 51Ipkg :: ~Ipkg()
52{ 52{
53} 53}
54 54
55// Option is what we are going to do - install, upgrade, download, reinstall 55// Option is what we are going to do - install, upgrade, download, reinstall
56// package is the package name to install - either a fully qualified path and ipk 56// package is the package name to install - either a fully qualified path and ipk
57// file (if stored locally) or just the name of the package (for a network package) 57// file (if stored locally) or just the name of the package (for a network package)
58// packageName is the package name - (for a network package this will be the same as 58// packageName is the package name - (for a network package this will be the same as
59// package parameter) 59// package parameter)
60// dest is the destination alias (from ipk.conf) 60// dest is the destination alias (from ipk.conf)
61// destDir is the dir that the destination alias points to (used to link to root) 61// destDir is the dir that the destination alias points to (used to link to root)
62// flags is the ipkg options flags 62// flags is the ipkg options flags
63// dir is the directory to run ipkg in (defaults to "") 63// dir is the directory to run ipkg in (defaults to "")
64void Ipkg :: runIpkg() 64void Ipkg :: runIpkg()
65{ 65{
66 error = false; 66 error = false;
67 QStringList commands; 67 QStringList commands;
68 68
69 QDir::setCurrent( "/tmp" ); 69 QDir::setCurrent( "/tmp" );
70 70
71 if ( runtimeDir != "" ) 71 if ( runtimeDir != "" )
72 { 72 {
73 commands << "cd "; 73 commands << "cd ";
74 commands << runtimeDir; 74 commands << runtimeDir;
75 commands << ";"; 75 commands << ";";
76 } 76 }
77 commands << "ipkg" << "-V" << QString::number( infoLevel ) << "-force-defaults"; 77 commands << "ipkg" << "-V" << QString::number( infoLevel ) << "-force-defaults";
78 78
79 // only set the destination for an install operation 79 // only set the destination for an install operation
80 if ( option == "install" ) 80 if ( option == "install" )
81 commands << "-dest" << destination; 81 commands << "-dest" << destination;
82 82
83 83
84 if ( option != "update" && option != "download" ) 84 if ( option != "update" && option != "download" )
85 { 85 {
86 if ( flags & FORCE_DEPENDS ) 86 if ( flags & FORCE_DEPENDS )
87 commands << "-force-depends"; 87 commands << "-force-depends";
88 if ( flags & FORCE_REINSTALL ) 88 if ( flags & FORCE_REINSTALL )
89 commands << "-force-reinstall"; 89 commands << "-force-reinstall";
90 if ( flags & FORCE_REMOVE ) 90 if ( flags & FORCE_REMOVE )
91 commands << "-force-removal-of-essential-packages"; 91 commands << "-force-removal-of-essential-packages";
92 if ( flags & FORCE_OVERWRITE ) 92 if ( flags & FORCE_OVERWRITE )
93 commands << "-force-overwrite"; 93 commands << "-force-overwrite";
94 if ( infoLevel == 3 ) 94 if ( infoLevel == 3 )
95 commands << "-verbose_wget"; 95 commands << "-verbose_wget";
96 96
97 // Handle make links 97 // Handle make links
98 // Rules - If make links is switched on, create links to root 98 // Rules - If make links is switched on, create links to root
99 // if destDir is NOT / 99 // if destDir is NOT /
100 if ( flags & MAKE_LINKS ) 100 if ( flags & MAKE_LINKS )
101 { 101 {
102 // If destDir == / turn off make links as package is being insalled 102 // If destDir == / turn off make links as package is being insalled
103 // to root already. 103 // to root already.
104 if ( destDir == "/" ) 104 if ( destDir == "/" )
105 flags ^= MAKE_LINKS; 105 flags ^= MAKE_LINKS;
106 } 106 }
107 } 107 }
108 108
109#ifdef X86 109#ifdef X86
110 commands << "-f"; 110 commands << "-f";
111 commands << IPKG_CONF; 111 commands << IPKG_CONF;
112#endif 112#endif
113 113
114 114
115 if ( option == "reinstall" ) 115 if ( option == "reinstall" )
116 commands << "install"; 116 commands << "install";
117 else 117 else
118 commands << option; 118 commands << option;
119 if ( package != "" ) 119 if ( package != "" )
120 commands << package; 120 commands << package;
121 121
122 122
123 if ( package != "" ) 123 if ( package != "" )
124 emit outputText( tr( "Dealing with package %1" ).arg( package) ); 124 emit outputText( tr( "Dealing with package %1" ).arg( package) );
125 125
126 qApp->processEvents(); 126 qApp->processEvents();
127 127
128 // If we are removing, reinstalling or upgrading packages and make links option is selected 128 // If we are removing, reinstalling or upgrading packages and make links option is selected
129 // create the links 129 // create the links
130 if ( option == "remove" || option == "reinstall" || option == "upgrade" ) 130 if ( option == "remove" || option == "reinstall" || option == "upgrade" )
131 { 131 {
132 createLinks = false; 132 createLinks = false;
133 if ( flags & MAKE_LINKS ) 133 if ( flags & MAKE_LINKS )
134 { 134 {
135 emit outputText( tr( "Removing symbolic links...\n" ) ); 135 emit outputText( tr( "Removing symbolic links...\n" ) );
136 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 136 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
137 emit outputText( QString( " " ) ); 137 emit outputText( QString( " " ) );
138 } 138 }
139 } 139 }
140 140
141 // Execute command 141 // Execute command
142 dependantPackages = new QList<QString>; 142 dependantPackages = new QList<QString>;
143 dependantPackages->setAutoDelete( true ); 143 dependantPackages->setAutoDelete( true );
144 144
145 executeIpkgCommand( commands, option ); 145 executeIpkgCommand( commands, option );
146} 146}
147 147
148void Ipkg :: createSymLinks() 148void Ipkg :: createSymLinks()
149{ 149{
150 if ( option == "install" || option == "reinstall" || option == "upgrade" ) 150 if ( option == "install" || option == "reinstall" || option == "upgrade" )
151 { 151 {
152 // If we are not removing packages and make links option is selected 152 // If we are not removing packages and make links option is selected
153 // create the links 153 // create the links
154 createLinks = true; 154 createLinks = true;
155 if ( flags & MAKE_LINKS ) 155 if ( flags & MAKE_LINKS )
156 { 156 {
157 emit outputText( " " ); 157 emit outputText( " " );
158 emit outputText( tr( "Creating symbolic links for %1." ).arg( package) ); 158 emit outputText( tr( "Creating symbolic links for %1." ).arg( package) );
159 159
160 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); 160 linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir );
161 161
162 // link dependant packages that were installed with this release 162 // link dependant packages that were installed with this release
163 QString *pkg; 163 QString *pkg;
164 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) 164 for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() )
165 { 165 {
166 if ( *pkg == package ) 166 if ( *pkg == package )
167 continue; 167 continue;
168 emit outputText( " " ); 168 emit outputText( " " );
169 emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) ); 169 emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) );
170 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); 170 linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir );
171 } 171 }
172 } 172 }
173 } 173 }
174 174
175 delete dependantPackages; 175 delete dependantPackages;
176 176
177 emit outputText( tr("Finished") ); 177 emit outputText( tr("Finished") );
178 emit outputText( "" ); 178 emit outputText( "" );
179} 179}
180 180
181void Ipkg :: removeStatusEntry() 181void Ipkg :: removeStatusEntry()
182{ 182{
183 QString statusFile = destDir; 183 QString statusFile = destDir;
184 if ( statusFile.right( 1 ) != "/" ) 184 if ( statusFile.right( 1 ) != "/" )
185 statusFile.append( "/" ); 185 statusFile.append( "/" );
186 statusFile.append( "usr/lib/ipkg/status" ); 186 statusFile.append( "usr/lib/ipkg/status" );
187 QString outStatusFile = statusFile; 187 QString outStatusFile = statusFile;
188 outStatusFile.append( ".tmp" ); 188 outStatusFile.append( ".tmp" );
189 189
190 emit outputText( "" ); 190 emit outputText( "" );
191 emit outputText( tr("Removing status entry...") ); 191 emit outputText( tr("Removing status entry...") );
192 QString tempstr = tr("status file - "); 192 QString tempstr = tr("status file - ");
193 tempstr.append( statusFile ); 193 tempstr.append( statusFile );
194 emit outputText( tempstr ); 194 emit outputText( tempstr );
195 tempstr = tr("package - "); 195 tempstr = tr("package - ");
196 tempstr.append( package ); 196 tempstr.append( package );
197 emit outputText( tempstr ); 197 emit outputText( tempstr );
198 198
199 QFile readFile( statusFile ); 199 QFile readFile( statusFile );
200 QFile writeFile( outStatusFile ); 200 QFile writeFile( outStatusFile );
201 201
202 if ( !readFile.open( IO_ReadOnly ) ) 202 if ( !readFile.open( IO_ReadOnly ) )
203 { 203 {
204 tempstr = tr("Couldn't open status file - "); 204 tempstr = tr("Couldn't open status file - ");
205 tempstr.append( statusFile ); 205 tempstr.append( statusFile );
206 emit outputText( tempstr ); 206 emit outputText( tempstr );
207 return; 207 return;
208 } 208 }
209 209
210 if ( !writeFile.open( IO_WriteOnly ) ) 210 if ( !writeFile.open( IO_WriteOnly ) )
211 { 211 {
212 tempstr = tr("Couldn't create tempory status file - "); 212 tempstr = tr("Couldn't create tempory status file - ");
213 tempstr.append( outStatusFile ); 213 tempstr.append( outStatusFile );
214 emit outputText( tempstr ); 214 emit outputText( tempstr );
215 return; 215 return;
216 } 216 }
217 217
218 int i = 0; 218 int i = 0;
219 219
220 QTextStream readStream( &readFile ); 220 QTextStream readStream( &readFile );
221 QTextStream writeStream( &writeFile ); 221 QTextStream writeStream( &writeFile );
222 QString line; 222 QString line;
223 223
224 char k[21]; 224 char k[21];
225 char v[1001]; 225 char v[1001];
226 QString key; 226 QString key;
227 QString value; 227 QString value;
228 228
229 while ( !readStream.atEnd() ) 229 while ( !readStream.atEnd() )
230 { 230 {
231 //read new line 231 //read new line
232 line = readStream.readLine(); 232 line = readStream.readLine();
233 233
234 if ( line.contains( ":", TRUE ) ) 234 if ( line.contains( ":", TRUE ) )
235 { 235 {
236 //grep key and value from line 236 //grep key and value from line
237 k[0] = '\0'; 237 k[0] = '\0';
238 v[0] = '\0'; 238 v[0] = '\0';
239 sscanf( line, "%[^:]: %[^\n]", k, v ); 239 sscanf( line, "%[^:]: %[^\n]", k, v );
240 key = k; 240 key = k;
241 value = v; 241 value = v;
242 key = key.stripWhiteSpace(); 242 key = key.stripWhiteSpace();
243 value = value.stripWhiteSpace(); 243 value = value.stripWhiteSpace();
244 } else { 244 } else {
245 key = ""; 245 key = "";
246 value = ""; 246 value = "";
247 } 247 }
248 248
249 if ( key == "Package" && value == package ) 249 if ( key == "Package" && value == package )
250 { 250 {
251 //skip lines from the deleted package 251 //skip lines from the deleted package
252 while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) 252 while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) )
253 { 253 {
254 line = readStream.readLine(); 254 line = readStream.readLine();
255 } 255 }
256 } else { 256 } else {
257 257
258 //write other lines into the tempfile 258 //write other lines into the tempfile
259 writeStream << line << "\n"; 259 writeStream << line << "\n";
260 260
261 // Improve UI responsiveness 261 // Improve UI responsiveness
262 i++; 262 i++;
263 if ( ( i % 50 ) == 0 ) 263 if ( ( i % 50 ) == 0 )
264 qApp->processEvents(); 264 qApp->processEvents();
265 } 265 }
266 } 266 }
267 267
268 readFile.close(); 268 readFile.close();
269 writeFile.close(); 269 writeFile.close();
270 270
271 // Remove old status file and put tmp stats file in its place 271 // Remove old status file and put tmp stats file in its place
272 remove( statusFile ); 272 remove( statusFile );
273 rename( outStatusFile, statusFile ); 273 rename( outStatusFile, statusFile );
274 } 274 }
275 275
276int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) 276int Ipkg :: executeIpkgLinkCommand( QStringList *cmd )
277{ 277{
278 // If one is already running - should never be but just to be safe 278 // If one is already running - should never be but just to be safe
279 if ( proc ) 279 if ( proc )
280 { 280 {
281 delete proc; 281 delete proc;
282 proc = 0; 282 proc = 0;
283 } 283 }
284 284
285 // OK we're gonna use OProcess to run this thing 285 // OK we're gonna use OProcess to run this thing
286 proc = new OProcess(); 286 proc = new OProcess();
287 aborted = false; 287 aborted = false;
288 288
289 // Connect up our slots 289 // Connect up our slots
290 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), 290 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)),
291 this, SLOT( linkProcessFinished())); 291 this, SLOT( linkProcessFinished()));
292 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), 292 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)),
293 this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); 293 this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int)));
294 294
295 *proc << *cmd; 295 *proc << *cmd;
296 296
297 if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) 297 if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
298 { 298 {
299 emit outputText( tr("Couldn't start ipkg-link process" ) ); 299 emit outputText( tr("Couldn't start ipkg-link process" ) );
300 } 300 }
301
302 return 0;
301} 303}
302 304
303void Ipkg::linkProcessFinished() 305void Ipkg::linkProcessFinished()
304{ 306{
305 // Report that the link process succeeded/failed 307 // Report that the link process succeeded/failed
306 308
307 if ( error ) 309 if ( error )
308 emit outputText( tr("Symbolic linking failed!\n") ); 310 emit outputText( tr("Symbolic linking failed!\n") );
309 else 311 else
310 emit outputText( tr("Symbolic linking succeeded.\n") ); 312 emit outputText( tr("Symbolic linking succeeded.\n") );
311 313
312 delete proc; 314 delete proc;
313 proc = 0; 315 proc = 0;
314 finished = true; 316 finished = true;
315} 317}
316 318
317void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) 319void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen)
318{ 320{
319 QString lineStr = buffer; 321 QString lineStr = buffer;
320 if ( lineStr[buflen-1] == '\n' ) 322 if ( lineStr[buflen-1] == '\n' )
321 buflen --; 323 buflen --;
322 lineStr = lineStr.left( buflen ); 324 lineStr = lineStr.left( buflen );
323 emit outputText( lineStr ); 325 emit outputText( lineStr );
324 326
325 if ( lineStr.find( " not found." ) != -1 ) 327 if ( lineStr.find( " not found." ) != -1 )
326 { 328 {
327 // Capture ipkg-link errors 329 // Capture ipkg-link errors
328 error = true; 330 error = true;
329 } 331 }
330 332
331 buffer[0] = '\0'; 333 buffer[0] = '\0';
332} 334}
333 335
334int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) 336int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
335{ 337{
336 // If one is already running - should never be but just to be safe 338 // If one is already running - should never be but just to be safe
337 if ( proc ) 339 if ( proc )
338 { 340 {
339 delete proc; 341 delete proc;
340 proc = 0; 342 proc = 0;
341 } 343 }
342 344
343 // OK we're gonna use OProcess to run this thing 345 // OK we're gonna use OProcess to run this thing
344 proc = new OProcess(); 346 proc = new OProcess();
345 aborted = false; 347 aborted = false;
346 348
347 349
348 // Connect up our slots 350 // Connect up our slots
349 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), 351 connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)),
350 this, SLOT( processFinished())); 352 this, SLOT( processFinished()));
351 353
352 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), 354 connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)),
353 this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int))); 355 this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int)));
354 356
355 connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)), 357 connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)),
356 this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int))); 358 this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int)));
357 359
358 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) 360 for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it )
359 { 361 {
360 *proc << (*it).latin1(); 362 *proc << (*it).latin1();
361 } 363 }
362 364
363 // Start the process going 365 // Start the process going
364 finished = false; 366 finished = false;
365 if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) 367 if(!proc->start(OProcess::NotifyOnExit, OProcess::All))
366 { 368 {
367 emit outputText( tr("Couldn't start ipkg process" ) ); 369 emit outputText( tr("Couldn't start ipkg process" ) );
368 } 370 }
371
372 return 0;
369} 373}
370 374
371void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) 375void Ipkg::commandStdout(OProcess*, char *buffer, int buflen)
372{ 376{
373 QString lineStr = buffer; 377 QString lineStr = buffer;
374 if ( lineStr[buflen-1] == '\n' ) 378 if ( lineStr[buflen-1] == '\n' )
375 buflen --; 379 buflen --;
376 lineStr = lineStr.left( buflen ); 380 lineStr = lineStr.left( buflen );
377 emit outputText( lineStr ); 381 emit outputText( lineStr );
378 382
379 // check if we are installing dependant packages 383 // check if we are installing dependant packages
380 if ( option == "install" || option == "reinstall" ) 384 if ( option == "install" || option == "reinstall" )
381 { 385 {
382 // Need to keep track of any dependant packages that get installed 386 // Need to keep track of any dependant packages that get installed
383 // so that we can create links to them as necessary 387 // so that we can create links to them as necessary
384 if ( lineStr.startsWith( "Installing " ) ) 388 if ( lineStr.startsWith( "Installing " ) )
385 { 389 {
386 int start = lineStr.find( " " ) + 1; 390 int start = lineStr.find( " " ) + 1;
387 int end = lineStr.find( " ", start ); 391 int end = lineStr.find( " ", start );
388 QString *package = new QString( lineStr.mid( start, end-start ) ); 392 QString *package = new QString( lineStr.mid( start, end-start ) );
389 dependantPackages->append( package ); 393 dependantPackages->append( package );
390 } 394 }
391 } 395 }
392 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && 396 else if ( option == "remove" && !( flags & FORCE_DEPENDS ) &&
393 lineStr.find( "is depended upon by packages:" ) != -1 ) 397 lineStr.find( "is depended upon by packages:" ) != -1 )
394 { 398 {
395 // Ipkg should send this to STDERR, but doesn't - so trap here 399 // Ipkg should send this to STDERR, but doesn't - so trap here
396 error = true; 400 error = true;
397 } 401 }
398 402
399 buffer[0] = '\0'; 403 buffer[0] = '\0';
400} 404}
401 405
402void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) 406void Ipkg::commandStderr(OProcess*, char *buffer, int buflen)
403{ 407{
404 QString lineStr = buffer; 408 QString lineStr = buffer;
405 if ( lineStr[buflen-1] == '\n' ) 409 if ( lineStr[buflen-1] == '\n' )
406 buflen --; 410 buflen --;
407 lineStr=lineStr.left( buflen ); 411 lineStr=lineStr.left( buflen );
408 emit outputText( lineStr ); 412 emit outputText( lineStr );
409 buffer[0] = '\0'; 413 buffer[0] = '\0';
410 error = true; 414 error = true;
411} 415}
412 416
413void Ipkg::processFinished() 417void Ipkg::processFinished()
414{ 418{
415 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file 419 // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file
416 // to workaround an ipkg bug which stops reinstall to a different location 420 // to workaround an ipkg bug which stops reinstall to a different location
417 421
418 if ( !error && option == "remove" ) 422 if ( !error && option == "remove" )
419 removeStatusEntry(); 423 removeStatusEntry();
420 424
421 delete proc; 425 delete proc;
422 proc = 0; 426 proc = 0;
423 finished = true; 427 finished = true;
424 428
425 emit ipkgFinished(); 429 emit ipkgFinished();
426} 430}
427 431
428 432
429void Ipkg :: abort() 433void Ipkg :: abort()
430{ 434{
431 if ( proc ) 435 if ( proc )
432 { 436 {
433 proc->kill(); 437 proc->kill();
434 aborted = true; 438 aborted = true;
435 } 439 }
436} 440}
437 441
438void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) 442void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir )
439{ 443{
444 Q_CONST_UNUSED( destDir )
440 if ( dest == "root" || dest == "/" ) 445 if ( dest == "root" || dest == "/" )
441 return; 446 return;
442 447
443 if( option == "remove" || option == "reinstall" || option == "upgrade" ) 448 if( option == "remove" || option == "reinstall" || option == "upgrade" )
444 { 449 {
445 QStringList commands; 450 QStringList commands;
446 451
447 if ( runtimeDir != "" ) 452 if ( runtimeDir != "" )
448 { 453 {
449 commands << "cd "; 454 commands << "cd ";
450 commands << runtimeDir; 455 commands << runtimeDir;
451 commands << ";"; 456 commands << ";";
452 } 457 }
453 commands << "ipkg-link" << "remove" << packFileName; 458 commands << "ipkg-link" << "remove" << packFileName;
454 executeIpkgLinkCommand( &commands ); 459 executeIpkgLinkCommand( &commands );
455 } 460 }
456 461
457 if( option == "install" || option == "reinstall" || option == "upgrade" ) 462 if( option == "install" || option == "reinstall" || option == "upgrade" )
458 { 463 {
459 QStringList commands; 464 QStringList commands;
460 if ( runtimeDir != "" ) 465 if ( runtimeDir != "" )
461 { 466 {
462 commands << "cd "; 467 commands << "cd ";
463 commands << runtimeDir; 468 commands << runtimeDir;
464 commands << ";"; 469 commands << ";";
465 } 470 }
466 commands << "ipkg-link" << "add" << packFileName; 471 commands << "ipkg-link" << "add" << packFileName;
467 executeIpkgLinkCommand( &commands ); 472 executeIpkgLinkCommand( &commands );
468 } 473 }
469/* 474/*
470 qApp->processEvents(); 475 qApp->processEvents();
471 QStringList *fileList = getList( packFileName, destDir ); 476 QStringList *fileList = getList( packFileName, destDir );
472 qApp->processEvents(); 477 qApp->processEvents();
473 processFileList( fileList, destDir ); 478 processFileList( fileList, destDir );
474 delete fileList;*/ 479 delete fileList;*/
475} 480}
476/* 481/*
477QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) 482QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir )
478{ 483{
479 QString packageFileDir = destDir; 484 QString packageFileDir = destDir;
480 packageFileDir.append( "/usr/lib/ipkg/info/" ); 485 packageFileDir.append( "/usr/lib/ipkg/info/" );
481 packageFileDir.append( packageFilename ); 486 packageFileDir.append( packageFilename );
482 packageFileDir.append( ".list" ); 487 packageFileDir.append( ".list" );
483 QFile f( packageFileDir ); 488 QFile f( packageFileDir );
484 489
485 if ( !f.open(IO_ReadOnly) ) 490 if ( !f.open(IO_ReadOnly) )
486 { 491 {
487 // Couldn't open from dest, try from / 492 // Couldn't open from dest, try from /
488 f.close(); 493 f.close();
489 494
490 packageFileDir = "/usr/lib/ipkg/info/"; 495 packageFileDir = "/usr/lib/ipkg/info/";
491 packageFileDir.append( packageFilename ); 496 packageFileDir.append( packageFilename );
492 packageFileDir.append( ".list" ); 497 packageFileDir.append( ".list" );
493 f.setName( packageFileDir ); 498 f.setName( packageFileDir );
494 if ( ! f.open(IO_ReadOnly) ) 499 if ( ! f.open(IO_ReadOnly) )
495 { 500 {
496 QString tempstr = tr("Could not open :"); 501 QString tempstr = tr("Could not open :");
497 tempstr.append( packageFileDir ); 502 tempstr.append( packageFileDir );
498 emit outputText( tempstr ); 503 emit outputText( tempstr );
499 return (QStringList*)0; 504 return (QStringList*)0;
500 } 505 }
501 } 506 }
502 QStringList *fileList = new QStringList(); 507 QStringList *fileList = new QStringList();
503 QTextStream t( &f ); 508 QTextStream t( &f );
504 while ( !t.eof() ) 509 while ( !t.eof() )
505 *fileList += t.readLine(); 510 *fileList += t.readLine();
506 511
507 f.close(); 512 f.close();
508 return fileList; 513 return fileList;
509} 514}
510 515
511void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir ) 516void Ipkg :: processFileList( const QStringList *fileList, const QString &destDir )
512{ 517{
513 if ( !fileList || fileList->isEmpty() ) 518 if ( !fileList || fileList->isEmpty() )
514 return; 519 return;
515 520
516 QString baseDir = ROOT; 521 QString baseDir = ROOT;
517 522
518 if ( createLinks == true ) 523 if ( createLinks == true )
519 { 524 {
520 for ( uint i=0; i < fileList->count(); i++ ) 525 for ( uint i=0; i < fileList->count(); i++ )
521 { 526 {
522 processLinkDir( (*fileList)[i], baseDir, destDir ); 527 processLinkDir( (*fileList)[i], baseDir, destDir );
523 qApp->processEvents(); 528 qApp->processEvents();
524 } 529 }
525 } 530 }
526 else 531 else
527 { 532 {
528 for ( int i = fileList->count()-1; i >= 0 ; i-- ) 533 for ( int i = fileList->count()-1; i >= 0 ; i-- )
529 { 534 {
530 processLinkDir( (*fileList)[i], baseDir, destDir ); 535 processLinkDir( (*fileList)[i], baseDir, destDir );
531 qApp->processEvents(); 536 qApp->processEvents();
532 } 537 }
533 } 538 }
534} 539}
535 540
536void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir ) 541void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QString &baseDir )
537{ 542{
538 543
539 QString sourceFile = baseDir; 544 QString sourceFile = baseDir;
540 sourceFile.append( file ); 545 sourceFile.append( file );
541 546
542 QString linkFile = destDir; 547 QString linkFile = destDir;
543 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" ) 548 if ( file.startsWith( "/" ) && destDir.right( 1 ) == "/" )
544 { 549 {
545 linkFile.append( file.mid( 1 ) ); 550 linkFile.append( file.mid( 1 ) );
546 } 551 }
547 else 552 else
548 { 553 {
549 linkFile.append( file ); 554 linkFile.append( file );
550 } 555 }
551 QString text; 556 QString text;
552 if ( createLinks ) 557 if ( createLinks )
553 { 558 {
554 // If this file is a directory (ends with a /) and it doesn't exist, 559 // If this file is a directory (ends with a /) and it doesn't exist,
555 // we need to create it 560 // we need to create it
556 if ( file.right(1) == "/" ) 561 if ( file.right(1) == "/" )
557 { 562 {
558 QFileInfo f( linkFile ); 563 QFileInfo f( linkFile );
559 if ( !f.exists() ) 564 if ( !f.exists() )
560 { 565 {
561 QString tempstr = tr("Creating directory "); 566 QString tempstr = tr("Creating directory ");
562 tempstr.append( linkFile ); 567 tempstr.append( linkFile );
563 emit outputText( tempstr ); 568 emit outputText( tempstr );
564 QDir d; 569 QDir d;
565 d.mkdir( linkFile, true ); 570 d.mkdir( linkFile, true );
566 } 571 }
567// else 572// else
568// emit outputText( QString( "Directory " ) + linkFile + " already exists" ); 573// emit outputText( QString( "Directory " ) + linkFile + " already exists" );
569 574
570 } 575 }
571 else 576 else
572 { 577 {
573 int rc = symlink( sourceFile, linkFile ); 578 int rc = symlink( sourceFile, linkFile );
574 text = ( rc == 0 ? tr( "Linked %1 to %2" ) : tr( "Failed to link %1 to %2" ) ). 579 text = ( rc == 0 ? tr( "Linked %1 to %2" ) : tr( "Failed to link %1 to %2" ) ).
575 arg( sourceFile ). 580 arg( sourceFile ).
576 arg( linkFile ); 581 arg( linkFile );
577 emit outputText( text ); 582 emit outputText( text );
578 } 583 }
579 } 584 }
580 else 585 else
581 { 586 {
582 QFileInfo f( linkFile ); 587 QFileInfo f( linkFile );
583 if ( f.exists() ) 588 if ( f.exists() )
584 { 589 {
585 if ( f.isFile() ) 590 if ( f.isFile() )
586 { 591 {
587 QFile f( linkFile ); 592 QFile f( linkFile );
588 bool rc = f.remove(); 593 bool rc = f.remove();
589 594
590 text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile ); 595 text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile );
591 emit outputText( text ); 596 emit outputText( text );
592 } 597 }
593 else if ( f.isDir() ) 598 else if ( f.isDir() )
594 { 599 {
595 QDir d; 600 QDir d;
596 bool rc = d.rmdir( linkFile, true ); 601 bool rc = d.rmdir( linkFile, true );
597 if ( rc ) 602 if ( rc )
598 { 603 {
599 text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile ); 604 text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile );
600 emit outputText( text ); 605 emit outputText( text );
601 } 606 }
602 } 607 }
603 } 608 }
604 } 609 }
605} 610}
606*/ 611*/