aboutsummaryrefslogtreecommitdiff
path: root/src/utils/UrlOptions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/UrlOptions.cpp')
-rw-r--r--src/utils/UrlOptions.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/src/utils/UrlOptions.cpp b/src/utils/UrlOptions.cpp
new file mode 100644
index 0000000000..349ce1f916
--- /dev/null
+++ b/src/utils/UrlOptions.cpp
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2012-2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sstream>
+
+#include "UrlOptions.h"
+#include "URL.h"
+#include "utils/StringUtils.h"
+#include "utils/log.h"
+
+using namespace std;
+
+CUrlOptions::CUrlOptions()
+ : m_strLead("")
+{ }
+
+CUrlOptions::CUrlOptions(const std::string &options, const char *strLead /* = "" */)
+ : m_strLead(strLead)
+{
+ AddOptions(options);
+}
+
+CUrlOptions::~CUrlOptions()
+{ }
+
+std::string CUrlOptions::GetOptionsString(bool withLeadingSeperator /* = false */) const
+{
+ std::string options;
+ for (UrlOptions::const_iterator opt = m_options.begin(); opt != m_options.end(); ++opt)
+ {
+ if (opt != m_options.begin())
+ options += "&";
+
+ options += CURL::Encode(opt->first);
+ if (!opt->second.empty())
+ options += "=" + CURL::Encode(opt->second.asString());
+ }
+
+ if (withLeadingSeperator && !options.empty())
+ {
+ if (m_strLead.empty())
+ options = "?" + options;
+ else
+ options = m_strLead + options;
+ }
+
+ return options;
+}
+
+void CUrlOptions::AddOption(const std::string &key, const char *value)
+{
+ if (key.empty() || value == NULL)
+ return;
+
+ return AddOption(key, string(value));
+}
+
+void CUrlOptions::AddOption(const std::string &key, const std::string &value)
+{
+ if (key.empty())
+ return;
+
+ m_options[key] = value;
+}
+
+void CUrlOptions::AddOption(const std::string &key, int value)
+{
+ if (key.empty())
+ return;
+
+ m_options[key] = value;
+}
+
+void CUrlOptions::AddOption(const std::string &key, float value)
+{
+ if (key.empty())
+ return;
+
+ m_options[key] = value;
+}
+
+void CUrlOptions::AddOption(const std::string &key, double value)
+{
+ if (key.empty())
+ return;
+
+ m_options[key] = value;
+}
+
+void CUrlOptions::AddOption(const std::string &key, bool value)
+{
+ if (key.empty())
+ return;
+
+ m_options[key] = value;
+}
+
+void CUrlOptions::AddOptions(const std::string &options)
+{
+ if (options.empty())
+ return;
+
+ string strOptions = options;
+
+ // if matching the preset leading str, remove from options.
+ if (!m_strLead.empty() && strOptions.compare(0, m_strLead.length(), m_strLead) == 0)
+ strOptions.erase(0, m_strLead.length());
+ else if (strOptions.at(0) == '?' || strOptions.at(0) == '#' || strOptions.at(0) == ';' || strOptions.at(0) == '|')
+ {
+ // remove leading ?, #, ; or | if present
+ if (!m_strLead.empty())
+ CLog::Log(LOGWARNING, "%s: original leading str %s overrided by %c", __FUNCTION__, m_strLead.c_str(), strOptions.at(0));
+ m_strLead = strOptions.at(0);
+ strOptions.erase(0, 1);
+ }
+
+ // split the options by & and process them one by one
+ vector<string> optionList = StringUtils::Split(strOptions, "&");
+ for (vector<string>::const_iterator option = optionList.begin(); option != optionList.end(); ++option)
+ {
+ if (option->empty())
+ continue;
+
+ string key, value;
+
+ size_t pos = option->find('=');
+ key = CURL::Decode(option->substr(0, pos));
+ if (pos != string::npos)
+ value = CURL::Decode(option->substr(pos + 1));
+
+ // the key cannot be empty
+ if (!key.empty())
+ AddOption(key, value);
+ }
+}
+
+void CUrlOptions::AddOptions(const CUrlOptions &options)
+{
+ m_options.insert(options.m_options.begin(), options.m_options.end());
+}
+
+void CUrlOptions::RemoveOption(const std::string &key)
+{
+ if (key.empty())
+ return;
+
+ UrlOptions::iterator option = m_options.find(key);
+ if (option != m_options.end())
+ m_options.erase(option);
+}
+
+bool CUrlOptions::HasOption(const std::string &key) const
+{
+ if (key.empty())
+ return false;
+
+ return m_options.find(key) != m_options.end();
+}
+
+bool CUrlOptions::GetOption(const std::string &key, CVariant &value) const
+{
+ if (key.empty())
+ return false;
+
+ UrlOptions::const_iterator option = m_options.find(key);
+ if (option == m_options.end())
+ return false;
+
+ value = option->second;
+ return true;
+}