author | llornkcor <llornkcor> | 2003-04-15 12:11:22 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-04-15 12:11:22 (UTC) |
commit | d1b5bf7eeb365282356db49f49331c82f234086c (patch) (unidiff) | |
tree | 476c3a1bc4c19ab25c3820619e1fa55e8ce8f0a2 | |
parent | d0de397e46581f6ed5fcfad320b2b61be3858c5d (diff) | |
download | opie-d1b5bf7eeb365282356db49f49331c82f234086c.zip opie-d1b5bf7eeb365282356db49f49331c82f234086c.tar.gz opie-d1b5bf7eeb365282356db49f49331c82f234086c.tar.bz2 |
changed copy method from clunky to using sendfile(). should be 1. faster and 2. require less memory
-rw-r--r-- | noncore/apps/advancedfm/advancedfmMenu.cpp | 77 |
1 files changed, 51 insertions, 26 deletions
diff --git a/noncore/apps/advancedfm/advancedfmMenu.cpp b/noncore/apps/advancedfm/advancedfmMenu.cpp index 93203cd..eae86a4 100644 --- a/noncore/apps/advancedfm/advancedfmMenu.cpp +++ b/noncore/apps/advancedfm/advancedfmMenu.cpp | |||
@@ -23,49 +23,50 @@ | |||
23 | #include <qpe/resource.h> | 23 | #include <qpe/resource.h> |
24 | #include <qpe/qcopenvelope_qws.h> | 24 | #include <qpe/qcopenvelope_qws.h> |
25 | #include <qpe/applnk.h> | 25 | #include <qpe/applnk.h> |
26 | #include <qpe/ir.h> | 26 | #include <qpe/ir.h> |
27 | 27 | ||
28 | #include <qmessagebox.h> | 28 | #include <qmessagebox.h> |
29 | #include <qmultilineedit.h> | 29 | #include <qmultilineedit.h> |
30 | 30 | ||
31 | #include <qstring.h> | 31 | #include <qstring.h> |
32 | 32 | ||
33 | #include <qlayout.h> | 33 | #include <qlayout.h> |
34 | #include <qpixmap.h> | 34 | #include <qpixmap.h> |
35 | #include <qcombobox.h> | 35 | #include <qcombobox.h> |
36 | #include <qpopupmenu.h> | 36 | #include <qpopupmenu.h> |
37 | #include <qtabwidget.h> | 37 | #include <qtabwidget.h> |
38 | #include <qtoolbutton.h> | 38 | #include <qtoolbutton.h> |
39 | #include <qtabwidget.h> | 39 | #include <qtabwidget.h> |
40 | #include <qlineedit.h> | 40 | #include <qlineedit.h> |
41 | #include <qlistview.h> | 41 | #include <qlistview.h> |
42 | 42 | ||
43 | #include <stdlib.h> | 43 | #include <stdlib.h> |
44 | #include <unistd.h> | 44 | #include <unistd.h> |
45 | #include <sys/stat.h> | 45 | #include <sys/stat.h> |
46 | #include <dirent.h> | 46 | #include <dirent.h> |
47 | 47 | #include <sys/sendfile.h> | |
48 | #include <fcntl.h> | ||
48 | 49 | ||
49 | void AdvancedFm::doDirChange() | 50 | void AdvancedFm::doDirChange() |
50 | { | 51 | { |
51 | ListClicked( CurrentView()->currentItem()); | 52 | ListClicked( CurrentView()->currentItem()); |
52 | } | 53 | } |
53 | 54 | ||
54 | void AdvancedFm::showMenuHidden() | 55 | void AdvancedFm::showMenuHidden() |
55 | { | 56 | { |
56 | if (b) | 57 | if (b) |
57 | { | 58 | { |
58 | CurrentDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); | 59 | CurrentDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); |
59 | OtherDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); | 60 | OtherDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); |
60 | fileMenu->setItemChecked( fileMenu->idAt(0),TRUE); | 61 | fileMenu->setItemChecked( fileMenu->idAt(0),TRUE); |
61 | // b=FALSE; | 62 | // b=FALSE; |
62 | 63 | ||
63 | } | 64 | } |
64 | else | 65 | else |
65 | { | 66 | { |
66 | CurrentDir()->setFilter( QDir::Files | QDir::Dirs/* | QDir::Hidden*/ | QDir::All); | 67 | CurrentDir()->setFilter( QDir::Files | QDir::Dirs/* | QDir::Hidden*/ | QDir::All); |
67 | OtherDir()->setFilter( QDir::Files | QDir::Dirs/* | QDir::Hidden*/ | QDir::All); | 68 | OtherDir()->setFilter( QDir::Files | QDir::Dirs/* | QDir::Hidden*/ | QDir::All); |
68 | fileMenu->setItemChecked( fileMenu->idAt(0),FALSE); | 69 | fileMenu->setItemChecked( fileMenu->idAt(0),FALSE); |
69 | // b=TRUE; | 70 | // b=TRUE; |
70 | } | 71 | } |
71 | rePopulate(); | 72 | rePopulate(); |
@@ -291,49 +292,49 @@ void AdvancedFm::upDir() | |||
291 | QDir dir(current); | 292 | QDir dir(current); |
292 | dir.cdUp(); | 293 | dir.cdUp(); |
293 | current = dir.canonicalPath(); | 294 | current = dir.canonicalPath(); |
294 | chdir( current.latin1() ); | 295 | chdir( current.latin1() ); |
295 | thisDir->cd( current, TRUE); | 296 | thisDir->cd( current, TRUE); |
296 | 297 | ||
297 | populateView(); | 298 | populateView(); |
298 | update(); | 299 | update(); |
299 | } | 300 | } |
300 | 301 | ||
301 | void AdvancedFm::copy() | 302 | void AdvancedFm::copy() |
302 | { | 303 | { |
303 | qApp->processEvents(); | 304 | qApp->processEvents(); |
304 | QStringList curFileList = getPath(); | 305 | QStringList curFileList = getPath(); |
305 | 306 | ||
306 | QDir *thisDir = CurrentDir(); | 307 | QDir *thisDir = CurrentDir(); |
307 | QDir *thatDir = OtherDir(); | 308 | QDir *thatDir = OtherDir(); |
308 | 309 | ||
309 | bool doMsg=true; | 310 | bool doMsg=true; |
310 | int count=curFileList.count(); | 311 | int count=curFileList.count(); |
311 | if( count > 0) { | 312 | if( count > 0) { |
312 | if(count > 1 ){ | 313 | if(count > 1 ){ |
313 | QString msg; | 314 | QString msg; |
314 | msg=tr("Really copy\n%1 files?").arg(count); | 315 | msg=tr("Really copy\n%1 files?").arg(count); |
315 | switch ( QMessageBox::warning(this,tr("Delete"),msg | 316 | switch ( QMessageBox::warning(this,tr("Copy"),msg |
316 | ,tr("Yes"),tr("No"),0,0,1) ) | 317 | ,tr("Yes"),tr("No"),0,0,1) ) |
317 | { | 318 | { |
318 | case 0: | 319 | case 0: |
319 | doMsg=false; | 320 | doMsg=false; |
320 | break; | 321 | break; |
321 | case 1: | 322 | case 1: |
322 | return; | 323 | return; |
323 | break; | 324 | break; |
324 | }; | 325 | }; |
325 | } | 326 | } |
326 | 327 | ||
327 | QString curFile, item, destFile; | 328 | QString curFile, item, destFile; |
328 | for ( QStringList::Iterator it = curFileList.begin(); it != curFileList.end(); ++it ) | 329 | for ( QStringList::Iterator it = curFileList.begin(); it != curFileList.end(); ++it ) |
329 | { | 330 | { |
330 | item=(*it); | 331 | item=(*it); |
331 | if(item.find("->",0,TRUE)) //symlink | 332 | if(item.find("->",0,TRUE)) //symlink |
332 | item = item.left(item.find("->",0,TRUE)); | 333 | item = item.left(item.find("->",0,TRUE)); |
333 | 334 | ||
334 | curFile = thisDir->canonicalPath()+"/"+ item; | 335 | curFile = thisDir->canonicalPath()+"/"+ item; |
335 | destFile = thatDir->canonicalPath()+"/"+ item; | 336 | destFile = thatDir->canonicalPath()+"/"+ item; |
336 | 337 | ||
337 | qDebug("Destination file is "+destFile); | 338 | qDebug("Destination file is "+destFile); |
338 | qDebug("CurrentFile file is " + curFile); | 339 | qDebug("CurrentFile file is " + curFile); |
339 | 340 | ||
@@ -499,74 +500,98 @@ void AdvancedFm::move() | |||
499 | if(curFile.right(1).find("/",0,TRUE) == -1) | 500 | if(curFile.right(1).find("/",0,TRUE) == -1) |
500 | curFile +="/"; | 501 | curFile +="/"; |
501 | curFile+= item; | 502 | curFile+= item; |
502 | qDebug("CurrentFile file is " + curFile); | 503 | qDebug("CurrentFile file is " + curFile); |
503 | 504 | ||
504 | QFile f( curFile); | 505 | QFile f( curFile); |
505 | if( f.exists()) { | 506 | if( f.exists()) { |
506 | if( !copyFile( curFile, destFile) ) | 507 | if( !copyFile( curFile, destFile) ) |
507 | { | 508 | { |
508 | QMessageBox::message(tr("Note"),tr("Could not move\n")+curFile); | 509 | QMessageBox::message(tr("Note"),tr("Could not move\n")+curFile); |
509 | return; | 510 | return; |
510 | } else | 511 | } else |
511 | QFile::remove(curFile); | 512 | QFile::remove(curFile); |
512 | } | 513 | } |
513 | } | 514 | } |
514 | 515 | ||
515 | } | 516 | } |
516 | setOtherTabCurrent(); | 517 | setOtherTabCurrent(); |
517 | populateView(); | 518 | populateView(); |
518 | // populateLocalView(); | 519 | // populateLocalView(); |
519 | } | 520 | } |
520 | 521 | ||
521 | bool AdvancedFm::copyFile( const QString & src, const QString & dest ) | 522 | bool AdvancedFm::copyFile( const QString & src, const QString & dest ) |
522 | { | 523 | { |
523 | char bf[ 50000 ]; | 524 | // char bf[ 50000 ]; |
524 | int bytesRead; | 525 | // int bytesRead; |
525 | bool success = TRUE; | 526 | bool success = true; |
526 | struct stat status; | 527 | struct stat status; |
528 | |||
529 | // QFile s( src ); | ||
530 | // QFile d( dest ); | ||
531 | |||
532 | int read_fd=0; | ||
533 | int write_fd=0; | ||
534 | struct stat stat_buf; | ||
535 | off_t offset = 0; | ||
536 | read_fd = ::open(src.latin1(), O_RDONLY); | ||
537 | if(read_fd != -1) { | ||
538 | fstat (read_fd, &stat_buf); | ||
539 | write_fd = ::open(dest.latin1(), O_WRONLY | O_CREAT, stat_buf.st_mode); | ||
540 | if(write_fd != -1) { | ||
541 | if(sendfile(write_fd, read_fd, &offset, stat_buf.st_size) == -1) { | ||
542 | success = false; | ||
543 | } | ||
544 | } else { | ||
545 | success = false; | ||
546 | } | ||
547 | } else { | ||
548 | success = false; | ||
549 | } | ||
527 | 550 | ||
528 | QFile s( src ); | 551 | ::close (read_fd); |
529 | QFile d( dest ); | 552 | ::close (write_fd); |
530 | 553 | ||
531 | if( s.open( IO_ReadOnly | IO_Raw ) && d.open( IO_WriteOnly | IO_Raw ) ) | 554 | |
532 | { | 555 | // if( s.open( IO_ReadOnly | IO_Raw ) && d.open( IO_WriteOnly | IO_Raw ) ) |
533 | while( (bytesRead = s.readBlock( bf, sizeof( bf ) )) == sizeof( bf ) ) | 556 | // { |
534 | { | 557 | // while( (bytesRead = s.readBlock( bf, sizeof( bf ) )) == sizeof( bf ) ) |
535 | if( d.writeBlock( bf, sizeof( bf ) ) != sizeof( bf ) ){ | 558 | // { |
536 | success = FALSE; | 559 | // if( d.writeBlock( bf, sizeof( bf ) ) != sizeof( bf ) ){ |
537 | break; | 560 | // success = FALSE; |
538 | } | 561 | // break; |
539 | } | 562 | // } |
540 | if( success && (bytesRead > 0) ) | 563 | // } |
541 | { | 564 | // if( success && (bytesRead > 0) ) |
542 | d.writeBlock( bf, bytesRead ); | 565 | // { |
543 | } | 566 | // d.writeBlock( bf, bytesRead ); |
544 | } | 567 | // } |
545 | else | 568 | |
546 | { | 569 | // } |
547 | success = FALSE; | 570 | // else |
548 | } | 571 | // { |
572 | // success = FALSE; | ||
573 | // } | ||
549 | 574 | ||
550 | // Set file permissions | 575 | // Set file permissions |
551 | if( stat( (const char *) src, &status ) == 0 ) | 576 | if( stat( (const char *) src, &status ) == 0 ) |
552 | { | 577 | { |
553 | chmod( (const char *) dest, status.st_mode ); | 578 | chmod( (const char *) dest, status.st_mode ); |
554 | } | 579 | } |
555 | 580 | ||
556 | return success; | 581 | return success; |
557 | } | 582 | } |
558 | 583 | ||
559 | void AdvancedFm::runCommand() | 584 | void AdvancedFm::runCommand() |
560 | { | 585 | { |
561 | QDir *thisDir = CurrentDir(); | 586 | QDir *thisDir = CurrentDir(); |
562 | 587 | ||
563 | QString curFile; | 588 | QString curFile; |
564 | curFile = thisDir->canonicalPath() +"/"+ CurrentView()->currentItem()->text(0); | 589 | curFile = thisDir->canonicalPath() +"/"+ CurrentView()->currentItem()->text(0); |
565 | 590 | ||
566 | InputDialog *fileDlg; | 591 | InputDialog *fileDlg; |
567 | fileDlg = new InputDialog(this,tr("Run Command"),TRUE, 0); | 592 | fileDlg = new InputDialog(this,tr("Run Command"),TRUE, 0); |
568 | fileDlg->setInputText(curFile); | 593 | fileDlg->setInputText(curFile); |
569 | fileDlg->exec(); | 594 | fileDlg->exec(); |
570 | //QString command; | 595 | //QString command; |
571 | 596 | ||
572 | if( fileDlg->result() == 1 ) | 597 | if( fileDlg->result() == 1 ) |