3 * Copyright (C) 2005-2013 Team XBMC
6 * This Program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * This Program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with XBMC; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
25 #include "utils/SortUtils.h"
26 #include "utils/StdString.h"
27 #include "utils/XBMCTinyXML.h"
32 class ISmartPlaylistRule
35 virtual ~ISmartPlaylistRule() { }
37 virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") = 0;
38 virtual bool Load(const CVariant &obj) = 0;
39 virtual bool Save(TiXmlNode *parent) const = 0;
40 virtual bool Save(CVariant &obj) const = 0;
43 class CSmartPlaylistRule : public ISmartPlaylistRule
47 virtual ~CSmartPlaylistRule() { }
49 enum SEARCH_OPERATOR { OPERATOR_START = 0,
51 OPERATOR_DOES_NOT_CONTAIN,
53 OPERATOR_DOES_NOT_EQUAL,
56 OPERATOR_GREATER_THAN,
61 OPERATOR_NOT_IN_THE_LAST,
68 enum FIELD_TYPE { TEXT_FIELD = 0,
77 virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8");
78 virtual bool Load(const CVariant &obj);
79 virtual bool Save(TiXmlNode *parent) const;
80 virtual bool Save(CVariant &obj) const;
82 CStdString GetWhereClause(const CDatabase &db, const CStdString& strType) const;
83 static Field TranslateField(const char *field);
84 static CStdString TranslateField(Field field);
85 static SortBy TranslateOrder(const char *order);
86 static CStdString TranslateOrder(SortBy order);
87 static CStdString GetField(Field field, const CStdString& strType);
88 static CStdString TranslateOperator(SEARCH_OPERATOR oper);
90 static CStdString GetLocalizedField(Field field);
91 static CStdString GetLocalizedOperator(SEARCH_OPERATOR oper);
92 static std::vector<Field> GetFields(const CStdString &type);
93 static std::vector<SortBy> GetOrders(const CStdString &type);
94 static FIELD_TYPE GetFieldType(Field field);
95 static bool IsFieldBrowseable(Field field);
97 CStdString GetLocalizedRule() const;
98 CStdString GetParameter() const;
99 void SetParameter(const CStdString &value);
100 void SetParameter(const std::vector<CStdString> &values);
103 SEARCH_OPERATOR m_operator;
104 std::vector<CStdString> m_parameter;
106 static SEARCH_OPERATOR TranslateOperator(const char *oper);
108 CStdString GetVideoResolutionQuery(const CStdString ¶meter) const;
111 class CSmartPlaylistRuleCombination;
113 typedef std::vector<CSmartPlaylistRule> CSmartPlaylistRules;
114 typedef std::vector<CSmartPlaylistRuleCombination> CSmartPlaylistRuleCombinations;
116 class CSmartPlaylistRuleCombination : public ISmartPlaylistRule
119 CSmartPlaylistRuleCombination();
120 virtual ~CSmartPlaylistRuleCombination() { }
127 virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") { return false; }
128 virtual bool Load(const CVariant &obj);
129 virtual bool Save(TiXmlNode *parent) const { return false; }
130 virtual bool Save(CVariant &obj) const;
132 CStdString GetWhereClause(const CDatabase &db, const CStdString& strType, std::set<CStdString> &referencedPlaylists) const;
133 std::string TranslateCombinationType() const;
135 Combination GetType() const { return m_type; }
136 void SetType(Combination combination) { m_type = combination; }
138 void AddRule(const CSmartPlaylistRule &rule);
139 void AddCombination(const CSmartPlaylistRuleCombination &rule);
142 friend class CSmartPlaylist;
143 friend class CGUIDialogSmartPlaylistEditor;
144 friend class CGUIDialogMediaFilter;
147 CSmartPlaylistRuleCombinations m_combinations;
148 CSmartPlaylistRules m_rules;
155 virtual ~CSmartPlaylist() { }
157 bool Load(const CStdString &path);
158 bool Load(const CVariant &obj);
159 bool LoadFromXml(const CStdString &xml);
160 bool LoadFromJson(const CStdString &json);
161 bool Save(const CStdString &path) const;
162 bool Save(CVariant &obj, bool full = true) const;
163 bool SaveAsJson(CStdString &json, bool full = true) const;
165 bool OpenAndReadName(const CStdString &path);
166 bool LoadFromXML(const TiXmlNode *root, const CStdString &encoding = "UTF-8");
170 void SetName(const CStdString &name);
171 void SetType(const CStdString &type); // music, video, mixed
172 const CStdString& GetName() const { return m_playlistName; };
173 const CStdString& GetType() const { return m_playlistType; };
175 void SetMatchAllRules(bool matchAll) { m_ruleCombination.SetType(matchAll ? CSmartPlaylistRuleCombination::CombinationAnd : CSmartPlaylistRuleCombination::CombinationOr); }
176 bool GetMatchAllRules() const { return m_ruleCombination.GetType() == CSmartPlaylistRuleCombination::CombinationAnd; }
178 void SetLimit(unsigned int limit) { m_limit = limit; };
179 unsigned int GetLimit() const { return m_limit; };
181 void SetOrder(SortBy order) { m_orderField = order; };
182 SortBy GetOrder() const { return m_orderField; };
184 void SetOrderAscending(bool orderAscending) { m_orderDirection = orderAscending ? SortOrderAscending : SortOrderDescending; };
185 bool GetOrderAscending() const { return m_orderDirection != SortOrderDescending; };
186 SortOrder GetOrderDirection() const { return m_orderDirection; }
188 /*! \brief get the where clause for a playlist
189 We handle playlists inside playlists separately in order to ensure we don't introduce infinite loops
190 by playlist A including playlist B which also (perhaps via other playlists) then includes playlistA.
192 \param db the database to use to format up results
193 \param referencedPlaylists a set of playlists to know when we reach a cycle
194 \param needWhere whether we need to prepend the where clause with "WHERE "
196 CStdString GetWhereClause(const CDatabase &db, std::set<CStdString> &referencedPlaylists) const;
198 CStdString GetSaveLocation() const;
200 static void GetAvailableFields(const std::string &type, std::vector<std::string> &fieldList);
201 static void GetAvailableOperators(std::vector<std::string> &operatorList);
203 bool IsEmpty(bool ignoreSortAndLimit = true) const;
205 friend class CGUIDialogSmartPlaylistEditor;
206 friend class CGUIDialogMediaFilter;
208 const TiXmlNode* readName(const TiXmlNode *root);
209 const TiXmlNode* readNameFromPath(const CStdString &path);
210 const TiXmlNode* readNameFromXml(const CStdString &xml);
211 bool load(const TiXmlNode *root);
213 CSmartPlaylistRuleCombination m_ruleCombination;
214 CStdString m_playlistName;
215 CStdString m_playlistType;
218 unsigned int m_limit;
220 SortOrder m_orderDirection;
222 CXBMCTinyXML m_xmlDoc;