[RFC] convert CFavourites into CFavouritesDirectory
authorFice <fice@arcor.de>
Tue, 16 Apr 2013 11:00:58 +0000 (13:00 +0200)
committerFice <fice@arcor.de>
Tue, 4 Jun 2013 13:16:39 +0000 (15:16 +0200)
17 files changed:
XBMC.xcodeproj/project.pbxproj
project/VS2010Express/XBMC.vcxproj
project/VS2010Express/XBMC.vcxproj.filters
xbmc/Favourites.cpp [deleted file]
xbmc/Favourites.h [deleted file]
xbmc/Makefile.in
xbmc/addons/AddonInstaller.cpp
xbmc/dialogs/GUIDialogFavourites.cpp
xbmc/filesystem/DirectoryFactory.cpp
xbmc/filesystem/FavouritesDirectory.cpp [new file with mode: 0644]
xbmc/filesystem/FavouritesDirectory.h [new file with mode: 0644]
xbmc/filesystem/Makefile.in
xbmc/interfaces/json-rpc/FavouritesOperations.cpp
xbmc/music/windows/GUIWindowMusicPlaylist.cpp
xbmc/video/windows/GUIWindowVideoPlaylist.cpp
xbmc/windows/GUIMediaWindow.cpp
xbmc/windows/GUIWindowFileManager.cpp

index 479b67d..edfe3ec 100644 (file)
@@ -25,6 +25,7 @@
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
+               0E2D4644170F246600AEFF7A /* FavouritesDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0E2D4642170F246600AEFF7A /* FavouritesDirectory.cpp */; };
                183FDF8A11AF0B0500B81E9C /* PluginSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 183FDF8811AF0B0500B81E9C /* PluginSource.cpp */; };
                18404DA61396C31B00863BBA /* SlingboxLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 18404DA51396C31B00863BBA /* SlingboxLib.a */; };
                1840B74D13993D8A007C848B /* JSONVariantParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1840B74B13993D8A007C848B /* JSONVariantParser.cpp */; };
                DFF0F43817528350002DA3A4 /* DatabaseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1D682715A7D2FD00658B65 /* DatabaseManager.cpp */; };
                DFF0F43917528350002DA3A4 /* DbUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466115CF1FA600727135 /* DbUrl.cpp */; };
                DFF0F43A17528350002DA3A4 /* DynamicDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E168C0D25F9FA00618676 /* DynamicDll.cpp */; };
-               DFF0F43B17528350002DA3A4 /* Favourites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16900D25F9FA00618676 /* Favourites.cpp */; };
                DFF0F43C17528350002DA3A4 /* FileItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16920D25F9FA00618676 /* FileItem.cpp */; };
                DFF0F43D17528350002DA3A4 /* GUIInfoManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E3E0D25F9FD00618676 /* GUIInfoManager.cpp */; };
                DFF0F43E17528350002DA3A4 /* GUILargeTextureManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17EE0D25F9FA00618676 /* GUILargeTextureManager.cpp */; };
                E38E1FFA0D25F9FD00618676 /* DetectDVDType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16840D25F9FA00618676 /* DetectDVDType.cpp */; };
                E38E1FFB0D25F9FD00618676 /* DNSNameCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16890D25F9FA00618676 /* DNSNameCache.cpp */; };
                E38E1FFC0D25F9FD00618676 /* DynamicDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E168C0D25F9FA00618676 /* DynamicDll.cpp */; };
-               E38E1FFE0D25F9FD00618676 /* Favourites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16900D25F9FA00618676 /* Favourites.cpp */; };
                E38E1FFF0D25F9FD00618676 /* FileItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16920D25F9FA00618676 /* FileItem.cpp */; };
                E38E20010D25F9FD00618676 /* MemBufferCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16970D25F9FA00618676 /* MemBufferCache.cpp */; };
                E38E20020D25F9FD00618676 /* CacheStrategy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16990D25F9FA00618676 /* CacheStrategy.cpp */; };
                E4991533174E642900741B6D /* DatabaseManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C1D682715A7D2FD00658B65 /* DatabaseManager.cpp */; };
                E4991534174E642900741B6D /* DbUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 36A9466115CF1FA600727135 /* DbUrl.cpp */; };
                E4991535174E642900741B6D /* DynamicDll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E168C0D25F9FA00618676 /* DynamicDll.cpp */; };
