author | andyq <andyq> | 2002-11-23 15:27:33 (UTC) |
---|---|---|
committer | andyq <andyq> | 2002-11-23 15:27:33 (UTC) |
commit | 7763c095d81f44cd3012d894da6b17eb0b0cc194 (patch) (unidiff) | |
tree | 286c3392f3ad9b06429a136413590ec99ebefadf | |
parent | dd850ee9705b0329d49c3e1b0f22d76ce62f7a0b (diff) | |
download | opie-7763c095d81f44cd3012d894da6b17eb0b0cc194.zip opie-7763c095d81f44cd3012d894da6b17eb0b0cc194.tar.gz opie-7763c095d81f44cd3012d894da6b17eb0b0cc194.tar.bz2 |
1.6 Beta - Changed ipg process to use OProcess instead of popen for async io
-rw-r--r-- | noncore/settings/aqpkg/global.h | 2 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 121 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.h | 18 |
3 files changed, 110 insertions, 31 deletions
diff --git a/noncore/settings/aqpkg/global.h b/noncore/settings/aqpkg/global.h index e1a4ed4..cec9aa5 100644 --- a/noncore/settings/aqpkg/global.h +++ b/noncore/settings/aqpkg/global.h | |||
@@ -17,9 +17,9 @@ | |||
17 | 17 | ||
18 | #ifndef __GLOBAL_H | 18 | #ifndef __GLOBAL_H |
19 | #define __GLOBAL_H | 19 | #define __GLOBAL_H |
20 | 20 | ||
21 | #define VERSION_TEXT "AQPkg Version 1.5" | 21 | #define VERSION_TEXT "AQPkg Version 1.6 BETA" |
22 | 22 | ||
23 | // Uncomment the below line to run on a Linux box rather than a Zaurus | 23 | // Uncomment the below line to run on a Linux box rather than a Zaurus |
24 | // box this allows you to change where root is, and where to load config files from | 24 | // box this allows you to change where root is, and where to load config files from |
25 | // #define X86 | 25 | // #define X86 |
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index dad34b0..1efe030 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp | |||
@@ -30,8 +30,10 @@ using namespace std; | |||
30 | #endif | 30 | #endif |
31 | #include <qdir.h> | 31 | #include <qdir.h> |
32 | #include <qtextstream.h> | 32 | #include <qtextstream.h> |
33 | 33 | ||
34 | #include <opie/oprocess.h> | ||
35 | |||
34 | #include "utils.h" | 36 | #include "utils.h" |
35 | #include "ipkg.h" | 37 | #include "ipkg.h" |
36 | #include "global.h" | 38 | #include "global.h" |
37 | 39 | ||
@@ -54,37 +56,37 @@ Ipkg :: ~Ipkg() | |||
54 | // dir is the directory to run ipkg in (defaults to "") | 56 | // dir is the directory to run ipkg in (defaults to "") |
55 | bool Ipkg :: runIpkg( ) | 57 | bool Ipkg :: runIpkg( ) |
56 | { | 58 | { |
57 | bool ret = false; | 59 | bool ret = false; |
60 | QStringList commands; | ||
58 | 61 | ||
59 | QDir::setCurrent( "/tmp" ); | 62 | QDir::setCurrent( "/tmp" ); |
60 | QString cmd = ""; | ||
61 | 63 | ||
62 | if ( runtimeDir != "" ) | 64 | if ( runtimeDir != "" ) |
63 | { | 65 | { |
64 | cmd += "cd "; | 66 | commands << "cd "; |
65 | cmd += runtimeDir; | 67 | commands << runtimeDir; |
66 | cmd += " ; "; | 68 | commands << ";"; |
67 | } | 69 | } |
68 | cmd += "ipkg -force-defaults"; | 70 | commands << "ipkg" << "-force-defaults"; |
69 | 71 | ||
70 | // only set the destination for an install operation | 72 | // only set the destination for an install operation |
71 | if ( option == "install" ) | 73 | if ( option == "install" ) |
72 | cmd += " -dest "+ destination; | 74 | commands << "-dest" << destination; |
73 | 75 | ||
74 | 76 | ||
75 | if ( option != "update" && option != "download" ) | 77 | if ( option != "update" && option != "download" ) |
76 | { | 78 | { |
77 | if ( flags & FORCE_DEPENDS ) | 79 | if ( flags & FORCE_DEPENDS ) |
78 | cmd += " -force-depends"; | 80 | commands << "-force-depends"; |
79 | if ( flags & FORCE_REINSTALL ) | 81 | if ( flags & FORCE_REINSTALL ) |
80 | cmd += " -force-reinstall"; | 82 | commands << "-force-reinstall"; |
81 | if ( flags & FORCE_REMOVE ) | 83 | if ( flags & FORCE_REMOVE ) |
82 | cmd += " -force-removal-of-essential-packages"; | 84 | commands << "-force-removal-of-essential-packages"; |
83 | if ( flags & FORCE_OVERWRITE ) | 85 | if ( flags & FORCE_OVERWRITE ) |
84 | cmd += " -force-overwrite"; | 86 | commands << "-force-overwrite"; |
85 | if ( flags & VERBOSE_WGET ) | 87 | if ( flags & VERBOSE_WGET ) |
86 | cmd += " -verbose_wget"; | 88 | commands << "-verbose_wget"; |
87 | 89 | ||
88 | // Handle make links | 90 | // Handle make links |
89 | // Rules - If make links is switched on, create links to root | 91 | // Rules - If make links is switched on, create links to root |
90 | // if destDir is NOT / | 92 | // if destDir is NOT / |
@@ -97,20 +99,19 @@ bool Ipkg :: runIpkg( ) | |||
97 | } | 99 | } |
98 | } | 100 | } |
99 | 101 | ||
100 | #ifdef X86 | 102 | #ifdef X86 |
101 | cmd += " -f "; | 103 | commands << "-f"; |
102 | cmd += IPKG_CONF; | 104 | commands << IPKG_CONF; |
103 | #endif | 105 | #endif |
104 | 106 | ||
105 | 107 | ||
106 | if ( option == "reinstall" ) | 108 | if ( option == "reinstall" ) |
107 | cmd += " install"; | 109 | commands << "install"; |
108 | else | 110 | else |
109 | cmd += " " + option; | 111 | commands << option; |
110 | if ( package != "" ) | 112 | if ( package != "" ) |
111 | cmd += " " + package; | 113 | commands << package; |
112 | cmd += " 2>&1"; | ||
113 | 114 | ||
114 | 115 | ||
115 | if ( package != "" ) | 116 | if ( package != "" ) |
116 | emit outputText( QString( "Dealing with package " ) + package ); | 117 | emit outputText( QString( "Dealing with package " ) + package ); |
@@ -129,15 +130,13 @@ bool Ipkg :: runIpkg( ) | |||
129 | emit outputText( QString( " " ) ); | 130 | emit outputText( QString( " " ) ); |
130 | } | 131 | } |
131 | } | 132 | } |
132 | 133 | ||
133 | emit outputText( cmd ); | ||
134 | |||
135 | // Execute command | 134 | // Execute command |
136 | dependantPackages = new QList<QString>; | 135 | dependantPackages = new QList<QString>; |
137 | dependantPackages->setAutoDelete( true ); | 136 | dependantPackages->setAutoDelete( true ); |
138 | 137 | ||
139 | ret = executeIpkgCommand( cmd, option ); | 138 | ret = executeIpkgCommand( commands, option ); |
140 | 139 | ||
141 | if ( option == "install" || option == "reinstall" ) | 140 | if ( option == "install" || option == "reinstall" ) |
142 | { | 141 | { |
143 | // If we are not removing packages and make links option is selected | 142 | // If we are not removing packages and make links option is selected |
@@ -146,9 +145,9 @@ bool Ipkg :: runIpkg( ) | |||
146 | if ( flags & MAKE_LINKS ) | 145 | if ( flags & MAKE_LINKS ) |
147 | { | 146 | { |
148 | emit outputText( " " ); | 147 | emit outputText( " " ); |
149 | emit outputText( QString( "Creating symbolic links for " )+ package ); | 148 | emit outputText( QString( "Creating symbolic links for " )+ package ); |
150 | 149 | ||
151 | linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); | 150 | linkPackage( Utils::getPackageNameFromIpkFilename( package ), destination, destDir ); |
152 | 151 | ||
153 | // link dependant packages that were installed with this release | 152 | // link dependant packages that were installed with this release |
154 | QString *pkg; | 153 | QString *pkg; |
@@ -168,14 +167,14 @@ bool Ipkg :: runIpkg( ) | |||
168 | // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file | 167 | // Finally, if we are removing a package, remove its entry from the <destdir>/usr/lib/ipkg/status file |
169 | // to workaround an ipkg bug which stops reinstall to a different location | 168 | // to workaround an ipkg bug which stops reinstall to a different location |
170 | if ( option == "remove" ) | 169 | if ( option == "remove" ) |
171 | removeStatusEntry(); | 170 | removeStatusEntry(); |
172 | |||
173 | 171 | ||
174 | // emit outputText( QString( "Finished - status=" ) + (ret ? "success" : "failure") ); | 172 | |
175 | emit outputText( "Finished" ); | 173 | emit outputText( "Finished" ); |
176 | emit outputText( "" ); | 174 | emit outputText( "" ); |
177 | return ret; | 175 | return ret; |
176 | |||
178 | } | 177 | } |
179 | 178 | ||
180 | void Ipkg :: removeStatusEntry() | 179 | void Ipkg :: removeStatusEntry() |
181 | { | 180 | { |
@@ -254,9 +253,77 @@ void Ipkg :: removeStatusEntry() | |||
254 | remove( statusFile ); | 253 | remove( statusFile ); |
255 | rename( outStatusFile, statusFile ); | 254 | rename( outStatusFile, statusFile ); |
256 | } | 255 | } |
257 | 256 | ||
257 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString option ) | ||
258 | { | ||
259 | // OK we're gonna use OProcess to run this thing | ||
260 | proc = new OProcess(); | ||
261 | |||
262 | // Connect up our slots | ||
263 | connect(proc, SIGNAL(processExited(OProcess *)), | ||
264 | this, SLOT( processFinished())); | ||
265 | |||
266 | connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)), | ||
267 | this, SLOT(commandStdout(OProcess *, char *, int))); | ||
268 | |||
269 | connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)), | ||
270 | this, SLOT(commandStderr(OProcess *, char *, int))); | ||
271 | |||
272 | for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) | ||
273 | { | ||
274 | qDebug( "%s ", (*it).latin1() ); | ||
275 | *proc << (*it).latin1(); | ||
276 | } | ||
277 | cout << endl; | ||
278 | |||
279 | // Start the process going | ||
280 | finished = false; | ||
281 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) | ||
282 | { | ||
283 | emit outputText( QString( "Couldn't start ipkg process" ) ); | ||
284 | qDebug( "Couldn't start ipkg process!" ); | ||
285 | } | ||
286 | |||
287 | // Now wait for it to finish | ||
288 | while ( !finished ) | ||
289 | qApp->processEvents(); | ||
290 | } | ||
291 | |||
292 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) | ||
293 | { | ||
294 | qDebug("received stdout %d bytes", buflen); | ||
295 | |||
296 | QString lineStr = buffer; | ||
297 | if ( lineStr[buflen-1] == '\n' ) | ||
298 | buflen --; | ||
299 | lineStr = lineStr.left( buflen ); | ||
300 | emit outputText( lineStr ); | ||
301 | qDebug(lineStr); | ||
302 | buffer[0] = '\0'; | ||
303 | } | ||
304 | |||
305 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) | ||
306 | { | ||
307 | qDebug("received stderrt %d bytes", buflen); | ||
308 | |||
309 | QString lineStr = buffer; | ||
310 | if ( lineStr[buflen-1] == '\n' ) | ||
311 | buflen --; | ||
312 | lineStr=lineStr.left( buflen ); | ||
313 | emit outputText( lineStr ); | ||
314 | buffer[0] = '\0'; | ||
315 | } | ||
316 | |||
317 | void Ipkg::processFinished() | ||
318 | { | ||
319 | delete proc; | ||
320 | finished = true; | ||
321 | } | ||
322 | |||
323 | |||
258 | 324 | ||
325 | /* | ||
259 | int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) | 326 | int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) |
260 | { | 327 | { |
261 | FILE *fp = NULL; | 328 | FILE *fp = NULL; |
262 | char line[130]; | 329 | char line[130]; |
@@ -292,9 +359,9 @@ int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) | |||
292 | QString *package = new QString( lineStr.mid( start, end-start ) ); | 359 | QString *package = new QString( lineStr.mid( start, end-start ) ); |
293 | dependantPackages->append( package ); | 360 | dependantPackages->append( package ); |
294 | } | 361 | } |
295 | } | 362 | } |
296 | 363 | ||
297 | if ( option == "update" ) | 364 | if ( option == "update" ) |
298 | { | 365 | { |
299 | if (lineStr.contains("Updated list")) | 366 | if (lineStr.contains("Updated list")) |
300 | ret = true; | 367 | ret = true; |
@@ -319,9 +386,9 @@ int Ipkg :: executeIpkgCommand( QString &cmd, const QString option ) | |||
319 | } | 386 | } |
320 | 387 | ||
321 | return ret; | 388 | return ret; |
322 | } | 389 | } |
323 | 390 | */ | |
324 | 391 | ||
325 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) | 392 | void Ipkg :: linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ) |
326 | { | 393 | { |
327 | if ( dest == "root" || dest == "/" ) | 394 | if ( dest == "root" || dest == "/" ) |
@@ -347,12 +414,12 @@ QStringList* Ipkg :: getList( const QString &packageFilename, const QString &des | |||
347 | f.close(); | 414 | f.close(); |
348 | 415 | ||
349 | packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list"; | 416 | packageFileDir = "/usr/lib/ipkg/info/"+packageFilename+".list"; |
350 | f.setName( packageFileDir ); | 417 | f.setName( packageFileDir ); |
351 | // cout << "Try to open " << packageFileDir.latin1() << endl; | 418 | qDebug( "Try to open %s", packageFileDir.latin1() ); |
352 | if ( ! f.open(IO_ReadOnly) ) | 419 | if ( ! f.open(IO_ReadOnly) ) |
353 | { | 420 | { |
354 | cout << "Could not open:" << packageFileDir << endl; | 421 | qDebug( "Could not open: %s", packageFileDir ); |
355 | emit outputText( QString( "Could not open :" ) + packageFileDir ); | 422 | emit outputText( QString( "Could not open :" ) + packageFileDir ); |
356 | return (QStringList*)0; | 423 | return (QStringList*)0; |
357 | } | 424 | } |
358 | } | 425 | } |
diff --git a/noncore/settings/aqpkg/ipkg.h b/noncore/settings/aqpkg/ipkg.h index 7099ca7..25bae59 100644 --- a/noncore/settings/aqpkg/ipkg.h +++ b/noncore/settings/aqpkg/ipkg.h | |||
@@ -24,17 +24,20 @@ | |||
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <qobject.h> | 26 | #include <qobject.h> |
27 | #include <qstring.h> | 27 | #include <qstring.h> |
28 | #include <qstringlist.h> | ||
28 | #include <qlist.h> | 29 | #include <qlist.h> |
29 | 30 | ||
30 | #define FORCE_DEPENDS 0x0001 | 31 | #define FORCE_DEPENDS 0x0001 |
31 | #define FORCE_REMOVE 0x0002 | 32 | #define FORCE_REMOVE 0x0002 |
32 | #define FORCE_REINSTALL 0x0004 | 33 | #define FORCE_REINSTALL 0x0004 |
33 | #define FORCE_OVERWRITE 0x0008 | 34 | #define FORCE_OVERWRITE 0x0008 |
34 | #define MAKE_LINKS 0x0010 | 35 | #define MAKE_LINKS 0x0010 |
35 | #define VERBOSE_WGET 0x0020 | 36 | #define VERBOSE_WGET 0x0020 |
36 | 37 | ||
38 | class OProcess; | ||
39 | |||
37 | class Ipkg : public QObject | 40 | class Ipkg : public QObject |
38 | { | 41 | { |
39 | Q_OBJECT | 42 | Q_OBJECT |
40 | public: | 43 | public: |
@@ -50,25 +53,34 @@ public: | |||
50 | void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; } | 53 | void setRuntimeDirectory( const char *dir ) { runtimeDir = dir; } |
51 | 54 | ||
52 | signals: | 55 | signals: |
53 | void outputText( const QString &text ); | 56 | void outputText( const QString &text ); |
57 | |||
58 | public slots: | ||
59 | void commandStdout(OProcess*, char *buffer, int buflen); | ||
60 | void commandStderr(OProcess*, char *buffer, int buflen); | ||
61 | void processFinished(); | ||
62 | |||
54 | 63 | ||
55 | private: | 64 | private: |
56 | bool createLinks; | 65 | bool createLinks; |
57 | QString option; | 66 | QString option; |
58 | QString package; | 67 | QString package; |
59 | QString destination; | 68 | QString destination; |
60 | QString destDir; | 69 | QString destDir; |
61 | int flags; | ||
62 | QString runtimeDir; | 70 | QString runtimeDir; |
71 | OProcess *proc; | ||
72 | int flags; | ||
73 | bool finished; | ||
63 | 74 | ||
64 | QList<QString> *dependantPackages; | 75 | QList<QString> *dependantPackages; |
65 | 76 | ||
66 | int executeIpkgCommand( QString &cmd, const QString option ); | 77 | int executeIpkgCommand( QStringList &cmd, const QString option ); |
67 | void removeStatusEntry(); | 78 | void removeStatusEntry(); |
68 | void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); | 79 | void linkPackage( const QString &packFileName, const QString &dest, const QString &destDir ); |
69 | QStringList* getList( const QString &packageFilename, const QString &destDir ); | 80 | QStringList* getList( const QString &packageFilename, const QString &destDir ); |
70 | void processFileList( const QStringList *fileList, const QString &destDir ); | 81 | void processFileList( const QStringList *fileList, const QString &destDir ); |
71 | void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir ); | 82 | void processLinkDir( const QString &file, const QString &baseDir, const QString &destDir ); |
83 | |||
72 | }; | 84 | }; |
73 | 85 | ||
74 | #endif | 86 | #endif |