summaryrefslogtreecommitdiff
authorkergoth <kergoth>2003-01-26 22:45:27 (UTC)
committer kergoth <kergoth>2003-01-26 22:45:27 (UTC)
commit954ff2a858b34a8249314340f799f0a74426d59c (patch) (side-by-side diff)
treef0b738dceaec14bba0347151db4f372d25cdf8e8
parent4ce67fbdfb5e82bbde3a8963d3e956567438689d (diff)
downloadopie-954ff2a858b34a8249314340f799f0a74426d59c.zip
opie-954ff2a858b34a8249314340f799f0a74426d59c.tar.gz
opie-954ff2a858b34a8249314340f799f0a74426d59c.tar.bz2
Added two missing dir.exists() checks, without which a segfault occurs if m_currentDir doesnt exist.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/ofileselector.cc148
1 files changed, 76 insertions, 72 deletions
diff --git a/libopie/ofileselector.cc b/libopie/ofileselector.cc
index 6a6a300..7481360 100644
--- a/libopie/ofileselector.cc
+++ b/libopie/ofileselector.cc
@@ -693,607 +693,611 @@ void OFileSelector::addFile(const QString &/*mime*/, QFileInfo *info, bool symli
return;
QPixmap pix = type.pixmap();
QString dir;
QString name;
bool locked;
if( pix.isNull() )
pix = Resource::loadPixmap( "UnknownDocument-14");
dir = info->dirPath( true );
if( symlink )
name = info->fileName() + " -> " +info->dirPath() + "/" + info->readLink();
else {
name = info->fileName();
if( ( m_mode == OPEN && !info->isReadable() )||
( m_mode == SAVE && !info->isWritable() ) ){
locked = true; pix = Resource::loadPixmap("locked");
}
}
new OFileSelectorItem( m_View, pix, name,
info->lastModified().toString(),
QString::number( info->size() ),
dir, locked );
}
void OFileSelector::addDir(const QString &/*mime*/, QFileInfo *info, bool symlink )
{
if(!m_dir)
return;
if( m_selector == EXTENDED_ALL || m_selector == EXTENDED ){
bool locked = false;
QString name;
QPixmap pix;
if( ( m_mode == OPEN && !info->isReadable() ) || ( m_mode == SAVE && !info->isWritable() ) ){
locked = true;
if( symlink )
pix = (*m_pixmaps)["symlinkedlocked"];
else
pix = Resource::loadPixmap("lockedfolder");
}else { // readable
pix = symlink ? (*m_pixmaps)["dirsymlink"] : Resource::loadPixmap("folder") ;
}
name = symlink ? info->fileName() + "->" + info->dirPath(true) + "/" +info->readLink() : info->fileName() ;
new OFileSelectorItem( m_View, pix, name,
info->lastModified().toString(),
QString::number( info->size() ),
info->dirPath( true ), locked,
true );
}// else CUSTOM View
}
void OFileSelector::delItems()
{
}
void OFileSelector::initializeName()
{
/** Name Layout Line
* This is the Layout line arranged in
* horizontal way each components
* are next to each other
* but we will only do this if
* we didn't initialize a while ago.
*/
if( m_boxName == 0 ){
m_boxName = new QHBox( this ); // remove this this? or use a QHBox
m_fnLabel = new QLabel( m_boxName );
m_fnLabel->setText( tr("Name:") );
m_edit = new QLineEdit( m_boxName );
m_edit->setText( m_name );
//m_boxName->addWidget( m_fnLabel );
m_boxName->setMargin( 5 );
m_boxName->setSpacing( 8 );
//m_boxName->setStretchFactor(m_edit, 100 ); // 100 is stretch factor
m_lay->addWidget( m_boxName, 0 ); // add it to the topLevel layout
}// else we already initialized
// maybe show the components?
//
}
void OFileSelector::initializeYes()
{
/** The Save Cancel bar
*
*/
if( m_boxOk == 0 ){
m_boxOk = new QHBox( this );
m_ok = new QPushButton( tr("&Save"),m_boxOk , "save" );
m_cancel = new QPushButton( tr("C&ancel"), m_boxOk, "cancel" );
//m_boxOk->addWidget( m_ok );
//m_boxOk->addWidget( m_cancel );
m_boxOk->setMargin( 5 );
m_boxOk->setSpacing( 10 );
m_lay->addWidget( m_boxOk, 0 );
connect( m_ok, SIGNAL( clicked() ),
this, SLOT(slotOk() ) );
connect( m_cancel, SIGNAL( clicked() ),
this, SLOT( slotCancel() ) );
}
}
/*
* OK m_mimeCheck is a QComboBox we now want to fill
* out that combobox
* if automime we need to update the mimetypes
*/
void OFileSelector::updateMimeCheck() {
m_mimeCheck->clear();
if (m_autoMime ) {
//m_mimeCheck->insertItem( tr("All") );
updateMimes();
}
QMap<QString, QStringList>::Iterator it;
for (it = m_mimetypes.begin(); it != m_mimetypes.end(); ++it ) {
m_mimeCheck->insertItem( it.key() );
}
}
void OFileSelector::initializeChooser()
{
if( m_boxView == 0 ){
m_boxView = new QHBox( this );
m_viewCheck = new QComboBox( m_boxView, "view check");
m_mimeCheck = new QComboBox( m_boxView, "mime check");
m_boxView->setSpacing( 8 );
m_lay->addWidget(m_boxView, 0 );
m_viewCheck->insertItem( tr("Documents") );
m_viewCheck->insertItem( tr("Files") );
m_viewCheck->insertItem( tr("All Files") );
updateMimeCheck();
connect( m_viewCheck, SIGNAL( activated(const QString & ) ),
this, SLOT( slotViewCheck(const QString & ) ) );
connect( m_mimeCheck, SIGNAL( activated(const QString & ) ),
this, SLOT( slotMimeCheck( const QString & ) ) );
}
}
void OFileSelector::initializeListView()
{
qWarning("initializeListView");
if( m_pseudo == 0 ){
qWarning("init");
m_pseudo = new QWidget( m_stack, "Pseudo Widget");
m_pseudoLayout = new QVBoxLayout( m_pseudo );
// toolbar
m_boxToolbar = new QHBox( m_pseudo );
m_boxToolbar->setSpacing(0 ); // next to each other please
// toolbar members
{
// location QComboBox
m_location = new QComboBox( m_boxToolbar );
m_location->setEditable( TRUE );
m_location->setDuplicatesEnabled( FALSE );
connect( m_location, SIGNAL(activated(const QString &) ),
this, SLOT( slotLocationActivated(const QString &) ) );
connect( m_location->lineEdit(), SIGNAL(returnPressed() ),
this, SLOT(locationComboChanged() ) );
// UP Button
m_up = new QPushButton(Resource::loadIconSet("up"),"",
m_boxToolbar,"cdUpButton");
m_up->setFixedSize( QSize( 20, 20 ) );
connect(m_up ,SIGNAL(clicked()),this,SLOT(cdUP() ) );
m_up->setFlat(TRUE);
// Home Button
m_homeButton = new QPushButton(Resource::loadIconSet("home") ,
"", m_boxToolbar);
m_homeButton->setFixedSize( QSize( 20, 20 ) );
connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotHome() ) );
m_homeButton->setFlat(TRUE);
// Documents Button
m_docButton = new QPushButton(Resource::loadIconSet("DocsIcon"),"",
m_boxToolbar,"docsButton");
m_docButton->setFixedSize( QSize( 20, 20 ) );
connect(m_homeButton,SIGNAL(clicked()),this,SLOT(slotDoc() ) );
m_docButton->setFlat(TRUE);
// Close button
m_close = new QPushButton( Resource::loadIconSet( "close"), "",
m_boxToolbar );
connect( m_close, SIGNAL(clicked() ), this, SIGNAL(closeMe() ) );
m_close->setFixedSize( 20, 20 );
m_boxToolbar->setFixedHeight( 20 );
m_pseudoLayout->addWidget(m_boxToolbar );
// let;s fill the Location ComboBox
StorageInfo storage;
const QList<FileSystem> &fs = storage.fileSystems();
QListIterator<FileSystem> it ( fs );
for( ; it.current(); ++it ){
const QString disk = (*it)->name();
const QString path = (*it)->path();
m_location->insertItem(path+ "<-"+disk );
}
int count = m_location->count();
m_location->insertItem( m_currentDir );
m_location->setCurrentItem( count );
// due to the New and Close button we can not simply hide m_boxToolBar to not show it
if( !m_shTool ){
m_location->hide( );
m_up->hide( );
m_homeButton->hide( );
m_docButton->hide( );
}
if(!m_shClose )
m_close->hide();
//if(!m_shNew)
//m_close->hide();
} // off toolbar
// the Main ListView
// make a QWidgetStack first so Views can share the Toolbar
m_View = new QListView( m_pseudo, "Extended view");
QPEApplication::setStylusOperation( m_View->viewport(),
QPEApplication::RightOnHold);
m_View->addColumn(" " );
m_View->addColumn(tr("Name"), 135 );
m_View->addColumn(tr("Size"), -1 );
m_View->addColumn(tr("Date"), 60 );
m_View->addColumn(tr("Mime Type"), -1 );
QHeader *header = m_View->header();
header->hide();
m_View->setSorting( 1 );
m_View->setAllColumnsShowFocus( TRUE );
connect(m_View, SIGNAL(selectionChanged() ),
this, SLOT(slotSelectionChanged() ) );
connect(m_View, SIGNAL(currentChanged(QListViewItem *) ),
this, SLOT(slotCurrentChanged(QListViewItem * ) ) );
connect(m_View, SIGNAL(mouseButtonClicked(int, QListViewItem*, const QPoint &, int) ),
this, SLOT(slotClicked( int, QListViewItem *, const QPoint &, int) ) );
connect(m_View, SIGNAL(mouseButtonPressed(int, QListViewItem *, const QPoint &, int )),
this, SLOT(slotRightButton(int, QListViewItem *, const QPoint &, int ) ) );
m_pseudoLayout->addWidget( m_View, 288 );
m_stack->addWidget( m_pseudo, EXTENDED );
}
}
void OFileSelector::initializePerm()
{
if( m_checkPerm == 0 ){
m_checkPerm = new QCheckBox(tr("Ser Permission"), this, "perm");
m_checkPerm->setChecked( false );
m_lay->addWidget( m_checkPerm );
}
}
void OFileSelector::initPics()
{
m_pixmaps = new QMap<QString,QPixmap>;
QPixmap 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 ) );
m_pixmaps->insert("dirsymlink", pm );
QPixmap pm2 = Resource::loadPixmap( "lockedfolder" );
QPainter pen(&pm2 );
pen.drawPixmap(pm2.width()-lnk.width(), pm2.height()-lnk.height(), lnk );
pm2.setMask( pm2.createHeuristicMask( FALSE ) );
m_pixmaps->insert("symlinkedlocked", pm2 );
}
// if a mime complies with the m_mimeCheck->currentItem
bool OFileSelector::compliesMime( const QString &path, const QString &mime )
{
if( mime == "All" )
return true;
MimeType type( path );
if( type.id() == mime )
return true;
return false;
}
/* check if the mimetype in mime
* complies with the one which is current
*/
/*
* We've the mimetype of the file
* We need to get the stringlist of the current mimetype
*
* mime = image/jpeg
* QStringList = 'image/*'
* or QStringList = image/jpeg;image/png;application/x-ogg
* or QStringList = application/x-ogg;image/*;
* with all these mime filters it should get acceptes
* to do so we need to look if mime is contained inside
* the stringlist
* if it's contained return true
* if not ( I'm no RegExp expert at all ) we'll look if a '/*'
* is contained in the mimefilter and then we will
* look if both are equal until the '/'
*/
bool OFileSelector::compliesMime( const QString& mime ) {
qWarning("mimetype is %s", mime.latin1() );
QString currentText;
if (m_shChooser )
currentText = m_mimeCheck->currentText();
qWarning("current text is %s", currentText.latin1() );
QMap<QString, QStringList>::Iterator it;
QStringList list;
if ( currentText == tr("All") ) return true;
else if ( currentText.isEmpty() && !m_mimetypes.isEmpty() ) {
it = m_mimetypes.begin();
list = it.data();
}else if ( currentText.isEmpty() ) return true;
else{
it = m_mimetypes.find(currentText );
if ( it == m_mimetypes.end() ) qWarning("not there"), list << currentText;
else qWarning("found"), list = it.data();
}
// dump it now
//for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
// qWarning( "%s", (*it).latin1() );
//}
if ( list.contains(mime) ) return true;
qWarning("list doesn't contain it ");
QStringList::Iterator it2;
int pos;
for ( it2 = list.begin(); it2 != list.end(); ++it2 ) {
pos = (*it2).findRev("/*");
if ( pos >= 0 ) {
if ( mime.contains( (*it2).left(pos) ) ) return true;
}
}
return false;
}
void OFileSelector::slotFileSelected( const QString &string )
{
if( m_shLne )
m_edit->setText( string );
emit fileSelected( string );
}
void OFileSelector::slotFileBridgeSelected( const DocLnk &lnk )
{
slotFileSelected( lnk.name() );
emit fileSelected( lnk );
}
void OFileSelector::slotSelectionChanged()
{
}
void OFileSelector::slotCurrentChanged(QListViewItem* item )
{
if( item == 0 )
return;
if( m_selector == EXTENDED || m_selector == EXTENDED_ALL ) {
OFileSelectorItem *sel = (OFileSelectorItem*) item; // start to use the C++ casts ;)
qWarning("current changed");
if(!sel->isDir() ){
if( m_shLne )
m_edit->setText( sel->text(1) );
if (m_mode == FILESELECTOR ) {
QStringList str = QStringList::split("->", sel->text(1) );
QString path =sel->directory() + "/" + str[0].stripWhiteSpace();
emit fileSelected(path );
DocLnk lnk( path );
emit fileSelected(lnk );
}
}
}
}
void OFileSelector::slotClicked( int button, QListViewItem *item, const QPoint &, int)
{
if ( item == 0 )
return;
if( button != Qt::LeftButton )
return;
switch( m_selector ){
default:
break;
case EXTENDED: // fall through
case EXTENDED_ALL:{
OFileSelectorItem *sel = (OFileSelectorItem*)item;
if(!sel->isLocked() ){
QStringList str = QStringList::split("->", sel->text(1) );
if( sel->isDir() ){
cd( sel->directory() + "/" + str[0].stripWhiteSpace() );
// if MODE Dir m_shLne set the Text
}else{
if( m_shLne )
m_edit->setText( str[0].stripWhiteSpace() );
qWarning("selected here in slot clicked");
emit fileSelected( sel->directory() + "/" + str[0].stripWhiteSpace() );
DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() );
qWarning("file selected");
emit fileSelected( lnk );
}
}
break;
}
}
}
void OFileSelector::slotRightButton(int button, QListViewItem *item, const QPoint &, int )
{
if( item == 0 )
return;
if( button != Qt::RightButton )
return;
slotContextMenu( item );
}
void OFileSelector::slotContextMenu( QListViewItem * /*item*/)
{
}
void OFileSelector::slotChangedDir()
{
OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem();
if(sel->isDir() ){
QStringList str = QStringList::split("->", sel->text(1) );
cd( sel->directory() + "/" + str[0].stripWhiteSpace() );
}
}
void OFileSelector::slotOpen()
{
OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem();
if(!sel->isDir() ){
QStringList str = QStringList::split("->", sel->text(1) );
slotFileSelected( sel->directory() +"/" +str[0].stripWhiteSpace() );
qWarning("slot open");
// DocLnk lnk( sel->directory() + "/" + str[0].stripWhiteSpace() );
//emit fileSelected( lnk );
}
}
void OFileSelector::slotRescan()
{
}
void OFileSelector::slotRename()
{
reparse();
}
void OFileSelector::slotDelete()
{
OFileSelectorItem *sel = (OFileSelectorItem*)m_View->currentItem();
QStringList list = QStringList::split("->", sel->text(1) );
if( sel->isDir() ){
QString str = QString::fromLatin1("rm -rf ") + sel->directory() +"/" + list[0]; //better safe than sorry
switch ( QMessageBox::warning(this,tr("Delete"),tr("Do you really want to delete\n")+list[0],
tr("Yes"),tr("No"),0,1,1) ) {
case 0:
::system(str.utf8().data() );
break;
}
} else {
QFile::remove( list[0] );
}
m_View->takeItem( sel );
delete sel;
}
void OFileSelector::cdUP()
{
QDir dir( m_currentDir );
dir.cdUp();
if(dir.exists() ){
m_currentDir = dir.absPath();
reparse();
int count = m_location->count();
slotInsertLocationPath( m_currentDir, count);
m_location->setCurrentItem( indexByString( m_location, m_currentDir));
//this wont work in all instances
// FIXME
}
}
void OFileSelector::slotHome()
{
cd(QDir::homeDirPath() );
}
void OFileSelector::slotDoc()
{
cd(QPEApplication::documentDir() );
}
void OFileSelector::slotNavigate( )
{
}
// fill the View with life
void OFileSelector::reparse()
{
if( m_selector == NORMAL )
return;
if( m_selector == EXTENDED || m_selector == EXTENDED_ALL )
m_View->clear();
else // custom view
; // currentView()->clear();
if( m_shChooser)
qWarning("reparse %s", m_mimeCheck->currentText().latin1() );
QString currentMimeType;
// let's update the mimetype
if( m_autoMime ){
m_mimetypes.clear();
// ok we can change mimetype so we need to be able to give a selection
if( m_shChooser ) {
currentMimeType = m_mimeCheck->currentText();
m_mimeCheck->clear();
// let's find possible mimetypes
QDir dir( m_currentDir );
- dir.setFilter( QDir::Files | QDir::Readable );
- dir.setSorting( QDir::Size );
- const QFileInfoList *list = dir.entryInfoList();
- QFileInfoListIterator it( *list );
- QFileInfo *fi;
- while( (fi=it.current() ) ) {
- if( fi->extension() == QString::fromLatin1("desktop") ){
- ++it;
- continue;
- }
- MimeType type( fi->absFilePath() );
- if( !m_mimetypes.contains( type.id() ) ){
- //qWarning("Type %s", type.id().latin1() );
- m_mimetypes.insert( type.id(), type.id() );
- }
+ if( dir.exists() ){
+ dir.setFilter( QDir::Files | QDir::Readable );
+ dir.setSorting( QDir::Size );
+ const QFileInfoList *list = dir.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *fi;
+ while( (fi=it.current() ) ) {
+ if( fi->extension() == QString::fromLatin1("desktop") ){
+ ++it;
+ continue;
+ }
+ MimeType type( fi->absFilePath() );
+ if( !m_mimetypes.contains( type.id() ) ){
+ //qWarning("Type %s", type.id().latin1() );
+ m_mimetypes.insert( type.id(), type.id() );
+ }
- ++it;
+ ++it;
+ }
+ // add them to the chooser
+ updateMimeCheck();
+ m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) );
+ currentMimeType = m_mimeCheck->currentText();
}
- // add them to the chooser
- updateMimeCheck();
- m_mimeCheck->setCurrentItem( indexByString( m_mimeCheck, currentMimeType ) );
- currentMimeType = m_mimeCheck->currentText();
}
}else { // no autoMime
// let the mimetype be set from out side the m_mimeCheck FEATURE
if( m_shChooser ){
currentMimeType = m_mimeCheck->currentText();
// updateMimeCheck();
}
}
// now we got our mimetypes we can add the files
QDir dir( m_currentDir );
- int sort;
- if ( m_case )
- sort = (QDir::IgnoreCase | QDir::Name | QDir::DirsFirst | QDir::Reversed);
- else
- sort = (QDir::Name | QDir::DirsFirst | QDir::Reversed);
- dir.setSorting( sort );
-
- int filter;
- if( m_selector == EXTENDED_ALL /*|| m_selector ==CUSTOM_ALL */ ){
- filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All;
- }else
- filter = QDir::Files | QDir::Dirs | QDir::All;
- dir.setFilter( filter );
-
- // now go through all files
- const QFileInfoList *list = dir.entryInfoList();
- QFileInfoListIterator it( *list );
- QFileInfo *fi;
- while( (fi=it.current() ) ){
- //qWarning("True and only" );
- if( fi->fileName() == QString::fromLatin1("..") || fi->fileName() == QString::fromLatin1(".") ){
- //qWarning(".. or ." );
+ if( dir.exists() ){
+ int sort;
+ if ( m_case )
+ sort = (QDir::IgnoreCase | QDir::Name | QDir::DirsFirst | QDir::Reversed);
+ else
+ sort = (QDir::Name | QDir::DirsFirst | QDir::Reversed);
+ dir.setSorting( sort );
+
+ int filter;
+ if( m_selector == EXTENDED_ALL /*|| m_selector ==CUSTOM_ALL */ ){
+ filter = QDir::Files | QDir::Dirs | QDir::Hidden | QDir::All;
+ }else
+ filter = QDir::Files | QDir::Dirs | QDir::All;
+ dir.setFilter( filter );
+
+ // now go through all files
+ const QFileInfoList *list = dir.entryInfoList();
+ QFileInfoListIterator it( *list );
+ QFileInfo *fi;
+ while( (fi=it.current() ) ){
+ //qWarning("True and only" );
+ if( fi->fileName() == QString::fromLatin1("..") || fi->fileName() == QString::fromLatin1(".") ){
+ //qWarning(".. or ." );
+ ++it;
+ continue;
+ }
+ if( fi->isSymLink() ){
+ QString file = fi->dirPath( true ) + "/" + fi->readLink();
+ for( int i = 0; i<=4; i++) { // 5 tries to prevent dos
+ QFileInfo info( file );
+ if( !info.exists() ){
+ addSymlink( currentMimeType, fi, TRUE );
+ break;
+ }else if( info.isDir() ){
+ addDir( currentMimeType, fi, TRUE );
+ break;
+ }else if( info.isFile() ){
+ addFile( currentMimeType, fi, TRUE );
+ break;
+ }else if( info.isSymLink() ){
+ file = info.dirPath(true ) + "/" + info.readLink() ;
+ break;
+ }else if( i == 4){
+ addSymlink( currentMimeType, fi );
+ }
+ } // off for loop
+ }else if( fi->isDir() ){
+ addDir( currentMimeType, fi );
+ }else if( fi->isFile() ){
+ addFile( currentMimeType, fi );
+ }
+ //qWarning( "%s", fi->fileName().latin1() );
++it;
- continue;
- }
- if( fi->isSymLink() ){
- QString file = fi->dirPath( true ) + "/" + fi->readLink();
- for( int i = 0; i<=4; i++) { // 5 tries to prevent dos
- QFileInfo info( file );
- if( !info.exists() ){
- addSymlink( currentMimeType, fi, TRUE );
- break;
- }else if( info.isDir() ){
- addDir( currentMimeType, fi, TRUE );
- break;
- }else if( info.isFile() ){
- addFile( currentMimeType, fi, TRUE );
- break;
- }else if( info.isSymLink() ){
- file = info.dirPath(true ) + "/" + info.readLink() ;
- break;
- }else if( i == 4){
- addSymlink( currentMimeType, fi );
- }
- } // off for loop
- }else if( fi->isDir() ){
- addDir( currentMimeType, fi );
- }else if( fi->isFile() ){
- addFile( currentMimeType, fi );
- }
- //qWarning( "%s", fi->fileName().latin1() );
- ++it;
- } // of while loop
+ } // of while loop
+ } // if ( dir.exists() )
m_View->sort();
if( m_shTool ){
m_location->insertItem( m_currentDir );
}
// reenable painting and updates
}