KDECore
kfoldermimetype.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kfoldermimetype.h"
00021 #include "kmimetype_p.h"
00022 #include <kdesktopfile.h>
00023 #include <kstandarddirs.h>
00024 #include <kconfiggroup.h>
00025 #include <dirent.h>
00026 #include <QtCore/QFile>
00027 #include <QtCore/QSet>
00028
00029 class KFolderMimeTypePrivate : public KMimeTypePrivate
00030 {
00031 public:
00032 K_SYCOCATYPE( KST_KFolderMimeType, KMimeTypePrivate )
00033
00034 KFolderMimeTypePrivate(const QString &s)
00035 : KMimeTypePrivate(s)
00036 {}
00037
00038 KFolderMimeTypePrivate(QDataStream& str, int offset)
00039 : KMimeTypePrivate(str, offset)
00040 {}
00041
00042 virtual QString comment(const KUrl &url) const;
00043 virtual QString iconName(const KUrl &url) const;
00044
00045 };
00046
00047
00048
00049
00050
00051
00052
00053 KFolderMimeType::KFolderMimeType( const QString& fullpath, const QString& name, const QString& comment )
00054 : KMimeType(*new KFolderMimeTypePrivate(fullpath), name, comment )
00055 {
00056 }
00057
00058 KFolderMimeType::KFolderMimeType( QDataStream& str, int offset )
00059 : KMimeType( *new KFolderMimeTypePrivate(str, offset))
00060 {
00061 }
00062
00063 KFolderMimeType::~KFolderMimeType()
00064 {
00065 }
00066
00067 QString KFolderMimeTypePrivate::iconName( const KUrl& _url ) const
00068 {
00069 if ( _url.isEmpty() || !_url.isLocalFile() )
00070 return KMimeTypePrivate::iconName( _url );
00071
00072 KUrl u( _url );
00073 u.addPath( ".directory" );
00074
00075 QString icon;
00076
00077
00078 if ( KStandardDirs::exists( u.path() ) )
00079 {
00080 KDesktopFile cfg( u.path() );
00081 KConfigGroup group = cfg.desktopGroup();
00082 icon = group.readEntry( "Icon" );
00083 QString empty_icon = group.readEntry( "EmptyIcon" );
00084
00085 if ( !empty_icon.isEmpty() )
00086 {
00087 bool isempty = false;
00088 DIR *dp = 0L;
00089 struct dirent *ep;
00090 dp = opendir( QFile::encodeName(_url.path()) );
00091 if ( dp )
00092 {
00093 QSet<QByteArray> entries;
00094
00095 ep=readdir( dp ); if ( ep ) entries.insert( ep->d_name );
00096 ep=readdir( dp ); if ( ep ) entries.insert( ep->d_name );
00097 if ( (ep=readdir( dp )) == 0L )
00098 isempty = true;
00099 else {
00100 entries.insert( ep->d_name );
00101 if ( readdir( dp ) == 0 ) {
00102
00103 isempty = entries.contains( "." ) &&
00104 entries.contains( ".." ) &&
00105 entries.contains( ".directory" );
00106 }
00107 }
00108 if (!isempty && !strcmp(ep->d_name, ".directory"))
00109 isempty = (readdir(dp) == 0L);
00110 closedir( dp );
00111 }
00112
00113 if ( isempty )
00114 return empty_icon;
00115 }
00116 }
00117
00118 if ( icon.isEmpty() )
00119 return KMimeTypePrivate::iconName( _url );
00120
00121 if ( icon.startsWith( "./" ) ) {
00122
00123
00124 KUrl v( _url );
00125 v.addPath( icon.mid( 2 ) );
00126 icon = v.path();
00127 }
00128
00129 return icon;
00130 }
00131
00132 QString KFolderMimeTypePrivate::comment( const KUrl& _url ) const
00133 {
00134 if ( _url.isEmpty() || !_url.isLocalFile() )
00135 return KMimeTypePrivate::comment( _url );
00136
00137 KUrl u( _url );
00138 u.addPath( ".directory" );
00139
00140 const KDesktopFile cfg( u.path() );
00141 QString comment = cfg.readComment();
00142 if ( comment.isEmpty() )
00143 return KMimeTypePrivate::comment( _url );
00144
00145 return comment;
00146 }