summaryrefslogtreecommitdiff
authordrw <drw>2003-05-17 15:34:26 (UTC)
committer drw <drw>2003-05-17 15:34:26 (UTC)
commit325096fb28d129429b17a781c4c1e8d6ca9aa585 (patch) (unidiff)
tree1e241dcf42a2eb1caf146282c3a20e9716ebc1e2
parentc48833d1d58c3d691c39df5326c6daff811a6d07 (diff)
downloadopie-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
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/settings/aqpkg/ipkg.cpp11
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
155void Ipkg :: createSymLinks() 155void 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
188void Ipkg :: removeStatusEntry() 188void 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
274int Ipkg :: executeIpkgCommand( QStringList &cmd, const QString /*option*/ ) 285int 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
311void Ipkg::commandStdout(OProcess*, char *buffer, int buflen) 322void 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
342void Ipkg::commandStderr(OProcess*, char *buffer, int buflen) 353void 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
353void Ipkg::processFinished() 364void 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();