This repository has been archived by the owner on Apr 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 42
/
AddonManager.h
152 lines (135 loc) · 5.86 KB
/
AddonManager.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#pragma once
/*
* Copyright (C) 2005-2009 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, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
* http://www.gnu.org/copyleft/gpl.html
*
*/
#include "Addon.h"
#include "include/xbmc_addon_dll.h"
#include "tinyXML/tinyxml.h"
#include "utils/CriticalSection.h"
#include "StdString.h"
#include "utils/Job.h"
#include "utils/Stopwatch.h"
#include <vector>
#include <map>
#include <deque>
class DllLibCPluff;
extern "C"
{
#include "lib/cpluff/libcpluff/cpluff.h"
}
namespace ADDON
{
typedef std::vector<AddonPtr> VECADDONS;
typedef std::vector<AddonPtr>::iterator IVECADDONS;
typedef std::map<TYPE, VECADDONS> MAPADDONS;
typedef std::map<TYPE, VECADDONS>::iterator IMAPADDONS;
typedef std::deque<cp_cfg_element_t*> DEQUEELEMENTS;
typedef std::deque<cp_cfg_element_t*>::iterator IDEQUEELEMENTS;
const CStdString ADDON_METAFILE = "description.xml";
const CStdString ADDON_VIS_EXT = "*.vis";
const CStdString ADDON_PYTHON_EXT = "*.py";
const CStdString ADDON_SCRAPER_EXT = "*.xml";
const CStdString ADDON_SCREENSAVER_EXT = "*.xbs";
const CStdString ADDON_DSP_AUDIO_EXT = "*.adsp";
const CStdString ADDON_VERSION_RE = "(?<Major>\\d*)\\.?(?<Minor>\\d*)?\\.?(?<Build>\\d*)?\\.?(?<Revision>\\d*)?";
/**
* Class - IAddonCallback
* This callback should be inherited by any class which manages
* specific addon types. Could be mostly used for Dll addon types to handle
* cleanup before restart/removal
*/
class IAddonMgrCallback
{
public:
virtual ~IAddonMgrCallback() {};
virtual bool RequestRestart(AddonPtr addon, bool datachanged)=0;
virtual bool RequestRemoval(AddonPtr addon)=0;
};
/**
* Class - CAddonMgr
* Holds references to all addons, enabled or
* otherwise. Services the generic callbacks available
* to all addon variants.
*/
class CAddonMgr : public IJobCallback
{
public:
static CAddonMgr &Get();
bool Init();
void DeInit();
IAddonMgrCallback* GetCallbackForType(TYPE type);
bool RegisterAddonMgrCallback(TYPE type, IAddonMgrCallback* cb);
void UnregisterAddonMgrCallback(TYPE type);
/* Addon access */
bool GetDefault(const TYPE &type, AddonPtr &addon, const CONTENT_TYPE &content = CONTENT_NONE);
bool GetAddon(const CStdString &str, AddonPtr &addon, const TYPE &type = ADDON_UNKNOWN, bool enabledOnly = true);
AddonPtr GetAddon2(const CStdString &str);
bool HasAddons(const TYPE &type, const CONTENT_TYPE &content = CONTENT_NONE, bool enabledOnly = true);
bool GetAddons(const TYPE &type, VECADDONS &addons, const CONTENT_TYPE &content = CONTENT_NONE, bool enabled = true);
bool GetAllAddons(VECADDONS &addons, bool enabledOnly = true);
CStdString GetString(const CStdString &id, const int number);
bool AddonFromFolder(const CStdString& strFolder, AddonPtr& addon);
static bool GetTranslatedString(const TiXmlElement *xmldoc, const char *tag, CStdString& data);
const char *GetTranslatedString(const cp_cfg_element_t *root, const char *tag);
static AddonPtr AddonFromProps(AddonProps& props);
void UpdateRepos();
void FindAddons();
void RemoveAddon(const CStdString& ID);
/* libcpluff */
CStdString GetExtValue(cp_cfg_element_t *base, const char *path);
std::vector<CStdString> GetExtValues(cp_cfg_element_t *base, const char *path);
const cp_extension_t *GetExtension(const cp_plugin_info_t *props, const char *extension);
/*! \brief Load the addon in the given path
This loads the addon using c-pluff which parses the addon descriptor file.
\param path folder that contains the addon.
\param addon [out] returned addon.
\return true if addon is set, false otherwise.
*/
bool LoadAddonDescription(const CStdString &path, AddonPtr &addon);
/*! \brief Parse a repository XML file for addons and load their descriptors
A repository XML is essentially a concatenated list of addon descriptors.
\param root Root element of an XML document.
\param addons [out] returned list of addons.
\return true if the repository XML file is parsed, false otherwise.
*/
bool AddonsFromRepoXML(const TiXmlElement *root, VECADDONS &addons);
ADDONDEPS GetDeps(const CStdString& id);
private:
void LoadAddons(const CStdString &path,
std::map<CStdString, AddonPtr>& unresolved);
void OnJobComplete(unsigned int jobID, bool sucess, CJob* job);
/* libcpluff */
bool GetExtensions(const TYPE &type, VECADDONS &addons, const CONTENT_TYPE &content);
const cp_cfg_element_t *GetExtElement(cp_cfg_element_t *base, const char *path);
bool GetExtElementDeque(DEQUEELEMENTS &elements, cp_cfg_element_t *base, const char *path);
cp_context_t *m_cp_context;
DllLibCPluff *m_cpluff;
AddonPtr Factory(const cp_extension_t *props);
bool CheckUserDirs(const cp_cfg_element_t *element);
// private construction, and no assignements; use the provided singleton methods
CAddonMgr();
CAddonMgr(const CAddonMgr&);
CAddonMgr const& operator=(CAddonMgr const&);
virtual ~CAddonMgr();
static std::map<TYPE, IAddonMgrCallback*> m_managers;
CStopWatch m_watch;
CCriticalSection m_critSection;
};
}; /* namespace ADDON */