summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp91
-rw-r--r--noncore/settings/aqpkg/ipkg.h3
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
@@ -134,25 +134,24 @@ void Ipkg :: runIpkg()
{
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( " " );
@@ -265,24 +264,82 @@ void Ipkg :: removeStatusEntry()
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;
@@ -374,31 +431,58 @@ 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();
@@ -510,12 +594,13 @@ void Ipkg :: processLinkDir( const QString &file, const QString &destDir, const
{
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
@@ -61,44 +61,47 @@ public:
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