Skip to content

Commit

Permalink
allow key-only URL options and add CUrlOptions::RemoveOption()
Browse files Browse the repository at this point in the history
  • Loading branch information
Montellese committed Nov 18, 2012
1 parent 2546383 commit 26acb13
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 21 deletions.
6 changes: 6 additions & 0 deletions xbmc/DbUrl.cpp
Expand Up @@ -130,6 +130,12 @@ void CDbUrl::AddOptions(const std::string &options)
updateOptions();
}

void CDbUrl::RemoveOption(const std::string &key)
{
CUrlOptions::RemoveOption(key);
updateOptions();
}

bool CDbUrl::validateOption(const std::string &key, const CVariant &value)
{
if (key.empty())
Expand Down
1 change: 1 addition & 0 deletions xbmc/DbUrl.h
Expand Up @@ -46,6 +46,7 @@ class CDbUrl : public CUrlOptions
virtual void AddOption(const std::string &key, double value);
virtual void AddOption(const std::string &key, bool value);
virtual void AddOptions(const std::string &options);
virtual void RemoveOption(const std::string &key);

protected:
virtual bool parse() = 0;
Expand Down
2 changes: 1 addition & 1 deletion xbmc/URL.cpp
Expand Up @@ -801,6 +801,6 @@ void CURL::SetOption(const CStdString &key, const CStdString &value)

void CURL::RemoveOption(const CStdString &key)
{
m_options.AddOption(key, "");
m_options.RemoveOption(key);
SetOptions(m_options.GetOptionsString(true));
}
2 changes: 1 addition & 1 deletion xbmc/dialogs/GUIDialogMediaFilter.cpp
Expand Up @@ -617,7 +617,7 @@ bool CGUIDialogMediaFilter::SetPath(const std::string &path)

// remove "filter" option
if (m_dbUrl->HasOption("filter"))
m_dbUrl->AddOption("filter", "");
m_dbUrl->RemoveOption("filter");

if (video)
m_mediaType = ((CVideoDbUrl*)m_dbUrl)->GetItemType();
Expand Down
30 changes: 25 additions & 5 deletions xbmc/filesystem/SmartPlaylistDirectory.cpp
Expand Up @@ -111,7 +111,11 @@ namespace XFILE
if (!playlist.SaveAsJson(xsp, !filter))
return false;
}
videoUrl.AddOption(option, xsp);

if (!xsp.empty())
videoUrl.AddOption(option, xsp);
else
videoUrl.RemoveOption(option);

CDatabase::Filter dbfilter;
success = db.GetSortedVideos(mediaType, videoUrl.ToString(), sorting, items, dbfilter);
Expand Down Expand Up @@ -140,7 +144,11 @@ namespace XFILE
if (!playlist.SaveAsJson(xsp, !filter))
return false;
}
musicUrl.AddOption(option, xsp);

if (!xsp.empty())
musicUrl.AddOption(option, xsp);
else
musicUrl.RemoveOption(option);

CDatabase::Filter dbfilter;
success = db.GetAlbumsByWhere(musicUrl.ToString(), dbfilter, items, sorting);
Expand All @@ -165,7 +173,11 @@ namespace XFILE
if (!playlist.SaveAsJson(xsp, !filter))
return false;
}
musicUrl.AddOption(option, xsp);

if (!xsp.empty())
musicUrl.AddOption(option, xsp);
else
musicUrl.RemoveOption(option);

CDatabase::Filter dbfilter;
success = db.GetArtistsNav(musicUrl.ToString(), items, !g_guiSettings.GetBool("musiclibrary.showcompilationartists"), -1, -1, -1, dbfilter, sorting);
Expand Down Expand Up @@ -195,7 +207,11 @@ namespace XFILE
if (!songPlaylist.SaveAsJson(xsp, !filter))
return false;
}
musicUrl.AddOption(option, xsp);

if (!xsp.empty())
musicUrl.AddOption(option, xsp);
else
musicUrl.RemoveOption(option);

CDatabase::Filter dbfilter;
success = db.GetSongsByWhere(musicUrl.ToString(), dbfilter, items, sorting);
Expand Down Expand Up @@ -224,7 +240,11 @@ namespace XFILE
if (!mvidPlaylist.SaveAsJson(xsp, !filter))
return false;
}
videoUrl.AddOption(option, xsp);

if (!xsp.empty())
videoUrl.AddOption(option, xsp);
else
videoUrl.RemoveOption(option);

CFileItemList items2;
success2 = db.GetSortedVideos(MediaTypeMusicVideo, videoUrl.ToString(), sorting, items2);
Expand Down
2 changes: 1 addition & 1 deletion xbmc/music/MusicDatabase.cpp
Expand Up @@ -5445,7 +5445,7 @@ bool CMusicDatabase::GetFilter(CDbUrl &musicUrl, Filter &filter, SortDescription
}
// remove the filter if it doesn't match the item type
else
musicUrl.AddOption("filter", "");
musicUrl.RemoveOption("filter");
}

return true;
Expand Down
31 changes: 19 additions & 12 deletions xbmc/utils/UrlOptions.cpp
Expand Up @@ -46,7 +46,9 @@ std::string CUrlOptions::GetOptionsString(bool withLeadingSeperator /* = false *
if (opt != m_options.begin())
options += "&";

options += CURL::Encode(opt->first) + "=" + CURL::Encode(opt->second.asString());
options += CURL::Encode(opt->first);
if (!opt->second.empty())
options += "=" + CURL::Encode(opt->second.asString());
}

if (withLeadingSeperator && !options.empty())
Expand All @@ -68,11 +70,7 @@ void CUrlOptions::AddOption(const std::string &key, const std::string &value)
if (key.empty())
return;

UrlOptions::iterator option = m_options.find(key);
if (!value.empty())
m_options[key] = value;
else if (option != m_options.end())
m_options.erase(option);
m_options[key] = value;
}

void CUrlOptions::AddOption(const std::string &key, int value)
Expand Down Expand Up @@ -130,13 +128,12 @@ void CUrlOptions::AddOptions(const std::string &options)
if (option->empty())
continue;

// every option must have the format key=value
size_t pos = option->find('=');
if (pos == string::npos || pos == 0 || pos >= option->size() - 1)
continue;
string key, value;

string key = CURL::Decode(option->substr(0, pos));
string value = CURL::Decode(option->substr(pos + 1));
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())
Expand All @@ -149,6 +146,16 @@ 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())
Expand Down
1 change: 1 addition & 0 deletions xbmc/utils/UrlOptions.h
Expand Up @@ -45,6 +45,7 @@ class CUrlOptions
virtual void AddOption(const std::string &key, bool value);
virtual void AddOptions(const std::string &options);
virtual void AddOptions(const CUrlOptions &options);
virtual void RemoveOption(const std::string &key);

virtual bool HasOption(const std::string &key) const;
virtual bool GetOption(const std::string &key, CVariant &value) const;
Expand Down
2 changes: 1 addition & 1 deletion xbmc/video/VideoDatabase.cpp
Expand Up @@ -9327,7 +9327,7 @@ bool CVideoDatabase::GetFilter(CDbUrl &videoUrl, Filter &filter, SortDescription
}
// remove the filter if it doesn't match the item type
else
videoUrl.AddOption("filter", "");
videoUrl.RemoveOption("filter");
}

return true;
Expand Down

0 comments on commit 26acb13

Please sign in to comment.