summaryrefslogtreecommitdiff
path: root/noncore/settings/aqpkg/ipkg.cpp
Unidiff
Diffstat (limited to 'noncore/settings/aqpkg/ipkg.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp139
1 files changed, 35 insertions, 104 deletions
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,9 +1,9 @@
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
@@ -108,13 +108,13 @@ void Ipkg :: runIpkg()
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
@@ -124,29 +124,29 @@ void Ipkg :: runIpkg()
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
@@ -159,32 +159,32 @@ void Ipkg :: createSymLinks()
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;
@@ -192,33 +192,33 @@ void Ipkg :: removeStatusEntry()
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];
@@ -253,30 +253,30 @@ void Ipkg :: removeStatusEntry()
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 );
@@ -287,13 +287,13 @@ int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
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
@@ -302,23 +302,23 @@ int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ )
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;
@@ -343,13 +343,13 @@ void Ipkg::commandStdout(OProcess*, char *buffer, int buflen)
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;
@@ -365,13 +365,13 @@ void 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}
@@ -383,83 +383,17 @@ void Ipkg :: abort()
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}
@@ -473,20 +407,20 @@ QStringList* Ipkg :: getList( const QString &packageFilename, const QString &des
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();
@@ -525,18 +459,18 @@ void Ipkg :: processFileList( const QStringList *fileList, const QString &destDi
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 )
@@ -545,29 +479,28 @@ void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const
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 );
@@ -575,24 +508,22 @@ void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const
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}