Merge pull request #3678 from Karlson2k/cleanup_smb_01
[vuplus_xbmc] / xbmc / FileItem.h
1 /*!
2  \file FileItem.h
3  \brief
4  */
5 #pragma once
6
7 /*
8  *      Copyright (C) 2005-2013 Team XBMC
9  *      http://xbmc.org
10  *
11  *  This Program is free software; you can redistribute it and/or modify
12  *  it under the terms of the GNU General Public License as published by
13  *  the Free Software Foundation; either version 2, or (at your option)
14  *  any later version.
15  *
16  *  This Program is distributed in the hope that it will be useful,
17  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  *  GNU General Public License for more details.
20  *
21  *  You should have received a copy of the GNU General Public License
22  *  along with XBMC; see the file COPYING.  If not, see
23  *  <http://www.gnu.org/licenses/>.
24  *
25  */
26
27 #include "guilib/GUIListItem.h"
28 #include "utils/Archive.h"
29 #include "utils/ISerializable.h"
30 #include "utils/ISortable.h"
31 #include "XBDateTime.h"
32 #include "utils/SortUtils.h"
33 #include "utils/LabelFormatter.h"
34 #include "GUIPassword.h"
35 #include "threads/CriticalSection.h"
36
37 #include <vector>
38 #include "boost/shared_ptr.hpp"
39
40 namespace MUSIC_INFO
41 {
42   class CMusicInfoTag;
43 }
44 class CVideoInfoTag;
45 namespace EPG
46 {
47   class CEpgInfoTag;
48 }
49 namespace PVR
50 {
51   class CPVRChannel;
52   class CPVRRecording;
53   class CPVRTimerInfoTag;
54 }
55 class CPictureInfoTag;
56
57 class CAlbum;
58 class CArtist;
59 class CSong;
60 class CGenre;
61
62 class CURL;
63
64 /* special startoffset used to indicate that we wish to resume */
65 #define STARTOFFSET_RESUME (-1)
66
67 class CMediaSource;
68
69 enum EFileFolderType {
70   EFILEFOLDER_TYPE_ALWAYS     = 1<<0,
71   EFILEFOLDER_TYPE_ONCLICK    = 1<<1,
72   EFILEFOLDER_TYPE_ONBROWSE   = 1<<2,
73
74   EFILEFOLDER_MASK_ALL        = 0xff,
75   EFILEFOLDER_MASK_ONCLICK    = EFILEFOLDER_TYPE_ALWAYS
76                               | EFILEFOLDER_TYPE_ONCLICK,
77   EFILEFOLDER_MASK_ONBROWSE   = EFILEFOLDER_TYPE_ALWAYS
78                               | EFILEFOLDER_TYPE_ONCLICK
79                               | EFILEFOLDER_TYPE_ONBROWSE,
80 };
81
82 /*!
83   \brief Represents a file on a share
84   \sa CFileItemList
85   */
86 class CFileItem :
87   public CGUIListItem, public IArchivable, public ISerializable, public ISortable
88 {
89 public:
90   CFileItem(void);
91   CFileItem(const CFileItem& item);
92   CFileItem(const CGUIListItem& item);
93   CFileItem(const CStdString& strLabel);
94   CFileItem(const CStdString& strPath, bool bIsFolder);
95   CFileItem(const CSong& song);
96   CFileItem(const CStdString &path, const CAlbum& album);
97   CFileItem(const CArtist& artist);
98   CFileItem(const CGenre& genre);
99   CFileItem(const MUSIC_INFO::CMusicInfoTag& music);
100   CFileItem(const CVideoInfoTag& movie);
101   CFileItem(const EPG::CEpgInfoTag& tag);
102   CFileItem(const PVR::CPVRChannel& channel);
103   CFileItem(const PVR::CPVRRecording& record);
104   CFileItem(const PVR::CPVRTimerInfoTag& timer);
105   CFileItem(const CMediaSource& share);
106   virtual ~CFileItem(void);
107   virtual CGUIListItem *Clone() const { return new CFileItem(*this); };
108
109   const CStdString &GetPath() const { return m_strPath; };
110   void SetPath(const CStdString &path) { m_strPath = path; };
111
112   void Reset();
113   const CFileItem& operator=(const CFileItem& item);
114   virtual void Archive(CArchive& ar);
115   virtual void Serialize(CVariant& value) const;
116   virtual void ToSortable(SortItem &sortable, Field field) const;
117   void ToSortable(SortItem &sortable, const Fields &fields) const;
118   virtual bool IsFileItem() const { return true; };
119
120   bool Exists(bool bUseCache = true) const;
121   
122   /*!
123    \brief Check whether an item is an optical media folder or its parent. 
124     This will return the non-empty path to the playable entry point of the media
125     one or two levels down (VIDEO_TS.IFO for DVDs or index.bdmv for BDs). 
126     The returned path will be empty if folder does not meet this criterion.
127    \return non-empty string if item is optical media folder, empty otherwise. 
128    */
129   std::string GetOpticalMediaPath() const;
130   /*!
131    \brief Check whether an item is a video item. Note that this returns true for
132     anything with a video info tag, so that may include eg. folders.
133    \return true if item is video, false otherwise. 
134    */
135   bool IsVideo() const;
136
137   bool IsDiscStub() const;
138
139   /*!
140    \brief Check whether an item is a picture item. Note that this returns true for
141     anything with a picture info tag, so that may include eg. folders.
142    \return true if item is picture, false otherwise. 
143    */
144   bool IsPicture() const;
145   bool IsLyrics() const;
146
147   /*!
148    \brief Check whether an item is an audio item. Note that this returns true for
149     anything with a music info tag, so that may include eg. folders.
150    \return true if item is audio, false otherwise. 
151    */
152   bool IsAudio() const;
153
154   bool IsKaraoke() const;
155   bool IsCUESheet() const;
156   bool IsInternetStream(const bool bStrictCheck = false) const;
157   bool IsPlayList() const;
158   bool IsSmartPlayList() const;
159   bool IsLibraryFolder() const;
160   bool IsPythonScript() const;
161   bool IsPlugin() const;
162   bool IsScript() const;
163   bool IsAddonsPath() const;
164   bool IsSourcesPath() const;
165   bool IsNFO() const;
166   bool IsDVDImage() const;
167   bool IsOpticalMediaFile() const;
168   bool IsDVDFile(bool bVobs = true, bool bIfos = true) const;
169   bool IsBDFile() const;
170   bool IsRAR() const;
171   bool IsAPK() const;
172   bool IsZIP() const;
173   bool IsCBZ() const;
174   bool IsCBR() const;
175   bool IsISO9660() const;
176   bool IsCDDA() const;
177   bool IsDVD() const;
178   bool IsOnDVD() const;
179   bool IsOnLAN() const;
180   bool IsHD() const;
181   bool IsNfs() const;  
182   bool IsAfp() const;    
183   bool IsRemote() const;
184   bool IsSmb() const;
185   bool IsURL() const;
186   bool IsDAAP() const;
187   bool IsStack() const;
188   bool IsMultiPath() const;
189   bool IsMusicDb() const;
190   bool IsVideoDb() const;
191   bool IsEPG() const;
192   bool IsPVRChannel() const;
193   bool IsPVRRecording() const;
194   bool IsPVRTimer() const;
195   bool IsType(const char *ext) const;
196   bool IsVirtualDirectoryRoot() const;
197   bool IsReadOnly() const;
198   bool CanQueue() const;
199   void SetCanQueue(bool bYesNo);
200   bool IsParentFolder() const;
201   bool IsFileFolder(EFileFolderType types = EFILEFOLDER_MASK_ALL) const;
202   bool IsRemovable() const;
203   bool IsTuxBox() const;
204   bool IsMythTV() const;
205   bool IsHDHomeRun() const;
206   bool IsSlingbox() const;
207   bool IsVTP() const;
208   bool IsPVR() const;
209   bool IsLiveTV() const;
210   bool IsRSS() const;
211   bool IsAndroidApp() const;
212
213   void RemoveExtension();
214   void CleanString();
215   void FillInDefaultIcon();
216   void SetFileSizeLabel();
217   virtual void SetLabel(const CStdString &strLabel);
218   CURL GetAsUrl() const;
219   int GetVideoContentType() const; /* return VIDEODB_CONTENT_TYPE, but don't want to include videodb in this header */
220   bool IsLabelPreformated() const { return m_bLabelPreformated; }
221   void SetLabelPreformated(bool bYesNo) { m_bLabelPreformated=bYesNo; }
222   bool SortsOnTop() const { return m_specialSort == SortSpecialOnTop; }
223   bool SortsOnBottom() const { return m_specialSort == SortSpecialOnBottom; }
224   void SetSpecialSort(SortSpecial sort) { m_specialSort = sort; }
225
226   inline bool HasMusicInfoTag() const
227   {
228     return m_musicInfoTag != NULL;
229   }
230
231   MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag();
232
233   inline const MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag() const
234   {
235     return m_musicInfoTag;
236   }
237
238   inline bool HasVideoInfoTag() const
239   {
240     return m_videoInfoTag != NULL;
241   }
242
243   CVideoInfoTag* GetVideoInfoTag();
244
245   inline const CVideoInfoTag* GetVideoInfoTag() const
246   {
247     return m_videoInfoTag;
248   }
249
250   inline bool HasEPGInfoTag() const
251   {
252     return m_epgInfoTag != NULL;
253   }
254
255   EPG::CEpgInfoTag* GetEPGInfoTag();
256
257   inline const EPG::CEpgInfoTag* GetEPGInfoTag() const
258   {
259     return m_epgInfoTag;
260   }
261
262   inline bool HasPVRChannelInfoTag() const
263   {
264     return m_pvrChannelInfoTag != NULL;
265   }
266
267   PVR::CPVRChannel* GetPVRChannelInfoTag();
268
269   inline const PVR::CPVRChannel* GetPVRChannelInfoTag() const
270   {
271     return m_pvrChannelInfoTag;
272   }
273
274   inline bool HasPVRRecordingInfoTag() const
275   {
276     return m_pvrRecordingInfoTag != NULL;
277   }
278
279   PVR::CPVRRecording* GetPVRRecordingInfoTag();
280
281   inline const PVR::CPVRRecording* GetPVRRecordingInfoTag() const
282   {
283     return m_pvrRecordingInfoTag;
284   }
285
286   inline bool HasPVRTimerInfoTag() const
287   {
288     return m_pvrTimerInfoTag != NULL;
289   }
290
291   PVR::CPVRTimerInfoTag* GetPVRTimerInfoTag();
292
293   inline const PVR::CPVRTimerInfoTag* GetPVRTimerInfoTag() const
294   {
295     return m_pvrTimerInfoTag;
296   }
297
298   inline bool HasPictureInfoTag() const
299   {
300     return m_pictureInfoTag != NULL;
301   }
302
303   inline const CPictureInfoTag* GetPictureInfoTag() const
304   {
305     return m_pictureInfoTag;
306   }
307
308   CPictureInfoTag* GetPictureInfoTag();
309
310   /*!
311    \brief Get the local fanart for this item if it exists
312    \return path to the local fanart for this item, or empty if none exists
313    \sa GetFolderThumb, GetTBNFile
314    */
315   CStdString GetLocalFanart() const;
316
317   /*! \brief Assemble the filename of a particular piece of local artwork for an item.
318              No file existence check is typically performed.
319    \param artFile the art file to search for.
320    \param useFolder whether to look in the folder for the art file. Defaults to false.
321    \return the path to the local artwork.
322    \sa FindLocalArt
323    */
324   CStdString GetLocalArt(const std::string &artFile, bool useFolder = false) const;
325
326   /*! \brief Assemble the filename of a particular piece of local artwork for an item,
327              and check for file existence.
328    \param artFile the art file to search for.
329    \param useFolder whether to look in the folder for the art file. Defaults to false.
330    \return the path to the local artwork if it exists, empty otherwise.
331    \sa GetLocalArt
332    */
333   CStdString FindLocalArt(const std::string &artFile, bool useFolder) const;
334
335   // Gets the .tbn file associated with this item
336   CStdString GetTBNFile() const;
337   // Gets the folder image associated with this item (defaults to folder.jpg)
338   CStdString GetFolderThumb(const CStdString &folderJPG = "folder.jpg") const;
339   // Gets the correct movie title
340   CStdString GetMovieName(bool bUseFolderNames = false) const;
341
342   /*! \brief Find the base movie path (i.e. the item the user expects us to use to lookup the movie)
343    For folder items, with "use foldernames for lookups" it returns the folder.
344    Regardless of settings, for VIDEO_TS/BDMV it returns the parent of the VIDEO_TS/BDMV folder (if present)
345
346    \param useFolderNames whether we're using foldernames for lookups
347    \return the base movie folder
348    */
349   CStdString GetBaseMoviePath(bool useFolderNames) const;
350
351   // Gets the user thumb, if it exists
352   CStdString GetUserMusicThumb(bool alwaysCheckRemote = false, bool fallbackToFolder = false) const;
353
354   /*! \brief Get the path where we expect local metadata to reside.
355    For a folder, this is just the existing path (eg tvshow folder)
356    For a file, this is the parent path, with exceptions made for VIDEO_TS and BDMV files
357
358    Three cases are handled:
359
360      /foo/bar/movie_name/file_name          -> /foo/bar/movie_name/
361      /foo/bar/movie_name/VIDEO_TS/file_name -> /foo/bar/movie_name/
362      /foo/bar/movie_name/BDMV/file_name     -> /foo/bar/movie_name/
363
364      \sa URIUtils::GetParentPath
365    */
366   CStdString GetLocalMetadataPath() const;
367
368   // finds a matching local trailer file
369   CStdString FindTrailer() const;
370
371   virtual bool LoadMusicTag();
372
373   /* Returns the content type of this item if known */
374   const CStdString& GetMimeType() const { return m_mimetype; }
375
376   /* sets the mime-type if known beforehand */
377   void SetMimeType(const CStdString& mimetype) { m_mimetype = mimetype; } ;
378
379   /*! \brief Resolve the MIME type based on file extension or a web lookup
380    If m_mimetype is already set (non-empty), this function has no effect. For
381    http:// and shout:// streams, this will query the stream (blocking operation).
382    Set lookup=false to skip any internet lookups and always return immediately.
383    */
384   void FillInMimeType(bool lookup = true);
385
386   /* general extra info about the contents of the item, not for display */
387   void SetExtraInfo(const CStdString& info) { m_extrainfo = info; };
388   const CStdString& GetExtraInfo() const { return m_extrainfo; };
389
390   /*! \brief Update an item with information from another item
391    We take metadata information from the given item and supplement the current item
392    with that info.  If tags exist in the new item we use the entire tag information.
393    Properties are appended, and labels, thumbnail and icon are updated if non-empty
394    in the given item.
395    \param item the item used to supplement information
396    \param replaceLabels whether to replace labels (defaults to true)
397    */
398   void UpdateInfo(const CFileItem &item, bool replaceLabels = true);
399
400   bool IsSamePath(const CFileItem *item) const;
401
402   bool IsAlbum() const;
403
404   /*! \brief Sets details using the information from the CVideoInfoTag object
405    Sets the videoinfotag and uses its information to set the label and path.
406    \param video video details to use and set
407    */
408   void SetFromVideoInfoTag(const CVideoInfoTag &video);
409   /*! \brief Sets details using the information from the CAlbum object
410    Sets the album in the music info tag and uses its information to set the
411    label and album-specific properties.
412    \param album album details to use and set
413    */
414   void SetFromAlbum(const CAlbum &album);
415   /*! \brief Sets details using the information from the CSong object
416    Sets the song in the music info tag and uses its information to set the
417    label, path, song-specific properties and artwork.
418    \param song song details to use and set
419    */
420   void SetFromSong(const CSong &song);
421
422   bool m_bIsShareOrDrive;    ///< is this a root share/drive
423   int m_iDriveType;     ///< If \e m_bIsShareOrDrive is \e true, use to get the share type. Types see: CMediaSource::m_iDriveType
424   CDateTime m_dateTime;             ///< file creation date & time
425   int64_t m_dwSize;             ///< file size (0 for folders)
426   CStdString m_strDVDLabel;
427   CStdString m_strTitle;
428   int m_iprogramCount;
429   int m_idepth;
430   int m_lStartOffset;
431   int m_lStartPartNumber;
432   int m_lEndOffset;
433   LockType m_iLockMode;
434   CStdString m_strLockCode;
435   int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked
436   int m_iBadPwdCount;
437
438 private:
439   CStdString m_strPath;            ///< complete path to item
440
441   SortSpecial m_specialSort;
442   bool m_bIsParentFolder;
443   bool m_bCanQueue;
444   bool m_bLabelPreformated;
445   CStdString m_mimetype;
446   CStdString m_extrainfo;
447   MUSIC_INFO::CMusicInfoTag* m_musicInfoTag;
448   CVideoInfoTag* m_videoInfoTag;
449   EPG::CEpgInfoTag* m_epgInfoTag;
450   PVR::CPVRChannel* m_pvrChannelInfoTag;
451   PVR::CPVRRecording* m_pvrRecordingInfoTag;
452   PVR::CPVRTimerInfoTag * m_pvrTimerInfoTag;
453   CPictureInfoTag* m_pictureInfoTag;
454   bool m_bIsAlbum;
455 };
456
457 /*!
458   \brief A shared pointer to CFileItem
459   \sa CFileItem
460   */
461 typedef boost::shared_ptr<CFileItem> CFileItemPtr;
462
463 /*!
464   \brief A vector of pointer to CFileItem
465   \sa CFileItem
466   */
467 typedef std::vector< CFileItemPtr > VECFILEITEMS;
468
469 /*!
470   \brief Iterator for VECFILEITEMS
471   \sa CFileItemList
472   */
473 typedef std::vector< CFileItemPtr >::iterator IVECFILEITEMS;
474
475 /*!
476   \brief A map of pointers to CFileItem
477   \sa CFileItem
478   */
479 typedef std::map<CStdString, CFileItemPtr > MAPFILEITEMS;
480
481 /*!
482   \brief Iterator for MAPFILEITEMS
483   \sa MAPFILEITEMS
484   */
485 typedef std::map<CStdString, CFileItemPtr >::iterator IMAPFILEITEMS;
486
487 /*!
488   \brief Pair for MAPFILEITEMS
489   \sa MAPFILEITEMS
490   */
491 typedef std::pair<CStdString, CFileItemPtr > MAPFILEITEMSPAIR;
492
493 typedef bool (*FILEITEMLISTCOMPARISONFUNC) (const CFileItemPtr &pItem1, const CFileItemPtr &pItem2);
494 typedef void (*FILEITEMFILLFUNC) (CFileItemPtr &item);
495
496 /*!
497   \brief Represents a list of files
498   \sa CFileItemList, CFileItem
499   */
500 class CFileItemList : public CFileItem
501 {
502 public:
503   enum CACHE_TYPE { CACHE_NEVER = 0, CACHE_IF_SLOW, CACHE_ALWAYS };
504
505   CFileItemList();
506   CFileItemList(const CStdString& strPath);
507   virtual ~CFileItemList();
508   virtual void Archive(CArchive& ar);
509   CFileItemPtr operator[] (int iItem);
510   const CFileItemPtr operator[] (int iItem) const;
511   CFileItemPtr operator[] (const CStdString& strPath);
512   const CFileItemPtr operator[] (const CStdString& strPath) const;
513   void Clear();
514   void ClearItems();
515   void Add(const CFileItemPtr &pItem);
516   void AddFront(const CFileItemPtr &pItem, int itemPosition);
517   void Remove(CFileItem* pItem);
518   void Remove(int iItem);
519   CFileItemPtr Get(int iItem);
520   const CFileItemPtr Get(int iItem) const;
521   const VECFILEITEMS GetList() const { return m_items; }
522   CFileItemPtr Get(const CStdString& strPath);
523   const CFileItemPtr Get(const CStdString& strPath) const;
524   int Size() const;
525   bool IsEmpty() const;
526   void Append(const CFileItemList& itemlist);
527   void Assign(const CFileItemList& itemlist, bool append = false);
528   bool Copy  (const CFileItemList& item, bool copyItems = true);
529   void Reserve(int iCount);
530   void Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute sortAttributes = SortAttributeNone);
531   /* \brief Sorts the items based on the given sorting options
532
533   In contrast to Sort (see above) this does not change the internal
534   state by storing the sorting method and order used and therefore
535   will always execute the sorting even if the list of items has
536   already been sorted with the same options before.
537   */
538   void Sort(SortDescription sortDescription);
539   void Randomize();
540   void FillInDefaultIcons();
541   int GetFolderCount() const;
542   int GetFileCount() const;
543   int GetSelectedCount() const;
544   int GetObjectCount() const;
545   void FilterCueItems();
546   void RemoveExtensions();
547   void SetFastLookup(bool fastLookup);
548   bool Contains(const CStdString& fileName) const;
549   bool GetFastLookup() const { return m_fastLookup; };
550
551   /*! \brief stack a CFileItemList
552    By default we stack all items (files and folders) in a CFileItemList
553    \param stackFiles whether to stack all items or just collapse folders (defaults to true)
554    \sa StackFiles,StackFolders
555    */
556   void Stack(bool stackFiles = true);
557
558   SortOrder GetSortOrder() const { return m_sortDescription.sortOrder; }
559   SortBy GetSortMethod() const { return m_sortDescription.sortBy; }
560   /*! \brief load a CFileItemList out of the cache
561
562    The file list may be cached based on which window we're viewing in, as different
563    windows will be listing different portions of the same URL (eg viewing music files
564    versus viewing video files)
565    
566    \param windowID id of the window that's loading this list (defaults to 0)
567    \return true if we loaded from the cache, false otherwise.
568    \sa Save,RemoveDiscCache
569    */
570   bool Load(int windowID = 0);
571
572   /*! \brief save a CFileItemList to the cache
573    
574    The file list may be cached based on which window we're viewing in, as different
575    windows will be listing different portions of the same URL (eg viewing music files
576    versus viewing video files)
577    
578    \param windowID id of the window that's saving this list (defaults to 0)
579    \return true if successful, false otherwise.
580    \sa Load,RemoveDiscCache
581    */
582   bool Save(int windowID = 0);
583   void SetCacheToDisc(CACHE_TYPE cacheToDisc) { m_cacheToDisc = cacheToDisc; }
584   bool CacheToDiscAlways() const { return m_cacheToDisc == CACHE_ALWAYS; }
585   bool CacheToDiscIfSlow() const { return m_cacheToDisc == CACHE_IF_SLOW; }
586   /*! \brief remove a previously cached CFileItemList from the cache
587    
588    The file list may be cached based on which window we're viewing in, as different
589    windows will be listing different portions of the same URL (eg viewing music files
590    versus viewing video files)
591    
592    \param windowID id of the window whose cache we which to remove (defaults to 0)
593    \sa Save,Load
594    */
595   void RemoveDiscCache(int windowID = 0) const;
596   bool AlwaysCache() const;
597
598   void Swap(unsigned int item1, unsigned int item2);
599
600   /*! \brief Update an item in the item list
601    \param item the new item, which we match based on path to an existing item in the list
602    \return true if the item exists in the list (and was thus updated), false otherwise.
603    */
604   bool UpdateItem(const CFileItem *item);
605
606   void AddSortMethod(SortBy sortBy, int buttonLabel, const LABEL_MASKS &labelMasks, SortAttribute sortAttributes = SortAttributeNone);
607   void AddSortMethod(SortBy sortBy, SortAttribute sortAttributes, int buttonLabel, const LABEL_MASKS &labelMasks);
608   void AddSortMethod(SortDescription sortDescription, int buttonLabel, const LABEL_MASKS &labelMasks);
609   bool HasSortDetails() const { return m_sortDetails.size() != 0; };
610   const std::vector<SORT_METHOD_DETAILS> &GetSortDetails() const { return m_sortDetails; };
611
612   /*! \brief Specify whether this list should be sorted with folders separate from files
613    By default we sort with folders listed (and sorted separately) except for those sort modes
614    which should be explicitly sorted with folders interleaved with files (eg SORT_METHOD_FILES).
615    With this set the folder state will be ignored, allowing folders and files to sort interleaved.
616    \param sort whether to ignore the folder state.
617    */
618   void SetSortIgnoreFolders(bool sort) { m_sortIgnoreFolders = sort; };
619   bool GetReplaceListing() const { return m_replaceListing; };
620   void SetReplaceListing(bool replace);
621   void SetContent(const CStdString &content) { m_content = content; };
622   const CStdString &GetContent() const { return m_content; };
623
624   void ClearSortState();
625 private:
626   void Sort(FILEITEMLISTCOMPARISONFUNC func);
627   void FillSortFields(FILEITEMFILLFUNC func);
628   CStdString GetDiscFileCache(int windowID) const;
629
630   /*!
631    \brief stack files in a CFileItemList
632    \sa Stack
633    */
634   void StackFiles();
635
636   /*!
637    \brief stack folders in a CFileItemList
638    \sa Stack
639    */
640   void StackFolders();
641
642   VECFILEITEMS m_items;
643   MAPFILEITEMS m_map;
644   bool m_fastLookup;
645   SortDescription m_sortDescription;
646   bool m_sortIgnoreFolders;
647   CACHE_TYPE m_cacheToDisc;
648   bool m_replaceListing;
649   CStdString m_content;
650
651   std::vector<SORT_METHOD_DETAILS> m_sortDetails;
652
653   CCriticalSection m_lock;
654 };