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;
299 \brief Test if this item has a valid resume point set.
300 \return True if this item has a resume point and it is set, false otherwise.
302 bool IsResumePointSet() const;
305 \brief Return the current resume time.
306 \return The time in seconds from the start to resume playing from.
308 double GetCurrentResumeTime() const;
310 inline bool HasPictureInfoTag() const
312 return m_pictureInfoTag != NULL;
315 inline const CPictureInfoTag* GetPictureInfoTag() const
317 return m_pictureInfoTag;
320 CPictureInfoTag* GetPictureInfoTag();
323 \brief Get the local fanart for this item if it exists
324 \return path to the local fanart for this item, or empty if none exists
325 \sa GetFolderThumb, GetTBNFile
327 CStdString GetLocalFanart() const;
329 /*! \brief Assemble the filename of a particular piece of local artwork for an item.
330 No file existence check is typically performed.
331 \param artFile the art file to search for.
332 \param useFolder whether to look in the folder for the art file. Defaults to false.
333 \return the path to the local artwork.
336 CStdString GetLocalArt(const std::string &artFile, bool useFolder = false) const;
338 /*! \brief Assemble the filename of a particular piece of local artwork for an item,
339 and check for file existence.
340 \param artFile the art file to search for.
341 \param useFolder whether to look in the folder for the art file. Defaults to false.
342 \return the path to the local artwork if it exists, empty otherwise.
345 CStdString FindLocalArt(const std::string &artFile, bool useFolder) const;
347 /*! \brief Whether or not to skip searching for local art.
348 \return true if local art should be skipped for this item, false otherwise.
349 \sa GetLocalArt, FindLocalArt
351 bool SkipLocalArt() const;
353 // Gets the .tbn file associated with this item
354 CStdString GetTBNFile() const;
355 // Gets the folder image associated with this item (defaults to folder.jpg)
356 CStdString GetFolderThumb(const CStdString &folderJPG = "folder.jpg") const;
357 // Gets the correct movie title
358 CStdString GetMovieName(bool bUseFolderNames = false) const;
360 /*! \brief Find the base movie path (i.e. the item the user expects us to use to lookup the movie)
361 For folder items, with "use foldernames for lookups" it returns the folder.
362 Regardless of settings, for VIDEO_TS/BDMV it returns the parent of the VIDEO_TS/BDMV folder (if present)
364 \param useFolderNames whether we're using foldernames for lookups
365 \return the base movie folder
367 CStdString GetBaseMoviePath(bool useFolderNames) const;
369 // Gets the user thumb, if it exists
370 CStdString GetUserMusicThumb(bool alwaysCheckRemote = false, bool fallbackToFolder = false) const;
372 /*! \brief Get the path where we expect local metadata to reside.
373 For a folder, this is just the existing path (eg tvshow folder)
374 For a file, this is the parent path, with exceptions made for VIDEO_TS and BDMV files
376 Three cases are handled:
378 /foo/bar/movie_name/file_name -> /foo/bar/movie_name/
379 /foo/bar/movie_name/VIDEO_TS/file_name -> /foo/bar/movie_name/
380 /foo/bar/movie_name/BDMV/file_name -> /foo/bar/movie_name/
382 \sa URIUtils::GetParentPath
384 CStdString GetLocalMetadataPath() const;
386 // finds a matching local trailer file
387 CStdString FindTrailer() const;
389 virtual bool LoadMusicTag();
391 /* Returns the content type of this item if known */
392 const CStdString& GetMimeType() const { return m_mimetype; }
394 /* sets the mime-type if known beforehand */
395 void SetMimeType(const CStdString& mimetype) { m_mimetype = mimetype; } ;
397 /*! \brief Resolve the MIME type based on file extension or a web lookup
398 If m_mimetype is already set (non-empty), this function has no effect. For
399 http:// and shout:// streams, this will query the stream (blocking operation).
400 Set lookup=false to skip any internet lookups and always return immediately.
402 void FillInMimeType(bool lookup = true);
404 /* general extra info about the contents of the item, not for display */
405 void SetExtraInfo(const CStdString& info) { m_extrainfo = info; };
406 const CStdString& GetExtraInfo() const { return m_extrainfo; };
408 /*! \brief Update an item with information from another item
409 We take metadata information from the given item and supplement the current item
410 with that info. If tags exist in the new item we use the entire tag information.
411 Properties are appended, and labels, thumbnail and icon are updated if non-empty
413 \param item the item used to supplement information
414 \param replaceLabels whether to replace labels (defaults to true)
416 void UpdateInfo(const CFileItem &item, bool replaceLabels = true);
418 bool IsSamePath(const CFileItem *item) const;
420 bool IsAlbum() const;
422 /*! \brief Sets details using the information from the CVideoInfoTag object
423 Sets the videoinfotag and uses its information to set the label and path.
424 \param video video details to use and set
426 void SetFromVideoInfoTag(const CVideoInfoTag &video);
427 /*! \brief Sets details using the information from the CAlbum object
428 Sets the album in the music info tag and uses its information to set the
429 label and album-specific properties.
430 \param album album details to use and set
432 void SetFromAlbum(const CAlbum &album);
433 /*! \brief Sets details using the information from the CSong object
434 Sets the song in the music info tag and uses its information to set the
435 label, path, song-specific properties and artwork.
436 \param song song details to use and set
438 void SetFromSong(const CSong &song);
440 bool m_bIsShareOrDrive; ///< is this a root share/drive
441 int m_iDriveType; ///< If \e m_bIsShareOrDrive is \e true, use to get the share type. Types see: CMediaSource::m_iDriveType
442 CDateTime m_dateTime; ///< file creation date & time
443 int64_t m_dwSize; ///< file size (0 for folders)
444 CStdString m_strDVDLabel;
445 CStdString m_strTitle;
449 int m_lStartPartNumber;
451 LockType m_iLockMode;
452 CStdString m_strLockCode;
453 int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked
457 CStdString m_strPath; ///< complete path to item
459 SortSpecial m_specialSort;
460 bool m_bIsParentFolder;
462 bool m_bLabelPreformated;
463 CStdString m_mimetype;
464 CStdString m_extrainfo;
465 MUSIC_INFO::CMusicInfoTag* m_musicInfoTag;
466 CVideoInfoTag* m_videoInfoTag;
467 EPG::CEpgInfoTag* m_epgInfoTag;
468 PVR::CPVRChannel* m_pvrChannelInfoTag;
469 PVR::CPVRRecording* m_pvrRecordingInfoTag;
470 PVR::CPVRTimerInfoTag * m_pvrTimerInfoTag;
471 CPictureInfoTag* m_pictureInfoTag;
476 \brief A shared pointer to CFileItem
479 typedef boost::shared_ptr<CFileItem> CFileItemPtr;
482 \brief A vector of pointer to CFileItem
485 typedef std::vector< CFileItemPtr > VECFILEITEMS;
488 \brief Iterator for VECFILEITEMS
491 typedef std::vector< CFileItemPtr >::iterator IVECFILEITEMS;
494 \brief A map of pointers to CFileItem
497 typedef std::map<CStdString, CFileItemPtr > MAPFILEITEMS;
500 \brief Iterator for MAPFILEITEMS
503 typedef std::map<CStdString, CFileItemPtr >::iterator IMAPFILEITEMS;
506 \brief Pair for MAPFILEITEMS
509 typedef std::pair<CStdString, CFileItemPtr > MAPFILEITEMSPAIR;
511 typedef bool (*FILEITEMLISTCOMPARISONFUNC) (const CFileItemPtr &pItem1, const CFileItemPtr &pItem2);
512 typedef void (*FILEITEMFILLFUNC) (CFileItemPtr &item);
515 \brief Represents a list of files
516 \sa CFileItemList, CFileItem
518 class CFileItemList : public CFileItem
521 enum CACHE_TYPE { CACHE_NEVER = 0, CACHE_IF_SLOW, CACHE_ALWAYS };
524 CFileItemList(const CStdString& strPath);
525 virtual ~CFileItemList();
526 virtual void Archive(CArchive& ar);
527 CFileItemPtr operator[] (int iItem);
528 const CFileItemPtr operator[] (int iItem) const;
529 CFileItemPtr operator[] (const CStdString& strPath);
530 const CFileItemPtr operator[] (const CStdString& strPath) const;
533 void Add(const CFileItemPtr &pItem);
534 void AddFront(const CFileItemPtr &pItem, int itemPosition);
535 void Remove(CFileItem* pItem);
536 void Remove(int iItem);
537 CFileItemPtr Get(int iItem);
538 const CFileItemPtr Get(int iItem) const;
539 const VECFILEITEMS GetList() const { return m_items; }
540 CFileItemPtr Get(const CStdString& strPath);
541 const CFileItemPtr Get(const CStdString& strPath) const;
543 bool IsEmpty() const;
544 void Append(const CFileItemList& itemlist);
545 void Assign(const CFileItemList& itemlist, bool append = false);
546 bool Copy (const CFileItemList& item, bool copyItems = true);
547 void Reserve(int iCount);
548 void Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute sortAttributes = SortAttributeNone);
549 /* \brief Sorts the items based on the given sorting options
551 In contrast to Sort (see above) this does not change the internal
552 state by storing the sorting method and order used and therefore
553 will always execute the sorting even if the list of items has
554 already been sorted with the same options before.
556 void Sort(SortDescription sortDescription);
558 void FillInDefaultIcons();
559 int GetFolderCount() const;
560 int GetFileCount() const;
561 int GetSelectedCount() const;
562 int GetObjectCount() const;
563 void FilterCueItems();
564 void RemoveExtensions();
565 void SetFastLookup(bool fastLookup);
566 bool Contains(const CStdString& fileName) const;
567 bool GetFastLookup() const { return m_fastLookup; };
569 /*! \brief stack a CFileItemList
570 By default we stack all items (files and folders) in a CFileItemList
571 \param stackFiles whether to stack all items or just collapse folders (defaults to true)
572 \sa StackFiles,StackFolders
574 void Stack(bool stackFiles = true);
576 SortOrder GetSortOrder() const { return m_sortDescription.sortOrder; }
577 SortBy GetSortMethod() const { return m_sortDescription.sortBy; }
578 /*! \brief load a CFileItemList out of the cache
580 The file list may be cached based on which window we're viewing in, as different
581 windows will be listing different portions of the same URL (eg viewing music files
582 versus viewing video files)
584 \param windowID id of the window that's loading this list (defaults to 0)
585 \return true if we loaded from the cache, false otherwise.
586 \sa Save,RemoveDiscCache
588 bool Load(int windowID = 0);
590 /*! \brief save a CFileItemList to the cache
592 The file list may be cached based on which window we're viewing in, as different
593 windows will be listing different portions of the same URL (eg viewing music files
594 versus viewing video files)
596 \param windowID id of the window that's saving this list (defaults to 0)
597 \return true if successful, false otherwise.
598 \sa Load,RemoveDiscCache
600 bool Save(int windowID = 0);
601 void SetCacheToDisc(CACHE_TYPE cacheToDisc) { m_cacheToDisc = cacheToDisc; }
602 bool CacheToDiscAlways() const { return m_cacheToDisc == CACHE_ALWAYS; }
603 bool CacheToDiscIfSlow() const { return m_cacheToDisc == CACHE_IF_SLOW; }
604 /*! \brief remove a previously cached CFileItemList from the cache
606 The file list may be cached based on which window we're viewing in, as different
607 windows will be listing different portions of the same URL (eg viewing music files
608 versus viewing video files)
610 \param windowID id of the window whose cache we which to remove (defaults to 0)
613 void RemoveDiscCache(int windowID = 0) const;
614 bool AlwaysCache() const;
616 void Swap(unsigned int item1, unsigned int item2);
618 /*! \brief Update an item in the item list
619 \param item the new item, which we match based on path to an existing item in the list
620 \return true if the item exists in the list (and was thus updated), false otherwise.
622 bool UpdateItem(const CFileItem *item);
624 void AddSortMethod(SortBy sortBy, int buttonLabel, const LABEL_MASKS &labelMasks, SortAttribute sortAttributes = SortAttributeNone);
625 void AddSortMethod(SortBy sortBy, SortAttribute sortAttributes, int buttonLabel, const LABEL_MASKS &labelMasks);
626 void AddSortMethod(SortDescription sortDescription, int buttonLabel, const LABEL_MASKS &labelMasks);
627 bool HasSortDetails() const { return m_sortDetails.size() != 0; };
628 const std::vector<SORT_METHOD_DETAILS> &GetSortDetails() const { return m_sortDetails; };
630 /*! \brief Specify whether this list should be sorted with folders separate from files
631 By default we sort with folders listed (and sorted separately) except for those sort modes
632 which should be explicitly sorted with folders interleaved with files (eg SORT_METHOD_FILES).
633 With this set the folder state will be ignored, allowing folders and files to sort interleaved.
634 \param sort whether to ignore the folder state.
636 void SetSortIgnoreFolders(bool sort) { m_sortIgnoreFolders = sort; };
637 bool GetReplaceListing() const { return m_replaceListing; };
638 void SetReplaceListing(bool replace);
639 void SetContent(const CStdString &content) { m_content = content; };
640 const CStdString &GetContent() const { return m_content; };
642 void ClearSortState();
644 void Sort(FILEITEMLISTCOMPARISONFUNC func);
645 void FillSortFields(FILEITEMFILLFUNC func);
646 CStdString GetDiscFileCache(int windowID) const;
649 \brief stack files in a CFileItemList
655 \brief stack folders in a CFileItemList
660 VECFILEITEMS m_items;
663 SortDescription m_sortDescription;
664 bool m_sortIgnoreFolders;
665 CACHE_TYPE m_cacheToDisc;
666 bool m_replaceListing;
667 CStdString m_content;
669 std::vector<SORT_METHOD_DETAILS> m_sortDetails;
671 CCriticalSection m_lock;