author | llornkcor <llornkcor> | 2003-04-15 12:11:22 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2003-04-15 12:11:22 (UTC) |
commit | d1b5bf7eeb365282356db49f49331c82f234086c (patch) (side-by-side diff) | |
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 @@ -35,25 +35,26 @@ #include <qcombobox.h> #include <qpopupmenu.h> #include <qtabwidget.h> #include <qtoolbutton.h> #include <qtabwidget.h> #include <qlineedit.h> #include <qlistview.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <dirent.h> - +#include <sys/sendfile.h> +#include <fcntl.h> void AdvancedFm::doDirChange() { ListClicked( CurrentView()->currentItem()); } void AdvancedFm::showMenuHidden() { if (b) { CurrentDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); OtherDir()->setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All); @@ -303,25 +304,25 @@ void AdvancedFm::copy() qApp->processEvents(); QStringList curFileList = getPath(); QDir *thisDir = CurrentDir(); QDir *thatDir = OtherDir(); bool doMsg=true; int count=curFileList.count(); if( count > 0) { if(count > 1 ){ QString msg; msg=tr("Really copy\n%1 files?").arg(count); - switch ( QMessageBox::warning(this,tr("Delete"),msg + switch ( QMessageBox::warning(this,tr("Copy"),msg ,tr("Yes"),tr("No"),0,0,1) ) { case 0: doMsg=false; break; case 1: return; break; }; } QString curFile, item, destFile; @@ -511,50 +512,74 @@ void AdvancedFm::move() QFile::remove(curFile); } } } setOtherTabCurrent(); populateView(); // populateLocalView(); } bool AdvancedFm::copyFile( const QString & src, const QString & dest ) { - char bf[ 50000 ]; - int bytesRead; - bool success = TRUE; - struct stat status; +// char bf[ 50000 ]; +// int bytesRead; + bool success = true; + struct stat status; + +// QFile s( src ); +// QFile d( dest ); + + int read_fd=0; + int write_fd=0; + struct stat stat_buf; + off_t offset = 0; + read_fd = ::open(src.latin1(), O_RDONLY); + if(read_fd != -1) { + fstat (read_fd, &stat_buf); + write_fd = ::open(dest.latin1(), O_WRONLY | O_CREAT, stat_buf.st_mode); + if(write_fd != -1) { + if(sendfile(write_fd, read_fd, &offset, stat_buf.st_size) == -1) { + success = false; + } + } else { + success = false; + } + } else { + success = false; + } - QFile s( src ); - QFile d( dest ); + ::close (read_fd); + ::close (write_fd); - if( s.open( IO_ReadOnly | IO_Raw ) && d.open( IO_WriteOnly | IO_Raw ) ) - { - while( (bytesRead = s.readBlock( bf, sizeof( bf ) )) == sizeof( bf ) ) - { - if( d.writeBlock( bf, sizeof( bf ) ) != sizeof( bf ) ){ - success = FALSE; - break; - } - } - if( success && (bytesRead > 0) ) - { - d.writeBlock( bf, bytesRead ); - } - } - else - { - success = FALSE; - } + +// if( s.open( IO_ReadOnly | IO_Raw ) && d.open( IO_WriteOnly | IO_Raw ) ) +// { +// while( (bytesRead = s.readBlock( bf, sizeof( bf ) )) == sizeof( bf ) ) +// { +// if( d.writeBlock( bf, sizeof( bf ) ) != sizeof( bf ) ){ +// success = FALSE; +// break; +// } +// } +// if( success && (bytesRead > 0) ) +// { +// d.writeBlock( bf, bytesRead ); +// } + +// } +// else +// { +// success = FALSE; +// } // Set file permissions if( stat( (const char *) src, &status ) == 0 ) { chmod( (const char *) dest, status.st_mode ); } return success; } void AdvancedFm::runCommand() { |