aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmarshallnz <jcmarsha@gmail.com>2013-02-02 13:09:28 -0800
committerjmarshallnz <jcmarsha@gmail.com>2013-02-02 13:09:28 -0800
commitd9624ee8e328b103a8abaeee03995a7ff7a1539e (patch)
treed3d12e28762700793826291e09addba76d2a3f8f
parent612f2444731c2a40fb0a1a8fb799acd1a295f677 (diff)
parent1bc536b01d89e1d69cbc620a5540668837e9a956 (diff)
Merge pull request #2161 from Montellese/xsp_cleanup
smartplaylists: some cleanup
-rw-r--r--xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp14
-rw-r--r--xbmc/filesystem/SmartPlaylistDirectory.cpp12
-rw-r--r--xbmc/playlists/SmartPlayList.cpp343
-rw-r--r--xbmc/playlists/SmartPlayList.h23
4 files changed, 199 insertions, 193 deletions
diff --git a/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp b/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp
index b9c4eb340f..84ff9f124f 100644
--- a/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp
+++ b/xbmc/dialogs/GUIDialogSmartPlaylistRule.cpp
@@ -372,12 +372,13 @@ void CGUIDialogSmartPlaylistRule::UpdateButtons()
SendMessage(GUI_MSG_LABEL_RESET, CONTROL_OPERATOR);
CONTROL_ENABLE(CONTROL_VALUE);
- CONTROL_DISABLE(CONTROL_BROWSE);
+ if (CSmartPlaylistRule::IsFieldBrowseable(m_rule.m_field))
+ CONTROL_ENABLE(CONTROL_BROWSE);
+ else
+ CONTROL_DISABLE(CONTROL_BROWSE);
+
switch (CSmartPlaylistRule::GetFieldType(m_rule.m_field))
{
- case CSmartPlaylistRule::BROWSEABLE_FIELD:
- CONTROL_ENABLE(CONTROL_BROWSE);
- // fall through...
case CSmartPlaylistRule::TEXT_FIELD:
// text fields - add the usual comparisons
AddOperatorLabel(CSmartPlaylistRule::OPERATOR_EQUALS);
@@ -388,9 +389,6 @@ void CGUIDialogSmartPlaylistRule::UpdateButtons()
AddOperatorLabel(CSmartPlaylistRule::OPERATOR_ENDS_WITH);
break;
- case CSmartPlaylistRule::BROWSEABLE_NUMERIC_FIELD:
- CONTROL_ENABLE(CONTROL_BROWSE);
- // fall through...
case CSmartPlaylistRule::NUMERIC_FIELD:
case CSmartPlaylistRule::SECONDS_FIELD:
// numerical fields - less than greater than
@@ -438,8 +436,6 @@ void CGUIDialogSmartPlaylistRule::UpdateButtons()
CSmartPlaylistRule::FIELD_TYPE fieldType = CSmartPlaylistRule::GetFieldType(m_rule.m_field);
switch (fieldType)
{
- case CSmartPlaylistRule::BROWSEABLE_FIELD:
- case CSmartPlaylistRule::BROWSEABLE_NUMERIC_FIELD:
case CSmartPlaylistRule::TEXT_FIELD:
case CSmartPlaylistRule::PLAYLIST_FIELD:
case CSmartPlaylistRule::TEXTIN_FIELD:
diff --git a/xbmc/filesystem/SmartPlaylistDirectory.cpp b/xbmc/filesystem/SmartPlaylistDirectory.cpp
index 5404f86dcb..7ed219d6c2 100644
--- a/xbmc/filesystem/SmartPlaylistDirectory.cpp
+++ b/xbmc/filesystem/SmartPlaylistDirectory.cpp
@@ -21,15 +21,15 @@
#include <math.h>
#include "SmartPlaylistDirectory.h"
-#include "utils/log.h"
-#include "playlists/SmartPlayList.h"
-#include "music/MusicDatabase.h"
-#include "video/VideoDatabase.h"
-#include "Directory.h"
-#include "File.h"
#include "FileItem.h"
+#include "filesystem/Directory.h"
+#include "filesystem/File.h"
+#include "music/MusicDatabase.h"
+#include "playlists/SmartPlayList.h"
#include "settings/GUISettings.h"
+#include "utils/log.h"
#include "utils/URIUtils.h"
+#include "video/VideoDatabase.h"
#define PROPERTY_PATH_DB "path.db"
#define PROPERTY_SORT_ORDER "sort.order"
diff --git a/xbmc/playlists/SmartPlayList.cpp b/xbmc/playlists/SmartPlayList.cpp
index aad7c683f4..691c70c441 100644
--- a/xbmc/playlists/SmartPlayList.cpp
+++ b/xbmc/playlists/SmartPlayList.cpp
@@ -19,21 +19,21 @@
*/
#include "SmartPlayList.h"
-#include "utils/log.h"
-#include "utils/StringUtils.h"
-#include "filesystem/SmartPlaylistDirectory.h"
+#include "Util.h"
+#include "XBDateTime.h"
#include "filesystem/File.h"
+#include "filesystem/SmartPlaylistDirectory.h"
+#include "guilib/LocalizeStrings.h"
#include "utils/CharsetConverter.h"
#include "utils/DatabaseUtils.h"
#include "utils/JSONVariantParser.h"
#include "utils/JSONVariantWriter.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
#include "utils/Variant.h"
#include "utils/XMLUtils.h"
#include "video/VideoDatabase.h"
-#include "Util.h"
-#include "XBDateTime.h"
-#include "guilib/LocalizeStrings.h"
using namespace std;
using namespace XFILE;
@@ -44,70 +44,71 @@ typedef struct
Field field;
SortBy sort;
CSmartPlaylistRule::FIELD_TYPE type;
+ bool browseable;
int localizedString;
} translateField;
static const translateField fields[] = {
- { "none", FieldNone, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 231 },
- { "filename", FieldFilename, SortByFile, CSmartPlaylistRule::TEXT_FIELD, 561 },
- { "path", FieldPath, SortByPath, CSmartPlaylistRule::BROWSEABLE_FIELD, 573 },
- { "album", FieldAlbum, SortByAlbum, CSmartPlaylistRule::BROWSEABLE_FIELD, 558 },
- { "albumartist", FieldAlbumArtist, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 566 },
- { "artist", FieldArtist, SortByArtist, CSmartPlaylistRule::BROWSEABLE_FIELD, 557 },
- { "tracknumber", FieldTrackNumber, SortByTrackNumber, CSmartPlaylistRule::NUMERIC_FIELD, 554 },
- { "comment", FieldComment, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 569 },
- { "review", FieldReview, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 183 },
- { "themes", FieldThemes, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21895 },
- { "moods", FieldMoods, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 175 },
- { "styles", FieldStyles, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 176 },
- { "type", FieldAlbumType, SortByAlbumType, CSmartPlaylistRule::TEXT_FIELD, 564 },
- { "label", FieldMusicLabel, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21899 },
- { "title", FieldTitle, SortByTitle, CSmartPlaylistRule::BROWSEABLE_FIELD, 556 },
- { "sorttitle", FieldSortTitle, SortBySortTitle, CSmartPlaylistRule::TEXT_FIELD, 556 },
- { "year", FieldYear, SortByYear, CSmartPlaylistRule::BROWSEABLE_NUMERIC_FIELD, 562 },
- { "time", FieldTime, SortByTime, CSmartPlaylistRule::SECONDS_FIELD, 180 },
- { "playcount", FieldPlaycount, SortByPlaycount, CSmartPlaylistRule::NUMERIC_FIELD, 567 },
- { "lastplayed", FieldLastPlayed, SortByLastPlayed, CSmartPlaylistRule::DATE_FIELD, 568 },
- { "inprogress", FieldInProgress, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, 575 },
- { "rating", FieldRating, SortByRating, CSmartPlaylistRule::NUMERIC_FIELD, 563 },
- { "votes", FieldVotes, SortByVotes, CSmartPlaylistRule::TEXT_FIELD, 205 },
- { "top250", FieldTop250, SortByTop250, CSmartPlaylistRule::NUMERIC_FIELD, 13409 },
- { "mpaarating", FieldMPAA, SortByMPAA, CSmartPlaylistRule::TEXT_FIELD, 20074 },
- { "dateadded", FieldDateAdded, SortByDateAdded, CSmartPlaylistRule::DATE_FIELD, 570 },
- { "genre", FieldGenre, SortByGenre, CSmartPlaylistRule::BROWSEABLE_FIELD, 515 },
- { "plot", FieldPlot, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 207 },
- { "plotoutline", FieldPlotOutline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 203 },
- { "tagline", FieldTagline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 202 },
- { "set", FieldSet, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 20457 },
- { "director", FieldDirector, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 20339 },
- { "actor", FieldActor, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 20337 },
- { "writers", FieldWriter, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 20417 },
- { "airdate", FieldAirDate, SortByYear, CSmartPlaylistRule::DATE_FIELD, 20416 },
- { "hastrailer", FieldTrailer, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, 20423 },
- { "studio", FieldStudio, SortByStudio, CSmartPlaylistRule::BROWSEABLE_FIELD, 572 },
- { "country", FieldCountry, SortByCountry, CSmartPlaylistRule::BROWSEABLE_FIELD, 574 },
- { "tvshow", FieldTvShowTitle, SortByTvShowTitle, CSmartPlaylistRule::BROWSEABLE_FIELD, 20364 },
- { "status", FieldTvShowStatus, SortByTvShowStatus, CSmartPlaylistRule::TEXT_FIELD, 126 },
- { "season", FieldSeason, SortBySeason, CSmartPlaylistRule::NUMERIC_FIELD, 20373 },
- { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CSmartPlaylistRule::NUMERIC_FIELD, 20359 },
- { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, 20360 },
- { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, 21457 },
- { "videoresolution", FieldVideoResolution, SortByVideoResolution, CSmartPlaylistRule::NUMERIC_FIELD, 21443 },
- { "videocodec", FieldVideoCodec, SortByVideoCodec, CSmartPlaylistRule::TEXTIN_FIELD, 21445 },
- { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CSmartPlaylistRule::NUMERIC_FIELD, 21374 },
- { "audiochannels", FieldAudioChannels, SortByAudioChannels, CSmartPlaylistRule::NUMERIC_FIELD, 21444 },
- { "audiocodec", FieldAudioCodec, SortByAudioCodec, CSmartPlaylistRule::TEXTIN_FIELD, 21446 },
- { "audiolanguage", FieldAudioLanguage, SortByAudioLanguage, CSmartPlaylistRule::TEXTIN_FIELD, 21447 },
- { "subtitlelanguage", FieldSubtitleLanguage, SortBySubtitleLanguage, CSmartPlaylistRule::TEXTIN_FIELD, 21448 },
- { "random", FieldRandom, SortByRandom, CSmartPlaylistRule::TEXT_FIELD, 590 },
- { "playlist", FieldPlaylist, SortByPlaylistOrder, CSmartPlaylistRule::PLAYLIST_FIELD, 559 },
- { "tag", FieldTag, SortByNone, CSmartPlaylistRule::BROWSEABLE_FIELD, 20459 },
- { "instruments", FieldInstruments, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21892 },
- { "biography", FieldBiography, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21887 },
- { "born", FieldBorn, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21893 },
- { "bandformed", FieldBandFormed, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21894 },
- { "disbanded", FieldDisbanded, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21896 },
- { "died", FieldDied, SortByNone, CSmartPlaylistRule::TEXT_FIELD, 21897 }
+ { "none", FieldNone, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 231 },
+ { "filename", FieldFilename, SortByFile, CSmartPlaylistRule::TEXT_FIELD, false, 561 },
+ { "path", FieldPath, SortByPath, CSmartPlaylistRule::TEXT_FIELD, true, 573 },
+ { "album", FieldAlbum, SortByAlbum, CSmartPlaylistRule::TEXT_FIELD, true, 558 },
+ { "albumartist", FieldAlbumArtist, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 566 },
+ { "artist", FieldArtist, SortByArtist, CSmartPlaylistRule::TEXT_FIELD, true, 557 },
+ { "tracknumber", FieldTrackNumber, SortByTrackNumber, CSmartPlaylistRule::NUMERIC_FIELD, false, 554 },
+ { "comment", FieldComment, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 569 },
+ { "review", FieldReview, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 183 },
+ { "themes", FieldThemes, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21895 },
+ { "moods", FieldMoods, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 175 },
+ { "styles", FieldStyles, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 176 },
+ { "type", FieldAlbumType, SortByAlbumType, CSmartPlaylistRule::TEXT_FIELD, false, 564 },
+ { "label", FieldMusicLabel, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21899 },
+ { "title", FieldTitle, SortByTitle, CSmartPlaylistRule::TEXT_FIELD, true, 556 },
+ { "sorttitle", FieldSortTitle, SortBySortTitle, CSmartPlaylistRule::TEXT_FIELD, false, 556 },
+ { "year", FieldYear, SortByYear, CSmartPlaylistRule::NUMERIC_FIELD, true, 562 },
+ { "time", FieldTime, SortByTime, CSmartPlaylistRule::SECONDS_FIELD, false, 180 },
+ { "playcount", FieldPlaycount, SortByPlaycount, CSmartPlaylistRule::NUMERIC_FIELD, false, 567 },
+ { "lastplayed", FieldLastPlayed, SortByLastPlayed, CSmartPlaylistRule::DATE_FIELD, false, 568 },
+ { "inprogress", FieldInProgress, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, false, 575 },
+ { "rating", FieldRating, SortByRating, CSmartPlaylistRule::NUMERIC_FIELD, false, 563 },
+ { "votes", FieldVotes, SortByVotes, CSmartPlaylistRule::TEXT_FIELD, false, 205 },
+ { "top250", FieldTop250, SortByTop250, CSmartPlaylistRule::NUMERIC_FIELD, false, 13409 },
+ { "mpaarating", FieldMPAA, SortByMPAA, CSmartPlaylistRule::TEXT_FIELD, false, 20074 },
+ { "dateadded", FieldDateAdded, SortByDateAdded, CSmartPlaylistRule::DATE_FIELD, false, 570 },
+ { "genre", FieldGenre, SortByGenre, CSmartPlaylistRule::TEXT_FIELD, true, 515 },
+ { "plot", FieldPlot, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 207 },
+ { "plotoutline", FieldPlotOutline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 203 },
+ { "tagline", FieldTagline, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 202 },
+ { "set", FieldSet, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 20457 },
+ { "director", FieldDirector, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 20339 },
+ { "actor", FieldActor, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 20337 },
+ { "writers", FieldWriter, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 20417 },
+ { "airdate", FieldAirDate, SortByYear, CSmartPlaylistRule::DATE_FIELD, false, 20416 },
+ { "hastrailer", FieldTrailer, SortByNone, CSmartPlaylistRule::BOOLEAN_FIELD, false, 20423 },
+ { "studio", FieldStudio, SortByStudio, CSmartPlaylistRule::TEXT_FIELD, true, 572 },
+ { "country", FieldCountry, SortByCountry, CSmartPlaylistRule::TEXT_FIELD, true, 574 },
+ { "tvshow", FieldTvShowTitle, SortByTvShowTitle, CSmartPlaylistRule::TEXT_FIELD, true, 20364 },
+ { "status", FieldTvShowStatus, SortByTvShowStatus, CSmartPlaylistRule::TEXT_FIELD, false, 126 },
+ { "season", FieldSeason, SortBySeason, CSmartPlaylistRule::NUMERIC_FIELD, false, 20373 },
+ { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CSmartPlaylistRule::NUMERIC_FIELD, false, 20359 },
+ { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, false, 20360 },
+ { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, false, 21457 },
+ { "videoresolution", FieldVideoResolution, SortByVideoResolution, CSmartPlaylistRule::NUMERIC_FIELD, false, 21443 },
+ { "videocodec", FieldVideoCodec, SortByVideoCodec, CSmartPlaylistRule::TEXTIN_FIELD, false, 21445 },
+ { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CSmartPlaylistRule::NUMERIC_FIELD, false, 21374 },
+ { "audiochannels", FieldAudioChannels, SortByAudioChannels, CSmartPlaylistRule::NUMERIC_FIELD, false, 21444 },
+ { "audiocodec", FieldAudioCodec, SortByAudioCodec, CSmartPlaylistRule::TEXTIN_FIELD, false, 21446 },
+ { "audiolanguage", FieldAudioLanguage, SortByAudioLanguage, CSmartPlaylistRule::TEXTIN_FIELD, false, 21447 },
+ { "subtitlelanguage", FieldSubtitleLanguage, SortBySubtitleLanguage, CSmartPlaylistRule::TEXTIN_FIELD, false, 21448 },
+ { "random", FieldRandom, SortByRandom, CSmartPlaylistRule::TEXT_FIELD, false, 590 },
+ { "playlist", FieldPlaylist, SortByPlaylistOrder, CSmartPlaylistRule::PLAYLIST_FIELD, false, 559 },
+ { "tag", FieldTag, SortByNone, CSmartPlaylistRule::TEXT_FIELD, true, 20459 },
+ { "instruments", FieldInstruments, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21892 },
+ { "biography", FieldBiography, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21887 },
+ { "born", FieldBorn, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21893 },
+ { "bandformed", FieldBandFormed, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21894 },
+ { "disbanded", FieldDisbanded, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21896 },
+ { "died", FieldDied, SortByNone, CSmartPlaylistRule::TEXT_FIELD, false, 21897 }
};
#define NUM_FIELDS sizeof(fields) / sizeof(translateField)
@@ -119,22 +120,23 @@ typedef struct
int localizedString;
} operatorField;
-static const operatorField operators[] = { { "contains", CSmartPlaylistRule::OPERATOR_CONTAINS, 21400 },
- { "doesnotcontain", CSmartPlaylistRule::OPERATOR_DOES_NOT_CONTAIN, 21401 },
- { "is", CSmartPlaylistRule::OPERATOR_EQUALS, 21402 },
- { "isnot", CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL, 21403 },
- { "startswith", CSmartPlaylistRule::OPERATOR_STARTS_WITH, 21404 },
- { "endswith", CSmartPlaylistRule::OPERATOR_ENDS_WITH, 21405 },
- { "greaterthan", CSmartPlaylistRule::OPERATOR_GREATER_THAN, 21406 },
- { "lessthan", CSmartPlaylistRule::OPERATOR_LESS_THAN, 21407 },
- { "after", CSmartPlaylistRule::OPERATOR_AFTER, 21408 },
- { "before", CSmartPlaylistRule::OPERATOR_BEFORE, 21409 },
- { "inthelast", CSmartPlaylistRule::OPERATOR_IN_THE_LAST, 21410 },
- { "notinthelast", CSmartPlaylistRule::OPERATOR_NOT_IN_THE_LAST, 21411 },
- { "true", CSmartPlaylistRule::OPERATOR_TRUE, 20122 },
- { "false", CSmartPlaylistRule::OPERATOR_FALSE, 20424 },
- { "between", CSmartPlaylistRule::OPERATOR_BETWEEN, 21456 }
- };
+static const operatorField operators[] = {
+ { "contains", CSmartPlaylistRule::OPERATOR_CONTAINS, 21400 },
+ { "doesnotcontain", CSmartPlaylistRule::OPERATOR_DOES_NOT_CONTAIN, 21401 },
+ { "is", CSmartPlaylistRule::OPERATOR_EQUALS, 21402 },
+ { "isnot", CSmartPlaylistRule::OPERATOR_DOES_NOT_EQUAL, 21403 },
+ { "startswith", CSmartPlaylistRule::OPERATOR_STARTS_WITH, 21404 },
+ { "endswith", CSmartPlaylistRule::OPERATOR_ENDS_WITH, 21405 },
+ { "greaterthan", CSmartPlaylistRule::OPERATOR_GREATER_THAN, 21406 },
+ { "lessthan", CSmartPlaylistRule::OPERATOR_LESS_THAN, 21407 },
+ { "after", CSmartPlaylistRule::OPERATOR_AFTER, 21408 },
+ { "before", CSmartPlaylistRule::OPERATOR_BEFORE, 21409 },
+ { "inthelast", CSmartPlaylistRule::OPERATOR_IN_THE_LAST, 21410 },
+ { "notinthelast", CSmartPlaylistRule::OPERATOR_NOT_IN_THE_LAST, 21411 },
+ { "true", CSmartPlaylistRule::OPERATOR_TRUE, 20122 },
+ { "false", CSmartPlaylistRule::OPERATOR_FALSE, 20424 },
+ { "between", CSmartPlaylistRule::OPERATOR_BETWEEN, 21456 }
+};
#define NUM_OPERATORS sizeof(operators) / sizeof(operatorField)
@@ -145,8 +147,12 @@ CSmartPlaylistRule::CSmartPlaylistRule()
m_parameter.clear();
}
-bool CSmartPlaylistRule::Load(TiXmlElement *element, const CStdString &encoding /* = "UTF-8" */)
+bool CSmartPlaylistRule::Load(const TiXmlNode *node, const std::string &encoding /* = "UTF-8" */)
{
+ if (node == NULL)
+ return false;
+
+ const TiXmlElement *element = node->ToElement();
if (element == NULL)
return false;
@@ -165,14 +171,14 @@ bool CSmartPlaylistRule::Load(TiXmlElement *element, const CStdString &encoding
if (m_operator == OPERATOR_TRUE || m_operator == OPERATOR_FALSE)
return true;
- TiXmlNode *parameter = element->FirstChild();
+ const TiXmlNode *parameter = element->FirstChild();
if (parameter == NULL)
return false;
if (parameter->Type() == TiXmlNode::TINYXML_TEXT)
{
CStdString utf8Parameter;
- if (encoding.IsEmpty()) // utf8
+ if (encoding.empty()) // utf8
utf8Parameter = parameter->ValueStr();
else
g_charsetConverter.stringCharsetToUtf8(encoding, parameter->ValueStr(), utf8Parameter);
@@ -182,14 +188,14 @@ bool CSmartPlaylistRule::Load(TiXmlElement *element, const CStdString &encoding
}
else if (parameter->Type() == TiXmlNode::TINYXML_ELEMENT)
{
- TiXmlElement *valueElem = element->FirstChildElement("value");
- while (valueElem != NULL)
+ const TiXmlNode *valueNode = element->FirstChild("value");
+ while (valueNode != NULL)
{
- TiXmlNode *value = valueElem->FirstChild();
+ const TiXmlNode *value = valueNode->FirstChild();
if (value != NULL && value->Type() == TiXmlNode::TINYXML_TEXT)
{
CStdString utf8Parameter;
- if (encoding.IsEmpty()) // utf8
+ if (encoding.empty()) // utf8
utf8Parameter = value->ValueStr();
else
g_charsetConverter.stringCharsetToUtf8(encoding, value->ValueStr(), utf8Parameter);
@@ -198,7 +204,7 @@ bool CSmartPlaylistRule::Load(TiXmlElement *element, const CStdString &encoding
m_parameter.push_back(utf8Parameter);
}
- valueElem = valueElem->NextSiblingElement("value");
+ valueNode = valueNode->NextSibling("value");
}
}
else
@@ -280,7 +286,7 @@ bool CSmartPlaylistRule::Save(CVariant &obj) const
Field CSmartPlaylistRule::TranslateField(const char *field)
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
- if (strcmpi(field, fields[i].string) == 0) return fields[i].field;
+ if (StringUtils::EqualsNoCase(field, fields[i].string)) return fields[i].field;
return FieldNone;
}
@@ -294,7 +300,7 @@ CStdString CSmartPlaylistRule::TranslateField(Field field)
SortBy CSmartPlaylistRule::TranslateOrder(const char *order)
{
for (unsigned int i = 0; i < NUM_FIELDS; i++)
- if (strcmpi(order, fields[i].string) == 0) return fields[i].sort;
+ if (StringUtils::EqualsNoCase(order, fields[i].string)) return fields[i].sort;
return SortByNone;
}
@@ -308,7 +314,7 @@ CStdString CSmartPlaylistRule::TranslateOrder(SortBy order)
CSmartPlaylistRule::SEARCH_OPERATOR CSmartPlaylistRule::TranslateOperator(const char *oper)
{
for (unsigned int i = 0; i < NUM_OPERATORS; i++)
- if (strcmpi(oper, operators[i].string) == 0) return operators[i].op;
+ if (StringUtils::EqualsNoCase(oper, operators[i].string)) return operators[i].op;
return OPERATOR_CONTAINS;
}
@@ -333,6 +339,14 @@ CSmartPlaylistRule::FIELD_TYPE CSmartPlaylistRule::GetFieldType(Field field)
return TEXT_FIELD;
}
+bool CSmartPlaylistRule::IsFieldBrowseable(Field field)
+{
+ for (unsigned int i = 0; i < NUM_FIELDS; i++)
+ if (field == fields[i].field) return fields[i].browseable;
+
+ return false;
+}
+
vector<Field> CSmartPlaylistRule::GetFields(const CStdString &type)
{
vector<Field> fields;
@@ -1136,44 +1150,31 @@ CSmartPlaylist::CSmartPlaylist()
Reset();
}
-TiXmlElement *CSmartPlaylist::OpenAndReadName(const CStdString &path)
+bool CSmartPlaylist::OpenAndReadName(const CStdString &path)
{
- CFileStream file;
- if (!file.Open(path))
- {
- CLog::Log(LOGERROR, "Error loading Smart playlist %s (failed to read file)", path.c_str());
- return NULL;
- }
-
- m_xmlDoc.Clear();
- file >> m_xmlDoc;
+ if (readNameFromPath(path) == NULL)
+ return false;
- TiXmlElement *root = readName();
- if (m_playlistName.empty())
- {
- m_playlistName = CUtil::GetTitleFromPath(path);
- if (URIUtils::GetExtension(m_playlistName) == ".xsp")
- URIUtils::RemoveExtension(m_playlistName);
- }
- return root;
+ return !m_playlistName.empty();
}
-TiXmlElement* CSmartPlaylist::readName()
+const TiXmlNode* CSmartPlaylist::readName(const TiXmlNode *root)
{
- if (m_xmlDoc.Error())
- {
- CLog::Log(LOGERROR, "Error loading Smart playlist (failed to parse xml: %s)", m_xmlDoc.ErrorDesc());
+ if (root == NULL)
+ return NULL;
+
+ const TiXmlElement *rootElem = root->ToElement();
+ if (rootElem == NULL)
return NULL;
- }
- TiXmlElement *root = m_xmlDoc.RootElement();
- if (!root || strcmpi(root->Value(),"smartplaylist") != 0)
+ if (!root || !StringUtils::EqualsNoCase(root->Value(),"smartplaylist"))
{
CLog::Log(LOGERROR, "Error loading Smart playlist");
return NULL;
}
+
// load the playlist type
- const char* type = root->Attribute("type");
+ const char* type = rootElem->Attribute("type");
if (type)
m_playlistType = type;
// backward compatibility:
@@ -1183,14 +1184,35 @@ TiXmlElement* CSmartPlaylist::readName()
m_playlistType = "musicvideos";
// load the playlist name
- TiXmlHandle name = ((TiXmlHandle)root->FirstChild("name")).FirstChild();
- if (name.Node())
- m_playlistName = name.Node()->Value();
+ XMLUtils::GetString(root, "name", m_playlistName);
return root;
}
-TiXmlElement *CSmartPlaylist::readNameFromXml(const CStdString &xml)
+const TiXmlNode* CSmartPlaylist::readNameFromPath(const CStdString &path)
+{
+ CFileStream file;
+ if (!file.Open(path))
+ {
+ CLog::Log(LOGERROR, "Error loading Smart playlist %s (failed to read file)", path.c_str());
+ return NULL;
+ }
+
+ m_xmlDoc.Clear();
+ file >> m_xmlDoc;
+
+ const TiXmlNode *root = readName(m_xmlDoc.RootElement());
+ if (m_playlistName.empty())
+ {
+ m_playlistName = CUtil::GetTitleFromPath(path);
+ if (URIUtils::GetExtension(m_playlistName) == ".xsp")
+ URIUtils::RemoveExtension(m_playlistName);
+ }
+
+ return root;
+}
+
+const TiXmlNode* CSmartPlaylist::readNameFromXml(const CStdString &xml)
{
if (xml.empty())
{
@@ -1205,12 +1227,25 @@ TiXmlElement *CSmartPlaylist::readNameFromXml(const CStdString &xml)
return NULL;
}
- return readName();
+ const TiXmlNode *root = readName(m_xmlDoc.RootElement());
+
+ return root;
+}
+
+bool CSmartPlaylist::load(const TiXmlNode *root)
+{
+ if (root == NULL)
+ return false;
+
+ CStdString encoding;
+ XMLUtils::GetEncoding(&m_xmlDoc, encoding);
+
+ return LoadFromXML(root, encoding);
}
bool CSmartPlaylist::Load(const CStdString &path)
{
- return load(OpenAndReadName(path));
+ return load(readNameFromPath(path));
}
bool CSmartPlaylist::Load(const CVariant &obj)
@@ -1243,7 +1278,7 @@ bool CSmartPlaylist::Load(const CVariant &obj)
if (obj.isMember("order") && obj["order"].isMember("method") && obj["order"]["method"].isString())
{
if (obj["order"].isMember("direction") && obj["order"]["direction"].isString())
- m_orderDirection = strcmpi(obj["order"]["direction"].asString().c_str(), "ascending") == 0 ? SortOrderAscending : SortOrderDescending;
+ m_orderDirection = StringUtils::EqualsNoCase(obj["order"]["direction"].asString(), "ascending") == 0 ? SortOrderAscending : SortOrderDescending;
m_orderField = CSmartPlaylistRule::TranslateOrder(obj["order"]["method"].asString().c_str());
}
@@ -1256,53 +1291,38 @@ bool CSmartPlaylist::LoadFromXml(const CStdString &xml)
return load(readNameFromXml(xml));
}
-bool CSmartPlaylist::load(TiXmlElement *root)
+bool CSmartPlaylist::LoadFromXML(const TiXmlNode *root, const CStdString &encoding)
{
if (!root)
return false;
- // encoding:
- CStdString encoding;
- XMLUtils::GetEncoding(&m_xmlDoc, encoding);
-
- // from here we decode from XML
- return LoadFromXML(root, encoding);
-}
-
-bool CSmartPlaylist::LoadFromXML(TiXmlElement *root, const CStdString &encoding)
-{
- if (!root)
- return false;
-
- TiXmlHandle match = ((TiXmlHandle)root->FirstChild("match")).FirstChild();
- if (match.Node())
- m_ruleCombination.SetType(strcmpi(match.Node()->Value(), "all") == 0 ? CSmartPlaylistRuleCombination::CombinationAnd : CSmartPlaylistRuleCombination::CombinationOr);
+ CStdString tmp;
+ if (XMLUtils::GetString(root, "match", tmp))
+ m_ruleCombination.SetType(StringUtils::EqualsNoCase(tmp, "all") ? CSmartPlaylistRuleCombination::CombinationAnd : CSmartPlaylistRuleCombination::CombinationOr);
// now the rules
- TiXmlElement *ruleElement = root->FirstChildElement("rule");
- while (ruleElement)
+ const TiXmlNode *ruleNode = root->FirstChild("rule");
+ while (ruleNode)
{
CSmartPlaylistRule rule;
- if (rule.Load(ruleElement, encoding))
+ if (rule.Load(ruleNode, encoding))
m_ruleCombination.AddRule(rule);
- ruleElement = ruleElement->NextSiblingElement("rule");
+ ruleNode = ruleNode->NextSibling("rule");
}
// now any limits
// format is <limit>25</limit>
- TiXmlHandle limit = ((TiXmlHandle)root->FirstChild("limit")).FirstChild();
- if (limit.Node())
- m_limit = atoi(limit.Node()->Value());
+ XMLUtils::GetUInt(root, "limit", m_limit);
// and order
// format is <order direction="ascending">field</order>
- TiXmlElement *order = root->FirstChildElement("order");
+ const TiXmlElement *order = root->FirstChildElement("order");
if (order && order->FirstChild())
{
const char *direction = order->Attribute("direction");
if (direction)
- m_orderDirection = strcmpi(direction, "ascending") == 0 ? SortOrderAscending : SortOrderDescending;
+ m_orderDirection = StringUtils::EqualsNoCase(direction, "ascending") ? SortOrderAscending : SortOrderDescending;
m_orderField = CSmartPlaylistRule::TranslateOrder(order->FirstChild()->Value());
}
return true;
@@ -1330,16 +1350,10 @@ bool CSmartPlaylist::Save(const CStdString &path) const
return false;
// add the <name> tag
- TiXmlText name(m_playlistName.c_str());
- TiXmlElement nodeName("name");
- nodeName.InsertEndChild(name);
- pRoot->InsertEndChild(nodeName);
+ XMLUtils::SetString(pRoot, "name", m_playlistName);
// add the <match> tag
- TiXmlText match(m_ruleCombination.GetType() == CSmartPlaylistRuleCombination::CombinationAnd ? "all" : "one");
- TiXmlElement nodeMatch("match");
- nodeMatch.InsertEndChild(match);
- pRoot->InsertEndChild(nodeMatch);
+ XMLUtils::SetString(pRoot, "match", m_ruleCombination.GetType() == CSmartPlaylistRuleCombination::CombinationAnd ? "all" : "one");
// add <rule> tags
for (CSmartPlaylistRules::const_iterator it = m_ruleCombination.m_rules.begin(); it != m_ruleCombination.m_rules.end(); ++it)
@@ -1347,14 +1361,7 @@ bool CSmartPlaylist::Save(const CStdString &path) const
// add <limit> tag
if (m_limit)
- {
- CStdString limitFormat;
- limitFormat.Format("%i", m_limit);
- TiXmlText limit(limitFormat);
- TiXmlElement nodeLimit("limit");
- nodeLimit.InsertEndChild(limit);
- pRoot->InsertEndChild(nodeLimit);
- }
+ XMLUtils::SetInt(pRoot, "limit", m_limit);
// add <order> tag
if (m_orderField != SortByNone)
diff --git a/xbmc/playlists/SmartPlayList.h b/xbmc/playlists/SmartPlayList.h
index fcf49ecc62..f865f05bb1 100644
--- a/xbmc/playlists/SmartPlayList.h
+++ b/xbmc/playlists/SmartPlayList.h
@@ -34,7 +34,7 @@ class ISmartPlaylistRule
public:
virtual ~ISmartPlaylistRule() { }
- virtual bool Load(TiXmlElement *element, const CStdString &encoding = "UTF-8") = 0;
+ virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") = 0;
virtual bool Load(const CVariant &obj) = 0;
virtual bool Save(TiXmlNode *parent) const = 0;
virtual bool Save(CVariant &obj) const = 0;
@@ -44,6 +44,7 @@ class CSmartPlaylistRule : public ISmartPlaylistRule
{
public:
CSmartPlaylistRule();
+ virtual ~CSmartPlaylistRule() { }
enum SEARCH_OPERATOR { OPERATOR_START = 0,
OPERATOR_CONTAINS,
@@ -65,8 +66,6 @@ public:
};
enum FIELD_TYPE { TEXT_FIELD = 0,
- BROWSEABLE_FIELD,
- BROWSEABLE_NUMERIC_FIELD,
NUMERIC_FIELD,
DATE_FIELD,
PLAYLIST_FIELD,
@@ -75,7 +74,7 @@ public:
TEXTIN_FIELD
};
- virtual bool Load(TiXmlElement *element, const CStdString &encoding = "UTF-8");
+ virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8");
virtual bool Load(const CVariant &obj);
virtual bool Save(TiXmlNode *parent) const;
virtual bool Save(CVariant &obj) const;
@@ -93,6 +92,7 @@ public:
static std::vector<Field> GetFields(const CStdString &type);
static std::vector<SortBy> GetOrders(const CStdString &type);
static FIELD_TYPE GetFieldType(Field field);
+ static bool IsFieldBrowseable(Field field);
CStdString GetLocalizedRule() const;
CStdString GetParameter() const;
@@ -117,13 +117,14 @@ class CSmartPlaylistRuleCombination : public ISmartPlaylistRule
{
public:
CSmartPlaylistRuleCombination();
+ virtual ~CSmartPlaylistRuleCombination() { }
typedef enum {
CombinationOr = 0,
CombinationAnd
} Combination;
- virtual bool Load(TiXmlElement *element, const CStdString &encoding = "UTF-8") { return false; }
+ virtual bool Load(const TiXmlNode *node, const std::string &encoding = "UTF-8") { return false; }
virtual bool Load(const CVariant &obj);
virtual bool Save(TiXmlNode *parent) const { return false; }
virtual bool Save(CVariant &obj) const;
@@ -151,6 +152,7 @@ class CSmartPlaylist
{
public:
CSmartPlaylist();
+ virtual ~CSmartPlaylist() { }
bool Load(const CStdString &path);
bool Load(const CVariant &obj);
@@ -160,8 +162,8 @@ public:
bool Save(CVariant &obj, bool full = true) const;
bool SaveAsJson(CStdString &json, bool full = true) const;
- TiXmlElement *OpenAndReadName(const CStdString &path);
- bool LoadFromXML(TiXmlElement *root, const CStdString &encoding = "UTF-8");
+ bool OpenAndReadName(const CStdString &path);
+ bool LoadFromXML(const TiXmlNode *root, const CStdString &encoding = "UTF-8");
void Reset();
@@ -203,9 +205,10 @@ private:
friend class CGUIDialogSmartPlaylistEditor;
friend class CGUIDialogMediaFilter;
- TiXmlElement* readName();
- TiXmlElement *readNameFromXml(const CStdString &xml);
- bool load(TiXmlElement *root);
+ const TiXmlNode* readName(const TiXmlNode *root);
+ const TiXmlNode* readNameFromPath(const CStdString &path);
+ const TiXmlNode* readNameFromXml(const CStdString &xml);
+ bool load(const TiXmlNode *root);
CSmartPlaylistRuleCombination m_ruleCombination;
CStdString m_playlistName;