bool CSmartPlaylist::Load(const CStdString &path) { TiXmlElement *root = OpenAndReadName(path); if (!root) return false; // encoding: CStdString encoding; XMLUtils::GetEncoding(&m_xmlDoc, encoding); TiXmlHandle match = ((TiXmlHandle)root->FirstChild("match")).FirstChild(); if (match.Node()) m_matchAllRules = strcmpi(match.Node()->Value(), "all") == 0; // now the rules TiXmlElement *rule = root->FirstChildElement("rule"); while (rule) { // format is: // <rule field="Genre" operator="contains">parameter</rule> const char *field = rule->Attribute("field"); const char *oper = rule->Attribute("operator"); TiXmlNode *parameter = rule->FirstChild(); if (field && oper) { // valid rule CStdString utf8Parameter; if (parameter) { if (encoding.IsEmpty()) // utf8 utf8Parameter = parameter->Value(); else g_charsetConverter.stringCharsetToUtf8(encoding, parameter->Value(), utf8Parameter); } CSmartPlaylistRule rule; rule.TranslateStrings(field, oper, utf8Parameter.c_str()); m_playlistRules.push_back(rule); } rule = rule->NextSiblingElement("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()); // and order // format is <order direction="ascending">field</order> TiXmlElement *order = root->FirstChildElement("order"); if (order && order->FirstChild()) { const char *direction = order->Attribute("direction"); if (direction) m_orderAscending = strcmpi(direction, "ascending") == 0; m_orderField = CSmartPlaylistRule::TranslateField(order->FirstChild()->Value()); } return true; }
bool CSmartPlaylist::Load(const CVariant &obj) { if (!obj.isObject() || !obj.isMember("match") || !obj["match"].isString() || !obj.isMember("rules") || !obj["rules"].isArray()) return false; // load the playlist type if (obj.isMember("type") && obj["type"].isString()) m_playlistType = obj["type"].asString(); // backward compatibility: if (m_playlistType == "music") m_playlistType = "songs"; if (m_playlistType == "video") m_playlistType = "musicvideos"; // load the playlist name if (obj.isMember("name") && obj["name"].isString()) m_playlistName = obj["name"].asString(); m_matchAllRules = strcmpi(obj["match"].asString().c_str(), "all") == 0; // now the rules for (CVariant::const_iterator_array it = obj["rules"].begin_array(); it != obj["rules"].end_array(); it++) { CSmartPlaylistRule rule; if (rule.Load(*it)) m_playlistRules.push_back(rule); } // now any limits if (obj.isMember("limit") && (obj["limit"].isInteger() || obj["limit"].isUnsignedInteger()) && obj["limit"].asUnsignedInteger() > 0) m_limit = (unsigned int)obj["limit"].asUnsignedInteger(); // and order if (obj.isMember("order") && obj["order"].isMember("method") && obj["order"]["method"].isString()) { if (obj["order"].isMember("direction") && obj["order"]["direction"].isString()) m_orderAscending = strcmpi(obj["order"]["direction"].asString().c_str(), "ascending") == 0; m_orderField = CSmartPlaylistRule::TranslateOrder(obj["order"]["method"].asString().c_str()); } return true; }
std::vector<std::pair<std::string, int>> CGUIDialogSmartPlaylistRule::GetValidOperators(const CSmartPlaylistRule& rule) { std::vector< std::pair<std::string, int> > labels; switch (rule.GetFieldType(rule.m_field)) { case CDatabaseQueryRule::TEXT_FIELD: // text fields - add the usual comparisons labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_CONTAINS)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_CONTAIN)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_STARTS_WITH)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_ENDS_WITH)); break; case CDatabaseQueryRule::REAL_FIELD: case CDatabaseQueryRule::NUMERIC_FIELD: case CDatabaseQueryRule::SECONDS_FIELD: // numerical fields - less than greater than labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_GREATER_THAN)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_LESS_THAN)); break; case CDatabaseQueryRule::DATE_FIELD: // date field labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_AFTER)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_BEFORE)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_IN_THE_LAST)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_NOT_IN_THE_LAST)); break; case CDatabaseQueryRule::PLAYLIST_FIELD: CONTROL_ENABLE(CONTROL_BROWSE); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL)); break; case CDatabaseQueryRule::BOOLEAN_FIELD: CONTROL_DISABLE(CONTROL_VALUE); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_TRUE)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_FALSE)); break; case CDatabaseQueryRule::TEXTIN_FIELD: labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_EQUALS)); labels.push_back(OperatorLabel(CDatabaseQueryRule::OPERATOR_DOES_NOT_EQUAL)); break; } return labels; }
bool CSmartPlaylist::LoadFromXML(TiXmlElement *root, const CStdString &encoding) { if (!root) return false; TiXmlHandle match = ((TiXmlHandle)root->FirstChild("match")).FirstChild(); if (match.Node()) m_matchAllRules = strcmpi(match.Node()->Value(), "all") == 0; // now the rules TiXmlElement *ruleElement = root->FirstChildElement("rule"); while (ruleElement) { CSmartPlaylistRule rule; rule.Load(ruleElement, encoding); m_playlistRules.push_back(rule); ruleElement = ruleElement->NextSiblingElement("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()); // and order // format is <order direction="ascending">field</order> TiXmlElement *order = root->FirstChildElement("order"); if (order && order->FirstChild()) { const char *direction = order->Attribute("direction"); if (direction) m_orderAscending = strcmpi(direction, "ascending") == 0; m_orderField = CSmartPlaylistRule::TranslateOrder(order->FirstChild()->Value()); } return true; }