2 * Copyright (C) 2005-2008 Team XBMC
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)
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.
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
22 #include "GUIDialogAddonInfo.h"
23 #include "GUIDialogYesNo.h"
24 #include "addons/AddonManager.h"
25 #include "AddonDatabase.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"
35 #include "utils/JobManager.h"
36 #include "utils/FileOperationJob.h"
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
45 using namespace ADDON;
46 using namespace XFILE;
48 CGUIDialogAddonInfo::CGUIDialogAddonInfo(void)
49 : CGUIDialog(WINDOW_DIALOG_ADDON_INFO, "DialogAddonInfo.xml")
51 m_item = CFileItemPtr(new CFileItem);
54 CGUIDialogAddonInfo::~CGUIDialogAddonInfo(void)
58 bool CGUIDialogAddonInfo::OnMessage(CGUIMessage& message)
60 switch ( message.GetMessage() )
62 case GUI_MSG_WINDOW_DEINIT:
65 CJobManager::GetInstance().CancelJob(m_jobid);
71 int iControl = message.GetSenderId();
72 if (iControl == CONTROL_BTN_UPDATE)
77 if (iControl == CONTROL_BTN_INSTALL)
84 else if (CGUIDialogYesNo::ShowAndGetInput(24037, 750, 0, 0))
90 else if (iControl == CONTROL_BTN_ENABLE)
92 OnEnable(!m_item->GetProperty("Addon.Enabled").Equals("true"));
95 else if (iControl == CONTROL_BTN_SETTINGS)
100 else if (iControl == CONTROL_BTN_CHANGELOG)
111 return CGUIDialog::OnMessage(message);
114 void CGUIDialogAddonInfo::OnInitWindow()
117 CGUIDialog::OnInitWindow();
121 void CGUIDialogAddonInfo::UpdateControls()
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();
132 CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_INSTALL, canDisable || canInstall);
133 SET_CONTROL_LABEL(CONTROL_BTN_INSTALL, isInstalled ? 24037 : 24038);
135 CONTROL_ENABLE_ON_CONDITION(CONTROL_BTN_ENABLE, canDisable);
136 SET_CONTROL_LABEL(CONTROL_BTN_ENABLE, isEnabled ? 24021 : 24022);
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);
143 void CGUIDialogAddonInfo::OnUpdate()
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
151 void CGUIDialogAddonInfo::OnInstall()
153 CGUIWindowAddonBrowser::InstallAddon(m_addon->ID());
157 void CGUIDialogAddonInfo::OnUninstall()
159 if (!m_localAddon.get())
162 // ensure the addon isn't disabled in our database
163 CAddonDatabase database;
165 database.DisableAddon(m_localAddon->ID(), false);
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());
175 void CGUIDialogAddonInfo::OnEnable(bool enable)
177 if (!m_localAddon.get())
180 CAddonDatabase database;
182 database.DisableAddon(m_localAddon->ID(), !enable);
185 g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE);
188 void CGUIDialogAddonInfo::OnSettings()
190 CGUIDialogAddonSettings::ShowAndGetInput(m_localAddon);
193 void CGUIDialogAddonInfo::OnChangeLog()
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())
199 pDlgInfo->SetText(g_localizeStrings.Get(13413));
202 !m_item->GetProperty("Addon.UpdateAvail").Equals("true"))
204 items.Add(CFileItemPtr(new CFileItem(m_localAddon->ChangeLog(),false)));
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);
214 pDlgInfo->SetText(m_item->GetProperty("Addon.Changelog"));
221 bool CGUIDialogAddonInfo::ShowForItem(const CFileItemPtr& item)
223 CGUIDialogAddonInfo* dialog = (CGUIDialogAddonInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_ADDON_INFO);
226 if (!dialog->SetItem(item))
233 bool CGUIDialogAddonInfo::SetItem(const CFileItemPtr& item)
237 // grab the local addon, if it's available
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");
242 m_item->SetProperty("Addon.Enabled", "false");
243 m_item->SetProperty("Addon.Installed", m_addon ? "true" : "false");
244 m_localAddon = m_addon;
247 { // coming from a repository
248 CAddonDatabase database;
250 if (!database.GetAddon(item->GetProperty("Addon.ID"),m_addon))
251 return false; // can't find the addon
253 if (TranslateType(item->GetProperty("Addon.intType")) == ADDON_REPOSITORY)
255 CAddonDatabase database;
258 database.GetRepository(m_addon->ID(), addons);
260 for (int i = ADDON_UNKNOWN+1;i<ADDON_VIZ_LIBRARY;++i)
263 for (unsigned int j=0;j<addons.size();++j)
265 if (addons[j]->Type() == (TYPE)i)
268 m_item->SetProperty(CStdString("Repo.") + TranslateType((TYPE)i), num);
271 m_item->SetProperty("Repo.Addons", tot);
276 void CGUIDialogAddonInfo::OnJobComplete(unsigned int jobID, bool success,
282 CGUIDialogTextViewer* pDlgInfo = (CGUIDialogTextViewer*)g_windowManager.GetWindow(WINDOW_DIALOG_TEXT_VIEWER);
287 pDlgInfo->SetText(g_localizeStrings.Get(195));
292 if (file.Open("special://temp/"+
293 CUtil::GetFileName(((CFileOperationJob*)job)->GetItems()[0]->m_strPath)))
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);
303 CGUIMessage msg(GUI_MSG_NOTIFY_ALL, WINDOW_DIALOG_TEXT_VIEWER, 0, GUI_MSG_UPDATE);
304 g_windowManager.SendThreadMessage(msg);