8 * Copyright (C) 2005-2013 Team XBMC
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)
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.
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/>.
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"
38 #include "boost/shared_ptr.hpp"
53 class CPVRTimerInfoTag;
55 class CPictureInfoTag;
64 /* special startoffset used to indicate that we wish to resume */
65 #define STARTOFFSET_RESUME (-1)
69 enum EFileFolderType {
70 EFILEFOLDER_TYPE_ALWAYS = 1<<0,
71 EFILEFOLDER_TYPE_ONCLICK = 1<<1,
72 EFILEFOLDER_TYPE_ONBROWSE = 1<<2,
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,
83 \brief Represents a file on a share
87 public CGUIListItem, public IArchivable, public ISerializable, public ISortable
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); };
109 const CStdString &GetPath() const { return m_strPath; };
110 void SetPath(const CStdString &path) { m_strPath = path; };
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; };
120 bool Exists(bool bUseCache = true) const;
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.
129 std::string GetOpticalMediaPath() const;
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.
135 bool IsVideo() const;
137 bool IsDiscStub() const;
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.
144 bool IsPicture() const;
145 bool IsLyrics() const;
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.
152 bool IsAudio() const;
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;
166 bool IsDVDImage() const;
167 bool IsOpticalMediaFile() const;
168 bool IsDVDFile(bool bVobs = true, bool bIfos = true) const;
169 bool IsBDFile() const;
175 bool IsISO9660() const;
178 bool IsOnDVD() const;
179 bool IsOnLAN() const;
183 bool IsRemote() const;
187 bool IsStack() const;
188 bool IsMultiPath() const;
189 bool IsMusicDb() const;
190 bool IsVideoDb() 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;
209 bool IsLiveTV() const;
211 bool IsAndroidApp() const;
213 void RemoveExtension();
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; }
226 inline bool HasMusicInfoTag() const
228 return m_musicInfoTag != NULL;
231 MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag();
233 inline const MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag() const
235 return m_musicInfoTag;
238 inline bool HasVideoInfoTag() const
240 return m_videoInfoTag != NULL;
243 CVideoInfoTag* GetVideoInfoTag();
245 inline const CVideoInfoTag* GetVideoInfoTag() const
247 return m_videoInfoTag;
250 inline bool HasEPGInfoTag() const
252 return m_epgInfoTag != NULL;
255 EPG::CEpgInfoTag* GetEPGInfoTag();
257 inline const EPG::CEpgInfoTag* GetEPGInfoTag() const
262 inline bool HasPVRChannelInfoTag() const
264 return m_pvrChannelInfoTag != NULL;
267 PVR::CPVRChannel* GetPVRChannelInfoTag();
269 inline const PVR::CPVRChannel* GetPVRChannelInfoTag() const
271 return m_pvrChannelInfoTag;
274 inline bool HasPVRRecordingInfoTag() const
276 return m_pvrRecordingInfoTag != NULL;
279 PVR::CPVRRecording* GetPVRRecordingInfoTag();
281 inline const PVR::CPVRRecording* GetPVRRecordingInfoTag() const
283 return m_pvrRecordingInfoTag;
286 inline bool HasPVRTimerInfoTag() const
288 return m_pvrTimerInfoTag != NULL;
291 PVR::CPVRTimerInfoTag* GetPVRTimerInfoTag();
293 inline const PVR::CPVRTimerInfoTag* GetPVRTimerInfoTag() const
295 return m_pvrTimerInfoTag;
298 inline bool HasPictureInfoTag() const
300 return m_pictureInfoTag != NULL;
303 inline const CPictureInfoTag* GetPictureInfoTag() const
305 return m_pictureInfoTag;
308 CPictureInfoTag* GetPictureInfoTag();
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
315 CStdString GetLocalFanart() const;
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.
324 CStdString GetLocalArt(const std::string &artFile, bool useFolder = false) const;
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.
333 CStdString FindLocalArt(const std::string &artFile, bool useFolder) const;
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;
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)
346 \param useFolderNames whether we're using foldernames for lookups
347 \return the base movie folder
349 CStdString GetBaseMoviePath(bool useFolderNames) const;
351 // Gets the user thumb, if it exists
352 CStdString GetUserMusicThumb(bool alwaysCheckRemote = false, bool fallbackToFolder = false) const;
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
358 Three cases are handled:
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/
364 \sa URIUtils::GetParentPath
366 CStdString GetLocalMetadataPath() const;
368 // finds a matching local trailer file
369 CStdString FindTrailer() const;
371 virtual bool LoadMusicTag();
373 /* Returns the content type of this item if known */
374 const CStdString& GetMimeType() const { return m_mimetype; }
376 /* sets the mime-type if known beforehand */
377 void SetMimeType(const CStdString& mimetype) { m_mimetype = mimetype; } ;
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.
384 void FillInMimeType(bool lookup = true);
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; };
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
395 \param item the item used to supplement information
396 \param replaceLabels whether to replace labels (defaults to true)
398 void UpdateInfo(const CFileItem &item, bool replaceLabels = true);
400 bool IsSamePath(const CFileItem *item) const;
402 bool IsAlbum() const;
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
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
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
420 void SetFromSong(const CSong &song);
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;
431 int m_lStartPartNumber;
433 LockType m_iLockMode;
434 CStdString m_strLockCode;
435 int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked
439 CStdString m_strPath; ///< complete path to item
441 SortSpecial m_specialSort;
442 bool m_bIsParentFolder;
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;
458 \brief A shared pointer to CFileItem
461 typedef boost::shared_ptr<CFileItem> CFileItemPtr;
464 \brief A vector of pointer to CFileItem
467 typedef std::vector< CFileItemPtr > VECFILEITEMS;
470 \brief Iterator for VECFILEITEMS
473 typedef std::vector< CFileItemPtr >::iterator IVECFILEITEMS;
476 \brief A map of pointers to CFileItem
479 typedef std::map<CStdString, CFileItemPtr > MAPFILEITEMS;
482 \brief Iterator for MAPFILEITEMS
485 typedef std::map<CStdString, CFileItemPtr >::iterator IMAPFILEITEMS;
488 \brief Pair for MAPFILEITEMS
491 typedef std::pair<CStdString, CFileItemPtr > MAPFILEITEMSPAIR;
493 typedef bool (*FILEITEMLISTCOMPARISONFUNC) (const CFileItemPtr &pItem1, const CFileItemPtr &pItem2);
494 typedef void (*FILEITEMFILLFUNC) (CFileItemPtr &item);
497 \brief Represents a list of files
498 \sa CFileItemList, CFileItem
500 class CFileItemList : public CFileItem
503 enum CACHE_TYPE { CACHE_NEVER = 0, CACHE_IF_SLOW, CACHE_ALWAYS };
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;
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;
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
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.
538 void Sort(SortDescription sortDescription);
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; };
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
556 void Stack(bool stackFiles = true);
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
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)
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
570 bool Load(int windowID = 0);
572 /*! \brief save a CFileItemList to the cache
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)
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
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
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)
592 \param windowID id of the window whose cache we which to remove (defaults to 0)
595 void RemoveDiscCache(int windowID = 0) const;
596 bool AlwaysCache() const;
598 void Swap(unsigned int item1, unsigned int item2);
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.
604 bool UpdateItem(const CFileItem *item);
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; };
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.
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; };
624 void ClearSortState();
626 void Sort(FILEITEMLISTCOMPARISONFUNC func);
627 void FillSortFields(FILEITEMFILLFUNC func);
628 CStdString GetDiscFileCache(int windowID) const;
631 \brief stack files in a CFileItemList
637 \brief stack folders in a CFileItemList
642 VECFILEITEMS m_items;
645 SortDescription m_sortDescription;
646 bool m_sortIgnoreFolders;
647 CACHE_TYPE m_cacheToDisc;
648 bool m_replaceListing;
649 CStdString m_content;
651 std::vector<SORT_METHOD_DETAILS> m_sortDetails;
653 CCriticalSection m_lock;