-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 91 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.h | 3 |
2 files changed, 91 insertions, 3 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index 420863c..17efda9 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp @@ -122,49 +122,48 @@ void Ipkg :: runIpkg() if ( package != "" ) emit outputText( tr( "Dealing with package %1" ).arg( package) ); qApp->processEvents(); // If we are removing, reinstalling or upgrading packages and make links option is selected // create the links if ( option == "remove" || option == "reinstall" || option == "upgrade" ) { createLinks = false; if ( flags & MAKE_LINKS ) { emit outputText( tr( "Removing symbolic links...\n" ) ); linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); emit outputText( QString( " " ) ); } } // Execute command dependantPackages = new QList<QString>; dependantPackages->setAutoDelete( true ); executeIpkgCommand( commands, option ); - } void Ipkg :: createSymLinks() { if ( option == "install" || option == "reinstall" || option == "upgrade" ) { // If we are not removing packages and make links option is selected // create the links createLinks = true; if ( flags & MAKE_LINKS ) { emit outputText( " " ); emit outputText( tr( "Creating symbolic links for %1." ).arg( package) ); linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); // link dependant packages that were installed with this release QString *pkg; for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) { if ( *pkg == package ) continue; emit outputText( " " ); emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) ); @@ -253,48 +252,106 @@ void Ipkg :: removeStatusEntry() while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) { line = readStream.readLine(); } } else { //write other lines into the tempfile writeStream << line << "\n"; // Improve UI responsiveness i++; if ( ( i % 50 ) == 0 ) qApp->processEvents(); } } readFile.close(); writeFile.close(); // Remove old status file and put tmp stats file in its place remove( statusFile ); rename( outStatusFile, statusFile ); } +int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) +{ + // If one is already running - should never be but just to be safe + if ( proc ) + { + delete proc; + proc = 0; + } + + // OK we're gonna use OProcess to run this thing + proc = new OProcess(); + aborted = false; + + // Connect up our slots + connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), + this, SLOT( linkProcessFinished())); + connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), + this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); + + *proc << *cmd; + + if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) + { + emit outputText( tr("Couldn't start ipkg-link process" ) ); + } +} + +void Ipkg::linkProcessFinished() +{ + // Report that the link process succeeded/failed + + if ( error ) + emit outputText( tr("Symbolic linking failed!\n") ); + else + emit outputText( tr("Symbolic linking succeeded.\n") ); + + delete proc; + proc = 0; + finished = true; +} + +void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) +{ + QString lineStr = buffer; + if ( lineStr[buflen-1] == '\n' ) + buflen --; + lineStr = lineStr.left( buflen ); + emit outputText( lineStr ); + + if ( lineStr.find( " not found." ) != -1 ) + { + // Capture ipkg-link errors + error = true; + } + + buffer[0] = '\0'; +} + int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) { // If one is already running - should never be but just to be safe if ( proc ) { delete proc; proc = 0; } // OK we're gonna use OProcess to run this thing proc = new OProcess(); aborted = false; // Connect up our slots connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), this, SLOT( processFinished())); connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), this, SLOT(commandStdout(Opie::Core::OProcess*,char*,int))); connect(proc, SIGNAL(receivedStderr(Opie::Core::OProcess*,char*,int)), this, SLOT(commandStderr(Opie::Core::OProcess*,char*,int))); @@ -362,55 +419,82 @@ void Ipkg::processFinished() removeStatusEntry(); delete proc; proc = 0; finished = true; emit ipkgFinished(); } void Ipkg :: abort() { if ( proc ) { proc->kill(); aborted = true; } } void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) { if ( dest == "root" || dest == "/" ) return; + if( option == "remove" || option == "reinstall" || option == "upgrade" ) + { + QStringList commands; + + if ( runtimeDir != "" ) + { + commands << "cd "; + commands << runtimeDir; + commands << ";"; + } + commands << "ipkg-link" << "remove" << packFileName; + executeIpkgLinkCommand( &commands ); + } + + if( option == "install" || option == "reinstall" || option == "upgrade" ) + { + QStringList commands; + if ( runtimeDir != "" ) + { + commands << "cd "; + commands << runtimeDir; + commands << ";"; + } + commands << "ipkg-link" << "add" << packFileName; + executeIpkgLinkCommand( &commands ); + } +/* qApp->processEvents(); QStringList *fileList = getList( packFileName, destDir ); qApp->processEvents(); processFileList( fileList, destDir ); - delete fileList; + delete fileList;*/ } - +/* QStringList* Ipkg :: getList( const QString &packageFilename, const QString &destDir ) { QString packageFileDir = destDir; packageFileDir.append( "/usr/lib/ipkg/info/" ); packageFileDir.append( packageFilename ); packageFileDir.append( ".list" ); QFile f( packageFileDir ); if ( !f.open(IO_ReadOnly) ) { // Couldn't open from dest, try from / f.close(); packageFileDir = "/usr/lib/ipkg/info/"; packageFileDir.append( packageFilename ); packageFileDir.append( ".list" ); f.setName( packageFileDir ); if ( ! f.open(IO_ReadOnly) ) { QString tempstr = tr("Could not open :"); tempstr.append( packageFileDir ); emit outputText( tempstr ); return (QStringList*)0; } @@ -498,24 +582,25 @@ void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const QFileInfo f( linkFile ); if ( f.exists() ) { if ( f.isFile() ) { QFile f( linkFile ); bool rc = f.remove(); text = ( rc ? tr( "Removed %1" ) : tr( "Failed to remove %1" ) ).arg( linkFile ); emit outputText( text ); } else if ( f.isDir() ) { QDir d; bool rc = d.rmdir( linkFile, true ); if ( rc ) { text = ( rc ? tr( "Removed " ) : tr( "Failed to remove " ) ).arg( linkFile ); emit outputText( text ); } } } } } +*/ diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h index e216d17..5df63f1 100644 --- a/noncore/settings/aqpkg/ipkg.h +++ b/noncore/settings/aqpkg/ipkg.h @@ -49,56 +49,59 @@ namespace Opie {namespace Core {class OProcess;}} class Ipkg : public QObject { Q_OBJECT public: Ipkg(); ~Ipkg(); void runIpkg(); void createSymLinks(); void setOption( const char *opt ) { option = opt; } void setPackage( const char *pkg ) { package = pkg; } void setDestination( const char *dest ) { destination = dest; } void setDestinationDir( const char *dir ) { destDir = dir; } void setFlags( int fl, int il ) { flags = fl; infoLevel = il; } void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; } signals: void outputText( const QString &text ); void ipkgFinished(); public slots: + void linkCommandStdout(Opie::Core::OProcess*, char *buffer, int buflen); void commandStdout(Opie::Core::OProcess*, char *buffer, int buflen); void commandStderr(Opie::Core::OProcess*, char *buffer, int buflen); + void linkProcessFinished(); void processFinished(); void abort(); private: bool createLinks; bool aborted; bool error; QString option; QString package; QString destination; QString destDir; QString runtimeDir; Opie::Core::OProcess *proc; int flags; int infoLevel; bool finished; QList<QString> *dependantPackages; + int executeIpkgLinkCommand( QStringList *cmd ); int executeIpkgCommand( QStringList &cmd, const QString option ); void removeStatusEntry(); void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); QStringList* getList( const QString &packageFilename, const QString &destDir ); void processFileList( const QStringList *fileList, const QString &destDir ); void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir ); }; #endif |