kcmshell renamed to kcmshell4 to fix co-installability between kdelibs3 and kdebase4...
[kdepim.git] / kmail / kmfolderdir.cpp
blob49e5539f6449e5ef491f287066658c45357d101f
1 // kmfolderdir.cpp
4 #include "kmfolderdir.h"
5 #include "kmfoldersearch.h"
6 #include "kmfoldercachedimap.h"
7 #include "kmfolder.h"
9 #include <assert.h>
10 #include <errno.h>
11 #include <klocale.h>
12 #include <kmessagebox.h>
13 #include <kdebug.h>
14 #include <kstandarddirs.h>
16 #include <QDir>
17 #include <QList>
18 #include <QByteArray>
20 //=============================================================================
21 //=============================================================================
22 KMFolderRootDir::KMFolderRootDir(KMFolderMgr* manager, const QString& path,
23 KMFolderDirType dirType)
24 : KMFolderDir( 0, 0, path, dirType ),
25 mPath( path ),
26 mManager( manager )
30 //-----------------------------------------------------------------------------
31 KMFolderRootDir::~KMFolderRootDir()
33 // WABA: We can't let KMFolderDir do this because by the time its
34 // desctructor gets called, KMFolderRootDir is already destructed
35 // Most notably the path.
36 clear();
39 //-----------------------------------------------------------------------------
40 void KMFolderRootDir::setPath(const QString& aPath)
42 mPath = aPath;
46 //-----------------------------------------------------------------------------
47 QString KMFolderRootDir::path() const
49 return mPath;
53 //-----------------------------------------------------------------------------
54 QString KMFolderRootDir::prettyUrl() const
56 if ( !mBaseURL.isEmpty() )
57 return i18n( mBaseURL.data() );
58 else
59 return QString();
63 //-----------------------------------------------------------------------------
64 void KMFolderRootDir::setBaseURL( const QByteArray &baseURL )
66 mBaseURL = baseURL;
70 //-----------------------------------------------------------------------------
71 KMFolderMgr* KMFolderRootDir::manager() const
73 return mManager;
77 //=============================================================================
78 //=============================================================================
79 KMFolderDir::KMFolderDir( KMFolder * owner, KMFolderDir* parent,
80 const QString& name, KMFolderDirType dirType )
81 : KMFolderNode( parent, name ), KMFolderNodeList(),
82 mOwner( owner ), mDirType( dirType )
86 //-----------------------------------------------------------------------------
87 KMFolderDir::~KMFolderDir()
89 clear();
90 qDeleteAll( *this );
94 //-----------------------------------------------------------------------------
95 KMFolder* KMFolderDir::createFolder(const QString& aFolderName, bool aSysFldr, KMFolderType aFolderType)
97 KMFolder* fld;
99 assert(!aFolderName.isEmpty());
100 // FIXME urgs, is this still needed
101 if (mDirType == KMImapDir)
102 fld = new KMFolder( this, aFolderName, KMFolderTypeImap );
103 else
104 fld = new KMFolder( this, aFolderName, aFolderType );
106 assert(fld != 0);
107 fld->setSystemFolder(aSysFldr);
109 bool inserted = false;
110 QListIterator<KMFolderNode*> it( *this);
111 int index = 0;
112 while ( it.hasNext() ) {
113 KMFolderNode* fNode = it.next();
114 if (fNode->name().toLower() > fld->name().toLower()) {
115 insert( index, fld );
116 inserted = true;
117 break;
119 ++index;
122 if ( !inserted )
123 append(fld);
125 fld->correctUnreadMsgsCount();
126 return fld;
130 //----------------------------------------------------------------------------
131 QString KMFolderDir::path() const
133 static QString p;
135 if (parent())
137 p = parent()->path();
138 p.append("/");
139 p.append(name());
141 else p = "";
143 return p;
147 //----------------------------------------------------------------------------
148 QString KMFolderDir::label() const
150 if ( mOwner )
151 return mOwner->label();
152 else
153 return QString();
157 //-----------------------------------------------------------------------------
158 QString KMFolderDir::prettyUrl() const
160 QString parentUrl;
161 if ( parent() )
162 parentUrl = parent()->prettyUrl();
163 if ( !parentUrl.isEmpty() )
164 return parentUrl + '/' + label();
165 else
166 return label();
170 //-----------------------------------------------------------------------------
171 bool KMFolderDir::reload(void)
173 QDir dir;
174 KMFolder* folder;
175 QFileInfo fileInfo;
176 QStringList diList;
177 QList<KMFolder*> folderList;
179 clear();
181 const QString fldPath = path();
182 dir.setFilter(QDir::Files | QDir::Dirs | QDir::Hidden);
183 dir.setNameFilters(QStringList("*"));
185 if (!dir.cd(fldPath))
187 QString msg = i18n("<qt>Cannot enter folder <b>%1</b>.</qt>", fldPath);
188 KMessageBox::information(0, msg);
189 return false;
192 const QFileInfoList fiList = dir.entryInfoList();
193 if (fiList.isEmpty())
195 QString msg = i18n("<qt>Folder <b>%1</b> is unreadable.</qt>", fldPath);
196 KMessageBox::information(0, msg);
197 return false;
200 Q_FOREACH( fileInfo, fiList )
202 const QString fname = fileInfo.fileName();
203 if( ( fname[0] == '.' ) && !fname.endsWith( ".directory" ) ) {
204 // ignore all hidden files except our subfolder containers
205 continue;
207 if( fname == ".directory" ) {
208 // ignore .directory files (not created by us)
209 continue;
211 // Collect subdirectories.
212 if ( fileInfo.isDir() &&
213 fname.startsWith( '.' ) && fname.endsWith( ".directory" ) ) {
214 diList.append(fname);
215 continue;
218 if ( mDirType == KMImapDir
219 && path().startsWith( KMFolderImap::cacheLocation() ) )
221 // Is the below needed for dimap as well?
222 if ( KMFolderImap::encodeFileName(
223 KMFolderImap::decodeFileName( fname ) ) == fname )
225 folder = new KMFolder( this, KMFolderImap::decodeFileName( fname ),
226 KMFolderTypeImap );
227 append(folder);
228 folderList.append(folder);
231 else if ( mDirType == KMDImapDir
232 && path().startsWith( KMFolderCachedImap::cacheLocation() ) )
234 if (fileInfo.isDir()) // a directory
236 // For this to be a cached IMAP folder, it must be in the KMail dimap
237 // subdir and must be have a uidcache file or be a maildir folder
238 QString maildir(fname + "/new");
239 QString imapcachefile = QString::fromLatin1(".%1.uidcache").arg(fname);
240 if ( dir.exists( imapcachefile) || dir.exists( maildir ) )
242 folder = new KMFolder( this, fname, KMFolderTypeCachedImap );
243 append(folder);
244 folderList.append(folder);
248 else if ( mDirType == KMSearchDir)
250 folder = new KMFolder( this, fname, KMFolderTypeSearch );
251 append(folder);
252 folderList.append(folder);
254 else if ( mDirType == KMStandardDir )
256 // This is neither an imap, dimap nor a search folder. Can be either
257 // mbox or maildir.
258 if (fileInfo.isDir())
260 // Maildir folder
261 if( dir.exists( fname + "/new" ) )
263 folder = new KMFolder( this, fname, KMFolderTypeMaildir );
264 append(folder);
265 folderList.append(folder);
268 else
270 // all other files are folders (at the moment ;-)
271 folder = new KMFolder( this, fname, KMFolderTypeMbox );
272 append(folder);
273 folderList.append(folder);
278 QList<KMFolder*>::const_iterator jt;
279 for ( jt = folderList.constBegin(); jt != folderList.constEnd(); ++jt )
281 folder = *jt;
282 for(QStringList::const_iterator it = diList.constBegin();
283 it != diList.constEnd();
284 ++it)
285 if (*it == '.' + folder->fileName() + ".directory")
287 KMFolderDir* folderDir = new KMFolderDir( folder, this, *it, mDirType);
288 folderDir->reload();
289 append(folderDir);
290 folder->setChild(folderDir);
291 break;
294 return true;
298 //-----------------------------------------------------------------------------
299 KMFolderNode* KMFolderDir::hasNamedFolder(const QString& aName)
301 QListIterator<KMFolderNode*> it(*this);
302 while ( it.hasNext() ) {
303 KMFolderNode* node = it.next();
304 if ( node && node->name() == aName ) {
305 return node;
308 return 0;
312 //-----------------------------------------------------------------------------
313 KMFolderMgr* KMFolderDir::manager() const
315 return parent()->manager();
319 #include "kmfolderdir.moc"