changed: No need to pass addon deletion into CGUIWindowAddonBrowser
[vuplus_xbmc] / xbmc / GUIDialogAddonInfo.cpp
1 /*
2  *      Copyright (C) 2005-2008 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, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "GUIDialogAddonInfo.h"
23 #include "GUIDialogYesNo.h"
24 #include "addons/AddonManager.h"
25 #include "AddonDatabase.h"
26 #include "FileItem.h"
27 #include "FileSystem/File.h"
28 #include "FileSystem/SpecialProtocol.h"
29 #include "GUIDialogAddonSettings.h"
30 #include "GUIDialogTextViewer.h"
31 #include "GUIUserMessages.h"
32 #include "GUIWindowAddonBrowser.h"
33 #include "GUIWindowManager.h"
34 #include "URL.h"
35 #include "utils/JobManager.h"
36 #include "utils/FileOperationJob.h"
37
38 #define CONTROL_BTN_INSTALL          6
39 #define CONTROL_BTN_ENABLE           7
40 #define CONTROL_BTN_UPDATE           8
41 #define CONTROL_BTN_SETTINGS         9
42 #define CONTROL_BTN_CHANGELOG       10
43
44 using namespace std;
45 using namespace ADDON;
46 using namespace XFILE;
47
48 CGUIDialogAddonInfo::CGUIDialogAddonInfo(void)
49     : CGUIDialog(WINDOW_DIALOG_ADDON_INFO, "DialogAddonInfo.xml")
50 {
51   m_item = CFileItemPtr(new CFileItem);
52 }
53
54 CGUIDialogAddonInfo::~CGUIDialogAddonInfo(void)
55 {
56 }
57
58 bool CGUIDialogAddonInfo::OnMessage(CGUIMessage& message)
59 {
60   switch ( message.GetMessage() )
61   {
62   case GUI_MSG_WINDOW_DEINIT:
63     {
64       if (m_jobid)
65         CJobManager::GetInstance().CancelJob(m_jobid);
66     }
67     break;
68
69   case GUI_MSG_CLICKED:
70     {
71       int iControl = message.GetSenderId();
72       if (iControl == CONTROL_BTN_UPDATE)
73       {
74         OnUpdate();
75         return true;
76       }
77       if (iControl == CONTROL_BTN_INSTALL)
78       {
79         if (!m_localAddon)
80         {
81           OnInstall();
82           return true;
83         }
84         else if (CGUIDialogYesNo::ShowAndGetInput(24037, 750, 0, 0))
85         {
86           OnUninstall();
87           return true;
88         }
89       }
90       else if (iControl == CONTROL_BTN_ENABLE)
91       {
92         OnEnable(!m_item->GetProperty("Addon.Enabled").Equals("true"));
93         return true;
94       }
95       else if (iControl == CONTROL_BTN_SETTINGS)
96       {
97         OnSettings();
98         return true;
99       }
100       else if (iControl == CONTROL_BTN_CHANGELOG)
101       {
102         OnChangeLog();
103         return true;
104       }
105     }
106     break;
107 default:
108     break;
109   }
110
111   return CGUIDialog::OnMessage(message);
112 }
113
114 void CGUIDialogAddonInfo::OnInitWindow()
115 {
116   UpdateControls();
117   CGUIDialog::OnInitWindow();
118   m_changelog = false;
119 }
120
121 void CGUIDialogAddonInfo::UpdateControls()
122 {
123   CStdString xbmcPath = _P("special://xbmc/addons");
124   bool isInstalled = NULL != m_localAddon.get();
125   bool isSystem = isInstalled && m_localAddon->Path().Left(xbmcPath.size()).Equals(xbmcPath);
126   bool isEnabled = isInstalled && m_item->GetProperty("Addon.Enabled").Equals("true");
127   bool isUpdatable = isInstalled && m_item->GetProperty("Addon.UpdateAvail").Equals("true");
128   // TODO: System addons should be able to be disabled
129   bool canDisable = isInstalled && !isSystem && !m_localAddon->IsInUse();
130   bool canInstall = !isInstalled && m_item->GetProperty("Addon.Broken").IsEmpty();
131                      
132   CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_INSTALL, canDisable || canInstall);
133   SET_CONTROL_LABEL(CONTROL_BTN_INSTALL, isInstalled ? 24037 : 24038);
134
135   CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_ENABLE, canDisable);
136   SET_CONTROL_LABEL(CONTROL_BTN_ENABLE, isEnabled ? 24021 : 24022);
137
138   CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_UPDATE, isUpdatable);
139   CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_SETTINGS, isInstalled && m_localAddon->HasSettings());
140   CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_CHANGELOG, m_addon->Type() != ADDON_REPOSITORY);
141 }
142
143 void CGUIDialogAddonInfo::OnUpdate()
144 {
145   CStdString referer;
146   referer.Format("Referer=%s-%s.zip",m_localAddon->ID().c_str(),m_localAddon->Version().str.c_str());
147   CGUIWindowAddonBrowser::InstallAddon(m_addon->ID(), true, referer); // force install
148   Close();
149 }
150
151 void CGUIDialogAddonInfo::OnInstall()
152 {
153   CGUIWindowAddonBrowser::InstallAddon(m_addon->ID());
154   Close();
155 }
156
157 void CGUIDialogAddonInfo::OnUninstall()
158 {
159   if (!m_localAddon.get())
160     return;
161
162   // ensure the addon isn't disabled in our database
163   CAddonDatabase database;
164   database.Open();
165   database.DisableAddon(m_localAddon->ID(), false);
166
167   CFileItemList list;
168   list.Add(CFileItemPtr(new CFileItem(m_localAddon->Path(),true)));
169   list[0]->Select(true);
170   CJobManager::GetInstance().AddJob(new CFileOperationJob(CFileOperationJob::ActionDelete,list,""),NULL);
171   CAddonMgr::Get().RemoveAddon(m_localAddon->ID());
172   Close();
173 }
174
175 void CGUIDialogAddonInfo::OnEnable(bool enable)
176 {
177   if (!m_localAddon.get())
178     return;
179
180   CAddonDatabase database;
181   database.Open();
182   database.DisableAddon(m_localAddon->ID(), !enable);
183   SetItem(m_item);
184   UpdateControls();
185   g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE);
186 }
187
188 void CGUIDialogAddonInfo::OnSettings()
189 {
190   CGUIDialogAddonSettings::ShowAndGetInput(m_localAddon);
191 }
192
193 void CGUIDialogAddonInfo::OnChangeLog()
194 {
195   CGUIDialogTextViewer* pDlgInfo = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER);
196   pDlgInfo->SetHeading(g_localizeStrings.Get(24054)+" - "+m_addon->Name());
197   if (m_item->GetProperty("Addon.Changelog").IsEmpty())
198   {
199     pDlgInfo->SetText(g_localizeStrings.Get(13413));
200     CFileItemList items;
201     if (m_localAddon && 
202         !m_item->GetProperty("Addon.UpdateAvail").Equals("true"))
203     {
204       items.Add(CFileItemPtr(new CFileItem(m_localAddon->ChangeLog(),false)));
205     }
206     else
207       items.Add(CFileItemPtr(new CFileItem(m_addon->ChangeLog(),false)));
208     items[0]->Select(true);
209     m_jobid = CJobManager::GetInstance().AddJob(
210       new CFileOperationJob(CFileOperationJob::ActionCopy,items,
211                             "special://temp/"),this);
212   }
213   else
214     pDlgInfo->SetText(m_item->GetProperty("Addon.Changelog"));
215
216   m_changelog = true;
217   pDlgInfo->DoModal();
218   m_changelog = false;
219 }
220
221 bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item)
222 {
223   CGUIDialogAddonInfo* dialog = (CGUIDialogAddonInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_ADDON_INFO);
224   if (!dialog)
225     return false;
226   if (!dialog->SetItem(item))
227     return false;
228
229   dialog->DoModal(); 
230   return true;
231 }
232
233 bool CGUIDialogAddonInfo::SetItem(const CFileItemPtr& item)
234 {
235   *m_item = *item;
236
237   // grab the local addon, if it's available
238   m_addon.reset();
239   if (CAddonMgr::Get().GetAddon(item->GetProperty("Addon.ID"), m_addon)) // sets m_addon if installed regardless of enabled state
240     m_item->SetProperty("Addon.Enabled", "true");
241   else
242     m_item->SetProperty("Addon.Enabled", "false");
243   m_item->SetProperty("Addon.Installed", m_addon ? "true" : "false");
244   m_localAddon = m_addon;
245
246   if (!m_addon)
247   { // coming from a repository
248     CAddonDatabase database;
249     database.Open();
250     if (!database.GetAddon(item->GetProperty("Addon.ID"),m_addon))
251       return false; // can't find the addon
252   }
253   if (TranslateType(item->GetProperty("Addon.intType")) == ADDON_REPOSITORY)
254   {
255     CAddonDatabase database;
256     database.Open();
257     VECADDONS addons;
258     database.GetRepository(m_addon->ID(), addons);
259     int tot=0;
260     for (int i = ADDON_UNKNOWN+1;i<ADDON_VIZ_LIBRARY;++i)
261     {
262       int num=0;
263       for (unsigned int j=0;j<addons.size();++j)
264       {
265         if (addons[j]->Type() == (TYPE)i)
266           ++num;
267       }
268       m_item->SetProperty(CStdString("Repo.") + TranslateType((TYPE)i), num);
269       tot += num;
270     }
271     m_item->SetProperty("Repo.Addons", tot);
272   }
273   return true;
274 }
275
276 void CGUIDialogAddonInfo::OnJobComplete(unsigned int jobID, bool success,
277                                         CJob* job)
278 {
279   if (!m_changelog)
280     return;
281
282   CGUIDialogTextViewer* pDlgInfo = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER);
283
284   m_jobid = 0;
285   if (!success)
286   {
287     pDlgInfo->SetText(g_localizeStrings.Get(195));
288   }
289   else
290   {
291     CFile file;
292     if (file.Open("special://temp/"+
293       CUtil::GetFileName(((CFileOperationJob*)job)->GetItems()[0]->m_strPath)))
294     {
295       char* temp = new char[(size_t)file.GetLength()+1];
296       file.Read(temp,file.GetLength());
297       temp[file.GetLength()] = '\0';
298       m_item->SetProperty("Addon.Changelog",temp);
299       pDlgInfo->SetText(temp);
300       delete[] temp;
301     }
302   }
303   CGUIMessage msg(GUI_MSG_NOTIFY_ALL, WINDOW_DIALOG_TEXT_VIEWER, 0, GUI_MSG_UPDATE);
304   g_windowManager.SendThreadMessage(msg);
305 }
306