-               E4991536174E642900741B6D /* Favourites.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16900D25F9FA00618676 /* Favourites.cpp */; };
                E4991537174E642900741B6D /* FileItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E16920D25F9FA00618676 /* FileItem.cpp */; };
                E4991538174E642900741B6D /* GUIInfoManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E3E0D25F9FD00618676 /* GUIInfoManager.cpp */; };
                E4991539174E642900741B6D /* GUILargeTextureManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E17EE0D25F9FA00618676 /* GUILargeTextureManager.cpp */; };
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
+               0E2D4642170F246600AEFF7A /* FavouritesDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FavouritesDirectory.cpp; sourceTree = "<group>"; };
+               0E2D4643170F246600AEFF7A /* FavouritesDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FavouritesDirectory.h; sourceTree = "<group>"; };
                0E30286C1759FCC200D93596 /* SettingsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsManager.h; sourceTree = "<group>"; };
                18308CB41303370800AA309E /* stat_utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stat_utf8.h; sourceTree = "<group>"; };
                18308CB51303370800AA309E /* stdio_utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stdio_utf8.h; sourceTree = "<group>"; };
                E38E168A0D25F9FA00618676 /* DNSNameCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DNSNameCache.h; sourceTree = "<group>"; };
                E38E168C0D25F9FA00618676 /* DynamicDll.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DynamicDll.cpp; sourceTree = "<group>"; };
                E38E168D0D25F9FA00618676 /* DynamicDll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicDll.h; sourceTree = "<group>"; };
-               E38E16900D25F9FA00618676 /* Favourites.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Favourites.cpp; sourceTree = "<group>"; };
-               E38E16910D25F9FA00618676 /* Favourites.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Favourites.h; sourceTree = "<group>"; };
                E38E16920D25F9FA00618676 /* FileItem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileItem.cpp; sourceTree = "<group>"; };
                E38E16930D25F9FA00618676 /* FileItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileItem.h; sourceTree = "<group>"; };
                E38E16970D25F9FA00618676 /* MemBufferCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemBufferCache.cpp; sourceTree = "<group>"; };
                                36A9466215CF1FA600727135 /* DbUrl.h */,
                                E38E168C0D25F9FA00618676 /* DynamicDll.cpp */,
                                E38E168D0D25F9FA00618676 /* DynamicDll.h */,
-                               E38E16900D25F9FA00618676 /* Favourites.cpp */,
-                               E38E16910D25F9FA00618676 /* Favourites.h */,
                                E38E16920D25F9FA00618676 /* FileItem.cpp */,
                                E38E16930D25F9FA00618676 /* FileItem.h */,
                                E38E1E3E0D25F9FD00618676 /* GUIInfoManager.cpp */,
                                E38E16B10D25F9FA00618676 /* DirectoryHistory.h */,
                                E38E16B40D25F9FA00618676 /* DllLibCurl.cpp */,
                                E38E16B50D25F9FA00618676 /* DllLibCurl.h */,
+                               0E2D4642170F246600AEFF7A /* FavouritesDirectory.cpp */,
+                               0E2D4643170F246600AEFF7A /* FavouritesDirectory.h */,
                                E38E16BA0D25F9FA00618676 /* File.cpp */,
                                E38E16BB0D25F9FA00618676 /* File.h */,
                                DF93D6671444A8B0007C6459 /* FileCache.cpp */,
                                E38E1FFA0D25F9FD00618676 /* DetectDVDType.cpp in Sources */,
                                E38E1FFB0D25F9FD00618676 /* DNSNameCache.cpp in Sources */,
                                E38E1FFC0D25F9FD00618676 /* DynamicDll.cpp in Sources */,
-                               E38E1FFE0D25F9FD00618676 /* Favourites.cpp in Sources */,
                                E38E1FFF0D25F9FD00618676 /* FileItem.cpp in Sources */,
                                E38E20010D25F9FD00618676 /* MemBufferCache.cpp in Sources */,
                                E38E20020D25F9FD00618676 /* CacheStrategy.cpp in Sources */,
                                820023DB171A28A300667D1C /* OSXTextInputResponder.mm in Sources */,
                                DF529BAE1741697B00523FB4 /* Environment.cpp in Sources */,
                                DFE4095B17417FDF00473BD9 /* LegacyPathTranslation.cpp in Sources */,
+                               0E2D4644170F246600AEFF7A /* FavouritesDirectory.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                DFF0F43817528350002DA3A4 /* DatabaseManager.cpp in Sources */,
                                DFF0F43917528350002DA3A4 /* DbUrl.cpp in Sources */,
                                DFF0F43A17528350002DA3A4 /* DynamicDll.cpp in Sources */,
-                               DFF0F43B17528350002DA3A4 /* Favourites.cpp in Sources */,
                                DFF0F43C17528350002DA3A4 /* FileItem.cpp in Sources */,
                                DFF0F43D17528350002DA3A4 /* GUIInfoManager.cpp in Sources */,
                                DFF0F43E17528350002DA3A4 /* GUILargeTextureManager.cpp in Sources */,
                                E4991533174E642900741B6D /* DatabaseManager.cpp in Sources */,
                                E4991534174E642900741B6D /* DbUrl.cpp in Sources */,
                                E4991535174E642900741B6D /* DynamicDll.cpp in Sources */,
-                               E4991536174E642900741B6D /* Favourites.cpp in Sources */,
                                E4991537174E642900741B6D /* FileItem.cpp in Sources */,
                                E4991538174E642900741B6D /* GUIInfoManager.cpp in Sources */,
                                E4991539174E642900741B6D /* GUILargeTextureManager.cpp in Sources */,
index b893f73..be982d8 100644 (file)
     <ClCompile Include="..\..\xbmc\epg\EpgInfoTag.cpp" />
     <ClCompile Include="..\..\xbmc\epg\EpgSearchFilter.cpp" />
     <ClCompile Include="..\..\xbmc\epg\GUIEPGGridContainer.cpp" />
