author | drw <drw> | 2003-05-17 15:34:26 (UTC) |
---|---|---|
committer | drw <drw> | 2003-05-17 15:34:26 (UTC) |
commit | 325096fb28d129429b17a781c4c1e8d6ca9aa585 (patch) (unidiff) | |
tree | 1e241dcf42a2eb1caf146282c3a20e9716ebc1e2 | |
parent | c48833d1d58c3d691c39df5326c6daff811a6d07 (diff) | |
download | opie-325096fb28d129429b17a781c4c1e8d6ca9aa585.zip opie-325096fb28d129429b17a781c4c1e8d6ca9aa585.tar.gz opie-325096fb28d129429b17a781c4c1e8d6ca9aa585.tar.bz2 |
Fix for bug #913 - added periodic qApp->processEvents() while updating ipkg status file to improve UI responsiveness
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index 08ae386..3df569b 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp | |||
@@ -134,226 +134,237 @@ void Ipkg :: runIpkg() | |||
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( QString( "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 | ||
153 | } | 153 | } |
154 | 154 | ||
155 | void Ipkg :: createSymLinks() | 155 | void Ipkg :: createSymLinks() |
156 | { | 156 | { |
157 | if ( option == "install" || option == "reinstall" || option == "upgrade" ) | 157 | if ( option == "install" || option == "reinstall" || option == "upgrade" ) |
158 | { | 158 | { |
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( QString( "Creating symbolic links for " )+ 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( QString( "Creating symbolic links for " )+ (*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( "Finished" ); |
185 | emit outputText( "" ); | 185 | emit outputText( "" ); |
186 | } | 186 | } |
187 | 187 | ||
188 | void Ipkg :: removeStatusEntry() | 188 | void Ipkg :: removeStatusEntry() |
189 | { | 189 | { |
190 | QString statusFile = destDir; | 190 | QString statusFile = destDir; |
191 | if ( statusFile.right( 1 ) != "/" ) | 191 | if ( statusFile.right( 1 ) != "/" ) |
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( "Removing status entry..." ); |
199 | QString tempstr = "status file - "; | 199 | QString tempstr = "status file - "; |
200 | tempstr.append( statusFile ); | 200 | tempstr.append( statusFile ); |
201 | emit outputText( tempstr ); | 201 | emit outputText( tempstr ); |
202 | tempstr = "package - "; | 202 | tempstr = "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 = "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 = "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]; |
225 | char k[21]; | 225 | char k[21]; |
226 | char v[1001]; | 226 | char v[1001]; |
227 | QString key; | 227 | QString key; |
228 | QString value; | 228 | QString value; |
229 | vector<QString> lines; | 229 | vector<QString> lines; |
230 | int i = 0; | ||
230 | do | 231 | do |
231 | { | 232 | { |
232 | in.getline( line, 1000 ); | 233 | in.getline( line, 1000 ); |
233 | if ( in.eof() ) | 234 | if ( in.eof() ) |
234 | continue; | 235 | continue; |
235 | 236 | ||
236 | k[0] = '\0'; | 237 | k[0] = '\0'; |
237 | v[0] = '\0'; | 238 | v[0] = '\0'; |
238 | 239 | ||
239 | sscanf( line, "%[^:]: %[^\n]", k, v ); | 240 | sscanf( line, "%[^:]: %[^\n]", k, v ); |
240 | key = k; | 241 | key = k; |
241 | value = v; | 242 | value = v; |
242 | key = key.stripWhiteSpace(); | 243 | key = key.stripWhiteSpace(); |
243 | value = value.stripWhiteSpace(); | 244 | value = value.stripWhiteSpace(); |
244 | if ( key == "Package" && value == package ) | 245 | if ( key == "Package" && value == package ) |
245 | { | 246 | { |
246 | // Ignore all lines up to next empty | 247 | // Ignore all lines up to next empty |
247 | do | 248 | do |
248 | { | 249 | { |
249 | in.getline( line, 1000 ); | 250 | in.getline( line, 1000 ); |
250 | if ( in.eof() || QString( line ).stripWhiteSpace() == "" ) | 251 | if ( in.eof() || QString( line ).stripWhiteSpace() == "" ) |
251 | continue; | 252 | continue; |
252 | } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" ); | 253 | } while ( !in.eof() && QString( line ).stripWhiteSpace() != "" ); |
253 | } | 254 | } |
254 | 255 | ||
255 | lines.push_back( QString( line ) ); | 256 | lines.push_back( QString( line ) ); |
256 | out << line << endl; | 257 | out << line << endl; |
258 | |||
259 | // Improve UI responsiveness | ||
260 | i++; | ||
261 | if ( ( i % 50 ) == 0 ) | ||
262 | qApp->processEvents(); | ||
257 | } while ( !in.eof() ); | 263 | } while ( !in.eof() ); |
258 | 264 | ||
259 | // Write lines out | 265 | // Write lines out |
260 | vector<QString>::iterator it; | 266 | vector<QString>::iterator it; |
261 | for ( it = lines.begin() ; it != lines.end() ; ++it ) | 267 | for ( it = lines.begin() ; it != lines.end() ; ++it ) |
262 | { | 268 | { |
263 | out << (const char *)(*it) << endl; | 269 | out << (const char *)(*it) << endl; |
270 | |||
271 | // Improve UI responsiveness | ||
272 | i++; | ||
273 | if ( ( i % 50 ) == 0 ) | ||
274 | qApp->processEvents(); | ||
264 | } | 275 | } |
265 | 276 | ||
266 | in.close(); | 277 | in.close(); |
267 | out.close(); | 278 | out.close(); |
268 | 279 | ||
269 | // 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 |
270 | remove( statusFile ); | 281 | remove( statusFile ); |
271 | rename( outStatusFile, statusFile ); | 282 | rename( outStatusFile, statusFile ); |
272 | } | 283 | } |
273 | 284 | ||
274 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) | 285 | int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) |
275 | { | 286 | { |
276 | // 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 |
277 | if ( proc ) | 288 | if ( proc ) |
278 | { | 289 | { |
279 | delete proc; | 290 | delete proc; |
280 | proc = 0; | 291 | proc = 0; |
281 | } | 292 | } |
282 | 293 | ||
283 | // OK we're gonna use OProcess to run this thing | 294 | // OK we're gonna use OProcess to run this thing |
284 | proc = new OProcess(); | 295 | proc = new OProcess(); |
285 | aborted = false; | 296 | aborted = false; |
286 | 297 | ||
287 | 298 | ||
288 | // Connect up our slots | 299 | // Connect up our slots |
289 | connect(proc, SIGNAL(processExited(OProcess *)), | 300 | connect(proc, SIGNAL(processExited(OProcess *)), |
290 | this, SLOT( processFinished())); | 301 | this, SLOT( processFinished())); |
291 | 302 | ||
292 | connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)), | 303 | connect(proc, SIGNAL(receivedStdout(OProcess *, char *, int)), |
293 | this, SLOT(commandStdout(OProcess *, char *, int))); | 304 | this, SLOT(commandStdout(OProcess *, char *, int))); |
294 | 305 | ||
295 | connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)), | 306 | connect(proc, SIGNAL(receivedStderr(OProcess *, char *, int)), |
296 | this, SLOT(commandStderr(OProcess *, char *, int))); | 307 | this, SLOT(commandStderr(OProcess *, char *, int))); |
297 | 308 | ||
298 | for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) | 309 | for ( QStringList::Iterator it = cmd.begin(); it != cmd.end(); ++it ) |
299 | { | 310 | { |
300 | *proc << (*it).latin1(); | 311 | *proc << (*it).latin1(); |
301 | } | 312 | } |
302 | 313 | ||
303 | // Start the process going | 314 | // Start the process going |
304 | finished = false; | 315 | finished = false; |
305 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) | 316 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) |
306 | { | 317 | { |
307 | emit outputText( QString( "Couldn't start ipkg process" ) ); | 318 | emit outputText( QString( "Couldn't start ipkg process" ) ); |
308 | } | 319 | } |
309 | } | 320 | } |
310 | 321 | ||
311 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) | 322 | void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) |
312 | { | 323 | { |
313 | QString lineStr = buffer; | 324 | QString lineStr = buffer; |
314 | if ( lineStr[buflen-1] == '\n' ) | 325 | if ( lineStr[buflen-1] == '\n' ) |
315 | buflen --; | 326 | buflen --; |
316 | lineStr = lineStr.left( buflen ); | 327 | lineStr = lineStr.left( buflen ); |
317 | emit outputText( lineStr ); | 328 | emit outputText( lineStr ); |
318 | 329 | ||
319 | // check if we are installing dependant packages | 330 | // check if we are installing dependant packages |
320 | if ( option == "install" || option == "reinstall" ) | 331 | if ( option == "install" || option == "reinstall" ) |
321 | { | 332 | { |
322 | // Need to keep track of any dependant packages that get installed | 333 | // Need to keep track of any dependant packages that get installed |
323 | // so that we can create links to them as necessary | 334 | // so that we can create links to them as necessary |
324 | if ( lineStr.startsWith( "Installing " ) ) | 335 | if ( lineStr.startsWith( "Installing " ) ) |
325 | { | 336 | { |
326 | int start = lineStr.find( " " ) + 1; | 337 | int start = lineStr.find( " " ) + 1; |
327 | int end = lineStr.find( " ", start ); | 338 | int end = lineStr.find( " ", start ); |
328 | QString *package = new QString( lineStr.mid( start, end-start ) ); | 339 | QString *package = new QString( lineStr.mid( start, end-start ) ); |
329 | dependantPackages->append( package ); | 340 | dependantPackages->append( package ); |
330 | } | 341 | } |
331 | } | 342 | } |
332 | else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && | 343 | else if ( option == "remove" && !( flags & FORCE_DEPENDS ) && |
333 | lineStr.find( "is depended upon by packages:" ) != -1 ) | 344 | lineStr.find( "is depended upon by packages:" ) != -1 ) |
334 | { | 345 | { |
335 | // 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 |
336 | error = true; | 347 | error = true; |
337 | } | 348 | } |
338 | 349 | ||
339 | buffer[0] = '\0'; | 350 | buffer[0] = '\0'; |
340 | } | 351 | } |
341 | 352 | ||
342 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) | 353 | void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) |
343 | { | 354 | { |
344 | QString lineStr = buffer; | 355 | QString lineStr = buffer; |
345 | if ( lineStr[buflen-1] == '\n' ) | 356 | if ( lineStr[buflen-1] == '\n' ) |
346 | buflen --; | 357 | buflen --; |
347 | lineStr=lineStr.left( buflen ); | 358 | lineStr=lineStr.left( buflen ); |
348 | emit outputText( lineStr ); | 359 | emit outputText( lineStr ); |
349 | buffer[0] = '\0'; | 360 | buffer[0] = '\0'; |
350 | error = true; | 361 | error = true; |
351 | } | 362 | } |
352 | 363 | ||
353 | void Ipkg::processFinished() | 364 | void Ipkg::processFinished() |
354 | { | 365 | { |
355 | // 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 |
356 | // 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 |
357 | 368 | ||
358 | if ( !error && option == "remove" ) | 369 | if ( !error && option == "remove" ) |
359 | removeStatusEntry(); | 370 | removeStatusEntry(); |