[bluray] Fix stream info/language retrieval for blurays in non-nav mode.
[vuplus_xbmc] / xbmc / view / ViewStateSettings.cpp
1 /*
2  *      Copyright (C) 2013 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, see
17  *  <http://www.gnu.org/licenses/>.
18  *
19  */
20
21 #include <string.h>
22
23 #include "ViewStateSettings.h"
24 #include "threads/SingleLock.h"
25 #include "utils/log.h"
26 #include "utils/StringUtils.h"
27 #include "utils/XBMCTinyXML.h"
28 #include "utils/XMLUtils.h"
29
30 #define XML_VIEWSTATESETTINGS "viewstates"
31 #define XML_VIEWMODE          "viewmode"
32 #define XML_SORTMETHOD        "sortmethod"
33 #define XML_SORTORDER         "sortorder"
34 #define XML_GENERAL           "general"
35 #define XML_SETTINGLEVEL      "settinglevel"
36
37 using namespace std;
38
39 CViewStateSettings::CViewStateSettings()
40 {
41   AddViewState("musicnavartists");
42   AddViewState("musicnavalbums");
43   AddViewState("musicnavsongs");
44   AddViewState("musiclastfm");
45   AddViewState("videonavactors");
46   AddViewState("videonavyears");
47   AddViewState("videonavgenres");
48   AddViewState("videonavtitles");
49   AddViewState("videonavepisodes", DEFAULT_VIEW_AUTO, SORT_METHOD_EPISODE);
50   AddViewState("videonavtvshows");
51   AddViewState("videonavseasons");
52   AddViewState("videonavmusicvideos");
53
54   AddViewState("programs", DEFAULT_VIEW_AUTO);
55   AddViewState("pictures", DEFAULT_VIEW_AUTO);
56   AddViewState("videofiles", DEFAULT_VIEW_AUTO);
57   AddViewState("musicfiles", DEFAULT_VIEW_AUTO);
58
59   Clear();
60 }
61
62 CViewStateSettings::~CViewStateSettings()
63 {
64   for (map<string, CViewState*>::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
65     delete viewState->second;
66   m_viewStates.clear();
67 }
68
69 CViewStateSettings& CViewStateSettings::Get()
70 {
71   static CViewStateSettings sViewStateSettings;
72   return sViewStateSettings;
73 }
74
75 bool CViewStateSettings::Load(const TiXmlNode *settings)
76 {
77   if (settings == NULL)
78     return false;
79
80   CSingleLock lock(m_critical);
81   const TiXmlNode *pElement = settings->FirstChildElement(XML_VIEWSTATESETTINGS);
82   if (pElement == NULL)
83   {
84     CLog::Log(LOGWARNING, "CViewStateSettings: no <viewstates> tag found");
85     return false;
86   }
87
88   for (map<string, CViewState*>::iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
89   {
90     const TiXmlNode* pViewState = pElement->FirstChildElement(viewState->first);
91     if (pViewState == NULL)
92       continue;
93
94     XMLUtils::GetInt(pViewState, XML_VIEWMODE, viewState->second->m_viewMode, DEFAULT_VIEW_LIST, DEFAULT_VIEW_MAX);
95
96     int sortMethod;
97     if (XMLUtils::GetInt(pViewState, XML_SORTMETHOD, sortMethod, SORT_METHOD_NONE, SORT_METHOD_MAX))
98       viewState->second->m_sortMethod = (SORT_METHOD)sortMethod;
99
100     int sortOrder;
101     if (XMLUtils::GetInt(pViewState, XML_SORTORDER, sortOrder, SortOrderNone, SortOrderDescending))
102       viewState->second->m_sortOrder = (SortOrder)sortOrder;
103   }
104
105   pElement = settings->FirstChild(XML_GENERAL);
106   if (pElement != NULL)
107   {
108     int settingLevel;
109     if (XMLUtils::GetInt(pElement, XML_SETTINGLEVEL, settingLevel, (const int)SettingLevelBasic, (const int)SettingLevelExpert))
110       m_settingLevel = (SettingLevel)settingLevel;
111     else
112       m_settingLevel = SettingLevelStandard;
113   }
114
115   return true;
116 }
117
118 bool CViewStateSettings::Save(TiXmlNode *settings) const
119 {
120   if (settings == NULL)
121     return false;
122
123   CSingleLock lock(m_critical);
124   // add the <viewstates> tag
125   TiXmlElement xmlViewStateElement(XML_VIEWSTATESETTINGS);
126   TiXmlNode *pViewStateNode = settings->InsertEndChild(xmlViewStateElement);
127   if (pViewStateNode == NULL)
128   {
129     CLog::Log(LOGWARNING, "CViewStateSettings: could not create <viewstates> tag");
130     return false;
131   }
132
133   for (map<string, CViewState*>::const_iterator viewState = m_viewStates.begin(); viewState != m_viewStates.end(); viewState++)
134   {
135     TiXmlElement newElement(viewState->first);
136     TiXmlNode *pNewNode = pViewStateNode->InsertEndChild(newElement);
137     if (pNewNode == NULL)
138       continue;
139
140     XMLUtils::SetInt(pNewNode, XML_VIEWMODE, viewState->second->m_viewMode);
141     XMLUtils::SetInt(pNewNode, XML_SORTMETHOD, (int)viewState->second->m_sortMethod);
142     XMLUtils::SetInt(pNewNode, XML_SORTORDER, (int)viewState->second->m_sortOrder);
143   }
144
145   TiXmlNode *generalNode = settings->FirstChild(XML_GENERAL);
146   if (generalNode == NULL)
147   {
148     TiXmlElement generalElement(XML_GENERAL);
149     generalNode = settings->InsertEndChild(generalElement);
150     if (generalNode == NULL)
151       return false;
152   }
153
154   XMLUtils::SetInt(generalNode, XML_SETTINGLEVEL, (int)m_settingLevel);
155
156   return true;
157 }
158
159 void CViewStateSettings::Clear()
160 {
161   m_settingLevel = SettingLevelStandard;
162 }
163
164 const CViewState* CViewStateSettings::Get(const std::string &viewState) const
165 {
166   CSingleLock lock(m_critical);
167   map<string, CViewState*>::const_iterator view = m_viewStates.find(viewState);
168   if (view != m_viewStates.end())
169     return view->second;
170
171   return NULL;
172 }
173
174 CViewState* CViewStateSettings::Get(const std::string &viewState)
175 {
176   CSingleLock lock(m_critical);
177   map<string, CViewState*>::iterator view = m_viewStates.find(viewState);
178   if (view != m_viewStates.end())
179     return view->second;
180
181   return NULL;
182 }
183
184 void CViewStateSettings::SetSettingLevel(SettingLevel settingLevel)
185 {
186   if (settingLevel < SettingLevelBasic)
187     m_settingLevel = SettingLevelBasic;
188   if (settingLevel > SettingLevelExpert)
189     m_settingLevel = SettingLevelExpert;
190   else
191     m_settingLevel = settingLevel;
192 }
193
194 void CViewStateSettings::CycleSettingLevel()
195 {
196   m_settingLevel = (SettingLevel)((int)m_settingLevel + 1);
197   if (m_settingLevel > SettingLevelExpert)
198     m_settingLevel = SettingLevelBasic;
199 }
200
201 void CViewStateSettings::AddViewState(const std::string& strTagName, int defaultView /* = DEFAULT_VIEW_LIST */, SORT_METHOD defaultSort /* = SORT_METHOD_LABEL */)
202 {
203   if (strTagName.empty() || m_viewStates.find(strTagName) != m_viewStates.end())
204     return;
205
206   CViewState *viewState = new CViewState(defaultView, defaultSort, SortOrderAscending);
207   if (viewState == NULL)
208     return;
209
210   m_viewStates.insert(make_pair(strTagName, viewState));
211 }