-    <ClCompile Include="..\..\xbmc\Favourites.cpp" />
     <ClCompile Include="..\..\xbmc\FileItem.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\AddonsDirectory.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\AFPDirectory.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\DllLibCurl.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\File.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\FileCache.cpp" />
+    <ClCompile Include="..\..\xbmc\filesystem\FavouritesDirectory.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\FileDirectoryFactory.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\FileFactory.cpp" />
     <ClCompile Include="..\..\xbmc\filesystem\FileReaderFile.cpp" />
     <ClInclude Include="..\..\xbmc\network\httprequesthandler\IHTTPRequestHandler.h" />
     <ClInclude Include="..\..\xbmc\filesystem\CircularCache.h" />
     <ClInclude Include="..\..\xbmc\filesystem\DirectoryCache.h" />
+    <ClInclude Include="..\..\xbmc\filesystem\FavouritesDirectory.h" />
     <ClInclude Include="..\..\xbmc\filesystem\FileCache.h" />
     <ClInclude Include="..\..\xbmc\filesystem\MemBufferCache.h" />
     <ClInclude Include="..\..\xbmc\filesystem\AddonsDirectory.h" />
     <ClInclude Include="..\..\xbmc\epg\EpgInfoTag.h" />
     <ClInclude Include="..\..\xbmc\epg\EpgSearchFilter.h" />
     <ClInclude Include="..\..\xbmc\epg\GUIEPGGridContainer.h" />
-    <ClInclude Include="..\..\xbmc\Favourites.h" />
     <ClInclude Include="..\..\xbmc\FileItem.h" />
     <ClInclude Include="..\..\xbmc\filesystem\PVRDirectory.h" />
     <ClInclude Include="..\..\xbmc\filesystem\PVRFile.h" />
index 0549d1a..6732053 100644 (file)
     <ClCompile Include="..\..\xbmc\filesystem\DirectoryCache.cpp">
       <Filter>filesystem</Filter>
     </ClCompile>
+    <ClCompile Include="..\..\xbmc\filesystem\FavouritesDirectory.cpp">
+      <Filter>filesystem</Filter>
+    </ClCompile>
     <ClCompile Include="..\..\xbmc\filesystem\FileCache.cpp">
       <Filter>filesystem</Filter>
     </ClCompile>
     <ClCompile Include="..\..\xbmc\ApplicationMessenger.cpp" />
     <ClCompile Include="..\..\xbmc\Autorun.cpp" />
     <ClCompile Include="..\..\xbmc\AutoSwitch.cpp" />
-    <ClCompile Include="..\..\xbmc\Favourites.cpp" />
     <ClCompile Include="..\..\xbmc\DynamicDll.cpp" />
     <ClCompile Include="..\..\xbmc\CueDocument.cpp" />
     <ClCompile Include="..\..\xbmc\FileItem.cpp" />
     <ClInclude Include="..\..\xbmc\filesystem\DirectoryCache.h">
       <Filter>filesystem</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\xbmc\filesystem\FavouritesDirectory.h">
+      <Filter>filesystem</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\xbmc\filesystem\FileCache.h">
       <Filter>filesystem</Filter>
     </ClInclude>
     <ClInclude Include="..\..\xbmc\ApplicationMessenger.h" />
     <ClInclude Include="..\..\xbmc\Autorun.h" />
     <ClInclude Include="..\..\xbmc\AutoSwitch.h" />
-    <ClInclude Include="..\..\xbmc\Favourites.h" />
     <ClInclude Include="..\..\xbmc\DynamicDll.h" />
     <ClInclude Include="..\..\xbmc\CueDocument.h" />
     <ClInclude Include="..\..\xbmc\FileItem.h" />
