changed: New label formatting that more logically drops separators.
[xbmc:xbmc-antiquated.git] / xbmc / FileItem.h
1 /*!
2  \file FileItem.h
3  \brief
4  */
5 #pragma once
6 #include "..\guilib\guilistitem.h"
7 #include "song.h"
8 #include "utils/archive.h"
9 #include "DateTime.h"
10 #include "VideoInfoTag.h"
11
12 using namespace MUSIC_INFO;
13
14 typedef enum {
15   SORT_METHOD_NONE=0,
16   SORT_METHOD_LABEL,
17   SORT_METHOD_LABEL_IGNORE_THE,
18   SORT_METHOD_DATE,
19   SORT_METHOD_SIZE,
20   SORT_METHOD_FILE,
21   SORT_METHOD_DRIVE_TYPE,
22   SORT_METHOD_TRACKNUM,
23   SORT_METHOD_DURATION,
24   SORT_METHOD_TITLE,
25   SORT_METHOD_TITLE_IGNORE_THE,
26   SORT_METHOD_ARTIST,
27   SORT_METHOD_ARTIST_IGNORE_THE,
28   SORT_METHOD_ALBUM,
29   SORT_METHOD_ALBUM_IGNORE_THE,
30   SORT_METHOD_GENRE,
31   SORT_METHOD_VIDEO_YEAR,
32   SORT_METHOD_VIDEO_RATING,
33   SORT_METHOD_PROGRAM_COUNT,
34   SORT_METHOD_PLAYLIST_ORDER,
35   SORT_METHOD_EPISODE,
36   SORT_METHOD_VIDEO_TITLE,
37   SORT_METHOD_PRODUCTIONCODE,
38   SORT_METHOD_SONG_RATING,
39   SORT_METHOD_UNSORTED,
40   SORT_METHOD_MAX
41 } SORT_METHOD;
42
43 typedef enum {
44   SORT_ORDER_NONE=0,
45   SORT_ORDER_ASC,
46   SORT_ORDER_DESC
47 } SORT_ORDER;
48
49 /* special startoffset used to indicate that we wish to resume */
50 #define STARTOFFSET_RESUME (-1) 
51
52 class CShare;
53
54 /*!
55   \brief Represents a file on a share
56   \sa CFileItemList
57   */
58 class CFileItem :
59       public CGUIListItem, public ISerializable
60 {
61 public:
62   CFileItem(void);
63   CFileItem(const CFileItem& item);
64   CFileItem(const CGUIListItem& item);
65   CFileItem(const CStdString& strLabel);
66   CFileItem(const CStdString& strPath, bool bIsFolder);
67   CFileItem(const CSong& song);
68   CFileItem(const CStdString &path, const CAlbum& album);
69   CFileItem(const CArtist& artist);
70   CFileItem(const CGenre& genre);
71   CFileItem(const CVideoInfoTag& movie);
72   CFileItem(const CShare& share);
73   virtual ~CFileItem(void);
74
75   void Reset();
76   const CFileItem& operator=(const CFileItem& item);
77   virtual void Serialize(CArchive& ar);
78   virtual bool IsFileItem() const { return true; };
79
80   bool IsVideo() const;
81   bool IsPicture() const;
82   bool IsAudio() const;
83   bool IsCUESheet() const;
84   bool IsShoutCast() const;
85   bool IsLastFM() const;
86   bool IsInternetStream() const;
87   bool IsPlayList() const;
88   bool IsSmartPlayList() const;
89   bool IsPythonScript() const;
90   bool IsXBE() const;
91   bool IsDefaultXBE() const;
92   bool IsShortCut() const;
93   bool IsNFO() const;
94   bool IsDVDImage() const;
95   bool IsDVDFile(bool bVobs = true, bool bIfos = true) const;
96   bool IsRAR() const;
97   bool IsZIP() const;
98   bool IsCBZ() const;
99   bool IsCBR() const;
100   bool IsISO9660() const;
101   bool IsCDDA() const;
102   bool IsDVD() const;
103   bool IsOnDVD() const;
104   bool IsHD() const;
105   bool IsRemote() const;
106   bool IsSmb() const;
107   bool IsDAAP() const;
108   bool IsStack() const;
109   bool IsMultiPath() const;
110   bool IsMusicDb() const;
111   bool IsVideoDb() const;
112   bool IsType(const char *ext) const;
113   bool IsVirtualDirectoryRoot() const;
114   bool IsReadOnly() const;
115   bool CanQueue() const;
116   void SetCanQueue(bool bYesNo);
117   bool IsParentFolder() const;
118   bool IsFileFolder() const;
119   bool IsMemoryUnit() const;
120   bool IsRemovable() const;
121   bool IsTuxBox() const;
122
123   void RemoveExtension();
124   void CleanFileName();
125   void FillInDefaultIcon();
126   void SetMusicThumb(bool alwaysCheckRemote = false);
127   void SetFileSizeLabel();
128   virtual void SetLabel(const CStdString &strLabel);
129   CURL GetAsUrl() const;
130   bool IsLabelPreformated() const { return m_bLabelPreformated; }
131   void SetLabelPreformated(bool bYesNo) { m_bLabelPreformated=bYesNo; }
132
133   bool HasMusicInfoTag() const
134   {
135     return m_musicInfoTag != NULL;
136   }
137
138   inline CMusicInfoTag* GetMusicInfoTag()
139   {
140     if (!m_musicInfoTag)
141       m_musicInfoTag = new CMusicInfoTag;
142
143     return m_musicInfoTag;
144   }
145
146   inline const CMusicInfoTag* GetMusicInfoTag() const
147   {
148     return m_musicInfoTag;
149   }
150
151   bool HasVideoInfoTag() const
152   {
153     return m_videoInfoTag != NULL;
154   }
155   
156   inline CVideoInfoTag* GetVideoInfoTag()
157   {
158     if (!m_videoInfoTag)
159       m_videoInfoTag = new CVideoInfoTag;
160
161     return m_videoInfoTag;
162   }
163   
164   inline const CVideoInfoTag* GetVideoInfoTag() const
165   {
166     return m_videoInfoTag;
167   }
168
169   // Gets the cached thumb filename (no existence checks)
170   CStdString GetCachedVideoThumb();
171   CStdString GetCachedPictureThumb();
172   CStdString GetCachedArtistThumb();
173   CStdString GetCachedProgramThumb();
174   CStdString GetCachedGameSaveThumb();
175   CStdString GetCachedProfileThumb();
176   CStdString GetCachedSeasonThumb();
177
178   // Sets the video thumb (cached first, else caches user thumb)
179   void SetVideoThumb();
180
181   // Sets the cached thumb for the item if it exists
182   void SetCachedVideoThumb();
183   void SetCachedPictureThumb();
184   void SetCachedArtistThumb();
185   void SetCachedProgramThumb();
186   void SetCachedGameSavesThumb();
187   void SetCachedMusicThumb();
188   void SetCachedSeasonThumb();
189
190   // Gets the user thumb, if it exists
191   CStdString GetUserVideoThumb();
192   CStdString GetUserMusicThumb(bool alwaysCheckRemote = false);
193
194   // Caches the user thumb and assigns it to the item
195   void SetUserVideoThumb();
196   void SetUserProgramThumb();
197   void SetUserMusicThumb(bool alwaysCheckRemote = false);
198
199   virtual bool LoadMusicTag();
200
201   /* returns the content type of this item if known. will lookup for http streams */  
202   const CStdString& GetContentType() const; 
203
204   /* sets the contenttype if known beforehand */
205   void              SetContentType(const CStdString& content) { m_contenttype = content; } ;  
206
207   bool IsSamePath(const CFileItem *item);
208 private:
209   // Gets the .tbn file associated with this item
210   CStdString GetTBNFile();
211   // Gets the previously cached thumb file (with existence checks)
212   CStdString GetPreviouslyCachedMusicThumb();
213
214 public:
215   CStdString m_strPath;            ///< complete path to item
216   bool m_bIsShareOrDrive;    ///< is this a root share/drive
217   int m_iDriveType;     ///< If \e m_bIsShareOrDrive is \e true, use to get the share type. Types see: CShare::m_iDriveType
218   CDateTime m_dateTime;             ///< file creation date & time
219   __int64 m_dwSize;             ///< file size (0 for folders)
220   float m_fRating;
221   CStdString m_strDVDLabel;
222   CStdString m_strTitle;
223   int m_iprogramCount;
224   int m_idepth;
225   long m_lStartOffset;
226   long m_lEndOffset;
227   int m_iLockMode;
228   CStdString m_strLockCode;
229   int m_iHasLock; // 0 - no lock 1 - lock, but unlocked 2 - locked
230   int m_iBadPwdCount;
231 private:
232   CStdString GetFolderThumb(const CStdString &folderJPG = "folder.jpg") const;
233
234   bool m_bIsParentFolder;
235   bool m_bCanQueue;
236   bool m_bLabelPreformated;
237   CStdString m_contenttype;
238   CMusicInfoTag* m_musicInfoTag;
239   CVideoInfoTag* m_videoInfoTag;
240 };
241
242 /*!
243   \brief A vector of pointer to CFileItem
244   \sa CFileItem
245   */
246 typedef vector<CFileItem*> VECFILEITEMS;
247
248 /*!
249   \brief Iterator for VECFILEITEMS
250   \sa CFileItemList
251   */
252 typedef vector<CFileItem*>::iterator IVECFILEITEMS;
253
254 /*!
255   \brief A map of pointers to CFileItem
256   \sa CFileItem
257   */
258 typedef map<CStdString, CFileItem*> MAPFILEITEMS;
259
260 /*!
261   \brief Iterator for MAPFILEITEMS
262   \sa MAPFILEITEMS
263   */
264 typedef map<CStdString, CFileItem*>::iterator IMAPFILEITEMS;
265
266 /*!
267   \brief Pair for MAPFILEITEMS
268   \sa MAPFILEITEMS
269   */
270 typedef pair<CStdString, CFileItem*> MAPFILEITEMSPAIR;
271
272 typedef bool (*FILEITEMLISTCOMPARISONFUNC) (CFileItem* pItem1, CFileItem* pItem2);
273 /*!
274   \brief Represents a list of files
275   \sa CFileItemList, CFileItem
276   */
277 class CFileItemList : public CFileItem
278 {
279 public:
280   CFileItemList();
281   CFileItemList(const CStdString& strPath);
282   virtual ~CFileItemList();
283   virtual void Serialize(CArchive& ar);
284   CFileItem* operator[] (int iItem);
285   const CFileItem* operator[] (int iItem) const;
286   CFileItem* operator[] (const CStdString& strPath);
287   const CFileItem* operator[] (const CStdString& strPath) const;
288   void Clear();
289   void ClearKeepPointer();
290   void Add(CFileItem* pItem);
291   void AddFront(CFileItem* pItem, int itemPosition);
292   void Remove(CFileItem* pItem);
293   void Remove(int iItem);
294   CFileItem* Get(int iItem);
295   const CFileItem* Get(int iItem) const;
296   CFileItem* Get(const CStdString& strPath);
297   const CFileItem* Get(const CStdString& strPath) const;
298   int Size() const;
299   bool IsEmpty() const;
300   void Append(const CFileItemList& itemlist);
301   void AppendPointer(const CFileItemList& itemlist);
302   void Reserve(int iCount);
303   void Sort(SORT_METHOD sortMethod, SORT_ORDER sortOrder);
304   void Randomize();
305   void SetMusicThumbs();
306   void FillInDefaultIcons();
307   int GetFolderCount() const;
308   int GetFileCount() const;
309   int GetSelectedCount() const;
310   void FilterCueItems();
311   void RemoveExtensions();
312   void CleanFileNames();
313   void SetFastLookup(bool fastLookup);
314   bool Contains(const CStdString& fileName);
315   bool GetFastLookup() { return m_fastLookup; };
316   void Stack();
317   SORT_ORDER GetSortOrder() const { return m_sortOrder; }
318   SORT_METHOD GetSortMethod() const { return m_sortMethod; }
319   bool Load();
320   bool Save();
321   void SetCacheToDisc(bool bYesNo) { m_bCacheToDisc=bYesNo; }
322   bool GetCacheToDisc() { return m_bCacheToDisc; }
323   void RemoveDiscCache();
324   bool AlwaysCache();
325
326   void SetCachedVideoThumbs();
327   void SetCachedProgramThumbs();
328   void SetCachedGameSavesThumbs();
329   void SetCachedMusicThumbs();
330   void SetProgramThumbs();
331   void SetGameSavesThumbs();
332
333   void Swap(unsigned int item1, unsigned int item2);
334
335   void UpdateItem(const CFileItem *item);
336 private:
337   void Sort(FILEITEMLISTCOMPARISONFUNC func);
338   CStdString GetDiscCacheFile();
339
340   VECFILEITEMS m_items;
341   MAPFILEITEMS m_map;
342   bool m_fastLookup;
343   SORT_METHOD m_sortMethod;
344   SORT_ORDER m_sortOrder;
345   bool m_bCacheToDisc;
346 };