addons: add missing intf and meta categories
[vlc.git] / include / vlc_addons.h
1 /*****************************************************************************
2  * vlc_addons.h : addons handling and describing
3  *****************************************************************************
4  * Copyright (C) 2013 VideoLAN and authors
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation; either version 2.1 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 #ifndef VLC_ADDONS_H
22 #define VLC_ADDONS_H 1
23
24 #include <vlc_arrays.h>
25 #include <vlc_events.h>
26
27 # ifdef __cplusplus
28 extern "C" {
29 # endif
30
31 typedef enum addon_type_t
32 {
33     ADDON_UNKNOWN = 0,
34     ADDON_EXTENSION,
35     ADDON_PLAYLIST_PARSER,
36     ADDON_SERVICE_DISCOVERY,
37     ADDON_SKIN2,
38     ADDON_PLUGIN,
39     ADDON_INTERFACE,
40     ADDON_META,
41     ADDON_OTHER
42 } addon_type_t;
43
44 typedef enum addon_state_t
45 {
46     ADDON_NOTINSTALLED = 0,
47     ADDON_INSTALLING,
48     ADDON_INSTALLED,
49     ADDON_UNINSTALLING
50 } addon_state_t;
51
52 typedef enum addon_flags_t
53 {
54     ADDON_BROKEN     = 1, /* Have install inconsistency */
55     ADDON_MANAGEABLE = 1 << 1, /* Have manifest, can install or uninstall files */
56     ADDON_UPDATABLE  = 1 << 2,
57 } addon_flags_t;
58
59 #define ADDON_MAX_SCORE (5 * 100)
60 #define ADDON_UUID_SIZE 16
61 #define ADDON_UUID_PSZ_SIZE (ADDON_UUID_SIZE * 2 + 4)
62 typedef uint8_t addon_uuid_t[ADDON_UUID_SIZE];
63
64 typedef struct addon_file_t
65 {
66     addon_type_t e_filetype;
67     char *psz_download_uri;
68     char *psz_filename;
69 } addon_file_t;
70
71 struct addon_entry_t
72 {
73     vlc_mutex_t lock;
74
75     addon_type_t e_type;
76     addon_state_t e_state;
77     addon_flags_t e_flags;
78
79     /* data describing addon */
80     addon_uuid_t uuid;
81     char *psz_name;
82     char *psz_summary;
83     char *psz_description;
84     char *psz_author;
85     char *psz_source_uri; /* webpage, ... */
86     char *psz_image_uri;
87     char *psz_image_data; /* base64, png */
88     char *psz_version;
89
90     /* stats */
91     long int i_downloads;
92     int i_score; /* score 0..5 in hundredth */
93
94     /* Lister */
95     char *psz_source_module;
96
97     /* files list */
98     char *psz_archive_uri; /* Archive */
99     DECL_ARRAY(addon_file_t *) files;
100
101     /* custom data storage (if needed by module/source) */
102     void * p_custom;
103 };
104
105 typedef struct addons_finder_t addons_finder_t;
106 typedef struct addons_finder_sys_t addons_finder_sys_t;
107 struct addons_finder_t
108 {
109     VLC_COMMON_MEMBERS
110
111     int ( * pf_find )( addons_finder_t * );
112     int ( * pf_retrieve )( addons_finder_t *, addon_entry_t * );
113     DECL_ARRAY( addon_entry_t * ) entries;
114     char *psz_uri;
115
116     addons_finder_sys_t *p_sys;
117 };
118
119 typedef struct addons_storage_t addons_storage_t;
120 typedef struct addons_storage_sys_t addons_storage_sys_t;
121 struct addons_storage_t
122 {
123     VLC_COMMON_MEMBERS
124
125     int ( * pf_install )( addons_storage_t *, addon_entry_t * );
126     int ( * pf_remove )( addons_storage_t *, addon_entry_t * );
127     int ( * pf_catalog ) ( addons_storage_t *, addon_entry_t **, int );
128
129     addons_storage_sys_t *p_sys;
130 };
131
132 typedef struct addons_manager_private_t addons_manager_private_t;
133 struct addons_manager_t
134 {
135     vlc_event_manager_t * p_event_manager;
136
137     addons_manager_private_t *p_priv;
138 };
139 typedef struct addons_manager_t addons_manager_t;
140
141 /**
142  *  addon entry lifecycle
143  */
144 VLC_API addon_entry_t *addon_entry_New( void );
145 VLC_API addon_entry_t *addon_entry_Hold(addon_entry_t *);
146 VLC_API void addon_entry_Release(addon_entry_t *);
147
148 /**
149  * addons manager lifecycle
150  */
151 VLC_API addons_manager_t *addons_manager_New( vlc_object_t * );
152 VLC_API void addons_manager_Delete( addons_manager_t * );
153
154 /**
155  * Charge currently installed, usable and manageable addons
156  * (default "addons storage" module)
157  */
158 VLC_API int addons_manager_LoadCatalog( addons_manager_t * );
159
160 /**
161  * Gather addons info from repository (default "addons finder" module)
162  * If psz_uri is not NULL, only gather info from the pointed package.
163  */
164 VLC_API void addons_manager_Gather( addons_manager_t *, const char *psz_uri );
165
166 /**
167  * Install or Remove the addon identified by its uuid
168  */
169 VLC_API int addons_manager_Install( addons_manager_t *p_manager, const addon_uuid_t uuid );
170 VLC_API int addons_manager_Remove( addons_manager_t *p_manager, const addon_uuid_t uuid );
171
172 /**
173  * String uuid to binary uuid helpers
174  */
175 static inline bool addons_uuid_read( const char *psz_uuid, addon_uuid_t *p_uuid )
176 {
177     if ( !psz_uuid ) return false;
178     if ( strlen( psz_uuid ) < ADDON_UUID_PSZ_SIZE ) return false;
179
180     int i = 0, j = 0;
181     while ( i<ADDON_UUID_PSZ_SIZE )
182     {
183         if ( *( psz_uuid + i ) == '-' )
184             i++;
185         int v;
186         sscanf( psz_uuid + i, "%02x", &v );
187         (*p_uuid)[j++] = v & 0xFF;
188         i+=2;
189     }
190
191     return true;
192 }
193
194 static inline char * addons_uuid_to_psz( const addon_uuid_t * p_uuid )
195 {
196     char *psz = (char*) calloc( ADDON_UUID_PSZ_SIZE + 1 , sizeof(char) );
197     if ( psz )
198     {
199         int i=0;
200         char *p = psz;
201         while ( i < ADDON_UUID_SIZE )
202         {
203             if ( i == 4 || i== 7 || i== 9 || i== 11 )
204                 *p++ = '-';
205             int v = 0xFF & (*p_uuid)[i];
206             sprintf( p, "%02x", v );
207             p += 2;
208             i++;
209         }
210     }
211     return psz;
212 }
213
214 # ifdef __cplusplus
215 }
216 # endif
217
218 #endif