diff --git a/xbmc/Favourites.cpp b/xbmc/Favourites.cpp
deleted file mode 100644 (file)
index e770738..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://www.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 "Favourites.h"
-#include "filesystem/File.h"
-#include "Util.h"
-#include "profiles/ProfilesManager.h"
-#include "FileItem.h"
-#include "utils/XBMCTinyXML.h"
-#include "utils/log.h"
-#include "utils/StringUtils.h"
-#include "utils/URIUtils.h"
-#include "settings/AdvancedSettings.h"
-#include "video/VideoInfoTag.h"
-
-bool CFavourites::Load(CFileItemList &items)
-{
-  items.Clear();
-  CStdString favourites;
-
-  favourites = "special://xbmc/system/favourites.xml";
-  if(XFILE::CFile::Exists(favourites))
-    CFavourites::LoadFavourites(favourites, items);
-  else
-    CLog::Log(LOGDEBUG, "CFavourites::Load - no system favourites found, skipping");
-  favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml");
-  if(XFILE::CFile::Exists(favourites))
-    CFavourites::LoadFavourites(favourites, items);
-  else
-    CLog::Log(LOGDEBUG, "CFavourites::Load - no userdata favourites found, skipping");
-
-  return true;
-}
-
-bool CFavourites::LoadFavourites(CStdString& strPath, CFileItemList& items)
-{
-  CXBMCTinyXML doc;
-  if (!doc.LoadFile(strPath))
-  {
-    CLog::Log(LOGERROR, "Unable to load %s (row %i column %i)", strPath.c_str(), doc.Row(), doc.Column());
-    return false;
-  }
-  TiXmlElement *root = doc.RootElement();
-  if (!root || strcmp(root->Value(), "favourites"))
-  {
-    CLog::Log(LOGERROR, "Favourites.xml doesn't contain the <favourites> root element");
-    return false;
-  }
-
-  TiXmlElement *favourite = root->FirstChildElement("favourite");
-  while (favourite)
-  {
-    // format:
-    // <favourite name="Cool Video" thumb="foo.jpg">PlayMedia(c:\videos\cool_video.avi)</favourite>
-    // <favourite name="My Album" thumb="bar.tbn">ActivateWindow(MyMusic,c:\music\my album)</favourite>
-    // <favourite name="Apple Movie Trailers" thumb="path_to_thumb.png">RunScript(special://xbmc/scripts/apple movie trailers/default.py)</favourite>
-    const char *name = favourite->Attribute("name");
-    const char *thumb = favourite->Attribute("thumb");
-    if (name && favourite->FirstChild())
-    {
-      if(!items.Contains(favourite->FirstChild()->Value()))
-      {
-        CFileItemPtr item(new CFileItem(name));
-        item->SetPath(favourite->FirstChild()->Value());
-        if (thumb) item->SetArt("thumb", thumb);
-        items.Add(item);
-      }
-    }
-    favourite = favourite->NextSiblingElement("favourite");
-  }
-  return true;
-}
-
-bool CFavourites::Save(const CFileItemList &items)
-{
-  CStdString favourites;
-  CXBMCTinyXML doc;
-  TiXmlElement xmlRootElement("favourites");
-  TiXmlNode *rootNode = doc.InsertEndChild(xmlRootElement);
-  if (!rootNode) return false;
-
-  for (int i = 0; i < items.Size(); i++)
-  {
-    const CFileItemPtr item = items[i];
-    TiXmlElement favNode("favourite");
-    favNode.SetAttribute("name", item->GetLabel().c_str());
-    if (item->HasArt("thumb"))
-      favNode.SetAttribute("thumb", item->GetArt("thumb").c_str());
-    TiXmlText execute(item->GetPath());
-    favNode.InsertEndChild(execute);
-    rootNode->InsertEndChild(favNode);
-  }
-
-  favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml");
-  return doc.SaveFile(favourites);
-}
-
-bool CFavourites::AddOrRemove(CFileItem *item, int contextWindow)
-{
-  if (!item) return false;
-
-  // load our list
-  CFileItemList items;
-  Load(items);
-
-  CStdString executePath(GetExecutePath(item, contextWindow));
-
-  CFileItemPtr match = items.Get(executePath);
-  if (match)
-  { // remove the item
-    items.Remove(match.get());
-  }
-  else
-  { // create our new favourite item
-    CFileItemPtr favourite(new CFileItem(item->GetLabel()));
-    if (item->GetLabel().IsEmpty())
-      favourite->SetLabel(CUtil::GetTitleFromPath(item->GetPath(), item->m_bIsFolder));
-    favourite->SetArt("thumb", item->GetArt("thumb"));
-    favourite->SetPath(executePath);
-    items.Add(favourite);
-  }
-
-  // and save our list again
-  return Save(items);
-}
-
-bool CFavourites::IsFavourite(CFileItem *item, int contextWindow)
-{
-  CFileItemList items;
-  if (!Load(items)) return false;
-
-  return items.Contains(GetExecutePath(item, contextWindow));
-}
-
-CStdString CFavourites::GetExecutePath(const CFileItem *item, int contextWindow)
-{
-  CStdString execute;
-  if (item->m_bIsFolder && (g_advancedSettings.m_playlistAsFolders ||
-                            !(item->IsSmartPlayList() || item->IsPlayList())))
-    execute.Format("ActivateWindow(%i,%s)", contextWindow, StringUtils::Paramify(item->GetPath()).c_str());
-  else if (item->IsScript())
-    execute.Format("RunScript(%s)", StringUtils::Paramify(item->GetPath().Mid(9)).c_str());
-  else if (item->IsAndroidApp())
-    execute.Format("StartAndroidActivity(%s)", StringUtils::Paramify(item->GetPath().Mid(26)).c_str());
-  else  // assume a media file
-  {
-    if (item->IsVideoDb() && item->HasVideoInfoTag())
-      execute.Format("PlayMedia(%s)", StringUtils::Paramify(item->GetVideoInfoTag()->m_strFileNameAndPath).c_str());
-    else
-      execute.Format("PlayMedia(%s)", StringUtils::Paramify(item->GetPath()).c_str());
-  }
-  return execute;
-}
diff --git a/xbmc/Favourites.h b/xbmc/Favourites.h
deleted file mode 100644 (file)
index 36ddd7b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-
-/*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://www.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 "utils/StdString.h"
-
-class CFileItemList;
-class CFileItem;
-
-class CFavourites
-{
-public:
-  static bool Load(CFileItemList& items);
-  static bool LoadFavourites(CStdString& strPath, CFileItemList& items);
-  static bool AddOrRemove(CFileItem *item, int contextWindow);
-  static bool Save(const CFileItemList& items);
-  static bool IsFavourite(CFileItem *item, int contextWindow);
-private:
-  static CStdString GetExecutePath(const CFileItem *item, int contextWindow);
-};
index 5a9bd6b..38fe9d5 100644 (file)
@@ -8,7 +8,6 @@ SRCS=Application.cpp \
      DatabaseManager.cpp \
      DbUrl.cpp \
      DynamicDll.cpp \
-     Favourites.cpp \
      FileItem.cpp \
      GUIInfoManager.cpp \
      GUILargeTextureManager.cpp \
index c8c6e06..eb5f59b 100644 (file)
@@ -29,7 +29,7 @@
 #include "settings/AdvancedSettings.h"
 #include "settings/Settings.h"
 #include "ApplicationMessenger.h"
-#include "Favourites.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "utils/JobManager.h"
 #include "dialogs/GUIDialogYesNo.h"
 #include "addons/AddonManager.h"
@@ -836,7 +836,7 @@ void CAddonUnInstallJob::OnPostUnInstall()
 
   bool bSave(false);
   CFileItemList items;
-  CFavourites::Load(items);
+  XFILE::CFavouritesDirectory::Load(items);
   for (int i=0; i < items.Size(); ++i)
   {
     if (items[i]->GetPath().Find(m_addon->ID()) > -1)
@@ -847,7 +847,7 @@ void CAddonUnInstallJob::OnPostUnInstall()
   }
 
   if (bSave)
-    CFavourites::Save(items);
+    CFavouritesDirectory::Save(items);
 
   if (m_addon->Type() == ADDON_PVRDLL)
   {
index 9f147fa..79ed85e 100644 (file)
@@ -21,7 +21,8 @@
 #include "GUIDialogFavourites.h"
 #include "GUIDialogContextMenu.h"
 #include "GUIDialogFileBrowser.h"
-#include "Favourites.h"
+#include "filesystem/Directory.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "guilib/GUIWindowManager.h"
 #include "guilib/GUIKeyboardFactory.h"
 #include "guilib/Key.h"
@@ -83,7 +84,7 @@ bool CGUIDialogFavourites::OnMessage(CGUIMessage &message)
 
 void CGUIDialogFavourites::OnInitWindow()
 {
-  CFavourites::Load(*m_favourites);
+  XFILE::CDirectory::GetDirectory("favourites://", *m_favourites);
   UpdateList();
   CGUIWindow::OnInitWindow();
 }
@@ -154,7 +155,7 @@ void CGUIDialogFavourites::OnMoveItem(int item, int amount)
   if (nextItem < 0) nextItem += m_favourites->Size();
 
   m_favourites->Swap(item, nextItem);
-  CFavourites::Save(*m_favourites);
+  CFavouritesDirectory::Save(*m_favourites);
 
   CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, nextItem);
   OnMessage(message);
@@ -167,7 +168,7 @@ void CGUIDialogFavourites::OnDelete(int item)
   if (item < 0 || item >= m_favourites->Size())
     return;
   m_favourites->Remove(item);
-  CFavourites::Save(*m_favourites);
+  CFavouritesDirectory::Save(*m_favourites);
 
   CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, item < m_favourites->Size() ? item : item - 1);
   OnMessage(message);
@@ -184,7 +185,7 @@ void CGUIDialogFavourites::OnRename(int item)
   if (CGUIKeyboardFactory::ShowAndGetInput(label, g_localizeStrings.Get(16008), false))
     (*m_favourites)[item]->SetLabel(label);
 
-  CFavourites::Save(*m_favourites);
+  CFavouritesDirectory::Save(*m_favourites);
 
   UpdateList();
 }
@@ -220,7 +221,7 @@ void CGUIDialogFavourites::OnSetThumb(int item)
     return;
 
   (*m_favourites)[item]->SetArt("thumb", thumb);
-  CFavourites::Save(*m_favourites);
+  CFavouritesDirectory::Save(*m_favourites);
   UpdateList();
 }
 
index df35e16..ac92be2 100644 (file)
@@ -33,6 +33,7 @@
 #include "MusicDatabaseDirectory.h"
 #include "MusicSearchDirectory.h"
 #include "VideoDatabaseDirectory.h"
+#include "FavouritesDirectory.h"
 #include "LibraryDirectory.h"
 #include "AddonsDirectory.h"
 #include "SourcesDirectory.h"
@@ -165,6 +166,7 @@ IDirectory* CDirectoryFactory::Create(const CStdString& strPath)
   if (strProtocol == "musicsearch") return new CMusicSearchDirectory();
   if (strProtocol == "videodb") return new CVideoDatabaseDirectory();
   if (strProtocol == "library") return new CLibraryDirectory();
+  if (strProtocol == "favourites") return new CFavouritesDirectory();
   if (strProtocol == "filereader")
     return CDirectoryFactory::Create(url.GetFileName());
 
diff --git a/xbmc/filesystem/FavouritesDirectory.cpp b/xbmc/filesystem/FavouritesDirectory.cpp
new file mode 100644 (file)
index 0000000..aaecb75
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ *      Copyright (C) 2005-2013 Team XBMC
+ *      http://www.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 "FavouritesDirectory.h"
+#include "File.h"
+#include "Util.h"
+#include "profiles/ProfilesManager.h"
+#include "FileItem.h"
+#include "utils/XBMCTinyXML.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "settings/AdvancedSettings.h"
+#include "video/VideoInfoTag.h"
+#include "URL.h"
+
+namespace XFILE
+{
+
+
+bool CFavouritesDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items)
+{
+  items.Clear();
+  CURL url(strPath);
+  
+  if (url.GetProtocol() == "favourites")
+  {
+    Load(items); //load the default favourite files
+  }
+  return LoadFavourites(strPath, items); //directly load the given file
+}
+  
+bool CFavouritesDirectory::Exists(const char* strPath)
+{
+  CURL url(strPath);
+  
+  if (url.GetProtocol() == "favourites")
+  {
+    return XFILE::CFile::Exists("special://xbmc/system/favourites.xml") 
+        || XFILE::CFile::Exists(URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml"));
+  }
+  return XFILE::CFile::Exists(strPath); //directly load the given file
+}
+
+bool CFavouritesDirectory::Load(CFileItemList &items)
+{
+  items.Clear();
+  CStdString favourites;
+
+  favourites = "special://xbmc/system/favourites.xml";
+  if(XFILE::CFile::Exists(favourites))
+    CFavouritesDirectory::LoadFavourites(favourites, items);
+  else
+    CLog::Log(LOGDEBUG, "CFavourites::Load - no system favourites found, skipping");
+  favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml");
+  if(XFILE::CFile::Exists(favourites))
+    CFavouritesDirectory::LoadFavourites(favourites, items);
+  else
+    CLog::Log(LOGDEBUG, "CFavourites::Load - no userdata favourites found, skipping");
+
+  return true;
+}
+
+bool CFavouritesDirectory::LoadFavourites(const CStdString& strPath, CFileItemList& items)
+{
+  CXBMCTinyXML doc;
+  if (!doc.LoadFile(strPath))
+  {
+    CLog::Log(LOGERROR, "Unable to load %s (row %i column %i)", strPath.c_str(), doc.Row(), doc.Column());
+    return false;
+  }
+  TiXmlElement *root = doc.RootElement();
+  if (!root || strcmp(root->Value(), "favourites"))
+  {
+    CLog::Log(LOGERROR, "Favourites.xml doesn't contain the <favourites> root element");
+    return false;
+  }
+
+  TiXmlElement *favourite = root->FirstChildElement("favourite");
+  while (favourite)
+  {
+    // format:
+    // <favourite name="Cool Video" thumb="foo.jpg">PlayMedia(c:\videos\cool_video.avi)</favourite>
+    // <favourite name="My Album" thumb="bar.tbn">ActivateWindow(MyMusic,c:\music\my album)</favourite>
+    // <favourite name="Apple Movie Trailers" thumb="path_to_thumb.png">RunScript(special://xbmc/scripts/apple movie trailers/default.py)</favourite>
+    const char *name = favourite->Attribute("name");
+    const char *thumb = favourite->Attribute("thumb");
+    if (name && favourite->FirstChild())
+    {
+      if(!items.Contains(favourite->FirstChild()->Value()))
+      {
+        CFileItemPtr item(new CFileItem(name));
+        item->SetPath(favourite->FirstChild()->Value());
+        if (thumb) item->SetArt("thumb", thumb);
+        items.Add(item);
+      }
+    }
+    favourite = favourite->NextSiblingElement("favourite");
+  }
+  return true;
+}
+
+bool CFavouritesDirectory::Save(const CFileItemList &items)
+{
+  CStdString favourites;
+  CXBMCTinyXML doc;
+  TiXmlElement xmlRootElement("favourites");
+  TiXmlNode *rootNode = doc.InsertEndChild(xmlRootElement);
+  if (!rootNode) return false;
+
+  for (int i = 0; i < items.Size(); i++)
+  {
+    const CFileItemPtr item = items[i];
+    TiXmlElement favNode("favourite");
+    favNode.SetAttribute("name", item->GetLabel().c_str());
+    if (item->HasArt("thumb"))
+      favNode.SetAttribute("thumb", item->GetArt("thumb").c_str());
+    TiXmlText execute(item->GetPath());
+    favNode.InsertEndChild(execute);
+    rootNode->InsertEndChild(favNode);
+  }
+
+  favourites = URIUtils::AddFileToFolder(CProfilesManager::Get().GetProfileUserDataFolder(), "favourites.xml");
+  return doc.SaveFile(favourites);
+}
+
+bool CFavouritesDirectory::AddOrRemove(CFileItem *item, int contextWindow)
+{
+  if (!item) return false;
+
+  // load our list
+  CFileItemList items;
+  Load(items);
+
+  CStdString executePath(GetExecutePath(item, contextWindow));
+
+  CFileItemPtr match = items.Get(executePath);
+  if (match)
+  { // remove the item
+    items.Remove(match.get());
+  }
+  else
+  { // create our new favourite item
+    CFileItemPtr favourite(new CFileItem(item->GetLabel()));
+    if (item->GetLabel().IsEmpty())
+      favourite->SetLabel(CUtil::GetTitleFromPath(item->GetPath(), item->m_bIsFolder));
+    favourite->SetArt("thumb", item->GetArt("thumb"));
+    favourite->SetPath(executePath);
+    items.Add(favourite);
+  }
+
+  // and save our list again
+  return Save(items);
+}
+
+bool CFavouritesDirectory::IsFavourite(CFileItem *item, int contextWindow)
+{
+  CFileItemList items;
+  if (!Load(items)) return false;
+
+  return items.Contains(GetExecutePath(item, contextWindow));
+}
+
+CStdString CFavouritesDirectory::GetExecutePath(const CFileItem *item, int contextWindow)
+{
+  CStdString execute;
+  if (item->m_bIsFolder && (g_advancedSettings.m_playlistAsFolders ||
+                            !(item->IsSmartPlayList() || item->IsPlayList())))
+    execute.Format("ActivateWindow(%i,%s)", contextWindow, StringUtils::Paramify(item->GetPath()).c_str());
+  else if (item->IsScript())
+    execute.Format("RunScript(%s)", StringUtils::Paramify(item->GetPath().Mid(9)).c_str());
+  else if (item->IsAndroidApp())
+    execute.Format("StartAndroidActivity(%s)", StringUtils::Paramify(item->GetPath().Mid(26)).c_str());
+  else  // assume a media file
+  {
+    if (item->IsVideoDb() && item->HasVideoInfoTag())
+      execute.Format("PlayMedia(%s)", StringUtils::Paramify(item->GetVideoInfoTag()->m_strFileNameAndPath).c_str());
+    else
+      execute.Format("PlayMedia(%s)", StringUtils::Paramify(item->GetPath()).c_str());
+  }
+  return execute;
+}
+  
+}
diff --git a/xbmc/filesystem/FavouritesDirectory.h b/xbmc/filesystem/FavouritesDirectory.h
new file mode 100644 (file)
index 0000000..eec2cc4
--- /dev/null
@@ -0,0 +1,47 @@
+#pragma once
+
+/*
+ *      Copyright (C) 2005-2013 Team XBMC
+ *      http://www.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 "utils/StdString.h"
+#include "IDirectory.h"
+
+class CFileItemList;
+class CFileItem;
+
+namespace XFILE
+{
+
+class CFavouritesDirectory : public IDirectory
+{
+public:
+  virtual bool GetDirectory(const CStdString& strPath, CFileItemList &items);
+  virtual bool Exists(const char* strPath);
+  static bool Load(CFileItemList &items);
+  static bool LoadFavourites(const CStdString& strPath, CFileItemList& items);
+
+  static bool AddOrRemove(CFileItem *item, int contextWindow);
+  static bool Save(const CFileItemList& items);
+  static bool IsFavourite(CFileItem *item, int contextWindow);
+private:
+  static CStdString GetExecutePath(const CFileItem *item, int contextWindow);
+};
+  
+}
index f73851a..c5a6738 100644 (file)
@@ -17,6 +17,7 @@ SRCS += DirectoryCache.cpp
 SRCS += DirectoryFactory.cpp
 SRCS += DirectoryHistory.cpp
 SRCS += DllLibCurl.cpp
+SRCS += FavouritesDirectory.cpp
 SRCS += File.cpp
 SRCS += FileCache.cpp
 SRCS += FileDirectoryFactory.cpp
index e74957f..2f39d6c 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 #include "FavouritesOperations.h"
-#include "Favourites.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "input/ButtonTranslator.h"
 #include "utils/RegExp.h"
 #include "utils/StringUtils.h"
 
 using namespace std;
 using namespace JSONRPC;
+using namespace XFILE;
 
 JSONRPC_STATUS CFavouritesOperations::GetFavourites(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
 {
   CFileItemList favourites;
-  CFavourites::Load(favourites);
+  CFavouritesDirectory::Load(favourites);
   
   string type = !parameterObject["type"].isNull() ? parameterObject["type"].asString() : "";
 
@@ -158,7 +159,7 @@ JSONRPC_STATUS CFavouritesOperations::AddFavourite(const CStdString &method, ITr
   if (ParameterNotNull(parameterObject,"thumbnail"))
     item.SetArt("thumb", parameterObject["thumbnail"].asString());
 
-  if (CFavourites::AddOrRemove(&item, contextWindow))
+  if (CFavouritesDirectory::AddOrRemove(&item, contextWindow))
     return ACK;
   else
     return FailedToExecute;
index f6b292e..b83d18b 100644 (file)
@@ -31,7 +31,7 @@
 #include "guilib/GUIKeyboardFactory.h"
 #include "guilib/Key.h"
 #include "GUIUserMessages.h"
-#include "Favourites.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "profiles/ProfilesManager.h"
 #include "settings/MediaSettings.h"
 #include "settings/Settings.h"
@@ -521,7 +521,7 @@ void CGUIWindowMusicPlayList::GetContextButtons(int itemNumber, CContextButtons
         buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With...
 
       buttons.Add(CONTEXT_BUTTON_SONG_INFO, 658); // Song Info
-      if (CFavourites::IsFavourite(item.get(), GetID()))
+      if (XFILE::CFavouritesDirectory::IsFavourite(item.get(), GetID()))
         buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14077);     // Remove Favourite
       else
         buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14076);     // Add To Favourites;
@@ -590,7 +590,7 @@ bool CGUIWindowMusicPlayList::OnContextButton(int itemNumber, CONTEXT_BUTTON but
   case CONTEXT_BUTTON_ADD_FAVOURITE:
     {
       CFileItemPtr item = m_vecItems->Get(itemNumber);
-      CFavourites::AddOrRemove(item.get(), GetID());
+      XFILE::CFavouritesDirectory::AddOrRemove(item.get(), GetID());
       return true;
     }
 
index 3c8a343..0816207 100644 (file)
@@ -29,9 +29,9 @@
 #include "guilib/GUIWindowManager.h"
 #include "guilib/GUIKeyboardFactory.h"
 #include "GUIUserMessages.h"
-#include "Favourites.h"
-#include "settings/MediaSettings.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "settings/Settings.h"
+#include "settings/MediaSettings.h"
 #include "guilib/Key.h"
 #include "guilib/LocalizeStrings.h"
 #include "utils/log.h"
@@ -415,7 +415,7 @@ void CGUIWindowVideoPlaylist::GetContextButtons(int itemNumber, CContextButtons
       if (vecCores.size() > 1)
         buttons.Add(CONTEXT_BUTTON_PLAY_WITH, 15213); // Play With...
 
-      if (CFavourites::IsFavourite(item.get(), GetID()))
+      if (XFILE::CFavouritesDirectory::IsFavourite(item.get(), GetID()))
         buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14077);     // Remove Favourite
       else
         buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14076);     // Add To Favourites;
@@ -491,7 +491,7 @@ bool CGUIWindowVideoPlaylist::OnContextButton(int itemNumber, CONTEXT_BUTTON but
   case CONTEXT_BUTTON_ADD_FAVOURITE:
     {
       CFileItemPtr item = m_vecItems->Get(itemNumber);
-      CFavourites::AddOrRemove(item.get(), GetID());
+      XFILE::CFavouritesDirectory::AddOrRemove(item.get(), GetID());
       return true;
     }
   case CONTEXT_BUTTON_CANCEL_PARTYMODE:
index 2f06406..f3e20ec 100644 (file)
@@ -35,7 +35,7 @@
 #include "PartyModeManager.h"
 #include "dialogs/GUIDialogMediaSource.h"
 #include "GUIWindowFileManager.h"
-#include "Favourites.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "utils/LabelFormatter.h"
 #include "dialogs/GUIDialogProgress.h"
 #include "profiles/ProfilesManager.h"
@@ -1577,7 +1577,7 @@ void CGUIMediaWindow::GetContextButtons(int itemNumber, CContextButtons &buttons
   if (!item->IsParentFolder() && !item->GetPath().Equals("add") && !item->GetPath().Equals("newplaylist://") &&
       !item->GetPath().Left(19).Equals("newsmartplaylist://") && !item->GetPath().Left(9).Equals("newtag://"))
   {
-    if (CFavourites::IsFavourite(item.get(), GetID()))
+    if (XFILE::CFavouritesDirectory::IsFavourite(item.get(), GetID()))
       buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14077);     // Remove Favourite
     else
       buttons.Add(CONTEXT_BUTTON_ADD_FAVOURITE, 14076);     // Add To Favourites;
@@ -1595,7 +1595,7 @@ bool CGUIMediaWindow::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
   case CONTEXT_BUTTON_ADD_FAVOURITE:
     {
       CFileItemPtr item = m_vecItems->Get(itemNumber);
-      CFavourites::AddOrRemove(item.get(), GetID());
+      XFILE::CFavouritesDirectory::AddOrRemove(item.get(), GetID());
       return true;
     }
   case CONTEXT_BUTTON_PLUGIN_SETTINGS:
index 462655a..3f78408 100644 (file)
@@ -44,7 +44,7 @@
 #include "guilib/GUIKeyboardFactory.h"
 #include "dialogs/GUIDialogProgress.h"
 #include "dialogs/GUIDialogExtendedProgressBar.h"
-#include "Favourites.h"
+#include "filesystem/FavouritesDirectory.h"
 #include "playlists/PlayList.h"
 #include "utils/AsyncFileCopy.h"
 #include "storage/MediaManager.h"
@@ -991,7 +991,7 @@ void CGUIWindowFileManager::OnPopupMenu(int list, int item, bool bContextDriven
   {
     choices.Add(1, 188); // SelectAll
     if (!pItem->IsParentFolder())
-      choices.Add(2, CFavourites::IsFavourite(pItem.get(), GetID()) ? 14077 : 14076); // Add/Remove Favourite
+      choices.Add(2,  XFILE::CFavouritesDirectory::IsFavourite(pItem.get(), GetID()) ? 14077 : 14076); // Add/Remove Favourite
     if (vecCores.size() > 1)
       choices.Add(3, 15213); // Play Using...
     if (CanRename(list) && !pItem->IsParentFolder())
@@ -1021,7 +1021,7 @@ void CGUIWindowFileManager::OnPopupMenu(int list, int item, bool bContextDriven
   }
   if (btnid == 2)
   {
-    CFavourites::AddOrRemove(pItem.get(), GetID());
+    XFILE::CFavouritesDirectory::AddOrRemove(pItem.get(), GetID());
     return;
   }
   if (btnid == 3)