-rw-r--r-- | noncore/apps/advancedfm/advancedfm.cpp | 216 | ||||
-rw-r--r-- | noncore/apps/advancedfm/advancedfm.h | 6 |
2 files changed, 141 insertions, 81 deletions
diff --git a/noncore/apps/advancedfm/advancedfm.cpp b/noncore/apps/advancedfm/advancedfm.cpp index b5fcccf..ee3f736 100644 --- a/noncore/apps/advancedfm/advancedfm.cpp +++ b/noncore/apps/advancedfm/advancedfm.cpp @@ -59,12 +59,15 @@ #include <stdlib.h> #include <sys/stat.h> #include <dirent.h> #include <stdio.h> #include <time.h> #include <fcntl.h> +#include <mntent.h> +#include <string.h> +#include <errno.h> AdvancedFm::AdvancedFm( ) : QMainWindow( ) { setCaption( tr( "AdvancedFm" ) ); @@ -268,29 +271,23 @@ void AdvancedFm::tabChanged(QWidget *w) } } void AdvancedFm::populateLocalView() { -// QList<QListViewItem> * getSelectedItems( QListView * Local_View ); -// QListViewItemIterator it( Local_View ); -// for ( ; it.current(); ++it ) { -// if ( it.current()->isSelected() ) { -// QString strItem = it.current()->text(0); -// QString localFile = currentDir.canonicalPath()+"/"+strItem; -// QFileInfo fi(localFile); -// } -// } QPixmap pm; Local_View->clear(); currentDir.setSorting(/* QDir::Size*/ /*| QDir::Reversed | */QDir::DirsFirst); currentDir.setMatchAllDirs(TRUE); currentDir.setNameFilter(filterStr); QString fileL, fileS, fileDate; // qDebug(currentDir.canonicalPath()); - +// struct stat buf; +// mode_t mode; + QString fs= getFileSystemType((const QString &) currentDir.canonicalPath()); + setCaption("AdvancedFm :: "+fs); bool isDir=FALSE; const QFileInfoList *list = currentDir.entryInfoList( /*QDir::All*/ /*, QDir::SortByMask*/); QFileInfoListIterator it(*list); QFileInfo *fi; while ( (fi=it.current()) ) { if (fi->isSymLink() ) { @@ -301,66 +298,66 @@ void AdvancedFm::populateLocalView() fileL.sprintf( "%s -> %s", sym.fileName().data(),sym.absFilePath().data() ); fileDate = sym.lastModified().toString(); } else { fileS.sprintf( "%10li", fi->size() ); fileL.sprintf( "%s",fi->fileName().data() ); fileDate= fi->lastModified().toString(); - if( QDir(QDir::cleanDirPath(currentDir.canonicalPath()+"/"+fileL)).exists() ) { + if( QDir(QDir::cleanDirPath( currentDir.canonicalPath()+"/"+fileL)).exists() ) { fileL+="/"; isDir=TRUE; // qDebug( fileL); } } + QFileInfo fileInfo( currentDir.canonicalPath()+"/"+fileL); if(fileL !="./" && fi->exists()) { item= new QListViewItem( Local_View, fileL, fileS , fileDate); + if(isDir || fileL.find("/",0,TRUE) != -1) { - if( !QDir( fi->filePath() ).isReadable()) + + if( !QDir( fi->filePath() ).isReadable()) //is directory pm = Resource::loadPixmap( "lockedfolder" ); else pm= Resource::loadPixmap( "folder" ); - item->setPixmap( 0,pm ); - } else { -// if(fi->isExecutable()) { -// pm = Resource::loadPixmap( "exec"); -// item->setPixmap( 0,pm); -// } - if( !fi->isReadable() ) { - pm = Resource::loadPixmap( "locked" ); - item->setPixmap( 0,pm); - - } - else { - MimeType mt(fi->filePath()); - pm=mt.pixmap(); //sets the correct pixmap for mimetype - if(pm.isNull()) - pm = Resource::loadPixmap( "UnknownDocument-14" ); - item->setPixmap( 0,pm); - } +// item->setPixmap( 0,pm ); + } else if( fileInfo.isExecutable() || fs == "vfat" && fi->filePath().contains("/bin") ) { //is exec + pm = Resource::loadPixmap( "exec"); +// item->setPixmap( 0,pm); + } else if( !fi->isReadable() ) { + pm = Resource::loadPixmap( "locked" ); +// item->setPixmap( 0,pm); + } else { //everything else goes by mimetype + MimeType mt(fi->filePath()); + pm=mt.pixmap(); //sets the correct pixmap for mimetype + if(pm.isNull()) + pm = Resource::loadPixmap( "UnknownDocument-14" ); +// item->setPixmap( 0,pm); } - if( fileL.find("->",0,TRUE) != -1) { + item->setPixmap( 0,pm); + if( fi->isSymLink() &&fileL.find("->",0,TRUE) != -1) { // overlay link image pm= Resource::loadPixmap( "folder" ); QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); QPainter painter( &pm ); painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); pm.setMask( pm.createHeuristicMask( FALSE ) ); item->setPixmap( 0, pm); } - } isDir=FALSE; + } + isDir=FALSE; ++it; } if(currentDir.canonicalPath().find("dev",0,TRUE) != -1) { struct stat buf; - struct stat st; +// struct stat st; dev_t devT; - mode_t mode; +// mode_t mode; DIR *dir; - int fd = 0; +// int fd = 0; struct dirent *mydirent; - int i = 1; +// int i = 1; if((dir = opendir( currentDir.canonicalPath().latin1())) != NULL) while ((mydirent = readdir(dir)) != NULL) { lstat( mydirent->d_name, &buf); qDebug(mydirent->d_name); // mode = buf.st_mode; fileL.sprintf("%s", mydirent->d_name); @@ -398,12 +395,15 @@ void AdvancedFm::populateRemoteView() QPixmap pm; Remote_View->clear(); currentRemoteDir.setSorting(/* QDir::Size*/ /*| QDir::Reversed | */QDir::DirsFirst); currentRemoteDir.setMatchAllDirs(TRUE); currentRemoteDir.setNameFilter(filterStr); QString fileL, fileS, fileDate; + + QString fs= getFileSystemType((const QString &) currentRemoteDir.canonicalPath()); + setCaption("AdvancedFm :: "+fs); bool isDir=FALSE; const QFileInfoList *list = currentRemoteDir.entryInfoList( /*QDir::All*/ /*, QDir::SortByMask*/); QFileInfoListIterator it(*list); QFileInfo *fi; while ( (fi=it.current()) ) { if (fi->isSymLink() ){ @@ -430,50 +430,49 @@ void AdvancedFm::populateRemoteView() if(isDir || fileL.find("/",0,TRUE) != -1) { if( !QDir( fi->filePath() ).isReadable()) pm = Resource::loadPixmap( "lockedfolder" ); else pm= Resource::loadPixmap( "folder" ); - item->setPixmap( 0,pm ); +// item->setPixmap( 0,pm ); + } else if( fi->isExecutable() || fs == "vfat" && fi->filePath().contains("/bin") ) { + pm = Resource::loadPixmap( "exec"); +// item->setPixmap( 0,pm); + } else if( !fi->isReadable() ) { + pm = Resource::loadPixmap( "locked" ); +// item->setPixmap( 0,pm); } else { -// if(fi->isExecutable()) { -// pm = Resource::loadPixmap( "exec"); + MimeType mt(fi->filePath()); + pm=mt.pixmap(); //sets the correct pixmap for mimetype + if(pm.isNull()) + pm = Resource::loadPixmap( "UnknownDocument-14" ); // item->setPixmap( 0,pm); -// } - if( !fi->isReadable() ) { - pm = Resource::loadPixmap( "locked" ); - item->setPixmap( 0,pm); - } else { - MimeType mt(fi->filePath()); - pm=mt.pixmap(); //sets the correct pixmap for mimetype - if(pm.isNull()) - pm = Resource::loadPixmap( "UnknownDocument-14" ); - item->setPixmap( 0,pm); - } - } - if( fileL.find("->",0,TRUE) != -1) { - // overlay link image - pm= Resource::loadPixmap( "folder" ); - QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); - QPainter painter( &pm ); - painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); - pm.setMask( pm.createHeuristicMask( FALSE ) ); - item->setPixmap( 0, pm); } - } isDir=FALSE; + if( fi->isSymLink() && fileL.find("->",0,TRUE) != -1) { + // overlay link image + pm= Resource::loadPixmap( "folder" ); + QPixmap lnk = Resource::loadPixmap( "opie/symlink" ); + QPainter painter( &pm ); + painter.drawPixmap( pm.width()-lnk.width(), pm.height()-lnk.height(), lnk ); + pm.setMask( pm.createHeuristicMask( FALSE ) ); +// item->setPixmap( 0, pm); + } + item->setPixmap( 0, pm); + } + isDir=FALSE; ++it; } if(currentRemoteDir.canonicalPath().find("dev",0,TRUE) != -1) { struct stat buf; - struct stat st; - mode_t mode; +// struct stat st; +// mode_t mode; DIR *dir; - int fd = 0; +// int fd = 0; struct dirent *mydirent; - int i = 1; +// int i = 1; if((dir = opendir( currentRemoteDir.canonicalPath().latin1())) != NULL) while ((mydirent = readdir(dir)) != NULL) { lstat( mydirent->d_name, &buf); qDebug(mydirent->d_name); // mode = buf.st_mode; fileL.sprintf("%s", mydirent->d_name); @@ -657,12 +656,13 @@ void AdvancedFm::showLocalMenu(QListViewItem * item) m.insertSeparator(); m.insertItem( tr( "Rename" ), this, SLOT( localRename() )); m.insertItem( tr( "Copy" ), this, SLOT( copy() )); m.insertItem( tr( "Copy As" ), this, SLOT( copyAs() )); m.insertItem( tr( "Move" ), this, SLOT( move() )); m.insertSeparator(); + m.insertItem( tr( "Rescan" ), this, SLOT( populateLocalView() )); m.insertItem( tr( "Run Command" ), this, SLOT( runCommand() )); m.insertItem( tr( "File Info" ), this, SLOT( fileStatus() )); m.insertSeparator(); m.insertItem( tr( "Delete" ), this, SLOT( localDelete() )); m.insertSeparator(); m.insertItem( tr( "Set Permissions" ), this, SLOT( filePerms() )); @@ -692,12 +692,13 @@ void AdvancedFm::showRemoteMenu(QListViewItem * item) m.insertSeparator(); m.insertItem( tr( "Rename" ), this, SLOT( remoteRename() )); m.insertItem( tr( "Copy" ), this, SLOT( copy() )); m.insertItem( tr( "Copy As" ), this, SLOT( copyAs() )); m.insertItem( tr( "Move" ), this, SLOT( move() )); m.insertSeparator(); + m.insertItem( tr( "Rescan" ), this, SLOT( populateRemoteView() )); m.insertItem( tr( "Run Command" ), this, SLOT( runCommand() )); m.insertItem( tr( "File Info" ), this, SLOT( fileStatus() )); m.insertSeparator(); m.insertItem( tr( "Delete" ), this, SLOT( remoteDelete() )); m.insertSeparator(); m.insertItem( tr( "Set Permissions" ), this, SLOT( filePerms() )); @@ -710,45 +711,51 @@ void AdvancedFm::showRemoteMenu(QListViewItem * item) m.exec( QCursor::pos() ); } } void AdvancedFm::runThis() { // QFileInfo *fi; +QString fs; if (TabWidget->currentPageIndex() == 0) { QString curFile = Local_View->currentItem()->text(0); + + fs= getFileSystemType((const QString &) currentDir.canonicalPath()); QFileInfo fileInfo( currentDir.canonicalPath()+"/"+curFile); -// if(fileInfo.isExecutable()) { -// QCopEnvelope e("QPE/System", "execute(QString)" ); -// e << curFile; -// } else { + qDebug( fileInfo.owner()); + if( fileInfo.isExecutable() || fs == "vfat" && fileInfo.filePath().contains("/bin") ) { + QCopEnvelope e("QPE/System", "execute(QString)" ); + e << curFile; + } else { curFile = currentDir.canonicalPath()+"/"+curFile; DocLnk nf(curFile); QString execStr = nf.exec(); qDebug( execStr); if( execStr.isEmpty() ) { } else { nf.execute(); } -// } + } // MimeType mt( curFile); } else { QString curFile = Remote_View->currentItem()->text(0); + fs= getFileSystemType((const QString &) currentRemoteDir.canonicalPath()); + qDebug("Filesystemtype is "+fs); QFileInfo fileInfo( currentRemoteDir.canonicalPath()+"/"+curFile); -// if(fileInfo.isExecutable()) { -// QCopEnvelope e("QPE/System", "execute(QString)" ); -// e << curFile; -// } else { + if(fileInfo.isExecutable() || fs == "vfat" && fileInfo.filePath().contains("/bin") ) { + QCopEnvelope e("QPE/System", "execute(QString)" ); + e << curFile; + } else { curFile = currentRemoteDir.canonicalPath()+"/"+curFile; DocLnk nf(curFile); QString execStr = nf.exec(); qDebug(execStr); if( execStr.isEmpty() ) { } else { nf.execute(); } -// } + } // MimeType mt( curFile); } } void AdvancedFm::runText() { if (TabWidget->currentPageIndex() == 0) { @@ -1341,13 +1348,13 @@ void AdvancedFm::runCommand() { fileDlg->setInputText(curFile); fileDlg->exec(); QString command; if( fileDlg->result() == 1 ) { command = fileDlg->LineEdit1->text(); - int err=0; +// int err=0; Output *outDlg; outDlg = new Output(this, tr("AdvancedFm Output"),FALSE); outDlg->showMaximized(); outDlg->show(); qApp->processEvents(); FILE *fp; @@ -1399,13 +1406,13 @@ void AdvancedFm::fileStatus() { if (TabWidget->currentPageIndex() == 0) { curFile = Local_View->currentItem()->text(0); } else { curFile = Remote_View->currentItem()->text(0); } QString command = " stat -l "+ curFile +" 2>&1"; - int err=0; +// int err=0; Output *outDlg; outDlg = new Output(this, tr("AdvancedFm Output"),FALSE); outDlg->showMaximized(); outDlg->show(); qApp->processEvents(); FILE *fp; @@ -1516,17 +1523,13 @@ void AdvancedFm::keyReleaseEvent( QKeyEvent *e) case Key_8: break; case Key_9: break; case Key_0: break; - - - } - } void AdvancedFm::mkSym() { QString cmd; QStringList curFileList = getPath(); @@ -1564,8 +1567,61 @@ void AdvancedFm::QPEButtonPushed() { populateLocalView(); } else { currentRemoteDir.cd( current, TRUE); populateRemoteView(); } update(); +} +void AdvancedFm::parsetab(const QString &fileName) { + + fileSystemTypeList.clear(); + fsList.clear(); + struct mntent *me; +// if(fileName == "/etc/mtab") { + FILE *mntfp = setmntent( fileName.latin1(), "r" ); + if ( mntfp ) { + while ( (me = getmntent( mntfp )) != 0 ) { + QString deviceName = me->mnt_fsname; + QString filesystemType = me->mnt_type; + QString mountDir = me->mnt_dir; + if(deviceName != "none") { + if( fsList.contains(filesystemType) == 0 + & filesystemType.find("proc",0,TRUE) == -1 + & filesystemType.find("cramfs",0,TRUE) == -1 + & filesystemType.find("auto",0,TRUE) == -1) + fsList << filesystemType; +// deviceList << deviceName; +// qDebug(mountDir+"::"+filesystemType); + fileSystemTypeList << mountDir+"::"+filesystemType; + } + } + } + endmntent( mntfp ); } + +QString AdvancedFm::getFileSystemType(const QString ¤tText) { + parsetab("/etc/mtab"); //why did TT forget filesystem type? + QString current = currentText;//.right( currentText.length()-1); + QString baseFs; + for ( QStringList::Iterator it = fileSystemTypeList.begin(); it != fileSystemTypeList.end(); ++it ) { + QString temp = (*it); + QString path = temp.left(temp.find("::",0,TRUE) ); + path = path.right( path.length()-1); + if(path.isEmpty()) baseFs = temp.right( temp.length() - temp.find("::",0,TRUE) - 2); + if( current.find( path,0,TRUE) != -1 && !path.isEmpty()) { + return temp.right( temp.length() - temp.find("::",0,TRUE) - 2); + } + } + return baseFs; +} + + +// QList<QListViewItem> * getSelectedItems( QListView * Local_View ); +// QListViewItemIterator it( Local_View ); +// for ( ; it.current(); ++it ) { +// if ( it.current()->isSelected() ) { +// QString strItem = it.current()->text(0); +// QString localFile = currentDir.canonicalPath()+"/"+strItem; +// QFileInfo fi(localFile); +// } +// } diff --git a/noncore/apps/advancedfm/advancedfm.h b/noncore/apps/advancedfm/advancedfm.h index 5c2719e..90619ba 100644 --- a/noncore/apps/advancedfm/advancedfm.h +++ b/noncore/apps/advancedfm/advancedfm.h @@ -55,12 +55,13 @@ public: QPushButton *homeButton, *docButton, *cdUpButton, *sdButton, *cfButton, *qpeDirButton; QDir currentDir, currentRemoteDir; QComboBox *currentPathCombo; QString filterStr; QListViewItem * item; bool b; + QStringList fileSystemTypeList, fsList; int currentServerConfig; protected slots: void showLocalMenu( QListViewItem *); void showRemoteMenu( QListViewItem *); void doLocalCd(); void doRemoteCd(); @@ -99,13 +100,16 @@ protected slots: void switchToLocalTab(); void switchToRemoteTab(); protected: QGridLayout *tabLayout, *tabLayout_2, *tabLayout_3; QStringList remoteDirPathStringList, localDirPathStringList; - void keyReleaseEvent( QKeyEvent *); + void keyReleaseEvent( QKeyEvent *); + QString getFileSystemType(const QString &); + void parsetab(const QString &fileName); + protected slots: void homeButtonPushed(); void docButtonPushed(); void SDButtonPushed(); void CFButtonPushed(); void QPEButtonPushed(); |