7896bc4ede60d77bc646756c716c0628d326aced
[vuplus_xbmc] / xbmc / profiles / dialogs / GUIDialogLockSettings.cpp
1 /*
2  *      Copyright (C) 2005-2013 Team XBMC
3  *      http://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 "GUIDialogLockSettings.h"
22 #include "dialogs/GUIDialogNumeric.h"
23 #include "guilib/GUIKeyboardFactory.h"
24 #include "dialogs/GUIDialogGamepad.h"
25 #include "dialogs/GUIDialogContextMenu.h"
26 #include "guilib/GUIWindowManager.h"
27 #include "URL.h"
28 #include "guilib/LocalizeStrings.h"
29
30 CGUIDialogLockSettings::CGUIDialogLockSettings(void)
31     : CGUIDialogSettings(WINDOW_DIALOG_LOCK_SETTINGS, "LockSettings.xml")
32 {
33 }
34
35 CGUIDialogLockSettings::~CGUIDialogLockSettings(void)
36
37 {
38 }
39
40 void CGUIDialogLockSettings::OnCancel()
41 {
42   m_bChanged = false;
43 }
44
45 void CGUIDialogLockSettings::SetupPage()
46 {
47   CGUIDialogSettings::SetupPage();
48   // update our settings label
49   if (m_bGetUser)
50   {
51     CStdString strLabel;
52     CStdString strLabel2=m_strURL;
53     CURL::Decode(strLabel2);
54     strLabel.Format(g_localizeStrings.Get(20152),strLabel2.c_str());
55     SET_CONTROL_LABEL(2,strLabel);
56   }
57   else
58     SET_CONTROL_LABEL(2,g_localizeStrings.Get(20066));
59   SET_CONTROL_HIDDEN(3);
60 }
61
62 void CGUIDialogLockSettings::EnableDetails(bool bEnable)
63 {
64   for (int i=2;i<9;++i)
65   {
66     m_settings[i].enabled = bEnable || !m_bConditionalDetails;
67     UpdateSetting(i+1);
68   }
69 }
70
71 void CGUIDialogLockSettings::CreateSettings()
72 {
73   // clear out any old settings
74   m_settings.clear();
75   // create our settings
76   if (m_bGetUser)
77   {
78     AddButton(1,20142);
79     if (!m_strUser.IsEmpty())
80       m_settings[0].name.Format("%s (%s)",g_localizeStrings.Get(20142).c_str(),m_strUser.c_str());
81     AddButton(2,12326);
82     if (!m_locks.code.IsEmpty())
83       m_settings[1].name.Format("%s (%s)",g_localizeStrings.Get(12326).c_str(),g_localizeStrings.Get(20141).c_str());
84     if (m_saveUserDetails)
85       AddBool(3, 13423, m_saveUserDetails);
86     return;
87   }
88   AddButton(1,m_iButtonLabel);
89   if (m_locks.mode > LOCK_MODE_QWERTY)
90     m_locks.mode = LOCK_MODE_EVERYONE;
91   if (m_locks.mode != LOCK_MODE_EVERYONE)
92     m_settings[0].name.Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(12336+m_locks.mode).c_str());
93   else
94     m_settings[0].name.Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(1223).c_str());
95
96   if (m_bDetails)
97   {
98     AddSeparator(2);
99     AddBool(3,20038,&m_locks.music);
100     AddBool(4,20039,&m_locks.video);
101     AddBool(5,20040,&m_locks.pictures);
102     AddBool(6,20041,&m_locks.programs);
103     AddBool(7,20042,&m_locks.files);
104     
105     std::vector<std::pair<int, int> > settingsLevelOptions;
106     settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::NONE,     106));
107     settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::ALL,      593));
108     settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::STANDARD, 10037));
109     settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::ADVANCED, 10038));
110     settingsLevelOptions.push_back(std::make_pair(LOCK_LEVEL::EXPERT,   10039));
111     AddSpin(8, 20043, (int*)&m_locks.settings, settingsLevelOptions);
112     
113     AddBool(9,24090,&m_locks.addonManager);
114     EnableDetails(m_locks.mode != LOCK_MODE_EVERYONE);
115   }
116 }
117
118 void CGUIDialogLockSettings::OnSettingChanged(SettingInfo &setting)
119 {
120   // check and update anything that needs it
121   if (setting.id == 1)
122   {
123     if (m_bGetUser)
124     {
125       CStdString strHeading;
126       CStdString strDecodeUrl = m_strURL;
127       CURL::Decode(strDecodeUrl);
128       strHeading.Format("%s %s",g_localizeStrings.Get(14062).c_str(),strDecodeUrl.c_str());
129       if (CGUIKeyboardFactory::ShowAndGetInput(m_strUser,strHeading,true))
130       {
131         m_bChanged = true;
132         m_settings[0].name.Format("%s (%s)",g_localizeStrings.Get(20142).c_str(),m_strUser.c_str());
133         UpdateSetting(1);
134       }
135       return;
136     }
137     CContextButtons choices;
138     choices.Add(1, 1223);
139     choices.Add(2, 12337);
140     choices.Add(3, 12338);
141     choices.Add(4, 12339);
142     
143     int choice = CGUIDialogContextMenu::ShowAndGetChoice(choices);
144
145     CStdString newPassword;
146     LockType iLockMode = LOCK_MODE_UNKNOWN;
147     bool bResult = false;
148     switch(choice)
149     {
150     case 1:
151       iLockMode = LOCK_MODE_EVERYONE; //Disabled! Need check routine!!!
152       bResult = true;
153       break;
154     case 2:
155       iLockMode = LOCK_MODE_NUMERIC;
156       bResult = CGUIDialogNumeric::ShowAndVerifyNewPassword(newPassword);
157       break;
158     case 3:
159       iLockMode = LOCK_MODE_GAMEPAD;
160       bResult = CGUIDialogGamepad::ShowAndVerifyNewPassword(newPassword);
161       break;
162     case 4:
163       iLockMode = LOCK_MODE_QWERTY;
164       bResult = CGUIKeyboardFactory::ShowAndVerifyNewPassword(newPassword);
165       break;
166     default:
167       break;
168     }
169     if (bResult)
170     {
171       if (iLockMode == LOCK_MODE_EVERYONE)
172         newPassword = "-";
173       m_locks.code = newPassword;
174       if (m_locks.code == "-")
175         iLockMode = LOCK_MODE_EVERYONE;
176       m_locks.mode = iLockMode;
177       if (m_bDetails)
178         EnableDetails(m_locks.mode != LOCK_MODE_EVERYONE);
179       m_bChanged = true;
180       if (m_locks.mode != LOCK_MODE_EVERYONE)
181         setting.name.Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(12336+m_locks.mode).c_str());
182       else
183         setting.name.Format("%s (%s)",g_localizeStrings.Get(m_iButtonLabel).c_str(),g_localizeStrings.Get(1223).c_str());
184
185       UpdateSetting(1);
186     }
187   }
188   if (setting.id == 2 && m_bGetUser)
189   {
190     CStdString strHeading;
191     CStdString strDecodeUrl = m_strURL;
192     CURL::Decode(strDecodeUrl);
193     strHeading.Format("%s %s",g_localizeStrings.Get(20143).c_str(),strDecodeUrl.c_str());
194     if (CGUIKeyboardFactory::ShowAndGetInput(m_locks.code,strHeading,true,true))
195     {
196       m_settings[1].name.Format("%s (%s)",g_localizeStrings.Get(12326).c_str(),g_localizeStrings.Get(20141).c_str());
197       m_bChanged = true;
198       UpdateSetting(2);
199     }
200     return;
201   }
202   if (setting.id > 1)
203     m_bChanged = true;
204 }
205
206 bool CGUIDialogLockSettings::ShowAndGetUserAndPassword(CStdString& strUser, CStdString& strPassword, const CStdString& strURL, bool *saveUserDetails)
207 {
208   CGUIDialogLockSettings *dialog = (CGUIDialogLockSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS);
209   if (!dialog) return false;
210   dialog->m_bGetUser = true;
211   dialog->m_locks.code = strPassword;
212   dialog->m_strUser = strUser;
213   dialog->m_strURL = strURL;
214   dialog->m_bChanged = false;
215   dialog->m_saveUserDetails = saveUserDetails;
216   dialog->DoModal();
217   if (dialog->m_bChanged)
218   {
219     strUser = dialog->m_strUser;
220     strPassword = dialog->m_locks.code;
221     return true;
222   }
223
224   return false;
225 }
226
227 bool CGUIDialogLockSettings::ShowAndGetLock(LockType& iLockMode, CStdString& strPassword, int iHeader)
228 {
229   CProfile::CLock locks(iLockMode, strPassword);
230   if (ShowAndGetLock(locks, iHeader, false, false))
231   {
232     locks.Validate();
233     iLockMode = locks.mode;
234     strPassword = locks.code;
235     return true;
236   }
237   return false;
238 }
239
240 bool CGUIDialogLockSettings::ShowAndGetLock(CProfile::CLock &locks, int iButtonLabel, bool bConditional, bool bDetails)
241 {
242   CGUIDialogLockSettings *dialog = (CGUIDialogLockSettings *)g_windowManager.GetWindow(WINDOW_DIALOG_LOCK_SETTINGS);
243   if (!dialog) return false;
244   dialog->m_locks = locks;
245   dialog->m_iButtonLabel = iButtonLabel;
246   dialog->m_bChanged = false;
247   dialog->m_bGetUser = false;
248   dialog->m_bConditionalDetails = bConditional;
249   dialog->m_bDetails = bDetails;
250   dialog->DoModal();
251   if (dialog->m_bChanged)
252   {
253     locks = dialog->m_locks;
254     return true;
255   }
256
257   return false;
258 }