- Reverted database view back to HEAD as otherwise it would only show songs which...
[xbmc:xbmc-antiquated.git] / xbmc / FileItem.h
1 /*!
2  \file FileItem.h
3  \brief
4  */
5 #pragma once
6
7 /*
8  *      Copyright (C) 2005-2008 Team XBMC
9  *      http://www.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, write to
23  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24  *  http://www.gnu.org/copyleft/gpl.html
25  *
26  */
27
28 #include "GUIListItem.h"
29 #include "utils/Archive.h"
30 #include "DateTime.h"
31 #include "SortFileItem.h"
32 #include "utils/LabelFormatter.h"
33 #include "GUIPassword.h"
34 #include "utils/CriticalSection.h"
35
36 #include <vector>
37 #include "boost/shared_ptr.hpp"
38
39 namespace MUSIC_INFO
40 {
41   class CMusicInfoTag;
42 }
43 class CVideoInfoTag;
44 class CPictureInfoTag;
45
46 class CAlbum;
47 class CArtist;
48 class CSong;
49 class CGenre;
50
51 class CURL;
52
53 /* special startoffset used to indicate that we wish to resume */
54 #define STARTOFFSET_RESUME (-1) 
55
56 class CMediaSource;
57
58 /*!
59   \brief Represents a file on a share
60   \sa CFileItemList
61   */
62 class CFileItem :
63       public CGUIListItem, public ISerializable
64 {
65 public:
66   CFileItem(void);
67   CFileItem(const CFileItem& item);
68   CFileItem(const CGUIListItem& item);
69   CFileItem(const CStdString& strLabel);
70   CFileItem(const CStdString& strPath, bool bIsFolder);
71   CFileItem(const CSong& song);
72   CFileItem(const CStdString &path, const CAlbum& album);
73   CFileItem(const CArtist& artist);
74   CFileItem(const CGenre& genre);
75   CFileItem(const CVideoInfoTag& movie);
76   CFileItem(const CMediaSource& share);
77   virtual ~CFileItem(void);
78
79   void Reset();
80   const CFileItem& operator=(const CFileItem& item);
81   virtual void Serialize(CArchive& ar);
82   virtual bool IsFileItem() const { return true; };
83
84   bool IsVideo() const;
85   bool IsPicture() const;
86   bool IsLyrics() const;
87   bool IsAudio() const;
88   bool IsCUESheet() const;
89   bool IsShoutCast() const;
90   bool IsLastFM() const;
91   bool IsInternetStream() const;
92   bool IsPlayList() const;
93   bool IsSmartPlayList() const;
94   bool IsPythonScript() const;
95   bool IsXBE() const;
96   bool IsPluginFolder() const;
97   bool IsDefaultXBE() const;
98   bool IsShortCut() const;
99   bool IsNFO() const;
100   bool IsDVDImage() const;
101   bool IsDVDFile(bool bVobs = true, bool bIfos = true) const;
102   bool IsRAR() const;
103   bool IsZIP() const;
104   bool IsCBZ() const;
105   bool IsCBR() const;
106   bool IsISO9660() const;
107   bool IsCDDA() const;
108   bool IsDVD() const;
109   bool IsOnDVD() const;
110   bool IsOnLAN() const;
111   bool IsHD() const;
112   bool IsRemote() const;
113   bool IsSmb() const;
114   bool IsDAAP() const;
115   bool IsStack() const;
116   bool IsMultiPath() const;
117   bool IsMusicDb() const;
118   bool IsVideoDb() const;
119   bool IsType(const char *ext) const;
120   bool IsVirtualDirectoryRoot() const;
121   bool IsReadOnly() const;
122   bool CanQueue() const;
123   void SetCanQueue(bool bYesNo);
124   bool IsParentFolder() const;
125   bool IsFileFolder() const;
126   bool IsMemoryUnit() const;
127   bool IsRemovable() const;
128   bool IsTuxBox() const;
129   bool IsMythTV() const;
130
131   void RemoveExtension();
132   void CleanFileName();
133   void FillInDefaultIcon();
134   void SetMusicThumb(bool alwaysCheckRemote = false);
135   void SetFileSizeLabel();
136   virtual void SetLabel(const CStdString &strLabel);
137   CURL GetAsUrl() const;
138   bool IsLabelPreformated() const { return m_bLabelPreformated; }
139   void SetLabelPreformated(bool bYesNo) { m_bLabelPreformated=bYesNo; }
140
141   bool HasMusicInfoTag() const
142   {
143     return m_musicInfoTag != NULL;
144   }
145
146   MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag();
147
148   inline const MUSIC_INFO::CMusicInfoTag* GetMusicInfoTag() const
149   {
150     return m_musicInfoTag;
151   }
152
153   bool HasVideoInfoTag() const
154   {
155     return m_videoInfoTag != NULL;
156   }
157   
158   CVideoInfoTag* GetVideoInfoTag();
159   
160   inline const CVideoInfoTag* GetVideoInfoTag() const
161   {
162     return m_videoInfoTag;
163   }
164
165   bool HasPictureInfoTag() const
166   {
167     return m_pictureInfoTag != NULL;
168   }
169
170   inline const CPictureInfoTag* GetPictureInfoTag() const
171   {
172     return m_pictureInfoTag;
173   }
174
175   CPictureInfoTag* GetPictureInfoTag();
176
177   // Gets the cached thumb filename (no existence checks)
178   CStdString GetCachedVideoThumb() const;
179   CStdString GetCachedPictureThumb() const;
180   CStdString GetCachedArtistThumb() const;
181   CStdString GetCachedProgramThumb() const;
182   CStdString GetCachedGameSaveThumb() const;
183   CStdString GetCachedProfileThumb() const;
184   CStdString GetCachedSeasonThumb() const;
185   CStdString GetCachedActorThumb() const;
186   CStdString GetCachedFanart() const;
187   static CStdString GetCachedFanart(const CStdString &path);
188
189   // Sets the video thumb (cached first, else caches user thumb)
190   void SetVideoThumb();
191   void CacheFanart() const;
192
193   // Sets the cached thumb for the item if it exists
194   void SetCachedVideoThumb();
195   void SetCachedPictureThumb();
196   void SetCachedArtistThumb();
197   void SetCachedProgramThumb();
198   void SetCachedGameSavesThumb();
199   void SetCachedMusicThumb();
200   void SetCachedSeasonThumb();
201
202   // Gets the .tbn file associated with this item
203   CStdString GetTBNFile() const;
204   // Gets the folder image associated with this item (defaults to folder.jpg)
205   CStdString GetFolderThumb(const CStdString &folderJPG = "folder.jpg") const;
206
207   // Gets the user thumb, if it exists
208   CStdString GetUserVideoThumb() const;
209   CStdString GetUserMusicThumb(bool alwaysCheckRemote = false) const;
210
211   // Caches the user thumb and assigns it to the item
212   void SetUserVideoThumb();
213   void SetUserProgramThumb();
214   void SetUserMusicThumb(bool alwaysCheckRemote = false);
215
216   // finds a matching local trailer file
217   CStdString FindTrailer() const;
218
219   virtual bool LoadMusicTag();
220
221   /* returns the content type of this item if known. will lookup for http streams */  
222   const CStdString& GetContentType() const; 
223
224   /* sets the contenttype if known beforehand */
225   void              SetContentType(const CStdString& content) { m_contenttype = content; } ;  
226
227   /* general extra info about the contents of the item, not for display */
228   void SetExtraInfo(const CStdString& info) { m_extrainfo = info; };
229   const CStdString& GetExtraInfo() const { return m_extrainfo; };
230
231   bool IsSamePath(const CFileItem *item) const;
232 private:
233   // Gets the previously cached thumb file (with existence checks)
234   CStdString GetPreviouslyCachedMusicThumb() const;
235
236 public:
237   CStdString m_strPath;            ///< complete path to item
238   bool m_bIsShareOrDrive;    ///< is this a root share/drive
239   int m_iDriveType;     ///< If \e m_bIsShareOrDrive is \e true, use to get the share type. Types see: CMediaSource::m_iDriveType
240   CDateTime m_dateTime;             ///< file creation date & time
241   __int64 m_dwSize;             ///< file size (0 for folders)
242   CStdString m_strDVDLabel;
243   CStdString m_strTitle;
244   int m_iprogramCount;
245   int m_idepth;
246   long m_lStartOffset;
247   long m_lEndOffset;
248   LockType m_iLockMode;
249   CStdString m_strLockCode;
250   int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked
251   int m_iBadPwdCount;
252 private:
253
254   bool m_bIsParentFolder;
255   bool m_bCanQueue;
256   bool m_bLabelPreformated;
257   CStdString m_contenttype;
258   CStdString m_extrainfo;
259   MUSIC_INFO::CMusicInfoTag* m_musicInfoTag;
260   CVideoInfoTag* m_videoInfoTag;
261   CPictureInfoTag* m_pictureInfoTag;
262 };
263
264 /*!
265   \brief A shared pointer to CFileItem
266   \sa CFileItem
267   */
268 typedef boost::shared_ptr<CFileItem> CFileItemPtr;
269
270 /*!
271   \brief A vector of pointer to CFileItem
272   \sa CFileItem
273   */
274 typedef std::vector< CFileItemPtr > VECFILEITEMS;
275
276 /*!
277   \brief Iterator for VECFILEITEMS
278   \sa CFileItemList
279   */
280 typedef std::vector< CFileItemPtr >::iterator IVECFILEITEMS;
281
282 /*!
283   \brief A map of pointers to CFileItem
284   \sa CFileItem
285   */
286 typedef std::map<CStdString, CFileItemPtr > MAPFILEITEMS;
287
288 /*!
289   \brief Iterator for MAPFILEITEMS
290   \sa MAPFILEITEMS
291   */
292 typedef std::map<CStdString, CFileItemPtr >::iterator IMAPFILEITEMS;
293
294 /*!
295   \brief Pair for MAPFILEITEMS
296   \sa MAPFILEITEMS
297   */
298 typedef std::pair<CStdString, CFileItemPtr > MAPFILEITEMSPAIR;
299
300 typedef bool (*FILEITEMLISTCOMPARISONFUNC) (const CFileItemPtr &pItem1, const CFileItemPtr &pItem2);
301 typedef void (*FILEITEMFILLFUNC) (CFileItemPtr &item);
302
303 /*!
304   \brief Represents a list of files
305   \sa CFileItemList, CFileItem
306   */
307 class CFileItemList : public CFileItem
308 {
309 public:
310   enum CACHE_TYPE { CACHE_NEVER = 0, CACHE_IF_SLOW, CACHE_ALWAYS };
311
312   CFileItemList();
313   CFileItemList(const CStdString& strPath);
314   virtual ~CFileItemList();
315   virtual void Serialize(CArchive& ar);
316   CFileItemPtr operator[] (int iItem);
317   const CFileItemPtr operator[] (int iItem) const;
318   CFileItemPtr operator[] (const CStdString& strPath);
319   const CFileItemPtr operator[] (const CStdString& strPath) const;
320   void Clear();
321   void ClearItems();
322   void Add(const CFileItemPtr &pItem);
323   void AddFront(const CFileItemPtr &pItem, int itemPosition);
324   void Remove(CFileItem* pItem);
325   void Remove(int iItem);
326   CFileItemPtr Get(int iItem);
327   const CFileItemPtr Get(int iItem) const;
328   CFileItemPtr Get(const CStdString& strPath);
329   const CFileItemPtr Get(const CStdString& strPath) const;
330   int Size() const;
331   bool IsEmpty() const;
332   void Append(const CFileItemList& itemlist);
333   void Assign(const CFileItemList& itemlist, bool append = false);
334   void Reserve(int iCount);
335   void Sort(SORT_METHOD sortMethod, SORT_ORDER sortOrder);
336   void Randomize();
337   void SetMusicThumbs();
338   void FillInDefaultIcons();
339   int GetFolderCount() const;
340   int GetFileCount() const;
341   int GetSelectedCount() const;
342   int GetObjectCount() const;
343   void FilterCueItems();
344   void RemoveExtensions();
345   void CleanFileNames();
346   void SetFastLookup(bool fastLookup);
347   bool Contains(const CStdString& fileName) const;
348   bool GetFastLookup() const { return m_fastLookup; };
349   void Stack();
350   SORT_ORDER GetSortOrder() const { return m_sortOrder; }
351   SORT_METHOD GetSortMethod() const { return m_sortMethod; }
352   bool Load();
353   bool Save();
354   void SetCacheToDisc(CACHE_TYPE cacheToDisc) { m_cacheToDisc = cacheToDisc; }
355   bool CacheToDiscAlways() const { return m_cacheToDisc == CACHE_ALWAYS; }
356   bool CacheToDiscIfSlow() const { return m_cacheToDisc == CACHE_IF_SLOW; }
357   void RemoveDiscCache() const;
358   bool AlwaysCache() const;
359
360   void SetCachedVideoThumbs();
361   void SetCachedProgramThumbs();
362   void SetCachedGameSavesThumbs();
363   void SetCachedMusicThumbs();
364   void SetProgramThumbs();
365   void SetGameSavesThumbs();
366
367   void Swap(unsigned int item1, unsigned int item2);
368
369   void UpdateItem(const CFileItem *item);
370
371   void AddSortMethod(SORT_METHOD method, int buttonLabel, const LABEL_MASKS &labelMasks);
372   bool HasSortDetails() const { return m_sortDetails.size() != 0; };
373   const std::vector<SORT_METHOD_DETAILS> &GetSortDetails() const { return m_sortDetails; };
374   bool GetReplaceListing() const { return m_replaceListing; };
375   void SetReplaceListing(bool replace);
376   void SetContent(const CStdString &content) { m_content = content; };
377   const CStdString &GetContent() const { return m_content; };
378
379   void ClearSortState();
380 private:
381   void Sort(FILEITEMLISTCOMPARISONFUNC func);
382   void FillSortFields(FILEITEMFILLFUNC func);
383   CStdString GetDiscCacheFile() const;
384
385   VECFILEITEMS m_items;
386   MAPFILEITEMS m_map;
387   bool m_fastLookup;
388   SORT_METHOD m_sortMethod;
389   SORT_ORDER m_sortOrder;
390   CACHE_TYPE m_cacheToDisc;
391   bool m_replaceListing;
392   CStdString m_content;
393
394   std::vector<SORT_METHOD_DETAILS> m_sortDetails;
395
396   CCriticalSection m_lock;
397 };