Provide LightMediaScanner 0.5.1, Rygel LMS plugin
[AGL/meta-agl.git] / meta-agl / recipes-connectivity / rygel / files / 0002-lms-add-C-source-files.patch
1 From 5a91b6b6efdaf28a6640126a32e819aef7e10a74 Mon Sep 17 00:00:00 2001
2 From: Manuel Bachmann <manuel.bachmann@iot.bzh>
3 Date: Sun, 25 Oct 2015 14:21:28 +0100
4 Subject: [PATCH] lms: add C source files
5
6 C source files are normally generated by Vala at compile
7 time, but we do not use Vala for Rygel under OpenEmbedded
8 (because it requires GObject-Introspection support in
9 dependencies such as GUPnP, and that is still buggy).
10
11 A full tarball release would contain the C files anyway,
12 so let us include them so the build succeeds with OE.
13
14 Signed-off-by: Manuel Bachmann <manuel.bachmann@iot.bzh>
15 ---
16  src/plugins/lms/librygel_lms_la_vala.stamp     |    1 +
17  src/plugins/lms/rygel-lms-album.c              |  514 +++++
18  src/plugins/lms/rygel-lms-albums.c             |  569 +++++
19  src/plugins/lms/rygel-lms-all-images.c         |  305 +++
20  src/plugins/lms/rygel-lms-all-music.c          |  417 ++++
21  src/plugins/lms/rygel-lms-all-videos.c         |  456 ++++
22  src/plugins/lms/rygel-lms-artist.c             |  274 +++
23  src/plugins/lms/rygel-lms-artists.c            |  214 ++
24  src/plugins/lms/rygel-lms-category-container.c | 2772 ++++++++++++++++++++++++
25  src/plugins/lms/rygel-lms-database.c           | 1349 ++++++++++++
26  src/plugins/lms/rygel-lms-dbus-interfaces.c    |  261 +++
27  src/plugins/lms/rygel-lms-image-root.c         |  178 ++
28  src/plugins/lms/rygel-lms-image-year.c         |  422 ++++
29  src/plugins/lms/rygel-lms-image-years.c        |  196 ++
30  src/plugins/lms/rygel-lms-music-root.c         |  202 ++
31  src/plugins/lms/rygel-lms-plugin-factory.c     |  307 +++
32  src/plugins/lms/rygel-lms-plugin.c             |  134 ++
33  src/plugins/lms/rygel-lms-root-container.c     |  318 +++
34  src/plugins/lms/rygel-lms-sql-function.c       |  146 ++
35  src/plugins/lms/rygel-lms-sql-operator.c       |  240 ++
36  21 files changed, 9276 insertions(+), 1 deletion(-)
37  create mode 100644 src/plugins/lms/librygel_lms_la_vala.stamp
38  create mode 100644 src/plugins/lms/rygel-lms-album.c
39  create mode 100644 src/plugins/lms/rygel-lms-albums.c
40  create mode 100644 src/plugins/lms/rygel-lms-all-images.c
41  create mode 100644 src/plugins/lms/rygel-lms-all-music.c
42  create mode 100644 src/plugins/lms/rygel-lms-all-videos.c
43  create mode 100644 src/plugins/lms/rygel-lms-artist.c
44  create mode 100644 src/plugins/lms/rygel-lms-artists.c
45  create mode 100644 src/plugins/lms/rygel-lms-category-container.c
46  create mode 100644 src/plugins/lms/rygel-lms-database.c
47  create mode 100644 src/plugins/lms/rygel-lms-dbus-interfaces.c
48  create mode 100644 src/plugins/lms/rygel-lms-image-root.c
49  create mode 100644 src/plugins/lms/rygel-lms-image-year.c
50  create mode 100644 src/plugins/lms/rygel-lms-image-years.c
51  create mode 100644 src/plugins/lms/rygel-lms-music-root.c
52  create mode 100644 src/plugins/lms/rygel-lms-plugin-factory.c
53  create mode 100644 src/plugins/lms/rygel-lms-plugin.c
54  create mode 100644 src/plugins/lms/rygel-lms-root-container.c
55  create mode 100644 src/plugins/lms/rygel-lms-sql-function.c
56  create mode 100644 src/plugins/lms/rygel-lms-sql-operator.c
57
58 diff --git a/src/plugins/lms/librygel_lms_la_vala.stamp b/src/plugins/lms/librygel_lms_la_vala.stamp
59 new file mode 100644
60 index 0000000..859afb1
61 --- /dev/null
62 +++ b/src/plugins/lms/librygel_lms_la_vala.stamp
63 @@ -0,0 +1 @@
64 +stamp
65 diff --git a/src/plugins/lms/rygel-lms-album.c b/src/plugins/lms/rygel-lms-album.c
66 new file mode 100644
67 index 0000000..9da60bc
68 --- /dev/null
69 +++ b/src/plugins/lms/rygel-lms-album.c
70 @@ -0,0 +1,514 @@
71 +/* rygel-lms-album.c generated by valac 0.28.0, the Vala compiler
72 + * generated from rygel-lms-album.vala, do not modify */
73 +
74 +/*
75 + * Copyright (C) 2013 Intel Corporation.
76 + *
77 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
78 + *
79 + * This file is part of Rygel.
80 + *
81 + * Rygel is free software; you can redistribute it and/or modify
82 + * it under the terms of the GNU Lesser General Public License as published by
83 + * the Free Software Foundation; either version 2 of the License, or
84 + * (at your option) any later version.
85 + *
86 + * Rygel is distributed in the hope that it will be useful,
87 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
88 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89 + * GNU Lesser General Public License for more details.
90 + *
91 + * You should have received a copy of the GNU Lesser General Public License
92 + * along with this program; if not, write to the Free Software Foundation,
93 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
94 + */
95 +
96 +#include <glib.h>
97 +#include <glib-object.h>
98 +#include <rygel-server.h>
99 +#include <sqlite3.h>
100 +#include <stdlib.h>
101 +#include <string.h>
102 +#include <gio/gio.h>
103 +
104 +
105 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
106 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
107 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
108 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
109 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
110 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
111 +
112 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
113 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
114 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
115 +
116 +#define RYGEL_LMS_TYPE_ALBUM (rygel_lms_album_get_type ())
117 +#define RYGEL_LMS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbum))
118 +#define RYGEL_LMS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
119 +#define RYGEL_LMS_IS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALBUM))
120 +#define RYGEL_LMS_IS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALBUM))
121 +#define RYGEL_LMS_ALBUM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
122 +
123 +typedef struct _RygelLMSAlbum RygelLMSAlbum;
124 +typedef struct _RygelLMSAlbumClass RygelLMSAlbumClass;
125 +typedef struct _RygelLMSAlbumPrivate RygelLMSAlbumPrivate;
126 +#define _g_free0(var) (var = (g_free (var), NULL))
127 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
128 +
129 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
130 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
131 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
132 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
133 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
134 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
135 +
136 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
137 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
138 +
139 +struct _RygelLMSCategoryContainer {
140 +       RygelMediaContainer parent_instance;
141 +       RygelLMSCategoryContainerPrivate * priv;
142 +       sqlite3_stmt* stmt_all;
143 +       sqlite3_stmt* stmt_find_object;
144 +       sqlite3_stmt* stmt_added;
145 +       sqlite3_stmt* stmt_removed;
146 +       gchar* child_prefix;
147 +       gchar* ref_prefix;
148 +};
149 +
150 +struct _RygelLMSCategoryContainerClass {
151 +       RygelMediaContainerClass parent_class;
152 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
153 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
154 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
155 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
156 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
157 +};
158 +
159 +struct _RygelLMSAlbum {
160 +       RygelLMSCategoryContainer parent_instance;
161 +       RygelLMSAlbumPrivate * priv;
162 +};
163 +
164 +struct _RygelLMSAlbumClass {
165 +       RygelLMSCategoryContainerClass parent_class;
166 +};
167 +
168 +
169 +static gpointer rygel_lms_album_parent_class = NULL;
170 +
171 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
172 +GType rygel_lms_album_get_type (void) G_GNUC_CONST;
173 +enum  {
174 +       RYGEL_LMS_ALBUM_DUMMY_PROPERTY
175 +};
176 +#define RYGEL_LMS_ALBUM_SQL_ALL_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
177 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
178 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = %s " "LIMIT ? OFFSET ?;"
179 +#define RYGEL_LMS_ALBUM_SQL_COUNT_TEMPLATE "SELECT COUNT(audios.id) " "FROM audios, files " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = %s;"
180 +#define RYGEL_LMS_ALBUM_SQL_COUNT_WITH_FILTER_TEMPLATE "SELECT COUNT(audios.id), audios.title as title, " "audio_artists.name as artist, " "audio_albums.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = %s;"
181 +#define RYGEL_LMS_ALBUM_SQL_FIND_OBJECT_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title, audios.trackno, audios.length, audios.channels, audios.s" \
182 +"ampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " "audio_artists.name, " "audio_albums.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "WHERE dtime = 0 AND files.id = ? AND audios.id = files.id AND audios.a" \
183 +"lbum_id = %s;"
184 +#define RYGEL_LMS_ALBUM_SQL_ADDED_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
185 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
186 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = %s " "AND update_id > ? AND update_id <= ?;"
187 +#define RYGEL_LMS_ALBUM_SQL_REMOVED_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
188 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
189 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "WHERE dtime <> 0 AND audios.id = files.id AND audios.album_id = %s " "AND update_id > ? AND update_id <= ?;"
190 +static RygelMediaObject* rygel_lms_album_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
191 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
192 +gchar* rygel_lms_category_container_build_reference_id (RygelLMSCategoryContainer* self, gint db_id);
193 +static gchar* rygel_lms_album_get_sql_all (const gchar* db_id);
194 +static gchar* rygel_lms_album_get_sql_find_object (const gchar* db_id);
195 +static gchar* rygel_lms_album_get_sql_count (const gchar* db_id);
196 +static gchar* rygel_lms_album_get_sql_added (const gchar* db_id);
197 +static gchar* rygel_lms_album_get_sql_removed (const gchar* db_id);
198 +static gchar* rygel_lms_album_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
199 +const gchar* rygel_lms_category_container_get_sql_all (RygelLMSCategoryContainer* self);
200 +const gchar* rygel_lms_category_container_get_db_id (RygelLMSCategoryContainer* self);
201 +static gchar* rygel_lms_album_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
202 +const gchar* rygel_lms_category_container_get_sql_count (RygelLMSCategoryContainer* self);
203 +gpointer rygel_lms_database_ref (gpointer instance);
204 +void rygel_lms_database_unref (gpointer instance);
205 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
206 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
207 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
208 +gpointer rygel_lms_value_get_database (const GValue* value);
209 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
210 +RygelLMSAlbum* rygel_lms_album_new (const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
211 +RygelLMSAlbum* rygel_lms_album_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
212 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
213 +
214 +
215 +static RygelMediaObject* rygel_lms_album_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
216 +       RygelLMSAlbum * self;
217 +       RygelMediaObject* result = NULL;
218 +       gint id = 0;
219 +       sqlite3_stmt* _tmp0_ = NULL;
220 +       gint _tmp1_ = 0;
221 +       gchar* path = NULL;
222 +       sqlite3_stmt* _tmp2_ = NULL;
223 +       const gchar* _tmp3_ = NULL;
224 +       gchar* _tmp4_ = NULL;
225 +       gchar* mime_type = NULL;
226 +       sqlite3_stmt* _tmp5_ = NULL;
227 +       const gchar* _tmp6_ = NULL;
228 +       gchar* _tmp7_ = NULL;
229 +       gboolean _tmp8_ = FALSE;
230 +       const gchar* _tmp9_ = NULL;
231 +       gchar* title = NULL;
232 +       sqlite3_stmt* _tmp15_ = NULL;
233 +       const gchar* _tmp16_ = NULL;
234 +       gchar* _tmp17_ = NULL;
235 +       gchar* song_id = NULL;
236 +       gint _tmp18_ = 0;
237 +       gchar* _tmp19_ = NULL;
238 +       RygelMusicItem* song = NULL;
239 +       RygelMusicItem* _tmp20_ = NULL;
240 +       gint _tmp21_ = 0;
241 +       gchar* _tmp22_ = NULL;
242 +       gchar* _tmp23_ = NULL;
243 +       sqlite3_stmt* _tmp24_ = NULL;
244 +       gint _tmp25_ = 0;
245 +       sqlite3_stmt* _tmp26_ = NULL;
246 +       gint _tmp27_ = 0;
247 +       sqlite3_stmt* _tmp28_ = NULL;
248 +       gint _tmp29_ = 0;
249 +       sqlite3_stmt* _tmp30_ = NULL;
250 +       gint _tmp31_ = 0;
251 +       sqlite3_stmt* _tmp32_ = NULL;
252 +       gint _tmp33_ = 0;
253 +       sqlite3_stmt* _tmp34_ = NULL;
254 +       gint _tmp35_ = 0;
255 +       sqlite3_stmt* _tmp36_ = NULL;
256 +       const gchar* _tmp37_ = NULL;
257 +       const gchar* _tmp38_ = NULL;
258 +       sqlite3_stmt* _tmp39_ = NULL;
259 +       const gchar* _tmp40_ = NULL;
260 +       sqlite3_stmt* _tmp41_ = NULL;
261 +       const gchar* _tmp42_ = NULL;
262 +       GFile* file = NULL;
263 +       const gchar* _tmp43_ = NULL;
264 +       GFile* _tmp44_ = NULL;
265 +       gchar* _tmp45_ = NULL;
266 +       gchar* _tmp46_ = NULL;
267 +       self = (RygelLMSAlbum*) base;
268 +       g_return_val_if_fail (statement != NULL, NULL);
269 +       _tmp0_ = statement;
270 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
271 +       id = _tmp1_;
272 +       _tmp2_ = statement;
273 +       _tmp3_ = sqlite3_column_text (_tmp2_, 1);
274 +       _tmp4_ = g_strdup (_tmp3_);
275 +       path = _tmp4_;
276 +       _tmp5_ = statement;
277 +       _tmp6_ = sqlite3_column_text (_tmp5_, 10);
278 +       _tmp7_ = g_strdup (_tmp6_);
279 +       mime_type = _tmp7_;
280 +       _tmp9_ = mime_type;
281 +       if (_tmp9_ == NULL) {
282 +               _tmp8_ = TRUE;
283 +       } else {
284 +               const gchar* _tmp10_ = NULL;
285 +               gint _tmp11_ = 0;
286 +               gint _tmp12_ = 0;
287 +               _tmp10_ = mime_type;
288 +               _tmp11_ = strlen (_tmp10_);
289 +               _tmp12_ = _tmp11_;
290 +               _tmp8_ = _tmp12_ == 0;
291 +       }
292 +       if (_tmp8_) {
293 +               gint _tmp13_ = 0;
294 +               const gchar* _tmp14_ = NULL;
295 +               _tmp13_ = id;
296 +               _tmp14_ = path;
297 +               g_debug ("rygel-lms-album.vala:101: Music item %d (%s) has no MIME type", _tmp13_, _tmp14_);
298 +       }
299 +       _tmp15_ = statement;
300 +       _tmp16_ = sqlite3_column_text (_tmp15_, 3);
301 +       _tmp17_ = g_strdup (_tmp16_);
302 +       title = _tmp17_;
303 +       _tmp18_ = id;
304 +       _tmp19_ = rygel_lms_category_container_build_child_id ((RygelLMSCategoryContainer*) self, _tmp18_);
305 +       song_id = _tmp19_;
306 +       _tmp20_ = rygel_music_item_new (song_id, (RygelMediaContainer*) self, title, RYGEL_MUSIC_ITEM_UPNP_CLASS);
307 +       song = _tmp20_;
308 +       _tmp21_ = id;
309 +       _tmp22_ = rygel_lms_category_container_build_reference_id ((RygelLMSCategoryContainer*) self, _tmp21_);
310 +       _tmp23_ = _tmp22_;
311 +       rygel_media_object_set_ref_id ((RygelMediaObject*) song, _tmp23_);
312 +       _g_free0 (_tmp23_);
313 +       _tmp24_ = statement;
314 +       _tmp25_ = sqlite3_column_int (_tmp24_, 2);
315 +       rygel_media_file_item_set_size ((RygelMediaFileItem*) song, (gint64) _tmp25_);
316 +       _tmp26_ = statement;
317 +       _tmp27_ = sqlite3_column_int (_tmp26_, 4);
318 +       rygel_music_item_set_track_number (song, _tmp27_);
319 +       _tmp28_ = statement;
320 +       _tmp29_ = sqlite3_column_int (_tmp28_, 5);
321 +       rygel_audio_item_set_duration ((RygelAudioItem*) song, (glong) _tmp29_);
322 +       _tmp30_ = statement;
323 +       _tmp31_ = sqlite3_column_int (_tmp30_, 6);
324 +       rygel_audio_item_set_channels ((RygelAudioItem*) song, _tmp31_);
325 +       _tmp32_ = statement;
326 +       _tmp33_ = sqlite3_column_int (_tmp32_, 7);
327 +       rygel_audio_item_set_sample_freq ((RygelAudioItem*) song, _tmp33_);
328 +       _tmp34_ = statement;
329 +       _tmp35_ = sqlite3_column_int (_tmp34_, 8);
330 +       rygel_audio_item_set_bitrate ((RygelAudioItem*) song, _tmp35_);
331 +       _tmp36_ = statement;
332 +       _tmp37_ = sqlite3_column_text (_tmp36_, 9);
333 +       rygel_media_file_item_set_dlna_profile ((RygelMediaFileItem*) song, _tmp37_);
334 +       _tmp38_ = mime_type;
335 +       rygel_media_file_item_set_mime_type ((RygelMediaFileItem*) song, _tmp38_);
336 +       _tmp39_ = statement;
337 +       _tmp40_ = sqlite3_column_text (_tmp39_, 11);
338 +       rygel_media_object_set_artist ((RygelMediaObject*) song, _tmp40_);
339 +       _tmp41_ = statement;
340 +       _tmp42_ = sqlite3_column_text (_tmp41_, 12);
341 +       rygel_audio_item_set_album ((RygelAudioItem*) song, _tmp42_);
342 +       _tmp43_ = path;
343 +       _tmp44_ = g_file_new_for_path (_tmp43_);
344 +       file = _tmp44_;
345 +       _tmp45_ = g_file_get_uri (file);
346 +       _tmp46_ = _tmp45_;
347 +       rygel_media_object_add_uri ((RygelMediaObject*) song, _tmp46_);
348 +       _g_free0 (_tmp46_);
349 +       result = (RygelMediaObject*) song;
350 +       _g_object_unref0 (file);
351 +       _g_free0 (song_id);
352 +       _g_free0 (title);
353 +       _g_free0 (mime_type);
354 +       _g_free0 (path);
355 +       return result;
356 +}
357 +
358 +
359 +static gchar* rygel_lms_album_get_sql_all (const gchar* db_id) {
360 +       gchar* result = NULL;
361 +       const gchar* _tmp0_ = NULL;
362 +       gchar* _tmp1_ = NULL;
363 +       g_return_val_if_fail (db_id != NULL, NULL);
364 +       _tmp0_ = db_id;
365 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_ALL_TEMPLATE, _tmp0_);
366 +       result = _tmp1_;
367 +       return result;
368 +}
369 +
370 +
371 +static gchar* rygel_lms_album_get_sql_find_object (const gchar* db_id) {
372 +       gchar* result = NULL;
373 +       const gchar* _tmp0_ = NULL;
374 +       gchar* _tmp1_ = NULL;
375 +       g_return_val_if_fail (db_id != NULL, NULL);
376 +       _tmp0_ = db_id;
377 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_FIND_OBJECT_TEMPLATE, _tmp0_);
378 +       result = _tmp1_;
379 +       return result;
380 +}
381 +
382 +
383 +static gchar* rygel_lms_album_get_sql_count (const gchar* db_id) {
384 +       gchar* result = NULL;
385 +       const gchar* _tmp0_ = NULL;
386 +       gchar* _tmp1_ = NULL;
387 +       g_return_val_if_fail (db_id != NULL, NULL);
388 +       _tmp0_ = db_id;
389 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_COUNT_TEMPLATE, _tmp0_);
390 +       result = _tmp1_;
391 +       return result;
392 +}
393 +
394 +
395 +static gchar* rygel_lms_album_get_sql_added (const gchar* db_id) {
396 +       gchar* result = NULL;
397 +       const gchar* _tmp0_ = NULL;
398 +       gchar* _tmp1_ = NULL;
399 +       g_return_val_if_fail (db_id != NULL, NULL);
400 +       _tmp0_ = db_id;
401 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_ADDED_TEMPLATE, _tmp0_);
402 +       result = _tmp1_;
403 +       return result;
404 +}
405 +
406 +
407 +static gchar* rygel_lms_album_get_sql_removed (const gchar* db_id) {
408 +       gchar* result = NULL;
409 +       const gchar* _tmp0_ = NULL;
410 +       gchar* _tmp1_ = NULL;
411 +       g_return_val_if_fail (db_id != NULL, NULL);
412 +       _tmp0_ = db_id;
413 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_REMOVED_TEMPLATE, _tmp0_);
414 +       result = _tmp1_;
415 +       return result;
416 +}
417 +
418 +
419 +static gchar* rygel_lms_album_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
420 +       RygelLMSAlbum * self;
421 +       gchar* result = NULL;
422 +       const gchar* _tmp0_ = NULL;
423 +       gint _tmp1_ = 0;
424 +       gint _tmp2_ = 0;
425 +       gchar* filter_str = NULL;
426 +       const gchar* _tmp6_ = NULL;
427 +       const gchar* _tmp7_ = NULL;
428 +       const gchar* _tmp8_ = NULL;
429 +       gchar* _tmp9_ = NULL;
430 +       const gchar* _tmp10_ = NULL;
431 +       gchar* _tmp11_ = NULL;
432 +       self = (RygelLMSAlbum*) base;
433 +       g_return_val_if_fail (filter != NULL, NULL);
434 +       _tmp0_ = filter;
435 +       _tmp1_ = strlen (_tmp0_);
436 +       _tmp2_ = _tmp1_;
437 +       if (_tmp2_ == 0) {
438 +               const gchar* _tmp3_ = NULL;
439 +               const gchar* _tmp4_ = NULL;
440 +               gchar* _tmp5_ = NULL;
441 +               _tmp3_ = rygel_lms_category_container_get_sql_all ((RygelLMSCategoryContainer*) self);
442 +               _tmp4_ = _tmp3_;
443 +               _tmp5_ = g_strdup (_tmp4_);
444 +               result = _tmp5_;
445 +               return result;
446 +       }
447 +       _tmp6_ = rygel_lms_category_container_get_db_id ((RygelLMSCategoryContainer*) self);
448 +       _tmp7_ = _tmp6_;
449 +       _tmp8_ = filter;
450 +       _tmp9_ = g_strdup_printf ("%s AND %s", _tmp7_, _tmp8_);
451 +       filter_str = _tmp9_;
452 +       _tmp10_ = filter_str;
453 +       _tmp11_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_ALL_TEMPLATE, _tmp10_);
454 +       result = _tmp11_;
455 +       _g_free0 (filter_str);
456 +       return result;
457 +}
458 +
459 +
460 +static gchar* rygel_lms_album_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
461 +       RygelLMSAlbum * self;
462 +       gchar* result = NULL;
463 +       const gchar* _tmp0_ = NULL;
464 +       gint _tmp1_ = 0;
465 +       gint _tmp2_ = 0;
466 +       gchar* filter_str = NULL;
467 +       const gchar* _tmp6_ = NULL;
468 +       const gchar* _tmp7_ = NULL;
469 +       const gchar* _tmp8_ = NULL;
470 +       gchar* _tmp9_ = NULL;
471 +       const gchar* _tmp10_ = NULL;
472 +       gchar* _tmp11_ = NULL;
473 +       self = (RygelLMSAlbum*) base;
474 +       g_return_val_if_fail (filter != NULL, NULL);
475 +       _tmp0_ = filter;
476 +       _tmp1_ = strlen (_tmp0_);
477 +       _tmp2_ = _tmp1_;
478 +       if (_tmp2_ == 0) {
479 +               const gchar* _tmp3_ = NULL;
480 +               const gchar* _tmp4_ = NULL;
481 +               gchar* _tmp5_ = NULL;
482 +               _tmp3_ = rygel_lms_category_container_get_sql_count ((RygelLMSCategoryContainer*) self);
483 +               _tmp4_ = _tmp3_;
484 +               _tmp5_ = g_strdup (_tmp4_);
485 +               result = _tmp5_;
486 +               return result;
487 +       }
488 +       _tmp6_ = rygel_lms_category_container_get_db_id ((RygelLMSCategoryContainer*) self);
489 +       _tmp7_ = _tmp6_;
490 +       _tmp8_ = filter;
491 +       _tmp9_ = g_strdup_printf ("%s AND %s", _tmp7_, _tmp8_);
492 +       filter_str = _tmp9_;
493 +       _tmp10_ = filter_str;
494 +       _tmp11_ = g_strdup_printf (RYGEL_LMS_ALBUM_SQL_COUNT_WITH_FILTER_TEMPLATE, _tmp10_);
495 +       result = _tmp11_;
496 +       _g_free0 (filter_str);
497 +       return result;
498 +}
499 +
500 +
501 +RygelLMSAlbum* rygel_lms_album_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
502 +       RygelLMSAlbum * self = NULL;
503 +       const gchar* _tmp0_ = NULL;
504 +       RygelMediaContainer* _tmp1_ = NULL;
505 +       const gchar* _tmp2_ = NULL;
506 +       RygelLMSDatabase* _tmp3_ = NULL;
507 +       const gchar* _tmp4_ = NULL;
508 +       gchar* _tmp5_ = NULL;
509 +       gchar* _tmp6_ = NULL;
510 +       const gchar* _tmp7_ = NULL;
511 +       gchar* _tmp8_ = NULL;
512 +       gchar* _tmp9_ = NULL;
513 +       const gchar* _tmp10_ = NULL;
514 +       gchar* _tmp11_ = NULL;
515 +       gchar* _tmp12_ = NULL;
516 +       const gchar* _tmp13_ = NULL;
517 +       gchar* _tmp14_ = NULL;
518 +       gchar* _tmp15_ = NULL;
519 +       const gchar* _tmp16_ = NULL;
520 +       gchar* _tmp17_ = NULL;
521 +       gchar* _tmp18_ = NULL;
522 +       g_return_val_if_fail (db_id != NULL, NULL);
523 +       g_return_val_if_fail (parent != NULL, NULL);
524 +       g_return_val_if_fail (title != NULL, NULL);
525 +       g_return_val_if_fail (lms_db != NULL, NULL);
526 +       _tmp0_ = db_id;
527 +       _tmp1_ = parent;
528 +       _tmp2_ = title;
529 +       _tmp3_ = lms_db;
530 +       _tmp4_ = db_id;
531 +       _tmp5_ = rygel_lms_album_get_sql_all (_tmp4_);
532 +       _tmp6_ = _tmp5_;
533 +       _tmp7_ = db_id;
534 +       _tmp8_ = rygel_lms_album_get_sql_find_object (_tmp7_);
535 +       _tmp9_ = _tmp8_;
536 +       _tmp10_ = db_id;
537 +       _tmp11_ = rygel_lms_album_get_sql_count (_tmp10_);
538 +       _tmp12_ = _tmp11_;
539 +       _tmp13_ = db_id;
540 +       _tmp14_ = rygel_lms_album_get_sql_added (_tmp13_);
541 +       _tmp15_ = _tmp14_;
542 +       _tmp16_ = db_id;
543 +       _tmp17_ = rygel_lms_album_get_sql_removed (_tmp16_);
544 +       _tmp18_ = _tmp17_;
545 +       self = (RygelLMSAlbum*) rygel_lms_category_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_, _tmp3_, _tmp6_, _tmp9_, _tmp12_, _tmp15_, _tmp18_);
546 +       _g_free0 (_tmp18_);
547 +       _g_free0 (_tmp15_);
548 +       _g_free0 (_tmp12_);
549 +       _g_free0 (_tmp9_);
550 +       _g_free0 (_tmp6_);
551 +       return self;
552 +}
553 +
554 +
555 +RygelLMSAlbum* rygel_lms_album_new (const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
556 +       return rygel_lms_album_construct (RYGEL_LMS_TYPE_ALBUM, db_id, parent, title, lms_db);
557 +}
558 +
559 +
560 +static void rygel_lms_album_class_init (RygelLMSAlbumClass * klass) {
561 +       rygel_lms_album_parent_class = g_type_class_peek_parent (klass);
562 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_album_real_object_from_statement;
563 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_all_with_filter = rygel_lms_album_real_get_sql_all_with_filter;
564 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_count_with_filter = rygel_lms_album_real_get_sql_count_with_filter;
565 +}
566 +
567 +
568 +static void rygel_lms_album_instance_init (RygelLMSAlbum * self) {
569 +}
570 +
571 +
572 +GType rygel_lms_album_get_type (void) {
573 +       static volatile gsize rygel_lms_album_type_id__volatile = 0;
574 +       if (g_once_init_enter (&rygel_lms_album_type_id__volatile)) {
575 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSAlbumClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_album_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSAlbum), 0, (GInstanceInitFunc) rygel_lms_album_instance_init, NULL };
576 +               GType rygel_lms_album_type_id;
577 +               rygel_lms_album_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSAlbum", &g_define_type_info, 0);
578 +               g_once_init_leave (&rygel_lms_album_type_id__volatile, rygel_lms_album_type_id);
579 +       }
580 +       return rygel_lms_album_type_id__volatile;
581 +}
582 +
583 +
584 +
585 diff --git a/src/plugins/lms/rygel-lms-albums.c b/src/plugins/lms/rygel-lms-albums.c
586 new file mode 100644
587 index 0000000..f9fabe7
588 --- /dev/null
589 +++ b/src/plugins/lms/rygel-lms-albums.c
590 @@ -0,0 +1,569 @@
591 +/* rygel-lms-albums.c generated by valac 0.28.0, the Vala compiler
592 + * generated from rygel-lms-albums.vala, do not modify */
593 +
594 +/*
595 + * Copyright (C) 2013 Intel Corporation.
596 + *
597 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
598 + *
599 + * This file is part of Rygel.
600 + *
601 + * Rygel is free software; you can redistribute it and/or modify
602 + * it under the terms of the GNU Lesser General Public License as published by
603 + * the Free Software Foundation; either version 2 of the License, or
604 + * (at your option) any later version.
605 + *
606 + * Rygel is distributed in the hope that it will be useful,
607 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
608 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
609 + * GNU Lesser General Public License for more details.
610 + *
611 + * You should have received a copy of the GNU Lesser General Public License
612 + * along with this program; if not, write to the Free Software Foundation,
613 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
614 + */
615 +
616 +#include <glib.h>
617 +#include <glib-object.h>
618 +#include <rygel-server.h>
619 +#include <sqlite3.h>
620 +#include <stdlib.h>
621 +#include <string.h>
622 +#include <gee.h>
623 +#include <glib/gi18n-lib.h>
624 +
625 +
626 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
627 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
628 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
629 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
630 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
631 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
632 +
633 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
634 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
635 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
636 +
637 +#define RYGEL_LMS_TYPE_ALBUMS (rygel_lms_albums_get_type ())
638 +#define RYGEL_LMS_ALBUMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbums))
639 +#define RYGEL_LMS_ALBUMS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbumsClass))
640 +#define RYGEL_LMS_IS_ALBUMS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALBUMS))
641 +#define RYGEL_LMS_IS_ALBUMS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALBUMS))
642 +#define RYGEL_LMS_ALBUMS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbumsClass))
643 +
644 +typedef struct _RygelLMSAlbums RygelLMSAlbums;
645 +typedef struct _RygelLMSAlbumsClass RygelLMSAlbumsClass;
646 +typedef struct _RygelLMSAlbumsPrivate RygelLMSAlbumsPrivate;
647 +#define _g_free0(var) (var = (g_free (var), NULL))
648 +
649 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
650 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
651 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
652 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
653 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
654 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
655 +
656 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
657 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
658 +#define _sqlite3_finalize0(var) ((var == NULL) ? NULL : (var = (sqlite3_finalize (var), NULL)))
659 +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
660 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
661 +
662 +#define RYGEL_LMS_TYPE_ALBUM (rygel_lms_album_get_type ())
663 +#define RYGEL_LMS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbum))
664 +#define RYGEL_LMS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
665 +#define RYGEL_LMS_IS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALBUM))
666 +#define RYGEL_LMS_IS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALBUM))
667 +#define RYGEL_LMS_ALBUM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
668 +
669 +typedef struct _RygelLMSAlbum RygelLMSAlbum;
670 +typedef struct _RygelLMSAlbumClass RygelLMSAlbumClass;
671 +
672 +struct _RygelLMSCategoryContainer {
673 +       RygelMediaContainer parent_instance;
674 +       RygelLMSCategoryContainerPrivate * priv;
675 +       sqlite3_stmt* stmt_all;
676 +       sqlite3_stmt* stmt_find_object;
677 +       sqlite3_stmt* stmt_added;
678 +       sqlite3_stmt* stmt_removed;
679 +       gchar* child_prefix;
680 +       gchar* ref_prefix;
681 +};
682 +
683 +struct _RygelLMSCategoryContainerClass {
684 +       RygelMediaContainerClass parent_class;
685 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
686 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
687 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
688 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
689 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
690 +};
691 +
692 +struct _RygelLMSAlbums {
693 +       RygelLMSCategoryContainer parent_instance;
694 +       RygelLMSAlbumsPrivate * priv;
695 +};
696 +
697 +struct _RygelLMSAlbumsClass {
698 +       RygelLMSCategoryContainerClass parent_class;
699 +};
700 +
701 +typedef enum  {
702 +       RYGEL_LMS_DATABASE_ERROR_OPEN,
703 +       RYGEL_LMS_DATABASE_ERROR_PREPARE,
704 +       RYGEL_LMS_DATABASE_ERROR_BIND,
705 +       RYGEL_LMS_DATABASE_ERROR_STEP,
706 +       RYGEL_LMS_DATABASE_ERROR_NOT_FOUND
707 +} RygelLMSDatabaseError;
708 +#define RYGEL_LMS_DATABASE_ERROR rygel_lms_database_error_quark ()
709 +
710 +static gpointer rygel_lms_albums_parent_class = NULL;
711 +
712 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
713 +GType rygel_lms_albums_get_type (void) G_GNUC_CONST;
714 +enum  {
715 +       RYGEL_LMS_ALBUMS_DUMMY_PROPERTY
716 +};
717 +#define RYGEL_LMS_ALBUMS_SQL_ALL "SELECT audio_albums.id, audio_albums.name as title, " "audio_artists.name as artist " "FROM audio_albums " "LEFT JOIN audio_artists " "ON audio_albums.artist_id = audio_artists.id " "LIMIT ? OFFSET ?;"
718 +#define RYGEL_LMS_ALBUMS_SQL_ALL_WITH_FILTER_TEMPLATE "SELECT audio_albums.id, audio_albums.name as title, " "audio_artists.name as artist " "FROM audio_albums " "LEFT JOIN audio_artists " "ON audio_albums.artist_id = audio_artists.id " "WHERE %s " "LIMIT ? OFFSET ?;"
719 +#define RYGEL_LMS_ALBUMS_SQL_COUNT "SELECT COUNT(audio_albums.id) " "FROM audio_albums;"
720 +#define RYGEL_LMS_ALBUMS_SQL_COUNT_WITH_FILTER_TEMPLATE "SELECT COUNT(audio_albums.id), audio_albums.name as title, " "audio_artists.name as artist " "FROM audio_albums " "LEFT JOIN audio_artists " "ON audio_albums.artist_id = audio_artists.id " "WHERE %s;"
721 +#define RYGEL_LMS_ALBUMS_SQL_CHILD_COUNT_WITH_FILTER_TEMPLATE "SELECT COUNT(audios.id), audios.title as title, " "audio_artists.name as artist " "FROM audios, files, audio_albums " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = audio_a" \
722 +"lbums.id %s;"
723 +#define RYGEL_LMS_ALBUMS_SQL_CHILD_ALL_WITH_FILTER_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
724 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
725 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name, audio_albums.id " "FROM audios, files, audio_albums " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "WHERE dtime = 0 AND audios.id = files.id AND audios.album_id = audio_a" \
726 +"lbums.id %s " "LIMIT ? OFFSET ?;"
727 +#define RYGEL_LMS_ALBUMS_SQL_FIND_OBJECT "SELECT audio_albums.id, audio_albums.name " "FROM audio_albums " "WHERE audio_albums.id = ?;"
728 +static gchar* rygel_lms_albums_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
729 +static gchar* rygel_lms_albums_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
730 +static guint rygel_lms_albums_real_get_child_count_with_filter (RygelLMSCategoryContainer* base, const gchar* where_filter, GValueArray* args);
731 +guint rygel_lms_category_container_get_child_count_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
732 +gpointer rygel_lms_database_ref (gpointer instance);
733 +void rygel_lms_database_unref (gpointer instance);
734 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
735 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
736 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
737 +gpointer rygel_lms_value_get_database (const GValue* value);
738 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
739 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
740 +GQuark rygel_lms_database_error_quark (void);
741 +sqlite3_stmt* rygel_lms_database_prepare_and_init (RygelLMSDatabase* self, const gchar* query, GValue* arguments, int arguments_length1, GError** error);
742 +static RygelMediaObjects* rygel_lms_albums_real_get_children_with_filter (RygelLMSCategoryContainer* base, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
743 +RygelMediaObjects* rygel_lms_category_container_get_children_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
744 +gboolean rygel_lms_database_get_children_step (sqlite3_stmt* stmt, GError** error);
745 +GType rygel_lms_album_get_type (void) G_GNUC_CONST;
746 +RygelLMSAlbum* rygel_lms_album_new (const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
747 +RygelLMSAlbum* rygel_lms_album_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
748 +RygelMediaObject* rygel_lms_category_container_object_from_statement (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
749 +static RygelMediaObject* rygel_lms_albums_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
750 +RygelLMSAlbums* rygel_lms_albums_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
751 +RygelLMSAlbums* rygel_lms_albums_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
752 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
753 +
754 +
755 +static gchar* rygel_lms_albums_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
756 +       RygelLMSAlbums * self;
757 +       gchar* result = NULL;
758 +       const gchar* _tmp0_ = NULL;
759 +       gint _tmp1_ = 0;
760 +       gint _tmp2_ = 0;
761 +       const gchar* _tmp4_ = NULL;
762 +       gchar* _tmp5_ = NULL;
763 +       self = (RygelLMSAlbums*) base;
764 +       g_return_val_if_fail (filter != NULL, NULL);
765 +       _tmp0_ = filter;
766 +       _tmp1_ = strlen (_tmp0_);
767 +       _tmp2_ = _tmp1_;
768 +       if (_tmp2_ == 0) {
769 +               gchar* _tmp3_ = NULL;
770 +               _tmp3_ = g_strdup (RYGEL_LMS_ALBUMS_SQL_ALL);
771 +               result = _tmp3_;
772 +               return result;
773 +       }
774 +       _tmp4_ = filter;
775 +       _tmp5_ = g_strdup_printf (RYGEL_LMS_ALBUMS_SQL_ALL_WITH_FILTER_TEMPLATE, _tmp4_);
776 +       result = _tmp5_;
777 +       return result;
778 +}
779 +
780 +
781 +static gchar* rygel_lms_albums_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
782 +       RygelLMSAlbums * self;
783 +       gchar* result = NULL;
784 +       const gchar* _tmp0_ = NULL;
785 +       gint _tmp1_ = 0;
786 +       gint _tmp2_ = 0;
787 +       const gchar* _tmp4_ = NULL;
788 +       gchar* _tmp5_ = NULL;
789 +       self = (RygelLMSAlbums*) base;
790 +       g_return_val_if_fail (filter != NULL, NULL);
791 +       _tmp0_ = filter;
792 +       _tmp1_ = strlen (_tmp0_);
793 +       _tmp2_ = _tmp1_;
794 +       if (_tmp2_ == 0) {
795 +               gchar* _tmp3_ = NULL;
796 +               _tmp3_ = g_strdup (RYGEL_LMS_ALBUMS_SQL_COUNT);
797 +               result = _tmp3_;
798 +               return result;
799 +       }
800 +       _tmp4_ = filter;
801 +       _tmp5_ = g_strdup_printf (RYGEL_LMS_ALBUMS_SQL_COUNT_WITH_FILTER_TEMPLATE, _tmp4_);
802 +       result = _tmp5_;
803 +       return result;
804 +}
805 +
806 +
807 +static guint rygel_lms_albums_real_get_child_count_with_filter (RygelLMSCategoryContainer* base, const gchar* where_filter, GValueArray* args) {
808 +       RygelLMSAlbums * self;
809 +       guint result = 0U;
810 +       guint count = 0U;
811 +       const gchar* _tmp0_ = NULL;
812 +       GValueArray* _tmp1_ = NULL;
813 +       guint _tmp2_ = 0U;
814 +       gchar* filter = NULL;
815 +       gchar* _tmp3_ = NULL;
816 +       const gchar* _tmp4_ = NULL;
817 +       gint _tmp5_ = 0;
818 +       gint _tmp6_ = 0;
819 +       gchar* query = NULL;
820 +       const gchar* _tmp9_ = NULL;
821 +       gchar* _tmp10_ = NULL;
822 +       GError * _inner_error_ = NULL;
823 +       self = (RygelLMSAlbums*) base;
824 +       g_return_val_if_fail (where_filter != NULL, 0U);
825 +       g_return_val_if_fail (args != NULL, 0U);
826 +       _tmp0_ = where_filter;
827 +       _tmp1_ = args;
828 +       _tmp2_ = RYGEL_LMS_CATEGORY_CONTAINER_CLASS (rygel_lms_albums_parent_class)->get_child_count_with_filter (G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer), _tmp0_, _tmp1_);
829 +       count = _tmp2_;
830 +       _tmp3_ = g_strdup ("");
831 +       filter = _tmp3_;
832 +       _tmp4_ = where_filter;
833 +       _tmp5_ = strlen (_tmp4_);
834 +       _tmp6_ = _tmp5_;
835 +       if (_tmp6_ > 0) {
836 +               const gchar* _tmp7_ = NULL;
837 +               gchar* _tmp8_ = NULL;
838 +               _tmp7_ = where_filter;
839 +               _tmp8_ = g_strdup_printf ("AND %s", _tmp7_);
840 +               _g_free0 (filter);
841 +               filter = _tmp8_;
842 +       }
843 +       _tmp9_ = filter;
844 +       _tmp10_ = g_strdup_printf (RYGEL_LMS_ALBUMS_SQL_CHILD_COUNT_WITH_FILTER_TEMPLATE, _tmp9_);
845 +       query = _tmp10_;
846 +       {
847 +               sqlite3_stmt* stmt = NULL;
848 +               RygelLMSDatabase* _tmp11_ = NULL;
849 +               RygelLMSDatabase* _tmp12_ = NULL;
850 +               GValueArray* _tmp13_ = NULL;
851 +               GValue* _tmp14_ = NULL;
852 +               gint _tmp14__length1 = 0;
853 +               sqlite3_stmt* _tmp15_ = NULL;
854 +               gint _tmp16_ = 0;
855 +               _tmp11_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
856 +               _tmp12_ = _tmp11_;
857 +               _tmp13_ = args;
858 +               _tmp14_ = _tmp13_->values;
859 +               _tmp14__length1 = (gint) _tmp13_->n_values;
860 +               _tmp15_ = rygel_lms_database_prepare_and_init (_tmp12_, query, _tmp14_, _tmp14__length1, &_inner_error_);
861 +               stmt = _tmp15_;
862 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
863 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
864 +                               goto __catch8_rygel_lms_database_error;
865 +                       }
866 +                       _g_free0 (query);
867 +                       _g_free0 (filter);
868 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
869 +                       g_clear_error (&_inner_error_);
870 +                       return 0U;
871 +               }
872 +               _tmp16_ = sqlite3_step (stmt);
873 +               if (_tmp16_ == SQLITE_ROW) {
874 +                       guint _tmp17_ = 0U;
875 +                       gint _tmp18_ = 0;
876 +                       _tmp17_ = count;
877 +                       _tmp18_ = sqlite3_column_int (stmt, 0);
878 +                       count = _tmp17_ + _tmp18_;
879 +               }
880 +               _sqlite3_finalize0 (stmt);
881 +       }
882 +       goto __finally8;
883 +       __catch8_rygel_lms_database_error:
884 +       {
885 +               GError* e = NULL;
886 +               GError* _tmp19_ = NULL;
887 +               const gchar* _tmp20_ = NULL;
888 +               e = _inner_error_;
889 +               _inner_error_ = NULL;
890 +               _tmp19_ = e;
891 +               _tmp20_ = _tmp19_->message;
892 +               g_warning ("rygel-lms-albums.vala:116: Query failed: %s", _tmp20_);
893 +               _g_error_free0 (e);
894 +       }
895 +       __finally8:
896 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
897 +               _g_free0 (query);
898 +               _g_free0 (filter);
899 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
900 +               g_clear_error (&_inner_error_);
901 +               return 0U;
902 +       }
903 +       result = count;
904 +       _g_free0 (query);
905 +       _g_free0 (filter);
906 +       return result;
907 +}
908 +
909 +
910 +static RygelMediaObjects* rygel_lms_albums_real_get_children_with_filter (RygelLMSCategoryContainer* base, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count) {
911 +       RygelLMSAlbums * self;
912 +       RygelMediaObjects* result = NULL;
913 +       RygelMediaObjects* children = NULL;
914 +       const gchar* _tmp0_ = NULL;
915 +       GValueArray* _tmp1_ = NULL;
916 +       const gchar* _tmp2_ = NULL;
917 +       guint _tmp3_ = 0U;
918 +       guint _tmp4_ = 0U;
919 +       RygelMediaObjects* _tmp5_ = NULL;
920 +       gchar* filter = NULL;
921 +       gchar* _tmp6_ = NULL;
922 +       const gchar* _tmp7_ = NULL;
923 +       gint _tmp8_ = 0;
924 +       gint _tmp9_ = 0;
925 +       gchar* query = NULL;
926 +       const gchar* _tmp12_ = NULL;
927 +       gchar* _tmp13_ = NULL;
928 +       GError * _inner_error_ = NULL;
929 +       self = (RygelLMSAlbums*) base;
930 +       g_return_val_if_fail (where_filter != NULL, NULL);
931 +       g_return_val_if_fail (args != NULL, NULL);
932 +       g_return_val_if_fail (sort_criteria != NULL, NULL);
933 +       _tmp0_ = where_filter;
934 +       _tmp1_ = args;
935 +       _tmp2_ = sort_criteria;
936 +       _tmp3_ = offset;
937 +       _tmp4_ = max_count;
938 +       _tmp5_ = RYGEL_LMS_CATEGORY_CONTAINER_CLASS (rygel_lms_albums_parent_class)->get_children_with_filter (G_TYPE_CHECK_INSTANCE_CAST (self, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer), _tmp0_, _tmp1_, _tmp2_, _tmp3_, _tmp4_);
939 +       children = _tmp5_;
940 +       _tmp6_ = g_strdup ("");
941 +       filter = _tmp6_;
942 +       _tmp7_ = where_filter;
943 +       _tmp8_ = strlen (_tmp7_);
944 +       _tmp9_ = _tmp8_;
945 +       if (_tmp9_ > 0) {
946 +               const gchar* _tmp10_ = NULL;
947 +               gchar* _tmp11_ = NULL;
948 +               _tmp10_ = where_filter;
949 +               _tmp11_ = g_strdup_printf ("AND %s", _tmp10_);
950 +               _g_free0 (filter);
951 +               filter = _tmp11_;
952 +       }
953 +       _tmp12_ = filter;
954 +       _tmp13_ = g_strdup_printf (RYGEL_LMS_ALBUMS_SQL_CHILD_ALL_WITH_FILTER_TEMPLATE, _tmp12_);
955 +       query = _tmp13_;
956 +       {
957 +               sqlite3_stmt* stmt = NULL;
958 +               RygelLMSDatabase* _tmp14_ = NULL;
959 +               RygelLMSDatabase* _tmp15_ = NULL;
960 +               const gchar* _tmp16_ = NULL;
961 +               GValueArray* _tmp17_ = NULL;
962 +               GValue* _tmp18_ = NULL;
963 +               gint _tmp18__length1 = 0;
964 +               sqlite3_stmt* _tmp19_ = NULL;
965 +               _tmp14_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
966 +               _tmp15_ = _tmp14_;
967 +               _tmp16_ = query;
968 +               _tmp17_ = args;
969 +               _tmp18_ = _tmp17_->values;
970 +               _tmp18__length1 = (gint) _tmp17_->n_values;
971 +               _tmp19_ = rygel_lms_database_prepare_and_init (_tmp15_, _tmp16_, _tmp18_, _tmp18__length1, &_inner_error_);
972 +               stmt = _tmp19_;
973 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
974 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
975 +                               goto __catch9_rygel_lms_database_error;
976 +                       }
977 +                       _g_free0 (query);
978 +                       _g_free0 (filter);
979 +                       _g_object_unref0 (children);
980 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
981 +                       g_clear_error (&_inner_error_);
982 +                       return NULL;
983 +               }
984 +               while (TRUE) {
985 +                       gboolean _tmp20_ = FALSE;
986 +                       sqlite3_stmt* _tmp21_ = NULL;
987 +                       gboolean _tmp22_ = FALSE;
988 +                       gchar* album_id = NULL;
989 +                       sqlite3_stmt* _tmp23_ = NULL;
990 +                       const gchar* _tmp24_ = NULL;
991 +                       gchar* _tmp25_ = NULL;
992 +                       RygelLMSAlbum* album = NULL;
993 +                       const gchar* _tmp26_ = NULL;
994 +                       RygelLMSDatabase* _tmp27_ = NULL;
995 +                       RygelLMSDatabase* _tmp28_ = NULL;
996 +                       RygelLMSAlbum* _tmp29_ = NULL;
997 +                       RygelMediaObject* song = NULL;
998 +                       RygelLMSAlbum* _tmp30_ = NULL;
999 +                       sqlite3_stmt* _tmp31_ = NULL;
1000 +                       RygelMediaObject* _tmp32_ = NULL;
1001 +                       RygelMediaObject* _tmp33_ = NULL;
1002 +                       RygelMediaObject* _tmp34_ = NULL;
1003 +                       RygelMediaContainer* _tmp35_ = NULL;
1004 +                       RygelMediaContainer* _tmp36_ = NULL;
1005 +                       RygelMediaObjects* _tmp37_ = NULL;
1006 +                       RygelMediaObject* _tmp38_ = NULL;
1007 +                       _tmp21_ = stmt;
1008 +                       _tmp22_ = rygel_lms_database_get_children_step (_tmp21_, &_inner_error_);
1009 +                       _tmp20_ = _tmp22_;
1010 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
1011 +                               _sqlite3_finalize0 (stmt);
1012 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
1013 +                                       goto __catch9_rygel_lms_database_error;
1014 +                               }
1015 +                               _sqlite3_finalize0 (stmt);
1016 +                               _g_free0 (query);
1017 +                               _g_free0 (filter);
1018 +                               _g_object_unref0 (children);
1019 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1020 +                               g_clear_error (&_inner_error_);
1021 +                               return NULL;
1022 +                       }
1023 +                       if (!_tmp20_) {
1024 +                               break;
1025 +                       }
1026 +                       _tmp23_ = stmt;
1027 +                       _tmp24_ = sqlite3_column_text (_tmp23_, 13);
1028 +                       _tmp25_ = g_strdup (_tmp24_);
1029 +                       album_id = _tmp25_;
1030 +                       _tmp26_ = album_id;
1031 +                       _tmp27_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
1032 +                       _tmp28_ = _tmp27_;
1033 +                       _tmp29_ = rygel_lms_album_new (_tmp26_, (RygelMediaContainer*) self, "", _tmp28_);
1034 +                       album = _tmp29_;
1035 +                       _tmp30_ = album;
1036 +                       _tmp31_ = stmt;
1037 +                       _tmp32_ = rygel_lms_category_container_object_from_statement ((RygelLMSCategoryContainer*) _tmp30_, _tmp31_);
1038 +                       song = _tmp32_;
1039 +                       _tmp33_ = song;
1040 +                       _tmp34_ = song;
1041 +                       _tmp35_ = rygel_media_object_get_parent (_tmp34_);
1042 +                       _tmp36_ = _tmp35_;
1043 +                       rygel_media_object_set_parent_ref (_tmp33_, _tmp36_);
1044 +                       _tmp37_ = children;
1045 +                       _tmp38_ = song;
1046 +                       gee_abstract_collection_add ((GeeAbstractCollection*) _tmp37_, _tmp38_);
1047 +                       _g_object_unref0 (song);
1048 +                       _g_object_unref0 (album);
1049 +                       _g_free0 (album_id);
1050 +               }
1051 +               _sqlite3_finalize0 (stmt);
1052 +       }
1053 +       goto __finally9;
1054 +       __catch9_rygel_lms_database_error:
1055 +       {
1056 +               GError* e = NULL;
1057 +               GError* _tmp39_ = NULL;
1058 +               const gchar* _tmp40_ = NULL;
1059 +               e = _inner_error_;
1060 +               _inner_error_ = NULL;
1061 +               _tmp39_ = e;
1062 +               _tmp40_ = _tmp39_->message;
1063 +               g_warning ("rygel-lms-albums.vala:149: Query failed: %s", _tmp40_);
1064 +               _g_error_free0 (e);
1065 +       }
1066 +       __finally9:
1067 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
1068 +               _g_free0 (query);
1069 +               _g_free0 (filter);
1070 +               _g_object_unref0 (children);
1071 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
1072 +               g_clear_error (&_inner_error_);
1073 +               return NULL;
1074 +       }
1075 +       result = children;
1076 +       _g_free0 (query);
1077 +       _g_free0 (filter);
1078 +       return result;
1079 +}
1080 +
1081 +
1082 +static RygelMediaObject* rygel_lms_albums_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
1083 +       RygelLMSAlbums * self;
1084 +       RygelMediaObject* result = NULL;
1085 +       gchar* id = NULL;
1086 +       sqlite3_stmt* _tmp0_ = NULL;
1087 +       gint _tmp1_ = 0;
1088 +       gchar* _tmp2_ = NULL;
1089 +       RygelLMSAlbum* album = NULL;
1090 +       sqlite3_stmt* _tmp3_ = NULL;
1091 +       const gchar* _tmp4_ = NULL;
1092 +       RygelLMSDatabase* _tmp5_ = NULL;
1093 +       RygelLMSDatabase* _tmp6_ = NULL;
1094 +       RygelLMSAlbum* _tmp7_ = NULL;
1095 +       self = (RygelLMSAlbums*) base;
1096 +       g_return_val_if_fail (statement != NULL, NULL);
1097 +       _tmp0_ = statement;
1098 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
1099 +       _tmp2_ = g_strdup_printf ("%d", _tmp1_);
1100 +       id = _tmp2_;
1101 +       _tmp3_ = statement;
1102 +       _tmp4_ = sqlite3_column_text (_tmp3_, 1);
1103 +       _tmp5_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
1104 +       _tmp6_ = _tmp5_;
1105 +       _tmp7_ = rygel_lms_album_new (id, (RygelMediaContainer*) self, _tmp4_, _tmp6_);
1106 +       album = _tmp7_;
1107 +       result = (RygelMediaObject*) album;
1108 +       _g_free0 (id);
1109 +       return result;
1110 +}
1111 +
1112 +
1113 +RygelLMSAlbums* rygel_lms_albums_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1114 +       RygelLMSAlbums * self = NULL;
1115 +       RygelMediaContainer* _tmp0_ = NULL;
1116 +       const gchar* _tmp1_ = NULL;
1117 +       RygelLMSDatabase* _tmp2_ = NULL;
1118 +       g_return_val_if_fail (parent != NULL, NULL);
1119 +       g_return_val_if_fail (lms_db != NULL, NULL);
1120 +       _tmp0_ = parent;
1121 +       _tmp1_ = _ ("Albums");
1122 +       _tmp2_ = lms_db;
1123 +       self = (RygelLMSAlbums*) rygel_lms_category_container_construct (object_type, "albums", _tmp0_, _tmp1_, _tmp2_, RYGEL_LMS_ALBUMS_SQL_ALL, RYGEL_LMS_ALBUMS_SQL_FIND_OBJECT, RYGEL_LMS_ALBUMS_SQL_COUNT, NULL, NULL);
1124 +       return self;
1125 +}
1126 +
1127 +
1128 +RygelLMSAlbums* rygel_lms_albums_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1129 +       return rygel_lms_albums_construct (RYGEL_LMS_TYPE_ALBUMS, parent, lms_db);
1130 +}
1131 +
1132 +
1133 +static void rygel_lms_albums_class_init (RygelLMSAlbumsClass * klass) {
1134 +       rygel_lms_albums_parent_class = g_type_class_peek_parent (klass);
1135 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_all_with_filter = rygel_lms_albums_real_get_sql_all_with_filter;
1136 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_count_with_filter = rygel_lms_albums_real_get_sql_count_with_filter;
1137 +       ((RygelLMSCategoryContainerClass *) klass)->get_child_count_with_filter = rygel_lms_albums_real_get_child_count_with_filter;
1138 +       ((RygelLMSCategoryContainerClass *) klass)->get_children_with_filter = rygel_lms_albums_real_get_children_with_filter;
1139 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_albums_real_object_from_statement;
1140 +}
1141 +
1142 +
1143 +static void rygel_lms_albums_instance_init (RygelLMSAlbums * self) {
1144 +}
1145 +
1146 +
1147 +GType rygel_lms_albums_get_type (void) {
1148 +       static volatile gsize rygel_lms_albums_type_id__volatile = 0;
1149 +       if (g_once_init_enter (&rygel_lms_albums_type_id__volatile)) {
1150 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSAlbumsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_albums_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSAlbums), 0, (GInstanceInitFunc) rygel_lms_albums_instance_init, NULL };
1151 +               GType rygel_lms_albums_type_id;
1152 +               rygel_lms_albums_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSAlbums", &g_define_type_info, 0);
1153 +               g_once_init_leave (&rygel_lms_albums_type_id__volatile, rygel_lms_albums_type_id);
1154 +       }
1155 +       return rygel_lms_albums_type_id__volatile;
1156 +}
1157 +
1158 +
1159 +
1160 diff --git a/src/plugins/lms/rygel-lms-all-images.c b/src/plugins/lms/rygel-lms-all-images.c
1161 new file mode 100644
1162 index 0000000..33fb8c1
1163 --- /dev/null
1164 +++ b/src/plugins/lms/rygel-lms-all-images.c
1165 @@ -0,0 +1,305 @@
1166 +/* rygel-lms-all-images.c generated by valac 0.28.0, the Vala compiler
1167 + * generated from rygel-lms-all-images.vala, do not modify */
1168 +
1169 +/*
1170 + * Copyright (C) 2013 Intel Corporation.
1171 + *
1172 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
1173 + *
1174 + * This file is part of Rygel.
1175 + *
1176 + * Rygel is free software; you can redistribute it and/or modify
1177 + * it under the terms of the GNU Lesser General Public License as published by
1178 + * the Free Software Foundation; either version 2 of the License, or
1179 + * (at your option) any later version.
1180 + *
1181 + * Rygel is distributed in the hope that it will be useful,
1182 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1183 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1184 + * GNU Lesser General Public License for more details.
1185 + *
1186 + * You should have received a copy of the GNU Lesser General Public License
1187 + * along with this program; if not, write to the Free Software Foundation,
1188 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1189 + */
1190 +
1191 +#include <glib.h>
1192 +#include <glib-object.h>
1193 +#include <rygel-server.h>
1194 +#include <sqlite3.h>
1195 +#include <stdlib.h>
1196 +#include <string.h>
1197 +#include <gio/gio.h>
1198 +#include <glib/gi18n-lib.h>
1199 +
1200 +
1201 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
1202 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
1203 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1204 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1205 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1206 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1207 +
1208 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
1209 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
1210 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
1211 +
1212 +#define RYGEL_LMS_TYPE_ALL_IMAGES (rygel_lms_all_images_get_type ())
1213 +#define RYGEL_LMS_ALL_IMAGES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImages))
1214 +#define RYGEL_LMS_ALL_IMAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImagesClass))
1215 +#define RYGEL_LMS_IS_ALL_IMAGES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_IMAGES))
1216 +#define RYGEL_LMS_IS_ALL_IMAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_IMAGES))
1217 +#define RYGEL_LMS_ALL_IMAGES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImagesClass))
1218 +
1219 +typedef struct _RygelLMSAllImages RygelLMSAllImages;
1220 +typedef struct _RygelLMSAllImagesClass RygelLMSAllImagesClass;
1221 +typedef struct _RygelLMSAllImagesPrivate RygelLMSAllImagesPrivate;
1222 +#define _g_free0(var) (var = (g_free (var), NULL))
1223 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
1224 +
1225 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
1226 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
1227 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1228 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
1229 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
1230 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1231 +
1232 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
1233 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
1234 +
1235 +struct _RygelLMSCategoryContainer {
1236 +       RygelMediaContainer parent_instance;
1237 +       RygelLMSCategoryContainerPrivate * priv;
1238 +       sqlite3_stmt* stmt_all;
1239 +       sqlite3_stmt* stmt_find_object;
1240 +       sqlite3_stmt* stmt_added;
1241 +       sqlite3_stmt* stmt_removed;
1242 +       gchar* child_prefix;
1243 +       gchar* ref_prefix;
1244 +};
1245 +
1246 +struct _RygelLMSCategoryContainerClass {
1247 +       RygelMediaContainerClass parent_class;
1248 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
1249 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1250 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1251 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
1252 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
1253 +};
1254 +
1255 +struct _RygelLMSAllImages {
1256 +       RygelLMSCategoryContainer parent_instance;
1257 +       RygelLMSAllImagesPrivate * priv;
1258 +};
1259 +
1260 +struct _RygelLMSAllImagesClass {
1261 +       RygelLMSCategoryContainerClass parent_class;
1262 +};
1263 +
1264 +
1265 +static gpointer rygel_lms_all_images_parent_class = NULL;
1266 +
1267 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
1268 +GType rygel_lms_all_images_get_type (void) G_GNUC_CONST;
1269 +enum  {
1270 +       RYGEL_LMS_ALL_IMAGES_DUMMY_PROPERTY
1271 +};
1272 +#define RYGEL_LMS_ALL_IMAGES_SQL_ALL "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
1273 +"_profile, dlna_mime " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id " "LIMIT ? OFFSET ?;"
1274 +#define RYGEL_LMS_ALL_IMAGES_SQL_COUNT "SELECT count(images.id) " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id;"
1275 +#define RYGEL_LMS_ALL_IMAGES_SQL_FIND_OBJECT "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
1276 +"_profile, dlna_mime " "FROM images, files " "WHERE dtime = 0 AND files.id = ? AND images.id = files.id;"
1277 +#define RYGEL_LMS_ALL_IMAGES_SQL_ADDED "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
1278 +"_profile, dlna_mime " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id " "AND update_id > ? AND update_id <= ?;"
1279 +#define RYGEL_LMS_ALL_IMAGES_SQL_REMOVED "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
1280 +"_profile, dlna_mime " "FROM images, files " "WHERE dtime <> 0 AND images.id = files.id " "AND update_id > ? AND update_id <= ?;"
1281 +static RygelMediaObject* rygel_lms_all_images_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
1282 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
1283 +gpointer rygel_lms_database_ref (gpointer instance);
1284 +void rygel_lms_database_unref (gpointer instance);
1285 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
1286 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
1287 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
1288 +gpointer rygel_lms_value_get_database (const GValue* value);
1289 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
1290 +RygelLMSAllImages* rygel_lms_all_images_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
1291 +RygelLMSAllImages* rygel_lms_all_images_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
1292 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
1293 +
1294 +
1295 +static RygelMediaObject* rygel_lms_all_images_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
1296 +       RygelLMSAllImages * self;
1297 +       RygelMediaObject* result = NULL;
1298 +       gint id = 0;
1299 +       sqlite3_stmt* _tmp0_ = NULL;
1300 +       gint _tmp1_ = 0;
1301 +       gchar* path = NULL;
1302 +       sqlite3_stmt* _tmp2_ = NULL;
1303 +       const gchar* _tmp3_ = NULL;
1304 +       gchar* _tmp4_ = NULL;
1305 +       gchar* mime_type = NULL;
1306 +       sqlite3_stmt* _tmp5_ = NULL;
1307 +       const gchar* _tmp6_ = NULL;
1308 +       gchar* _tmp7_ = NULL;
1309 +       gboolean _tmp8_ = FALSE;
1310 +       const gchar* _tmp9_ = NULL;
1311 +       gchar* title = NULL;
1312 +       sqlite3_stmt* _tmp15_ = NULL;
1313 +       const gchar* _tmp16_ = NULL;
1314 +       gchar* _tmp17_ = NULL;
1315 +       RygelImageItem* image = NULL;
1316 +       gint _tmp18_ = 0;
1317 +       gchar* _tmp19_ = NULL;
1318 +       gchar* _tmp20_ = NULL;
1319 +       RygelImageItem* _tmp21_ = NULL;
1320 +       RygelImageItem* _tmp22_ = NULL;
1321 +       sqlite3_stmt* _tmp23_ = NULL;
1322 +       const gchar* _tmp24_ = NULL;
1323 +       GTimeVal tv = {0};
1324 +       sqlite3_stmt* _tmp25_ = NULL;
1325 +       gint _tmp26_ = 0;
1326 +       GTimeVal _tmp27_ = {0};
1327 +       gchar* _tmp28_ = NULL;
1328 +       gchar* _tmp29_ = NULL;
1329 +       sqlite3_stmt* _tmp30_ = NULL;
1330 +       gint _tmp31_ = 0;
1331 +       sqlite3_stmt* _tmp32_ = NULL;
1332 +       gint _tmp33_ = 0;
1333 +       sqlite3_stmt* _tmp34_ = NULL;
1334 +       gint _tmp35_ = 0;
1335 +       const gchar* _tmp36_ = NULL;
1336 +       sqlite3_stmt* _tmp37_ = NULL;
1337 +       const gchar* _tmp38_ = NULL;
1338 +       GFile* file = NULL;
1339 +       const gchar* _tmp39_ = NULL;
1340 +       GFile* _tmp40_ = NULL;
1341 +       gchar* _tmp41_ = NULL;
1342 +       gchar* _tmp42_ = NULL;
1343 +       self = (RygelLMSAllImages*) base;
1344 +       g_return_val_if_fail (statement != NULL, NULL);
1345 +       _tmp0_ = statement;
1346 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
1347 +       id = _tmp1_;
1348 +       _tmp2_ = statement;
1349 +       _tmp3_ = sqlite3_column_text (_tmp2_, 6);
1350 +       _tmp4_ = g_strdup (_tmp3_);
1351 +       path = _tmp4_;
1352 +       _tmp5_ = statement;
1353 +       _tmp6_ = sqlite3_column_text (_tmp5_, 9);
1354 +       _tmp7_ = g_strdup (_tmp6_);
1355 +       mime_type = _tmp7_;
1356 +       _tmp9_ = mime_type;
1357 +       if (_tmp9_ == NULL) {
1358 +               _tmp8_ = TRUE;
1359 +       } else {
1360 +               const gchar* _tmp10_ = NULL;
1361 +               gint _tmp11_ = 0;
1362 +               gint _tmp12_ = 0;
1363 +               _tmp10_ = mime_type;
1364 +               _tmp11_ = strlen (_tmp10_);
1365 +               _tmp12_ = _tmp11_;
1366 +               _tmp8_ = _tmp12_ == 0;
1367 +       }
1368 +       if (_tmp8_) {
1369 +               gint _tmp13_ = 0;
1370 +               const gchar* _tmp14_ = NULL;
1371 +               _tmp13_ = id;
1372 +               _tmp14_ = path;
1373 +               g_debug ("rygel-lms-all-images.vala:62: Image item %d (%s) has no MIME type", _tmp13_, _tmp14_);
1374 +       }
1375 +       _tmp15_ = statement;
1376 +       _tmp16_ = sqlite3_column_text (_tmp15_, 1);
1377 +       _tmp17_ = g_strdup (_tmp16_);
1378 +       title = _tmp17_;
1379 +       _tmp18_ = id;
1380 +       _tmp19_ = rygel_lms_category_container_build_child_id ((RygelLMSCategoryContainer*) self, _tmp18_);
1381 +       _tmp20_ = _tmp19_;
1382 +       _tmp21_ = rygel_image_item_new (_tmp20_, (RygelMediaContainer*) self, title, RYGEL_IMAGE_ITEM_UPNP_CLASS);
1383 +       _tmp22_ = _tmp21_;
1384 +       _g_free0 (_tmp20_);
1385 +       image = _tmp22_;
1386 +       _tmp23_ = statement;
1387 +       _tmp24_ = sqlite3_column_text (_tmp23_, 2);
1388 +       rygel_media_object_set_creator ((RygelMediaObject*) image, _tmp24_);
1389 +       _tmp25_ = statement;
1390 +       _tmp26_ = sqlite3_column_int (_tmp25_, 3);
1391 +       _tmp27_.tv_sec = (glong) _tmp26_;
1392 +       _tmp27_.tv_usec = (glong) 0;
1393 +       tv = _tmp27_;
1394 +       _tmp28_ = g_time_val_to_iso8601 (&tv);
1395 +       _tmp29_ = _tmp28_;
1396 +       rygel_media_object_set_date ((RygelMediaObject*) image, _tmp29_);
1397 +       _g_free0 (_tmp29_);
1398 +       _tmp30_ = statement;
1399 +       _tmp31_ = sqlite3_column_int (_tmp30_, 4);
1400 +       rygel_visual_item_set_width ((RygelVisualItem*) image, _tmp31_);
1401 +       _tmp32_ = statement;
1402 +       _tmp33_ = sqlite3_column_int (_tmp32_, 5);
1403 +       rygel_visual_item_set_height ((RygelVisualItem*) image, _tmp33_);
1404 +       _tmp34_ = statement;
1405 +       _tmp35_ = sqlite3_column_int (_tmp34_, 7);
1406 +       rygel_media_file_item_set_size ((RygelMediaFileItem*) image, (gint64) _tmp35_);
1407 +       _tmp36_ = mime_type;
1408 +       rygel_media_file_item_set_mime_type ((RygelMediaFileItem*) image, _tmp36_);
1409 +       _tmp37_ = statement;
1410 +       _tmp38_ = sqlite3_column_text (_tmp37_, 8);
1411 +       rygel_media_file_item_set_dlna_profile ((RygelMediaFileItem*) image, _tmp38_);
1412 +       _tmp39_ = path;
1413 +       _tmp40_ = g_file_new_for_path (_tmp39_);
1414 +       file = _tmp40_;
1415 +       _tmp41_ = g_file_get_uri (file);
1416 +       _tmp42_ = _tmp41_;
1417 +       rygel_media_object_add_uri ((RygelMediaObject*) image, _tmp42_);
1418 +       _g_free0 (_tmp42_);
1419 +       result = (RygelMediaObject*) image;
1420 +       _g_object_unref0 (file);
1421 +       _g_free0 (title);
1422 +       _g_free0 (mime_type);
1423 +       _g_free0 (path);
1424 +       return result;
1425 +}
1426 +
1427 +
1428 +RygelLMSAllImages* rygel_lms_all_images_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1429 +       RygelLMSAllImages * self = NULL;
1430 +       RygelMediaContainer* _tmp0_ = NULL;
1431 +       const gchar* _tmp1_ = NULL;
1432 +       RygelLMSDatabase* _tmp2_ = NULL;
1433 +       g_return_val_if_fail (parent != NULL, NULL);
1434 +       g_return_val_if_fail (lms_db != NULL, NULL);
1435 +       _tmp0_ = parent;
1436 +       _tmp1_ = _ ("All");
1437 +       _tmp2_ = lms_db;
1438 +       self = (RygelLMSAllImages*) rygel_lms_category_container_construct (object_type, "all", _tmp0_, _tmp1_, _tmp2_, RYGEL_LMS_ALL_IMAGES_SQL_ALL, RYGEL_LMS_ALL_IMAGES_SQL_FIND_OBJECT, RYGEL_LMS_ALL_IMAGES_SQL_COUNT, RYGEL_LMS_ALL_IMAGES_SQL_ADDED, RYGEL_LMS_ALL_IMAGES_SQL_REMOVED);
1439 +       return self;
1440 +}
1441 +
1442 +
1443 +RygelLMSAllImages* rygel_lms_all_images_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1444 +       return rygel_lms_all_images_construct (RYGEL_LMS_TYPE_ALL_IMAGES, parent, lms_db);
1445 +}
1446 +
1447 +
1448 +static void rygel_lms_all_images_class_init (RygelLMSAllImagesClass * klass) {
1449 +       rygel_lms_all_images_parent_class = g_type_class_peek_parent (klass);
1450 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_all_images_real_object_from_statement;
1451 +}
1452 +
1453 +
1454 +static void rygel_lms_all_images_instance_init (RygelLMSAllImages * self) {
1455 +}
1456 +
1457 +
1458 +GType rygel_lms_all_images_get_type (void) {
1459 +       static volatile gsize rygel_lms_all_images_type_id__volatile = 0;
1460 +       if (g_once_init_enter (&rygel_lms_all_images_type_id__volatile)) {
1461 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSAllImagesClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_all_images_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSAllImages), 0, (GInstanceInitFunc) rygel_lms_all_images_instance_init, NULL };
1462 +               GType rygel_lms_all_images_type_id;
1463 +               rygel_lms_all_images_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSAllImages", &g_define_type_info, 0);
1464 +               g_once_init_leave (&rygel_lms_all_images_type_id__volatile, rygel_lms_all_images_type_id);
1465 +       }
1466 +       return rygel_lms_all_images_type_id__volatile;
1467 +}
1468 +
1469 +
1470 +
1471 diff --git a/src/plugins/lms/rygel-lms-all-music.c b/src/plugins/lms/rygel-lms-all-music.c
1472 new file mode 100644
1473 index 0000000..ee6118f
1474 --- /dev/null
1475 +++ b/src/plugins/lms/rygel-lms-all-music.c
1476 @@ -0,0 +1,417 @@
1477 +/* rygel-lms-all-music.c generated by valac 0.28.0, the Vala compiler
1478 + * generated from rygel-lms-all-music.vala, do not modify */
1479 +
1480 +/*
1481 + * Copyright (C) 2013 Intel Corporation.
1482 + *
1483 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
1484 + *
1485 + * This file is part of Rygel.
1486 + *
1487 + * Rygel is free software; you can redistribute it and/or modify
1488 + * it under the terms of the GNU Lesser General Public License as published by
1489 + * the Free Software Foundation; either version 2 of the License, or
1490 + * (at your option) any later version.
1491 + *
1492 + * Rygel is distributed in the hope that it will be useful,
1493 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1494 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1495 + * GNU Lesser General Public License for more details.
1496 + *
1497 + * You should have received a copy of the GNU Lesser General Public License
1498 + * along with this program; if not, write to the Free Software Foundation,
1499 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1500 + */
1501 +
1502 +#include <glib.h>
1503 +#include <glib-object.h>
1504 +#include <rygel-server.h>
1505 +#include <sqlite3.h>
1506 +#include <stdlib.h>
1507 +#include <string.h>
1508 +#include <gio/gio.h>
1509 +#include <glib/gi18n-lib.h>
1510 +
1511 +
1512 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
1513 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
1514 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1515 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1516 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1517 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1518 +
1519 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
1520 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
1521 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
1522 +
1523 +#define RYGEL_LMS_TYPE_ALL_MUSIC (rygel_lms_all_music_get_type ())
1524 +#define RYGEL_LMS_ALL_MUSIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusic))
1525 +#define RYGEL_LMS_ALL_MUSIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusicClass))
1526 +#define RYGEL_LMS_IS_ALL_MUSIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_MUSIC))
1527 +#define RYGEL_LMS_IS_ALL_MUSIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_MUSIC))
1528 +#define RYGEL_LMS_ALL_MUSIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusicClass))
1529 +
1530 +typedef struct _RygelLMSAllMusic RygelLMSAllMusic;
1531 +typedef struct _RygelLMSAllMusicClass RygelLMSAllMusicClass;
1532 +typedef struct _RygelLMSAllMusicPrivate RygelLMSAllMusicPrivate;
1533 +#define _g_free0(var) (var = (g_free (var), NULL))
1534 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
1535 +
1536 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
1537 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
1538 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1539 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
1540 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
1541 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1542 +
1543 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
1544 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
1545 +
1546 +struct _RygelLMSCategoryContainer {
1547 +       RygelMediaContainer parent_instance;
1548 +       RygelLMSCategoryContainerPrivate * priv;
1549 +       sqlite3_stmt* stmt_all;
1550 +       sqlite3_stmt* stmt_find_object;
1551 +       sqlite3_stmt* stmt_added;
1552 +       sqlite3_stmt* stmt_removed;
1553 +       gchar* child_prefix;
1554 +       gchar* ref_prefix;
1555 +};
1556 +
1557 +struct _RygelLMSCategoryContainerClass {
1558 +       RygelMediaContainerClass parent_class;
1559 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
1560 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1561 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1562 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
1563 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
1564 +};
1565 +
1566 +struct _RygelLMSAllMusic {
1567 +       RygelLMSCategoryContainer parent_instance;
1568 +       RygelLMSAllMusicPrivate * priv;
1569 +};
1570 +
1571 +struct _RygelLMSAllMusicClass {
1572 +       RygelLMSCategoryContainerClass parent_class;
1573 +};
1574 +
1575 +
1576 +static gpointer rygel_lms_all_music_parent_class = NULL;
1577 +
1578 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
1579 +GType rygel_lms_all_music_get_type (void) G_GNUC_CONST;
1580 +enum  {
1581 +       RYGEL_LMS_ALL_MUSIC_DUMMY_PROPERTY
1582 +};
1583 +#define RYGEL_LMS_ALL_MUSIC_SQL_ALL_TEMPLATE "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
1584 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
1585 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name, " "files.mtime, " "audio_genres.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "LEFT JOIN audio_genres " "ON audios.genre_id = audio_genres.id " "WHERE dtime = 0 AND audios.id = files.id %s " "LIMIT ? OFFSET ?;"
1586 +#define RYGEL_LMS_ALL_MUSIC_SQL_COUNT "SELECT COUNT(audios.id) " "FROM audios, files " "WHERE dtime = 0 AND audios.id = files.id;"
1587 +#define RYGEL_LMS_ALL_MUSIC_SQL_COUNT_WITH_FILTER_TEMPLATE "SELECT COUNT(audios.id), audios.title as title, " "audio_artists.name as artist " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "WHERE dtime = 0 AND audios.id = files.id %s;"
1588 +#define RYGEL_LMS_ALL_MUSIC_SQL_FIND_OBJECT "SELECT files.id, files.path, files.size, " "audios.title, audios.trackno, audios.length, audios.channels, audios.s" \
1589 +"ampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " "audio_artists.name, " "audio_albums.name, " "files.mtime, " "audio_genres.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "LEFT JOIN audio_genres " "ON audios.genre_id = audio_genres.id " "WHERE dtime = 0 AND files.id = ? AND audios.id = files.id;"
1590 +#define RYGEL_LMS_ALL_MUSIC_SQL_ADDED "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
1591 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
1592 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name, " "files.mtime, " "audio_genres.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "LEFT JOIN audio_genres " "ON audios.genre_id = audio_genres.id " "WHERE dtime = 0 AND audios.id = files.id " "AND update_id > ? AND update_id <= ?;"
1593 +#define RYGEL_LMS_ALL_MUSIC_SQL_REMOVED "SELECT files.id, files.path, files.size, " "audios.title as title, audios.trackno, audios.length, audios.channels," \
1594 +" audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dln" \
1595 +"a_mime, " "audio_artists.name as artist, " "audio_albums.name, " "files.mtime, " "audio_genres.name " "FROM audios, files " "LEFT JOIN audio_artists " "ON audios.artist_id = audio_artists.id " "LEFT JOIN audio_albums " "ON audios.album_id = audio_albums.id " "LEFT JOIN audio_genres " "ON audios.genre_id = audio_genres.id " "WHERE dtime <> 0 AND audios.id = files.id " "AND update_id > ? AND update_id <= ?;"
1596 +static gchar* rygel_lms_all_music_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
1597 +const gchar* rygel_lms_category_container_get_sql_all (RygelLMSCategoryContainer* self);
1598 +static gchar* rygel_lms_all_music_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter);
1599 +const gchar* rygel_lms_category_container_get_sql_count (RygelLMSCategoryContainer* self);
1600 +static RygelMediaObject* rygel_lms_all_music_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
1601 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
1602 +gpointer rygel_lms_database_ref (gpointer instance);
1603 +void rygel_lms_database_unref (gpointer instance);
1604 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
1605 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
1606 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
1607 +gpointer rygel_lms_value_get_database (const GValue* value);
1608 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
1609 +RygelLMSAllMusic* rygel_lms_all_music_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
1610 +RygelLMSAllMusic* rygel_lms_all_music_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
1611 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
1612 +
1613 +
1614 +static gchar* rygel_lms_all_music_real_get_sql_all_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
1615 +       RygelLMSAllMusic * self;
1616 +       gchar* result = NULL;
1617 +       const gchar* _tmp0_ = NULL;
1618 +       gint _tmp1_ = 0;
1619 +       gint _tmp2_ = 0;
1620 +       gchar* filter_str = NULL;
1621 +       const gchar* _tmp6_ = NULL;
1622 +       gchar* _tmp7_ = NULL;
1623 +       const gchar* _tmp8_ = NULL;
1624 +       gchar* _tmp9_ = NULL;
1625 +       self = (RygelLMSAllMusic*) base;
1626 +       g_return_val_if_fail (filter != NULL, NULL);
1627 +       _tmp0_ = filter;
1628 +       _tmp1_ = strlen (_tmp0_);
1629 +       _tmp2_ = _tmp1_;
1630 +       if (_tmp2_ == 0) {
1631 +               const gchar* _tmp3_ = NULL;
1632 +               const gchar* _tmp4_ = NULL;
1633 +               gchar* _tmp5_ = NULL;
1634 +               _tmp3_ = rygel_lms_category_container_get_sql_all ((RygelLMSCategoryContainer*) self);
1635 +               _tmp4_ = _tmp3_;
1636 +               _tmp5_ = g_strdup (_tmp4_);
1637 +               result = _tmp5_;
1638 +               return result;
1639 +       }
1640 +       _tmp6_ = filter;
1641 +       _tmp7_ = g_strdup_printf ("AND %s", _tmp6_);
1642 +       filter_str = _tmp7_;
1643 +       _tmp8_ = filter_str;
1644 +       _tmp9_ = g_strdup_printf (RYGEL_LMS_ALL_MUSIC_SQL_ALL_TEMPLATE, _tmp8_);
1645 +       result = _tmp9_;
1646 +       _g_free0 (filter_str);
1647 +       return result;
1648 +}
1649 +
1650 +
1651 +static gchar* rygel_lms_all_music_real_get_sql_count_with_filter (RygelLMSCategoryContainer* base, const gchar* filter) {
1652 +       RygelLMSAllMusic * self;
1653 +       gchar* result = NULL;
1654 +       const gchar* _tmp0_ = NULL;
1655 +       gint _tmp1_ = 0;
1656 +       gint _tmp2_ = 0;
1657 +       gchar* filter_str = NULL;
1658 +       const gchar* _tmp6_ = NULL;
1659 +       gchar* _tmp7_ = NULL;
1660 +       const gchar* _tmp8_ = NULL;
1661 +       gchar* _tmp9_ = NULL;
1662 +       self = (RygelLMSAllMusic*) base;
1663 +       g_return_val_if_fail (filter != NULL, NULL);
1664 +       _tmp0_ = filter;
1665 +       _tmp1_ = strlen (_tmp0_);
1666 +       _tmp2_ = _tmp1_;
1667 +       if (_tmp2_ == 0) {
1668 +               const gchar* _tmp3_ = NULL;
1669 +               const gchar* _tmp4_ = NULL;
1670 +               gchar* _tmp5_ = NULL;
1671 +               _tmp3_ = rygel_lms_category_container_get_sql_count ((RygelLMSCategoryContainer*) self);
1672 +               _tmp4_ = _tmp3_;
1673 +               _tmp5_ = g_strdup (_tmp4_);
1674 +               result = _tmp5_;
1675 +               return result;
1676 +       }
1677 +       _tmp6_ = filter;
1678 +       _tmp7_ = g_strdup_printf ("AND %s", _tmp6_);
1679 +       filter_str = _tmp7_;
1680 +       _tmp8_ = filter_str;
1681 +       _tmp9_ = g_strdup_printf (RYGEL_LMS_ALL_MUSIC_SQL_COUNT_WITH_FILTER_TEMPLATE, _tmp8_);
1682 +       result = _tmp9_;
1683 +       _g_free0 (filter_str);
1684 +       return result;
1685 +}
1686 +
1687 +
1688 +static RygelMediaObject* rygel_lms_all_music_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
1689 +       RygelLMSAllMusic * self;
1690 +       RygelMediaObject* result = NULL;
1691 +       gint id = 0;
1692 +       sqlite3_stmt* _tmp0_ = NULL;
1693 +       gint _tmp1_ = 0;
1694 +       gchar* path = NULL;
1695 +       sqlite3_stmt* _tmp2_ = NULL;
1696 +       const gchar* _tmp3_ = NULL;
1697 +       gchar* _tmp4_ = NULL;
1698 +       gchar* mime_type = NULL;
1699 +       sqlite3_stmt* _tmp5_ = NULL;
1700 +       const gchar* _tmp6_ = NULL;
1701 +       gchar* _tmp7_ = NULL;
1702 +       gboolean _tmp8_ = FALSE;
1703 +       const gchar* _tmp9_ = NULL;
1704 +       gchar* title = NULL;
1705 +       sqlite3_stmt* _tmp15_ = NULL;
1706 +       const gchar* _tmp16_ = NULL;
1707 +       gchar* _tmp17_ = NULL;
1708 +       gchar* song_id = NULL;
1709 +       gint _tmp18_ = 0;
1710 +       gchar* _tmp19_ = NULL;
1711 +       RygelMusicItem* song = NULL;
1712 +       RygelMusicItem* _tmp20_ = NULL;
1713 +       sqlite3_stmt* _tmp21_ = NULL;
1714 +       gint _tmp22_ = 0;
1715 +       sqlite3_stmt* _tmp23_ = NULL;
1716 +       gint _tmp24_ = 0;
1717 +       sqlite3_stmt* _tmp25_ = NULL;
1718 +       gint _tmp26_ = 0;
1719 +       sqlite3_stmt* _tmp27_ = NULL;
1720 +       gint _tmp28_ = 0;
1721 +       sqlite3_stmt* _tmp29_ = NULL;
1722 +       gint _tmp30_ = 0;
1723 +       sqlite3_stmt* _tmp31_ = NULL;
1724 +       gint _tmp32_ = 0;
1725 +       sqlite3_stmt* _tmp33_ = NULL;
1726 +       const gchar* _tmp34_ = NULL;
1727 +       const gchar* _tmp35_ = NULL;
1728 +       sqlite3_stmt* _tmp36_ = NULL;
1729 +       const gchar* _tmp37_ = NULL;
1730 +       sqlite3_stmt* _tmp38_ = NULL;
1731 +       const gchar* _tmp39_ = NULL;
1732 +       GTimeVal tv = {0};
1733 +       sqlite3_stmt* _tmp40_ = NULL;
1734 +       gint _tmp41_ = 0;
1735 +       GTimeVal _tmp42_ = {0};
1736 +       gchar* _tmp43_ = NULL;
1737 +       gchar* _tmp44_ = NULL;
1738 +       sqlite3_stmt* _tmp45_ = NULL;
1739 +       const gchar* _tmp46_ = NULL;
1740 +       GFile* file = NULL;
1741 +       const gchar* _tmp47_ = NULL;
1742 +       GFile* _tmp48_ = NULL;
1743 +       gchar* _tmp49_ = NULL;
1744 +       gchar* _tmp50_ = NULL;
1745 +       self = (RygelLMSAllMusic*) base;
1746 +       g_return_val_if_fail (statement != NULL, NULL);
1747 +       _tmp0_ = statement;
1748 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
1749 +       id = _tmp1_;
1750 +       _tmp2_ = statement;
1751 +       _tmp3_ = sqlite3_column_text (_tmp2_, 1);
1752 +       _tmp4_ = g_strdup (_tmp3_);
1753 +       path = _tmp4_;
1754 +       _tmp5_ = statement;
1755 +       _tmp6_ = sqlite3_column_text (_tmp5_, 10);
1756 +       _tmp7_ = g_strdup (_tmp6_);
1757 +       mime_type = _tmp7_;
1758 +       _tmp9_ = mime_type;
1759 +       if (_tmp9_ == NULL) {
1760 +               _tmp8_ = TRUE;
1761 +       } else {
1762 +               const gchar* _tmp10_ = NULL;
1763 +               gint _tmp11_ = 0;
1764 +               gint _tmp12_ = 0;
1765 +               _tmp10_ = mime_type;
1766 +               _tmp11_ = strlen (_tmp10_);
1767 +               _tmp12_ = _tmp11_;
1768 +               _tmp8_ = _tmp12_ == 0;
1769 +       }
1770 +       if (_tmp8_) {
1771 +               gint _tmp13_ = 0;
1772 +               const gchar* _tmp14_ = NULL;
1773 +               _tmp13_ = id;
1774 +               _tmp14_ = path;
1775 +               g_debug ("rygel-lms-all-music.vala:130: Music item %d (%s) has no MIME type", _tmp13_, _tmp14_);
1776 +       }
1777 +       _tmp15_ = statement;
1778 +       _tmp16_ = sqlite3_column_text (_tmp15_, 3);
1779 +       _tmp17_ = g_strdup (_tmp16_);
1780 +       title = _tmp17_;
1781 +       _tmp18_ = id;
1782 +       _tmp19_ = rygel_lms_category_container_build_child_id ((RygelLMSCategoryContainer*) self, _tmp18_);
1783 +       song_id = _tmp19_;
1784 +       _tmp20_ = rygel_music_item_new (song_id, (RygelMediaContainer*) self, title, RYGEL_MUSIC_ITEM_UPNP_CLASS);
1785 +       song = _tmp20_;
1786 +       _tmp21_ = statement;
1787 +       _tmp22_ = sqlite3_column_int (_tmp21_, 2);
1788 +       rygel_media_file_item_set_size ((RygelMediaFileItem*) song, (gint64) _tmp22_);
1789 +       _tmp23_ = statement;
1790 +       _tmp24_ = sqlite3_column_int (_tmp23_, 4);
1791 +       rygel_music_item_set_track_number (song, _tmp24_);
1792 +       _tmp25_ = statement;
1793 +       _tmp26_ = sqlite3_column_int (_tmp25_, 5);
1794 +       rygel_audio_item_set_duration ((RygelAudioItem*) song, (glong) _tmp26_);
1795 +       _tmp27_ = statement;
1796 +       _tmp28_ = sqlite3_column_int (_tmp27_, 6);
1797 +       rygel_audio_item_set_channels ((RygelAudioItem*) song, _tmp28_);
1798 +       _tmp29_ = statement;
1799 +       _tmp30_ = sqlite3_column_int (_tmp29_, 7);
1800 +       rygel_audio_item_set_sample_freq ((RygelAudioItem*) song, _tmp30_);
1801 +       _tmp31_ = statement;
1802 +       _tmp32_ = sqlite3_column_int (_tmp31_, 8);
1803 +       rygel_audio_item_set_bitrate ((RygelAudioItem*) song, _tmp32_);
1804 +       _tmp33_ = statement;
1805 +       _tmp34_ = sqlite3_column_text (_tmp33_, 9);
1806 +       rygel_media_file_item_set_dlna_profile ((RygelMediaFileItem*) song, _tmp34_);
1807 +       _tmp35_ = mime_type;
1808 +       rygel_media_file_item_set_mime_type ((RygelMediaFileItem*) song, _tmp35_);
1809 +       _tmp36_ = statement;
1810 +       _tmp37_ = sqlite3_column_text (_tmp36_, 11);
1811 +       rygel_media_object_set_artist ((RygelMediaObject*) song, _tmp37_);
1812 +       _tmp38_ = statement;
1813 +       _tmp39_ = sqlite3_column_text (_tmp38_, 12);
1814 +       rygel_audio_item_set_album ((RygelAudioItem*) song, _tmp39_);
1815 +       _tmp40_ = statement;
1816 +       _tmp41_ = sqlite3_column_int (_tmp40_, 13);
1817 +       _tmp42_.tv_sec = (glong) _tmp41_;
1818 +       _tmp42_.tv_usec = (glong) 0;
1819 +       tv = _tmp42_;
1820 +       _tmp43_ = g_time_val_to_iso8601 (&tv);
1821 +       _tmp44_ = _tmp43_;
1822 +       rygel_media_object_set_date ((RygelMediaObject*) song, _tmp44_);
1823 +       _g_free0 (_tmp44_);
1824 +       _tmp45_ = statement;
1825 +       _tmp46_ = sqlite3_column_text (_tmp45_, 14);
1826 +       rygel_media_object_set_genre ((RygelMediaObject*) song, _tmp46_);
1827 +       _tmp47_ = path;
1828 +       _tmp48_ = g_file_new_for_path (_tmp47_);
1829 +       file = _tmp48_;
1830 +       _tmp49_ = g_file_get_uri (file);
1831 +       _tmp50_ = _tmp49_;
1832 +       rygel_media_object_add_uri ((RygelMediaObject*) song, _tmp50_);
1833 +       _g_free0 (_tmp50_);
1834 +       result = (RygelMediaObject*) song;
1835 +       _g_object_unref0 (file);
1836 +       _g_free0 (song_id);
1837 +       _g_free0 (title);
1838 +       _g_free0 (mime_type);
1839 +       _g_free0 (path);
1840 +       return result;
1841 +}
1842 +
1843 +
1844 +RygelLMSAllMusic* rygel_lms_all_music_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1845 +       RygelLMSAllMusic * self = NULL;
1846 +       RygelMediaContainer* _tmp0_ = NULL;
1847 +       const gchar* _tmp1_ = NULL;
1848 +       RygelLMSDatabase* _tmp2_ = NULL;
1849 +       gchar* _tmp3_ = NULL;
1850 +       gchar* _tmp4_ = NULL;
1851 +       g_return_val_if_fail (parent != NULL, NULL);
1852 +       g_return_val_if_fail (lms_db != NULL, NULL);
1853 +       _tmp0_ = parent;
1854 +       _tmp1_ = _ ("All");
1855 +       _tmp2_ = lms_db;
1856 +       _tmp3_ = g_strdup_printf (RYGEL_LMS_ALL_MUSIC_SQL_ALL_TEMPLATE, "");
1857 +       _tmp4_ = _tmp3_;
1858 +       self = (RygelLMSAllMusic*) rygel_lms_category_container_construct (object_type, "all", _tmp0_, _tmp1_, _tmp2_, _tmp4_, RYGEL_LMS_ALL_MUSIC_SQL_FIND_OBJECT, RYGEL_LMS_ALL_MUSIC_SQL_COUNT, RYGEL_LMS_ALL_MUSIC_SQL_ADDED, RYGEL_LMS_ALL_MUSIC_SQL_REMOVED);
1859 +       _g_free0 (_tmp4_);
1860 +       return self;
1861 +}
1862 +
1863 +
1864 +RygelLMSAllMusic* rygel_lms_all_music_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
1865 +       return rygel_lms_all_music_construct (RYGEL_LMS_TYPE_ALL_MUSIC, parent, lms_db);
1866 +}
1867 +
1868 +
1869 +static void rygel_lms_all_music_class_init (RygelLMSAllMusicClass * klass) {
1870 +       rygel_lms_all_music_parent_class = g_type_class_peek_parent (klass);
1871 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_all_with_filter = rygel_lms_all_music_real_get_sql_all_with_filter;
1872 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_count_with_filter = rygel_lms_all_music_real_get_sql_count_with_filter;
1873 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_all_music_real_object_from_statement;
1874 +}
1875 +
1876 +
1877 +static void rygel_lms_all_music_instance_init (RygelLMSAllMusic * self) {
1878 +}
1879 +
1880 +
1881 +GType rygel_lms_all_music_get_type (void) {
1882 +       static volatile gsize rygel_lms_all_music_type_id__volatile = 0;
1883 +       if (g_once_init_enter (&rygel_lms_all_music_type_id__volatile)) {
1884 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSAllMusicClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_all_music_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSAllMusic), 0, (GInstanceInitFunc) rygel_lms_all_music_instance_init, NULL };
1885 +               GType rygel_lms_all_music_type_id;
1886 +               rygel_lms_all_music_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSAllMusic", &g_define_type_info, 0);
1887 +               g_once_init_leave (&rygel_lms_all_music_type_id__volatile, rygel_lms_all_music_type_id);
1888 +       }
1889 +       return rygel_lms_all_music_type_id__volatile;
1890 +}
1891 +
1892 +
1893 +
1894 diff --git a/src/plugins/lms/rygel-lms-all-videos.c b/src/plugins/lms/rygel-lms-all-videos.c
1895 new file mode 100644
1896 index 0000000..51ba52c
1897 --- /dev/null
1898 +++ b/src/plugins/lms/rygel-lms-all-videos.c
1899 @@ -0,0 +1,456 @@
1900 +/* rygel-lms-all-videos.c generated by valac 0.28.0, the Vala compiler
1901 + * generated from rygel-lms-all-videos.vala, do not modify */
1902 +
1903 +/*
1904 + * Copyright (C) 2013 Intel Corporation.
1905 + *
1906 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
1907 + *
1908 + * This file is part of Rygel.
1909 + *
1910 + * Rygel is free software; you can redistribute it and/or modify
1911 + * it under the terms of the GNU Lesser General Public License as published by
1912 + * the Free Software Foundation; either version 2 of the License, or
1913 + * (at your option) any later version.
1914 + *
1915 + * Rygel is distributed in the hope that it will be useful,
1916 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
1917 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1918 + * GNU Lesser General Public License for more details.
1919 + *
1920 + * You should have received a copy of the GNU Lesser General Public License
1921 + * along with this program; if not, write to the Free Software Foundation,
1922 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
1923 + */
1924 +
1925 +#include <glib.h>
1926 +#include <glib-object.h>
1927 +#include <rygel-server.h>
1928 +#include <sqlite3.h>
1929 +#include <stdlib.h>
1930 +#include <string.h>
1931 +#include <gio/gio.h>
1932 +
1933 +
1934 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
1935 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
1936 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1937 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1938 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
1939 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
1940 +
1941 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
1942 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
1943 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
1944 +
1945 +#define RYGEL_LMS_TYPE_ALL_VIDEOS (rygel_lms_all_videos_get_type ())
1946 +#define RYGEL_LMS_ALL_VIDEOS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideos))
1947 +#define RYGEL_LMS_ALL_VIDEOS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideosClass))
1948 +#define RYGEL_LMS_IS_ALL_VIDEOS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS))
1949 +#define RYGEL_LMS_IS_ALL_VIDEOS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_VIDEOS))
1950 +#define RYGEL_LMS_ALL_VIDEOS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideosClass))
1951 +
1952 +typedef struct _RygelLMSAllVideos RygelLMSAllVideos;
1953 +typedef struct _RygelLMSAllVideosClass RygelLMSAllVideosClass;
1954 +typedef struct _RygelLMSAllVideosPrivate RygelLMSAllVideosPrivate;
1955 +#define _g_free0(var) (var = (g_free (var), NULL))
1956 +
1957 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
1958 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
1959 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1960 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
1961 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
1962 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
1963 +
1964 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
1965 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
1966 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
1967 +#define _sqlite3_finalize0(var) ((var == NULL) ? NULL : (var = (sqlite3_finalize (var), NULL)))
1968 +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
1969 +
1970 +struct _RygelLMSCategoryContainer {
1971 +       RygelMediaContainer parent_instance;
1972 +       RygelLMSCategoryContainerPrivate * priv;
1973 +       sqlite3_stmt* stmt_all;
1974 +       sqlite3_stmt* stmt_find_object;
1975 +       sqlite3_stmt* stmt_added;
1976 +       sqlite3_stmt* stmt_removed;
1977 +       gchar* child_prefix;
1978 +       gchar* ref_prefix;
1979 +};
1980 +
1981 +struct _RygelLMSCategoryContainerClass {
1982 +       RygelMediaContainerClass parent_class;
1983 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
1984 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1985 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
1986 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
1987 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
1988 +};
1989 +
1990 +struct _RygelLMSAllVideos {
1991 +       RygelLMSCategoryContainer parent_instance;
1992 +       RygelLMSAllVideosPrivate * priv;
1993 +};
1994 +
1995 +struct _RygelLMSAllVideosClass {
1996 +       RygelLMSCategoryContainerClass parent_class;
1997 +};
1998 +
1999 +typedef enum  {
2000 +       RYGEL_LMS_DATABASE_ERROR_OPEN,
2001 +       RYGEL_LMS_DATABASE_ERROR_PREPARE,
2002 +       RYGEL_LMS_DATABASE_ERROR_BIND,
2003 +       RYGEL_LMS_DATABASE_ERROR_STEP,
2004 +       RYGEL_LMS_DATABASE_ERROR_NOT_FOUND
2005 +} RygelLMSDatabaseError;
2006 +#define RYGEL_LMS_DATABASE_ERROR rygel_lms_database_error_quark ()
2007 +
2008 +static gpointer rygel_lms_all_videos_parent_class = NULL;
2009 +
2010 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
2011 +GType rygel_lms_all_videos_get_type (void) G_GNUC_CONST;
2012 +enum  {
2013 +       RYGEL_LMS_ALL_VIDEOS_DUMMY_PROPERTY
2014 +};
2015 +#define RYGEL_LMS_ALL_VIDEOS_SQL_ALL "SELECT videos.id, title, artist, length, path, mtime, size, dlna_profi" \
2016 +"le, dlna_mime " "FROM videos, files " "WHERE dtime = 0 AND videos.id = files.id " "LIMIT ? OFFSET ?;"
2017 +#define RYGEL_LMS_ALL_VIDEOS_SQL_COUNT "SELECT count(videos.id) " "FROM videos, files " "WHERE dtime = 0 AND videos.id = files.id;"
2018 +#define RYGEL_LMS_ALL_VIDEOS_SQL_FIND_OBJECT "SELECT videos.id, title, artist, length, path, mtime, size, dlna_profi" \
2019 +"le, dlna_mime " "FROM videos, files " "WHERE dtime = 0 AND files.id = ? AND videos.id = files.id;"
2020 +#define RYGEL_LMS_ALL_VIDEOS_SQL_ADDED "SELECT videos.id, title, artist, length, path, mtime, size, dlna_profi" \
2021 +"le, dlna_mime " "FROM videos, files " "WHERE dtime = 0 AND videos.id = files.id " "AND update_id > ? AND update_id <= ?;"
2022 +#define RYGEL_LMS_ALL_VIDEOS_SQL_REMOVED "SELECT videos.id, title, artist, length, path, mtime, size, dlna_profi" \
2023 +"le, dlna_mime " "FROM videos, files " "WHERE dtime <> 0 AND videos.id = files.id " "AND update_id > ? AND update_id <= ?;"
2024 +static RygelMediaObject* rygel_lms_all_videos_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
2025 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
2026 +gpointer rygel_lms_database_ref (gpointer instance);
2027 +void rygel_lms_database_unref (gpointer instance);
2028 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
2029 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
2030 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
2031 +gpointer rygel_lms_value_get_database (const GValue* value);
2032 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
2033 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
2034 +GQuark rygel_lms_database_error_quark (void);
2035 +sqlite3_stmt* rygel_lms_database_prepare (RygelLMSDatabase* self, const gchar* query_string, GError** error);
2036 +void rygel_lms_database_find_object (const gchar* id, sqlite3_stmt* stmt, GError** error);
2037 +RygelLMSAllVideos* rygel_lms_all_videos_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2038 +RygelLMSAllVideos* rygel_lms_all_videos_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2039 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
2040 +
2041 +
2042 +static RygelMediaObject* rygel_lms_all_videos_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
2043 +       RygelLMSAllVideos * self;
2044 +       RygelMediaObject* result = NULL;
2045 +       gint id = 0;
2046 +       sqlite3_stmt* _tmp0_ = NULL;
2047 +       gint _tmp1_ = 0;
2048 +       gchar* mime_type = NULL;
2049 +       sqlite3_stmt* _tmp2_ = NULL;
2050 +       const gchar* _tmp3_ = NULL;
2051 +       gchar* _tmp4_ = NULL;
2052 +       gchar* path = NULL;
2053 +       sqlite3_stmt* _tmp5_ = NULL;
2054 +       const gchar* _tmp6_ = NULL;
2055 +       gchar* _tmp7_ = NULL;
2056 +       GFile* file = NULL;
2057 +       const gchar* _tmp8_ = NULL;
2058 +       GFile* _tmp9_ = NULL;
2059 +       gboolean _tmp10_ = FALSE;
2060 +       const gchar* _tmp11_ = NULL;
2061 +       gchar* title = NULL;
2062 +       sqlite3_stmt* _tmp17_ = NULL;
2063 +       const gchar* _tmp18_ = NULL;
2064 +       gchar* _tmp19_ = NULL;
2065 +       RygelVideoItem* video = NULL;
2066 +       gint _tmp20_ = 0;
2067 +       gchar* _tmp21_ = NULL;
2068 +       gchar* _tmp22_ = NULL;
2069 +       const gchar* _tmp23_ = NULL;
2070 +       RygelVideoItem* _tmp24_ = NULL;
2071 +       RygelVideoItem* _tmp25_ = NULL;
2072 +       RygelVideoItem* _tmp26_ = NULL;
2073 +       sqlite3_stmt* _tmp27_ = NULL;
2074 +       const gchar* _tmp28_ = NULL;
2075 +       RygelVideoItem* _tmp29_ = NULL;
2076 +       sqlite3_stmt* _tmp30_ = NULL;
2077 +       gint _tmp31_ = 0;
2078 +       GTimeVal tv = {0};
2079 +       sqlite3_stmt* _tmp32_ = NULL;
2080 +       gint _tmp33_ = 0;
2081 +       GTimeVal _tmp34_ = {0};
2082 +       RygelVideoItem* _tmp35_ = NULL;
2083 +       gchar* _tmp36_ = NULL;
2084 +       gchar* _tmp37_ = NULL;
2085 +       RygelVideoItem* _tmp38_ = NULL;
2086 +       sqlite3_stmt* _tmp39_ = NULL;
2087 +       gint _tmp40_ = 0;
2088 +       RygelVideoItem* _tmp41_ = NULL;
2089 +       sqlite3_stmt* _tmp42_ = NULL;
2090 +       const gchar* _tmp43_ = NULL;
2091 +       RygelVideoItem* _tmp44_ = NULL;
2092 +       const gchar* _tmp45_ = NULL;
2093 +       RygelVideoItem* _tmp46_ = NULL;
2094 +       GFile* _tmp47_ = NULL;
2095 +       gchar* _tmp48_ = NULL;
2096 +       gchar* _tmp49_ = NULL;
2097 +       gchar* video_data = NULL;
2098 +       gchar* _tmp50_ = NULL;
2099 +       GError * _inner_error_ = NULL;
2100 +       self = (RygelLMSAllVideos*) base;
2101 +       g_return_val_if_fail (statement != NULL, NULL);
2102 +       _tmp0_ = statement;
2103 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
2104 +       id = _tmp1_;
2105 +       _tmp2_ = statement;
2106 +       _tmp3_ = sqlite3_column_text (_tmp2_, 8);
2107 +       _tmp4_ = g_strdup (_tmp3_);
2108 +       mime_type = _tmp4_;
2109 +       _tmp5_ = statement;
2110 +       _tmp6_ = sqlite3_column_text (_tmp5_, 4);
2111 +       _tmp7_ = g_strdup (_tmp6_);
2112 +       path = _tmp7_;
2113 +       _tmp8_ = path;
2114 +       _tmp9_ = g_file_new_for_path (_tmp8_);
2115 +       file = _tmp9_;
2116 +       _tmp11_ = mime_type;
2117 +       if (_tmp11_ == NULL) {
2118 +               _tmp10_ = TRUE;
2119 +       } else {
2120 +               const gchar* _tmp12_ = NULL;
2121 +               gint _tmp13_ = 0;
2122 +               gint _tmp14_ = 0;
2123 +               _tmp12_ = mime_type;
2124 +               _tmp13_ = strlen (_tmp12_);
2125 +               _tmp14_ = _tmp13_;
2126 +               _tmp10_ = _tmp14_ == 0;
2127 +       }
2128 +       if (_tmp10_) {
2129 +               gint _tmp15_ = 0;
2130 +               const gchar* _tmp16_ = NULL;
2131 +               _tmp15_ = id;
2132 +               _tmp16_ = path;
2133 +               g_debug ("rygel-lms-all-videos.vala:75: Video item %d (%s) has no MIME type", _tmp15_, _tmp16_);
2134 +       }
2135 +       _tmp17_ = statement;
2136 +       _tmp18_ = sqlite3_column_text (_tmp17_, 1);
2137 +       _tmp19_ = g_strdup (_tmp18_);
2138 +       title = _tmp19_;
2139 +       _tmp20_ = id;
2140 +       _tmp21_ = rygel_lms_category_container_build_child_id ((RygelLMSCategoryContainer*) self, _tmp20_);
2141 +       _tmp22_ = _tmp21_;
2142 +       _tmp23_ = title;
2143 +       _tmp24_ = rygel_video_item_new (_tmp22_, (RygelMediaContainer*) self, _tmp23_, RYGEL_VIDEO_ITEM_UPNP_CLASS);
2144 +       _tmp25_ = _tmp24_;
2145 +       _g_free0 (_tmp22_);
2146 +       video = _tmp25_;
2147 +       _tmp26_ = video;
2148 +       _tmp27_ = statement;
2149 +       _tmp28_ = sqlite3_column_text (_tmp27_, 2);
2150 +       rygel_media_object_set_creator ((RygelMediaObject*) _tmp26_, _tmp28_);
2151 +       _tmp29_ = video;
2152 +       _tmp30_ = statement;
2153 +       _tmp31_ = sqlite3_column_int (_tmp30_, 3);
2154 +       rygel_audio_item_set_duration ((RygelAudioItem*) _tmp29_, (glong) _tmp31_);
2155 +       _tmp32_ = statement;
2156 +       _tmp33_ = sqlite3_column_int (_tmp32_, 5);
2157 +       _tmp34_.tv_sec = (glong) _tmp33_;
2158 +       _tmp34_.tv_usec = (glong) 0;
2159 +       tv = _tmp34_;
2160 +       _tmp35_ = video;
2161 +       _tmp36_ = g_time_val_to_iso8601 (&tv);
2162 +       _tmp37_ = _tmp36_;
2163 +       rygel_media_object_set_date ((RygelMediaObject*) _tmp35_, _tmp37_);
2164 +       _g_free0 (_tmp37_);
2165 +       _tmp38_ = video;
2166 +       _tmp39_ = statement;
2167 +       _tmp40_ = sqlite3_column_int (_tmp39_, 6);
2168 +       rygel_media_file_item_set_size ((RygelMediaFileItem*) _tmp38_, (gint64) _tmp40_);
2169 +       _tmp41_ = video;
2170 +       _tmp42_ = statement;
2171 +       _tmp43_ = sqlite3_column_text (_tmp42_, 7);
2172 +       rygel_media_file_item_set_dlna_profile ((RygelMediaFileItem*) _tmp41_, _tmp43_);
2173 +       _tmp44_ = video;
2174 +       _tmp45_ = mime_type;
2175 +       rygel_media_file_item_set_mime_type ((RygelMediaFileItem*) _tmp44_, _tmp45_);
2176 +       _tmp46_ = video;
2177 +       _tmp47_ = file;
2178 +       _tmp48_ = g_file_get_uri (_tmp47_);
2179 +       _tmp49_ = _tmp48_;
2180 +       rygel_media_object_add_uri ((RygelMediaObject*) _tmp46_, _tmp49_);
2181 +       _g_free0 (_tmp49_);
2182 +       _tmp50_ = g_strdup ("select videos_videos.bitrate + videos_audios.bitrate, width, height, c" \
2183 +"hannels, sampling_rate " "from videos, videos_audios, videos_videos where videos.id = ? " "and videos.id = videos_audios.video_id and videos.id = videos_videos.v" \
2184 +"ideo_id;");
2185 +       video_data = _tmp50_;
2186 +       {
2187 +               sqlite3_stmt* stmt = NULL;
2188 +               RygelLMSDatabase* _tmp51_ = NULL;
2189 +               RygelLMSDatabase* _tmp52_ = NULL;
2190 +               const gchar* _tmp53_ = NULL;
2191 +               sqlite3_stmt* _tmp54_ = NULL;
2192 +               gint _tmp55_ = 0;
2193 +               gchar* _tmp56_ = NULL;
2194 +               gchar* _tmp57_ = NULL;
2195 +               sqlite3_stmt* _tmp58_ = NULL;
2196 +               RygelVideoItem* _tmp59_ = NULL;
2197 +               sqlite3_stmt* _tmp60_ = NULL;
2198 +               gint _tmp61_ = 0;
2199 +               RygelVideoItem* _tmp62_ = NULL;
2200 +               sqlite3_stmt* _tmp63_ = NULL;
2201 +               gint _tmp64_ = 0;
2202 +               RygelVideoItem* _tmp65_ = NULL;
2203 +               sqlite3_stmt* _tmp66_ = NULL;
2204 +               gint _tmp67_ = 0;
2205 +               RygelVideoItem* _tmp68_ = NULL;
2206 +               sqlite3_stmt* _tmp69_ = NULL;
2207 +               gint _tmp70_ = 0;
2208 +               RygelVideoItem* _tmp71_ = NULL;
2209 +               sqlite3_stmt* _tmp72_ = NULL;
2210 +               gint _tmp73_ = 0;
2211 +               _tmp51_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
2212 +               _tmp52_ = _tmp51_;
2213 +               _tmp53_ = video_data;
2214 +               _tmp54_ = rygel_lms_database_prepare (_tmp52_, _tmp53_, &_inner_error_);
2215 +               stmt = _tmp54_;
2216 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
2217 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
2218 +                               goto __catch10_rygel_lms_database_error;
2219 +                       }
2220 +                       _g_free0 (video_data);
2221 +                       _g_object_unref0 (video);
2222 +                       _g_free0 (title);
2223 +                       _g_object_unref0 (file);
2224 +                       _g_free0 (path);
2225 +                       _g_free0 (mime_type);
2226 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2227 +                       g_clear_error (&_inner_error_);
2228 +                       return NULL;
2229 +               }
2230 +               _tmp55_ = id;
2231 +               _tmp56_ = g_strdup_printf ("%d", _tmp55_);
2232 +               _tmp57_ = _tmp56_;
2233 +               _tmp58_ = stmt;
2234 +               rygel_lms_database_find_object (_tmp57_, _tmp58_, &_inner_error_);
2235 +               _g_free0 (_tmp57_);
2236 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
2237 +                       _sqlite3_finalize0 (stmt);
2238 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
2239 +                               goto __catch10_rygel_lms_database_error;
2240 +                       }
2241 +                       _sqlite3_finalize0 (stmt);
2242 +                       _g_free0 (video_data);
2243 +                       _g_object_unref0 (video);
2244 +                       _g_free0 (title);
2245 +                       _g_object_unref0 (file);
2246 +                       _g_free0 (path);
2247 +                       _g_free0 (mime_type);
2248 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2249 +                       g_clear_error (&_inner_error_);
2250 +                       return NULL;
2251 +               }
2252 +               _tmp59_ = video;
2253 +               _tmp60_ = stmt;
2254 +               _tmp61_ = sqlite3_column_int (_tmp60_, 0);
2255 +               rygel_audio_item_set_bitrate ((RygelAudioItem*) _tmp59_, _tmp61_ / 8);
2256 +               _tmp62_ = video;
2257 +               _tmp63_ = stmt;
2258 +               _tmp64_ = sqlite3_column_int (_tmp63_, 1);
2259 +               rygel_visual_item_set_width ((RygelVisualItem*) _tmp62_, _tmp64_);
2260 +               _tmp65_ = video;
2261 +               _tmp66_ = stmt;
2262 +               _tmp67_ = sqlite3_column_int (_tmp66_, 2);
2263 +               rygel_visual_item_set_height ((RygelVisualItem*) _tmp65_, _tmp67_);
2264 +               _tmp68_ = video;
2265 +               _tmp69_ = stmt;
2266 +               _tmp70_ = sqlite3_column_int (_tmp69_, 3);
2267 +               rygel_audio_item_set_channels ((RygelAudioItem*) _tmp68_, _tmp70_);
2268 +               _tmp71_ = video;
2269 +               _tmp72_ = stmt;
2270 +               _tmp73_ = sqlite3_column_int (_tmp72_, 4);
2271 +               rygel_audio_item_set_sample_freq ((RygelAudioItem*) _tmp71_, _tmp73_);
2272 +               _sqlite3_finalize0 (stmt);
2273 +       }
2274 +       goto __finally10;
2275 +       __catch10_rygel_lms_database_error:
2276 +       {
2277 +               GError* e = NULL;
2278 +               GError* _tmp74_ = NULL;
2279 +               const gchar* _tmp75_ = NULL;
2280 +               e = _inner_error_;
2281 +               _inner_error_ = NULL;
2282 +               _tmp74_ = e;
2283 +               _tmp75_ = _tmp74_->message;
2284 +               g_warning ("rygel-lms-all-videos.vala:105: Query failed: %s", _tmp75_);
2285 +               _g_error_free0 (e);
2286 +       }
2287 +       __finally10:
2288 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
2289 +               _g_free0 (video_data);
2290 +               _g_object_unref0 (video);
2291 +               _g_free0 (title);
2292 +               _g_object_unref0 (file);
2293 +               _g_free0 (path);
2294 +               _g_free0 (mime_type);
2295 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
2296 +               g_clear_error (&_inner_error_);
2297 +               return NULL;
2298 +       }
2299 +       result = (RygelMediaObject*) video;
2300 +       _g_free0 (video_data);
2301 +       _g_free0 (title);
2302 +       _g_object_unref0 (file);
2303 +       _g_free0 (path);
2304 +       _g_free0 (mime_type);
2305 +       return result;
2306 +}
2307 +
2308 +
2309 +RygelLMSAllVideos* rygel_lms_all_videos_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2310 +       RygelLMSAllVideos * self = NULL;
2311 +       const gchar* _tmp0_ = NULL;
2312 +       RygelMediaContainer* _tmp1_ = NULL;
2313 +       const gchar* _tmp2_ = NULL;
2314 +       RygelLMSDatabase* _tmp3_ = NULL;
2315 +       g_return_val_if_fail (id != NULL, NULL);
2316 +       g_return_val_if_fail (parent != NULL, NULL);
2317 +       g_return_val_if_fail (title != NULL, NULL);
2318 +       g_return_val_if_fail (lms_db != NULL, NULL);
2319 +       _tmp0_ = id;
2320 +       _tmp1_ = parent;
2321 +       _tmp2_ = title;
2322 +       _tmp3_ = lms_db;
2323 +       self = (RygelLMSAllVideos*) rygel_lms_category_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_, _tmp3_, RYGEL_LMS_ALL_VIDEOS_SQL_ALL, RYGEL_LMS_ALL_VIDEOS_SQL_FIND_OBJECT, RYGEL_LMS_ALL_VIDEOS_SQL_COUNT, RYGEL_LMS_ALL_VIDEOS_SQL_ADDED, RYGEL_LMS_ALL_VIDEOS_SQL_REMOVED);
2324 +       return self;
2325 +}
2326 +
2327 +
2328 +RygelLMSAllVideos* rygel_lms_all_videos_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2329 +       return rygel_lms_all_videos_construct (RYGEL_LMS_TYPE_ALL_VIDEOS, id, parent, title, lms_db);
2330 +}
2331 +
2332 +
2333 +static void rygel_lms_all_videos_class_init (RygelLMSAllVideosClass * klass) {
2334 +       rygel_lms_all_videos_parent_class = g_type_class_peek_parent (klass);
2335 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_all_videos_real_object_from_statement;
2336 +}
2337 +
2338 +
2339 +static void rygel_lms_all_videos_instance_init (RygelLMSAllVideos * self) {
2340 +}
2341 +
2342 +
2343 +GType rygel_lms_all_videos_get_type (void) {
2344 +       static volatile gsize rygel_lms_all_videos_type_id__volatile = 0;
2345 +       if (g_once_init_enter (&rygel_lms_all_videos_type_id__volatile)) {
2346 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSAllVideosClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_all_videos_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSAllVideos), 0, (GInstanceInitFunc) rygel_lms_all_videos_instance_init, NULL };
2347 +               GType rygel_lms_all_videos_type_id;
2348 +               rygel_lms_all_videos_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSAllVideos", &g_define_type_info, 0);
2349 +               g_once_init_leave (&rygel_lms_all_videos_type_id__volatile, rygel_lms_all_videos_type_id);
2350 +       }
2351 +       return rygel_lms_all_videos_type_id__volatile;
2352 +}
2353 +
2354 +
2355 +
2356 diff --git a/src/plugins/lms/rygel-lms-artist.c b/src/plugins/lms/rygel-lms-artist.c
2357 new file mode 100644
2358 index 0000000..e686ea4
2359 --- /dev/null
2360 +++ b/src/plugins/lms/rygel-lms-artist.c
2361 @@ -0,0 +1,274 @@
2362 +/* rygel-lms-artist.c generated by valac 0.28.0, the Vala compiler
2363 + * generated from rygel-lms-artist.vala, do not modify */
2364 +
2365 +/*
2366 + * Copyright (C) 2013 Intel Corporation.
2367 + *
2368 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
2369 + *
2370 + * This file is part of Rygel.
2371 + *
2372 + * Rygel is free software; you can redistribute it and/or modify
2373 + * it under the terms of the GNU Lesser General Public License as published by
2374 + * the Free Software Foundation; either version 2 of the License, or
2375 + * (at your option) any later version.
2376 + *
2377 + * Rygel is distributed in the hope that it will be useful,
2378 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2379 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2380 + * GNU Lesser General Public License for more details.
2381 + *
2382 + * You should have received a copy of the GNU Lesser General Public License
2383 + * along with this program; if not, write to the Free Software Foundation,
2384 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2385 + */
2386 +
2387 +#include <glib.h>
2388 +#include <glib-object.h>
2389 +#include <rygel-server.h>
2390 +#include <sqlite3.h>
2391 +#include <stdlib.h>
2392 +#include <string.h>
2393 +
2394 +
2395 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
2396 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
2397 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2398 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2399 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2400 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2401 +
2402 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
2403 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
2404 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
2405 +
2406 +#define RYGEL_LMS_TYPE_ARTIST (rygel_lms_artist_get_type ())
2407 +#define RYGEL_LMS_ARTIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtist))
2408 +#define RYGEL_LMS_ARTIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtistClass))
2409 +#define RYGEL_LMS_IS_ARTIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ARTIST))
2410 +#define RYGEL_LMS_IS_ARTIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ARTIST))
2411 +#define RYGEL_LMS_ARTIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtistClass))
2412 +
2413 +typedef struct _RygelLMSArtist RygelLMSArtist;
2414 +typedef struct _RygelLMSArtistClass RygelLMSArtistClass;
2415 +typedef struct _RygelLMSArtistPrivate RygelLMSArtistPrivate;
2416 +
2417 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
2418 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
2419 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2420 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
2421 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
2422 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2423 +
2424 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
2425 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
2426 +
2427 +#define RYGEL_LMS_TYPE_ALBUM (rygel_lms_album_get_type ())
2428 +#define RYGEL_LMS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbum))
2429 +#define RYGEL_LMS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
2430 +#define RYGEL_LMS_IS_ALBUM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALBUM))
2431 +#define RYGEL_LMS_IS_ALBUM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALBUM))
2432 +#define RYGEL_LMS_ALBUM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALBUM, RygelLMSAlbumClass))
2433 +
2434 +typedef struct _RygelLMSAlbum RygelLMSAlbum;
2435 +typedef struct _RygelLMSAlbumClass RygelLMSAlbumClass;
2436 +#define _g_free0(var) (var = (g_free (var), NULL))
2437 +
2438 +struct _RygelLMSCategoryContainer {
2439 +       RygelMediaContainer parent_instance;
2440 +       RygelLMSCategoryContainerPrivate * priv;
2441 +       sqlite3_stmt* stmt_all;
2442 +       sqlite3_stmt* stmt_find_object;
2443 +       sqlite3_stmt* stmt_added;
2444 +       sqlite3_stmt* stmt_removed;
2445 +       gchar* child_prefix;
2446 +       gchar* ref_prefix;
2447 +};
2448 +
2449 +struct _RygelLMSCategoryContainerClass {
2450 +       RygelMediaContainerClass parent_class;
2451 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
2452 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2453 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2454 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
2455 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
2456 +};
2457 +
2458 +struct _RygelLMSArtist {
2459 +       RygelLMSCategoryContainer parent_instance;
2460 +       RygelLMSArtistPrivate * priv;
2461 +};
2462 +
2463 +struct _RygelLMSArtistClass {
2464 +       RygelLMSCategoryContainerClass parent_class;
2465 +};
2466 +
2467 +
2468 +static gpointer rygel_lms_artist_parent_class = NULL;
2469 +
2470 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
2471 +GType rygel_lms_artist_get_type (void) G_GNUC_CONST;
2472 +enum  {
2473 +       RYGEL_LMS_ARTIST_DUMMY_PROPERTY
2474 +};
2475 +#define RYGEL_LMS_ARTIST_SQL_ALL_TEMPLATE "SELECT audio_albums.id, audio_albums.name " "FROM audio_albums " "WHERE audio_albums.artist_id = %s " "LIMIT ? OFFSET ?;"
2476 +#define RYGEL_LMS_ARTIST_SQL_COUNT_TEMPLATE "SELECT COUNT(audio_albums.id) " "FROM audio_albums " "WHERE audio_albums.artist_id = %s"
2477 +#define RYGEL_LMS_ARTIST_SQL_FIND_OBJECT_TEMPLATE "SELECT audio_albums.id, audio_albums.name " "FROM audio_albums " "WHERE audio_albums.id = ? AND audio_albums.artist_id = %s;"
2478 +static gchar* rygel_lms_artist_get_sql_all (const gchar* id);
2479 +static gchar* rygel_lms_artist_get_sql_find_object (const gchar* id);
2480 +static gchar* rygel_lms_artist_get_sql_count (const gchar* id);
2481 +static RygelMediaObject* rygel_lms_artist_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
2482 +gpointer rygel_lms_database_ref (gpointer instance);
2483 +void rygel_lms_database_unref (gpointer instance);
2484 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
2485 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
2486 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
2487 +gpointer rygel_lms_value_get_database (const GValue* value);
2488 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
2489 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
2490 +RygelLMSAlbum* rygel_lms_album_new (const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2491 +RygelLMSAlbum* rygel_lms_album_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2492 +GType rygel_lms_album_get_type (void) G_GNUC_CONST;
2493 +RygelLMSArtist* rygel_lms_artist_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2494 +RygelLMSArtist* rygel_lms_artist_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2495 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
2496 +
2497 +
2498 +static gchar* rygel_lms_artist_get_sql_all (const gchar* id) {
2499 +       gchar* result = NULL;
2500 +       const gchar* _tmp0_ = NULL;
2501 +       gchar* _tmp1_ = NULL;
2502 +       g_return_val_if_fail (id != NULL, NULL);
2503 +       _tmp0_ = id;
2504 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ARTIST_SQL_ALL_TEMPLATE, _tmp0_);
2505 +       result = _tmp1_;
2506 +       return result;
2507 +}
2508 +
2509 +
2510 +static gchar* rygel_lms_artist_get_sql_find_object (const gchar* id) {
2511 +       gchar* result = NULL;
2512 +       const gchar* _tmp0_ = NULL;
2513 +       gchar* _tmp1_ = NULL;
2514 +       g_return_val_if_fail (id != NULL, NULL);
2515 +       _tmp0_ = id;
2516 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ARTIST_SQL_FIND_OBJECT_TEMPLATE, _tmp0_);
2517 +       result = _tmp1_;
2518 +       return result;
2519 +}
2520 +
2521 +
2522 +static gchar* rygel_lms_artist_get_sql_count (const gchar* id) {
2523 +       gchar* result = NULL;
2524 +       const gchar* _tmp0_ = NULL;
2525 +       gchar* _tmp1_ = NULL;
2526 +       g_return_val_if_fail (id != NULL, NULL);
2527 +       _tmp0_ = id;
2528 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_ARTIST_SQL_COUNT_TEMPLATE, _tmp0_);
2529 +       result = _tmp1_;
2530 +       return result;
2531 +}
2532 +
2533 +
2534 +static RygelMediaObject* rygel_lms_artist_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
2535 +       RygelLMSArtist * self;
2536 +       RygelMediaObject* result = NULL;
2537 +       gchar* db_id = NULL;
2538 +       sqlite3_stmt* _tmp0_ = NULL;
2539 +       gint _tmp1_ = 0;
2540 +       gchar* _tmp2_ = NULL;
2541 +       gchar* title = NULL;
2542 +       sqlite3_stmt* _tmp3_ = NULL;
2543 +       const gchar* _tmp4_ = NULL;
2544 +       gchar* _tmp5_ = NULL;
2545 +       RygelLMSDatabase* _tmp6_ = NULL;
2546 +       RygelLMSDatabase* _tmp7_ = NULL;
2547 +       RygelLMSAlbum* _tmp8_ = NULL;
2548 +       self = (RygelLMSArtist*) base;
2549 +       g_return_val_if_fail (statement != NULL, NULL);
2550 +       _tmp0_ = statement;
2551 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
2552 +       _tmp2_ = g_strdup_printf ("%d", _tmp1_);
2553 +       db_id = _tmp2_;
2554 +       _tmp3_ = statement;
2555 +       _tmp4_ = sqlite3_column_text (_tmp3_, 1);
2556 +       _tmp5_ = g_strdup (_tmp4_);
2557 +       title = _tmp5_;
2558 +       _tmp6_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
2559 +       _tmp7_ = _tmp6_;
2560 +       _tmp8_ = rygel_lms_album_new (db_id, (RygelMediaContainer*) self, title, _tmp7_);
2561 +       result = (RygelMediaObject*) _tmp8_;
2562 +       _g_free0 (title);
2563 +       _g_free0 (db_id);
2564 +       return result;
2565 +}
2566 +
2567 +
2568 +RygelLMSArtist* rygel_lms_artist_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2569 +       RygelLMSArtist * self = NULL;
2570 +       const gchar* _tmp0_ = NULL;
2571 +       RygelMediaContainer* _tmp1_ = NULL;
2572 +       const gchar* _tmp2_ = NULL;
2573 +       RygelLMSDatabase* _tmp3_ = NULL;
2574 +       const gchar* _tmp4_ = NULL;
2575 +       gchar* _tmp5_ = NULL;
2576 +       gchar* _tmp6_ = NULL;
2577 +       const gchar* _tmp7_ = NULL;
2578 +       gchar* _tmp8_ = NULL;
2579 +       gchar* _tmp9_ = NULL;
2580 +       const gchar* _tmp10_ = NULL;
2581 +       gchar* _tmp11_ = NULL;
2582 +       gchar* _tmp12_ = NULL;
2583 +       g_return_val_if_fail (id != NULL, NULL);
2584 +       g_return_val_if_fail (parent != NULL, NULL);
2585 +       g_return_val_if_fail (title != NULL, NULL);
2586 +       g_return_val_if_fail (lms_db != NULL, NULL);
2587 +       _tmp0_ = id;
2588 +       _tmp1_ = parent;
2589 +       _tmp2_ = title;
2590 +       _tmp3_ = lms_db;
2591 +       _tmp4_ = id;
2592 +       _tmp5_ = rygel_lms_artist_get_sql_all (_tmp4_);
2593 +       _tmp6_ = _tmp5_;
2594 +       _tmp7_ = id;
2595 +       _tmp8_ = rygel_lms_artist_get_sql_find_object (_tmp7_);
2596 +       _tmp9_ = _tmp8_;
2597 +       _tmp10_ = id;
2598 +       _tmp11_ = rygel_lms_artist_get_sql_count (_tmp10_);
2599 +       _tmp12_ = _tmp11_;
2600 +       self = (RygelLMSArtist*) rygel_lms_category_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_, _tmp3_, _tmp6_, _tmp9_, _tmp12_, NULL, NULL);
2601 +       _g_free0 (_tmp12_);
2602 +       _g_free0 (_tmp9_);
2603 +       _g_free0 (_tmp6_);
2604 +       return self;
2605 +}
2606 +
2607 +
2608 +RygelLMSArtist* rygel_lms_artist_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2609 +       return rygel_lms_artist_construct (RYGEL_LMS_TYPE_ARTIST, id, parent, title, lms_db);
2610 +}
2611 +
2612 +
2613 +static void rygel_lms_artist_class_init (RygelLMSArtistClass * klass) {
2614 +       rygel_lms_artist_parent_class = g_type_class_peek_parent (klass);
2615 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_artist_real_object_from_statement;
2616 +}
2617 +
2618 +
2619 +static void rygel_lms_artist_instance_init (RygelLMSArtist * self) {
2620 +}
2621 +
2622 +
2623 +GType rygel_lms_artist_get_type (void) {
2624 +       static volatile gsize rygel_lms_artist_type_id__volatile = 0;
2625 +       if (g_once_init_enter (&rygel_lms_artist_type_id__volatile)) {
2626 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSArtistClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_artist_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSArtist), 0, (GInstanceInitFunc) rygel_lms_artist_instance_init, NULL };
2627 +               GType rygel_lms_artist_type_id;
2628 +               rygel_lms_artist_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSArtist", &g_define_type_info, 0);
2629 +               g_once_init_leave (&rygel_lms_artist_type_id__volatile, rygel_lms_artist_type_id);
2630 +       }
2631 +       return rygel_lms_artist_type_id__volatile;
2632 +}
2633 +
2634 +
2635 +
2636 diff --git a/src/plugins/lms/rygel-lms-artists.c b/src/plugins/lms/rygel-lms-artists.c
2637 new file mode 100644
2638 index 0000000..3ac85bc
2639 --- /dev/null
2640 +++ b/src/plugins/lms/rygel-lms-artists.c
2641 @@ -0,0 +1,214 @@
2642 +/* rygel-lms-artists.c generated by valac 0.28.0, the Vala compiler
2643 + * generated from rygel-lms-artists.vala, do not modify */
2644 +
2645 +/*
2646 + * Copyright (C) 2013 Intel Corporation.
2647 + *
2648 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
2649 + *
2650 + * This file is part of Rygel.
2651 + *
2652 + * Rygel is free software; you can redistribute it and/or modify
2653 + * it under the terms of the GNU Lesser General Public License as published by
2654 + * the Free Software Foundation; either version 2 of the License, or
2655 + * (at your option) any later version.
2656 + *
2657 + * Rygel is distributed in the hope that it will be useful,
2658 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2659 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2660 + * GNU Lesser General Public License for more details.
2661 + *
2662 + * You should have received a copy of the GNU Lesser General Public License
2663 + * along with this program; if not, write to the Free Software Foundation,
2664 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2665 + */
2666 +
2667 +#include <glib.h>
2668 +#include <glib-object.h>
2669 +#include <rygel-server.h>
2670 +#include <sqlite3.h>
2671 +#include <stdlib.h>
2672 +#include <string.h>
2673 +
2674 +
2675 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
2676 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
2677 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2678 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2679 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2680 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2681 +
2682 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
2683 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
2684 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
2685 +
2686 +#define RYGEL_LMS_TYPE_ARTISTS (rygel_lms_artists_get_type ())
2687 +#define RYGEL_LMS_ARTISTS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtists))
2688 +#define RYGEL_LMS_ARTISTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtistsClass))
2689 +#define RYGEL_LMS_IS_ARTISTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ARTISTS))
2690 +#define RYGEL_LMS_IS_ARTISTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ARTISTS))
2691 +#define RYGEL_LMS_ARTISTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtistsClass))
2692 +
2693 +typedef struct _RygelLMSArtists RygelLMSArtists;
2694 +typedef struct _RygelLMSArtistsClass RygelLMSArtistsClass;
2695 +typedef struct _RygelLMSArtistsPrivate RygelLMSArtistsPrivate;
2696 +
2697 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
2698 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
2699 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2700 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
2701 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
2702 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2703 +
2704 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
2705 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
2706 +
2707 +#define RYGEL_LMS_TYPE_ARTIST (rygel_lms_artist_get_type ())
2708 +#define RYGEL_LMS_ARTIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtist))
2709 +#define RYGEL_LMS_ARTIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtistClass))
2710 +#define RYGEL_LMS_IS_ARTIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ARTIST))
2711 +#define RYGEL_LMS_IS_ARTIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ARTIST))
2712 +#define RYGEL_LMS_ARTIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ARTIST, RygelLMSArtistClass))
2713 +
2714 +typedef struct _RygelLMSArtist RygelLMSArtist;
2715 +typedef struct _RygelLMSArtistClass RygelLMSArtistClass;
2716 +#define _g_free0(var) (var = (g_free (var), NULL))
2717 +
2718 +struct _RygelLMSCategoryContainer {
2719 +       RygelMediaContainer parent_instance;
2720 +       RygelLMSCategoryContainerPrivate * priv;
2721 +       sqlite3_stmt* stmt_all;
2722 +       sqlite3_stmt* stmt_find_object;
2723 +       sqlite3_stmt* stmt_added;
2724 +       sqlite3_stmt* stmt_removed;
2725 +       gchar* child_prefix;
2726 +       gchar* ref_prefix;
2727 +};
2728 +
2729 +struct _RygelLMSCategoryContainerClass {
2730 +       RygelMediaContainerClass parent_class;
2731 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
2732 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2733 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2734 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
2735 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
2736 +};
2737 +
2738 +struct _RygelLMSArtists {
2739 +       RygelLMSCategoryContainer parent_instance;
2740 +       RygelLMSArtistsPrivate * priv;
2741 +};
2742 +
2743 +struct _RygelLMSArtistsClass {
2744 +       RygelLMSCategoryContainerClass parent_class;
2745 +};
2746 +
2747 +
2748 +static gpointer rygel_lms_artists_parent_class = NULL;
2749 +
2750 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
2751 +GType rygel_lms_artists_get_type (void) G_GNUC_CONST;
2752 +enum  {
2753 +       RYGEL_LMS_ARTISTS_DUMMY_PROPERTY
2754 +};
2755 +#define RYGEL_LMS_ARTISTS_SQL_ALL "SELECT audio_artists.id, audio_artists.name " "FROM audio_artists " "LIMIT ? OFFSET ?;"
2756 +#define RYGEL_LMS_ARTISTS_SQL_COUNT "SELECT COUNT(audio_artists.id) " "FROM audio_artists;"
2757 +#define RYGEL_LMS_ARTISTS_SQL_FIND_OBJECT "SELECT audio_artists.id, audio_artists.name " "FROM audio_artists " "WHERE audio_artists.id = ?;"
2758 +static RygelMediaObject* rygel_lms_artists_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
2759 +gpointer rygel_lms_database_ref (gpointer instance);
2760 +void rygel_lms_database_unref (gpointer instance);
2761 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
2762 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
2763 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
2764 +gpointer rygel_lms_value_get_database (const GValue* value);
2765 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
2766 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
2767 +RygelLMSArtist* rygel_lms_artist_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2768 +RygelLMSArtist* rygel_lms_artist_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2769 +GType rygel_lms_artist_get_type (void) G_GNUC_CONST;
2770 +RygelLMSArtists* rygel_lms_artists_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2771 +RygelLMSArtists* rygel_lms_artists_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
2772 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
2773 +
2774 +
2775 +static RygelMediaObject* rygel_lms_artists_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
2776 +       RygelLMSArtists * self;
2777 +       RygelMediaObject* result = NULL;
2778 +       gchar* db_id = NULL;
2779 +       sqlite3_stmt* _tmp0_ = NULL;
2780 +       gint _tmp1_ = 0;
2781 +       gchar* _tmp2_ = NULL;
2782 +       gchar* title = NULL;
2783 +       sqlite3_stmt* _tmp3_ = NULL;
2784 +       const gchar* _tmp4_ = NULL;
2785 +       gchar* _tmp5_ = NULL;
2786 +       RygelLMSDatabase* _tmp6_ = NULL;
2787 +       RygelLMSDatabase* _tmp7_ = NULL;
2788 +       RygelLMSArtist* _tmp8_ = NULL;
2789 +       self = (RygelLMSArtists*) base;
2790 +       g_return_val_if_fail (statement != NULL, NULL);
2791 +       _tmp0_ = statement;
2792 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
2793 +       _tmp2_ = g_strdup_printf ("%d", _tmp1_);
2794 +       db_id = _tmp2_;
2795 +       _tmp3_ = statement;
2796 +       _tmp4_ = sqlite3_column_text (_tmp3_, 1);
2797 +       _tmp5_ = g_strdup (_tmp4_);
2798 +       title = _tmp5_;
2799 +       _tmp6_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
2800 +       _tmp7_ = _tmp6_;
2801 +       _tmp8_ = rygel_lms_artist_new (db_id, (RygelMediaContainer*) self, title, _tmp7_);
2802 +       result = (RygelMediaObject*) _tmp8_;
2803 +       _g_free0 (title);
2804 +       _g_free0 (db_id);
2805 +       return result;
2806 +}
2807 +
2808 +
2809 +RygelLMSArtists* rygel_lms_artists_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2810 +       RygelLMSArtists * self = NULL;
2811 +       const gchar* _tmp0_ = NULL;
2812 +       RygelMediaContainer* _tmp1_ = NULL;
2813 +       const gchar* _tmp2_ = NULL;
2814 +       RygelLMSDatabase* _tmp3_ = NULL;
2815 +       g_return_val_if_fail (id != NULL, NULL);
2816 +       g_return_val_if_fail (parent != NULL, NULL);
2817 +       g_return_val_if_fail (title != NULL, NULL);
2818 +       g_return_val_if_fail (lms_db != NULL, NULL);
2819 +       _tmp0_ = id;
2820 +       _tmp1_ = parent;
2821 +       _tmp2_ = title;
2822 +       _tmp3_ = lms_db;
2823 +       self = (RygelLMSArtists*) rygel_lms_category_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_, _tmp3_, RYGEL_LMS_ARTISTS_SQL_ALL, RYGEL_LMS_ARTISTS_SQL_FIND_OBJECT, RYGEL_LMS_ARTISTS_SQL_COUNT, NULL, NULL);
2824 +       return self;
2825 +}
2826 +
2827 +
2828 +RygelLMSArtists* rygel_lms_artists_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
2829 +       return rygel_lms_artists_construct (RYGEL_LMS_TYPE_ARTISTS, id, parent, title, lms_db);
2830 +}
2831 +
2832 +
2833 +static void rygel_lms_artists_class_init (RygelLMSArtistsClass * klass) {
2834 +       rygel_lms_artists_parent_class = g_type_class_peek_parent (klass);
2835 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_artists_real_object_from_statement;
2836 +}
2837 +
2838 +
2839 +static void rygel_lms_artists_instance_init (RygelLMSArtists * self) {
2840 +}
2841 +
2842 +
2843 +GType rygel_lms_artists_get_type (void) {
2844 +       static volatile gsize rygel_lms_artists_type_id__volatile = 0;
2845 +       if (g_once_init_enter (&rygel_lms_artists_type_id__volatile)) {
2846 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSArtistsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_artists_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSArtists), 0, (GInstanceInitFunc) rygel_lms_artists_instance_init, NULL };
2847 +               GType rygel_lms_artists_type_id;
2848 +               rygel_lms_artists_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSArtists", &g_define_type_info, 0);
2849 +               g_once_init_leave (&rygel_lms_artists_type_id__volatile, rygel_lms_artists_type_id);
2850 +       }
2851 +       return rygel_lms_artists_type_id__volatile;
2852 +}
2853 +
2854 +
2855 +
2856 diff --git a/src/plugins/lms/rygel-lms-category-container.c b/src/plugins/lms/rygel-lms-category-container.c
2857 new file mode 100644
2858 index 0000000..21692d0
2859 --- /dev/null
2860 +++ b/src/plugins/lms/rygel-lms-category-container.c
2861 @@ -0,0 +1,2772 @@
2862 +/* rygel-lms-category-container.c generated by valac 0.28.0, the Vala compiler
2863 + * generated from rygel-lms-category-container.vala, do not modify */
2864 +
2865 +/*
2866 + * Copyright (C) 2009,2010 Jens Georg <mail@jensge.org>,
2867 + *           (C) 2013 Intel Corporation.
2868 + *
2869 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
2870 + *
2871 + * This file is part of Rygel.
2872 + *
2873 + * Rygel is free software; you can redistribute it and/or modify
2874 + * it under the terms of the GNU Lesser General Public License as published by
2875 + * the Free Software Foundation; either version 2 of the License, or
2876 + * (at your option) any later version.
2877 + *
2878 + * Rygel is distributed in the hope that it will be useful,
2879 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
2880 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2881 + * GNU Lesser General Public License for more details.
2882 + *
2883 + * You should have received a copy of the GNU Lesser General Public License
2884 + * along with this program; if not, write to the Free Software Foundation,
2885 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2886 + */
2887 +
2888 +#include <glib.h>
2889 +#include <glib-object.h>
2890 +#include <rygel-server.h>
2891 +#include <sqlite3.h>
2892 +#include <stdlib.h>
2893 +#include <string.h>
2894 +#include <gee.h>
2895 +#include <libgupnp-av/gupnp-av.h>
2896 +#include <gio/gio.h>
2897 +
2898 +
2899 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
2900 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
2901 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2902 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2903 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
2904 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
2905 +
2906 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
2907 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
2908 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
2909 +
2910 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
2911 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
2912 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2913 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
2914 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
2915 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
2916 +
2917 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
2918 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
2919 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
2920 +#define _g_free0(var) (var = (g_free (var), NULL))
2921 +#define _sqlite3_finalize0(var) ((var == NULL) ? NULL : (var = (sqlite3_finalize (var), NULL)))
2922 +#define __vala_GValue_free0(var) ((var == NULL) ? NULL : (var = (_vala_GValue_free (var), NULL)))
2923 +
2924 +#define RYGEL_LMS_TYPE_SQL_OPERATOR (rygel_lms_sql_operator_get_type ())
2925 +#define RYGEL_LMS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperator))
2926 +#define RYGEL_LMS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
2927 +#define RYGEL_LMS_IS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR))
2928 +#define RYGEL_LMS_IS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR))
2929 +#define RYGEL_LMS_SQL_OPERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
2930 +
2931 +typedef struct _RygelLMSSqlOperator RygelLMSSqlOperator;
2932 +typedef struct _RygelLMSSqlOperatorClass RygelLMSSqlOperatorClass;
2933 +
2934 +#define RYGEL_LMS_TYPE_SQL_FUNCTION (rygel_lms_sql_function_get_type ())
2935 +#define RYGEL_LMS_SQL_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunction))
2936 +#define RYGEL_LMS_SQL_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunctionClass))
2937 +#define RYGEL_LMS_IS_SQL_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION))
2938 +#define RYGEL_LMS_IS_SQL_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_SQL_FUNCTION))
2939 +#define RYGEL_LMS_SQL_FUNCTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunctionClass))
2940 +
2941 +typedef struct _RygelLMSSqlFunction RygelLMSSqlFunction;
2942 +typedef struct _RygelLMSSqlFunctionClass RygelLMSSqlFunctionClass;
2943 +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
2944 +#define _rygel_search_expression_unref0(var) ((var == NULL) ? NULL : (var = (rygel_search_expression_unref (var), NULL)))
2945 +#define _g_value_array_free0(var) ((var == NULL) ? NULL : (var = (g_value_array_free (var), NULL)))
2946 +typedef struct _RygelLmsCategoryContainerSearchData RygelLmsCategoryContainerSearchData;
2947 +typedef struct _RygelLmsCategoryContainerGetChildrenData RygelLmsCategoryContainerGetChildrenData;
2948 +typedef struct _RygelLmsCategoryContainerFindObjectData RygelLmsCategoryContainerFindObjectData;
2949 +typedef struct _RygelLmsCategoryContainerAddChildData RygelLmsCategoryContainerAddChildData;
2950 +typedef struct _RygelLmsCategoryContainerRemoveChildData RygelLmsCategoryContainerRemoveChildData;
2951 +
2952 +typedef enum  {
2953 +       RYGEL_LMS_CATEGORY_CONTAINER_ERROR_SQLITE_ERROR,
2954 +       RYGEL_LMS_CATEGORY_CONTAINER_ERROR_GENERAL_ERROR,
2955 +       RYGEL_LMS_CATEGORY_CONTAINER_ERROR_INVALID_TYPE,
2956 +       RYGEL_LMS_CATEGORY_CONTAINER_ERROR_UNSUPPORTED_SEARCH
2957 +} RygelLMSCategoryContainerError;
2958 +#define RYGEL_LMS_CATEGORY_CONTAINER_ERROR rygel_lms_category_container_error_quark ()
2959 +struct _RygelLMSCategoryContainer {
2960 +       RygelMediaContainer parent_instance;
2961 +       RygelLMSCategoryContainerPrivate * priv;
2962 +       sqlite3_stmt* stmt_all;
2963 +       sqlite3_stmt* stmt_find_object;
2964 +       sqlite3_stmt* stmt_added;
2965 +       sqlite3_stmt* stmt_removed;
2966 +       gchar* child_prefix;
2967 +       gchar* ref_prefix;
2968 +};
2969 +
2970 +struct _RygelLMSCategoryContainerClass {
2971 +       RygelMediaContainerClass parent_class;
2972 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
2973 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2974 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
2975 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
2976 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
2977 +};
2978 +
2979 +struct _RygelLMSCategoryContainerPrivate {
2980 +       GeeArrayList* _search_classes;
2981 +       RygelLMSDatabase* _lms_db;
2982 +       gchar* _db_id;
2983 +       gchar* _sql_all;
2984 +       gchar* _sql_find_object;
2985 +       gchar* _sql_count;
2986 +       gchar* _sql_added;
2987 +       gchar* _sql_removed;
2988 +};
2989 +
2990 +typedef enum  {
2991 +       RYGEL_LMS_DATABASE_ERROR_OPEN,
2992 +       RYGEL_LMS_DATABASE_ERROR_PREPARE,
2993 +       RYGEL_LMS_DATABASE_ERROR_BIND,
2994 +       RYGEL_LMS_DATABASE_ERROR_STEP,
2995 +       RYGEL_LMS_DATABASE_ERROR_NOT_FOUND
2996 +} RygelLMSDatabaseError;
2997 +#define RYGEL_LMS_DATABASE_ERROR rygel_lms_database_error_quark ()
2998 +struct _RygelLmsCategoryContainerSearchData {
2999 +       int _state_;
3000 +       GObject* _source_object_;
3001 +       GAsyncResult* _res_;
3002 +       GSimpleAsyncResult* _async_result;
3003 +       RygelLMSCategoryContainer* self;
3004 +       RygelSearchExpression* expression;
3005 +       guint offset;
3006 +       guint max_count;
3007 +       guint total_matches;
3008 +       gchar* sort_criteria;
3009 +       GCancellable* cancellable;
3010 +       RygelMediaObjects* result;
3011 +       GValueArray* args;
3012 +       GValueArray* _tmp0_;
3013 +       gchar* filter;
3014 +       RygelSearchExpression* _tmp1_;
3015 +       GValueArray* _tmp2_;
3016 +       gchar* _tmp3_;
3017 +       const gchar* _tmp4_;
3018 +       GValueArray* _tmp5_;
3019 +       guint _tmp6_;
3020 +       RygelSearchExpression* _tmp7_;
3021 +       RygelSearchExpression* _tmp8_;
3022 +       gchar* _tmp9_;
3023 +       gchar* _tmp10_;
3024 +       const gchar* _tmp11_;
3025 +       guint _tmp12_;
3026 +       guint _tmp13_;
3027 +       const gchar* _tmp14_;
3028 +       GValueArray* _tmp15_;
3029 +       const gchar* _tmp16_;
3030 +       guint _tmp17_;
3031 +       guint _tmp18_;
3032 +       RygelMediaObjects* _tmp19_;
3033 +       GError* e;
3034 +       GError* _tmp20_;
3035 +       const gchar* _tmp21_;
3036 +       RygelMediaObjects* _tmp22_;
3037 +       RygelSearchExpression* _tmp23_;
3038 +       guint _tmp24_;
3039 +       guint _tmp25_;
3040 +       const gchar* _tmp26_;
3041 +       GCancellable* _tmp27_;
3042 +       guint _tmp28_;
3043 +       RygelMediaObjects* _tmp29_;
3044 +       RygelMediaObjects* _tmp30_;
3045 +       GError * _inner_error_;
3046 +};
3047 +
3048 +struct _RygelLmsCategoryContainerGetChildrenData {
3049 +       int _state_;
3050 +       GObject* _source_object_;
3051 +       GAsyncResult* _res_;
3052 +       GSimpleAsyncResult* _async_result;
3053 +       RygelLMSCategoryContainer* self;
3054 +       guint offset;
3055 +       guint max_count;
3056 +       gchar* sort_criteria;
3057 +       GCancellable* cancellable;
3058 +       RygelMediaObjects* result;
3059 +       RygelMediaObjects* retval;
3060 +       RygelMediaObjects* _tmp0_;
3061 +       sqlite3_stmt* _tmp1_;
3062 +       guint _tmp2_;
3063 +       guint _tmp3_;
3064 +       const gchar* _tmp4_;
3065 +       gboolean _tmp5_;
3066 +       sqlite3_stmt* _tmp6_;
3067 +       gboolean _tmp7_;
3068 +       RygelMediaObjects* _tmp8_;
3069 +       sqlite3_stmt* _tmp9_;
3070 +       RygelMediaObject* _tmp10_;
3071 +       RygelMediaObject* _tmp11_;
3072 +       GError * _inner_error_;
3073 +};
3074 +
3075 +struct _RygelLmsCategoryContainerFindObjectData {
3076 +       int _state_;
3077 +       GObject* _source_object_;
3078 +       GAsyncResult* _res_;
3079 +       GSimpleAsyncResult* _async_result;
3080 +       RygelLMSCategoryContainer* self;
3081 +       gchar* id;
3082 +       GCancellable* cancellable;
3083 +       RygelMediaObject* result;
3084 +       const gchar* _tmp0_;
3085 +       const gchar* _tmp1_;
3086 +       gboolean _tmp2_;
3087 +       RygelMediaObject* object;
3088 +       gchar* real_id;
3089 +       const gchar* _tmp3_;
3090 +       const gchar* _tmp4_;
3091 +       gint _tmp5_;
3092 +       gint _tmp6_;
3093 +       gchar* _tmp7_;
3094 +       gint index;
3095 +       const gchar* _tmp8_;
3096 +       gint _tmp9_;
3097 +       gint _tmp10_;
3098 +       const gchar* _tmp11_;
3099 +       gint _tmp12_;
3100 +       gchar* _tmp13_;
3101 +       const gchar* _tmp14_;
3102 +       sqlite3_stmt* _tmp15_;
3103 +       RygelMediaObject* child;
3104 +       sqlite3_stmt* _tmp16_;
3105 +       RygelMediaObject* _tmp17_;
3106 +       gint _tmp18_;
3107 +       RygelMediaObject* _tmp19_;
3108 +       RygelMediaObject* _tmp20_;
3109 +       RygelLMSCategoryContainer* container;
3110 +       RygelMediaObject* _tmp21_;
3111 +       RygelLMSCategoryContainer* _tmp22_;
3112 +       RygelMediaObject* _tmp23_;
3113 +       RygelLMSCategoryContainer* _tmp24_;
3114 +       const gchar* _tmp25_;
3115 +       GCancellable* _tmp26_;
3116 +       RygelMediaObject* _tmp27_;
3117 +       RygelMediaObject* _tmp28_;
3118 +       RygelMediaObject* _tmp29_;
3119 +       RygelMediaObject* _tmp30_;
3120 +       RygelMediaContainer* _tmp31_;
3121 +       RygelMediaContainer* _tmp32_;
3122 +       GError* e;
3123 +       const gchar* _tmp33_;
3124 +       const gchar* _tmp34_;
3125 +       const gchar* _tmp35_;
3126 +       GError* _tmp36_;
3127 +       const gchar* _tmp37_;
3128 +       GError * _inner_error_;
3129 +};
3130 +
3131 +struct _RygelLmsCategoryContainerAddChildData {
3132 +       int _state_;
3133 +       GObject* _source_object_;
3134 +       GAsyncResult* _res_;
3135 +       GSimpleAsyncResult* _async_result;
3136 +       RygelLMSCategoryContainer* self;
3137 +       RygelMediaObject* object;
3138 +};
3139 +
3140 +struct _RygelLmsCategoryContainerRemoveChildData {
3141 +       int _state_;
3142 +       GObject* _source_object_;
3143 +       GAsyncResult* _res_;
3144 +       GSimpleAsyncResult* _async_result;
3145 +       RygelLMSCategoryContainer* self;
3146 +       RygelMediaObject* object;
3147 +};
3148 +
3149 +
3150 +static gpointer rygel_lms_category_container_parent_class = NULL;
3151 +static RygelTrackableContainerIface* rygel_lms_category_container_rygel_trackable_container_parent_iface = NULL;
3152 +static RygelSearchableContainerIface* rygel_lms_category_container_rygel_searchable_container_parent_iface = NULL;
3153 +
3154 +GQuark rygel_lms_category_container_error_quark (void);
3155 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
3156 +gpointer rygel_lms_database_ref (gpointer instance);
3157 +void rygel_lms_database_unref (gpointer instance);
3158 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
3159 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
3160 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
3161 +gpointer rygel_lms_value_get_database (const GValue* value);
3162 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
3163 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerPrivate))
3164 +enum  {
3165 +       RYGEL_LMS_CATEGORY_CONTAINER_DUMMY_PROPERTY,
3166 +       RYGEL_LMS_CATEGORY_CONTAINER_SEARCH_CLASSES,
3167 +       RYGEL_LMS_CATEGORY_CONTAINER_LMS_DB,
3168 +       RYGEL_LMS_CATEGORY_CONTAINER_DB_ID,
3169 +       RYGEL_LMS_CATEGORY_CONTAINER_SQL_ALL,
3170 +       RYGEL_LMS_CATEGORY_CONTAINER_SQL_FIND_OBJECT,
3171 +       RYGEL_LMS_CATEGORY_CONTAINER_SQL_COUNT,
3172 +       RYGEL_LMS_CATEGORY_CONTAINER_SQL_ADDED,
3173 +       RYGEL_LMS_CATEGORY_CONTAINER_SQL_REMOVED
3174 +};
3175 +RygelMediaObject* rygel_lms_category_container_object_from_statement (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
3176 +static RygelMediaObject* rygel_lms_category_container_real_object_from_statement (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
3177 +gchar* rygel_lms_category_container_get_sql_all_with_filter (RygelLMSCategoryContainer* self, const gchar* filter);
3178 +static gchar* rygel_lms_category_container_real_get_sql_all_with_filter (RygelLMSCategoryContainer* self, const gchar* filter);
3179 +const gchar* rygel_lms_category_container_get_sql_all (RygelLMSCategoryContainer* self);
3180 +gchar* rygel_lms_category_container_get_sql_count_with_filter (RygelLMSCategoryContainer* self, const gchar* filter);
3181 +static gchar* rygel_lms_category_container_real_get_sql_count_with_filter (RygelLMSCategoryContainer* self, const gchar* filter);
3182 +const gchar* rygel_lms_category_container_get_sql_count (RygelLMSCategoryContainer* self);
3183 +static gchar* rygel_lms_category_container_map_operand_to_column (const gchar* operand, gchar** collate, gboolean for_sort, GError** error);
3184 +static gchar* rygel_lms_category_container_relational_expression_to_sql (RygelRelationalExpression* exp, GValueArray* args, GError** error);
3185 +static void _vala_GValue_free (GValue* self);
3186 +GType rygel_lms_sql_operator_get_type (void) G_GNUC_CONST;
3187 +RygelLMSSqlOperator* rygel_lms_sql_operator_new_from_search_criteria_op (GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate);
3188 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct_from_search_criteria_op (GType object_type, GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate);
3189 +RygelLMSSqlFunction* rygel_lms_sql_function_new (const gchar* name, const gchar* arg);
3190 +RygelLMSSqlFunction* rygel_lms_sql_function_construct (GType object_type, const gchar* name, const gchar* arg);
3191 +GType rygel_lms_sql_function_get_type (void) G_GNUC_CONST;
3192 +RygelLMSSqlOperator* rygel_lms_sql_operator_new (const gchar* name, const gchar* arg, const gchar* collate);
3193 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct (GType object_type, const gchar* name, const gchar* arg, const gchar* collate);
3194 +gchar* rygel_lms_sql_operator_to_string (RygelLMSSqlOperator* self);
3195 +static gchar* rygel_lms_category_container_logical_expression_to_sql (RygelLogicalExpression* expression, GValueArray* args, GError** error);
3196 +static gchar* rygel_lms_category_container_search_expression_to_sql (RygelSearchExpression* expression, GValueArray* args, GError** error);
3197 +guint rygel_lms_category_container_get_child_count_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
3198 +static guint rygel_lms_category_container_real_get_child_count_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
3199 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
3200 +GQuark rygel_lms_database_error_quark (void);
3201 +sqlite3_stmt* rygel_lms_database_prepare_and_init (RygelLMSDatabase* self, const gchar* query, GValue* arguments, int arguments_length1, GError** error);
3202 +RygelMediaObjects* rygel_lms_category_container_get_children_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
3203 +static RygelMediaObjects* rygel_lms_category_container_real_get_children_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
3204 +gboolean rygel_lms_database_get_children_step (sqlite3_stmt* stmt, GError** error);
3205 +static void rygel_lms_category_container_real_search_data_free (gpointer _data);
3206 +static void rygel_lms_category_container_real_search (RygelSearchableContainer* base, RygelSearchExpression* expression, guint offset, guint max_count, const gchar* sort_criteria, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_);
3207 +static gboolean rygel_lms_category_container_real_search_co (RygelLmsCategoryContainerSearchData* _data_);
3208 +static void rygel_lms_category_container_search_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
3209 +static void rygel_lms_category_container_real_get_children_data_free (gpointer _data);
3210 +static void rygel_lms_category_container_real_get_children (RygelMediaContainer* base, guint offset, guint max_count, const gchar* sort_criteria, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_);
3211 +static gboolean rygel_lms_category_container_real_get_children_co (RygelLmsCategoryContainerGetChildrenData* _data_);
3212 +void rygel_lms_database_get_children_init (sqlite3_stmt* stmt, guint offset, guint max_count, const gchar* sort_criteria, GError** error);
3213 +static void rygel_lms_category_container_real_find_object_data_free (gpointer _data);
3214 +static void rygel_lms_category_container_real_find_object (RygelMediaContainer* base, const gchar* id, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_);
3215 +static gboolean rygel_lms_category_container_real_find_object_co (RygelLmsCategoryContainerFindObjectData* _data_);
3216 +void rygel_lms_database_find_object (const gchar* id, sqlite3_stmt* stmt, GError** error);
3217 +static void rygel_lms_category_container_find_object_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_);
3218 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
3219 +gchar* rygel_lms_category_container_build_reference_id (RygelLMSCategoryContainer* self, gint db_id);
3220 +static void rygel_lms_category_container_real_add_child_data_free (gpointer _data);
3221 +static void rygel_lms_category_container_real_add_child (RygelTrackableContainer* base, RygelMediaObject* object, GAsyncReadyCallback _callback_, gpointer _user_data_);
3222 +static gboolean rygel_lms_category_container_real_add_child_co (RygelLmsCategoryContainerAddChildData* _data_);
3223 +static void rygel_lms_category_container_real_remove_child_data_free (gpointer _data);
3224 +static void rygel_lms_category_container_real_remove_child (RygelTrackableContainer* base, RygelMediaObject* object, GAsyncReadyCallback _callback_, gpointer _user_data_);
3225 +static gboolean rygel_lms_category_container_real_remove_child_co (RygelLmsCategoryContainerRemoveChildData* _data_);
3226 +static void rygel_lms_category_container_on_db_updated (RygelLMSCategoryContainer* self, guint64 old_id, guint64 new_id);
3227 +sqlite3_stmt* rygel_lms_database_prepare (RygelLMSDatabase* self, const gchar* query_string, GError** error);
3228 +void rygel_lms_database_get_children_with_update_id_init (sqlite3_stmt* stmt, guint64 old_id, guint64 new_id, GError** error);
3229 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
3230 +static void rygel_lms_category_container_set_lms_db (RygelLMSCategoryContainer* self, RygelLMSDatabase* value);
3231 +const gchar* rygel_lms_category_container_get_db_id (RygelLMSCategoryContainer* self);
3232 +static void rygel_lms_category_container_set_db_id (RygelLMSCategoryContainer* self, const gchar* value);
3233 +static void rygel_lms_category_container_set_sql_all (RygelLMSCategoryContainer* self, const gchar* value);
3234 +const gchar* rygel_lms_category_container_get_sql_find_object (RygelLMSCategoryContainer* self);
3235 +static void rygel_lms_category_container_set_sql_find_object (RygelLMSCategoryContainer* self, const gchar* value);
3236 +static void rygel_lms_category_container_set_sql_count (RygelLMSCategoryContainer* self, const gchar* value);
3237 +const gchar* rygel_lms_category_container_get_sql_added (RygelLMSCategoryContainer* self);
3238 +static void rygel_lms_category_container_set_sql_added (RygelLMSCategoryContainer* self, const gchar* value);
3239 +const gchar* rygel_lms_category_container_get_sql_removed (RygelLMSCategoryContainer* self);
3240 +static void rygel_lms_category_container_set_sql_removed (RygelLMSCategoryContainer* self, const gchar* value);
3241 +static GObject * rygel_lms_category_container_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
3242 +static void _rygel_lms_category_container_on_db_updated_rygel_lms_database_db_updated (RygelLMSDatabase* _sender, guint64 old_update_id, guint64 new_update_id, gpointer self);
3243 +static void rygel_lms_category_container_finalize (GObject* obj);
3244 +static void _vala_rygel_lms_category_container_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
3245 +static void _vala_rygel_lms_category_container_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
3246 +
3247 +
3248 +GQuark rygel_lms_category_container_error_quark (void) {
3249 +       return g_quark_from_static_string ("rygel_lms_category_container_error-quark");
3250 +}
3251 +
3252 +
3253 +static RygelMediaObject* rygel_lms_category_container_real_object_from_statement (RygelLMSCategoryContainer* self, sqlite3_stmt* statement) {
3254 +       g_critical ("Type `%s' does not implement abstract method `rygel_lms_category_container_object_from_statement'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
3255 +       return NULL;
3256 +}
3257 +
3258 +
3259 +RygelMediaObject* rygel_lms_category_container_object_from_statement (RygelLMSCategoryContainer* self, sqlite3_stmt* statement) {
3260 +       g_return_val_if_fail (self != NULL, NULL);
3261 +       return RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS (self)->object_from_statement (self, statement);
3262 +}
3263 +
3264 +
3265 +static gchar* rygel_lms_category_container_real_get_sql_all_with_filter (RygelLMSCategoryContainer* self, const gchar* filter) {
3266 +       gchar* result = NULL;
3267 +       const gchar* _tmp0_ = NULL;
3268 +       gchar* _tmp1_ = NULL;
3269 +       g_return_val_if_fail (filter != NULL, NULL);
3270 +       _tmp0_ = self->priv->_sql_all;
3271 +       _tmp1_ = g_strdup (_tmp0_);
3272 +       result = _tmp1_;
3273 +       return result;
3274 +}
3275 +
3276 +
3277 +gchar* rygel_lms_category_container_get_sql_all_with_filter (RygelLMSCategoryContainer* self, const gchar* filter) {
3278 +       g_return_val_if_fail (self != NULL, NULL);
3279 +       return RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS (self)->get_sql_all_with_filter (self, filter);
3280 +}
3281 +
3282 +
3283 +static gchar* rygel_lms_category_container_real_get_sql_count_with_filter (RygelLMSCategoryContainer* self, const gchar* filter) {
3284 +       gchar* result = NULL;
3285 +       const gchar* _tmp0_ = NULL;
3286 +       gchar* _tmp1_ = NULL;
3287 +       g_return_val_if_fail (filter != NULL, NULL);
3288 +       _tmp0_ = self->priv->_sql_count;
3289 +       _tmp1_ = g_strdup (_tmp0_);
3290 +       result = _tmp1_;
3291 +       return result;
3292 +}
3293 +
3294 +
3295 +gchar* rygel_lms_category_container_get_sql_count_with_filter (RygelLMSCategoryContainer* self, const gchar* filter) {
3296 +       g_return_val_if_fail (self != NULL, NULL);
3297 +       return RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS (self)->get_sql_count_with_filter (self, filter);
3298 +}
3299 +
3300 +
3301 +static gchar* rygel_lms_category_container_map_operand_to_column (const gchar* operand, gchar** collate, gboolean for_sort, GError** error) {
3302 +       gchar* _vala_collate = NULL;
3303 +       gchar* result = NULL;
3304 +       gchar* column = NULL;
3305 +       gboolean use_collation = FALSE;
3306 +       const gchar* _tmp0_ = NULL;
3307 +       const gchar* _tmp1_ = NULL;
3308 +       GQuark _tmp3_ = 0U;
3309 +       static GQuark _tmp2_label0 = 0;
3310 +       static GQuark _tmp2_label1 = 0;
3311 +       static GQuark _tmp2_label2 = 0;
3312 +       gboolean _tmp11_ = FALSE;
3313 +       GError * _inner_error_ = NULL;
3314 +       g_return_val_if_fail (operand != NULL, NULL);
3315 +       column = NULL;
3316 +       use_collation = FALSE;
3317 +       _tmp0_ = operand;
3318 +       _tmp1_ = _tmp0_;
3319 +       _tmp3_ = (NULL == _tmp1_) ? 0 : g_quark_from_string (_tmp1_);
3320 +       if (_tmp3_ == ((0 != _tmp2_label0) ? _tmp2_label0 : (_tmp2_label0 = g_quark_from_static_string ("dc:title")))) {
3321 +               switch (0) {
3322 +                       default:
3323 +                       {
3324 +                               gchar* _tmp4_ = NULL;
3325 +                               _tmp4_ = g_strdup ("title");
3326 +                               _g_free0 (column);
3327 +                               column = _tmp4_;
3328 +                               use_collation = TRUE;
3329 +                               break;
3330 +                       }
3331 +               }
3332 +       } else if (_tmp3_ == ((0 != _tmp2_label1) ? _tmp2_label1 : (_tmp2_label1 = g_quark_from_static_string ("upnp:artist")))) {
3333 +               switch (0) {
3334 +                       default:
3335 +                       {
3336 +                               gchar* _tmp5_ = NULL;
3337 +                               _tmp5_ = g_strdup ("artist");
3338 +                               _g_free0 (column);
3339 +                               column = _tmp5_;
3340 +                               use_collation = TRUE;
3341 +                               break;
3342 +                       }
3343 +               }
3344 +       } else if (_tmp3_ == ((0 != _tmp2_label2) ? _tmp2_label2 : (_tmp2_label2 = g_quark_from_static_string ("dc:creator")))) {
3345 +               switch (0) {
3346 +                       default:
3347 +                       {
3348 +                               gchar* _tmp6_ = NULL;
3349 +                               _tmp6_ = g_strdup ("creator");
3350 +                               _g_free0 (column);
3351 +                               column = _tmp6_;
3352 +                               use_collation = TRUE;
3353 +                               break;
3354 +                       }
3355 +               }
3356 +       } else {
3357 +               switch (0) {
3358 +                       default:
3359 +                       {
3360 +                               gchar* message = NULL;
3361 +                               const gchar* _tmp7_ = NULL;
3362 +                               gchar* _tmp8_ = NULL;
3363 +                               const gchar* _tmp9_ = NULL;
3364 +                               GError* _tmp10_ = NULL;
3365 +                               _tmp7_ = operand;
3366 +                               _tmp8_ = g_strdup_printf ("Unsupported column %s", _tmp7_);
3367 +                               message = _tmp8_;
3368 +                               _tmp9_ = message;
3369 +                               _tmp10_ = g_error_new_literal (RYGEL_LMS_CATEGORY_CONTAINER_ERROR, RYGEL_LMS_CATEGORY_CONTAINER_ERROR_UNSUPPORTED_SEARCH, _tmp9_);
3370 +                               _inner_error_ = _tmp10_;
3371 +                               g_propagate_error (error, _inner_error_);
3372 +                               _g_free0 (message);
3373 +                               _g_free0 (column);
3374 +                               return NULL;
3375 +                       }
3376 +               }
3377 +       }
3378 +       _tmp11_ = use_collation;
3379 +       if (_tmp11_) {
3380 +               gchar* _tmp12_ = NULL;
3381 +               _tmp12_ = g_strdup ("COLLATE CASEFOLD");
3382 +               _g_free0 (_vala_collate);
3383 +               _vala_collate = _tmp12_;
3384 +       } else {
3385 +               gchar* _tmp13_ = NULL;
3386 +               _tmp13_ = g_strdup ("");
3387 +               _g_free0 (_vala_collate);
3388 +               _vala_collate = _tmp13_;
3389 +       }
3390 +       result = column;
3391 +       if (collate) {
3392 +               *collate = _vala_collate;
3393 +       } else {
3394 +               _g_free0 (_vala_collate);
3395 +       }
3396 +       return result;
3397 +}
3398 +
3399 +
3400 +static void _vala_GValue_free (GValue* self) {
3401 +       g_value_unset (self);
3402 +       g_free (self);
3403 +}
3404 +
3405 +
3406 +static gchar* rygel_lms_category_container_relational_expression_to_sql (RygelRelationalExpression* exp, GValueArray* args, GError** error) {
3407 +       gchar* result = NULL;
3408 +       GValue* v = NULL;
3409 +       gchar* collate = NULL;
3410 +       gchar* column = NULL;
3411 +       RygelRelationalExpression* _tmp0_ = NULL;
3412 +       gconstpointer _tmp1_ = NULL;
3413 +       gchar* _tmp2_ = NULL;
3414 +       gchar* _tmp3_ = NULL;
3415 +       RygelLMSSqlOperator* operator = NULL;
3416 +       RygelRelationalExpression* _tmp4_ = NULL;
3417 +       gconstpointer _tmp5_ = NULL;
3418 +       GValue* _tmp40_ = NULL;
3419 +       RygelLMSSqlOperator* _tmp44_ = NULL;
3420 +       gchar* _tmp45_ = NULL;
3421 +       GError * _inner_error_ = NULL;
3422 +       g_return_val_if_fail (exp != NULL, NULL);
3423 +       g_return_val_if_fail (args != NULL, NULL);
3424 +       v = NULL;
3425 +       collate = NULL;
3426 +       _tmp0_ = exp;
3427 +       _tmp1_ = ((RygelSearchExpression*) _tmp0_)->operand1;
3428 +       _tmp3_ = rygel_lms_category_container_map_operand_to_column ((const gchar*) _tmp1_, &_tmp2_, FALSE, &_inner_error_);
3429 +       _g_free0 (collate);
3430 +       collate = _tmp2_;
3431 +       column = _tmp3_;
3432 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
3433 +               g_propagate_error (error, _inner_error_);
3434 +               _g_free0 (collate);
3435 +               __vala_GValue_free0 (v);
3436 +               return NULL;
3437 +       }
3438 +       _tmp4_ = exp;
3439 +       _tmp5_ = ((RygelSearchExpression*) _tmp4_)->op;
3440 +       switch ((GUPnPSearchCriteriaOp) ((gintptr) _tmp5_)) {
3441 +               case GUPNP_SEARCH_CRITERIA_OP_EXISTS:
3442 +               {
3443 +                       gchar* sql_function = NULL;
3444 +                       RygelRelationalExpression* _tmp6_ = NULL;
3445 +                       gconstpointer _tmp7_ = NULL;
3446 +                       const gchar* _tmp10_ = NULL;
3447 +                       const gchar* _tmp11_ = NULL;
3448 +                       const gchar* _tmp12_ = NULL;
3449 +                       gchar* _tmp13_ = NULL;
3450 +                       _tmp6_ = exp;
3451 +                       _tmp7_ = ((RygelSearchExpression*) _tmp6_)->operand2;
3452 +                       if (g_strcmp0 ((const gchar*) _tmp7_, "true") == 0) {
3453 +                               gchar* _tmp8_ = NULL;
3454 +                               _tmp8_ = g_strdup ("%s IS NOT NULL AND %s != ''");
3455 +                               _g_free0 (sql_function);
3456 +                               sql_function = _tmp8_;
3457 +                       } else {
3458 +                               gchar* _tmp9_ = NULL;
3459 +                               _tmp9_ = g_strdup ("%s IS NULL OR %s = ''");
3460 +                               _g_free0 (sql_function);
3461 +                               sql_function = _tmp9_;
3462 +                       }
3463 +                       _tmp10_ = sql_function;
3464 +                       _tmp11_ = column;
3465 +                       _tmp12_ = column;
3466 +                       _tmp13_ = g_strdup_printf (_tmp10_, _tmp11_, _tmp12_);
3467 +                       result = _tmp13_;
3468 +                       _g_free0 (sql_function);
3469 +                       _g_object_unref0 (operator);
3470 +                       _g_free0 (column);
3471 +                       _g_free0 (collate);
3472 +                       __vala_GValue_free0 (v);
3473 +                       return result;
3474 +               }
3475 +               case GUPNP_SEARCH_CRITERIA_OP_EQ:
3476 +               case GUPNP_SEARCH_CRITERIA_OP_NEQ:
3477 +               case GUPNP_SEARCH_CRITERIA_OP_LESS:
3478 +               case GUPNP_SEARCH_CRITERIA_OP_LEQ:
3479 +               case GUPNP_SEARCH_CRITERIA_OP_GREATER:
3480 +               case GUPNP_SEARCH_CRITERIA_OP_GEQ:
3481 +               {
3482 +                       RygelRelationalExpression* _tmp14_ = NULL;
3483 +                       gconstpointer _tmp15_ = NULL;
3484 +                       GValue* _tmp16_ = NULL;
3485 +                       RygelRelationalExpression* _tmp17_ = NULL;
3486 +                       gconstpointer _tmp18_ = NULL;
3487 +                       const gchar* _tmp19_ = NULL;
3488 +                       const gchar* _tmp20_ = NULL;
3489 +                       RygelLMSSqlOperator* _tmp21_ = NULL;
3490 +                       _tmp14_ = exp;
3491 +                       _tmp15_ = ((RygelSearchExpression*) _tmp14_)->operand2;
3492 +                       _tmp16_ = g_new0 (GValue, 1);
3493 +                       g_value_init (_tmp16_, G_TYPE_STRING);
3494 +                       g_value_set_string (_tmp16_, (const gchar*) _tmp15_);
3495 +                       __vala_GValue_free0 (v);
3496 +                       v = _tmp16_;
3497 +                       _tmp17_ = exp;
3498 +                       _tmp18_ = ((RygelSearchExpression*) _tmp17_)->op;
3499 +                       _tmp19_ = column;
3500 +                       _tmp20_ = collate;
3501 +                       _tmp21_ = rygel_lms_sql_operator_new_from_search_criteria_op ((GUPnPSearchCriteriaOp) ((gintptr) _tmp18_), _tmp19_, _tmp20_);
3502 +                       _g_object_unref0 (operator);
3503 +                       operator = _tmp21_;
3504 +                       break;
3505 +               }
3506 +               case GUPNP_SEARCH_CRITERIA_OP_CONTAINS:
3507 +               {
3508 +                       const gchar* _tmp22_ = NULL;
3509 +                       RygelLMSSqlFunction* _tmp23_ = NULL;
3510 +                       RygelRelationalExpression* _tmp24_ = NULL;
3511 +                       gconstpointer _tmp25_ = NULL;
3512 +                       GValue* _tmp26_ = NULL;
3513 +                       _tmp22_ = column;
3514 +                       _tmp23_ = rygel_lms_sql_function_new ("contains", _tmp22_);
3515 +                       _g_object_unref0 (operator);
3516 +                       operator = (RygelLMSSqlOperator*) _tmp23_;
3517 +                       _tmp24_ = exp;
3518 +                       _tmp25_ = ((RygelSearchExpression*) _tmp24_)->operand2;
3519 +                       _tmp26_ = g_new0 (GValue, 1);
3520 +                       g_value_init (_tmp26_, G_TYPE_STRING);
3521 +                       g_value_set_string (_tmp26_, (const gchar*) _tmp25_);
3522 +                       __vala_GValue_free0 (v);
3523 +                       v = _tmp26_;
3524 +                       break;
3525 +               }
3526 +               case GUPNP_SEARCH_CRITERIA_OP_DOES_NOT_CONTAIN:
3527 +               {
3528 +                       const gchar* _tmp27_ = NULL;
3529 +                       RygelLMSSqlFunction* _tmp28_ = NULL;
3530 +                       RygelRelationalExpression* _tmp29_ = NULL;
3531 +                       gconstpointer _tmp30_ = NULL;
3532 +                       GValue* _tmp31_ = NULL;
3533 +                       _tmp27_ = column;
3534 +                       _tmp28_ = rygel_lms_sql_function_new ("NOT contains", _tmp27_);
3535 +                       _g_object_unref0 (operator);
3536 +                       operator = (RygelLMSSqlOperator*) _tmp28_;
3537 +                       _tmp29_ = exp;
3538 +                       _tmp30_ = ((RygelSearchExpression*) _tmp29_)->operand2;
3539 +                       _tmp31_ = g_new0 (GValue, 1);
3540 +                       g_value_init (_tmp31_, G_TYPE_STRING);
3541 +                       g_value_set_string (_tmp31_, (const gchar*) _tmp30_);
3542 +                       __vala_GValue_free0 (v);
3543 +                       v = _tmp31_;
3544 +                       break;
3545 +               }
3546 +               case GUPNP_SEARCH_CRITERIA_OP_DERIVED_FROM:
3547 +               {
3548 +                       const gchar* _tmp32_ = NULL;
3549 +                       RygelLMSSqlOperator* _tmp33_ = NULL;
3550 +                       RygelRelationalExpression* _tmp34_ = NULL;
3551 +                       gconstpointer _tmp35_ = NULL;
3552 +                       gchar* _tmp36_ = NULL;
3553 +                       GValue* _tmp37_ = NULL;
3554 +                       _tmp32_ = column;
3555 +                       _tmp33_ = rygel_lms_sql_operator_new ("LIKE", _tmp32_, "");
3556 +                       _g_object_unref0 (operator);
3557 +                       operator = _tmp33_;
3558 +                       _tmp34_ = exp;
3559 +                       _tmp35_ = ((RygelSearchExpression*) _tmp34_)->operand2;
3560 +                       _tmp36_ = g_strdup_printf ("%s%%", (const gchar*) _tmp35_);
3561 +                       _tmp37_ = g_new0 (GValue, 1);
3562 +                       g_value_init (_tmp37_, G_TYPE_STRING);
3563 +                       g_value_take_string (_tmp37_, _tmp36_);
3564 +                       __vala_GValue_free0 (v);
3565 +                       v = _tmp37_;
3566 +                       break;
3567 +               }
3568 +               default:
3569 +               {
3570 +                       RygelRelationalExpression* _tmp38_ = NULL;
3571 +                       gconstpointer _tmp39_ = NULL;
3572 +                       _tmp38_ = exp;
3573 +                       _tmp39_ = ((RygelSearchExpression*) _tmp38_)->op;
3574 +                       g_warning ("rygel-lms-category-container.vala:148: Unsupported op %d", (gint) ((GUPnPSearchCriteriaOp) ((gintptr) _tmp39_)));
3575 +                       result = NULL;
3576 +                       _g_object_unref0 (operator);
3577 +                       _g_free0 (column);
3578 +                       _g_free0 (collate);
3579 +                       __vala_GValue_free0 (v);
3580 +                       return result;
3581 +               }
3582 +       }
3583 +       _tmp40_ = v;
3584 +       if (_tmp40_ != NULL) {
3585 +               GValueArray* _tmp41_ = NULL;
3586 +               GValue* _tmp42_ = NULL;
3587 +               GValue _tmp43_ = {0};
3588 +               _tmp41_ = args;
3589 +               _tmp42_ = v;
3590 +               _tmp43_ = *_tmp42_;
3591 +               g_value_array_append (_tmp41_, &_tmp43_);
3592 +       }
3593 +       _tmp44_ = operator;
3594 +       _tmp45_ = rygel_lms_sql_operator_to_string (_tmp44_);
3595 +       result = _tmp45_;
3596 +       _g_object_unref0 (operator);
3597 +       _g_free0 (column);
3598 +       _g_free0 (collate);
3599 +       __vala_GValue_free0 (v);
3600 +       return result;
3601 +}
3602 +
3603 +
3604 +static gchar* rygel_lms_category_container_logical_expression_to_sql (RygelLogicalExpression* expression, GValueArray* args, GError** error) {
3605 +       gchar* result = NULL;
3606 +       gchar* left_sql_string = NULL;
3607 +       RygelLogicalExpression* _tmp0_ = NULL;
3608 +       gconstpointer _tmp1_ = NULL;
3609 +       GValueArray* _tmp2_ = NULL;
3610 +       gchar* _tmp3_ = NULL;
3611 +       gchar* right_sql_string = NULL;
3612 +       RygelLogicalExpression* _tmp4_ = NULL;
3613 +       gconstpointer _tmp5_ = NULL;
3614 +       GValueArray* _tmp6_ = NULL;
3615 +       gchar* _tmp7_ = NULL;
3616 +       const gchar* operator_sql_string = NULL;
3617 +       RygelLogicalExpression* _tmp8_ = NULL;
3618 +       gconstpointer _tmp9_ = NULL;
3619 +       const gchar* _tmp10_ = NULL;
3620 +       const gchar* _tmp11_ = NULL;
3621 +       const gchar* _tmp12_ = NULL;
3622 +       gchar* _tmp13_ = NULL;
3623 +       GError * _inner_error_ = NULL;
3624 +       g_return_val_if_fail (expression != NULL, NULL);
3625 +       g_return_val_if_fail (args != NULL, NULL);
3626 +       _tmp0_ = expression;
3627 +       _tmp1_ = ((RygelSearchExpression*) _tmp0_)->operand1;
3628 +       _tmp2_ = args;
3629 +       _tmp3_ = rygel_lms_category_container_search_expression_to_sql ((RygelSearchExpression*) _tmp1_, _tmp2_, &_inner_error_);
3630 +       left_sql_string = _tmp3_;
3631 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
3632 +               g_propagate_error (error, _inner_error_);
3633 +               return NULL;
3634 +       }
3635 +       _tmp4_ = expression;
3636 +       _tmp5_ = ((RygelSearchExpression*) _tmp4_)->operand2;
3637 +       _tmp6_ = args;
3638 +       _tmp7_ = rygel_lms_category_container_search_expression_to_sql ((RygelSearchExpression*) _tmp5_, _tmp6_, &_inner_error_);
3639 +       right_sql_string = _tmp7_;
3640 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
3641 +               g_propagate_error (error, _inner_error_);
3642 +               _g_free0 (left_sql_string);
3643 +               return NULL;
3644 +       }
3645 +       operator_sql_string = "OR";
3646 +       _tmp8_ = expression;
3647 +       _tmp9_ = ((RygelSearchExpression*) _tmp8_)->op;
3648 +       if (((RygelLogicalOperator) ((gintptr) _tmp9_)) == RYGEL_LOGICAL_OPERATOR_AND) {
3649 +               operator_sql_string = "AND";
3650 +       }
3651 +       _tmp10_ = left_sql_string;
3652 +       _tmp11_ = operator_sql_string;
3653 +       _tmp12_ = right_sql_string;
3654 +       _tmp13_ = g_strdup_printf ("(%s %s %s)", _tmp10_, _tmp11_, _tmp12_);
3655 +       result = _tmp13_;
3656 +       _g_free0 (right_sql_string);
3657 +       _g_free0 (left_sql_string);
3658 +       return result;
3659 +}
3660 +
3661 +
3662 +static gchar* rygel_lms_category_container_search_expression_to_sql (RygelSearchExpression* expression, GValueArray* args, GError** error) {
3663 +       gchar* result = NULL;
3664 +       RygelSearchExpression* _tmp0_ = NULL;
3665 +       RygelSearchExpression* _tmp2_ = NULL;
3666 +       GError * _inner_error_ = NULL;
3667 +       g_return_val_if_fail (args != NULL, NULL);
3668 +       _tmp0_ = expression;
3669 +       if (_tmp0_ == NULL) {
3670 +               gchar* _tmp1_ = NULL;
3671 +               _tmp1_ = g_strdup ("");
3672 +               result = _tmp1_;
3673 +               return result;
3674 +       }
3675 +       _tmp2_ = expression;
3676 +       if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp2_, RYGEL_TYPE_LOGICAL_EXPRESSION)) {
3677 +               gchar* _tmp3_ = NULL;
3678 +               RygelSearchExpression* _tmp4_ = NULL;
3679 +               GValueArray* _tmp5_ = NULL;
3680 +               gchar* _tmp6_ = NULL;
3681 +               gchar* _tmp7_ = NULL;
3682 +               _tmp4_ = expression;
3683 +               _tmp5_ = args;
3684 +               _tmp6_ = rygel_lms_category_container_logical_expression_to_sql (G_TYPE_CHECK_INSTANCE_TYPE (_tmp4_, RYGEL_TYPE_LOGICAL_EXPRESSION) ? ((RygelLogicalExpression*) _tmp4_) : NULL, _tmp5_, &_inner_error_);
3685 +               _tmp3_ = _tmp6_;
3686 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
3687 +                       g_propagate_error (error, _inner_error_);
3688 +                       return NULL;
3689 +               }
3690 +               _tmp7_ = _tmp3_;
3691 +               _tmp3_ = NULL;
3692 +               result = _tmp7_;
3693 +               _g_free0 (_tmp3_);
3694 +               return result;
3695 +       } else {
3696 +               gchar* _tmp8_ = NULL;
3697 +               RygelSearchExpression* _tmp9_ = NULL;
3698 +               GValueArray* _tmp10_ = NULL;
3699 +               gchar* _tmp11_ = NULL;
3700 +               gchar* _tmp12_ = NULL;
3701 +               _tmp9_ = expression;
3702 +               _tmp10_ = args;
3703 +               _tmp11_ = rygel_lms_category_container_relational_expression_to_sql (G_TYPE_CHECK_INSTANCE_TYPE (_tmp9_, RYGEL_TYPE_RELATIONAL_EXPRESSION) ? ((RygelRelationalExpression*) _tmp9_) : NULL, _tmp10_, &_inner_error_);
3704 +               _tmp8_ = _tmp11_;
3705 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
3706 +                       g_propagate_error (error, _inner_error_);
3707 +                       return NULL;
3708 +               }
3709 +               _tmp12_ = _tmp8_;
3710 +               _tmp8_ = NULL;
3711 +               result = _tmp12_;
3712 +               _g_free0 (_tmp8_);
3713 +               return result;
3714 +       }
3715 +}
3716 +
3717 +
3718 +static guint rygel_lms_category_container_real_get_child_count_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args) {
3719 +       guint result = 0U;
3720 +       gchar* query = NULL;
3721 +       const gchar* _tmp0_ = NULL;
3722 +       gchar* _tmp1_ = NULL;
3723 +       GError * _inner_error_ = NULL;
3724 +       g_return_val_if_fail (where_filter != NULL, 0U);
3725 +       g_return_val_if_fail (args != NULL, 0U);
3726 +       _tmp0_ = where_filter;
3727 +       _tmp1_ = rygel_lms_category_container_get_sql_count_with_filter (self, _tmp0_);
3728 +       query = _tmp1_;
3729 +       {
3730 +               sqlite3_stmt* stmt = NULL;
3731 +               RygelLMSDatabase* _tmp2_ = NULL;
3732 +               const gchar* _tmp3_ = NULL;
3733 +               GValueArray* _tmp4_ = NULL;
3734 +               GValue* _tmp5_ = NULL;
3735 +               gint _tmp5__length1 = 0;
3736 +               sqlite3_stmt* _tmp6_ = NULL;
3737 +               sqlite3_stmt* _tmp7_ = NULL;
3738 +               gint _tmp8_ = 0;
3739 +               sqlite3_stmt* _tmp9_ = NULL;
3740 +               gint _tmp10_ = 0;
3741 +               _tmp2_ = self->priv->_lms_db;
3742 +               _tmp3_ = query;
3743 +               _tmp4_ = args;
3744 +               _tmp5_ = _tmp4_->values;
3745 +               _tmp5__length1 = (gint) _tmp4_->n_values;
3746 +               _tmp6_ = rygel_lms_database_prepare_and_init (_tmp2_, _tmp3_, _tmp5_, _tmp5__length1, &_inner_error_);
3747 +               stmt = _tmp6_;
3748 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
3749 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
3750 +                               goto __catch2_rygel_lms_database_error;
3751 +                       }
3752 +                       _g_free0 (query);
3753 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3754 +                       g_clear_error (&_inner_error_);
3755 +                       return 0U;
3756 +               }
3757 +               _tmp7_ = stmt;
3758 +               _tmp8_ = sqlite3_step (_tmp7_);
3759 +               if (_tmp8_ != SQLITE_ROW) {
3760 +                       result = (guint) 0;
3761 +                       _sqlite3_finalize0 (stmt);
3762 +                       _g_free0 (query);
3763 +                       return result;
3764 +               }
3765 +               _tmp9_ = stmt;
3766 +               _tmp10_ = sqlite3_column_int (_tmp9_, 0);
3767 +               result = (guint) _tmp10_;
3768 +               _sqlite3_finalize0 (stmt);
3769 +               _g_free0 (query);
3770 +               return result;
3771 +       }
3772 +       goto __finally2;
3773 +       __catch2_rygel_lms_database_error:
3774 +       {
3775 +               GError* e = NULL;
3776 +               GError* _tmp11_ = NULL;
3777 +               const gchar* _tmp12_ = NULL;
3778 +               e = _inner_error_;
3779 +               _inner_error_ = NULL;
3780 +               _tmp11_ = e;
3781 +               _tmp12_ = _tmp11_->message;
3782 +               g_warning ("rygel-lms-category-container.vala:209: Query failed: %s", _tmp12_);
3783 +               result = (guint) 0;
3784 +               _g_error_free0 (e);
3785 +               _g_free0 (query);
3786 +               return result;
3787 +       }
3788 +       __finally2:
3789 +       _g_free0 (query);
3790 +       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3791 +       g_clear_error (&_inner_error_);
3792 +       return 0U;
3793 +}
3794 +
3795 +
3796 +guint rygel_lms_category_container_get_child_count_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args) {
3797 +       g_return_val_if_fail (self != NULL, 0U);
3798 +       return RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS (self)->get_child_count_with_filter (self, where_filter, args);
3799 +}
3800 +
3801 +
3802 +static RygelMediaObjects* rygel_lms_category_container_real_get_children_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count) {
3803 +       RygelMediaObjects* result = NULL;
3804 +       RygelMediaObjects* children = NULL;
3805 +       RygelMediaObjects* _tmp0_ = NULL;
3806 +       GValue v = {0};
3807 +       guint _tmp1_ = 0U;
3808 +       GValue _tmp2_ = {0};
3809 +       GValueArray* _tmp3_ = NULL;
3810 +       GValue _tmp4_ = {0};
3811 +       guint _tmp5_ = 0U;
3812 +       GValue _tmp6_ = {0};
3813 +       GValueArray* _tmp7_ = NULL;
3814 +       GValue _tmp8_ = {0};
3815 +       gchar* query = NULL;
3816 +       const gchar* _tmp9_ = NULL;
3817 +       gchar* _tmp10_ = NULL;
3818 +       GError * _inner_error_ = NULL;
3819 +       g_return_val_if_fail (where_filter != NULL, NULL);
3820 +       g_return_val_if_fail (args != NULL, NULL);
3821 +       g_return_val_if_fail (sort_criteria != NULL, NULL);
3822 +       _tmp0_ = rygel_media_objects_new ();
3823 +       children = _tmp0_;
3824 +       _tmp1_ = max_count;
3825 +       g_value_init (&_tmp2_, G_TYPE_UINT);
3826 +       g_value_set_uint (&_tmp2_, _tmp1_);
3827 +       v = _tmp2_;
3828 +       _tmp3_ = args;
3829 +       _tmp4_ = v;
3830 +       g_value_array_append (_tmp3_, &_tmp4_);
3831 +       _tmp5_ = offset;
3832 +       g_value_init (&_tmp6_, G_TYPE_UINT);
3833 +       g_value_set_uint (&_tmp6_, _tmp5_);
3834 +       G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
3835 +       v = _tmp6_;
3836 +       _tmp7_ = args;
3837 +       _tmp8_ = v;
3838 +       g_value_array_append (_tmp7_, &_tmp8_);
3839 +       _tmp9_ = where_filter;
3840 +       _tmp10_ = rygel_lms_category_container_get_sql_all_with_filter (self, _tmp9_);
3841 +       query = _tmp10_;
3842 +       {
3843 +               sqlite3_stmt* stmt = NULL;
3844 +               RygelLMSDatabase* _tmp11_ = NULL;
3845 +               const gchar* _tmp12_ = NULL;
3846 +               GValueArray* _tmp13_ = NULL;
3847 +               GValue* _tmp14_ = NULL;
3848 +               gint _tmp14__length1 = 0;
3849 +               sqlite3_stmt* _tmp15_ = NULL;
3850 +               _tmp11_ = self->priv->_lms_db;
3851 +               _tmp12_ = query;
3852 +               _tmp13_ = args;
3853 +               _tmp14_ = _tmp13_->values;
3854 +               _tmp14__length1 = (gint) _tmp13_->n_values;
3855 +               _tmp15_ = rygel_lms_database_prepare_and_init (_tmp11_, _tmp12_, _tmp14_, _tmp14__length1, &_inner_error_);
3856 +               stmt = _tmp15_;
3857 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
3858 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
3859 +                               goto __catch3_rygel_lms_database_error;
3860 +                       }
3861 +                       _g_free0 (query);
3862 +                       G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
3863 +                       _g_object_unref0 (children);
3864 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3865 +                       g_clear_error (&_inner_error_);
3866 +                       return NULL;
3867 +               }
3868 +               while (TRUE) {
3869 +                       gboolean _tmp16_ = FALSE;
3870 +                       sqlite3_stmt* _tmp17_ = NULL;
3871 +                       gboolean _tmp18_ = FALSE;
3872 +                       RygelMediaObjects* _tmp19_ = NULL;
3873 +                       sqlite3_stmt* _tmp20_ = NULL;
3874 +                       RygelMediaObject* _tmp21_ = NULL;
3875 +                       RygelMediaObject* _tmp22_ = NULL;
3876 +                       _tmp17_ = stmt;
3877 +                       _tmp18_ = rygel_lms_database_get_children_step (_tmp17_, &_inner_error_);
3878 +                       _tmp16_ = _tmp18_;
3879 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
3880 +                               _sqlite3_finalize0 (stmt);
3881 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
3882 +                                       goto __catch3_rygel_lms_database_error;
3883 +                               }
3884 +                               _sqlite3_finalize0 (stmt);
3885 +                               _g_free0 (query);
3886 +                               G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
3887 +                               _g_object_unref0 (children);
3888 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3889 +                               g_clear_error (&_inner_error_);
3890 +                               return NULL;
3891 +                       }
3892 +                       if (!_tmp16_) {
3893 +                               break;
3894 +                       }
3895 +                       _tmp19_ = children;
3896 +                       _tmp20_ = stmt;
3897 +                       _tmp21_ = rygel_lms_category_container_object_from_statement (self, _tmp20_);
3898 +                       _tmp22_ = _tmp21_;
3899 +                       gee_abstract_collection_add ((GeeAbstractCollection*) _tmp19_, _tmp22_);
3900 +                       _g_object_unref0 (_tmp22_);
3901 +               }
3902 +               _sqlite3_finalize0 (stmt);
3903 +       }
3904 +       goto __finally3;
3905 +       __catch3_rygel_lms_database_error:
3906 +       {
3907 +               GError* e = NULL;
3908 +               GError* _tmp23_ = NULL;
3909 +               const gchar* _tmp24_ = NULL;
3910 +               e = _inner_error_;
3911 +               _inner_error_ = NULL;
3912 +               _tmp23_ = e;
3913 +               _tmp24_ = _tmp23_->message;
3914 +               g_warning ("rygel-lms-category-container.vala:232: Query failed: %s", _tmp24_);
3915 +               _g_error_free0 (e);
3916 +       }
3917 +       __finally3:
3918 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
3919 +               _g_free0 (query);
3920 +               G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
3921 +               _g_object_unref0 (children);
3922 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
3923 +               g_clear_error (&_inner_error_);
3924 +               return NULL;
3925 +       }
3926 +       result = children;
3927 +       _g_free0 (query);
3928 +       G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
3929 +       return result;
3930 +}
3931 +
3932 +
3933 +RygelMediaObjects* rygel_lms_category_container_get_children_with_filter (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count) {
3934 +       g_return_val_if_fail (self != NULL, NULL);
3935 +       return RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS (self)->get_children_with_filter (self, where_filter, args, sort_criteria, offset, max_count);
3936 +}
3937 +
3938 +
3939 +static void rygel_lms_category_container_real_search_data_free (gpointer _data) {
3940 +       RygelLmsCategoryContainerSearchData* _data_;
3941 +       _data_ = _data;
3942 +       _rygel_search_expression_unref0 (_data_->expression);
3943 +       _g_free0 (_data_->sort_criteria);
3944 +       _g_object_unref0 (_data_->cancellable);
3945 +       _g_object_unref0 (_data_->result);
3946 +       _g_object_unref0 (_data_->self);
3947 +       g_slice_free (RygelLmsCategoryContainerSearchData, _data_);
3948 +}
3949 +
3950 +
3951 +static gpointer _g_object_ref0 (gpointer self) {
3952 +       return self ? g_object_ref (self) : NULL;
3953 +}
3954 +
3955 +
3956 +static gpointer _rygel_search_expression_ref0 (gpointer self) {
3957 +       return self ? rygel_search_expression_ref (self) : NULL;
3958 +}
3959 +
3960 +
3961 +static void rygel_lms_category_container_real_search (RygelSearchableContainer* base, RygelSearchExpression* expression, guint offset, guint max_count, const gchar* sort_criteria, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_) {
3962 +       RygelLMSCategoryContainer * self;
3963 +       RygelLmsCategoryContainerSearchData* _data_;
3964 +       RygelLMSCategoryContainer* _tmp0_ = NULL;
3965 +       RygelSearchExpression* _tmp1_ = NULL;
3966 +       RygelSearchExpression* _tmp2_ = NULL;
3967 +       guint _tmp3_ = 0U;
3968 +       guint _tmp4_ = 0U;
3969 +       const gchar* _tmp5_ = NULL;
3970 +       gchar* _tmp6_ = NULL;
3971 +       GCancellable* _tmp7_ = NULL;
3972 +       GCancellable* _tmp8_ = NULL;
3973 +       self = (RygelLMSCategoryContainer*) base;
3974 +       _data_ = g_slice_new0 (RygelLmsCategoryContainerSearchData);
3975 +       _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, rygel_lms_category_container_real_search);
3976 +       g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, rygel_lms_category_container_real_search_data_free);
3977 +       _tmp0_ = _g_object_ref0 (self);
3978 +       _data_->self = _tmp0_;
3979 +       _tmp1_ = expression;
3980 +       _tmp2_ = _rygel_search_expression_ref0 (_tmp1_);
3981 +       _rygel_search_expression_unref0 (_data_->expression);
3982 +       _data_->expression = _tmp2_;
3983 +       _tmp3_ = offset;
3984 +       _data_->offset = _tmp3_;
3985 +       _tmp4_ = max_count;
3986 +       _data_->max_count = _tmp4_;
3987 +       _tmp5_ = sort_criteria;
3988 +       _tmp6_ = g_strdup (_tmp5_);
3989 +       _g_free0 (_data_->sort_criteria);
3990 +       _data_->sort_criteria = _tmp6_;
3991 +       _tmp7_ = cancellable;
3992 +       _tmp8_ = _g_object_ref0 (_tmp7_);
3993 +       _g_object_unref0 (_data_->cancellable);
3994 +       _data_->cancellable = _tmp8_;
3995 +       rygel_lms_category_container_real_search_co (_data_);
3996 +}
3997 +
3998 +
3999 +static RygelMediaObjects* rygel_lms_category_container_real_search_finish (RygelSearchableContainer* base, GAsyncResult* _res_, guint* total_matches, GError** error) {
4000 +       RygelMediaObjects* result;
4001 +       RygelLmsCategoryContainerSearchData* _data_;
4002 +       if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
4003 +               return NULL;
4004 +       }
4005 +       _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
4006 +       if (total_matches) {
4007 +               *total_matches = _data_->total_matches;
4008 +       }
4009 +       result = _data_->result;
4010 +       _data_->result = NULL;
4011 +       return result;
4012 +}
4013 +
4014 +
4015 +static void rygel_lms_category_container_search_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
4016 +       RygelLmsCategoryContainerSearchData* _data_;
4017 +       _data_ = _user_data_;
4018 +       _data_->_source_object_ = source_object;
4019 +       _data_->_res_ = _res_;
4020 +       rygel_lms_category_container_real_search_co (_data_);
4021 +}
4022 +
4023 +
4024 +static gboolean rygel_lms_category_container_real_search_co (RygelLmsCategoryContainerSearchData* _data_) {
4025 +       switch (_data_->_state_) {
4026 +               case 0:
4027 +               goto _state_0;
4028 +               case 1:
4029 +               goto _state_1;
4030 +               default:
4031 +               g_assert_not_reached ();
4032 +       }
4033 +       _state_0:
4034 +       g_debug ("rygel-lms-category-container.vala:245: search()");
4035 +       {
4036 +               _data_->_tmp0_ = NULL;
4037 +               _data_->_tmp0_ = g_value_array_new ((guint) 0);
4038 +               _data_->args = _data_->_tmp0_;
4039 +               _data_->_tmp1_ = NULL;
4040 +               _data_->_tmp1_ = _data_->expression;
4041 +               _data_->_tmp2_ = NULL;
4042 +               _data_->_tmp2_ = _data_->args;
4043 +               _data_->_tmp3_ = NULL;
4044 +               _data_->_tmp3_ = rygel_lms_category_container_search_expression_to_sql (_data_->_tmp1_, _data_->_tmp2_, &_data_->_inner_error_);
4045 +               _data_->filter = _data_->_tmp3_;
4046 +               if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4047 +                       _g_value_array_free0 (_data_->args);
4048 +                       goto __catch4_g_error;
4049 +               }
4050 +               _data_->_tmp4_ = NULL;
4051 +               _data_->_tmp4_ = _data_->filter;
4052 +               _data_->_tmp5_ = NULL;
4053 +               _data_->_tmp5_ = _data_->args;
4054 +               _data_->_tmp6_ = 0U;
4055 +               _data_->_tmp6_ = rygel_lms_category_container_get_child_count_with_filter (_data_->self, _data_->_tmp4_, _data_->_tmp5_);
4056 +               _data_->total_matches = _data_->_tmp6_;
4057 +               _data_->_tmp7_ = NULL;
4058 +               _data_->_tmp7_ = _data_->expression;
4059 +               if (_data_->_tmp7_ != NULL) {
4060 +                       _data_->_tmp8_ = NULL;
4061 +                       _data_->_tmp8_ = _data_->expression;
4062 +                       _data_->_tmp9_ = NULL;
4063 +                       _data_->_tmp9_ = rygel_search_expression_to_string (_data_->_tmp8_);
4064 +                       _data_->_tmp10_ = NULL;
4065 +                       _data_->_tmp10_ = _data_->_tmp9_;
4066 +                       g_debug ("rygel-lms-category-container.vala:253:   Original search: %s", _data_->_tmp10_);
4067 +                       _g_free0 (_data_->_tmp10_);
4068 +                       _data_->_tmp11_ = NULL;
4069 +                       _data_->_tmp11_ = _data_->filter;
4070 +                       g_debug ("rygel-lms-category-container.vala:254:   Parsed search expression: %s", _data_->_tmp11_);
4071 +                       _data_->_tmp12_ = 0U;
4072 +                       _data_->_tmp12_ = _data_->total_matches;
4073 +                       g_debug ("rygel-lms-category-container.vala:255:   Filtered cild count is %u", _data_->_tmp12_);
4074 +               }
4075 +               _data_->_tmp13_ = 0U;
4076 +               _data_->_tmp13_ = _data_->max_count;
4077 +               if (_data_->_tmp13_ == ((guint) 0)) {
4078 +                       _data_->max_count = G_MAXUINT;
4079 +               }
4080 +               _data_->_tmp14_ = NULL;
4081 +               _data_->_tmp14_ = _data_->filter;
4082 +               _data_->_tmp15_ = NULL;
4083 +               _data_->_tmp15_ = _data_->args;
4084 +               _data_->_tmp16_ = NULL;
4085 +               _data_->_tmp16_ = _data_->sort_criteria;
4086 +               _data_->_tmp17_ = 0U;
4087 +               _data_->_tmp17_ = _data_->offset;
4088 +               _data_->_tmp18_ = 0U;
4089 +               _data_->_tmp18_ = _data_->max_count;
4090 +               _data_->_tmp19_ = NULL;
4091 +               _data_->_tmp19_ = rygel_lms_category_container_get_children_with_filter (_data_->self, _data_->_tmp14_, _data_->_tmp15_, _data_->_tmp16_, _data_->_tmp17_, _data_->_tmp18_);
4092 +               _data_->result = _data_->_tmp19_;
4093 +               _g_free0 (_data_->filter);
4094 +               _g_value_array_free0 (_data_->args);
4095 +               if (_data_->_state_ == 0) {
4096 +                       g_simple_async_result_complete_in_idle (_data_->_async_result);
4097 +               } else {
4098 +                       g_simple_async_result_complete (_data_->_async_result);
4099 +               }
4100 +               g_object_unref (_data_->_async_result);
4101 +               return FALSE;
4102 +       }
4103 +       goto __finally4;
4104 +       __catch4_g_error:
4105 +       {
4106 +               _data_->e = _data_->_inner_error_;
4107 +               _data_->_inner_error_ = NULL;
4108 +               _data_->_tmp20_ = NULL;
4109 +               _data_->_tmp20_ = _data_->e;
4110 +               _data_->_tmp21_ = NULL;
4111 +               _data_->_tmp21_ = _data_->_tmp20_->message;
4112 +               g_debug ("rygel-lms-category-container.vala:267:   Falling back to simple_search" \
4113 +"(): %s", _data_->_tmp21_);
4114 +               _data_->_tmp23_ = NULL;
4115 +               _data_->_tmp23_ = _data_->expression;
4116 +               _data_->_tmp24_ = 0U;
4117 +               _data_->_tmp24_ = _data_->offset;
4118 +               _data_->_tmp25_ = 0U;
4119 +               _data_->_tmp25_ = _data_->max_count;
4120 +               _data_->_tmp26_ = NULL;
4121 +               _data_->_tmp26_ = _data_->sort_criteria;
4122 +               _data_->_tmp27_ = NULL;
4123 +               _data_->_tmp27_ = _data_->cancellable;
4124 +               _data_->_tmp28_ = 0U;
4125 +               _data_->_state_ = 1;
4126 +               rygel_searchable_container_simple_search ((RygelSearchableContainer*) _data_->self, _data_->_tmp23_, _data_->_tmp24_, _data_->_tmp25_, _data_->_tmp26_, _data_->_tmp27_, rygel_lms_category_container_search_ready, _data_);
4127 +               return FALSE;
4128 +               _state_1:
4129 +               _data_->_tmp29_ = NULL;
4130 +               _data_->_tmp29_ = rygel_searchable_container_simple_search_finish ((RygelSearchableContainer*) _data_->self, _data_->_res_, &_data_->_tmp28_, &_data_->_inner_error_);
4131 +               _data_->total_matches = _data_->_tmp28_;
4132 +               _data_->_tmp22_ = _data_->_tmp29_;
4133 +               if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4134 +                       _g_error_free0 (_data_->e);
4135 +                       goto __finally4;
4136 +               }
4137 +               _data_->_tmp30_ = NULL;
4138 +               _data_->_tmp30_ = _data_->_tmp22_;
4139 +               _data_->_tmp22_ = NULL;
4140 +               _data_->result = _data_->_tmp30_;
4141 +               _g_object_unref0 (_data_->_tmp22_);
4142 +               _g_error_free0 (_data_->e);
4143 +               if (_data_->_state_ == 0) {
4144 +                       g_simple_async_result_complete_in_idle (_data_->_async_result);
4145 +               } else {
4146 +                       g_simple_async_result_complete (_data_->_async_result);
4147 +               }
4148 +               g_object_unref (_data_->_async_result);
4149 +               return FALSE;
4150 +       }
4151 +       __finally4:
4152 +       g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
4153 +       g_error_free (_data_->_inner_error_);
4154 +       if (_data_->_state_ == 0) {
4155 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4156 +       } else {
4157 +               g_simple_async_result_complete (_data_->_async_result);
4158 +       }
4159 +       g_object_unref (_data_->_async_result);
4160 +       return FALSE;
4161 +       if (_data_->_state_ == 0) {
4162 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4163 +       } else {
4164 +               g_simple_async_result_complete (_data_->_async_result);
4165 +       }
4166 +       g_object_unref (_data_->_async_result);
4167 +       return FALSE;
4168 +}
4169 +
4170 +
4171 +static void rygel_lms_category_container_real_get_children_data_free (gpointer _data) {
4172 +       RygelLmsCategoryContainerGetChildrenData* _data_;
4173 +       _data_ = _data;
4174 +       _g_free0 (_data_->sort_criteria);
4175 +       _g_object_unref0 (_data_->cancellable);
4176 +       _g_object_unref0 (_data_->result);
4177 +       _g_object_unref0 (_data_->self);
4178 +       g_slice_free (RygelLmsCategoryContainerGetChildrenData, _data_);
4179 +}
4180 +
4181 +
4182 +static void rygel_lms_category_container_real_get_children (RygelMediaContainer* base, guint offset, guint max_count, const gchar* sort_criteria, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_) {
4183 +       RygelLMSCategoryContainer * self;
4184 +       RygelLmsCategoryContainerGetChildrenData* _data_;
4185 +       RygelLMSCategoryContainer* _tmp0_ = NULL;
4186 +       guint _tmp1_ = 0U;
4187 +       guint _tmp2_ = 0U;
4188 +       const gchar* _tmp3_ = NULL;
4189 +       gchar* _tmp4_ = NULL;
4190 +       GCancellable* _tmp5_ = NULL;
4191 +       GCancellable* _tmp6_ = NULL;
4192 +       self = (RygelLMSCategoryContainer*) base;
4193 +       _data_ = g_slice_new0 (RygelLmsCategoryContainerGetChildrenData);
4194 +       _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, rygel_lms_category_container_real_get_children);
4195 +       g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, rygel_lms_category_container_real_get_children_data_free);
4196 +       _tmp0_ = _g_object_ref0 (self);
4197 +       _data_->self = _tmp0_;
4198 +       _tmp1_ = offset;
4199 +       _data_->offset = _tmp1_;
4200 +       _tmp2_ = max_count;
4201 +       _data_->max_count = _tmp2_;
4202 +       _tmp3_ = sort_criteria;
4203 +       _tmp4_ = g_strdup (_tmp3_);
4204 +       _g_free0 (_data_->sort_criteria);
4205 +       _data_->sort_criteria = _tmp4_;
4206 +       _tmp5_ = cancellable;
4207 +       _tmp6_ = _g_object_ref0 (_tmp5_);
4208 +       _g_object_unref0 (_data_->cancellable);
4209 +       _data_->cancellable = _tmp6_;
4210 +       rygel_lms_category_container_real_get_children_co (_data_);
4211 +}
4212 +
4213 +
4214 +static RygelMediaObjects* rygel_lms_category_container_real_get_children_finish (RygelMediaContainer* base, GAsyncResult* _res_, GError** error) {
4215 +       RygelMediaObjects* result;
4216 +       RygelLmsCategoryContainerGetChildrenData* _data_;
4217 +       if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
4218 +               return NULL;
4219 +       }
4220 +       _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
4221 +       result = _data_->result;
4222 +       _data_->result = NULL;
4223 +       return result;
4224 +}
4225 +
4226 +
4227 +static gboolean rygel_lms_category_container_real_get_children_co (RygelLmsCategoryContainerGetChildrenData* _data_) {
4228 +       switch (_data_->_state_) {
4229 +               case 0:
4230 +               goto _state_0;
4231 +               default:
4232 +               g_assert_not_reached ();
4233 +       }
4234 +       _state_0:
4235 +       _data_->_tmp0_ = NULL;
4236 +       _data_->_tmp0_ = rygel_media_objects_new ();
4237 +       _data_->retval = _data_->_tmp0_;
4238 +       _data_->_tmp1_ = NULL;
4239 +       _data_->_tmp1_ = _data_->self->stmt_all;
4240 +       _data_->_tmp2_ = 0U;
4241 +       _data_->_tmp2_ = _data_->offset;
4242 +       _data_->_tmp3_ = 0U;
4243 +       _data_->_tmp3_ = _data_->max_count;
4244 +       _data_->_tmp4_ = NULL;
4245 +       _data_->_tmp4_ = _data_->sort_criteria;
4246 +       rygel_lms_database_get_children_init (_data_->_tmp1_, _data_->_tmp2_, _data_->_tmp3_, _data_->_tmp4_, &_data_->_inner_error_);
4247 +       if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4248 +               g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
4249 +               g_error_free (_data_->_inner_error_);
4250 +               _g_object_unref0 (_data_->retval);
4251 +               if (_data_->_state_ == 0) {
4252 +                       g_simple_async_result_complete_in_idle (_data_->_async_result);
4253 +               } else {
4254 +                       g_simple_async_result_complete (_data_->_async_result);
4255 +               }
4256 +               g_object_unref (_data_->_async_result);
4257 +               return FALSE;
4258 +       }
4259 +       while (TRUE) {
4260 +               _data_->_tmp6_ = NULL;
4261 +               _data_->_tmp6_ = _data_->self->stmt_all;
4262 +               _data_->_tmp7_ = FALSE;
4263 +               _data_->_tmp7_ = rygel_lms_database_get_children_step (_data_->_tmp6_, &_data_->_inner_error_);
4264 +               _data_->_tmp5_ = _data_->_tmp7_;
4265 +               if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4266 +                       g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
4267 +                       g_error_free (_data_->_inner_error_);
4268 +                       _g_object_unref0 (_data_->retval);
4269 +                       if (_data_->_state_ == 0) {
4270 +                               g_simple_async_result_complete_in_idle (_data_->_async_result);
4271 +                       } else {
4272 +                               g_simple_async_result_complete (_data_->_async_result);
4273 +                       }
4274 +                       g_object_unref (_data_->_async_result);
4275 +                       return FALSE;
4276 +               }
4277 +               if (!_data_->_tmp5_) {
4278 +                       break;
4279 +               }
4280 +               _data_->_tmp8_ = NULL;
4281 +               _data_->_tmp8_ = _data_->retval;
4282 +               _data_->_tmp9_ = NULL;
4283 +               _data_->_tmp9_ = _data_->self->stmt_all;
4284 +               _data_->_tmp10_ = NULL;
4285 +               _data_->_tmp10_ = rygel_lms_category_container_object_from_statement (_data_->self, _data_->_tmp9_);
4286 +               _data_->_tmp11_ = NULL;
4287 +               _data_->_tmp11_ = _data_->_tmp10_;
4288 +               gee_abstract_collection_add ((GeeAbstractCollection*) _data_->_tmp8_, _data_->_tmp11_);
4289 +               _g_object_unref0 (_data_->_tmp11_);
4290 +       }
4291 +       _data_->result = _data_->retval;
4292 +       if (_data_->_state_ == 0) {
4293 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4294 +       } else {
4295 +               g_simple_async_result_complete (_data_->_async_result);
4296 +       }
4297 +       g_object_unref (_data_->_async_result);
4298 +       return FALSE;
4299 +       _g_object_unref0 (_data_->retval);
4300 +       if (_data_->_state_ == 0) {
4301 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4302 +       } else {
4303 +               g_simple_async_result_complete (_data_->_async_result);
4304 +       }
4305 +       g_object_unref (_data_->_async_result);
4306 +       return FALSE;
4307 +}
4308 +
4309 +
4310 +static void rygel_lms_category_container_real_find_object_data_free (gpointer _data) {
4311 +       RygelLmsCategoryContainerFindObjectData* _data_;
4312 +       _data_ = _data;
4313 +       _g_free0 (_data_->id);
4314 +       _g_object_unref0 (_data_->cancellable);
4315 +       _g_object_unref0 (_data_->result);
4316 +       _g_object_unref0 (_data_->self);
4317 +       g_slice_free (RygelLmsCategoryContainerFindObjectData, _data_);
4318 +}
4319 +
4320 +
4321 +static void rygel_lms_category_container_real_find_object (RygelMediaContainer* base, const gchar* id, GCancellable* cancellable, GAsyncReadyCallback _callback_, gpointer _user_data_) {
4322 +       RygelLMSCategoryContainer * self;
4323 +       RygelLmsCategoryContainerFindObjectData* _data_;
4324 +       RygelLMSCategoryContainer* _tmp0_ = NULL;
4325 +       const gchar* _tmp1_ = NULL;
4326 +       gchar* _tmp2_ = NULL;
4327 +       GCancellable* _tmp3_ = NULL;
4328 +       GCancellable* _tmp4_ = NULL;
4329 +       self = (RygelLMSCategoryContainer*) base;
4330 +       _data_ = g_slice_new0 (RygelLmsCategoryContainerFindObjectData);
4331 +       _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, rygel_lms_category_container_real_find_object);
4332 +       g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, rygel_lms_category_container_real_find_object_data_free);
4333 +       _tmp0_ = _g_object_ref0 (self);
4334 +       _data_->self = _tmp0_;
4335 +       _tmp1_ = id;
4336 +       _tmp2_ = g_strdup (_tmp1_);
4337 +       _g_free0 (_data_->id);
4338 +       _data_->id = _tmp2_;
4339 +       _tmp3_ = cancellable;
4340 +       _tmp4_ = _g_object_ref0 (_tmp3_);
4341 +       _g_object_unref0 (_data_->cancellable);
4342 +       _data_->cancellable = _tmp4_;
4343 +       rygel_lms_category_container_real_find_object_co (_data_);
4344 +}
4345 +
4346 +
4347 +static RygelMediaObject* rygel_lms_category_container_real_find_object_finish (RygelMediaContainer* base, GAsyncResult* _res_, GError** error) {
4348 +       RygelMediaObject* result;
4349 +       RygelLmsCategoryContainerFindObjectData* _data_;
4350 +       if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (_res_), error)) {
4351 +               return NULL;
4352 +       }
4353 +       _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
4354 +       result = _data_->result;
4355 +       _data_->result = NULL;
4356 +       return result;
4357 +}
4358 +
4359 +
4360 +static glong string_strnlen (gchar* str, glong maxlen) {
4361 +       glong result = 0L;
4362 +       gchar* end = NULL;
4363 +       gchar* _tmp0_ = NULL;
4364 +       glong _tmp1_ = 0L;
4365 +       gchar* _tmp2_ = NULL;
4366 +       gchar* _tmp3_ = NULL;
4367 +       _tmp0_ = str;
4368 +       _tmp1_ = maxlen;
4369 +       _tmp2_ = memchr (_tmp0_, 0, (gsize) _tmp1_);
4370 +       end = _tmp2_;
4371 +       _tmp3_ = end;
4372 +       if (_tmp3_ == NULL) {
4373 +               glong _tmp4_ = 0L;
4374 +               _tmp4_ = maxlen;
4375 +               result = _tmp4_;
4376 +               return result;
4377 +       } else {
4378 +               gchar* _tmp5_ = NULL;
4379 +               gchar* _tmp6_ = NULL;
4380 +               _tmp5_ = end;
4381 +               _tmp6_ = str;
4382 +               result = (glong) (_tmp5_ - _tmp6_);
4383 +               return result;
4384 +       }
4385 +}
4386 +
4387 +
4388 +static gchar* string_substring (const gchar* self, glong offset, glong len) {
4389 +       gchar* result = NULL;
4390 +       glong string_length = 0L;
4391 +       gboolean _tmp0_ = FALSE;
4392 +       glong _tmp1_ = 0L;
4393 +       glong _tmp8_ = 0L;
4394 +       glong _tmp14_ = 0L;
4395 +       glong _tmp17_ = 0L;
4396 +       glong _tmp18_ = 0L;
4397 +       glong _tmp19_ = 0L;
4398 +       glong _tmp20_ = 0L;
4399 +       glong _tmp21_ = 0L;
4400 +       gchar* _tmp22_ = NULL;
4401 +       g_return_val_if_fail (self != NULL, NULL);
4402 +       _tmp1_ = offset;
4403 +       if (_tmp1_ >= ((glong) 0)) {
4404 +               glong _tmp2_ = 0L;
4405 +               _tmp2_ = len;
4406 +               _tmp0_ = _tmp2_ >= ((glong) 0);
4407 +       } else {
4408 +               _tmp0_ = FALSE;
4409 +       }
4410 +       if (_tmp0_) {
4411 +               glong _tmp3_ = 0L;
4412 +               glong _tmp4_ = 0L;
4413 +               glong _tmp5_ = 0L;
4414 +               _tmp3_ = offset;
4415 +               _tmp4_ = len;
4416 +               _tmp5_ = string_strnlen ((gchar*) self, _tmp3_ + _tmp4_);
4417 +               string_length = _tmp5_;
4418 +       } else {
4419 +               gint _tmp6_ = 0;
4420 +               gint _tmp7_ = 0;
4421 +               _tmp6_ = strlen (self);
4422 +               _tmp7_ = _tmp6_;
4423 +               string_length = (glong) _tmp7_;
4424 +       }
4425 +       _tmp8_ = offset;
4426 +       if (_tmp8_ < ((glong) 0)) {
4427 +               glong _tmp9_ = 0L;
4428 +               glong _tmp10_ = 0L;
4429 +               glong _tmp11_ = 0L;
4430 +               _tmp9_ = string_length;
4431 +               _tmp10_ = offset;
4432 +               offset = _tmp9_ + _tmp10_;
4433 +               _tmp11_ = offset;
4434 +               g_return_val_if_fail (_tmp11_ >= ((glong) 0), NULL);
4435 +       } else {
4436 +               glong _tmp12_ = 0L;
4437 +               glong _tmp13_ = 0L;
4438 +               _tmp12_ = offset;
4439 +               _tmp13_ = string_length;
4440 +               g_return_val_if_fail (_tmp12_ <= _tmp13_, NULL);
4441 +       }
4442 +       _tmp14_ = len;
4443 +       if (_tmp14_ < ((glong) 0)) {
4444 +               glong _tmp15_ = 0L;
4445 +               glong _tmp16_ = 0L;
4446 +               _tmp15_ = string_length;
4447 +               _tmp16_ = offset;
4448 +               len = _tmp15_ - _tmp16_;
4449 +       }
4450 +       _tmp17_ = offset;
4451 +       _tmp18_ = len;
4452 +       _tmp19_ = string_length;
4453 +       g_return_val_if_fail ((_tmp17_ + _tmp18_) <= _tmp19_, NULL);
4454 +       _tmp20_ = offset;
4455 +       _tmp21_ = len;
4456 +       _tmp22_ = g_strndup (((gchar*) self) + _tmp20_, (gsize) _tmp21_);
4457 +       result = _tmp22_;
4458 +       return result;
4459 +}
4460 +
4461 +
4462 +static gint string_index_of_char (const gchar* self, gunichar c, gint start_index) {
4463 +       gint result = 0;
4464 +       gchar* _result_ = NULL;
4465 +       gint _tmp0_ = 0;
4466 +       gunichar _tmp1_ = 0U;
4467 +       gchar* _tmp2_ = NULL;
4468 +       gchar* _tmp3_ = NULL;
4469 +       g_return_val_if_fail (self != NULL, 0);
4470 +       _tmp0_ = start_index;
4471 +       _tmp1_ = c;
4472 +       _tmp2_ = g_utf8_strchr (((gchar*) self) + _tmp0_, (gssize) (-1), _tmp1_);
4473 +       _result_ = _tmp2_;
4474 +       _tmp3_ = _result_;
4475 +       if (_tmp3_ != NULL) {
4476 +               gchar* _tmp4_ = NULL;
4477 +               _tmp4_ = _result_;
4478 +               result = (gint) (_tmp4_ - ((gchar*) self));
4479 +               return result;
4480 +       } else {
4481 +               result = -1;
4482 +               return result;
4483 +       }
4484 +}
4485 +
4486 +
4487 +static gchar* string_slice (const gchar* self, glong start, glong end) {
4488 +       gchar* result = NULL;
4489 +       glong string_length = 0L;
4490 +       gint _tmp0_ = 0;
4491 +       gint _tmp1_ = 0;
4492 +       glong _tmp2_ = 0L;
4493 +       glong _tmp5_ = 0L;
4494 +       gboolean _tmp8_ = FALSE;
4495 +       glong _tmp9_ = 0L;
4496 +       gboolean _tmp12_ = FALSE;
4497 +       glong _tmp13_ = 0L;
4498 +       glong _tmp16_ = 0L;
4499 +       glong _tmp17_ = 0L;
4500 +       glong _tmp18_ = 0L;
4501 +       glong _tmp19_ = 0L;
4502 +       glong _tmp20_ = 0L;
4503 +       gchar* _tmp21_ = NULL;
4504 +       g_return_val_if_fail (self != NULL, NULL);
4505 +       _tmp0_ = strlen (self);
4506 +       _tmp1_ = _tmp0_;
4507 +       string_length = (glong) _tmp1_;
4508 +       _tmp2_ = start;
4509 +       if (_tmp2_ < ((glong) 0)) {
4510 +               glong _tmp3_ = 0L;
4511 +               glong _tmp4_ = 0L;
4512 +               _tmp3_ = string_length;
4513 +               _tmp4_ = start;
4514 +               start = _tmp3_ + _tmp4_;
4515 +       }
4516 +       _tmp5_ = end;
4517 +       if (_tmp5_ < ((glong) 0)) {
4518 +               glong _tmp6_ = 0L;
4519 +               glong _tmp7_ = 0L;
4520 +               _tmp6_ = string_length;
4521 +               _tmp7_ = end;
4522 +               end = _tmp6_ + _tmp7_;
4523 +       }
4524 +       _tmp9_ = start;
4525 +       if (_tmp9_ >= ((glong) 0)) {
4526 +               glong _tmp10_ = 0L;
4527 +               glong _tmp11_ = 0L;
4528 +               _tmp10_ = start;
4529 +               _tmp11_ = string_length;
4530 +               _tmp8_ = _tmp10_ <= _tmp11_;
4531 +       } else {
4532 +               _tmp8_ = FALSE;
4533 +       }
4534 +       g_return_val_if_fail (_tmp8_, NULL);
4535 +       _tmp13_ = end;
4536 +       if (_tmp13_ >= ((glong) 0)) {
4537 +               glong _tmp14_ = 0L;
4538 +               glong _tmp15_ = 0L;
4539 +               _tmp14_ = end;
4540 +               _tmp15_ = string_length;
4541 +               _tmp12_ = _tmp14_ <= _tmp15_;
4542 +       } else {
4543 +               _tmp12_ = FALSE;
4544 +       }
4545 +       g_return_val_if_fail (_tmp12_, NULL);
4546 +       _tmp16_ = start;
4547 +       _tmp17_ = end;
4548 +       g_return_val_if_fail (_tmp16_ <= _tmp17_, NULL);
4549 +       _tmp18_ = start;
4550 +       _tmp19_ = end;
4551 +       _tmp20_ = start;
4552 +       _tmp21_ = g_strndup (((gchar*) self) + _tmp18_, (gsize) (_tmp19_ - _tmp20_));
4553 +       result = _tmp21_;
4554 +       return result;
4555 +}
4556 +
4557 +
4558 +static void rygel_lms_category_container_find_object_ready (GObject* source_object, GAsyncResult* _res_, gpointer _user_data_) {
4559 +       RygelLmsCategoryContainerFindObjectData* _data_;
4560 +       _data_ = _user_data_;
4561 +       _data_->_source_object_ = source_object;
4562 +       _data_->_res_ = _res_;
4563 +       rygel_lms_category_container_real_find_object_co (_data_);
4564 +}
4565 +
4566 +
4567 +static gboolean rygel_lms_category_container_real_find_object_co (RygelLmsCategoryContainerFindObjectData* _data_) {
4568 +       switch (_data_->_state_) {
4569 +               case 0:
4570 +               goto _state_0;
4571 +               case 1:
4572 +               goto _state_1;
4573 +               default:
4574 +               g_assert_not_reached ();
4575 +       }
4576 +       _state_0:
4577 +       _data_->_tmp0_ = NULL;
4578 +       _data_->_tmp0_ = _data_->id;
4579 +       _data_->_tmp1_ = NULL;
4580 +       _data_->_tmp1_ = _data_->self->child_prefix;
4581 +       _data_->_tmp2_ = FALSE;
4582 +       _data_->_tmp2_ = g_str_has_prefix (_data_->_tmp0_, _data_->_tmp1_);
4583 +       if (!_data_->_tmp2_) {
4584 +               _data_->result = NULL;
4585 +               if (_data_->_state_ == 0) {
4586 +                       g_simple_async_result_complete_in_idle (_data_->_async_result);
4587 +               } else {
4588 +                       g_simple_async_result_complete (_data_->_async_result);
4589 +               }
4590 +               g_object_unref (_data_->_async_result);
4591 +               return FALSE;
4592 +       }
4593 +       _data_->object = NULL;
4594 +       _data_->_tmp3_ = NULL;
4595 +       _data_->_tmp3_ = _data_->id;
4596 +       _data_->_tmp4_ = NULL;
4597 +       _data_->_tmp4_ = _data_->self->child_prefix;
4598 +       _data_->_tmp5_ = 0;
4599 +       _data_->_tmp5_ = strlen (_data_->_tmp4_);
4600 +       _data_->_tmp6_ = 0;
4601 +       _data_->_tmp6_ = _data_->_tmp5_;
4602 +       _data_->_tmp7_ = NULL;
4603 +       _data_->_tmp7_ = string_substring (_data_->_tmp3_, (glong) _data_->_tmp6_, (glong) (-1));
4604 +       _data_->real_id = _data_->_tmp7_;
4605 +       _data_->_tmp8_ = NULL;
4606 +       _data_->_tmp8_ = _data_->real_id;
4607 +       _data_->_tmp9_ = 0;
4608 +       _data_->_tmp9_ = string_index_of_char (_data_->_tmp8_, (gunichar) ':', 0);
4609 +       _data_->index = _data_->_tmp9_;
4610 +       _data_->_tmp10_ = 0;
4611 +       _data_->_tmp10_ = _data_->index;
4612 +       if (_data_->_tmp10_ > 0) {
4613 +               _data_->_tmp11_ = NULL;
4614 +               _data_->_tmp11_ = _data_->real_id;
4615 +               _data_->_tmp12_ = 0;
4616 +               _data_->_tmp12_ = _data_->index;
4617 +               _data_->_tmp13_ = NULL;
4618 +               _data_->_tmp13_ = string_slice (_data_->_tmp11_, (glong) 0, (glong) _data_->_tmp12_);
4619 +               _g_free0 (_data_->real_id);
4620 +               _data_->real_id = _data_->_tmp13_;
4621 +       }
4622 +       {
4623 +               _data_->_tmp14_ = NULL;
4624 +               _data_->_tmp14_ = _data_->real_id;
4625 +               _data_->_tmp15_ = NULL;
4626 +               _data_->_tmp15_ = _data_->self->stmt_find_object;
4627 +               rygel_lms_database_find_object (_data_->_tmp14_, _data_->_tmp15_, &_data_->_inner_error_);
4628 +               if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4629 +                       if (_data_->_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4630 +                               goto __catch5_rygel_lms_database_error;
4631 +                       }
4632 +                       _g_free0 (_data_->real_id);
4633 +                       _g_object_unref0 (_data_->object);
4634 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _data_->_inner_error_->message, g_quark_to_string (_data_->_inner_error_->domain), _data_->_inner_error_->code);
4635 +                       g_clear_error (&_data_->_inner_error_);
4636 +                       return FALSE;
4637 +               }
4638 +               _data_->_tmp16_ = NULL;
4639 +               _data_->_tmp16_ = _data_->self->stmt_find_object;
4640 +               _data_->_tmp17_ = NULL;
4641 +               _data_->_tmp17_ = rygel_lms_category_container_object_from_statement (_data_->self, _data_->_tmp16_);
4642 +               _data_->child = _data_->_tmp17_;
4643 +               _data_->_tmp18_ = 0;
4644 +               _data_->_tmp18_ = _data_->index;
4645 +               if (_data_->_tmp18_ < 0) {
4646 +                       _data_->_tmp19_ = NULL;
4647 +                       _data_->_tmp19_ = _data_->child;
4648 +                       _data_->_tmp20_ = NULL;
4649 +                       _data_->_tmp20_ = _g_object_ref0 (_data_->_tmp19_);
4650 +                       _g_object_unref0 (_data_->object);
4651 +                       _data_->object = _data_->_tmp20_;
4652 +               } else {
4653 +                       _data_->_tmp21_ = NULL;
4654 +                       _data_->_tmp21_ = _data_->child;
4655 +                       _data_->_tmp22_ = NULL;
4656 +                       _data_->_tmp22_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_TYPE (_data_->_tmp21_, RYGEL_LMS_TYPE_CATEGORY_CONTAINER) ? ((RygelLMSCategoryContainer*) _data_->_tmp21_) : NULL);
4657 +                       _data_->container = _data_->_tmp22_;
4658 +                       _data_->_tmp24_ = NULL;
4659 +                       _data_->_tmp24_ = _data_->container;
4660 +                       _data_->_tmp25_ = NULL;
4661 +                       _data_->_tmp25_ = _data_->id;
4662 +                       _data_->_tmp26_ = NULL;
4663 +                       _data_->_tmp26_ = _data_->cancellable;
4664 +                       _data_->_state_ = 1;
4665 +                       rygel_media_container_find_object ((RygelMediaContainer*) _data_->_tmp24_, _data_->_tmp25_, _data_->_tmp26_, rygel_lms_category_container_find_object_ready, _data_);
4666 +                       return FALSE;
4667 +                       _state_1:
4668 +                       _data_->_tmp27_ = NULL;
4669 +                       _data_->_tmp27_ = rygel_media_container_find_object_finish ((RygelMediaContainer*) _data_->_tmp24_, _data_->_res_, &_data_->_inner_error_);
4670 +                       _data_->_tmp23_ = _data_->_tmp27_;
4671 +                       if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4672 +                               _g_object_unref0 (_data_->container);
4673 +                               _g_object_unref0 (_data_->child);
4674 +                               if (_data_->_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4675 +                                       goto __catch5_rygel_lms_database_error;
4676 +                               }
4677 +                               goto __finally5;
4678 +                       }
4679 +                       _data_->_tmp28_ = NULL;
4680 +                       _data_->_tmp28_ = _data_->_tmp23_;
4681 +                       _data_->_tmp23_ = NULL;
4682 +                       _g_object_unref0 (_data_->object);
4683 +                       _data_->object = _data_->_tmp28_;
4684 +                       _data_->_tmp29_ = NULL;
4685 +                       _data_->_tmp29_ = _data_->object;
4686 +                       _data_->_tmp30_ = NULL;
4687 +                       _data_->_tmp30_ = _data_->object;
4688 +                       _data_->_tmp31_ = NULL;
4689 +                       _data_->_tmp31_ = rygel_media_object_get_parent (_data_->_tmp30_);
4690 +                       _data_->_tmp32_ = NULL;
4691 +                       _data_->_tmp32_ = _data_->_tmp31_;
4692 +                       rygel_media_object_set_parent_ref (_data_->_tmp29_, _data_->_tmp32_);
4693 +                       _g_object_unref0 (_data_->_tmp23_);
4694 +                       _g_object_unref0 (_data_->container);
4695 +               }
4696 +               _g_object_unref0 (_data_->child);
4697 +       }
4698 +       goto __finally5;
4699 +       __catch5_rygel_lms_database_error:
4700 +       {
4701 +               _data_->e = _data_->_inner_error_;
4702 +               _data_->_inner_error_ = NULL;
4703 +               _data_->_tmp33_ = NULL;
4704 +               _data_->_tmp33_ = _data_->id;
4705 +               _data_->_tmp34_ = NULL;
4706 +               _data_->_tmp34_ = rygel_media_object_get_id ((RygelMediaObject*) _data_->self);
4707 +               _data_->_tmp35_ = NULL;
4708 +               _data_->_tmp35_ = _data_->_tmp34_;
4709 +               _data_->_tmp36_ = NULL;
4710 +               _data_->_tmp36_ = _data_->e;
4711 +               _data_->_tmp37_ = NULL;
4712 +               _data_->_tmp37_ = _data_->_tmp36_->message;
4713 +               g_debug ("rygel-lms-category-container.vala:328: find_object %s in %s: %s", _data_->_tmp33_, _data_->_tmp35_, _data_->_tmp37_);
4714 +               _g_error_free0 (_data_->e);
4715 +       }
4716 +       __finally5:
4717 +       if (G_UNLIKELY (_data_->_inner_error_ != NULL)) {
4718 +               g_simple_async_result_set_from_error (_data_->_async_result, _data_->_inner_error_);
4719 +               g_error_free (_data_->_inner_error_);
4720 +               _g_free0 (_data_->real_id);
4721 +               _g_object_unref0 (_data_->object);
4722 +               if (_data_->_state_ == 0) {
4723 +                       g_simple_async_result_complete_in_idle (_data_->_async_result);
4724 +               } else {
4725 +                       g_simple_async_result_complete (_data_->_async_result);
4726 +               }
4727 +               g_object_unref (_data_->_async_result);
4728 +               return FALSE;
4729 +       }
4730 +       _data_->result = _data_->object;
4731 +       _g_free0 (_data_->real_id);
4732 +       if (_data_->_state_ == 0) {
4733 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4734 +       } else {
4735 +               g_simple_async_result_complete (_data_->_async_result);
4736 +       }
4737 +       g_object_unref (_data_->_async_result);
4738 +       return FALSE;
4739 +       _g_free0 (_data_->real_id);
4740 +       _g_object_unref0 (_data_->object);
4741 +       if (_data_->_state_ == 0) {
4742 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4743 +       } else {
4744 +               g_simple_async_result_complete (_data_->_async_result);
4745 +       }
4746 +       g_object_unref (_data_->_async_result);
4747 +       return FALSE;
4748 +}
4749 +
4750 +
4751 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id) {
4752 +       gchar* result = NULL;
4753 +       const gchar* _tmp0_ = NULL;
4754 +       gint _tmp1_ = 0;
4755 +       gchar* _tmp2_ = NULL;
4756 +       g_return_val_if_fail (self != NULL, NULL);
4757 +       _tmp0_ = self->child_prefix;
4758 +       _tmp1_ = db_id;
4759 +       _tmp2_ = g_strdup_printf ("%s%d", _tmp0_, _tmp1_);
4760 +       result = _tmp2_;
4761 +       return result;
4762 +}
4763 +
4764 +
4765 +gchar* rygel_lms_category_container_build_reference_id (RygelLMSCategoryContainer* self, gint db_id) {
4766 +       gchar* result = NULL;
4767 +       const gchar* _tmp0_ = NULL;
4768 +       gint _tmp1_ = 0;
4769 +       gchar* _tmp2_ = NULL;
4770 +       g_return_val_if_fail (self != NULL, NULL);
4771 +       _tmp0_ = self->ref_prefix;
4772 +       _tmp1_ = db_id;
4773 +       _tmp2_ = g_strdup_printf ("%s%d", _tmp0_, _tmp1_);
4774 +       result = _tmp2_;
4775 +       return result;
4776 +}
4777 +
4778 +
4779 +static void rygel_lms_category_container_real_add_child_data_free (gpointer _data) {
4780 +       RygelLmsCategoryContainerAddChildData* _data_;
4781 +       _data_ = _data;
4782 +       _g_object_unref0 (_data_->object);
4783 +       _g_object_unref0 (_data_->self);
4784 +       g_slice_free (RygelLmsCategoryContainerAddChildData, _data_);
4785 +}
4786 +
4787 +
4788 +static void rygel_lms_category_container_real_add_child (RygelTrackableContainer* base, RygelMediaObject* object, GAsyncReadyCallback _callback_, gpointer _user_data_) {
4789 +       RygelLMSCategoryContainer * self;
4790 +       RygelLmsCategoryContainerAddChildData* _data_;
4791 +       RygelLMSCategoryContainer* _tmp0_ = NULL;
4792 +       RygelMediaObject* _tmp1_ = NULL;
4793 +       RygelMediaObject* _tmp2_ = NULL;
4794 +       self = (RygelLMSCategoryContainer*) base;
4795 +       _data_ = g_slice_new0 (RygelLmsCategoryContainerAddChildData);
4796 +       _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, rygel_lms_category_container_real_add_child);
4797 +       g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, rygel_lms_category_container_real_add_child_data_free);
4798 +       _tmp0_ = _g_object_ref0 (self);
4799 +       _data_->self = _tmp0_;
4800 +       _tmp1_ = object;
4801 +       _tmp2_ = _g_object_ref0 (_tmp1_);
4802 +       _g_object_unref0 (_data_->object);
4803 +       _data_->object = _tmp2_;
4804 +       rygel_lms_category_container_real_add_child_co (_data_);
4805 +}
4806 +
4807 +
4808 +static void rygel_lms_category_container_real_add_child_finish (RygelTrackableContainer* base, GAsyncResult* _res_) {
4809 +       RygelLmsCategoryContainerAddChildData* _data_;
4810 +       _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
4811 +}
4812 +
4813 +
4814 +static gboolean rygel_lms_category_container_real_add_child_co (RygelLmsCategoryContainerAddChildData* _data_) {
4815 +       switch (_data_->_state_) {
4816 +               case 0:
4817 +               goto _state_0;
4818 +               default:
4819 +               g_assert_not_reached ();
4820 +       }
4821 +       _state_0:
4822 +       if (_data_->_state_ == 0) {
4823 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4824 +       } else {
4825 +               g_simple_async_result_complete (_data_->_async_result);
4826 +       }
4827 +       g_object_unref (_data_->_async_result);
4828 +       return FALSE;
4829 +}
4830 +
4831 +
4832 +static void rygel_lms_category_container_real_remove_child_data_free (gpointer _data) {
4833 +       RygelLmsCategoryContainerRemoveChildData* _data_;
4834 +       _data_ = _data;
4835 +       _g_object_unref0 (_data_->object);
4836 +       _g_object_unref0 (_data_->self);
4837 +       g_slice_free (RygelLmsCategoryContainerRemoveChildData, _data_);
4838 +}
4839 +
4840 +
4841 +static void rygel_lms_category_container_real_remove_child (RygelTrackableContainer* base, RygelMediaObject* object, GAsyncReadyCallback _callback_, gpointer _user_data_) {
4842 +       RygelLMSCategoryContainer * self;
4843 +       RygelLmsCategoryContainerRemoveChildData* _data_;
4844 +       RygelLMSCategoryContainer* _tmp0_ = NULL;
4845 +       RygelMediaObject* _tmp1_ = NULL;
4846 +       RygelMediaObject* _tmp2_ = NULL;
4847 +       self = (RygelLMSCategoryContainer*) base;
4848 +       _data_ = g_slice_new0 (RygelLmsCategoryContainerRemoveChildData);
4849 +       _data_->_async_result = g_simple_async_result_new (G_OBJECT (self), _callback_, _user_data_, rygel_lms_category_container_real_remove_child);
4850 +       g_simple_async_result_set_op_res_gpointer (_data_->_async_result, _data_, rygel_lms_category_container_real_remove_child_data_free);
4851 +       _tmp0_ = _g_object_ref0 (self);
4852 +       _data_->self = _tmp0_;
4853 +       _tmp1_ = object;
4854 +       _tmp2_ = _g_object_ref0 (_tmp1_);
4855 +       _g_object_unref0 (_data_->object);
4856 +       _data_->object = _tmp2_;
4857 +       rygel_lms_category_container_real_remove_child_co (_data_);
4858 +}
4859 +
4860 +
4861 +static void rygel_lms_category_container_real_remove_child_finish (RygelTrackableContainer* base, GAsyncResult* _res_) {
4862 +       RygelLmsCategoryContainerRemoveChildData* _data_;
4863 +       _data_ = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (_res_));
4864 +}
4865 +
4866 +
4867 +static gboolean rygel_lms_category_container_real_remove_child_co (RygelLmsCategoryContainerRemoveChildData* _data_) {
4868 +       switch (_data_->_state_) {
4869 +               case 0:
4870 +               goto _state_0;
4871 +               default:
4872 +               g_assert_not_reached ();
4873 +       }
4874 +       _state_0:
4875 +       if (_data_->_state_ == 0) {
4876 +               g_simple_async_result_complete_in_idle (_data_->_async_result);
4877 +       } else {
4878 +               g_simple_async_result_complete (_data_->_async_result);
4879 +       }
4880 +       g_object_unref (_data_->_async_result);
4881 +       return FALSE;
4882 +}
4883 +
4884 +
4885 +static void rygel_lms_category_container_on_db_updated (RygelLMSCategoryContainer* self, guint64 old_id, guint64 new_id) {
4886 +       GError * _inner_error_ = NULL;
4887 +       g_return_if_fail (self != NULL);
4888 +       {
4889 +               sqlite3_stmt* stmt_count = NULL;
4890 +               RygelLMSDatabase* _tmp0_ = NULL;
4891 +               const gchar* _tmp1_ = NULL;
4892 +               sqlite3_stmt* _tmp2_ = NULL;
4893 +               sqlite3_stmt* _tmp3_ = NULL;
4894 +               gint _tmp4_ = 0;
4895 +               sqlite3_stmt* _tmp7_ = NULL;
4896 +               guint64 _tmp8_ = 0ULL;
4897 +               guint64 _tmp9_ = 0ULL;
4898 +               sqlite3_stmt* _tmp16_ = NULL;
4899 +               guint64 _tmp17_ = 0ULL;
4900 +               guint64 _tmp18_ = 0ULL;
4901 +               _tmp0_ = self->priv->_lms_db;
4902 +               _tmp1_ = self->priv->_sql_count;
4903 +               _tmp2_ = rygel_lms_database_prepare (_tmp0_, _tmp1_, &_inner_error_);
4904 +               stmt_count = _tmp2_;
4905 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
4906 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4907 +                               goto __catch6_rygel_lms_database_error;
4908 +                       }
4909 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
4910 +                       g_clear_error (&_inner_error_);
4911 +                       return;
4912 +               }
4913 +               _tmp3_ = stmt_count;
4914 +               _tmp4_ = sqlite3_step (_tmp3_);
4915 +               if (_tmp4_ == SQLITE_ROW) {
4916 +                       sqlite3_stmt* _tmp5_ = NULL;
4917 +                       gint _tmp6_ = 0;
4918 +                       _tmp5_ = stmt_count;
4919 +                       _tmp6_ = sqlite3_column_int (_tmp5_, 0);
4920 +                       rygel_media_container_set_child_count ((RygelMediaContainer*) self, _tmp6_);
4921 +               }
4922 +               _tmp7_ = self->stmt_added;
4923 +               _tmp8_ = old_id;
4924 +               _tmp9_ = new_id;
4925 +               rygel_lms_database_get_children_with_update_id_init (_tmp7_, _tmp8_, _tmp9_, &_inner_error_);
4926 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
4927 +                       _sqlite3_finalize0 (stmt_count);
4928 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4929 +                               goto __catch6_rygel_lms_database_error;
4930 +                       }
4931 +                       _sqlite3_finalize0 (stmt_count);
4932 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
4933 +                       g_clear_error (&_inner_error_);
4934 +                       return;
4935 +               }
4936 +               while (TRUE) {
4937 +                       gboolean _tmp10_ = FALSE;
4938 +                       sqlite3_stmt* _tmp11_ = NULL;
4939 +                       gboolean _tmp12_ = FALSE;
4940 +                       sqlite3_stmt* _tmp13_ = NULL;
4941 +                       RygelMediaObject* _tmp14_ = NULL;
4942 +                       RygelMediaObject* _tmp15_ = NULL;
4943 +                       _tmp11_ = self->stmt_added;
4944 +                       _tmp12_ = rygel_lms_database_get_children_step (_tmp11_, &_inner_error_);
4945 +                       _tmp10_ = _tmp12_;
4946 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
4947 +                               _sqlite3_finalize0 (stmt_count);
4948 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4949 +                                       goto __catch6_rygel_lms_database_error;
4950 +                               }
4951 +                               _sqlite3_finalize0 (stmt_count);
4952 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
4953 +                               g_clear_error (&_inner_error_);
4954 +                               return;
4955 +                       }
4956 +                       if (!_tmp10_) {
4957 +                               break;
4958 +                       }
4959 +                       _tmp13_ = self->stmt_added;
4960 +                       _tmp14_ = rygel_lms_category_container_object_from_statement (self, _tmp13_);
4961 +                       _tmp15_ = _tmp14_;
4962 +                       rygel_trackable_container_add_child_tracked ((RygelTrackableContainer*) self, _tmp15_, NULL, NULL);
4963 +                       _g_object_unref0 (_tmp15_);
4964 +               }
4965 +               _tmp16_ = self->stmt_removed;
4966 +               _tmp17_ = old_id;
4967 +               _tmp18_ = new_id;
4968 +               rygel_lms_database_get_children_with_update_id_init (_tmp16_, _tmp17_, _tmp18_, &_inner_error_);
4969 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
4970 +                       _sqlite3_finalize0 (stmt_count);
4971 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4972 +                               goto __catch6_rygel_lms_database_error;
4973 +                       }
4974 +                       _sqlite3_finalize0 (stmt_count);
4975 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
4976 +                       g_clear_error (&_inner_error_);
4977 +                       return;
4978 +               }
4979 +               while (TRUE) {
4980 +                       gboolean _tmp19_ = FALSE;
4981 +                       sqlite3_stmt* _tmp20_ = NULL;
4982 +                       gboolean _tmp21_ = FALSE;
4983 +                       sqlite3_stmt* _tmp22_ = NULL;
4984 +                       RygelMediaObject* _tmp23_ = NULL;
4985 +                       RygelMediaObject* _tmp24_ = NULL;
4986 +                       _tmp20_ = self->stmt_removed;
4987 +                       _tmp21_ = rygel_lms_database_get_children_step (_tmp20_, &_inner_error_);
4988 +                       _tmp19_ = _tmp21_;
4989 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
4990 +                               _sqlite3_finalize0 (stmt_count);
4991 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
4992 +                                       goto __catch6_rygel_lms_database_error;
4993 +                               }
4994 +                               _sqlite3_finalize0 (stmt_count);
4995 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
4996 +                               g_clear_error (&_inner_error_);
4997 +                               return;
4998 +                       }
4999 +                       if (!_tmp19_) {
5000 +                               break;
5001 +                       }
5002 +                       _tmp22_ = self->stmt_removed;
5003 +                       _tmp23_ = rygel_lms_category_container_object_from_statement (self, _tmp22_);
5004 +                       _tmp24_ = _tmp23_;
5005 +                       rygel_trackable_container_remove_child_tracked ((RygelTrackableContainer*) self, _tmp24_, NULL, NULL);
5006 +                       _g_object_unref0 (_tmp24_);
5007 +               }
5008 +               _sqlite3_finalize0 (stmt_count);
5009 +       }
5010 +       goto __finally6;
5011 +       __catch6_rygel_lms_database_error:
5012 +       {
5013 +               GError* e = NULL;
5014 +               GError* _tmp25_ = NULL;
5015 +               const gchar* _tmp26_ = NULL;
5016 +               e = _inner_error_;
5017 +               _inner_error_ = NULL;
5018 +               _tmp25_ = e;
5019 +               _tmp26_ = _tmp25_->message;
5020 +               g_warning ("rygel-lms-category-container.vala:372: Can't perform container update:" \
5021 +" %s", _tmp26_);
5022 +               _g_error_free0 (e);
5023 +       }
5024 +       __finally6:
5025 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
5026 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5027 +               g_clear_error (&_inner_error_);
5028 +               return;
5029 +       }
5030 +}
5031 +
5032 +
5033 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed) {
5034 +       RygelLMSCategoryContainer * self = NULL;
5035 +       RygelMediaContainer* _tmp0_ = NULL;
5036 +       const gchar* _tmp1_ = NULL;
5037 +       const gchar* _tmp2_ = NULL;
5038 +       const gchar* _tmp3_ = NULL;
5039 +       gchar* _tmp4_ = NULL;
5040 +       gchar* _tmp5_ = NULL;
5041 +       const gchar* _tmp6_ = NULL;
5042 +       RygelMediaContainer* _tmp7_ = NULL;
5043 +       const gchar* _tmp8_ = NULL;
5044 +       RygelLMSDatabase* _tmp9_ = NULL;
5045 +       const gchar* _tmp10_ = NULL;
5046 +       const gchar* _tmp11_ = NULL;
5047 +       const gchar* _tmp12_ = NULL;
5048 +       const gchar* _tmp13_ = NULL;
5049 +       const gchar* _tmp14_ = NULL;
5050 +       g_return_val_if_fail (db_id != NULL, NULL);
5051 +       g_return_val_if_fail (parent != NULL, NULL);
5052 +       g_return_val_if_fail (title != NULL, NULL);
5053 +       g_return_val_if_fail (lms_db != NULL, NULL);
5054 +       g_return_val_if_fail (sql_all != NULL, NULL);
5055 +       g_return_val_if_fail (sql_find_object != NULL, NULL);
5056 +       g_return_val_if_fail (sql_count != NULL, NULL);
5057 +       _tmp0_ = parent;
5058 +       _tmp1_ = rygel_media_object_get_id ((RygelMediaObject*) _tmp0_);
5059 +       _tmp2_ = _tmp1_;
5060 +       _tmp3_ = db_id;
5061 +       _tmp4_ = g_strdup_printf ("%s:%s", _tmp2_, _tmp3_);
5062 +       _tmp5_ = _tmp4_;
5063 +       _tmp6_ = db_id;
5064 +       _tmp7_ = parent;
5065 +       _tmp8_ = title;
5066 +       _tmp9_ = lms_db;
5067 +       _tmp10_ = sql_all;
5068 +       _tmp11_ = sql_find_object;
5069 +       _tmp12_ = sql_count;
5070 +       _tmp13_ = sql_added;
5071 +       _tmp14_ = sql_removed;
5072 +       self = (RygelLMSCategoryContainer*) g_object_new (object_type, "id", _tmp5_, "db-id", _tmp6_, "parent", _tmp7_, "title", _tmp8_, "lms-db", _tmp9_, "sql-all", _tmp10_, "sql-find-object", _tmp11_, "sql-count", _tmp12_, "sql-added", _tmp13_, "sql-removed", _tmp14_, NULL);
5073 +       _g_free0 (_tmp5_);
5074 +       return self;
5075 +}
5076 +
5077 +
5078 +static GeeArrayList* rygel_lms_category_container_real_get_search_classes (RygelSearchableContainer* base) {
5079 +       GeeArrayList* result;
5080 +       RygelLMSCategoryContainer* self;
5081 +       GeeArrayList* _tmp0_ = NULL;
5082 +       self = (RygelLMSCategoryContainer*) base;
5083 +       _tmp0_ = self->priv->_search_classes;
5084 +       result = _tmp0_;
5085 +       return result;
5086 +}
5087 +
5088 +
5089 +static void rygel_lms_category_container_real_set_search_classes (RygelSearchableContainer* base, GeeArrayList* value) {
5090 +       RygelLMSCategoryContainer* self;
5091 +       GeeArrayList* _tmp0_ = NULL;
5092 +       GeeArrayList* _tmp1_ = NULL;
5093 +       self = (RygelLMSCategoryContainer*) base;
5094 +       _tmp0_ = value;
5095 +       _tmp1_ = _g_object_ref0 (_tmp0_);
5096 +       _g_object_unref0 (self->priv->_search_classes);
5097 +       self->priv->_search_classes = _tmp1_;
5098 +       g_object_notify ((GObject *) self, "search-classes");
5099 +}
5100 +
5101 +
5102 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self) {
5103 +       RygelLMSDatabase* result;
5104 +       RygelLMSDatabase* _tmp0_ = NULL;
5105 +       g_return_val_if_fail (self != NULL, NULL);
5106 +       _tmp0_ = self->priv->_lms_db;
5107 +       result = _tmp0_;
5108 +       return result;
5109 +}
5110 +
5111 +
5112 +static void rygel_lms_category_container_set_lms_db (RygelLMSCategoryContainer* self, RygelLMSDatabase* value) {
5113 +       RygelLMSDatabase* _tmp0_ = NULL;
5114 +       g_return_if_fail (self != NULL);
5115 +       _tmp0_ = value;
5116 +       self->priv->_lms_db = _tmp0_;
5117 +       g_object_notify ((GObject *) self, "lms-db");
5118 +}
5119 +
5120 +
5121 +const gchar* rygel_lms_category_container_get_db_id (RygelLMSCategoryContainer* self) {
5122 +       const gchar* result;
5123 +       const gchar* _tmp0_ = NULL;
5124 +       g_return_val_if_fail (self != NULL, NULL);
5125 +       _tmp0_ = self->priv->_db_id;
5126 +       result = _tmp0_;
5127 +       return result;
5128 +}
5129 +
5130 +
5131 +static void rygel_lms_category_container_set_db_id (RygelLMSCategoryContainer* self, const gchar* value) {
5132 +       const gchar* _tmp0_ = NULL;
5133 +       gchar* _tmp1_ = NULL;
5134 +       g_return_if_fail (self != NULL);
5135 +       _tmp0_ = value;
5136 +       _tmp1_ = g_strdup (_tmp0_);
5137 +       _g_free0 (self->priv->_db_id);
5138 +       self->priv->_db_id = _tmp1_;
5139 +       g_object_notify ((GObject *) self, "db-id");
5140 +}
5141 +
5142 +
5143 +const gchar* rygel_lms_category_container_get_sql_all (RygelLMSCategoryContainer* self) {
5144 +       const gchar* result;
5145 +       const gchar* _tmp0_ = NULL;
5146 +       g_return_val_if_fail (self != NULL, NULL);
5147 +       _tmp0_ = self->priv->_sql_all;
5148 +       result = _tmp0_;
5149 +       return result;
5150 +}
5151 +
5152 +
5153 +static void rygel_lms_category_container_set_sql_all (RygelLMSCategoryContainer* self, const gchar* value) {
5154 +       const gchar* _tmp0_ = NULL;
5155 +       gchar* _tmp1_ = NULL;
5156 +       g_return_if_fail (self != NULL);
5157 +       _tmp0_ = value;
5158 +       _tmp1_ = g_strdup (_tmp0_);
5159 +       _g_free0 (self->priv->_sql_all);
5160 +       self->priv->_sql_all = _tmp1_;
5161 +       g_object_notify ((GObject *) self, "sql-all");
5162 +}
5163 +
5164 +
5165 +const gchar* rygel_lms_category_container_get_sql_find_object (RygelLMSCategoryContainer* self) {
5166 +       const gchar* result;
5167 +       const gchar* _tmp0_ = NULL;
5168 +       g_return_val_if_fail (self != NULL, NULL);
5169 +       _tmp0_ = self->priv->_sql_find_object;
5170 +       result = _tmp0_;
5171 +       return result;
5172 +}
5173 +
5174 +
5175 +static void rygel_lms_category_container_set_sql_find_object (RygelLMSCategoryContainer* self, const gchar* value) {
5176 +       const gchar* _tmp0_ = NULL;
5177 +       gchar* _tmp1_ = NULL;
5178 +       g_return_if_fail (self != NULL);
5179 +       _tmp0_ = value;
5180 +       _tmp1_ = g_strdup (_tmp0_);
5181 +       _g_free0 (self->priv->_sql_find_object);
5182 +       self->priv->_sql_find_object = _tmp1_;
5183 +       g_object_notify ((GObject *) self, "sql-find-object");
5184 +}
5185 +
5186 +
5187 +const gchar* rygel_lms_category_container_get_sql_count (RygelLMSCategoryContainer* self) {
5188 +       const gchar* result;
5189 +       const gchar* _tmp0_ = NULL;
5190 +       g_return_val_if_fail (self != NULL, NULL);
5191 +       _tmp0_ = self->priv->_sql_count;
5192 +       result = _tmp0_;
5193 +       return result;
5194 +}
5195 +
5196 +
5197 +static void rygel_lms_category_container_set_sql_count (RygelLMSCategoryContainer* self, const gchar* value) {
5198 +       const gchar* _tmp0_ = NULL;
5199 +       gchar* _tmp1_ = NULL;
5200 +       g_return_if_fail (self != NULL);
5201 +       _tmp0_ = value;
5202 +       _tmp1_ = g_strdup (_tmp0_);
5203 +       _g_free0 (self->priv->_sql_count);
5204 +       self->priv->_sql_count = _tmp1_;
5205 +       g_object_notify ((GObject *) self, "sql-count");
5206 +}
5207 +
5208 +
5209 +const gchar* rygel_lms_category_container_get_sql_added (RygelLMSCategoryContainer* self) {
5210 +       const gchar* result;
5211 +       const gchar* _tmp0_ = NULL;
5212 +       g_return_val_if_fail (self != NULL, NULL);
5213 +       _tmp0_ = self->priv->_sql_added;
5214 +       result = _tmp0_;
5215 +       return result;
5216 +}
5217 +
5218 +
5219 +static void rygel_lms_category_container_set_sql_added (RygelLMSCategoryContainer* self, const gchar* value) {
5220 +       const gchar* _tmp0_ = NULL;
5221 +       gchar* _tmp1_ = NULL;
5222 +       g_return_if_fail (self != NULL);
5223 +       _tmp0_ = value;
5224 +       _tmp1_ = g_strdup (_tmp0_);
5225 +       _g_free0 (self->priv->_sql_added);
5226 +       self->priv->_sql_added = _tmp1_;
5227 +       g_object_notify ((GObject *) self, "sql-added");
5228 +}
5229 +
5230 +
5231 +const gchar* rygel_lms_category_container_get_sql_removed (RygelLMSCategoryContainer* self) {
5232 +       const gchar* result;
5233 +       const gchar* _tmp0_ = NULL;
5234 +       g_return_val_if_fail (self != NULL, NULL);
5235 +       _tmp0_ = self->priv->_sql_removed;
5236 +       result = _tmp0_;
5237 +       return result;
5238 +}
5239 +
5240 +
5241 +static void rygel_lms_category_container_set_sql_removed (RygelLMSCategoryContainer* self, const gchar* value) {
5242 +       const gchar* _tmp0_ = NULL;
5243 +       gchar* _tmp1_ = NULL;
5244 +       g_return_if_fail (self != NULL);
5245 +       _tmp0_ = value;
5246 +       _tmp1_ = g_strdup (_tmp0_);
5247 +       _g_free0 (self->priv->_sql_removed);
5248 +       self->priv->_sql_removed = _tmp1_;
5249 +       g_object_notify ((GObject *) self, "sql-removed");
5250 +}
5251 +
5252 +
5253 +static void _rygel_lms_category_container_on_db_updated_rygel_lms_database_db_updated (RygelLMSDatabase* _sender, guint64 old_update_id, guint64 new_update_id, gpointer self) {
5254 +       rygel_lms_category_container_on_db_updated ((RygelLMSCategoryContainer*) self, old_update_id, new_update_id);
5255 +}
5256 +
5257 +
5258 +static GObject * rygel_lms_category_container_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) {
5259 +       GObject * obj;
5260 +       GObjectClass * parent_class;
5261 +       RygelLMSCategoryContainer * self;
5262 +       GeeArrayList* _tmp0_ = NULL;
5263 +       GeeArrayList* _tmp1_ = NULL;
5264 +       const gchar* _tmp2_ = NULL;
5265 +       const gchar* _tmp3_ = NULL;
5266 +       gchar* _tmp4_ = NULL;
5267 +       gint index = 0;
5268 +       const gchar* _tmp5_ = NULL;
5269 +       const gchar* _tmp6_ = NULL;
5270 +       gint _tmp7_ = 0;
5271 +       const gchar* _tmp8_ = NULL;
5272 +       const gchar* _tmp9_ = NULL;
5273 +       gint _tmp10_ = 0;
5274 +       gchar* _tmp11_ = NULL;
5275 +       gchar* _tmp12_ = NULL;
5276 +       gchar* _tmp13_ = NULL;
5277 +       GError * _inner_error_ = NULL;
5278 +       parent_class = G_OBJECT_CLASS (rygel_lms_category_container_parent_class);
5279 +       obj = parent_class->constructor (type, n_construct_properties, construct_properties);
5280 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer);
5281 +       _tmp0_ = gee_array_list_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, g_free, NULL, NULL, NULL);
5282 +       _tmp1_ = _tmp0_;
5283 +       rygel_searchable_container_set_search_classes ((RygelSearchableContainer*) self, _tmp1_);
5284 +       _g_object_unref0 (_tmp1_);
5285 +       _tmp2_ = rygel_media_object_get_id ((RygelMediaObject*) self);
5286 +       _tmp3_ = _tmp2_;
5287 +       _tmp4_ = g_strdup_printf ("%s:", _tmp3_);
5288 +       _g_free0 (self->child_prefix);
5289 +       self->child_prefix = _tmp4_;
5290 +       _tmp5_ = rygel_media_object_get_id ((RygelMediaObject*) self);
5291 +       _tmp6_ = _tmp5_;
5292 +       _tmp7_ = string_index_of_char (_tmp6_, (gunichar) ':', 0);
5293 +       index = _tmp7_;
5294 +       _tmp8_ = rygel_media_object_get_id ((RygelMediaObject*) self);
5295 +       _tmp9_ = _tmp8_;
5296 +       _tmp10_ = index;
5297 +       _tmp11_ = string_slice (_tmp9_, (glong) 0, (glong) _tmp10_);
5298 +       _tmp12_ = _tmp11_;
5299 +       _tmp13_ = g_strconcat (_tmp12_, ":all:", NULL);
5300 +       _g_free0 (self->ref_prefix);
5301 +       self->ref_prefix = _tmp13_;
5302 +       _g_free0 (_tmp12_);
5303 +       {
5304 +               sqlite3_stmt* _tmp14_ = NULL;
5305 +               RygelLMSDatabase* _tmp15_ = NULL;
5306 +               const gchar* _tmp16_ = NULL;
5307 +               sqlite3_stmt* _tmp17_ = NULL;
5308 +               sqlite3_stmt* _tmp18_ = NULL;
5309 +               sqlite3_stmt* _tmp19_ = NULL;
5310 +               RygelLMSDatabase* _tmp20_ = NULL;
5311 +               const gchar* _tmp21_ = NULL;
5312 +               sqlite3_stmt* _tmp22_ = NULL;
5313 +               sqlite3_stmt* _tmp23_ = NULL;
5314 +               sqlite3_stmt* stmt_count = NULL;
5315 +               RygelLMSDatabase* _tmp24_ = NULL;
5316 +               const gchar* _tmp25_ = NULL;
5317 +               sqlite3_stmt* _tmp26_ = NULL;
5318 +               sqlite3_stmt* _tmp27_ = NULL;
5319 +               gint _tmp28_ = 0;
5320 +               gboolean _tmp31_ = FALSE;
5321 +               const gchar* _tmp32_ = NULL;
5322 +               _tmp15_ = self->priv->_lms_db;
5323 +               _tmp16_ = self->priv->_sql_all;
5324 +               _tmp17_ = rygel_lms_database_prepare (_tmp15_, _tmp16_, &_inner_error_);
5325 +               _tmp14_ = _tmp17_;
5326 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
5327 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
5328 +                               goto __catch7_rygel_lms_database_error;
5329 +                       }
5330 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5331 +                       g_clear_error (&_inner_error_);
5332 +               }
5333 +               _tmp18_ = _tmp14_;
5334 +               _tmp14_ = NULL;
5335 +               _sqlite3_finalize0 (self->stmt_all);
5336 +               self->stmt_all = _tmp18_;
5337 +               _tmp20_ = self->priv->_lms_db;
5338 +               _tmp21_ = self->priv->_sql_find_object;
5339 +               _tmp22_ = rygel_lms_database_prepare (_tmp20_, _tmp21_, &_inner_error_);
5340 +               _tmp19_ = _tmp22_;
5341 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
5342 +                       _sqlite3_finalize0 (_tmp14_);
5343 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
5344 +                               goto __catch7_rygel_lms_database_error;
5345 +                       }
5346 +                       _sqlite3_finalize0 (_tmp14_);
5347 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5348 +                       g_clear_error (&_inner_error_);
5349 +               }
5350 +               _tmp23_ = _tmp19_;
5351 +               _tmp19_ = NULL;
5352 +               _sqlite3_finalize0 (self->stmt_find_object);
5353 +               self->stmt_find_object = _tmp23_;
5354 +               _tmp24_ = self->priv->_lms_db;
5355 +               _tmp25_ = self->priv->_sql_count;
5356 +               _tmp26_ = rygel_lms_database_prepare (_tmp24_, _tmp25_, &_inner_error_);
5357 +               stmt_count = _tmp26_;
5358 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
5359 +                       _sqlite3_finalize0 (_tmp19_);
5360 +                       _sqlite3_finalize0 (_tmp14_);
5361 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
5362 +                               goto __catch7_rygel_lms_database_error;
5363 +                       }
5364 +                       _sqlite3_finalize0 (_tmp19_);
5365 +                       _sqlite3_finalize0 (_tmp14_);
5366 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5367 +                       g_clear_error (&_inner_error_);
5368 +               }
5369 +               _tmp27_ = stmt_count;
5370 +               _tmp28_ = sqlite3_step (_tmp27_);
5371 +               if (_tmp28_ == SQLITE_ROW) {
5372 +                       sqlite3_stmt* _tmp29_ = NULL;
5373 +                       gint _tmp30_ = 0;
5374 +                       _tmp29_ = stmt_count;
5375 +                       _tmp30_ = sqlite3_column_int (_tmp29_, 0);
5376 +                       rygel_media_container_set_child_count ((RygelMediaContainer*) self, _tmp30_);
5377 +               }
5378 +               _tmp32_ = self->priv->_sql_added;
5379 +               if (_tmp32_ != NULL) {
5380 +                       const gchar* _tmp33_ = NULL;
5381 +                       _tmp33_ = self->priv->_sql_removed;
5382 +                       _tmp31_ = _tmp33_ != NULL;
5383 +               } else {
5384 +                       _tmp31_ = FALSE;
5385 +               }
5386 +               if (_tmp31_) {
5387 +                       sqlite3_stmt* _tmp34_ = NULL;
5388 +                       RygelLMSDatabase* _tmp35_ = NULL;
5389 +                       const gchar* _tmp36_ = NULL;
5390 +                       sqlite3_stmt* _tmp37_ = NULL;
5391 +                       sqlite3_stmt* _tmp38_ = NULL;
5392 +                       sqlite3_stmt* _tmp39_ = NULL;
5393 +                       RygelLMSDatabase* _tmp40_ = NULL;
5394 +                       const gchar* _tmp41_ = NULL;
5395 +                       sqlite3_stmt* _tmp42_ = NULL;
5396 +                       sqlite3_stmt* _tmp43_ = NULL;
5397 +                       RygelLMSDatabase* _tmp44_ = NULL;
5398 +                       _tmp35_ = self->priv->_lms_db;
5399 +                       _tmp36_ = self->priv->_sql_added;
5400 +                       _tmp37_ = rygel_lms_database_prepare (_tmp35_, _tmp36_, &_inner_error_);
5401 +                       _tmp34_ = _tmp37_;
5402 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
5403 +                               _sqlite3_finalize0 (stmt_count);
5404 +                               _sqlite3_finalize0 (_tmp19_);
5405 +                               _sqlite3_finalize0 (_tmp14_);
5406 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
5407 +                                       goto __catch7_rygel_lms_database_error;
5408 +                               }
5409 +                               _sqlite3_finalize0 (stmt_count);
5410 +                               _sqlite3_finalize0 (_tmp19_);
5411 +                               _sqlite3_finalize0 (_tmp14_);
5412 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5413 +                               g_clear_error (&_inner_error_);
5414 +                       }
5415 +                       _tmp38_ = _tmp34_;
5416 +                       _tmp34_ = NULL;
5417 +                       _sqlite3_finalize0 (self->stmt_added);
5418 +                       self->stmt_added = _tmp38_;
5419 +                       _tmp40_ = self->priv->_lms_db;
5420 +                       _tmp41_ = self->priv->_sql_removed;
5421 +                       _tmp42_ = rygel_lms_database_prepare (_tmp40_, _tmp41_, &_inner_error_);
5422 +                       _tmp39_ = _tmp42_;
5423 +                       if (G_UNLIKELY (_inner_error_ != NULL)) {
5424 +                               _sqlite3_finalize0 (_tmp34_);
5425 +                               _sqlite3_finalize0 (stmt_count);
5426 +                               _sqlite3_finalize0 (_tmp19_);
5427 +                               _sqlite3_finalize0 (_tmp14_);
5428 +                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
5429 +                                       goto __catch7_rygel_lms_database_error;
5430 +                               }
5431 +                               _sqlite3_finalize0 (_tmp34_);
5432 +                               _sqlite3_finalize0 (stmt_count);
5433 +                               _sqlite3_finalize0 (_tmp19_);
5434 +                               _sqlite3_finalize0 (_tmp14_);
5435 +                               g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5436 +                               g_clear_error (&_inner_error_);
5437 +                       }
5438 +                       _tmp43_ = _tmp39_;
5439 +                       _tmp39_ = NULL;
5440 +                       _sqlite3_finalize0 (self->stmt_removed);
5441 +                       self->stmt_removed = _tmp43_;
5442 +                       _tmp44_ = self->priv->_lms_db;
5443 +                       g_signal_connect_object (_tmp44_, "db-updated", (GCallback) _rygel_lms_category_container_on_db_updated_rygel_lms_database_db_updated, self, 0);
5444 +                       _sqlite3_finalize0 (_tmp39_);
5445 +                       _sqlite3_finalize0 (_tmp34_);
5446 +               }
5447 +               _sqlite3_finalize0 (stmt_count);
5448 +               _sqlite3_finalize0 (_tmp19_);
5449 +               _sqlite3_finalize0 (_tmp14_);
5450 +       }
5451 +       goto __finally7;
5452 +       __catch7_rygel_lms_database_error:
5453 +       {
5454 +               GError* e = NULL;
5455 +               const gchar* _tmp45_ = NULL;
5456 +               const gchar* _tmp46_ = NULL;
5457 +               GError* _tmp47_ = NULL;
5458 +               const gchar* _tmp48_ = NULL;
5459 +               e = _inner_error_;
5460 +               _inner_error_ = NULL;
5461 +               _tmp45_ = rygel_media_object_get_title ((RygelMediaObject*) self);
5462 +               _tmp46_ = _tmp45_;
5463 +               _tmp47_ = e;
5464 +               _tmp48_ = _tmp47_->message;
5465 +               g_warning ("rygel-lms-category-container.vala:424: Container %s: %s", _tmp46_, _tmp48_);
5466 +               _g_error_free0 (e);
5467 +       }
5468 +       __finally7:
5469 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
5470 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5471 +               g_clear_error (&_inner_error_);
5472 +       }
5473 +       return obj;
5474 +}
5475 +
5476 +
5477 +static void rygel_lms_category_container_class_init (RygelLMSCategoryContainerClass * klass) {
5478 +       rygel_lms_category_container_parent_class = g_type_class_peek_parent (klass);
5479 +       g_type_class_add_private (klass, sizeof (RygelLMSCategoryContainerPrivate));
5480 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_category_container_real_object_from_statement;
5481 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_all_with_filter = rygel_lms_category_container_real_get_sql_all_with_filter;
5482 +       ((RygelLMSCategoryContainerClass *) klass)->get_sql_count_with_filter = rygel_lms_category_container_real_get_sql_count_with_filter;
5483 +       ((RygelLMSCategoryContainerClass *) klass)->get_child_count_with_filter = rygel_lms_category_container_real_get_child_count_with_filter;
5484 +       ((RygelLMSCategoryContainerClass *) klass)->get_children_with_filter = rygel_lms_category_container_real_get_children_with_filter;
5485 +       ((RygelMediaContainerClass *) klass)->get_children = rygel_lms_category_container_real_get_children;
5486 +       ((RygelMediaContainerClass *) klass)->get_children_finish = rygel_lms_category_container_real_get_children_finish;
5487 +       ((RygelMediaContainerClass *) klass)->find_object = rygel_lms_category_container_real_find_object;
5488 +       ((RygelMediaContainerClass *) klass)->find_object_finish = rygel_lms_category_container_real_find_object_finish;
5489 +       G_OBJECT_CLASS (klass)->get_property = _vala_rygel_lms_category_container_get_property;
5490 +       G_OBJECT_CLASS (klass)->set_property = _vala_rygel_lms_category_container_set_property;
5491 +       G_OBJECT_CLASS (klass)->constructor = rygel_lms_category_container_constructor;
5492 +       G_OBJECT_CLASS (klass)->finalize = rygel_lms_category_container_finalize;
5493 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SEARCH_CLASSES, g_param_spec_object ("search-classes", "search-classes", "search-classes", GEE_TYPE_ARRAY_LIST, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
5494 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_LMS_DB, rygel_lms_param_spec_database ("lms-db", "lms-db", "lms-db", RYGEL_LMS_TYPE_DATABASE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5495 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_DB_ID, g_param_spec_string ("db-id", "db-id", "db-id", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5496 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SQL_ALL, g_param_spec_string ("sql-all", "sql-all", "sql-all", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5497 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SQL_FIND_OBJECT, g_param_spec_string ("sql-find-object", "sql-find-object", "sql-find-object", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5498 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SQL_COUNT, g_param_spec_string ("sql-count", "sql-count", "sql-count", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5499 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SQL_ADDED, g_param_spec_string ("sql-added", "sql-added", "sql-added", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5500 +       g_object_class_install_property (G_OBJECT_CLASS (klass), RYGEL_LMS_CATEGORY_CONTAINER_SQL_REMOVED, g_param_spec_string ("sql-removed", "sql-removed", "sql-removed", NULL, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
5501 +}
5502 +
5503 +
5504 +static void rygel_lms_category_container_rygel_trackable_container_interface_init (RygelTrackableContainerIface * iface) {
5505 +       rygel_lms_category_container_rygel_trackable_container_parent_iface = g_type_interface_peek_parent (iface);
5506 +       iface->add_child = (void (*)(RygelTrackableContainer*, RygelMediaObject*)) rygel_lms_category_container_real_add_child;
5507 +       iface->add_child_finish = rygel_lms_category_container_real_add_child_finish;
5508 +       iface->remove_child = (void (*)(RygelTrackableContainer*, RygelMediaObject*)) rygel_lms_category_container_real_remove_child;
5509 +       iface->remove_child_finish = rygel_lms_category_container_real_remove_child_finish;
5510 +}
5511 +
5512 +
5513 +static void rygel_lms_category_container_rygel_searchable_container_interface_init (RygelSearchableContainerIface * iface) {
5514 +       rygel_lms_category_container_rygel_searchable_container_parent_iface = g_type_interface_peek_parent (iface);
5515 +       iface->search = (RygelMediaObjects* (*)(RygelSearchableContainer*, RygelSearchExpression*, guint, guint, guint*, const gchar*, GCancellable*, GError**)) rygel_lms_category_container_real_search;
5516 +       iface->search_finish = rygel_lms_category_container_real_search_finish;
5517 +       iface->get_search_classes = rygel_lms_category_container_real_get_search_classes;
5518 +       iface->set_search_classes = rygel_lms_category_container_real_set_search_classes;
5519 +}
5520 +
5521 +
5522 +static void rygel_lms_category_container_instance_init (RygelLMSCategoryContainer * self) {
5523 +       self->priv = RYGEL_LMS_CATEGORY_CONTAINER_GET_PRIVATE (self);
5524 +}
5525 +
5526 +
5527 +static void rygel_lms_category_container_finalize (GObject* obj) {
5528 +       RygelLMSCategoryContainer * self;
5529 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer);
5530 +       _g_object_unref0 (self->priv->_search_classes);
5531 +       _g_free0 (self->priv->_db_id);
5532 +       _g_free0 (self->priv->_sql_all);
5533 +       _g_free0 (self->priv->_sql_find_object);
5534 +       _g_free0 (self->priv->_sql_count);
5535 +       _g_free0 (self->priv->_sql_added);
5536 +       _g_free0 (self->priv->_sql_removed);
5537 +       _sqlite3_finalize0 (self->stmt_all);
5538 +       _sqlite3_finalize0 (self->stmt_find_object);
5539 +       _sqlite3_finalize0 (self->stmt_added);
5540 +       _sqlite3_finalize0 (self->stmt_removed);
5541 +       _g_free0 (self->child_prefix);
5542 +       _g_free0 (self->ref_prefix);
5543 +       G_OBJECT_CLASS (rygel_lms_category_container_parent_class)->finalize (obj);
5544 +}
5545 +
5546 +
5547 +GType rygel_lms_category_container_get_type (void) {
5548 +       static volatile gsize rygel_lms_category_container_type_id__volatile = 0;
5549 +       if (g_once_init_enter (&rygel_lms_category_container_type_id__volatile)) {
5550 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSCategoryContainerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_category_container_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSCategoryContainer), 0, (GInstanceInitFunc) rygel_lms_category_container_instance_init, NULL };
5551 +               static const GInterfaceInfo rygel_trackable_container_info = { (GInterfaceInitFunc) rygel_lms_category_container_rygel_trackable_container_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
5552 +               static const GInterfaceInfo rygel_searchable_container_info = { (GInterfaceInitFunc) rygel_lms_category_container_rygel_searchable_container_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
5553 +               GType rygel_lms_category_container_type_id;
5554 +               rygel_lms_category_container_type_id = g_type_register_static (RYGEL_TYPE_MEDIA_CONTAINER, "RygelLMSCategoryContainer", &g_define_type_info, G_TYPE_FLAG_ABSTRACT);
5555 +               g_type_add_interface_static (rygel_lms_category_container_type_id, RYGEL_TYPE_TRACKABLE_CONTAINER, &rygel_trackable_container_info);
5556 +               g_type_add_interface_static (rygel_lms_category_container_type_id, RYGEL_TYPE_SEARCHABLE_CONTAINER, &rygel_searchable_container_info);
5557 +               g_once_init_leave (&rygel_lms_category_container_type_id__volatile, rygel_lms_category_container_type_id);
5558 +       }
5559 +       return rygel_lms_category_container_type_id__volatile;
5560 +}
5561 +
5562 +
5563 +static void _vala_rygel_lms_category_container_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
5564 +       RygelLMSCategoryContainer * self;
5565 +       self = G_TYPE_CHECK_INSTANCE_CAST (object, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer);
5566 +       switch (property_id) {
5567 +               case RYGEL_LMS_CATEGORY_CONTAINER_SEARCH_CLASSES:
5568 +               g_value_set_object (value, rygel_searchable_container_get_search_classes ((RygelSearchableContainer*) self));
5569 +               break;
5570 +               case RYGEL_LMS_CATEGORY_CONTAINER_LMS_DB:
5571 +               rygel_lms_value_set_database (value, rygel_lms_category_container_get_lms_db (self));
5572 +               break;
5573 +               case RYGEL_LMS_CATEGORY_CONTAINER_DB_ID:
5574 +               g_value_set_string (value, rygel_lms_category_container_get_db_id (self));
5575 +               break;
5576 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_ALL:
5577 +               g_value_set_string (value, rygel_lms_category_container_get_sql_all (self));
5578 +               break;
5579 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_FIND_OBJECT:
5580 +               g_value_set_string (value, rygel_lms_category_container_get_sql_find_object (self));
5581 +               break;
5582 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_COUNT:
5583 +               g_value_set_string (value, rygel_lms_category_container_get_sql_count (self));
5584 +               break;
5585 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_ADDED:
5586 +               g_value_set_string (value, rygel_lms_category_container_get_sql_added (self));
5587 +               break;
5588 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_REMOVED:
5589 +               g_value_set_string (value, rygel_lms_category_container_get_sql_removed (self));
5590 +               break;
5591 +               default:
5592 +               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
5593 +               break;
5594 +       }
5595 +}
5596 +
5597 +
5598 +static void _vala_rygel_lms_category_container_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
5599 +       RygelLMSCategoryContainer * self;
5600 +       self = G_TYPE_CHECK_INSTANCE_CAST (object, RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer);
5601 +       switch (property_id) {
5602 +               case RYGEL_LMS_CATEGORY_CONTAINER_SEARCH_CLASSES:
5603 +               rygel_searchable_container_set_search_classes ((RygelSearchableContainer*) self, g_value_get_object (value));
5604 +               break;
5605 +               case RYGEL_LMS_CATEGORY_CONTAINER_LMS_DB:
5606 +               rygel_lms_category_container_set_lms_db (self, rygel_lms_value_get_database (value));
5607 +               break;
5608 +               case RYGEL_LMS_CATEGORY_CONTAINER_DB_ID:
5609 +               rygel_lms_category_container_set_db_id (self, g_value_get_string (value));
5610 +               break;
5611 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_ALL:
5612 +               rygel_lms_category_container_set_sql_all (self, g_value_get_string (value));
5613 +               break;
5614 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_FIND_OBJECT:
5615 +               rygel_lms_category_container_set_sql_find_object (self, g_value_get_string (value));
5616 +               break;
5617 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_COUNT:
5618 +               rygel_lms_category_container_set_sql_count (self, g_value_get_string (value));
5619 +               break;
5620 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_ADDED:
5621 +               rygel_lms_category_container_set_sql_added (self, g_value_get_string (value));
5622 +               break;
5623 +               case RYGEL_LMS_CATEGORY_CONTAINER_SQL_REMOVED:
5624 +               rygel_lms_category_container_set_sql_removed (self, g_value_get_string (value));
5625 +               break;
5626 +               default:
5627 +               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
5628 +               break;
5629 +       }
5630 +}
5631 +
5632 +
5633 +
5634 diff --git a/src/plugins/lms/rygel-lms-database.c b/src/plugins/lms/rygel-lms-database.c
5635 new file mode 100644
5636 index 0000000..687ef64
5637 --- /dev/null
5638 +++ b/src/plugins/lms/rygel-lms-database.c
5639 @@ -0,0 +1,1349 @@
5640 +/* rygel-lms-database.c generated by valac 0.28.0, the Vala compiler
5641 + * generated from rygel-lms-database.vala, do not modify */
5642 +
5643 +/*
5644 + * Copyright (C) 2009,2011 Jens Georg <mail@jensge.org>,
5645 + *           (C) 2013 Intel Corporation.
5646 + *
5647 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
5648 + *
5649 + * This file is part of Rygel.
5650 + *
5651 + * Rygel is free software; you can redistribute it and/or modify
5652 + * it under the terms of the GNU Lesser General Public License as published by
5653 + * the Free Software Foundation; either version 2 of the License, or
5654 + * (at your option) any later version.
5655 + *
5656 + * Rygel is distributed in the hope that it will be useful,
5657 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
5658 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5659 + * GNU Lesser General Public License for more details.
5660 + *
5661 + * You should have received a copy of the GNU Lesser General Public License
5662 + * along with this program; if not, write to the Free Software Foundation,
5663 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
5664 + */
5665 +
5666 +#include <glib.h>
5667 +#include <glib-object.h>
5668 +#include <sqlite3.h>
5669 +#include <gio/gio.h>
5670 +#include <stdlib.h>
5671 +#include <string.h>
5672 +#include <glib/gi18n-lib.h>
5673 +#include <gobject/gvaluecollector.h>
5674 +
5675 +
5676 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
5677 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
5678 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
5679 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
5680 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
5681 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
5682 +
5683 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
5684 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
5685 +typedef struct _RygelLMSDatabasePrivate RygelLMSDatabasePrivate;
5686 +
5687 +#define RYGEL_LMS_TYPE_DBUS (rygel_lms_dbus_get_type ())
5688 +#define RYGEL_LMS_DBUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DBUS, RygelLMSDBus))
5689 +#define RYGEL_LMS_IS_DBUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DBUS))
5690 +#define RYGEL_LMS_DBUS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), RYGEL_LMS_TYPE_DBUS, RygelLMSDBusIface))
5691 +
5692 +typedef struct _RygelLMSDBus RygelLMSDBus;
5693 +typedef struct _RygelLMSDBusIface RygelLMSDBusIface;
5694 +
5695 +#define RYGEL_LMS_TYPE_DBUS_PROXY (rygel_lms_dbus_proxy_get_type ())
5696 +#define _sqlite3_close0(var) ((var == NULL) ? NULL : (var = (sqlite3_close (var), NULL)))
5697 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
5698 +#define _g_free0(var) (var = (g_free (var), NULL))
5699 +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
5700 +#define _rygel_lms_database_unref0(var) ((var == NULL) ? NULL : (var = (rygel_lms_database_unref (var), NULL)))
5701 +#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
5702 +#define _g_variant_iter_free0(var) ((var == NULL) ? NULL : (var = (g_variant_iter_free (var), NULL)))
5703 +#define _sqlite3_finalize0(var) ((var == NULL) ? NULL : (var = (sqlite3_finalize (var), NULL)))
5704 +typedef struct _RygelLMSParamSpecDatabase RygelLMSParamSpecDatabase;
5705 +#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
5706 +#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
5707 +#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
5708 +#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
5709 +
5710 +typedef enum  {
5711 +       RYGEL_LMS_DATABASE_ERROR_OPEN,
5712 +       RYGEL_LMS_DATABASE_ERROR_PREPARE,
5713 +       RYGEL_LMS_DATABASE_ERROR_BIND,
5714 +       RYGEL_LMS_DATABASE_ERROR_STEP,
5715 +       RYGEL_LMS_DATABASE_ERROR_NOT_FOUND
5716 +} RygelLMSDatabaseError;
5717 +#define RYGEL_LMS_DATABASE_ERROR rygel_lms_database_error_quark ()
5718 +struct _RygelLMSDatabase {
5719 +       GTypeInstance parent_instance;
5720 +       volatile int ref_count;
5721 +       RygelLMSDatabasePrivate * priv;
5722 +};
5723 +
5724 +struct _RygelLMSDatabaseClass {
5725 +       GTypeClass parent_class;
5726 +       void (*finalize) (RygelLMSDatabase *self);
5727 +};
5728 +
5729 +struct _RygelLMSDBusIface {
5730 +       GTypeInterface parent_iface;
5731 +       gchar* (*get_data_base_path) (RygelLMSDBus* self);
5732 +       guint64 (*get_update_id) (RygelLMSDBus* self);
5733 +};
5734 +
5735 +struct _RygelLMSDatabasePrivate {
5736 +       sqlite3* db;
5737 +       RygelLMSDBus* lms_proxy;
5738 +       guint64 update_id;
5739 +};
5740 +
5741 +struct _RygelLMSParamSpecDatabase {
5742 +       GParamSpec parent_instance;
5743 +};
5744 +
5745 +
5746 +static gpointer rygel_lms_database_parent_class = NULL;
5747 +
5748 +GQuark rygel_lms_database_error_quark (void);
5749 +gint rygel_lms_utf8_collate_str (guint8* a, int a_length1, guint8* b, int b_length1);
5750 +gpointer rygel_lms_database_ref (gpointer instance);
5751 +void rygel_lms_database_unref (gpointer instance);
5752 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
5753 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
5754 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
5755 +gpointer rygel_lms_value_get_database (const GValue* value);
5756 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
5757 +GType rygel_lms_dbus_get_type (void) G_GNUC_CONST;
5758 +GType rygel_lms_dbus_proxy_get_type (void) G_GNUC_CONST;
5759 +guint rygel_lms_dbus_register_object (void* object, GDBusConnection* connection, const gchar* path, GError** error);
5760 +#define RYGEL_LMS_DATABASE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabasePrivate))
5761 +enum  {
5762 +       RYGEL_LMS_DATABASE_DUMMY_PROPERTY
5763 +};
5764 +static void rygel_lms_database_utf8_contains (sqlite3_context* context, sqlite3_value** args, int args_length1);
5765 +static gint rygel_lms_database_utf8_collate (gint alen, void* a, gint blen, void* b);
5766 +RygelLMSDatabase* rygel_lms_database_new (GError** error);
5767 +RygelLMSDatabase* rygel_lms_database_construct (GType object_type, GError** error);
5768 +gchar* rygel_lms_dbus_get_data_base_path (RygelLMSDBus* self);
5769 +guint64 rygel_lms_dbus_get_update_id (RygelLMSDBus* self);
5770 +static void rygel_lms_database_on_lms_properties_changed (RygelLMSDatabase* self, GDBusProxy* lms_proxy, GVariant* changed, gchar** invalidated, int invalidated_length1);
5771 +static void _rygel_lms_database_on_lms_properties_changed_g_dbus_proxy_g_properties_changed (GDBusProxy* _sender, GVariant* changed_properties, gchar** invalidated_properties, gpointer self);
5772 +static void _rygel_lms_database_utf8_contains_sqlite_user_func_callback (sqlite3_context* context, int values_length1, sqlite3_value** values);
5773 +static gint _rygel_lms_database_utf8_collate_sqlite_compare_callback (gpointer self, gint alen, void* a, gint blen, void* b);
5774 +static gchar* _variant_get1 (GVariant* value);
5775 +static guint64 _variant_get2 (GVariant* value);
5776 +static guint64 _variant_get3 (GVariant* value);
5777 +sqlite3_stmt* rygel_lms_database_prepare (RygelLMSDatabase* self, const gchar* query_string, GError** error);
5778 +sqlite3_stmt* rygel_lms_database_prepare_and_init (RygelLMSDatabase* self, const gchar* query, GValue* arguments, int arguments_length1, GError** error);
5779 +void rygel_lms_database_find_object (const gchar* id, sqlite3_stmt* stmt, GError** error);
5780 +void rygel_lms_database_get_children_init (sqlite3_stmt* stmt, guint offset, guint max_count, const gchar* sort_criteria, GError** error);
5781 +void rygel_lms_database_get_children_with_update_id_init (sqlite3_stmt* stmt, guint64 old_id, guint64 new_id, GError** error);
5782 +gboolean rygel_lms_database_get_children_step (sqlite3_stmt* stmt, GError** error);
5783 +static void g_cclosure_user_marshal_VOID__UINT64_UINT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
5784 +static void rygel_lms_database_finalize (RygelLMSDatabase* obj);
5785 +static gint _vala_array_length (gpointer array);
5786 +
5787 +
5788 +GQuark rygel_lms_database_error_quark (void) {
5789 +       return g_quark_from_static_string ("rygel_lms_database_error-quark");
5790 +}
5791 +
5792 +
5793 +/**
5794 +     * Function to implement the custom SQL function 'contains'
5795 +     */
5796 +static void rygel_lms_database_utf8_contains (sqlite3_context* context, sqlite3_value** args, int args_length1) {
5797 +       sqlite3_value** _tmp0_ = NULL;
5798 +       gint _tmp0__length1 = 0;
5799 +       gboolean _tmp1_ = FALSE;
5800 +       sqlite3_value** _tmp2_ = NULL;
5801 +       gint _tmp2__length1 = 0;
5802 +       sqlite3_value* _tmp3_ = NULL;
5803 +       const gchar* _tmp4_ = NULL;
5804 +       gchar* pattern = NULL;
5805 +       sqlite3_value** _tmp9_ = NULL;
5806 +       gint _tmp9__length1 = 0;
5807 +       sqlite3_value* _tmp10_ = NULL;
5808 +       const gchar* _tmp11_ = NULL;
5809 +       gchar* _tmp12_ = NULL;
5810 +       const gchar* _tmp13_ = NULL;
5811 +       sqlite3_value** _tmp14_ = NULL;
5812 +       gint _tmp14__length1 = 0;
5813 +       sqlite3_value* _tmp15_ = NULL;
5814 +       const gchar* _tmp16_ = NULL;
5815 +       gboolean _tmp17_ = FALSE;
5816 +       g_return_if_fail (context != NULL);
5817 +       _tmp0_ = args;
5818 +       _tmp0__length1 = args_length1;
5819 +       _vala_return_if_fail (_tmp0__length1 == 2, "args.length == 2");
5820 +       _tmp2_ = args;
5821 +       _tmp2__length1 = args_length1;
5822 +       _tmp3_ = _tmp2_[0];
5823 +       _tmp4_ = sqlite3_value_text (_tmp3_);
5824 +       if (_tmp4_ == NULL) {
5825 +               _tmp1_ = TRUE;
5826 +       } else {
5827 +               sqlite3_value** _tmp5_ = NULL;
5828 +               gint _tmp5__length1 = 0;
5829 +               sqlite3_value* _tmp6_ = NULL;
5830 +               const gchar* _tmp7_ = NULL;
5831 +               _tmp5_ = args;
5832 +               _tmp5__length1 = args_length1;
5833 +               _tmp6_ = _tmp5_[1];
5834 +               _tmp7_ = sqlite3_value_text (_tmp6_);
5835 +               _tmp1_ = _tmp7_ == NULL;
5836 +       }
5837 +       if (_tmp1_) {
5838 +               sqlite3_context* _tmp8_ = NULL;
5839 +               _tmp8_ = context;
5840 +               sqlite3_result_int (_tmp8_, 0);
5841 +               return;
5842 +       }
5843 +       _tmp9_ = args;
5844 +       _tmp9__length1 = args_length1;
5845 +       _tmp10_ = _tmp9_[1];
5846 +       _tmp11_ = sqlite3_value_text (_tmp10_);
5847 +       _tmp12_ = g_regex_escape_string (_tmp11_, -1);
5848 +       pattern = _tmp12_;
5849 +       _tmp13_ = pattern;
5850 +       _tmp14_ = args;
5851 +       _tmp14__length1 = args_length1;
5852 +       _tmp15_ = _tmp14_[0];
5853 +       _tmp16_ = sqlite3_value_text (_tmp15_);
5854 +       _tmp17_ = g_regex_match_simple (_tmp13_, _tmp16_, G_REGEX_CASELESS, 0);
5855 +       if (_tmp17_) {
5856 +               sqlite3_context* _tmp18_ = NULL;
5857 +               _tmp18_ = context;
5858 +               sqlite3_result_int (_tmp18_, 1);
5859 +       } else {
5860 +               sqlite3_context* _tmp19_ = NULL;
5861 +               _tmp19_ = context;
5862 +               sqlite3_result_int (_tmp19_, 0);
5863 +       }
5864 +       _g_free0 (pattern);
5865 +}
5866 +
5867 +
5868 +/**
5869 +     * Function to implement the custom SQLite collation 'CASEFOLD'.
5870 +     *
5871 +     * Uses utf8 case-fold to compare the strings.
5872 +     */
5873 +static gint rygel_lms_database_utf8_collate (gint alen, void* a, gint blen, void* b) {
5874 +       gint result = 0;
5875 +       guint8* _a = NULL;
5876 +       void* _tmp0_ = NULL;
5877 +       gint _a_length1 = 0;
5878 +       gint __a_size_ = 0;
5879 +       gint _tmp1_ = 0;
5880 +       gint _tmp2_ = 0;
5881 +       guint8* _b = NULL;
5882 +       void* _tmp3_ = NULL;
5883 +       gint _b_length1 = 0;
5884 +       gint __b_size_ = 0;
5885 +       gint _tmp4_ = 0;
5886 +       gint _tmp5_ = 0;
5887 +       gint _tmp6_ = 0;
5888 +       _tmp0_ = a;
5889 +       _a = (guint8*) _tmp0_;
5890 +       _a_length1 = -1;
5891 +       __a_size_ = _a_length1;
5892 +       _tmp1_ = alen;
5893 +       _a_length1 = _tmp1_;
5894 +       _tmp2_ = _a_length1;
5895 +       _tmp3_ = b;
5896 +       _b = (guint8*) _tmp3_;
5897 +       _b_length1 = -1;
5898 +       __b_size_ = _b_length1;
5899 +       _tmp4_ = blen;
5900 +       _b_length1 = _tmp4_;
5901 +       _tmp5_ = _b_length1;
5902 +       _tmp6_ = rygel_lms_utf8_collate_str (_a, _a_length1, _b, _b_length1);
5903 +       result = _tmp6_;
5904 +       return result;
5905 +}
5906 +
5907 +
5908 +static void _rygel_lms_database_on_lms_properties_changed_g_dbus_proxy_g_properties_changed (GDBusProxy* _sender, GVariant* changed_properties, gchar** invalidated_properties, gpointer self) {
5909 +       rygel_lms_database_on_lms_properties_changed ((RygelLMSDatabase*) self, _sender, changed_properties, invalidated_properties, _vala_array_length (invalidated_properties));
5910 +}
5911 +
5912 +
5913 +static void _rygel_lms_database_utf8_contains_sqlite_user_func_callback (sqlite3_context* context, int values_length1, sqlite3_value** values) {
5914 +       rygel_lms_database_utf8_contains (context, values, values_length1);
5915 +}
5916 +
5917 +
5918 +static gint _rygel_lms_database_utf8_collate_sqlite_compare_callback (gpointer self, gint alen, void* a, gint blen, void* b) {
5919 +       gint result;
5920 +       result = rygel_lms_database_utf8_collate (alen, a, blen, b);
5921 +       return result;
5922 +}
5923 +
5924 +
5925 +RygelLMSDatabase* rygel_lms_database_construct (GType object_type, GError** error) {
5926 +       RygelLMSDatabase* self = NULL;
5927 +       gchar* db_path = NULL;
5928 +       const gchar* _tmp17_ = NULL;
5929 +       sqlite3* _tmp18_ = NULL;
5930 +       sqlite3* _tmp19_ = NULL;
5931 +       gint _tmp20_ = 0;
5932 +       sqlite3* _tmp25_ = NULL;
5933 +       sqlite3* _tmp26_ = NULL;
5934 +       GError * _inner_error_ = NULL;
5935 +       self = (RygelLMSDatabase*) g_type_create_instance (object_type);
5936 +       {
5937 +               RygelLMSDBus* _tmp0_ = NULL;
5938 +               RygelLMSDBus* _tmp1_ = NULL;
5939 +               RygelLMSDBus* _tmp2_ = NULL;
5940 +               RygelLMSDBus* _tmp3_ = NULL;
5941 +               gchar* _tmp4_ = NULL;
5942 +               gchar* _tmp5_ = NULL;
5943 +               const gchar* _tmp6_ = NULL;
5944 +               RygelLMSDBus* _tmp7_ = NULL;
5945 +               guint64 _tmp8_ = 0ULL;
5946 +               guint64 _tmp9_ = 0ULL;
5947 +               guint64 _tmp10_ = 0ULL;
5948 +               RygelLMSDBus* _tmp11_ = NULL;
5949 +               _tmp1_ = g_initable_new (RYGEL_LMS_TYPE_DBUS_PROXY, NULL, &_inner_error_, "g-flags", 0, "g-name", "org.lightmediascanner", "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", "/org/lightmediascanner/Scanner1", "g-interface-name", "org.lightmediascanner.Scanner1", "g-interface-info", g_type_get_qdata (RYGEL_LMS_TYPE_DBUS, g_quark_from_static_string ("vala-dbus-interface-info")), NULL);
5950 +               _tmp0_ = (RygelLMSDBus*) _tmp1_;
5951 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
5952 +                       if (_inner_error_->domain == G_IO_ERROR) {
5953 +                               goto __catch11_g_io_error;
5954 +                       }
5955 +                       _g_free0 (db_path);
5956 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
5957 +                       g_clear_error (&_inner_error_);
5958 +                       return NULL;
5959 +               }
5960 +               _tmp2_ = _tmp0_;
5961 +               _tmp0_ = NULL;
5962 +               _g_object_unref0 (self->priv->lms_proxy);
5963 +               self->priv->lms_proxy = _tmp2_;
5964 +               _tmp3_ = self->priv->lms_proxy;
5965 +               _tmp4_ = rygel_lms_dbus_get_data_base_path (_tmp3_);
5966 +               _tmp5_ = _tmp4_;
5967 +               _g_free0 (db_path);
5968 +               db_path = _tmp5_;
5969 +               _tmp6_ = db_path;
5970 +               g_debug ("rygel-lms-database.vala:94: Got db path %s from LMS over dbus", _tmp6_);
5971 +               _tmp7_ = self->priv->lms_proxy;
5972 +               _tmp8_ = rygel_lms_dbus_get_update_id (_tmp7_);
5973 +               _tmp9_ = _tmp8_;
5974 +               self->priv->update_id = _tmp9_;
5975 +               _tmp10_ = self->priv->update_id;
5976 +               g_debug ("rygel-lms-database.vala:96: Got updated id %lld from LMS over dbus", _tmp10_);
5977 +               _tmp11_ = self->priv->lms_proxy;
5978 +               g_signal_connect ((GDBusProxy*) _tmp11_, "g-properties-changed", (GCallback) _rygel_lms_database_on_lms_properties_changed_g_dbus_proxy_g_properties_changed, self);
5979 +               _g_object_unref0 (_tmp0_);
5980 +       }
5981 +       goto __finally11;
5982 +       __catch11_g_io_error:
5983 +       {
5984 +               GError* e = NULL;
5985 +               GError* _tmp12_ = NULL;
5986 +               const gchar* _tmp13_ = NULL;
5987 +               const gchar* _tmp14_ = NULL;
5988 +               gchar* _tmp15_ = NULL;
5989 +               const gchar* _tmp16_ = NULL;
5990 +               e = _inner_error_;
5991 +               _inner_error_ = NULL;
5992 +               _tmp12_ = e;
5993 +               _tmp13_ = _tmp12_->message;
5994 +               g_warning ("rygel-lms-database.vala:100: Couldn't get LMS Dbus proxy: %s", _tmp13_);
5995 +               _tmp14_ = g_get_user_config_dir ();
5996 +               _tmp15_ = g_strconcat (_tmp14_, "/lightmediascannerd/db.sqlite3", NULL);
5997 +               _g_free0 (db_path);
5998 +               db_path = _tmp15_;
5999 +               _tmp16_ = db_path;
6000 +               g_debug ("rygel-lms-database.vala:103: Using default sqlite database location %s", _tmp16_);
6001 +               _g_error_free0 (e);
6002 +       }
6003 +       __finally11:
6004 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
6005 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6006 +                       g_propagate_error (error, _inner_error_);
6007 +                       _g_free0 (db_path);
6008 +                       _rygel_lms_database_unref0 (self);
6009 +                       return NULL;
6010 +               } else {
6011 +                       _g_free0 (db_path);
6012 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6013 +                       g_clear_error (&_inner_error_);
6014 +                       return NULL;
6015 +               }
6016 +       }
6017 +       _tmp17_ = db_path;
6018 +       sqlite3_open (_tmp17_, &_tmp18_);
6019 +       _sqlite3_close0 (self->priv->db);
6020 +       self->priv->db = _tmp18_;
6021 +       _tmp19_ = self->priv->db;
6022 +       _tmp20_ = sqlite3_errcode (_tmp19_);
6023 +       if (_tmp20_ != SQLITE_OK) {
6024 +               const gchar* _tmp21_ = NULL;
6025 +               sqlite3* _tmp22_ = NULL;
6026 +               gint _tmp23_ = 0;
6027 +               GError* _tmp24_ = NULL;
6028 +               _tmp21_ = db_path;
6029 +               _tmp22_ = self->priv->db;
6030 +               _tmp23_ = sqlite3_errcode (_tmp22_);
6031 +               _tmp24_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_OPEN, "Failed to open '%s': %d", _tmp21_, _tmp23_);
6032 +               _inner_error_ = _tmp24_;
6033 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6034 +                       g_propagate_error (error, _inner_error_);
6035 +                       _g_free0 (db_path);
6036 +                       _rygel_lms_database_unref0 (self);
6037 +                       return NULL;
6038 +               } else {
6039 +                       _g_free0 (db_path);
6040 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6041 +                       g_clear_error (&_inner_error_);
6042 +                       return NULL;
6043 +               }
6044 +       }
6045 +       _tmp25_ = self->priv->db;
6046 +       sqlite3_create_function (_tmp25_, "contains", 2, SQLITE_UTF8, NULL, _rygel_lms_database_utf8_contains_sqlite_user_func_callback, NULL, NULL);
6047 +       _tmp26_ = self->priv->db;
6048 +       sqlite3_create_collation (_tmp26_, "CASEFOLD", SQLITE_UTF8, NULL, (int (*)(void *, int,  const void *, int,  const void *)) _rygel_lms_database_utf8_collate_sqlite_compare_callback);
6049 +       _g_free0 (db_path);
6050 +       return self;
6051 +}
6052 +
6053 +
6054 +RygelLMSDatabase* rygel_lms_database_new (GError** error) {
6055 +       return rygel_lms_database_construct (RYGEL_LMS_TYPE_DATABASE, error);
6056 +}
6057 +
6058 +
6059 +static gchar* _variant_get1 (GVariant* value) {
6060 +       return g_variant_dup_string (value, NULL);
6061 +}
6062 +
6063 +
6064 +static guint64 _variant_get2 (GVariant* value) {
6065 +       return g_variant_get_uint64 (value);
6066 +}
6067 +
6068 +
6069 +static guint64 _variant_get3 (GVariant* value) {
6070 +       return g_variant_get_uint64 (value);
6071 +}
6072 +
6073 +
6074 +static void rygel_lms_database_on_lms_properties_changed (RygelLMSDatabase* self, GDBusProxy* lms_proxy, GVariant* changed, gchar** invalidated, int invalidated_length1) {
6075 +       GVariant* _tmp0_ = NULL;
6076 +       const GVariantType* _tmp1_ = NULL;
6077 +       const GVariantType* _tmp2_ = NULL;
6078 +       gboolean _tmp3_ = FALSE;
6079 +       g_return_if_fail (self != NULL);
6080 +       g_return_if_fail (lms_proxy != NULL);
6081 +       g_return_if_fail (changed != NULL);
6082 +       _tmp0_ = changed;
6083 +       _tmp1_ = g_variant_get_type (_tmp0_);
6084 +       _tmp2_ = G_VARIANT_TYPE_VARDICT;
6085 +       _tmp3_ = g_variant_type_equal (_tmp1_, _tmp2_);
6086 +       if (!_tmp3_) {
6087 +               return;
6088 +       }
6089 +       {
6090 +               GVariantIter* _changed_prop_it = NULL;
6091 +               GVariant* _tmp4_ = NULL;
6092 +               GVariantIter* _tmp5_ = NULL;
6093 +               GVariant* changed_prop = NULL;
6094 +               _tmp4_ = changed;
6095 +               _tmp5_ = g_variant_iter_new (_tmp4_);
6096 +               _changed_prop_it = _tmp5_;
6097 +               while (TRUE) {
6098 +                       GVariantIter* _tmp6_ = NULL;
6099 +                       GVariant* _tmp7_ = NULL;
6100 +                       GVariant* _tmp8_ = NULL;
6101 +                       gchar* key = NULL;
6102 +                       GVariant* _tmp9_ = NULL;
6103 +                       GVariant* _tmp10_ = NULL;
6104 +                       GVariant* _tmp11_ = NULL;
6105 +                       gchar* _tmp12_ = NULL;
6106 +                       gchar* _tmp13_ = NULL;
6107 +                       GVariant* value = NULL;
6108 +                       GVariant* _tmp14_ = NULL;
6109 +                       GVariant* _tmp15_ = NULL;
6110 +                       GVariant* _tmp16_ = NULL;
6111 +                       GVariant* _tmp17_ = NULL;
6112 +                       GVariant* _tmp18_ = NULL;
6113 +                       const gchar* _tmp19_ = NULL;
6114 +                       GVariant* _tmp20_ = NULL;
6115 +                       gchar* _tmp21_ = NULL;
6116 +                       gchar* _tmp22_ = NULL;
6117 +                       const gchar* _tmp23_ = NULL;
6118 +                       const gchar* _tmp24_ = NULL;
6119 +                       GQuark _tmp26_ = 0U;
6120 +                       static GQuark _tmp25_label0 = 0;
6121 +                       _tmp6_ = _changed_prop_it;
6122 +                       _tmp7_ = g_variant_iter_next_value (_tmp6_);
6123 +                       _g_variant_unref0 (changed_prop);
6124 +                       changed_prop = _tmp7_;
6125 +                       _tmp8_ = changed_prop;
6126 +                       if (!(_tmp8_ != NULL)) {
6127 +                               break;
6128 +                       }
6129 +                       _tmp9_ = changed_prop;
6130 +                       _tmp10_ = g_variant_get_child_value (_tmp9_, (gsize) 0);
6131 +                       _tmp11_ = _tmp10_;
6132 +                       _tmp12_ = _variant_get1 (_tmp11_);
6133 +                       _tmp13_ = _tmp12_;
6134 +                       _g_variant_unref0 (_tmp11_);
6135 +                       key = _tmp13_;
6136 +                       _tmp14_ = changed_prop;
6137 +                       _tmp15_ = g_variant_get_child_value (_tmp14_, (gsize) 1);
6138 +                       _tmp16_ = _tmp15_;
6139 +                       _tmp17_ = g_variant_get_child_value (_tmp16_, (gsize) 0);
6140 +                       _tmp18_ = _tmp17_;
6141 +                       _g_variant_unref0 (_tmp16_);
6142 +                       value = _tmp18_;
6143 +                       _tmp19_ = key;
6144 +                       _tmp20_ = value;
6145 +                       _tmp21_ = g_variant_print (_tmp20_, TRUE);
6146 +                       _tmp22_ = _tmp21_;
6147 +                       g_debug ("rygel-lms-database.vala:138: LMS property %s changed value to %s", _tmp19_, _tmp22_);
6148 +                       _g_free0 (_tmp22_);
6149 +                       _tmp23_ = key;
6150 +                       _tmp24_ = _tmp23_;
6151 +                       _tmp26_ = (NULL == _tmp24_) ? 0 : g_quark_from_string (_tmp24_);
6152 +                       if (_tmp26_ == ((0 != _tmp25_label0) ? _tmp25_label0 : (_tmp25_label0 = g_quark_from_static_string ("UpdateID")))) {
6153 +                               switch (0) {
6154 +                                       default:
6155 +                                       {
6156 +                                               guint64 _tmp27_ = 0ULL;
6157 +                                               GVariant* _tmp28_ = NULL;
6158 +                                               guint64 _tmp29_ = 0ULL;
6159 +                                               GVariant* _tmp30_ = NULL;
6160 +                                               guint64 _tmp31_ = 0ULL;
6161 +                                               _tmp27_ = self->priv->update_id;
6162 +                                               _tmp28_ = value;
6163 +                                               _tmp29_ = _variant_get2 (_tmp28_);
6164 +                                               g_signal_emit_by_name (self, "db-updated", _tmp27_, _tmp29_);
6165 +                                               _tmp30_ = value;
6166 +                                               _tmp31_ = _variant_get3 (_tmp30_);
6167 +                                               self->priv->update_id = _tmp31_;
6168 +                                               break;
6169 +                                       }
6170 +                               }
6171 +                       }
6172 +                       _g_variant_unref0 (value);
6173 +                       _g_free0 (key);
6174 +               }
6175 +               _g_variant_unref0 (changed_prop);
6176 +               _g_variant_iter_free0 (_changed_prop_it);
6177 +       }
6178 +}
6179 +
6180 +
6181 +sqlite3_stmt* rygel_lms_database_prepare (RygelLMSDatabase* self, const gchar* query_string, GError** error) {
6182 +       sqlite3_stmt* result = NULL;
6183 +       sqlite3_stmt* statement = NULL;
6184 +       gint err = 0;
6185 +       sqlite3* _tmp0_ = NULL;
6186 +       const gchar* _tmp1_ = NULL;
6187 +       sqlite3_stmt* _tmp2_ = NULL;
6188 +       gint _tmp3_ = 0;
6189 +       gint _tmp4_ = 0;
6190 +       GError * _inner_error_ = NULL;
6191 +       g_return_val_if_fail (self != NULL, NULL);
6192 +       g_return_val_if_fail (query_string != NULL, NULL);
6193 +       _tmp0_ = self->priv->db;
6194 +       _tmp1_ = query_string;
6195 +       _tmp3_ = sqlite3_prepare_v2 (_tmp0_, _tmp1_, -1, &_tmp2_, NULL);
6196 +       _sqlite3_finalize0 (statement);
6197 +       statement = _tmp2_;
6198 +       err = _tmp3_;
6199 +       _tmp4_ = err;
6200 +       if (_tmp4_ != SQLITE_OK) {
6201 +               const gchar* _tmp5_ = NULL;
6202 +               gint _tmp6_ = 0;
6203 +               GError* _tmp7_ = NULL;
6204 +               _tmp5_ = query_string;
6205 +               _tmp6_ = err;
6206 +               _tmp7_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_PREPARE, "Unable to create statement '%s': %d", _tmp5_, _tmp6_);
6207 +               _inner_error_ = _tmp7_;
6208 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6209 +                       g_propagate_error (error, _inner_error_);
6210 +                       _sqlite3_finalize0 (statement);
6211 +                       return NULL;
6212 +               } else {
6213 +                       _sqlite3_finalize0 (statement);
6214 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6215 +                       g_clear_error (&_inner_error_);
6216 +                       return NULL;
6217 +               }
6218 +       }
6219 +       result = statement;
6220 +       return result;
6221 +}
6222 +
6223 +
6224 +sqlite3_stmt* rygel_lms_database_prepare_and_init (RygelLMSDatabase* self, const gchar* query, GValue* arguments, int arguments_length1, GError** error) {
6225 +       sqlite3_stmt* result = NULL;
6226 +       sqlite3_stmt* statement = NULL;
6227 +       gint err = 0;
6228 +       sqlite3* _tmp0_ = NULL;
6229 +       const gchar* _tmp1_ = NULL;
6230 +       sqlite3_stmt* _tmp2_ = NULL;
6231 +       gint _tmp3_ = 0;
6232 +       gint _tmp4_ = 0;
6233 +       GError * _inner_error_ = NULL;
6234 +       g_return_val_if_fail (self != NULL, NULL);
6235 +       g_return_val_if_fail (query != NULL, NULL);
6236 +       _tmp0_ = self->priv->db;
6237 +       _tmp1_ = query;
6238 +       _tmp3_ = sqlite3_prepare_v2 (_tmp0_, _tmp1_, -1, &_tmp2_, NULL);
6239 +       _sqlite3_finalize0 (statement);
6240 +       statement = _tmp2_;
6241 +       err = _tmp3_;
6242 +       _tmp4_ = err;
6243 +       if (_tmp4_ != SQLITE_OK) {
6244 +               const gchar* _tmp5_ = NULL;
6245 +               gint _tmp6_ = 0;
6246 +               GError* _tmp7_ = NULL;
6247 +               _tmp5_ = query;
6248 +               _tmp6_ = err;
6249 +               _tmp7_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_PREPARE, "Unable to create statement '%s': %d", _tmp5_, _tmp6_);
6250 +               _inner_error_ = _tmp7_;
6251 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6252 +                       g_propagate_error (error, _inner_error_);
6253 +                       _sqlite3_finalize0 (statement);
6254 +                       return NULL;
6255 +               } else {
6256 +                       _sqlite3_finalize0 (statement);
6257 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6258 +                       g_clear_error (&_inner_error_);
6259 +                       return NULL;
6260 +               }
6261 +       }
6262 +       {
6263 +               gint i = 0;
6264 +               i = 1;
6265 +               {
6266 +                       gboolean _tmp8_ = FALSE;
6267 +                       _tmp8_ = TRUE;
6268 +                       while (TRUE) {
6269 +                               gint _tmp10_ = 0;
6270 +                               GValue* _tmp11_ = NULL;
6271 +                               gint _tmp11__length1 = 0;
6272 +                               gint sqlite_err = 0;
6273 +                               GValue current_value = {0};
6274 +                               GValue* _tmp12_ = NULL;
6275 +                               gint _tmp12__length1 = 0;
6276 +                               gint _tmp13_ = 0;
6277 +                               GValue _tmp14_ = {0};
6278 +                               gboolean _tmp15_ = FALSE;
6279 +                               if (!_tmp8_) {
6280 +                                       gint _tmp9_ = 0;
6281 +                                       _tmp9_ = i;
6282 +                                       i = _tmp9_ + 1;
6283 +                               }
6284 +                               _tmp8_ = FALSE;
6285 +                               _tmp10_ = i;
6286 +                               _tmp11_ = arguments;
6287 +                               _tmp11__length1 = arguments_length1;
6288 +                               if (!(_tmp10_ <= _tmp11__length1)) {
6289 +                                       break;
6290 +                               }
6291 +                               _tmp12_ = arguments;
6292 +                               _tmp12__length1 = arguments_length1;
6293 +                               _tmp13_ = i;
6294 +                               _tmp14_ = _tmp12_[_tmp13_ - 1];
6295 +                               current_value = _tmp14_;
6296 +                               _tmp15_ = G_VALUE_HOLDS (&current_value, G_TYPE_INT);
6297 +                               if (_tmp15_) {
6298 +                                       sqlite3_stmt* _tmp16_ = NULL;
6299 +                                       gint _tmp17_ = 0;
6300 +                                       gint _tmp18_ = 0;
6301 +                                       gint _tmp19_ = 0;
6302 +                                       gint _tmp20_ = 0;
6303 +                                       _tmp16_ = statement;
6304 +                                       _tmp17_ = i;
6305 +                                       _tmp18_ = g_value_get_int (&current_value);
6306 +                                       _tmp19_ = sqlite3_bind_int (_tmp16_, _tmp17_, _tmp18_);
6307 +                                       sqlite_err = _tmp19_;
6308 +                                       _tmp20_ = sqlite_err;
6309 +                                       if (_tmp20_ != SQLITE_OK) {
6310 +                                               gint _tmp21_ = 0;
6311 +                                               GError* _tmp22_ = NULL;
6312 +                                               _tmp21_ = sqlite_err;
6313 +                                               _tmp22_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp21_);
6314 +                                               _inner_error_ = _tmp22_;
6315 +                                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6316 +                                                       g_propagate_error (error, _inner_error_);
6317 +                                                       _sqlite3_finalize0 (statement);
6318 +                                                       return NULL;
6319 +                                               } else {
6320 +                                                       _sqlite3_finalize0 (statement);
6321 +                                                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6322 +                                                       g_clear_error (&_inner_error_);
6323 +                                                       return NULL;
6324 +                                               }
6325 +                                       }
6326 +                               } else {
6327 +                                       gboolean _tmp23_ = FALSE;
6328 +                                       _tmp23_ = G_VALUE_HOLDS (&current_value, G_TYPE_INT64);
6329 +                                       if (_tmp23_) {
6330 +                                               sqlite3_stmt* _tmp24_ = NULL;
6331 +                                               gint _tmp25_ = 0;
6332 +                                               gint64 _tmp26_ = 0LL;
6333 +                                               gint _tmp27_ = 0;
6334 +                                               gint _tmp28_ = 0;
6335 +                                               _tmp24_ = statement;
6336 +                                               _tmp25_ = i;
6337 +                                               _tmp26_ = g_value_get_int64 (&current_value);
6338 +                                               _tmp27_ = sqlite3_bind_int64 (_tmp24_, _tmp25_, _tmp26_);
6339 +                                               sqlite_err = _tmp27_;
6340 +                                               _tmp28_ = sqlite_err;
6341 +                                               if (_tmp28_ != SQLITE_OK) {
6342 +                                                       gint _tmp29_ = 0;
6343 +                                                       GError* _tmp30_ = NULL;
6344 +                                                       _tmp29_ = sqlite_err;
6345 +                                                       _tmp30_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp29_);
6346 +                                                       _inner_error_ = _tmp30_;
6347 +                                                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6348 +                                                               g_propagate_error (error, _inner_error_);
6349 +                                                               _sqlite3_finalize0 (statement);
6350 +                                                               return NULL;
6351 +                                                       } else {
6352 +                                                               _sqlite3_finalize0 (statement);
6353 +                                                               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6354 +                                                               g_clear_error (&_inner_error_);
6355 +                                                               return NULL;
6356 +                                                       }
6357 +                                               }
6358 +                                       } else {
6359 +                                               gboolean _tmp31_ = FALSE;
6360 +                                               _tmp31_ = G_VALUE_HOLDS (&current_value, G_TYPE_UINT64);
6361 +                                               if (_tmp31_) {
6362 +                                                       sqlite3_stmt* _tmp32_ = NULL;
6363 +                                                       gint _tmp33_ = 0;
6364 +                                                       guint64 _tmp34_ = 0ULL;
6365 +                                                       gint _tmp35_ = 0;
6366 +                                                       gint _tmp36_ = 0;
6367 +                                                       _tmp32_ = statement;
6368 +                                                       _tmp33_ = i;
6369 +                                                       _tmp34_ = g_value_get_uint64 (&current_value);
6370 +                                                       _tmp35_ = sqlite3_bind_int64 (_tmp32_, _tmp33_, (gint64) _tmp34_);
6371 +                                                       sqlite_err = _tmp35_;
6372 +                                                       _tmp36_ = sqlite_err;
6373 +                                                       if (_tmp36_ != SQLITE_OK) {
6374 +                                                               gint _tmp37_ = 0;
6375 +                                                               GError* _tmp38_ = NULL;
6376 +                                                               _tmp37_ = sqlite_err;
6377 +                                                               _tmp38_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp37_);
6378 +                                                               _inner_error_ = _tmp38_;
6379 +                                                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6380 +                                                                       g_propagate_error (error, _inner_error_);
6381 +                                                                       _sqlite3_finalize0 (statement);
6382 +                                                                       return NULL;
6383 +                                                               } else {
6384 +                                                                       _sqlite3_finalize0 (statement);
6385 +                                                                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6386 +                                                                       g_clear_error (&_inner_error_);
6387 +                                                                       return NULL;
6388 +                                                               }
6389 +                                                       }
6390 +                                               } else {
6391 +                                                       gboolean _tmp39_ = FALSE;
6392 +                                                       _tmp39_ = G_VALUE_HOLDS (&current_value, G_TYPE_LONG);
6393 +                                                       if (_tmp39_) {
6394 +                                                               sqlite3_stmt* _tmp40_ = NULL;
6395 +                                                               gint _tmp41_ = 0;
6396 +                                                               glong _tmp42_ = 0L;
6397 +                                                               gint _tmp43_ = 0;
6398 +                                                               gint _tmp44_ = 0;
6399 +                                                               _tmp40_ = statement;
6400 +                                                               _tmp41_ = i;
6401 +                                                               _tmp42_ = g_value_get_long (&current_value);
6402 +                                                               _tmp43_ = sqlite3_bind_int64 (_tmp40_, _tmp41_, (gint64) _tmp42_);
6403 +                                                               sqlite_err = _tmp43_;
6404 +                                                               _tmp44_ = sqlite_err;
6405 +                                                               if (_tmp44_ != SQLITE_OK) {
6406 +                                                                       gint _tmp45_ = 0;
6407 +                                                                       GError* _tmp46_ = NULL;
6408 +                                                                       _tmp45_ = sqlite_err;
6409 +                                                                       _tmp46_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp45_);
6410 +                                                                       _inner_error_ = _tmp46_;
6411 +                                                                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6412 +                                                                               g_propagate_error (error, _inner_error_);
6413 +                                                                               _sqlite3_finalize0 (statement);
6414 +                                                                               return NULL;
6415 +                                                                       } else {
6416 +                                                                               _sqlite3_finalize0 (statement);
6417 +                                                                               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6418 +                                                                               g_clear_error (&_inner_error_);
6419 +                                                                               return NULL;
6420 +                                                                       }
6421 +                                                               }
6422 +                                                       } else {
6423 +                                                               gboolean _tmp47_ = FALSE;
6424 +                                                               _tmp47_ = G_VALUE_HOLDS (&current_value, G_TYPE_UINT);
6425 +                                                               if (_tmp47_) {
6426 +                                                                       sqlite3_stmt* _tmp48_ = NULL;
6427 +                                                                       gint _tmp49_ = 0;
6428 +                                                                       guint _tmp50_ = 0U;
6429 +                                                                       gint _tmp51_ = 0;
6430 +                                                                       gint _tmp52_ = 0;
6431 +                                                                       _tmp48_ = statement;
6432 +                                                                       _tmp49_ = i;
6433 +                                                                       _tmp50_ = g_value_get_uint (&current_value);
6434 +                                                                       _tmp51_ = sqlite3_bind_int64 (_tmp48_, _tmp49_, (gint64) _tmp50_);
6435 +                                                                       sqlite_err = _tmp51_;
6436 +                                                                       _tmp52_ = sqlite_err;
6437 +                                                                       if (_tmp52_ != SQLITE_OK) {
6438 +                                                                               gint _tmp53_ = 0;
6439 +                                                                               GError* _tmp54_ = NULL;
6440 +                                                                               _tmp53_ = sqlite_err;
6441 +                                                                               _tmp54_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp53_);
6442 +                                                                               _inner_error_ = _tmp54_;
6443 +                                                                               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6444 +                                                                                       g_propagate_error (error, _inner_error_);
6445 +                                                                                       _sqlite3_finalize0 (statement);
6446 +                                                                                       return NULL;
6447 +                                                                               } else {
6448 +                                                                                       _sqlite3_finalize0 (statement);
6449 +                                                                                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6450 +                                                                                       g_clear_error (&_inner_error_);
6451 +                                                                                       return NULL;
6452 +                                                                               }
6453 +                                                                       }
6454 +                                                               } else {
6455 +                                                                       gboolean _tmp55_ = FALSE;
6456 +                                                                       _tmp55_ = G_VALUE_HOLDS (&current_value, G_TYPE_STRING);
6457 +                                                                       if (_tmp55_) {
6458 +                                                                               sqlite3_stmt* _tmp56_ = NULL;
6459 +                                                                               gint _tmp57_ = 0;
6460 +                                                                               const gchar* _tmp58_ = NULL;
6461 +                                                                               gchar* _tmp59_ = NULL;
6462 +                                                                               GDestroyNotify _tmp60_ = NULL;
6463 +                                                                               gint _tmp61_ = 0;
6464 +                                                                               gint _tmp62_ = 0;
6465 +                                                                               _tmp56_ = statement;
6466 +                                                                               _tmp57_ = i;
6467 +                                                                               _tmp58_ = g_value_get_string (&current_value);
6468 +                                                                               _tmp59_ = g_strdup (_tmp58_);
6469 +                                                                               _tmp60_ = g_free;
6470 +                                                                               _tmp61_ = sqlite3_bind_text (_tmp56_, _tmp57_, _tmp59_, -1, _tmp60_);
6471 +                                                                               sqlite_err = _tmp61_;
6472 +                                                                               _tmp62_ = sqlite_err;
6473 +                                                                               if (_tmp62_ != SQLITE_OK) {
6474 +                                                                                       gint _tmp63_ = 0;
6475 +                                                                                       GError* _tmp64_ = NULL;
6476 +                                                                                       _tmp63_ = sqlite_err;
6477 +                                                                                       _tmp64_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp63_);
6478 +                                                                                       _inner_error_ = _tmp64_;
6479 +                                                                                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6480 +                                                                                               g_propagate_error (error, _inner_error_);
6481 +                                                                                               _sqlite3_finalize0 (statement);
6482 +                                                                                               return NULL;
6483 +                                                                                       } else {
6484 +                                                                                               _sqlite3_finalize0 (statement);
6485 +                                                                                               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6486 +                                                                                               g_clear_error (&_inner_error_);
6487 +                                                                                               return NULL;
6488 +                                                                                       }
6489 +                                                                               }
6490 +                                                                       } else {
6491 +                                                                               gboolean _tmp65_ = FALSE;
6492 +                                                                               _tmp65_ = G_VALUE_HOLDS (&current_value, G_TYPE_POINTER);
6493 +                                                                               if (_tmp65_) {
6494 +                                                                                       void* _tmp66_ = NULL;
6495 +                                                                                       _tmp66_ = g_value_peek_pointer (&current_value);
6496 +                                                                                       if (_tmp66_ == NULL) {
6497 +                                                                                               sqlite3_stmt* _tmp67_ = NULL;
6498 +                                                                                               gint _tmp68_ = 0;
6499 +                                                                                               gint _tmp69_ = 0;
6500 +                                                                                               gint _tmp70_ = 0;
6501 +                                                                                               _tmp67_ = statement;
6502 +                                                                                               _tmp68_ = i;
6503 +                                                                                               _tmp69_ = sqlite3_bind_null (_tmp67_, _tmp68_);
6504 +                                                                                               sqlite_err = _tmp69_;
6505 +                                                                                               _tmp70_ = sqlite_err;
6506 +                                                                                               if (_tmp70_ != SQLITE_OK) {
6507 +                                                                                                       gint _tmp71_ = 0;
6508 +                                                                                                       GError* _tmp72_ = NULL;
6509 +                                                                                                       _tmp71_ = sqlite_err;
6510 +                                                                                                       _tmp72_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind value %d", _tmp71_);
6511 +                                                                                                       _inner_error_ = _tmp72_;
6512 +                                                                                                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6513 +                                                                                                               g_propagate_error (error, _inner_error_);
6514 +                                                                                                               _sqlite3_finalize0 (statement);
6515 +                                                                                                               return NULL;
6516 +                                                                                                       } else {
6517 +                                                                                                               _sqlite3_finalize0 (statement);
6518 +                                                                                                               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6519 +                                                                                                               g_clear_error (&_inner_error_);
6520 +                                                                                                               return NULL;
6521 +                                                                                                       }
6522 +                                                                                               }
6523 +                                                                                       } else {
6524 +                                                                                               g_assert_not_reached ();
6525 +                                                                                       }
6526 +                                                                               } else {
6527 +                                                                                       GType type = 0UL;
6528 +                                                                                       GType _tmp73_ = 0UL;
6529 +                                                                                       const gchar* _tmp74_ = NULL;
6530 +                                                                                       const gchar* _tmp75_ = NULL;
6531 +                                                                                       _tmp73_ = G_VALUE_TYPE (&current_value);
6532 +                                                                                       type = _tmp73_;
6533 +                                                                                       _tmp74_ = _ ("Unsupported type %s");
6534 +                                                                                       _tmp75_ = g_type_name (type);
6535 +                                                                                       g_warning (_tmp74_, _tmp75_);
6536 +                                                                                       g_assert_not_reached ();
6537 +                                                                               }
6538 +                                                                       }
6539 +                                                               }
6540 +                                                       }
6541 +                                               }
6542 +                                       }
6543 +                               }
6544 +                       }
6545 +               }
6546 +       }
6547 +       result = statement;
6548 +       return result;
6549 +}
6550 +
6551 +
6552 +void rygel_lms_database_find_object (const gchar* id, sqlite3_stmt* stmt, GError** error) {
6553 +       sqlite3_stmt* _tmp0_ = NULL;
6554 +       gint _tmp1_ = 0;
6555 +       gint integer_id = 0;
6556 +       const gchar* _tmp2_ = NULL;
6557 +       gint _tmp3_ = 0;
6558 +       gint sqlite_err = 0;
6559 +       sqlite3_stmt* _tmp4_ = NULL;
6560 +       gint _tmp5_ = 0;
6561 +       gint _tmp6_ = 0;
6562 +       gint _tmp7_ = 0;
6563 +       sqlite3_stmt* _tmp10_ = NULL;
6564 +       gint _tmp11_ = 0;
6565 +       gint _tmp12_ = 0;
6566 +       GError * _inner_error_ = NULL;
6567 +       g_return_if_fail (id != NULL);
6568 +       g_return_if_fail (stmt != NULL);
6569 +       _tmp0_ = stmt;
6570 +       _tmp1_ = sqlite3_reset (_tmp0_);
6571 +       _tmp2_ = id;
6572 +       _tmp3_ = atoi (_tmp2_);
6573 +       integer_id = _tmp3_;
6574 +       _tmp4_ = stmt;
6575 +       _tmp5_ = integer_id;
6576 +       _tmp6_ = sqlite3_bind_int (_tmp4_, 1, _tmp5_);
6577 +       sqlite_err = _tmp6_;
6578 +       _tmp7_ = sqlite_err;
6579 +       if (_tmp7_ != SQLITE_OK) {
6580 +               gint _tmp8_ = 0;
6581 +               GError* _tmp9_ = NULL;
6582 +               _tmp8_ = sqlite_err;
6583 +               _tmp9_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind id %d", _tmp8_);
6584 +               _inner_error_ = _tmp9_;
6585 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6586 +                       g_propagate_error (error, _inner_error_);
6587 +                       return;
6588 +               } else {
6589 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6590 +                       g_clear_error (&_inner_error_);
6591 +                       return;
6592 +               }
6593 +       }
6594 +       _tmp10_ = stmt;
6595 +       _tmp11_ = sqlite3_step (_tmp10_);
6596 +       sqlite_err = _tmp11_;
6597 +       _tmp12_ = sqlite_err;
6598 +       if (_tmp12_ != SQLITE_ROW) {
6599 +               const gchar* _tmp13_ = NULL;
6600 +               GError* _tmp14_ = NULL;
6601 +               _tmp13_ = id;
6602 +               _tmp14_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_STEP, "Unable to find id %s", _tmp13_);
6603 +               _inner_error_ = _tmp14_;
6604 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6605 +                       g_propagate_error (error, _inner_error_);
6606 +                       return;
6607 +               } else {
6608 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6609 +                       g_clear_error (&_inner_error_);
6610 +                       return;
6611 +               }
6612 +       }
6613 +}
6614 +
6615 +
6616 +void rygel_lms_database_get_children_init (sqlite3_stmt* stmt, guint offset, guint max_count, const gchar* sort_criteria, GError** error) {
6617 +       gint sqlite_err = 0;
6618 +       sqlite3_stmt* _tmp0_ = NULL;
6619 +       gint _tmp1_ = 0;
6620 +       sqlite3_stmt* _tmp2_ = NULL;
6621 +       guint _tmp3_ = 0U;
6622 +       gint _tmp4_ = 0;
6623 +       gint _tmp5_ = 0;
6624 +       sqlite3_stmt* _tmp8_ = NULL;
6625 +       guint _tmp9_ = 0U;
6626 +       gint _tmp10_ = 0;
6627 +       gint _tmp11_ = 0;
6628 +       GError * _inner_error_ = NULL;
6629 +       g_return_if_fail (stmt != NULL);
6630 +       g_return_if_fail (sort_criteria != NULL);
6631 +       _tmp0_ = stmt;
6632 +       _tmp1_ = sqlite3_reset (_tmp0_);
6633 +       _tmp2_ = stmt;
6634 +       _tmp3_ = max_count;
6635 +       _tmp4_ = sqlite3_bind_int (_tmp2_, 1, (gint) _tmp3_);
6636 +       sqlite_err = _tmp4_;
6637 +       _tmp5_ = sqlite_err;
6638 +       if (_tmp5_ != SQLITE_OK) {
6639 +               gint _tmp6_ = 0;
6640 +               GError* _tmp7_ = NULL;
6641 +               _tmp6_ = sqlite_err;
6642 +               _tmp7_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind max_count %d", _tmp6_);
6643 +               _inner_error_ = _tmp7_;
6644 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6645 +                       g_propagate_error (error, _inner_error_);
6646 +                       return;
6647 +               } else {
6648 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6649 +                       g_clear_error (&_inner_error_);
6650 +                       return;
6651 +               }
6652 +       }
6653 +       _tmp8_ = stmt;
6654 +       _tmp9_ = offset;
6655 +       _tmp10_ = sqlite3_bind_int (_tmp8_, 2, (gint) _tmp9_);
6656 +       sqlite_err = _tmp10_;
6657 +       _tmp11_ = sqlite_err;
6658 +       if (_tmp11_ != SQLITE_OK) {
6659 +               gint _tmp12_ = 0;
6660 +               GError* _tmp13_ = NULL;
6661 +               _tmp12_ = sqlite_err;
6662 +               _tmp13_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind offset %d", _tmp12_);
6663 +               _inner_error_ = _tmp13_;
6664 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6665 +                       g_propagate_error (error, _inner_error_);
6666 +                       return;
6667 +               } else {
6668 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6669 +                       g_clear_error (&_inner_error_);
6670 +                       return;
6671 +               }
6672 +       }
6673 +}
6674 +
6675 +
6676 +void rygel_lms_database_get_children_with_update_id_init (sqlite3_stmt* stmt, guint64 old_id, guint64 new_id, GError** error) {
6677 +       gint sqlite_err = 0;
6678 +       sqlite3_stmt* _tmp0_ = NULL;
6679 +       gint _tmp1_ = 0;
6680 +       guint64 _tmp2_ = 0ULL;
6681 +       guint64 _tmp3_ = 0ULL;
6682 +       gint _tmp9_ = 0;
6683 +       sqlite3_stmt* _tmp12_ = NULL;
6684 +       guint64 _tmp13_ = 0ULL;
6685 +       gint _tmp14_ = 0;
6686 +       gint _tmp15_ = 0;
6687 +       GError * _inner_error_ = NULL;
6688 +       g_return_if_fail (stmt != NULL);
6689 +       _tmp0_ = stmt;
6690 +       _tmp1_ = sqlite3_reset (_tmp0_);
6691 +       _tmp2_ = new_id;
6692 +       _tmp3_ = old_id;
6693 +       if (_tmp2_ < _tmp3_) {
6694 +               sqlite3_stmt* _tmp4_ = NULL;
6695 +               gint _tmp5_ = 0;
6696 +               _tmp4_ = stmt;
6697 +               _tmp5_ = sqlite3_bind_int64 (_tmp4_, 1, (gint64) 0);
6698 +               sqlite_err = _tmp5_;
6699 +       } else {
6700 +               sqlite3_stmt* _tmp6_ = NULL;
6701 +               guint64 _tmp7_ = 0ULL;
6702 +               gint _tmp8_ = 0;
6703 +               _tmp6_ = stmt;
6704 +               _tmp7_ = old_id;
6705 +               _tmp8_ = sqlite3_bind_int64 (_tmp6_, 1, (gint64) _tmp7_);
6706 +               sqlite_err = _tmp8_;
6707 +       }
6708 +       _tmp9_ = sqlite_err;
6709 +       if (_tmp9_ != SQLITE_OK) {
6710 +               gint _tmp10_ = 0;
6711 +               GError* _tmp11_ = NULL;
6712 +               _tmp10_ = sqlite_err;
6713 +               _tmp11_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind old_id %d", _tmp10_);
6714 +               _inner_error_ = _tmp11_;
6715 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6716 +                       g_propagate_error (error, _inner_error_);
6717 +                       return;
6718 +               } else {
6719 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6720 +                       g_clear_error (&_inner_error_);
6721 +                       return;
6722 +               }
6723 +       }
6724 +       _tmp12_ = stmt;
6725 +       _tmp13_ = new_id;
6726 +       _tmp14_ = sqlite3_bind_int64 (_tmp12_, 2, (gint64) _tmp13_);
6727 +       sqlite_err = _tmp14_;
6728 +       _tmp15_ = sqlite_err;
6729 +       if (_tmp15_ != SQLITE_OK) {
6730 +               gint _tmp16_ = 0;
6731 +               GError* _tmp17_ = NULL;
6732 +               _tmp16_ = sqlite_err;
6733 +               _tmp17_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_BIND, "Unable to bind new_id %d", _tmp16_);
6734 +               _inner_error_ = _tmp17_;
6735 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6736 +                       g_propagate_error (error, _inner_error_);
6737 +                       return;
6738 +               } else {
6739 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6740 +                       g_clear_error (&_inner_error_);
6741 +                       return;
6742 +               }
6743 +       }
6744 +}
6745 +
6746 +
6747 +gboolean rygel_lms_database_get_children_step (sqlite3_stmt* stmt, GError** error) {
6748 +       gboolean result = FALSE;
6749 +       gboolean retval = FALSE;
6750 +       gint sqlite_err = 0;
6751 +       sqlite3_stmt* _tmp0_ = NULL;
6752 +       gint _tmp1_ = 0;
6753 +       gint _tmp2_ = 0;
6754 +       gboolean _tmp3_ = FALSE;
6755 +       gboolean _tmp4_ = FALSE;
6756 +       GError * _inner_error_ = NULL;
6757 +       g_return_val_if_fail (stmt != NULL, FALSE);
6758 +       _tmp0_ = stmt;
6759 +       _tmp1_ = sqlite3_step (_tmp0_);
6760 +       sqlite_err = _tmp1_;
6761 +       _tmp2_ = sqlite_err;
6762 +       retval = _tmp2_ == SQLITE_ROW;
6763 +       _tmp4_ = retval;
6764 +       if (!_tmp4_) {
6765 +               gint _tmp5_ = 0;
6766 +               _tmp5_ = sqlite_err;
6767 +               _tmp3_ = _tmp5_ != SQLITE_DONE;
6768 +       } else {
6769 +               _tmp3_ = FALSE;
6770 +       }
6771 +       if (_tmp3_) {
6772 +               gint _tmp6_ = 0;
6773 +               GError* _tmp7_ = NULL;
6774 +               _tmp6_ = sqlite_err;
6775 +               _tmp7_ = g_error_new (RYGEL_LMS_DATABASE_ERROR, RYGEL_LMS_DATABASE_ERROR_STEP, "Error iterating through rows %d", _tmp6_);
6776 +               _inner_error_ = _tmp7_;
6777 +               if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
6778 +                       g_propagate_error (error, _inner_error_);
6779 +                       return FALSE;
6780 +               } else {
6781 +                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
6782 +                       g_clear_error (&_inner_error_);
6783 +                       return FALSE;
6784 +               }
6785 +       }
6786 +       result = retval;
6787 +       return result;
6788 +}
6789 +
6790 +
6791 +static void g_cclosure_user_marshal_VOID__UINT64_UINT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
6792 +       typedef void (*GMarshalFunc_VOID__UINT64_UINT64) (gpointer data1, guint64 arg_1, guint64 arg_2, gpointer data2);
6793 +       register GMarshalFunc_VOID__UINT64_UINT64 callback;
6794 +       register GCClosure * cc;
6795 +       register gpointer data1;
6796 +       register gpointer data2;
6797 +       cc = (GCClosure *) closure;
6798 +       g_return_if_fail (n_param_values == 3);
6799 +       if (G_CCLOSURE_SWAP_DATA (closure)) {
6800 +               data1 = closure->data;
6801 +               data2 = param_values->data[0].v_pointer;
6802 +       } else {
6803 +               data1 = param_values->data[0].v_pointer;
6804 +               data2 = closure->data;
6805 +       }
6806 +       callback = (GMarshalFunc_VOID__UINT64_UINT64) (marshal_data ? marshal_data : cc->callback);
6807 +       callback (data1, g_value_get_uint64 (param_values + 1), g_value_get_uint64 (param_values + 2), data2);
6808 +}
6809 +
6810 +
6811 +static void rygel_lms_value_database_init (GValue* value) {
6812 +       value->data[0].v_pointer = NULL;
6813 +}
6814 +
6815 +
6816 +static void rygel_lms_value_database_free_value (GValue* value) {
6817 +       if (value->data[0].v_pointer) {
6818 +               rygel_lms_database_unref (value->data[0].v_pointer);
6819 +       }
6820 +}
6821 +
6822 +
6823 +static void rygel_lms_value_database_copy_value (const GValue* src_value, GValue* dest_value) {
6824 +       if (src_value->data[0].v_pointer) {
6825 +               dest_value->data[0].v_pointer = rygel_lms_database_ref (src_value->data[0].v_pointer);
6826 +       } else {
6827 +               dest_value->data[0].v_pointer = NULL;
6828 +       }
6829 +}
6830 +
6831 +
6832 +static gpointer rygel_lms_value_database_peek_pointer (const GValue* value) {
6833 +       return value->data[0].v_pointer;
6834 +}
6835 +
6836 +
6837 +static gchar* rygel_lms_value_database_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
6838 +       if (collect_values[0].v_pointer) {
6839 +               RygelLMSDatabase* object;
6840 +               object = collect_values[0].v_pointer;
6841 +               if (object->parent_instance.g_class == NULL) {
6842 +                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
6843 +               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
6844 +                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
6845 +               }
6846 +               value->data[0].v_pointer = rygel_lms_database_ref (object);
6847 +       } else {
6848 +               value->data[0].v_pointer = NULL;
6849 +       }
6850 +       return NULL;
6851 +}
6852 +
6853 +
6854 +static gchar* rygel_lms_value_database_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
6855 +       RygelLMSDatabase** object_p;
6856 +       object_p = collect_values[0].v_pointer;
6857 +       if (!object_p) {
6858 +               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
6859 +       }
6860 +       if (!value->data[0].v_pointer) {
6861 +               *object_p = NULL;
6862 +       } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
6863 +               *object_p = value->data[0].v_pointer;
6864 +       } else {
6865 +               *object_p = rygel_lms_database_ref (value->data[0].v_pointer);
6866 +       }
6867 +       return NULL;
6868 +}
6869 +
6870 +
6871 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
6872 +       RygelLMSParamSpecDatabase* spec;
6873 +       g_return_val_if_fail (g_type_is_a (object_type, RYGEL_LMS_TYPE_DATABASE), NULL);
6874 +       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
6875 +       G_PARAM_SPEC (spec)->value_type = object_type;
6876 +       return G_PARAM_SPEC (spec);
6877 +}
6878 +
6879 +
6880 +gpointer rygel_lms_value_get_database (const GValue* value) {
6881 +       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_DATABASE), NULL);
6882 +       return value->data[0].v_pointer;
6883 +}
6884 +
6885 +
6886 +void rygel_lms_value_set_database (GValue* value, gpointer v_object) {
6887 +       RygelLMSDatabase* old;
6888 +       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_DATABASE));
6889 +       old = value->data[0].v_pointer;
6890 +       if (v_object) {
6891 +               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_LMS_TYPE_DATABASE));
6892 +               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
6893 +               value->data[0].v_pointer = v_object;
6894 +               rygel_lms_database_ref (value->data[0].v_pointer);
6895 +       } else {
6896 +               value->data[0].v_pointer = NULL;
6897 +       }
6898 +       if (old) {
6899 +               rygel_lms_database_unref (old);
6900 +       }
6901 +}
6902 +
6903 +
6904 +void rygel_lms_value_take_database (GValue* value, gpointer v_object) {
6905 +       RygelLMSDatabase* old;
6906 +       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_DATABASE));
6907 +       old = value->data[0].v_pointer;
6908 +       if (v_object) {
6909 +               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_LMS_TYPE_DATABASE));
6910 +               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
6911 +               value->data[0].v_pointer = v_object;
6912 +       } else {
6913 +               value->data[0].v_pointer = NULL;
6914 +       }
6915 +       if (old) {
6916 +               rygel_lms_database_unref (old);
6917 +       }
6918 +}
6919 +
6920 +
6921 +static void rygel_lms_database_class_init (RygelLMSDatabaseClass * klass) {
6922 +       rygel_lms_database_parent_class = g_type_class_peek_parent (klass);
6923 +       ((RygelLMSDatabaseClass *) klass)->finalize = rygel_lms_database_finalize;
6924 +       g_type_class_add_private (klass, sizeof (RygelLMSDatabasePrivate));
6925 +       g_signal_new ("db_updated", RYGEL_LMS_TYPE_DATABASE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__UINT64_UINT64, G_TYPE_NONE, 2, G_TYPE_UINT64, G_TYPE_UINT64);
6926 +}
6927 +
6928 +
6929 +static void rygel_lms_database_instance_init (RygelLMSDatabase * self) {
6930 +       self->priv = RYGEL_LMS_DATABASE_GET_PRIVATE (self);
6931 +       self->ref_count = 1;
6932 +}
6933 +
6934 +
6935 +static void rygel_lms_database_finalize (RygelLMSDatabase* obj) {
6936 +       RygelLMSDatabase * self;
6937 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase);
6938 +       g_signal_handlers_destroy (self);
6939 +       _sqlite3_close0 (self->priv->db);
6940 +       _g_object_unref0 (self->priv->lms_proxy);
6941 +}
6942 +
6943 +
6944 +GType rygel_lms_database_get_type (void) {
6945 +       static volatile gsize rygel_lms_database_type_id__volatile = 0;
6946 +       if (g_once_init_enter (&rygel_lms_database_type_id__volatile)) {
6947 +               static const GTypeValueTable g_define_type_value_table = { rygel_lms_value_database_init, rygel_lms_value_database_free_value, rygel_lms_value_database_copy_value, rygel_lms_value_database_peek_pointer, "p", rygel_lms_value_database_collect_value, "p", rygel_lms_value_database_lcopy_value };
6948 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSDatabaseClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_database_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSDatabase), 0, (GInstanceInitFunc) rygel_lms_database_instance_init, &g_define_type_value_table };
6949 +               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
6950 +               GType rygel_lms_database_type_id;
6951 +               rygel_lms_database_type_id = g_type_register_fundamental (g_type_fundamental_next (), "RygelLMSDatabase", &g_define_type_info, &g_define_type_fundamental_info, 0);
6952 +               g_once_init_leave (&rygel_lms_database_type_id__volatile, rygel_lms_database_type_id);
6953 +       }
6954 +       return rygel_lms_database_type_id__volatile;
6955 +}
6956 +
6957 +
6958 +gpointer rygel_lms_database_ref (gpointer instance) {
6959 +       RygelLMSDatabase* self;
6960 +       self = instance;
6961 +       g_atomic_int_inc (&self->ref_count);
6962 +       return instance;
6963 +}
6964 +
6965 +
6966 +void rygel_lms_database_unref (gpointer instance) {
6967 +       RygelLMSDatabase* self;
6968 +       self = instance;
6969 +       if (g_atomic_int_dec_and_test (&self->ref_count)) {
6970 +               RYGEL_LMS_DATABASE_GET_CLASS (self)->finalize (self);
6971 +               g_type_free_instance ((GTypeInstance *) self);
6972 +       }
6973 +}
6974 +
6975 +
6976 +static gint _vala_array_length (gpointer array) {
6977 +       int length;
6978 +       length = 0;
6979 +       if (array) {
6980 +               while (((gpointer*) array)[length]) {
6981 +                       length++;
6982 +               }
6983 +       }
6984 +       return length;
6985 +}
6986 +
6987 +
6988 +
6989 diff --git a/src/plugins/lms/rygel-lms-dbus-interfaces.c b/src/plugins/lms/rygel-lms-dbus-interfaces.c
6990 new file mode 100644
6991 index 0000000..b511b17
6992 --- /dev/null
6993 +++ b/src/plugins/lms/rygel-lms-dbus-interfaces.c
6994 @@ -0,0 +1,261 @@
6995 +/* rygel-lms-dbus-interfaces.c generated by valac 0.28.0, the Vala compiler
6996 + * generated from rygel-lms-dbus-interfaces.vala, do not modify */
6997 +
6998 +/*
6999 + * Copyright (C) 2014 Intel Corporation.
7000 + *
7001 + * Author: Alexander Kanavin <alex.kanavin@gmail.com>
7002 + *
7003 + * This file is part of Rygel.
7004 + *
7005 + * Rygel is free software; you can redistribute it and/or modify
7006 + * it under the terms of the GNU Lesser General Public License as published by
7007 + * the Free Software Foundation; either version 2 of the License, or
7008 + * (at your option) any later version.
7009 + *
7010 + * Rygel is distributed in the hope that it will be useful,
7011 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7012 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7013 + * GNU Lesser General Public License for more details.
7014 + *
7015 + * You should have received a copy of the GNU Lesser General Public License
7016 + * along with this program; if not, write to the Free Software Foundation,
7017 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
7018 + */
7019 +
7020 +#include <glib.h>
7021 +#include <glib-object.h>
7022 +#include <gio/gio.h>
7023 +#include <stdlib.h>
7024 +#include <string.h>
7025 +
7026 +
7027 +#define RYGEL_LMS_TYPE_DBUS (rygel_lms_dbus_get_type ())
7028 +#define RYGEL_LMS_DBUS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DBUS, RygelLMSDBus))
7029 +#define RYGEL_LMS_IS_DBUS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DBUS))
7030 +#define RYGEL_LMS_DBUS_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), RYGEL_LMS_TYPE_DBUS, RygelLMSDBusIface))
7031 +
7032 +typedef struct _RygelLMSDBus RygelLMSDBus;
7033 +typedef struct _RygelLMSDBusIface RygelLMSDBusIface;
7034 +
7035 +#define RYGEL_LMS_TYPE_DBUS_PROXY (rygel_lms_dbus_proxy_get_type ())
7036 +typedef GDBusProxy RygelLMSDBusProxy;
7037 +typedef GDBusProxyClass RygelLMSDBusProxyClass;
7038 +#define _g_free0(var) (var = (g_free (var), NULL))
7039 +
7040 +struct _RygelLMSDBusIface {
7041 +       GTypeInterface parent_iface;
7042 +       gchar* (*get_data_base_path) (RygelLMSDBus* self);
7043 +       guint64 (*get_update_id) (RygelLMSDBus* self);
7044 +};
7045 +
7046 +
7047 +
7048 +GType rygel_lms_dbus_get_type (void) G_GNUC_CONST;
7049 +GType rygel_lms_dbus_proxy_get_type (void) G_GNUC_CONST;
7050 +guint rygel_lms_dbus_register_object (void* object, GDBusConnection* connection, const gchar* path, GError** error);
7051 +gchar* rygel_lms_dbus_get_data_base_path (RygelLMSDBus* self);
7052 +guint64 rygel_lms_dbus_get_update_id (RygelLMSDBus* self);
7053 +static void rygel_lms_dbus_proxy_g_signal (GDBusProxy* proxy, const gchar* sender_name, const gchar* signal_name, GVariant* parameters);
7054 +static gchar* rygel_lms_dbus_dbus_proxy_get_data_base_path (RygelLMSDBus* self);
7055 +static guint64 rygel_lms_dbus_dbus_proxy_get_update_id (RygelLMSDBus* self);
7056 +static void rygel_lms_dbus_proxy_rygel_lms_dbus_interface_init (RygelLMSDBusIface* iface);
7057 +static void rygel_lms_dbus_dbus_interface_method_call (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* method_name, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer user_data);
7058 +static GVariant* rygel_lms_dbus_dbus_interface_get_property (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* property_name, GError** error, gpointer user_data);
7059 +static GVariant* _dbus_rygel_lms_dbus_get_data_base_path (RygelLMSDBus* self);
7060 +static GVariant* _dbus_rygel_lms_dbus_get_update_id (RygelLMSDBus* self);
7061 +static gboolean rygel_lms_dbus_dbus_interface_set_property (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* property_name, GVariant* value, GError** error, gpointer user_data);
7062 +static void _rygel_lms_dbus_unregister_object (gpointer user_data);
7063 +
7064 +static const GDBusMethodInfo * const _rygel_lms_dbus_dbus_method_info[] = {NULL};
7065 +static const GDBusSignalInfo * const _rygel_lms_dbus_dbus_signal_info[] = {NULL};
7066 +static const GDBusPropertyInfo _rygel_lms_dbus_dbus_property_info_data_base_path = {-1, "DataBasePath", "s", G_DBUS_PROPERTY_INFO_FLAGS_READABLE};
7067 +static const GDBusPropertyInfo _rygel_lms_dbus_dbus_property_info_update_id = {-1, "UpdateID", "t", G_DBUS_PROPERTY_INFO_FLAGS_READABLE};
7068 +static const GDBusPropertyInfo * const _rygel_lms_dbus_dbus_property_info[] = {&_rygel_lms_dbus_dbus_property_info_data_base_path, &_rygel_lms_dbus_dbus_property_info_update_id, NULL};
7069 +static const GDBusInterfaceInfo _rygel_lms_dbus_dbus_interface_info = {-1, "org.lightmediascanner.Scanner1", (GDBusMethodInfo **) (&_rygel_lms_dbus_dbus_method_info), (GDBusSignalInfo **) (&_rygel_lms_dbus_dbus_signal_info), (GDBusPropertyInfo **) (&_rygel_lms_dbus_dbus_property_info)};
7070 +static const GDBusInterfaceVTable _rygel_lms_dbus_dbus_interface_vtable = {rygel_lms_dbus_dbus_interface_method_call, rygel_lms_dbus_dbus_interface_get_property, rygel_lms_dbus_dbus_interface_set_property};
7071 +
7072 +gchar* rygel_lms_dbus_get_data_base_path (RygelLMSDBus* self) {
7073 +       g_return_val_if_fail (self != NULL, NULL);
7074 +       return RYGEL_LMS_DBUS_GET_INTERFACE (self)->get_data_base_path (self);
7075 +}
7076 +
7077 +
7078 +guint64 rygel_lms_dbus_get_update_id (RygelLMSDBus* self) {
7079 +       g_return_val_if_fail (self != NULL, 0ULL);
7080 +       return RYGEL_LMS_DBUS_GET_INTERFACE (self)->get_update_id (self);
7081 +}
7082 +
7083 +
7084 +static void rygel_lms_dbus_base_init (RygelLMSDBusIface * iface) {
7085 +       static gboolean initialized = FALSE;
7086 +       if (!initialized) {
7087 +               initialized = TRUE;
7088 +       }
7089 +}
7090 +
7091 +
7092 +GType rygel_lms_dbus_get_type (void) {
7093 +       static volatile gsize rygel_lms_dbus_type_id__volatile = 0;
7094 +       if (g_once_init_enter (&rygel_lms_dbus_type_id__volatile)) {
7095 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSDBusIface), (GBaseInitFunc) rygel_lms_dbus_base_init, (GBaseFinalizeFunc) NULL, (GClassInitFunc) NULL, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
7096 +               GType rygel_lms_dbus_type_id;
7097 +               rygel_lms_dbus_type_id = g_type_register_static (G_TYPE_INTERFACE, "RygelLMSDBus", &g_define_type_info, 0);
7098 +               g_type_interface_add_prerequisite (rygel_lms_dbus_type_id, G_TYPE_DBUS_PROXY);
7099 +               g_type_set_qdata (rygel_lms_dbus_type_id, g_quark_from_static_string ("vala-dbus-proxy-type"), (void*) rygel_lms_dbus_proxy_get_type);
7100 +               g_type_set_qdata (rygel_lms_dbus_type_id, g_quark_from_static_string ("vala-dbus-interface-name"), "org.lightmediascanner.Scanner1");
7101 +               g_type_set_qdata (rygel_lms_dbus_type_id, g_quark_from_static_string ("vala-dbus-interface-info"), (void*) (&_rygel_lms_dbus_dbus_interface_info));
7102 +               g_type_set_qdata (rygel_lms_dbus_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) rygel_lms_dbus_register_object);
7103 +               g_once_init_leave (&rygel_lms_dbus_type_id__volatile, rygel_lms_dbus_type_id);
7104 +       }
7105 +       return rygel_lms_dbus_type_id__volatile;
7106 +}
7107 +
7108 +
7109 +G_DEFINE_TYPE_EXTENDED (RygelLMSDBusProxy, rygel_lms_dbus_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT_INTERFACE (RYGEL_LMS_TYPE_DBUS, rygel_lms_dbus_proxy_rygel_lms_dbus_interface_init) )
7110 +static void rygel_lms_dbus_proxy_class_init (RygelLMSDBusProxyClass* klass) {
7111 +       G_DBUS_PROXY_CLASS (klass)->g_signal = rygel_lms_dbus_proxy_g_signal;
7112 +}
7113 +
7114 +
7115 +static void rygel_lms_dbus_proxy_g_signal (GDBusProxy* proxy, const gchar* sender_name, const gchar* signal_name, GVariant* parameters) {
7116 +}
7117 +
7118 +
7119 +static void rygel_lms_dbus_proxy_init (RygelLMSDBusProxy* self) {
7120 +}
7121 +
7122 +
7123 +static gchar* rygel_lms_dbus_dbus_proxy_get_data_base_path (RygelLMSDBus* self) {
7124 +       GVariant *_inner_reply;
7125 +       gchar* _result;
7126 +       _inner_reply = g_dbus_proxy_get_cached_property ((GDBusProxy *) self, "DataBasePath");
7127 +       if (!_inner_reply) {
7128 +               GVariant *_arguments;
7129 +               GVariant *_reply;
7130 +               GVariantBuilder _arguments_builder;
7131 +               g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
7132 +               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.lightmediascanner.Scanner1"));
7133 +               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("DataBasePath"));
7134 +               _arguments = g_variant_builder_end (&_arguments_builder);
7135 +               _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Get", _arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
7136 +               if (!_reply) {
7137 +                       return NULL;
7138 +               }
7139 +               g_variant_get (_reply, "(v)", &_inner_reply);
7140 +               g_variant_unref (_reply);
7141 +       }
7142 +       _result = g_variant_dup_string (_inner_reply, NULL);
7143 +       g_variant_unref (_inner_reply);
7144 +       return _result;
7145 +}
7146 +
7147 +
7148 +static guint64 rygel_lms_dbus_dbus_proxy_get_update_id (RygelLMSDBus* self) {
7149 +       GVariant *_inner_reply;
7150 +       guint64 _result;
7151 +       _inner_reply = g_dbus_proxy_get_cached_property ((GDBusProxy *) self, "UpdateID");
7152 +       if (!_inner_reply) {
7153 +               GVariant *_arguments;
7154 +               GVariant *_reply;
7155 +               GVariantBuilder _arguments_builder;
7156 +               g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
7157 +               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.lightmediascanner.Scanner1"));
7158 +               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("UpdateID"));
7159 +               _arguments = g_variant_builder_end (&_arguments_builder);
7160 +               _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Get", _arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
7161 +               if (!_reply) {
7162 +                       return 0ULL;
7163 +               }
7164 +               g_variant_get (_reply, "(v)", &_inner_reply);
7165 +               g_variant_unref (_reply);
7166 +       }
7167 +       _result = g_variant_get_uint64 (_inner_reply);
7168 +       g_variant_unref (_inner_reply);
7169 +       return _result;
7170 +}
7171 +
7172 +
7173 +static void rygel_lms_dbus_proxy_rygel_lms_dbus_interface_init (RygelLMSDBusIface* iface) {
7174 +       iface->get_data_base_path = rygel_lms_dbus_dbus_proxy_get_data_base_path;
7175 +       iface->get_update_id = rygel_lms_dbus_dbus_proxy_get_update_id;
7176 +}
7177 +
7178 +
7179 +static void rygel_lms_dbus_dbus_interface_method_call (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* method_name, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer user_data) {
7180 +       gpointer* data;
7181 +       gpointer object;
7182 +       data = user_data;
7183 +       object = data[0];
7184 +       g_object_unref (invocation);
7185 +}
7186 +
7187 +
7188 +static GVariant* _dbus_rygel_lms_dbus_get_data_base_path (RygelLMSDBus* self) {
7189 +       gchar* result;
7190 +       GVariant* _reply;
7191 +       result = rygel_lms_dbus_get_data_base_path (self);
7192 +       _reply = g_variant_new_string (result);
7193 +       _g_free0 (result);
7194 +       return _reply;
7195 +}
7196 +
7197 +
7198 +static GVariant* _dbus_rygel_lms_dbus_get_update_id (RygelLMSDBus* self) {
7199 +       guint64 result;
7200 +       GVariant* _reply;
7201 +       result = rygel_lms_dbus_get_update_id (self);
7202 +       _reply = g_variant_new_uint64 (result);
7203 +       return _reply;
7204 +}
7205 +
7206 +
7207 +static GVariant* rygel_lms_dbus_dbus_interface_get_property (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* property_name, GError** error, gpointer user_data) {
7208 +       gpointer* data;
7209 +       gpointer object;
7210 +       data = user_data;
7211 +       object = data[0];
7212 +       if (strcmp (property_name, "DataBasePath") == 0) {
7213 +               return _dbus_rygel_lms_dbus_get_data_base_path (object);
7214 +       } else if (strcmp (property_name, "UpdateID") == 0) {
7215 +               return _dbus_rygel_lms_dbus_get_update_id (object);
7216 +       }
7217 +       return NULL;
7218 +}
7219 +
7220 +
7221 +static gboolean rygel_lms_dbus_dbus_interface_set_property (GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* property_name, GVariant* value, GError** error, gpointer user_data) {
7222 +       gpointer* data;
7223 +       gpointer object;
7224 +       data = user_data;
7225 +       object = data[0];
7226 +       return FALSE;
7227 +}
7228 +
7229 +
7230 +guint rygel_lms_dbus_register_object (gpointer object, GDBusConnection* connection, const gchar* path, GError** error) {
7231 +       guint result;
7232 +       gpointer *data;
7233 +       data = g_new (gpointer, 3);
7234 +       data[0] = g_object_ref (object);
7235 +       data[1] = g_object_ref (connection);
7236 +       data[2] = g_strdup (path);
7237 +       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) (&_rygel_lms_dbus_dbus_interface_info), &_rygel_lms_dbus_dbus_interface_vtable, data, _rygel_lms_dbus_unregister_object, error);
7238 +       if (!result) {
7239 +               return 0;
7240 +       }
7241 +       return result;
7242 +}
7243 +
7244 +
7245 +static void _rygel_lms_dbus_unregister_object (gpointer user_data) {
7246 +       gpointer* data;
7247 +       data = user_data;
7248 +       g_object_unref (data[0]);
7249 +       g_object_unref (data[1]);
7250 +       g_free (data[2]);
7251 +       g_free (data);
7252 +}
7253 +
7254 +
7255 +
7256 diff --git a/src/plugins/lms/rygel-lms-image-root.c b/src/plugins/lms/rygel-lms-image-root.c
7257 new file mode 100644
7258 index 0000000..5ef358a
7259 --- /dev/null
7260 +++ b/src/plugins/lms/rygel-lms-image-root.c
7261 @@ -0,0 +1,178 @@
7262 +/* rygel-lms-image-root.c generated by valac 0.28.0, the Vala compiler
7263 + * generated from rygel-lms-image-root.vala, do not modify */
7264 +
7265 +/*
7266 + * Copyright (C) 2013 Intel Corporation.
7267 + *
7268 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
7269 + *
7270 + * This file is part of Rygel.
7271 + *
7272 + * Rygel is free software; you can redistribute it and/or modify
7273 + * it under the terms of the GNU Lesser General Public License as published by
7274 + * the Free Software Foundation; either version 2 of the License, or
7275 + * (at your option) any later version.
7276 + *
7277 + * Rygel is distributed in the hope that it will be useful,
7278 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7279 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7280 + * GNU Lesser General Public License for more details.
7281 + *
7282 + * You should have received a copy of the GNU Lesser General Public License
7283 + * along with this program; if not, write to the Free Software Foundation,
7284 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
7285 + */
7286 +
7287 +#include <glib.h>
7288 +#include <glib-object.h>
7289 +#include <rygel-server.h>
7290 +#include <stdlib.h>
7291 +#include <string.h>
7292 +
7293 +
7294 +#define RYGEL_LMS_TYPE_IMAGE_ROOT (rygel_lms_image_root_get_type ())
7295 +#define RYGEL_LMS_IMAGE_ROOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRoot))
7296 +#define RYGEL_LMS_IMAGE_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRootClass))
7297 +#define RYGEL_LMS_IS_IMAGE_ROOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT))
7298 +#define RYGEL_LMS_IS_IMAGE_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_ROOT))
7299 +#define RYGEL_LMS_IMAGE_ROOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRootClass))
7300 +
7301 +typedef struct _RygelLMSImageRoot RygelLMSImageRoot;
7302 +typedef struct _RygelLMSImageRootClass RygelLMSImageRootClass;
7303 +typedef struct _RygelLMSImageRootPrivate RygelLMSImageRootPrivate;
7304 +
7305 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
7306 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
7307 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7308 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
7309 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
7310 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7311 +
7312 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
7313 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
7314 +
7315 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
7316 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
7317 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7318 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7319 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7320 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7321 +
7322 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
7323 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
7324 +
7325 +#define RYGEL_LMS_TYPE_ALL_IMAGES (rygel_lms_all_images_get_type ())
7326 +#define RYGEL_LMS_ALL_IMAGES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImages))
7327 +#define RYGEL_LMS_ALL_IMAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImagesClass))
7328 +#define RYGEL_LMS_IS_ALL_IMAGES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_IMAGES))
7329 +#define RYGEL_LMS_IS_ALL_IMAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_IMAGES))
7330 +#define RYGEL_LMS_ALL_IMAGES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_IMAGES, RygelLMSAllImagesClass))
7331 +
7332 +typedef struct _RygelLMSAllImages RygelLMSAllImages;
7333 +typedef struct _RygelLMSAllImagesClass RygelLMSAllImagesClass;
7334 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
7335 +
7336 +#define RYGEL_LMS_TYPE_IMAGE_YEARS (rygel_lms_image_years_get_type ())
7337 +#define RYGEL_LMS_IMAGE_YEARS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYears))
7338 +#define RYGEL_LMS_IMAGE_YEARS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYearsClass))
7339 +#define RYGEL_LMS_IS_IMAGE_YEARS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS))
7340 +#define RYGEL_LMS_IS_IMAGE_YEARS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_YEARS))
7341 +#define RYGEL_LMS_IMAGE_YEARS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYearsClass))
7342 +
7343 +typedef struct _RygelLMSImageYears RygelLMSImageYears;
7344 +typedef struct _RygelLMSImageYearsClass RygelLMSImageYearsClass;
7345 +
7346 +struct _RygelLMSImageRoot {
7347 +       RygelSimpleContainer parent_instance;
7348 +       RygelLMSImageRootPrivate * priv;
7349 +};
7350 +
7351 +struct _RygelLMSImageRootClass {
7352 +       RygelSimpleContainerClass parent_class;
7353 +};
7354 +
7355 +
7356 +static gpointer rygel_lms_image_root_parent_class = NULL;
7357 +
7358 +GType rygel_lms_image_root_get_type (void) G_GNUC_CONST;
7359 +enum  {
7360 +       RYGEL_LMS_IMAGE_ROOT_DUMMY_PROPERTY
7361 +};
7362 +gpointer rygel_lms_database_ref (gpointer instance);
7363 +void rygel_lms_database_unref (gpointer instance);
7364 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
7365 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
7366 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
7367 +gpointer rygel_lms_value_get_database (const GValue* value);
7368 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
7369 +RygelLMSImageRoot* rygel_lms_image_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
7370 +RygelLMSImageRoot* rygel_lms_image_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
7371 +RygelLMSAllImages* rygel_lms_all_images_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
7372 +RygelLMSAllImages* rygel_lms_all_images_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
7373 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
7374 +GType rygel_lms_all_images_get_type (void) G_GNUC_CONST;
7375 +RygelLMSImageYears* rygel_lms_image_years_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
7376 +RygelLMSImageYears* rygel_lms_image_years_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
7377 +GType rygel_lms_image_years_get_type (void) G_GNUC_CONST;
7378 +
7379 +
7380 +RygelLMSImageRoot* rygel_lms_image_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
7381 +       RygelLMSImageRoot * self = NULL;
7382 +       const gchar* _tmp0_ = NULL;
7383 +       RygelMediaContainer* _tmp1_ = NULL;
7384 +       const gchar* _tmp2_ = NULL;
7385 +       RygelLMSDatabase* _tmp3_ = NULL;
7386 +       RygelLMSAllImages* _tmp4_ = NULL;
7387 +       RygelLMSAllImages* _tmp5_ = NULL;
7388 +       RygelLMSDatabase* _tmp6_ = NULL;
7389 +       RygelLMSImageYears* _tmp7_ = NULL;
7390 +       RygelLMSImageYears* _tmp8_ = NULL;
7391 +       g_return_val_if_fail (id != NULL, NULL);
7392 +       g_return_val_if_fail (parent != NULL, NULL);
7393 +       g_return_val_if_fail (title != NULL, NULL);
7394 +       g_return_val_if_fail (lms_db != NULL, NULL);
7395 +       _tmp0_ = id;
7396 +       _tmp1_ = parent;
7397 +       _tmp2_ = title;
7398 +       self = (RygelLMSImageRoot*) rygel_simple_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_);
7399 +       _tmp3_ = lms_db;
7400 +       _tmp4_ = rygel_lms_all_images_new ((RygelMediaContainer*) self, _tmp3_);
7401 +       _tmp5_ = _tmp4_;
7402 +       rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp5_);
7403 +       _g_object_unref0 (_tmp5_);
7404 +       _tmp6_ = lms_db;
7405 +       _tmp7_ = rygel_lms_image_years_new ((RygelMediaContainer*) self, _tmp6_);
7406 +       _tmp8_ = _tmp7_;
7407 +       rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp8_);
7408 +       _g_object_unref0 (_tmp8_);
7409 +       return self;
7410 +}
7411 +
7412 +
7413 +RygelLMSImageRoot* rygel_lms_image_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
7414 +       return rygel_lms_image_root_construct (RYGEL_LMS_TYPE_IMAGE_ROOT, id, parent, title, lms_db);
7415 +}
7416 +
7417 +
7418 +static void rygel_lms_image_root_class_init (RygelLMSImageRootClass * klass) {
7419 +       rygel_lms_image_root_parent_class = g_type_class_peek_parent (klass);
7420 +}
7421 +
7422 +
7423 +static void rygel_lms_image_root_instance_init (RygelLMSImageRoot * self) {
7424 +}
7425 +
7426 +
7427 +GType rygel_lms_image_root_get_type (void) {
7428 +       static volatile gsize rygel_lms_image_root_type_id__volatile = 0;
7429 +       if (g_once_init_enter (&rygel_lms_image_root_type_id__volatile)) {
7430 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSImageRootClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_image_root_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSImageRoot), 0, (GInstanceInitFunc) rygel_lms_image_root_instance_init, NULL };
7431 +               GType rygel_lms_image_root_type_id;
7432 +               rygel_lms_image_root_type_id = g_type_register_static (RYGEL_TYPE_SIMPLE_CONTAINER, "RygelLMSImageRoot", &g_define_type_info, 0);
7433 +               g_once_init_leave (&rygel_lms_image_root_type_id__volatile, rygel_lms_image_root_type_id);
7434 +       }
7435 +       return rygel_lms_image_root_type_id__volatile;
7436 +}
7437 +
7438 +
7439 +
7440 diff --git a/src/plugins/lms/rygel-lms-image-year.c b/src/plugins/lms/rygel-lms-image-year.c
7441 new file mode 100644
7442 index 0000000..5eb2721
7443 --- /dev/null
7444 +++ b/src/plugins/lms/rygel-lms-image-year.c
7445 @@ -0,0 +1,422 @@
7446 +/* rygel-lms-image-year.c generated by valac 0.28.0, the Vala compiler
7447 + * generated from rygel-lms-image-year.vala, do not modify */
7448 +
7449 +/*
7450 + * Copyright (C) 2013 Intel Corporation.
7451 + *
7452 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
7453 + *
7454 + * This file is part of Rygel.
7455 + *
7456 + * Rygel is free software; you can redistribute it and/or modify
7457 + * it under the terms of the GNU Lesser General Public License as published by
7458 + * the Free Software Foundation; either version 2 of the License, or
7459 + * (at your option) any later version.
7460 + *
7461 + * Rygel is distributed in the hope that it will be useful,
7462 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7463 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7464 + * GNU Lesser General Public License for more details.
7465 + *
7466 + * You should have received a copy of the GNU Lesser General Public License
7467 + * along with this program; if not, write to the Free Software Foundation,
7468 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
7469 + */
7470 +
7471 +#include <glib.h>
7472 +#include <glib-object.h>
7473 +#include <rygel-server.h>
7474 +#include <sqlite3.h>
7475 +#include <stdlib.h>
7476 +#include <string.h>
7477 +#include <gio/gio.h>
7478 +
7479 +
7480 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
7481 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
7482 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7483 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7484 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7485 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7486 +
7487 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
7488 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
7489 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
7490 +
7491 +#define RYGEL_LMS_TYPE_IMAGE_YEAR (rygel_lms_image_year_get_type ())
7492 +#define RYGEL_LMS_IMAGE_YEAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYear))
7493 +#define RYGEL_LMS_IMAGE_YEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYearClass))
7494 +#define RYGEL_LMS_IS_IMAGE_YEAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR))
7495 +#define RYGEL_LMS_IS_IMAGE_YEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_YEAR))
7496 +#define RYGEL_LMS_IMAGE_YEAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYearClass))
7497 +
7498 +typedef struct _RygelLMSImageYear RygelLMSImageYear;
7499 +typedef struct _RygelLMSImageYearClass RygelLMSImageYearClass;
7500 +typedef struct _RygelLMSImageYearPrivate RygelLMSImageYearPrivate;
7501 +#define _g_free0(var) (var = (g_free (var), NULL))
7502 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
7503 +
7504 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
7505 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
7506 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7507 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
7508 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
7509 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7510 +
7511 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
7512 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
7513 +
7514 +struct _RygelLMSCategoryContainer {
7515 +       RygelMediaContainer parent_instance;
7516 +       RygelLMSCategoryContainerPrivate * priv;
7517 +       sqlite3_stmt* stmt_all;
7518 +       sqlite3_stmt* stmt_find_object;
7519 +       sqlite3_stmt* stmt_added;
7520 +       sqlite3_stmt* stmt_removed;
7521 +       gchar* child_prefix;
7522 +       gchar* ref_prefix;
7523 +};
7524 +
7525 +struct _RygelLMSCategoryContainerClass {
7526 +       RygelMediaContainerClass parent_class;
7527 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
7528 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
7529 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
7530 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
7531 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
7532 +};
7533 +
7534 +struct _RygelLMSImageYear {
7535 +       RygelLMSCategoryContainer parent_instance;
7536 +       RygelLMSImageYearPrivate * priv;
7537 +};
7538 +
7539 +struct _RygelLMSImageYearClass {
7540 +       RygelLMSCategoryContainerClass parent_class;
7541 +};
7542 +
7543 +
7544 +static gpointer rygel_lms_image_year_parent_class = NULL;
7545 +
7546 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
7547 +GType rygel_lms_image_year_get_type (void) G_GNUC_CONST;
7548 +enum  {
7549 +       RYGEL_LMS_IMAGE_YEAR_DUMMY_PROPERTY
7550 +};
7551 +#define RYGEL_LMS_IMAGE_YEAR_SQL_ALL_TEMPLATE "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
7552 +"_profile, dlna_mime, strftime('%Y', date, 'unixepoch') as year " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id AND year = '%s' " "LIMIT ? OFFSET ?;"
7553 +#define RYGEL_LMS_IMAGE_YEAR_SQL_COUNT_TEMPLATE "SELECT count(images.id), strftime('%Y', date, 'unixepoch') as year " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id AND year = '%s';"
7554 +#define RYGEL_LMS_IMAGE_YEAR_SQL_FIND_OBJECT_TEMPLATE "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
7555 +"_profile, dlna_mime, strftime('%Y', date, 'unixepoch') as year " "FROM images, files " "WHERE dtime = 0 AND files.id = ? AND images.id = files.id AND year = '" \
7556 +"%s';"
7557 +#define RYGEL_LMS_IMAGE_YEAR_SQL_ADDED_TEMPLATE "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
7558 +"_profile, dlna_mime, strftime('%Y', date, 'unixepoch') as year " "FROM images, files " "WHERE dtime = 0 AND images.id = files.id AND year = '%s' " "AND update_id > ? AND update_id <= ?;"
7559 +#define RYGEL_LMS_IMAGE_YEAR_SQL_REMOVED_TEMPLATE "SELECT images.id, title, artist, date, width, height, path, size, dlna" \
7560 +"_profile, dlna_mime, strftime('%Y', date, 'unixepoch') as year " "FROM images, files " "WHERE dtime <> 0 AND images.id = files.id AND year = '%s' " "AND update_id > ? AND update_id <= ?;"
7561 +static RygelMediaObject* rygel_lms_image_year_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
7562 +gchar* rygel_lms_category_container_build_child_id (RygelLMSCategoryContainer* self, gint db_id);
7563 +gchar* rygel_lms_category_container_build_reference_id (RygelLMSCategoryContainer* self, gint db_id);
7564 +static gchar* rygel_lms_image_year_get_sql_all (const gchar* year);
7565 +static gchar* rygel_lms_image_year_get_sql_find_object (const gchar* year);
7566 +static gchar* rygel_lms_image_year_get_sql_count (const gchar* year);
7567 +static gchar* rygel_lms_image_year_get_sql_added (const gchar* year);
7568 +static gchar* rygel_lms_image_year_get_sql_removed (const gchar* year);
7569 +gpointer rygel_lms_database_ref (gpointer instance);
7570 +void rygel_lms_database_unref (gpointer instance);
7571 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
7572 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
7573 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
7574 +gpointer rygel_lms_value_get_database (const GValue* value);
7575 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
7576 +RygelLMSImageYear* rygel_lms_image_year_new (RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db);
7577 +RygelLMSImageYear* rygel_lms_image_year_construct (GType object_type, RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db);
7578 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
7579 +
7580 +
7581 +static RygelMediaObject* rygel_lms_image_year_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
7582 +       RygelLMSImageYear * self;
7583 +       RygelMediaObject* result = NULL;
7584 +       gint id = 0;
7585 +       sqlite3_stmt* _tmp0_ = NULL;
7586 +       gint _tmp1_ = 0;
7587 +       gchar* path = NULL;
7588 +       sqlite3_stmt* _tmp2_ = NULL;
7589 +       const gchar* _tmp3_ = NULL;
7590 +       gchar* _tmp4_ = NULL;
7591 +       gchar* mime_type = NULL;
7592 +       sqlite3_stmt* _tmp5_ = NULL;
7593 +       const gchar* _tmp6_ = NULL;
7594 +       gchar* _tmp7_ = NULL;
7595 +       gboolean _tmp8_ = FALSE;
7596 +       const gchar* _tmp9_ = NULL;
7597 +       gchar* title = NULL;
7598 +       sqlite3_stmt* _tmp15_ = NULL;
7599 +       const gchar* _tmp16_ = NULL;
7600 +       gchar* _tmp17_ = NULL;
7601 +       RygelImageItem* image = NULL;
7602 +       gint _tmp18_ = 0;
7603 +       gchar* _tmp19_ = NULL;
7604 +       gchar* _tmp20_ = NULL;
7605 +       RygelImageItem* _tmp21_ = NULL;
7606 +       RygelImageItem* _tmp22_ = NULL;
7607 +       gint _tmp23_ = 0;
7608 +       gchar* _tmp24_ = NULL;
7609 +       gchar* _tmp25_ = NULL;
7610 +       sqlite3_stmt* _tmp26_ = NULL;
7611 +       const gchar* _tmp27_ = NULL;
7612 +       GTimeVal tv = {0};
7613 +       sqlite3_stmt* _tmp28_ = NULL;
7614 +       gint _tmp29_ = 0;
7615 +       GTimeVal _tmp30_ = {0};
7616 +       gchar* _tmp31_ = NULL;
7617 +       gchar* _tmp32_ = NULL;
7618 +       sqlite3_stmt* _tmp33_ = NULL;
7619 +       gint _tmp34_ = 0;
7620 +       sqlite3_stmt* _tmp35_ = NULL;
7621 +       gint _tmp36_ = 0;
7622 +       sqlite3_stmt* _tmp37_ = NULL;
7623 +       gint _tmp38_ = 0;
7624 +       const gchar* _tmp39_ = NULL;
7625 +       sqlite3_stmt* _tmp40_ = NULL;
7626 +       const gchar* _tmp41_ = NULL;
7627 +       GFile* file = NULL;
7628 +       const gchar* _tmp42_ = NULL;
7629 +       GFile* _tmp43_ = NULL;
7630 +       gchar* _tmp44_ = NULL;
7631 +       gchar* _tmp45_ = NULL;
7632 +       self = (RygelLMSImageYear*) base;
7633 +       g_return_val_if_fail (statement != NULL, NULL);
7634 +       _tmp0_ = statement;
7635 +       _tmp1_ = sqlite3_column_int (_tmp0_, 0);
7636 +       id = _tmp1_;
7637 +       _tmp2_ = statement;
7638 +       _tmp3_ = sqlite3_column_text (_tmp2_, 6);
7639 +       _tmp4_ = g_strdup (_tmp3_);
7640 +       path = _tmp4_;
7641 +       _tmp5_ = statement;
7642 +       _tmp6_ = sqlite3_column_text (_tmp5_, 9);
7643 +       _tmp7_ = g_strdup (_tmp6_);
7644 +       mime_type = _tmp7_;
7645 +       _tmp9_ = mime_type;
7646 +       if (_tmp9_ == NULL) {
7647 +               _tmp8_ = TRUE;
7648 +       } else {
7649 +               const gchar* _tmp10_ = NULL;
7650 +               gint _tmp11_ = 0;
7651 +               gint _tmp12_ = 0;
7652 +               _tmp10_ = mime_type;
7653 +               _tmp11_ = strlen (_tmp10_);
7654 +               _tmp12_ = _tmp11_;
7655 +               _tmp8_ = _tmp12_ == 0;
7656 +       }
7657 +       if (_tmp8_) {
7658 +               gint _tmp13_ = 0;
7659 +               const gchar* _tmp14_ = NULL;
7660 +               _tmp13_ = id;
7661 +               _tmp14_ = path;
7662 +               g_debug ("rygel-lms-image-year.vala:62: Image item %d (%s) has no MIME type", _tmp13_, _tmp14_);
7663 +       }
7664 +       _tmp15_ = statement;
7665 +       _tmp16_ = sqlite3_column_text (_tmp15_, 1);
7666 +       _tmp17_ = g_strdup (_tmp16_);
7667 +       title = _tmp17_;
7668 +       _tmp18_ = id;
7669 +       _tmp19_ = rygel_lms_category_container_build_child_id ((RygelLMSCategoryContainer*) self, _tmp18_);
7670 +       _tmp20_ = _tmp19_;
7671 +       _tmp21_ = rygel_image_item_new (_tmp20_, (RygelMediaContainer*) self, title, RYGEL_IMAGE_ITEM_UPNP_CLASS);
7672 +       _tmp22_ = _tmp21_;
7673 +       _g_free0 (_tmp20_);
7674 +       image = _tmp22_;
7675 +       _tmp23_ = id;
7676 +       _tmp24_ = rygel_lms_category_container_build_reference_id ((RygelLMSCategoryContainer*) self, _tmp23_);
7677 +       _tmp25_ = _tmp24_;
7678 +       rygel_media_object_set_ref_id ((RygelMediaObject*) image, _tmp25_);
7679 +       _g_free0 (_tmp25_);
7680 +       _tmp26_ = statement;
7681 +       _tmp27_ = sqlite3_column_text (_tmp26_, 2);
7682 +       rygel_media_object_set_creator ((RygelMediaObject*) image, _tmp27_);
7683 +       _tmp28_ = statement;
7684 +       _tmp29_ = sqlite3_column_int (_tmp28_, 3);
7685 +       _tmp30_.tv_sec = (glong) _tmp29_;
7686 +       _tmp30_.tv_usec = (glong) 0;
7687 +       tv = _tmp30_;
7688 +       _tmp31_ = g_time_val_to_iso8601 (&tv);
7689 +       _tmp32_ = _tmp31_;
7690 +       rygel_media_object_set_date ((RygelMediaObject*) image, _tmp32_);
7691 +       _g_free0 (_tmp32_);
7692 +       _tmp33_ = statement;
7693 +       _tmp34_ = sqlite3_column_int (_tmp33_, 4);
7694 +       rygel_visual_item_set_width ((RygelVisualItem*) image, _tmp34_);
7695 +       _tmp35_ = statement;
7696 +       _tmp36_ = sqlite3_column_int (_tmp35_, 5);
7697 +       rygel_visual_item_set_height ((RygelVisualItem*) image, _tmp36_);
7698 +       _tmp37_ = statement;
7699 +       _tmp38_ = sqlite3_column_int (_tmp37_, 7);
7700 +       rygel_media_file_item_set_size ((RygelMediaFileItem*) image, (gint64) _tmp38_);
7701 +       _tmp39_ = mime_type;
7702 +       rygel_media_file_item_set_mime_type ((RygelMediaFileItem*) image, _tmp39_);
7703 +       _tmp40_ = statement;
7704 +       _tmp41_ = sqlite3_column_text (_tmp40_, 8);
7705 +       rygel_media_file_item_set_dlna_profile ((RygelMediaFileItem*) image, _tmp41_);
7706 +       _tmp42_ = path;
7707 +       _tmp43_ = g_file_new_for_path (_tmp42_);
7708 +       file = _tmp43_;
7709 +       _tmp44_ = g_file_get_uri (file);
7710 +       _tmp45_ = _tmp44_;
7711 +       rygel_media_object_add_uri ((RygelMediaObject*) image, _tmp45_);
7712 +       _g_free0 (_tmp45_);
7713 +       result = (RygelMediaObject*) image;
7714 +       _g_object_unref0 (file);
7715 +       _g_free0 (title);
7716 +       _g_free0 (mime_type);
7717 +       _g_free0 (path);
7718 +       return result;
7719 +}
7720 +
7721 +
7722 +static gchar* rygel_lms_image_year_get_sql_all (const gchar* year) {
7723 +       gchar* result = NULL;
7724 +       const gchar* _tmp0_ = NULL;
7725 +       gchar* _tmp1_ = NULL;
7726 +       g_return_val_if_fail (year != NULL, NULL);
7727 +       _tmp0_ = year;
7728 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_IMAGE_YEAR_SQL_ALL_TEMPLATE, _tmp0_);
7729 +       result = _tmp1_;
7730 +       return result;
7731 +}
7732 +
7733 +
7734 +static gchar* rygel_lms_image_year_get_sql_find_object (const gchar* year) {
7735 +       gchar* result = NULL;
7736 +       const gchar* _tmp0_ = NULL;
7737 +       gchar* _tmp1_ = NULL;
7738 +       g_return_val_if_fail (year != NULL, NULL);
7739 +       _tmp0_ = year;
7740 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_IMAGE_YEAR_SQL_FIND_OBJECT_TEMPLATE, _tmp0_);
7741 +       result = _tmp1_;
7742 +       return result;
7743 +}
7744 +
7745 +
7746 +static gchar* rygel_lms_image_year_get_sql_count (const gchar* year) {
7747 +       gchar* result = NULL;
7748 +       const gchar* _tmp0_ = NULL;
7749 +       gchar* _tmp1_ = NULL;
7750 +       g_return_val_if_fail (year != NULL, NULL);
7751 +       _tmp0_ = year;
7752 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_IMAGE_YEAR_SQL_COUNT_TEMPLATE, _tmp0_);
7753 +       result = _tmp1_;
7754 +       return result;
7755 +}
7756 +
7757 +
7758 +static gchar* rygel_lms_image_year_get_sql_added (const gchar* year) {
7759 +       gchar* result = NULL;
7760 +       const gchar* _tmp0_ = NULL;
7761 +       gchar* _tmp1_ = NULL;
7762 +       g_return_val_if_fail (year != NULL, NULL);
7763 +       _tmp0_ = year;
7764 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_IMAGE_YEAR_SQL_ADDED_TEMPLATE, _tmp0_);
7765 +       result = _tmp1_;
7766 +       return result;
7767 +}
7768 +
7769 +
7770 +static gchar* rygel_lms_image_year_get_sql_removed (const gchar* year) {
7771 +       gchar* result = NULL;
7772 +       const gchar* _tmp0_ = NULL;
7773 +       gchar* _tmp1_ = NULL;
7774 +       g_return_val_if_fail (year != NULL, NULL);
7775 +       _tmp0_ = year;
7776 +       _tmp1_ = g_strdup_printf (RYGEL_LMS_IMAGE_YEAR_SQL_REMOVED_TEMPLATE, _tmp0_);
7777 +       result = _tmp1_;
7778 +       return result;
7779 +}
7780 +
7781 +
7782 +RygelLMSImageYear* rygel_lms_image_year_construct (GType object_type, RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db) {
7783 +       RygelLMSImageYear * self = NULL;
7784 +       const gchar* _tmp0_ = NULL;
7785 +       gchar* _tmp1_ = NULL;
7786 +       gchar* _tmp2_ = NULL;
7787 +       RygelMediaContainer* _tmp3_ = NULL;
7788 +       const gchar* _tmp4_ = NULL;
7789 +       RygelLMSDatabase* _tmp5_ = NULL;
7790 +       const gchar* _tmp6_ = NULL;
7791 +       gchar* _tmp7_ = NULL;
7792 +       gchar* _tmp8_ = NULL;
7793 +       const gchar* _tmp9_ = NULL;
7794 +       gchar* _tmp10_ = NULL;
7795 +       gchar* _tmp11_ = NULL;
7796 +       const gchar* _tmp12_ = NULL;
7797 +       gchar* _tmp13_ = NULL;
7798 +       gchar* _tmp14_ = NULL;
7799 +       const gchar* _tmp15_ = NULL;
7800 +       gchar* _tmp16_ = NULL;
7801 +       gchar* _tmp17_ = NULL;
7802 +       const gchar* _tmp18_ = NULL;
7803 +       gchar* _tmp19_ = NULL;
7804 +       gchar* _tmp20_ = NULL;
7805 +       g_return_val_if_fail (parent != NULL, NULL);
7806 +       g_return_val_if_fail (year != NULL, NULL);
7807 +       g_return_val_if_fail (lms_db != NULL, NULL);
7808 +       _tmp0_ = year;
7809 +       _tmp1_ = g_strdup_printf ("%s", _tmp0_);
7810 +       _tmp2_ = _tmp1_;
7811 +       _tmp3_ = parent;
7812 +       _tmp4_ = year;
7813 +       _tmp5_ = lms_db;
7814 +       _tmp6_ = year;
7815 +       _tmp7_ = rygel_lms_image_year_get_sql_all (_tmp6_);
7816 +       _tmp8_ = _tmp7_;
7817 +       _tmp9_ = year;
7818 +       _tmp10_ = rygel_lms_image_year_get_sql_find_object (_tmp9_);
7819 +       _tmp11_ = _tmp10_;
7820 +       _tmp12_ = year;
7821 +       _tmp13_ = rygel_lms_image_year_get_sql_count (_tmp12_);
7822 +       _tmp14_ = _tmp13_;
7823 +       _tmp15_ = year;
7824 +       _tmp16_ = rygel_lms_image_year_get_sql_added (_tmp15_);
7825 +       _tmp17_ = _tmp16_;
7826 +       _tmp18_ = year;
7827 +       _tmp19_ = rygel_lms_image_year_get_sql_removed (_tmp18_);
7828 +       _tmp20_ = _tmp19_;
7829 +       self = (RygelLMSImageYear*) rygel_lms_category_container_construct (object_type, _tmp2_, _tmp3_, _tmp4_, _tmp5_, _tmp8_, _tmp11_, _tmp14_, _tmp17_, _tmp20_);
7830 +       _g_free0 (_tmp20_);
7831 +       _g_free0 (_tmp17_);
7832 +       _g_free0 (_tmp14_);
7833 +       _g_free0 (_tmp11_);
7834 +       _g_free0 (_tmp8_);
7835 +       _g_free0 (_tmp2_);
7836 +       return self;
7837 +}
7838 +
7839 +
7840 +RygelLMSImageYear* rygel_lms_image_year_new (RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db) {
7841 +       return rygel_lms_image_year_construct (RYGEL_LMS_TYPE_IMAGE_YEAR, parent, year, lms_db);
7842 +}
7843 +
7844 +
7845 +static void rygel_lms_image_year_class_init (RygelLMSImageYearClass * klass) {
7846 +       rygel_lms_image_year_parent_class = g_type_class_peek_parent (klass);
7847 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_image_year_real_object_from_statement;
7848 +}
7849 +
7850 +
7851 +static void rygel_lms_image_year_instance_init (RygelLMSImageYear * self) {
7852 +}
7853 +
7854 +
7855 +GType rygel_lms_image_year_get_type (void) {
7856 +       static volatile gsize rygel_lms_image_year_type_id__volatile = 0;
7857 +       if (g_once_init_enter (&rygel_lms_image_year_type_id__volatile)) {
7858 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSImageYearClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_image_year_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSImageYear), 0, (GInstanceInitFunc) rygel_lms_image_year_instance_init, NULL };
7859 +               GType rygel_lms_image_year_type_id;
7860 +               rygel_lms_image_year_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSImageYear", &g_define_type_info, 0);
7861 +               g_once_init_leave (&rygel_lms_image_year_type_id__volatile, rygel_lms_image_year_type_id);
7862 +       }
7863 +       return rygel_lms_image_year_type_id__volatile;
7864 +}
7865 +
7866 +
7867 +
7868 diff --git a/src/plugins/lms/rygel-lms-image-years.c b/src/plugins/lms/rygel-lms-image-years.c
7869 new file mode 100644
7870 index 0000000..35033a0
7871 --- /dev/null
7872 +++ b/src/plugins/lms/rygel-lms-image-years.c
7873 @@ -0,0 +1,196 @@
7874 +/* rygel-lms-image-years.c generated by valac 0.28.0, the Vala compiler
7875 + * generated from rygel-lms-image-years.vala, do not modify */
7876 +
7877 +/*
7878 + * Copyright (C) 2013 Intel Corporation.
7879 + *
7880 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
7881 + *
7882 + * This file is part of Rygel.
7883 + *
7884 + * Rygel is free software; you can redistribute it and/or modify
7885 + * it under the terms of the GNU Lesser General Public License as published by
7886 + * the Free Software Foundation; either version 2 of the License, or
7887 + * (at your option) any later version.
7888 + *
7889 + * Rygel is distributed in the hope that it will be useful,
7890 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
7891 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7892 + * GNU Lesser General Public License for more details.
7893 + *
7894 + * You should have received a copy of the GNU Lesser General Public License
7895 + * along with this program; if not, write to the Free Software Foundation,
7896 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
7897 + */
7898 +
7899 +#include <glib.h>
7900 +#include <glib-object.h>
7901 +#include <rygel-server.h>
7902 +#include <sqlite3.h>
7903 +#include <stdlib.h>
7904 +#include <string.h>
7905 +#include <glib/gi18n-lib.h>
7906 +
7907 +
7908 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
7909 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
7910 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7911 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7912 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
7913 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
7914 +
7915 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
7916 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
7917 +typedef struct _RygelLMSCategoryContainerPrivate RygelLMSCategoryContainerPrivate;
7918 +
7919 +#define RYGEL_LMS_TYPE_IMAGE_YEARS (rygel_lms_image_years_get_type ())
7920 +#define RYGEL_LMS_IMAGE_YEARS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYears))
7921 +#define RYGEL_LMS_IMAGE_YEARS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYearsClass))
7922 +#define RYGEL_LMS_IS_IMAGE_YEARS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS))
7923 +#define RYGEL_LMS_IS_IMAGE_YEARS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_YEARS))
7924 +#define RYGEL_LMS_IMAGE_YEARS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_YEARS, RygelLMSImageYearsClass))
7925 +
7926 +typedef struct _RygelLMSImageYears RygelLMSImageYears;
7927 +typedef struct _RygelLMSImageYearsClass RygelLMSImageYearsClass;
7928 +typedef struct _RygelLMSImageYearsPrivate RygelLMSImageYearsPrivate;
7929 +
7930 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
7931 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
7932 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7933 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
7934 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
7935 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
7936 +
7937 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
7938 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
7939 +
7940 +#define RYGEL_LMS_TYPE_IMAGE_YEAR (rygel_lms_image_year_get_type ())
7941 +#define RYGEL_LMS_IMAGE_YEAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYear))
7942 +#define RYGEL_LMS_IMAGE_YEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYearClass))
7943 +#define RYGEL_LMS_IS_IMAGE_YEAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR))
7944 +#define RYGEL_LMS_IS_IMAGE_YEAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_YEAR))
7945 +#define RYGEL_LMS_IMAGE_YEAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_YEAR, RygelLMSImageYearClass))
7946 +
7947 +typedef struct _RygelLMSImageYear RygelLMSImageYear;
7948 +typedef struct _RygelLMSImageYearClass RygelLMSImageYearClass;
7949 +
7950 +struct _RygelLMSCategoryContainer {
7951 +       RygelMediaContainer parent_instance;
7952 +       RygelLMSCategoryContainerPrivate * priv;
7953 +       sqlite3_stmt* stmt_all;
7954 +       sqlite3_stmt* stmt_find_object;
7955 +       sqlite3_stmt* stmt_added;
7956 +       sqlite3_stmt* stmt_removed;
7957 +       gchar* child_prefix;
7958 +       gchar* ref_prefix;
7959 +};
7960 +
7961 +struct _RygelLMSCategoryContainerClass {
7962 +       RygelMediaContainerClass parent_class;
7963 +       RygelMediaObject* (*object_from_statement) (RygelLMSCategoryContainer* self, sqlite3_stmt* statement);
7964 +       gchar* (*get_sql_all_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
7965 +       gchar* (*get_sql_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* filter);
7966 +       guint (*get_child_count_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args);
7967 +       RygelMediaObjects* (*get_children_with_filter) (RygelLMSCategoryContainer* self, const gchar* where_filter, GValueArray* args, const gchar* sort_criteria, guint offset, guint max_count);
7968 +};
7969 +
7970 +struct _RygelLMSImageYears {
7971 +       RygelLMSCategoryContainer parent_instance;
7972 +       RygelLMSImageYearsPrivate * priv;
7973 +};
7974 +
7975 +struct _RygelLMSImageYearsClass {
7976 +       RygelLMSCategoryContainerClass parent_class;
7977 +};
7978 +
7979 +
7980 +static gpointer rygel_lms_image_years_parent_class = NULL;
7981 +
7982 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
7983 +GType rygel_lms_image_years_get_type (void) G_GNUC_CONST;
7984 +enum  {
7985 +       RYGEL_LMS_IMAGE_YEARS_DUMMY_PROPERTY
7986 +};
7987 +#define RYGEL_LMS_IMAGE_YEARS_SQL_ALL "SELECT DISTINCT(strftime('%Y', images.date, 'unixepoch')) as year " "FROM images " "LIMIT ? OFFSET ?;"
7988 +#define RYGEL_LMS_IMAGE_YEARS_SQL_COUNT "SELECT COUNT(DISTINCT(strftime('%Y', images.date, 'unixepoch'))) " "FROM images;"
7989 +#define RYGEL_LMS_IMAGE_YEARS_SQL_FIND_OBJECT "SELECT strftime('%Y', images.date, 'unixepoch') as year " "FROM images " "WHERE year = CAST(? AS TEXT)"
7990 +static RygelMediaObject* rygel_lms_image_years_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement);
7991 +gpointer rygel_lms_database_ref (gpointer instance);
7992 +void rygel_lms_database_unref (gpointer instance);
7993 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
7994 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
7995 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
7996 +gpointer rygel_lms_value_get_database (const GValue* value);
7997 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
7998 +RygelLMSDatabase* rygel_lms_category_container_get_lms_db (RygelLMSCategoryContainer* self);
7999 +RygelLMSImageYear* rygel_lms_image_year_new (RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db);
8000 +RygelLMSImageYear* rygel_lms_image_year_construct (GType object_type, RygelMediaContainer* parent, const gchar* year, RygelLMSDatabase* lms_db);
8001 +GType rygel_lms_image_year_get_type (void) G_GNUC_CONST;
8002 +RygelLMSImageYears* rygel_lms_image_years_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8003 +RygelLMSImageYears* rygel_lms_image_years_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8004 +RygelLMSCategoryContainer* rygel_lms_category_container_construct (GType object_type, const gchar* db_id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db, const gchar* sql_all, const gchar* sql_find_object, const gchar* sql_count, const gchar* sql_added, const gchar* sql_removed);
8005 +
8006 +
8007 +static RygelMediaObject* rygel_lms_image_years_real_object_from_statement (RygelLMSCategoryContainer* base, sqlite3_stmt* statement) {
8008 +       RygelLMSImageYears * self;
8009 +       RygelMediaObject* result = NULL;
8010 +       sqlite3_stmt* _tmp0_ = NULL;
8011 +       const gchar* _tmp1_ = NULL;
8012 +       RygelLMSDatabase* _tmp2_ = NULL;
8013 +       RygelLMSDatabase* _tmp3_ = NULL;
8014 +       RygelLMSImageYear* _tmp4_ = NULL;
8015 +       self = (RygelLMSImageYears*) base;
8016 +       g_return_val_if_fail (statement != NULL, NULL);
8017 +       _tmp0_ = statement;
8018 +       _tmp1_ = sqlite3_column_text (_tmp0_, 0);
8019 +       _tmp2_ = rygel_lms_category_container_get_lms_db ((RygelLMSCategoryContainer*) self);
8020 +       _tmp3_ = _tmp2_;
8021 +       _tmp4_ = rygel_lms_image_year_new ((RygelMediaContainer*) self, _tmp1_, _tmp3_);
8022 +       result = (RygelMediaObject*) _tmp4_;
8023 +       return result;
8024 +}
8025 +
8026 +
8027 +RygelLMSImageYears* rygel_lms_image_years_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
8028 +       RygelLMSImageYears * self = NULL;
8029 +       RygelMediaContainer* _tmp0_ = NULL;
8030 +       const gchar* _tmp1_ = NULL;
8031 +       RygelLMSDatabase* _tmp2_ = NULL;
8032 +       g_return_val_if_fail (parent != NULL, NULL);
8033 +       g_return_val_if_fail (lms_db != NULL, NULL);
8034 +       _tmp0_ = parent;
8035 +       _tmp1_ = _ ("Years");
8036 +       _tmp2_ = lms_db;
8037 +       self = (RygelLMSImageYears*) rygel_lms_category_container_construct (object_type, "years", _tmp0_, _tmp1_, _tmp2_, RYGEL_LMS_IMAGE_YEARS_SQL_ALL, RYGEL_LMS_IMAGE_YEARS_SQL_FIND_OBJECT, RYGEL_LMS_IMAGE_YEARS_SQL_COUNT, NULL, NULL);
8038 +       return self;
8039 +}
8040 +
8041 +
8042 +RygelLMSImageYears* rygel_lms_image_years_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db) {
8043 +       return rygel_lms_image_years_construct (RYGEL_LMS_TYPE_IMAGE_YEARS, parent, lms_db);
8044 +}
8045 +
8046 +
8047 +static void rygel_lms_image_years_class_init (RygelLMSImageYearsClass * klass) {
8048 +       rygel_lms_image_years_parent_class = g_type_class_peek_parent (klass);
8049 +       ((RygelLMSCategoryContainerClass *) klass)->object_from_statement = rygel_lms_image_years_real_object_from_statement;
8050 +}
8051 +
8052 +
8053 +static void rygel_lms_image_years_instance_init (RygelLMSImageYears * self) {
8054 +}
8055 +
8056 +
8057 +GType rygel_lms_image_years_get_type (void) {
8058 +       static volatile gsize rygel_lms_image_years_type_id__volatile = 0;
8059 +       if (g_once_init_enter (&rygel_lms_image_years_type_id__volatile)) {
8060 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSImageYearsClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_image_years_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSImageYears), 0, (GInstanceInitFunc) rygel_lms_image_years_instance_init, NULL };
8061 +               GType rygel_lms_image_years_type_id;
8062 +               rygel_lms_image_years_type_id = g_type_register_static (RYGEL_LMS_TYPE_CATEGORY_CONTAINER, "RygelLMSImageYears", &g_define_type_info, 0);
8063 +               g_once_init_leave (&rygel_lms_image_years_type_id__volatile, rygel_lms_image_years_type_id);
8064 +       }
8065 +       return rygel_lms_image_years_type_id__volatile;
8066 +}
8067 +
8068 +
8069 +
8070 diff --git a/src/plugins/lms/rygel-lms-music-root.c b/src/plugins/lms/rygel-lms-music-root.c
8071 new file mode 100644
8072 index 0000000..753906d
8073 --- /dev/null
8074 +++ b/src/plugins/lms/rygel-lms-music-root.c
8075 @@ -0,0 +1,202 @@
8076 +/* rygel-lms-music-root.c generated by valac 0.28.0, the Vala compiler
8077 + * generated from rygel-lms-music-root.vala, do not modify */
8078 +
8079 +/*
8080 + * Copyright (C) 2013 Intel Corporation.
8081 + *
8082 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
8083 + *
8084 + * This file is part of Rygel.
8085 + *
8086 + * Rygel is free software; you can redistribute it and/or modify
8087 + * it under the terms of the GNU Lesser General Public License as published by
8088 + * the Free Software Foundation; either version 2 of the License, or
8089 + * (at your option) any later version.
8090 + *
8091 + * Rygel is distributed in the hope that it will be useful,
8092 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8093 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8094 + * GNU Lesser General Public License for more details.
8095 + *
8096 + * You should have received a copy of the GNU Lesser General Public License
8097 + * along with this program; if not, write to the Free Software Foundation,
8098 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
8099 + */
8100 +
8101 +#include <glib.h>
8102 +#include <glib-object.h>
8103 +#include <rygel-server.h>
8104 +#include <stdlib.h>
8105 +#include <string.h>
8106 +#include <glib/gi18n-lib.h>
8107 +
8108 +
8109 +#define RYGEL_LMS_TYPE_MUSIC_ROOT (rygel_lms_music_root_get_type ())
8110 +#define RYGEL_LMS_MUSIC_ROOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRoot))
8111 +#define RYGEL_LMS_MUSIC_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRootClass))
8112 +#define RYGEL_LMS_IS_MUSIC_ROOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT))
8113 +#define RYGEL_LMS_IS_MUSIC_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_MUSIC_ROOT))
8114 +#define RYGEL_LMS_MUSIC_ROOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRootClass))
8115 +
8116 +typedef struct _RygelLMSMusicRoot RygelLMSMusicRoot;
8117 +typedef struct _RygelLMSMusicRootClass RygelLMSMusicRootClass;
8118 +typedef struct _RygelLMSMusicRootPrivate RygelLMSMusicRootPrivate;
8119 +
8120 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
8121 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
8122 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
8123 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
8124 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
8125 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
8126 +
8127 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
8128 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
8129 +
8130 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
8131 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
8132 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
8133 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
8134 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
8135 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
8136 +
8137 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
8138 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
8139 +
8140 +#define RYGEL_LMS_TYPE_ALL_MUSIC (rygel_lms_all_music_get_type ())
8141 +#define RYGEL_LMS_ALL_MUSIC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusic))
8142 +#define RYGEL_LMS_ALL_MUSIC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusicClass))
8143 +#define RYGEL_LMS_IS_ALL_MUSIC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_MUSIC))
8144 +#define RYGEL_LMS_IS_ALL_MUSIC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_MUSIC))
8145 +#define RYGEL_LMS_ALL_MUSIC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_MUSIC, RygelLMSAllMusicClass))
8146 +
8147 +typedef struct _RygelLMSAllMusic RygelLMSAllMusic;
8148 +typedef struct _RygelLMSAllMusicClass RygelLMSAllMusicClass;
8149 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
8150 +
8151 +#define RYGEL_LMS_TYPE_ARTISTS (rygel_lms_artists_get_type ())
8152 +#define RYGEL_LMS_ARTISTS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtists))
8153 +#define RYGEL_LMS_ARTISTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtistsClass))
8154 +#define RYGEL_LMS_IS_ARTISTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ARTISTS))
8155 +#define RYGEL_LMS_IS_ARTISTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ARTISTS))
8156 +#define RYGEL_LMS_ARTISTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ARTISTS, RygelLMSArtistsClass))
8157 +
8158 +typedef struct _RygelLMSArtists RygelLMSArtists;
8159 +typedef struct _RygelLMSArtistsClass RygelLMSArtistsClass;
8160 +
8161 +#define RYGEL_LMS_TYPE_ALBUMS (rygel_lms_albums_get_type ())
8162 +#define RYGEL_LMS_ALBUMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbums))
8163 +#define RYGEL_LMS_ALBUMS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbumsClass))
8164 +#define RYGEL_LMS_IS_ALBUMS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALBUMS))
8165 +#define RYGEL_LMS_IS_ALBUMS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALBUMS))
8166 +#define RYGEL_LMS_ALBUMS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALBUMS, RygelLMSAlbumsClass))
8167 +
8168 +typedef struct _RygelLMSAlbums RygelLMSAlbums;
8169 +typedef struct _RygelLMSAlbumsClass RygelLMSAlbumsClass;
8170 +
8171 +struct _RygelLMSMusicRoot {
8172 +       RygelSimpleContainer parent_instance;
8173 +       RygelLMSMusicRootPrivate * priv;
8174 +};
8175 +
8176 +struct _RygelLMSMusicRootClass {
8177 +       RygelSimpleContainerClass parent_class;
8178 +};
8179 +
8180 +
8181 +static gpointer rygel_lms_music_root_parent_class = NULL;
8182 +
8183 +GType rygel_lms_music_root_get_type (void) G_GNUC_CONST;
8184 +enum  {
8185 +       RYGEL_LMS_MUSIC_ROOT_DUMMY_PROPERTY
8186 +};
8187 +gpointer rygel_lms_database_ref (gpointer instance);
8188 +void rygel_lms_database_unref (gpointer instance);
8189 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
8190 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
8191 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
8192 +gpointer rygel_lms_value_get_database (const GValue* value);
8193 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
8194 +RygelLMSMusicRoot* rygel_lms_music_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8195 +RygelLMSMusicRoot* rygel_lms_music_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8196 +RygelLMSAllMusic* rygel_lms_all_music_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8197 +RygelLMSAllMusic* rygel_lms_all_music_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8198 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
8199 +GType rygel_lms_all_music_get_type (void) G_GNUC_CONST;
8200 +RygelLMSArtists* rygel_lms_artists_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8201 +RygelLMSArtists* rygel_lms_artists_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8202 +GType rygel_lms_artists_get_type (void) G_GNUC_CONST;
8203 +RygelLMSAlbums* rygel_lms_albums_new (RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8204 +RygelLMSAlbums* rygel_lms_albums_construct (GType object_type, RygelMediaContainer* parent, RygelLMSDatabase* lms_db);
8205 +GType rygel_lms_albums_get_type (void) G_GNUC_CONST;
8206 +
8207 +
8208 +RygelLMSMusicRoot* rygel_lms_music_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
8209 +       RygelLMSMusicRoot * self = NULL;
8210 +       const gchar* _tmp0_ = NULL;
8211 +       RygelMediaContainer* _tmp1_ = NULL;
8212 +       const gchar* _tmp2_ = NULL;
8213 +       RygelLMSDatabase* _tmp3_ = NULL;
8214 +       RygelLMSAllMusic* _tmp4_ = NULL;
8215 +       RygelLMSAllMusic* _tmp5_ = NULL;
8216 +       const gchar* _tmp6_ = NULL;
8217 +       RygelLMSDatabase* _tmp7_ = NULL;
8218 +       RygelLMSArtists* _tmp8_ = NULL;
8219 +       RygelLMSArtists* _tmp9_ = NULL;
8220 +       RygelLMSDatabase* _tmp10_ = NULL;
8221 +       RygelLMSAlbums* _tmp11_ = NULL;
8222 +       RygelLMSAlbums* _tmp12_ = NULL;
8223 +       g_return_val_if_fail (id != NULL, NULL);
8224 +       g_return_val_if_fail (parent != NULL, NULL);
8225 +       g_return_val_if_fail (title != NULL, NULL);
8226 +       g_return_val_if_fail (lms_db != NULL, NULL);
8227 +       _tmp0_ = id;
8228 +       _tmp1_ = parent;
8229 +       _tmp2_ = title;
8230 +       self = (RygelLMSMusicRoot*) rygel_simple_container_construct (object_type, _tmp0_, _tmp1_, _tmp2_);
8231 +       _tmp3_ = lms_db;
8232 +       _tmp4_ = rygel_lms_all_music_new ((RygelMediaContainer*) self, _tmp3_);
8233 +       _tmp5_ = _tmp4_;
8234 +       rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp5_);
8235 +       _g_object_unref0 (_tmp5_);
8236 +       _tmp6_ = _ ("Artists");
8237 +       _tmp7_ = lms_db;
8238 +       _tmp8_ = rygel_lms_artists_new ("artists", (RygelMediaContainer*) self, _tmp6_, _tmp7_);
8239 +       _tmp9_ = _tmp8_;
8240 +       rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp9_);
8241 +       _g_object_unref0 (_tmp9_);
8242 +       _tmp10_ = lms_db;
8243 +       _tmp11_ = rygel_lms_albums_new ((RygelMediaContainer*) self, _tmp10_);
8244 +       _tmp12_ = _tmp11_;
8245 +       rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp12_);
8246 +       _g_object_unref0 (_tmp12_);
8247 +       return self;
8248 +}
8249 +
8250 +
8251 +RygelLMSMusicRoot* rygel_lms_music_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db) {
8252 +       return rygel_lms_music_root_construct (RYGEL_LMS_TYPE_MUSIC_ROOT, id, parent, title, lms_db);
8253 +}
8254 +
8255 +
8256 +static void rygel_lms_music_root_class_init (RygelLMSMusicRootClass * klass) {
8257 +       rygel_lms_music_root_parent_class = g_type_class_peek_parent (klass);
8258 +}
8259 +
8260 +
8261 +static void rygel_lms_music_root_instance_init (RygelLMSMusicRoot * self) {
8262 +}
8263 +
8264 +
8265 +GType rygel_lms_music_root_get_type (void) {
8266 +       static volatile gsize rygel_lms_music_root_type_id__volatile = 0;
8267 +       if (g_once_init_enter (&rygel_lms_music_root_type_id__volatile)) {
8268 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSMusicRootClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_music_root_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSMusicRoot), 0, (GInstanceInitFunc) rygel_lms_music_root_instance_init, NULL };
8269 +               GType rygel_lms_music_root_type_id;
8270 +               rygel_lms_music_root_type_id = g_type_register_static (RYGEL_TYPE_SIMPLE_CONTAINER, "RygelLMSMusicRoot", &g_define_type_info, 0);
8271 +               g_once_init_leave (&rygel_lms_music_root_type_id__volatile, rygel_lms_music_root_type_id);
8272 +       }
8273 +       return rygel_lms_music_root_type_id__volatile;
8274 +}
8275 +
8276 +
8277 +
8278 diff --git a/src/plugins/lms/rygel-lms-plugin-factory.c b/src/plugins/lms/rygel-lms-plugin-factory.c
8279 new file mode 100644
8280 index 0000000..de4a5ab
8281 --- /dev/null
8282 +++ b/src/plugins/lms/rygel-lms-plugin-factory.c
8283 @@ -0,0 +1,307 @@
8284 +/* rygel-lms-plugin-factory.c generated by valac 0.28.0, the Vala compiler
8285 + * generated from rygel-lms-plugin-factory.vala, do not modify */
8286 +
8287 +/*
8288 + * Copyright (C) 2013 Intel Corporation.
8289 + *
8290 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
8291 + *
8292 + * This file is part of Rygel.
8293 + *
8294 + * Rygel is free software; you can redistribute it and/or modify
8295 + * it under the terms of the GNU Lesser General Public License as published by
8296 + * the Free Software Foundation; either version 2 of the License, or
8297 + * (at your option) any later version.
8298 + *
8299 + * Rygel is distributed in the hope that it will be useful,
8300 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8301 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8302 + * GNU Lesser General Public License for more details.
8303 + *
8304 + * You should have received a copy of the GNU Lesser General Public License
8305 + * along with this program; if not, write to the Free Software Foundation,
8306 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
8307 + */
8308 +
8309 +#include <glib.h>
8310 +#include <glib-object.h>
8311 +#include <rygel-core.h>
8312 +#include <rygel-server.h>
8313 +#include <gobject/gvaluecollector.h>
8314 +
8315 +
8316 +#define RYGEL_LMS_TYPE_PLUGIN_FACTORY (rygel_lms_plugin_factory_get_type ())
8317 +#define RYGEL_LMS_PLUGIN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_PLUGIN_FACTORY, RygelLMSPluginFactory))
8318 +#define RYGEL_LMS_PLUGIN_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_PLUGIN_FACTORY, RygelLMSPluginFactoryClass))
8319 +#define RYGEL_LMS_IS_PLUGIN_FACTORY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_PLUGIN_FACTORY))
8320 +#define RYGEL_LMS_IS_PLUGIN_FACTORY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_PLUGIN_FACTORY))
8321 +#define RYGEL_LMS_PLUGIN_FACTORY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_PLUGIN_FACTORY, RygelLMSPluginFactoryClass))
8322 +
8323 +typedef struct _RygelLMSPluginFactory RygelLMSPluginFactory;
8324 +typedef struct _RygelLMSPluginFactoryClass RygelLMSPluginFactoryClass;
8325 +#define _rygel_lms_plugin_factory_unref0(var) ((var == NULL) ? NULL : (var = (rygel_lms_plugin_factory_unref (var), NULL)))
8326 +typedef struct _RygelLMSPluginFactoryPrivate RygelLMSPluginFactoryPrivate;
8327 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
8328 +
8329 +#define RYGEL_LMS_TYPE_PLUGIN (rygel_lms_plugin_get_type ())
8330 +#define RYGEL_LMS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPlugin))
8331 +#define RYGEL_LMS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPluginClass))
8332 +#define RYGEL_LMS_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_PLUGIN))
8333 +#define RYGEL_LMS_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_PLUGIN))
8334 +#define RYGEL_LMS_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPluginClass))
8335 +
8336 +typedef struct _RygelLMSPlugin RygelLMSPlugin;
8337 +typedef struct _RygelLMSPluginClass RygelLMSPluginClass;
8338 +typedef struct _RygelLMSParamSpecPluginFactory RygelLMSParamSpecPluginFactory;
8339 +
8340 +struct _RygelLMSPluginFactory {
8341 +       GTypeInstance parent_instance;
8342 +       volatile int ref_count;
8343 +       RygelLMSPluginFactoryPrivate * priv;
8344 +};
8345 +
8346 +struct _RygelLMSPluginFactoryClass {
8347 +       GTypeClass parent_class;
8348 +       void (*finalize) (RygelLMSPluginFactory *self);
8349 +};
8350 +
8351 +struct _RygelLMSPluginFactoryPrivate {
8352 +       RygelPluginLoader* loader;
8353 +};
8354 +
8355 +struct _RygelLMSParamSpecPluginFactory {
8356 +       GParamSpec parent_instance;
8357 +};
8358 +
8359 +
8360 +extern RygelLMSPluginFactory* plugin_factory;
8361 +RygelLMSPluginFactory* plugin_factory = NULL;
8362 +static gpointer rygel_lms_plugin_factory_parent_class = NULL;
8363 +
8364 +gpointer rygel_lms_plugin_factory_ref (gpointer instance);
8365 +void rygel_lms_plugin_factory_unref (gpointer instance);
8366 +GParamSpec* rygel_lms_param_spec_plugin_factory (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
8367 +void rygel_lms_value_set_plugin_factory (GValue* value, gpointer v_object);
8368 +void rygel_lms_value_take_plugin_factory (GValue* value, gpointer v_object);
8369 +gpointer rygel_lms_value_get_plugin_factory (const GValue* value);
8370 +GType rygel_lms_plugin_factory_get_type (void) G_GNUC_CONST;
8371 +void module_init (RygelPluginLoader* loader);
8372 +RygelLMSPluginFactory* rygel_lms_plugin_factory_new (RygelPluginLoader* loader);
8373 +RygelLMSPluginFactory* rygel_lms_plugin_factory_construct (GType object_type, RygelPluginLoader* loader);
8374 +#define RYGEL_LMS_PLUGIN_FACTORY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_LMS_TYPE_PLUGIN_FACTORY, RygelLMSPluginFactoryPrivate))
8375 +enum  {
8376 +       RYGEL_LMS_PLUGIN_FACTORY_DUMMY_PROPERTY
8377 +};
8378 +RygelLMSPlugin* rygel_lms_plugin_new (void);
8379 +RygelLMSPlugin* rygel_lms_plugin_construct (GType object_type);
8380 +GType rygel_lms_plugin_get_type (void) G_GNUC_CONST;
8381 +static void rygel_lms_plugin_factory_finalize (RygelLMSPluginFactory* obj);
8382 +
8383 +
8384 +void module_init (RygelPluginLoader* loader) {
8385 +       RygelPluginLoader* _tmp0_ = NULL;
8386 +       RygelLMSPluginFactory* _tmp1_ = NULL;
8387 +       g_return_if_fail (loader != NULL);
8388 +       _tmp0_ = loader;
8389 +       _tmp1_ = rygel_lms_plugin_factory_new (_tmp0_);
8390 +       _rygel_lms_plugin_factory_unref0 (plugin_factory);
8391 +       plugin_factory = _tmp1_;
8392 +}
8393 +
8394 +
8395 +static gpointer _g_object_ref0 (gpointer self) {
8396 +       return self ? g_object_ref (self) : NULL;
8397 +}
8398 +
8399 +
8400 +RygelLMSPluginFactory* rygel_lms_plugin_factory_construct (GType object_type, RygelPluginLoader* loader) {
8401 +       RygelLMSPluginFactory* self = NULL;
8402 +       RygelPluginLoader* _tmp0_ = NULL;
8403 +       RygelPluginLoader* _tmp1_ = NULL;
8404 +       RygelPluginLoader* _tmp2_ = NULL;
8405 +       RygelLMSPlugin* _tmp3_ = NULL;
8406 +       RygelLMSPlugin* _tmp4_ = NULL;
8407 +       g_return_val_if_fail (loader != NULL, NULL);
8408 +       self = (RygelLMSPluginFactory*) g_type_create_instance (object_type);
8409 +       _tmp0_ = loader;
8410 +       _tmp1_ = _g_object_ref0 (_tmp0_);
8411 +       _g_object_unref0 (self->priv->loader);
8412 +       self->priv->loader = _tmp1_;
8413 +       _tmp2_ = self->priv->loader;
8414 +       _tmp3_ = rygel_lms_plugin_new ();
8415 +       _tmp4_ = _tmp3_;
8416 +       rygel_plugin_loader_add_plugin (_tmp2_, (RygelPlugin*) _tmp4_);
8417 +       _g_object_unref0 (_tmp4_);
8418 +       return self;
8419 +}
8420 +
8421 +
8422 +RygelLMSPluginFactory* rygel_lms_plugin_factory_new (RygelPluginLoader* loader) {
8423 +       return rygel_lms_plugin_factory_construct (RYGEL_LMS_TYPE_PLUGIN_FACTORY, loader);
8424 +}
8425 +
8426 +
8427 +static void rygel_lms_value_plugin_factory_init (GValue* value) {
8428 +       value->data[0].v_pointer = NULL;
8429 +}
8430 +
8431 +
8432 +static void rygel_lms_value_plugin_factory_free_value (GValue* value) {
8433 +       if (value->data[0].v_pointer) {
8434 +               rygel_lms_plugin_factory_unref (value->data[0].v_pointer);
8435 +       }
8436 +}
8437 +
8438 +
8439 +static void rygel_lms_value_plugin_factory_copy_value (const GValue* src_value, GValue* dest_value) {
8440 +       if (src_value->data[0].v_pointer) {
8441 +               dest_value->data[0].v_pointer = rygel_lms_plugin_factory_ref (src_value->data[0].v_pointer);
8442 +       } else {
8443 +               dest_value->data[0].v_pointer = NULL;
8444 +       }
8445 +}
8446 +
8447 +
8448 +static gpointer rygel_lms_value_plugin_factory_peek_pointer (const GValue* value) {
8449 +       return value->data[0].v_pointer;
8450 +}
8451 +
8452 +
8453 +static gchar* rygel_lms_value_plugin_factory_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
8454 +       if (collect_values[0].v_pointer) {
8455 +               RygelLMSPluginFactory* object;
8456 +               object = collect_values[0].v_pointer;
8457 +               if (object->parent_instance.g_class == NULL) {
8458 +                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
8459 +               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
8460 +                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
8461 +               }
8462 +               value->data[0].v_pointer = rygel_lms_plugin_factory_ref (object);
8463 +       } else {
8464 +               value->data[0].v_pointer = NULL;
8465 +       }
8466 +       return NULL;
8467 +}
8468 +
8469 +
8470 +static gchar* rygel_lms_value_plugin_factory_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
8471 +       RygelLMSPluginFactory** object_p;
8472 +       object_p = collect_values[0].v_pointer;
8473 +       if (!object_p) {
8474 +               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
8475 +       }
8476 +       if (!value->data[0].v_pointer) {
8477 +               *object_p = NULL;
8478 +       } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
8479 +               *object_p = value->data[0].v_pointer;
8480 +       } else {
8481 +               *object_p = rygel_lms_plugin_factory_ref (value->data[0].v_pointer);
8482 +       }
8483 +       return NULL;
8484 +}
8485 +
8486 +
8487 +GParamSpec* rygel_lms_param_spec_plugin_factory (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
8488 +       RygelLMSParamSpecPluginFactory* spec;
8489 +       g_return_val_if_fail (g_type_is_a (object_type, RYGEL_LMS_TYPE_PLUGIN_FACTORY), NULL);
8490 +       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
8491 +       G_PARAM_SPEC (spec)->value_type = object_type;
8492 +       return G_PARAM_SPEC (spec);
8493 +}
8494 +
8495 +
8496 +gpointer rygel_lms_value_get_plugin_factory (const GValue* value) {
8497 +       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_PLUGIN_FACTORY), NULL);
8498 +       return value->data[0].v_pointer;
8499 +}
8500 +
8501 +
8502 +void rygel_lms_value_set_plugin_factory (GValue* value, gpointer v_object) {
8503 +       RygelLMSPluginFactory* old;
8504 +       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_PLUGIN_FACTORY));
8505 +       old = value->data[0].v_pointer;
8506 +       if (v_object) {
8507 +               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_LMS_TYPE_PLUGIN_FACTORY));
8508 +               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
8509 +               value->data[0].v_pointer = v_object;
8510 +               rygel_lms_plugin_factory_ref (value->data[0].v_pointer);
8511 +       } else {
8512 +               value->data[0].v_pointer = NULL;
8513 +       }
8514 +       if (old) {
8515 +               rygel_lms_plugin_factory_unref (old);
8516 +       }
8517 +}
8518 +
8519 +
8520 +void rygel_lms_value_take_plugin_factory (GValue* value, gpointer v_object) {
8521 +       RygelLMSPluginFactory* old;
8522 +       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, RYGEL_LMS_TYPE_PLUGIN_FACTORY));
8523 +       old = value->data[0].v_pointer;
8524 +       if (v_object) {
8525 +               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, RYGEL_LMS_TYPE_PLUGIN_FACTORY));
8526 +               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
8527 +               value->data[0].v_pointer = v_object;
8528 +       } else {
8529 +               value->data[0].v_pointer = NULL;
8530 +       }
8531 +       if (old) {
8532 +               rygel_lms_plugin_factory_unref (old);
8533 +       }
8534 +}
8535 +
8536 +
8537 +static void rygel_lms_plugin_factory_class_init (RygelLMSPluginFactoryClass * klass) {
8538 +       rygel_lms_plugin_factory_parent_class = g_type_class_peek_parent (klass);
8539 +       ((RygelLMSPluginFactoryClass *) klass)->finalize = rygel_lms_plugin_factory_finalize;
8540 +       g_type_class_add_private (klass, sizeof (RygelLMSPluginFactoryPrivate));
8541 +}
8542 +
8543 +
8544 +static void rygel_lms_plugin_factory_instance_init (RygelLMSPluginFactory * self) {
8545 +       self->priv = RYGEL_LMS_PLUGIN_FACTORY_GET_PRIVATE (self);
8546 +       self->ref_count = 1;
8547 +}
8548 +
8549 +
8550 +static void rygel_lms_plugin_factory_finalize (RygelLMSPluginFactory* obj) {
8551 +       RygelLMSPluginFactory * self;
8552 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_PLUGIN_FACTORY, RygelLMSPluginFactory);
8553 +       g_signal_handlers_destroy (self);
8554 +       _g_object_unref0 (self->priv->loader);
8555 +}
8556 +
8557 +
8558 +GType rygel_lms_plugin_factory_get_type (void) {
8559 +       static volatile gsize rygel_lms_plugin_factory_type_id__volatile = 0;
8560 +       if (g_once_init_enter (&rygel_lms_plugin_factory_type_id__volatile)) {
8561 +               static const GTypeValueTable g_define_type_value_table = { rygel_lms_value_plugin_factory_init, rygel_lms_value_plugin_factory_free_value, rygel_lms_value_plugin_factory_copy_value, rygel_lms_value_plugin_factory_peek_pointer, "p", rygel_lms_value_plugin_factory_collect_value, "p", rygel_lms_value_plugin_factory_lcopy_value };
8562 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSPluginFactoryClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_plugin_factory_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSPluginFactory), 0, (GInstanceInitFunc) rygel_lms_plugin_factory_instance_init, &g_define_type_value_table };
8563 +               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
8564 +               GType rygel_lms_plugin_factory_type_id;
8565 +               rygel_lms_plugin_factory_type_id = g_type_register_fundamental (g_type_fundamental_next (), "RygelLMSPluginFactory", &g_define_type_info, &g_define_type_fundamental_info, 0);
8566 +               g_once_init_leave (&rygel_lms_plugin_factory_type_id__volatile, rygel_lms_plugin_factory_type_id);
8567 +       }
8568 +       return rygel_lms_plugin_factory_type_id__volatile;
8569 +}
8570 +
8571 +
8572 +gpointer rygel_lms_plugin_factory_ref (gpointer instance) {
8573 +       RygelLMSPluginFactory* self;
8574 +       self = instance;
8575 +       g_atomic_int_inc (&self->ref_count);
8576 +       return instance;
8577 +}
8578 +
8579 +
8580 +void rygel_lms_plugin_factory_unref (gpointer instance) {
8581 +       RygelLMSPluginFactory* self;
8582 +       self = instance;
8583 +       if (g_atomic_int_dec_and_test (&self->ref_count)) {
8584 +               RYGEL_LMS_PLUGIN_FACTORY_GET_CLASS (self)->finalize (self);
8585 +               g_type_free_instance ((GTypeInstance *) self);
8586 +       }
8587 +}
8588 +
8589 +
8590 +
8591 diff --git a/src/plugins/lms/rygel-lms-plugin.c b/src/plugins/lms/rygel-lms-plugin.c
8592 new file mode 100644
8593 index 0000000..980de64
8594 --- /dev/null
8595 +++ b/src/plugins/lms/rygel-lms-plugin.c
8596 @@ -0,0 +1,134 @@
8597 +/* rygel-lms-plugin.c generated by valac 0.28.0, the Vala compiler
8598 + * generated from rygel-lms-plugin.vala, do not modify */
8599 +
8600 +/*
8601 + * Copyright (C) 2013 Intel Corporation.
8602 + *
8603 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
8604 + *
8605 + * This file is part of Rygel.
8606 + *
8607 + * Rygel is free software; you can redistribute it and/or modify
8608 + * it under the terms of the GNU Lesser General Public License as published by
8609 + * the Free Software Foundation; either version 2 of the License, or
8610 + * (at your option) any later version.
8611 + *
8612 + * Rygel is distributed in the hope that it will be useful,
8613 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8614 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8615 + * GNU Lesser General Public License for more details.
8616 + *
8617 + * You should have received a copy of the GNU Lesser General Public License
8618 + * along with this program; if not, write to the Free Software Foundation,
8619 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
8620 + */
8621 +
8622 +#include <glib.h>
8623 +#include <glib-object.h>
8624 +#include <rygel-server.h>
8625 +#include <stdlib.h>
8626 +#include <string.h>
8627 +#include <rygel-core.h>
8628 +
8629 +
8630 +#define RYGEL_LMS_TYPE_PLUGIN (rygel_lms_plugin_get_type ())
8631 +#define RYGEL_LMS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPlugin))
8632 +#define RYGEL_LMS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPluginClass))
8633 +#define RYGEL_LMS_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_PLUGIN))
8634 +#define RYGEL_LMS_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_PLUGIN))
8635 +#define RYGEL_LMS_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_PLUGIN, RygelLMSPluginClass))
8636 +
8637 +typedef struct _RygelLMSPlugin RygelLMSPlugin;
8638 +typedef struct _RygelLMSPluginClass RygelLMSPluginClass;
8639 +typedef struct _RygelLMSPluginPrivate RygelLMSPluginPrivate;
8640 +
8641 +#define RYGEL_LMS_TYPE_ROOT_CONTAINER (rygel_lms_root_container_get_type ())
8642 +#define RYGEL_LMS_ROOT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainer))
8643 +#define RYGEL_LMS_ROOT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainerClass))
8644 +#define RYGEL_LMS_IS_ROOT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER))
8645 +#define RYGEL_LMS_IS_ROOT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ROOT_CONTAINER))
8646 +#define RYGEL_LMS_ROOT_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainerClass))
8647 +
8648 +typedef struct _RygelLMSRootContainer RygelLMSRootContainer;
8649 +typedef struct _RygelLMSRootContainerClass RygelLMSRootContainerClass;
8650 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
8651 +
8652 +struct _RygelLMSPlugin {
8653 +       RygelMediaServerPlugin parent_instance;
8654 +       RygelLMSPluginPrivate * priv;
8655 +};
8656 +
8657 +struct _RygelLMSPluginClass {
8658 +       RygelMediaServerPluginClass parent_class;
8659 +};
8660 +
8661 +
8662 +static gpointer rygel_lms_plugin_parent_class = NULL;
8663 +static RygelLMSRootContainer* rygel_lms_plugin_root;
8664 +static RygelLMSRootContainer* rygel_lms_plugin_root = NULL;
8665 +
8666 +GType rygel_lms_plugin_get_type (void) G_GNUC_CONST;
8667 +enum  {
8668 +       RYGEL_LMS_PLUGIN_DUMMY_PROPERTY
8669 +};
8670 +GType rygel_lms_root_container_get_type (void) G_GNUC_CONST;
8671 +#define RYGEL_LMS_PLUGIN_NAME "LMS"
8672 +RygelLMSPlugin* rygel_lms_plugin_new (void);
8673 +RygelLMSPlugin* rygel_lms_plugin_construct (GType object_type);
8674 +RygelLMSRootContainer* rygel_lms_root_container_new (void);
8675 +RygelLMSRootContainer* rygel_lms_root_container_construct (GType object_type);
8676 +static void rygel_lms_plugin_finalize (GObject* obj);
8677 +
8678 +
8679 +RygelLMSPlugin* rygel_lms_plugin_construct (GType object_type) {
8680 +       RygelLMSPlugin * self = NULL;
8681 +       RygelLMSRootContainer* _tmp0_ = NULL;
8682 +       RygelLMSRootContainer* _tmp2_ = NULL;
8683 +       _tmp0_ = rygel_lms_plugin_root;
8684 +       if (_tmp0_ == NULL) {
8685 +               RygelLMSRootContainer* _tmp1_ = NULL;
8686 +               _tmp1_ = rygel_lms_root_container_new ();
8687 +               _g_object_unref0 (rygel_lms_plugin_root);
8688 +               rygel_lms_plugin_root = _tmp1_;
8689 +       }
8690 +       _tmp2_ = rygel_lms_plugin_root;
8691 +       self = (RygelLMSPlugin*) rygel_media_server_plugin_construct (object_type, (RygelMediaContainer*) _tmp2_, RYGEL_LMS_PLUGIN_NAME, NULL, RYGEL_PLUGIN_CAPABILITIES_TRACK_CHANGES);
8692 +       return self;
8693 +}
8694 +
8695 +
8696 +RygelLMSPlugin* rygel_lms_plugin_new (void) {
8697 +       return rygel_lms_plugin_construct (RYGEL_LMS_TYPE_PLUGIN);
8698 +}
8699 +
8700 +
8701 +static void rygel_lms_plugin_class_init (RygelLMSPluginClass * klass) {
8702 +       rygel_lms_plugin_parent_class = g_type_class_peek_parent (klass);
8703 +       G_OBJECT_CLASS (klass)->finalize = rygel_lms_plugin_finalize;
8704 +}
8705 +
8706 +
8707 +static void rygel_lms_plugin_instance_init (RygelLMSPlugin * self) {
8708 +}
8709 +
8710 +
8711 +static void rygel_lms_plugin_finalize (GObject* obj) {
8712 +       RygelLMSPlugin * self;
8713 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_PLUGIN, RygelLMSPlugin);
8714 +       G_OBJECT_CLASS (rygel_lms_plugin_parent_class)->finalize (obj);
8715 +}
8716 +
8717 +
8718 +GType rygel_lms_plugin_get_type (void) {
8719 +       static volatile gsize rygel_lms_plugin_type_id__volatile = 0;
8720 +       if (g_once_init_enter (&rygel_lms_plugin_type_id__volatile)) {
8721 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSPluginClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_plugin_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSPlugin), 0, (GInstanceInitFunc) rygel_lms_plugin_instance_init, NULL };
8722 +               GType rygel_lms_plugin_type_id;
8723 +               rygel_lms_plugin_type_id = g_type_register_static (RYGEL_TYPE_MEDIA_SERVER_PLUGIN, "RygelLMSPlugin", &g_define_type_info, 0);
8724 +               g_once_init_leave (&rygel_lms_plugin_type_id__volatile, rygel_lms_plugin_type_id);
8725 +       }
8726 +       return rygel_lms_plugin_type_id__volatile;
8727 +}
8728 +
8729 +
8730 +
8731 diff --git a/src/plugins/lms/rygel-lms-root-container.c b/src/plugins/lms/rygel-lms-root-container.c
8732 new file mode 100644
8733 index 0000000..625ed2f
8734 --- /dev/null
8735 +++ b/src/plugins/lms/rygel-lms-root-container.c
8736 @@ -0,0 +1,318 @@
8737 +/* rygel-lms-root-container.c generated by valac 0.28.0, the Vala compiler
8738 + * generated from rygel-lms-root-container.vala, do not modify */
8739 +
8740 +/*
8741 + * Copyright (C) 2013 Intel Corporation.
8742 + *
8743 + * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
8744 + *
8745 + * This file is part of Rygel.
8746 + *
8747 + * Rygel is free software; you can redistribute it and/or modify
8748 + * it under the terms of the GNU Lesser General Public License as published by
8749 + * the Free Software Foundation; either version 2 of the License, or
8750 + * (at your option) any later version.
8751 + *
8752 + * Rygel is distributed in the hope that it will be useful,
8753 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
8754 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
8755 + * GNU Lesser General Public License for more details.
8756 + *
8757 + * You should have received a copy of the GNU Lesser General Public License
8758 + * along with this program; if not, write to the Free Software Foundation,
8759 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
8760 + */
8761 +
8762 +#include <glib.h>
8763 +#include <glib-object.h>
8764 +#include <rygel-server.h>
8765 +#include <rygel-core.h>
8766 +#include <stdlib.h>
8767 +#include <string.h>
8768 +#include <glib/gi18n-lib.h>
8769 +
8770 +
8771 +#define RYGEL_LMS_TYPE_ROOT_CONTAINER (rygel_lms_root_container_get_type ())
8772 +#define RYGEL_LMS_ROOT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainer))
8773 +#define RYGEL_LMS_ROOT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainerClass))
8774 +#define RYGEL_LMS_IS_ROOT_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER))
8775 +#define RYGEL_LMS_IS_ROOT_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ROOT_CONTAINER))
8776 +#define RYGEL_LMS_ROOT_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainerClass))
8777 +
8778 +typedef struct _RygelLMSRootContainer RygelLMSRootContainer;
8779 +typedef struct _RygelLMSRootContainerClass RygelLMSRootContainerClass;
8780 +typedef struct _RygelLMSRootContainerPrivate RygelLMSRootContainerPrivate;
8781 +
8782 +#define RYGEL_LMS_TYPE_DATABASE (rygel_lms_database_get_type ())
8783 +#define RYGEL_LMS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabase))
8784 +#define RYGEL_LMS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
8785 +#define RYGEL_LMS_IS_DATABASE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_DATABASE))
8786 +#define RYGEL_LMS_IS_DATABASE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_DATABASE))
8787 +#define RYGEL_LMS_DATABASE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_DATABASE, RygelLMSDatabaseClass))
8788 +
8789 +typedef struct _RygelLMSDatabase RygelLMSDatabase;
8790 +typedef struct _RygelLMSDatabaseClass RygelLMSDatabaseClass;
8791 +#define _rygel_lms_database_unref0(var) ((var == NULL) ? NULL : (var = (rygel_lms_database_unref (var), NULL)))
8792 +#define _g_free0(var) (var = (g_free (var), NULL))
8793 +#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
8794 +#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
8795 +
8796 +#define RYGEL_LMS_TYPE_MUSIC_ROOT (rygel_lms_music_root_get_type ())
8797 +#define RYGEL_LMS_MUSIC_ROOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRoot))
8798 +#define RYGEL_LMS_MUSIC_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRootClass))
8799 +#define RYGEL_LMS_IS_MUSIC_ROOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT))
8800 +#define RYGEL_LMS_IS_MUSIC_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_MUSIC_ROOT))
8801 +#define RYGEL_LMS_MUSIC_ROOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_MUSIC_ROOT, RygelLMSMusicRootClass))
8802 +
8803 +typedef struct _RygelLMSMusicRoot RygelLMSMusicRoot;
8804 +typedef struct _RygelLMSMusicRootClass RygelLMSMusicRootClass;
8805 +
8806 +#define RYGEL_LMS_TYPE_CATEGORY_CONTAINER (rygel_lms_category_container_get_type ())
8807 +#define RYGEL_LMS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainer))
8808 +#define RYGEL_LMS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
8809 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
8810 +#define RYGEL_LMS_IS_CATEGORY_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_CATEGORY_CONTAINER))
8811 +#define RYGEL_LMS_CATEGORY_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_CATEGORY_CONTAINER, RygelLMSCategoryContainerClass))
8812 +
8813 +typedef struct _RygelLMSCategoryContainer RygelLMSCategoryContainer;
8814 +typedef struct _RygelLMSCategoryContainerClass RygelLMSCategoryContainerClass;
8815 +
8816 +#define RYGEL_LMS_TYPE_ALL_VIDEOS (rygel_lms_all_videos_get_type ())
8817 +#define RYGEL_LMS_ALL_VIDEOS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideos))
8818 +#define RYGEL_LMS_ALL_VIDEOS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideosClass))
8819 +#define RYGEL_LMS_IS_ALL_VIDEOS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS))
8820 +#define RYGEL_LMS_IS_ALL_VIDEOS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_ALL_VIDEOS))
8821 +#define RYGEL_LMS_ALL_VIDEOS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_ALL_VIDEOS, RygelLMSAllVideosClass))
8822 +
8823 +typedef struct _RygelLMSAllVideos RygelLMSAllVideos;
8824 +typedef struct _RygelLMSAllVideosClass RygelLMSAllVideosClass;
8825 +
8826 +#define RYGEL_LMS_TYPE_IMAGE_ROOT (rygel_lms_image_root_get_type ())
8827 +#define RYGEL_LMS_IMAGE_ROOT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRoot))
8828 +#define RYGEL_LMS_IMAGE_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRootClass))
8829 +#define RYGEL_LMS_IS_IMAGE_ROOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT))
8830 +#define RYGEL_LMS_IS_IMAGE_ROOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_IMAGE_ROOT))
8831 +#define RYGEL_LMS_IMAGE_ROOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_IMAGE_ROOT, RygelLMSImageRootClass))
8832 +
8833 +typedef struct _RygelLMSImageRoot RygelLMSImageRoot;
8834 +typedef struct _RygelLMSImageRootClass RygelLMSImageRootClass;
8835 +
8836 +struct _RygelLMSRootContainer {
8837 +       RygelSimpleContainer parent_instance;
8838 +       RygelLMSRootContainerPrivate * priv;
8839 +};
8840 +
8841 +struct _RygelLMSRootContainerClass {
8842 +       RygelSimpleContainerClass parent_class;
8843 +};
8844 +
8845 +struct _RygelLMSRootContainerPrivate {
8846 +       RygelLMSDatabase* lms_db;
8847 +};
8848 +
8849 +typedef enum  {
8850 +       RYGEL_LMS_DATABASE_ERROR_OPEN,
8851 +       RYGEL_LMS_DATABASE_ERROR_PREPARE,
8852 +       RYGEL_LMS_DATABASE_ERROR_BIND,
8853 +       RYGEL_LMS_DATABASE_ERROR_STEP,
8854 +       RYGEL_LMS_DATABASE_ERROR_NOT_FOUND
8855 +} RygelLMSDatabaseError;
8856 +#define RYGEL_LMS_DATABASE_ERROR rygel_lms_database_error_quark ()
8857 +
8858 +static gpointer rygel_lms_root_container_parent_class = NULL;
8859 +
8860 +GType rygel_lms_root_container_get_type (void) G_GNUC_CONST;
8861 +gpointer rygel_lms_database_ref (gpointer instance);
8862 +void rygel_lms_database_unref (gpointer instance);
8863 +GParamSpec* rygel_lms_param_spec_database (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
8864 +void rygel_lms_value_set_database (GValue* value, gpointer v_object);
8865 +void rygel_lms_value_take_database (GValue* value, gpointer v_object);
8866 +gpointer rygel_lms_value_get_database (const GValue* value);
8867 +GType rygel_lms_database_get_type (void) G_GNUC_CONST;
8868 +#define RYGEL_LMS_ROOT_CONTAINER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainerPrivate))
8869 +enum  {
8870 +       RYGEL_LMS_ROOT_CONTAINER_DUMMY_PROPERTY
8871 +};
8872 +RygelLMSRootContainer* rygel_lms_root_container_new (void);
8873 +RygelLMSRootContainer* rygel_lms_root_container_construct (GType object_type);
8874 +GQuark rygel_lms_database_error_quark (void);
8875 +RygelLMSDatabase* rygel_lms_database_new (GError** error);
8876 +RygelLMSDatabase* rygel_lms_database_construct (GType object_type, GError** error);
8877 +RygelLMSMusicRoot* rygel_lms_music_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8878 +RygelLMSMusicRoot* rygel_lms_music_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8879 +GType rygel_lms_music_root_get_type (void) G_GNUC_CONST;
8880 +RygelLMSAllVideos* rygel_lms_all_videos_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8881 +RygelLMSAllVideos* rygel_lms_all_videos_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8882 +GType rygel_lms_category_container_get_type (void) G_GNUC_CONST;
8883 +GType rygel_lms_all_videos_get_type (void) G_GNUC_CONST;
8884 +RygelLMSImageRoot* rygel_lms_image_root_new (const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8885 +RygelLMSImageRoot* rygel_lms_image_root_construct (GType object_type, const gchar* id, RygelMediaContainer* parent, const gchar* title, RygelLMSDatabase* lms_db);
8886 +GType rygel_lms_image_root_get_type (void) G_GNUC_CONST;
8887 +static void rygel_lms_root_container_finalize (GObject* obj);
8888 +
8889 +
8890 +RygelLMSRootContainer* rygel_lms_root_container_construct (GType object_type) {
8891 +       RygelLMSRootContainer * self = NULL;
8892 +       RygelMetaConfig* config = NULL;
8893 +       RygelMetaConfig* _tmp0_ = NULL;
8894 +       gchar* title = NULL;
8895 +       const gchar* _tmp1_ = NULL;
8896 +       gchar* _tmp2_ = NULL;
8897 +       const gchar* _tmp6_ = NULL;
8898 +       GError * _inner_error_ = NULL;
8899 +       _tmp0_ = rygel_meta_config_get_default ();
8900 +       config = _tmp0_;
8901 +       _tmp1_ = _ ("Shared media");
8902 +       _tmp2_ = g_strdup (_tmp1_);
8903 +       title = _tmp2_;
8904 +       {
8905 +               gchar* _tmp3_ = NULL;
8906 +               gchar* _tmp4_ = NULL;
8907 +               gchar* _tmp5_ = NULL;
8908 +               _tmp4_ = rygel_configuration_get_string ((RygelConfiguration*) config, "LightMediaScanner", "title", &_inner_error_);
8909 +               _tmp3_ = _tmp4_;
8910 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
8911 +                       goto __catch0_g_error;
8912 +               }
8913 +               _tmp5_ = _tmp3_;
8914 +               _tmp3_ = NULL;
8915 +               _g_free0 (title);
8916 +               title = _tmp5_;
8917 +               _g_free0 (_tmp3_);
8918 +       }
8919 +       goto __finally0;
8920 +       __catch0_g_error:
8921 +       {
8922 +               GError* _error_ = NULL;
8923 +               _error_ = _inner_error_;
8924 +               _inner_error_ = NULL;
8925 +               _g_error_free0 (_error_);
8926 +       }
8927 +       __finally0:
8928 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
8929 +               _g_free0 (title);
8930 +               _g_object_unref0 (config);
8931 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
8932 +               g_clear_error (&_inner_error_);
8933 +               return NULL;
8934 +       }
8935 +       _tmp6_ = title;
8936 +       self = (RygelLMSRootContainer*) rygel_simple_container_construct_root (object_type, _tmp6_);
8937 +       {
8938 +               RygelLMSDatabase* _tmp7_ = NULL;
8939 +               RygelLMSDatabase* _tmp8_ = NULL;
8940 +               RygelLMSDatabase* _tmp9_ = NULL;
8941 +               const gchar* _tmp10_ = NULL;
8942 +               RygelLMSDatabase* _tmp11_ = NULL;
8943 +               RygelLMSMusicRoot* _tmp12_ = NULL;
8944 +               RygelLMSMusicRoot* _tmp13_ = NULL;
8945 +               const gchar* _tmp14_ = NULL;
8946 +               RygelLMSDatabase* _tmp15_ = NULL;
8947 +               RygelLMSAllVideos* _tmp16_ = NULL;
8948 +               RygelLMSAllVideos* _tmp17_ = NULL;
8949 +               const gchar* _tmp18_ = NULL;
8950 +               RygelLMSDatabase* _tmp19_ = NULL;
8951 +               RygelLMSImageRoot* _tmp20_ = NULL;
8952 +               RygelLMSImageRoot* _tmp21_ = NULL;
8953 +               _tmp8_ = rygel_lms_database_new (&_inner_error_);
8954 +               _tmp7_ = _tmp8_;
8955 +               if (G_UNLIKELY (_inner_error_ != NULL)) {
8956 +                       if (_inner_error_->domain == RYGEL_LMS_DATABASE_ERROR) {
8957 +                               goto __catch1_rygel_lms_database_error;
8958 +                       }
8959 +                       _g_free0 (title);
8960 +                       _g_object_unref0 (config);
8961 +                       g_critical ("file %s: line %d: unexpected error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
8962 +                       g_clear_error (&_inner_error_);
8963 +                       return NULL;
8964 +               }
8965 +               _tmp9_ = _tmp7_;
8966 +               _tmp7_ = NULL;
8967 +               _rygel_lms_database_unref0 (self->priv->lms_db);
8968 +               self->priv->lms_db = _tmp9_;
8969 +               _tmp10_ = _ ("Music");
8970 +               _tmp11_ = self->priv->lms_db;
8971 +               _tmp12_ = rygel_lms_music_root_new ("music", (RygelMediaContainer*) self, _tmp10_, _tmp11_);
8972 +               _tmp13_ = _tmp12_;
8973 +               rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp13_);
8974 +               _g_object_unref0 (_tmp13_);
8975 +               _tmp14_ = _ ("Videos");
8976 +               _tmp15_ = self->priv->lms_db;
8977 +               _tmp16_ = rygel_lms_all_videos_new ("all-videos", (RygelMediaContainer*) self, _tmp14_, _tmp15_);
8978 +               _tmp17_ = _tmp16_;
8979 +               rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp17_);
8980 +               _g_object_unref0 (_tmp17_);
8981 +               _tmp18_ = _ ("Pictures");
8982 +               _tmp19_ = self->priv->lms_db;
8983 +               _tmp20_ = rygel_lms_image_root_new ("images", (RygelMediaContainer*) self, _tmp18_, _tmp19_);
8984 +               _tmp21_ = _tmp20_;
8985 +               rygel_simple_container_add_child_container ((RygelSimpleContainer*) self, (RygelMediaContainer*) _tmp21_);
8986 +               _g_object_unref0 (_tmp21_);
8987 +               _rygel_lms_database_unref0 (_tmp7_);
8988 +       }
8989 +       goto __finally1;
8990 +       __catch1_rygel_lms_database_error:
8991 +       {
8992 +               GError* e = NULL;
8993 +               GError* _tmp22_ = NULL;
8994 +               const gchar* _tmp23_ = NULL;
8995 +               e = _inner_error_;
8996 +               _inner_error_ = NULL;
8997 +               _tmp22_ = e;
8998 +               _tmp23_ = _tmp22_->message;
8999 +               g_warning ("rygel-lms-root-container.vala:49: %s\n", _tmp23_);
9000 +               _g_error_free0 (e);
9001 +       }
9002 +       __finally1:
9003 +       if (G_UNLIKELY (_inner_error_ != NULL)) {
9004 +               _g_free0 (title);
9005 +               _g_object_unref0 (config);
9006 +               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
9007 +               g_clear_error (&_inner_error_);
9008 +               return NULL;
9009 +       }
9010 +       _g_free0 (title);
9011 +       _g_object_unref0 (config);
9012 +       return self;
9013 +}
9014 +
9015 +
9016 +RygelLMSRootContainer* rygel_lms_root_container_new (void) {
9017 +       return rygel_lms_root_container_construct (RYGEL_LMS_TYPE_ROOT_CONTAINER);
9018 +}
9019 +
9020 +
9021 +static void rygel_lms_root_container_class_init (RygelLMSRootContainerClass * klass) {
9022 +       rygel_lms_root_container_parent_class = g_type_class_peek_parent (klass);
9023 +       g_type_class_add_private (klass, sizeof (RygelLMSRootContainerPrivate));
9024 +       G_OBJECT_CLASS (klass)->finalize = rygel_lms_root_container_finalize;
9025 +}
9026 +
9027 +
9028 +static void rygel_lms_root_container_instance_init (RygelLMSRootContainer * self) {
9029 +       self->priv = RYGEL_LMS_ROOT_CONTAINER_GET_PRIVATE (self);
9030 +       self->priv->lms_db = NULL;
9031 +}
9032 +
9033 +
9034 +static void rygel_lms_root_container_finalize (GObject* obj) {
9035 +       RygelLMSRootContainer * self;
9036 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_ROOT_CONTAINER, RygelLMSRootContainer);
9037 +       _rygel_lms_database_unref0 (self->priv->lms_db);
9038 +       G_OBJECT_CLASS (rygel_lms_root_container_parent_class)->finalize (obj);
9039 +}
9040 +
9041 +
9042 +GType rygel_lms_root_container_get_type (void) {
9043 +       static volatile gsize rygel_lms_root_container_type_id__volatile = 0;
9044 +       if (g_once_init_enter (&rygel_lms_root_container_type_id__volatile)) {
9045 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSRootContainerClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_root_container_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSRootContainer), 0, (GInstanceInitFunc) rygel_lms_root_container_instance_init, NULL };
9046 +               GType rygel_lms_root_container_type_id;
9047 +               rygel_lms_root_container_type_id = g_type_register_static (RYGEL_TYPE_SIMPLE_CONTAINER, "RygelLMSRootContainer", &g_define_type_info, 0);
9048 +               g_once_init_leave (&rygel_lms_root_container_type_id__volatile, rygel_lms_root_container_type_id);
9049 +       }
9050 +       return rygel_lms_root_container_type_id__volatile;
9051 +}
9052 +
9053 +
9054 +
9055 diff --git a/src/plugins/lms/rygel-lms-sql-function.c b/src/plugins/lms/rygel-lms-sql-function.c
9056 new file mode 100644
9057 index 0000000..a56c7be
9058 --- /dev/null
9059 +++ b/src/plugins/lms/rygel-lms-sql-function.c
9060 @@ -0,0 +1,146 @@
9061 +/* rygel-lms-sql-function.c generated by valac 0.28.0, the Vala compiler
9062 + * generated from rygel-lms-sql-function.vala, do not modify */
9063 +
9064 +/*
9065 + * Copyright (C) 2010 Jens Georg <mail@jensge.org>.
9066 + *
9067 + * Author: Jens Georg <mail@jensge.org>
9068 + *
9069 + * This file is part of Rygel.
9070 + *
9071 + * Rygel is free software; you can redistribute it and/or modify
9072 + * it under the terms of the GNU Lesser General Public License as published by
9073 + * the Free Software Foundation; either version 2 of the License, or
9074 + * (at your option) any later version.
9075 + *
9076 + * Rygel is distributed in the hope that it will be useful,
9077 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
9078 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9079 + * GNU Lesser General Public License for more details.
9080 + *
9081 + * You should have received a copy of the GNU Lesser General Public License
9082 + * along with this program; if not, write to the Free Software Foundation,
9083 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
9084 + */
9085 +
9086 +#include <glib.h>
9087 +#include <glib-object.h>
9088 +#include <stdlib.h>
9089 +#include <string.h>
9090 +
9091 +
9092 +#define RYGEL_LMS_TYPE_SQL_OPERATOR (rygel_lms_sql_operator_get_type ())
9093 +#define RYGEL_LMS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperator))
9094 +#define RYGEL_LMS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
9095 +#define RYGEL_LMS_IS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR))
9096 +#define RYGEL_LMS_IS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR))
9097 +#define RYGEL_LMS_SQL_OPERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
9098 +
9099 +typedef struct _RygelLMSSqlOperator RygelLMSSqlOperator;
9100 +typedef struct _RygelLMSSqlOperatorClass RygelLMSSqlOperatorClass;
9101 +typedef struct _RygelLMSSqlOperatorPrivate RygelLMSSqlOperatorPrivate;
9102 +
9103 +#define RYGEL_LMS_TYPE_SQL_FUNCTION (rygel_lms_sql_function_get_type ())
9104 +#define RYGEL_LMS_SQL_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunction))
9105 +#define RYGEL_LMS_SQL_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunctionClass))
9106 +#define RYGEL_LMS_IS_SQL_FUNCTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION))
9107 +#define RYGEL_LMS_IS_SQL_FUNCTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_SQL_FUNCTION))
9108 +#define RYGEL_LMS_SQL_FUNCTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_SQL_FUNCTION, RygelLMSSqlFunctionClass))
9109 +
9110 +typedef struct _RygelLMSSqlFunction RygelLMSSqlFunction;
9111 +typedef struct _RygelLMSSqlFunctionClass RygelLMSSqlFunctionClass;
9112 +typedef struct _RygelLMSSqlFunctionPrivate RygelLMSSqlFunctionPrivate;
9113 +
9114 +struct _RygelLMSSqlOperator {
9115 +       GObject parent_instance;
9116 +       RygelLMSSqlOperatorPrivate * priv;
9117 +       gchar* name;
9118 +       gchar* arg;
9119 +       gchar* collate;
9120 +};
9121 +
9122 +struct _RygelLMSSqlOperatorClass {
9123 +       GObjectClass parent_class;
9124 +       gchar* (*to_string) (RygelLMSSqlOperator* self);
9125 +};
9126 +
9127 +struct _RygelLMSSqlFunction {
9128 +       RygelLMSSqlOperator parent_instance;
9129 +       RygelLMSSqlFunctionPrivate * priv;
9130 +};
9131 +
9132 +struct _RygelLMSSqlFunctionClass {
9133 +       RygelLMSSqlOperatorClass parent_class;
9134 +};
9135 +
9136 +
9137 +static gpointer rygel_lms_sql_function_parent_class = NULL;
9138 +
9139 +GType rygel_lms_sql_operator_get_type (void) G_GNUC_CONST;
9140 +GType rygel_lms_sql_function_get_type (void) G_GNUC_CONST;
9141 +enum  {
9142 +       RYGEL_LMS_SQL_FUNCTION_DUMMY_PROPERTY
9143 +};
9144 +RygelLMSSqlFunction* rygel_lms_sql_function_new (const gchar* name, const gchar* arg);
9145 +RygelLMSSqlFunction* rygel_lms_sql_function_construct (GType object_type, const gchar* name, const gchar* arg);
9146 +RygelLMSSqlOperator* rygel_lms_sql_operator_new (const gchar* name, const gchar* arg, const gchar* collate);
9147 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct (GType object_type, const gchar* name, const gchar* arg, const gchar* collate);
9148 +static gchar* rygel_lms_sql_function_real_to_string (RygelLMSSqlOperator* base);
9149 +
9150 +
9151 +RygelLMSSqlFunction* rygel_lms_sql_function_construct (GType object_type, const gchar* name, const gchar* arg) {
9152 +       RygelLMSSqlFunction * self = NULL;
9153 +       const gchar* _tmp0_ = NULL;
9154 +       const gchar* _tmp1_ = NULL;
9155 +       g_return_val_if_fail (name != NULL, NULL);
9156 +       g_return_val_if_fail (arg != NULL, NULL);
9157 +       _tmp0_ = name;
9158 +       _tmp1_ = arg;
9159 +       self = (RygelLMSSqlFunction*) rygel_lms_sql_operator_construct (object_type, _tmp0_, _tmp1_, "");
9160 +       return self;
9161 +}
9162 +
9163 +
9164 +RygelLMSSqlFunction* rygel_lms_sql_function_new (const gchar* name, const gchar* arg) {
9165 +       return rygel_lms_sql_function_construct (RYGEL_LMS_TYPE_SQL_FUNCTION, name, arg);
9166 +}
9167 +
9168 +
9169 +static gchar* rygel_lms_sql_function_real_to_string (RygelLMSSqlOperator* base) {
9170 +       RygelLMSSqlFunction * self;
9171 +       gchar* result = NULL;
9172 +       const gchar* _tmp0_ = NULL;
9173 +       const gchar* _tmp1_ = NULL;
9174 +       gchar* _tmp2_ = NULL;
9175 +       self = (RygelLMSSqlFunction*) base;
9176 +       _tmp0_ = ((RygelLMSSqlOperator*) self)->name;
9177 +       _tmp1_ = ((RygelLMSSqlOperator*) self)->arg;
9178 +       _tmp2_ = g_strdup_printf ("%s(%s,?)", _tmp0_, _tmp1_);
9179 +       result = _tmp2_;
9180 +       return result;
9181 +}
9182 +
9183 +
9184 +static void rygel_lms_sql_function_class_init (RygelLMSSqlFunctionClass * klass) {
9185 +       rygel_lms_sql_function_parent_class = g_type_class_peek_parent (klass);
9186 +       ((RygelLMSSqlOperatorClass *) klass)->to_string = rygel_lms_sql_function_real_to_string;
9187 +}
9188 +
9189 +
9190 +static void rygel_lms_sql_function_instance_init (RygelLMSSqlFunction * self) {
9191 +}
9192 +
9193 +
9194 +GType rygel_lms_sql_function_get_type (void) {
9195 +       static volatile gsize rygel_lms_sql_function_type_id__volatile = 0;
9196 +       if (g_once_init_enter (&rygel_lms_sql_function_type_id__volatile)) {
9197 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSSqlFunctionClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_sql_function_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSSqlFunction), 0, (GInstanceInitFunc) rygel_lms_sql_function_instance_init, NULL };
9198 +               GType rygel_lms_sql_function_type_id;
9199 +               rygel_lms_sql_function_type_id = g_type_register_static (RYGEL_LMS_TYPE_SQL_OPERATOR, "RygelLMSSqlFunction", &g_define_type_info, 0);
9200 +               g_once_init_leave (&rygel_lms_sql_function_type_id__volatile, rygel_lms_sql_function_type_id);
9201 +       }
9202 +       return rygel_lms_sql_function_type_id__volatile;
9203 +}
9204 +
9205 +
9206 +
9207 diff --git a/src/plugins/lms/rygel-lms-sql-operator.c b/src/plugins/lms/rygel-lms-sql-operator.c
9208 new file mode 100644
9209 index 0000000..90db1a9
9210 --- /dev/null
9211 +++ b/src/plugins/lms/rygel-lms-sql-operator.c
9212 @@ -0,0 +1,240 @@
9213 +/* rygel-lms-sql-operator.c generated by valac 0.28.0, the Vala compiler
9214 + * generated from rygel-lms-sql-operator.vala, do not modify */
9215 +
9216 +/*
9217 + * Copyright (C) 2010 Jens Georg <mail@jensge.org>.
9218 + *
9219 + * Author: Jens Georg <mail@jensge.org>
9220 + *
9221 + * This file is part of Rygel.
9222 + *
9223 + * Rygel is free software; you can redistribute it and/or modify
9224 + * it under the terms of the GNU Lesser General Public License as published by
9225 + * the Free Software Foundation; either version 2 of the License, or
9226 + * (at your option) any later version.
9227 + *
9228 + * Rygel is distributed in the hope that it will be useful,
9229 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
9230 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9231 + * GNU Lesser General Public License for more details.
9232 + *
9233 + * You should have received a copy of the GNU Lesser General Public License
9234 + * along with this program; if not, write to the Free Software Foundation,
9235 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
9236 + */
9237 +
9238 +#include <glib.h>
9239 +#include <glib-object.h>
9240 +#include <stdlib.h>
9241 +#include <string.h>
9242 +#include <libgupnp-av/gupnp-av.h>
9243 +
9244 +
9245 +#define RYGEL_LMS_TYPE_SQL_OPERATOR (rygel_lms_sql_operator_get_type ())
9246 +#define RYGEL_LMS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperator))
9247 +#define RYGEL_LMS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
9248 +#define RYGEL_LMS_IS_SQL_OPERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR))
9249 +#define RYGEL_LMS_IS_SQL_OPERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), RYGEL_LMS_TYPE_SQL_OPERATOR))
9250 +#define RYGEL_LMS_SQL_OPERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperatorClass))
9251 +
9252 +typedef struct _RygelLMSSqlOperator RygelLMSSqlOperator;
9253 +typedef struct _RygelLMSSqlOperatorClass RygelLMSSqlOperatorClass;
9254 +typedef struct _RygelLMSSqlOperatorPrivate RygelLMSSqlOperatorPrivate;
9255 +#define _g_free0(var) (var = (g_free (var), NULL))
9256 +
9257 +struct _RygelLMSSqlOperator {
9258 +       GObject parent_instance;
9259 +       RygelLMSSqlOperatorPrivate * priv;
9260 +       gchar* name;
9261 +       gchar* arg;
9262 +       gchar* collate;
9263 +};
9264 +
9265 +struct _RygelLMSSqlOperatorClass {
9266 +       GObjectClass parent_class;
9267 +       gchar* (*to_string) (RygelLMSSqlOperator* self);
9268 +};
9269 +
9270 +
9271 +static gpointer rygel_lms_sql_operator_parent_class = NULL;
9272 +
9273 +GType rygel_lms_sql_operator_get_type (void) G_GNUC_CONST;
9274 +enum  {
9275 +       RYGEL_LMS_SQL_OPERATOR_DUMMY_PROPERTY
9276 +};
9277 +RygelLMSSqlOperator* rygel_lms_sql_operator_new (const gchar* name, const gchar* arg, const gchar* collate);
9278 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct (GType object_type, const gchar* name, const gchar* arg, const gchar* collate);
9279 +RygelLMSSqlOperator* rygel_lms_sql_operator_new_from_search_criteria_op (GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate);
9280 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct_from_search_criteria_op (GType object_type, GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate);
9281 +gchar* rygel_lms_sql_operator_to_string (RygelLMSSqlOperator* self);
9282 +static gchar* rygel_lms_sql_operator_real_to_string (RygelLMSSqlOperator* self);
9283 +static void rygel_lms_sql_operator_finalize (GObject* obj);
9284 +
9285 +
9286 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct (GType object_type, const gchar* name, const gchar* arg, const gchar* collate) {
9287 +       RygelLMSSqlOperator * self = NULL;
9288 +       const gchar* _tmp0_ = NULL;
9289 +       gchar* _tmp1_ = NULL;
9290 +       const gchar* _tmp2_ = NULL;
9291 +       gchar* _tmp3_ = NULL;
9292 +       const gchar* _tmp4_ = NULL;
9293 +       gchar* _tmp5_ = NULL;
9294 +       g_return_val_if_fail (name != NULL, NULL);
9295 +       g_return_val_if_fail (arg != NULL, NULL);
9296 +       g_return_val_if_fail (collate != NULL, NULL);
9297 +       self = (RygelLMSSqlOperator*) g_object_new (object_type, NULL);
9298 +       _tmp0_ = name;
9299 +       _tmp1_ = g_strdup (_tmp0_);
9300 +       _g_free0 (self->name);
9301 +       self->name = _tmp1_;
9302 +       _tmp2_ = arg;
9303 +       _tmp3_ = g_strdup (_tmp2_);
9304 +       _g_free0 (self->arg);
9305 +       self->arg = _tmp3_;
9306 +       _tmp4_ = collate;
9307 +       _tmp5_ = g_strdup (_tmp4_);
9308 +       _g_free0 (self->collate);
9309 +       self->collate = _tmp5_;
9310 +       return self;
9311 +}
9312 +
9313 +
9314 +RygelLMSSqlOperator* rygel_lms_sql_operator_new (const gchar* name, const gchar* arg, const gchar* collate) {
9315 +       return rygel_lms_sql_operator_construct (RYGEL_LMS_TYPE_SQL_OPERATOR, name, arg, collate);
9316 +}
9317 +
9318 +
9319 +RygelLMSSqlOperator* rygel_lms_sql_operator_construct_from_search_criteria_op (GType object_type, GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate) {
9320 +       RygelLMSSqlOperator * self = NULL;
9321 +       gchar* sql = NULL;
9322 +       GUPnPSearchCriteriaOp _tmp0_ = 0;
9323 +       const gchar* _tmp7_ = NULL;
9324 +       const gchar* _tmp8_ = NULL;
9325 +       const gchar* _tmp9_ = NULL;
9326 +       g_return_val_if_fail (arg != NULL, NULL);
9327 +       g_return_val_if_fail (collate != NULL, NULL);
9328 +       sql = NULL;
9329 +       _tmp0_ = op;
9330 +       switch (_tmp0_) {
9331 +               case GUPNP_SEARCH_CRITERIA_OP_EQ:
9332 +               {
9333 +                       gchar* _tmp1_ = NULL;
9334 +                       _tmp1_ = g_strdup ("=");
9335 +                       _g_free0 (sql);
9336 +                       sql = _tmp1_;
9337 +                       break;
9338 +               }
9339 +               case GUPNP_SEARCH_CRITERIA_OP_NEQ:
9340 +               {
9341 +                       gchar* _tmp2_ = NULL;
9342 +                       _tmp2_ = g_strdup ("!=");
9343 +                       _g_free0 (sql);
9344 +                       sql = _tmp2_;
9345 +                       break;
9346 +               }
9347 +               case GUPNP_SEARCH_CRITERIA_OP_LESS:
9348 +               {
9349 +                       gchar* _tmp3_ = NULL;
9350 +                       _tmp3_ = g_strdup ("<");
9351 +                       _g_free0 (sql);
9352 +                       sql = _tmp3_;
9353 +                       break;
9354 +               }
9355 +               case GUPNP_SEARCH_CRITERIA_OP_LEQ:
9356 +               {
9357 +                       gchar* _tmp4_ = NULL;
9358 +                       _tmp4_ = g_strdup ("<=");
9359 +                       _g_free0 (sql);
9360 +                       sql = _tmp4_;
9361 +                       break;
9362 +               }
9363 +               case GUPNP_SEARCH_CRITERIA_OP_GREATER:
9364 +               {
9365 +                       gchar* _tmp5_ = NULL;
9366 +                       _tmp5_ = g_strdup (">");
9367 +                       _g_free0 (sql);
9368 +                       sql = _tmp5_;
9369 +                       break;
9370 +               }
9371 +               case GUPNP_SEARCH_CRITERIA_OP_GEQ:
9372 +               {
9373 +                       gchar* _tmp6_ = NULL;
9374 +                       _tmp6_ = g_strdup (">=");
9375 +                       _g_free0 (sql);
9376 +                       sql = _tmp6_;
9377 +                       break;
9378 +               }
9379 +               default:
9380 +               {
9381 +                       g_assert_not_reached ();
9382 +               }
9383 +       }
9384 +       _tmp7_ = sql;
9385 +       _tmp8_ = arg;
9386 +       _tmp9_ = collate;
9387 +       self = (RygelLMSSqlOperator*) rygel_lms_sql_operator_construct (object_type, _tmp7_, _tmp8_, _tmp9_);
9388 +       _g_free0 (sql);
9389 +       return self;
9390 +}
9391 +
9392 +
9393 +RygelLMSSqlOperator* rygel_lms_sql_operator_new_from_search_criteria_op (GUPnPSearchCriteriaOp op, const gchar* arg, const gchar* collate) {
9394 +       return rygel_lms_sql_operator_construct_from_search_criteria_op (RYGEL_LMS_TYPE_SQL_OPERATOR, op, arg, collate);
9395 +}
9396 +
9397 +
9398 +static gchar* rygel_lms_sql_operator_real_to_string (RygelLMSSqlOperator* self) {
9399 +       gchar* result = NULL;
9400 +       const gchar* _tmp0_ = NULL;
9401 +       const gchar* _tmp1_ = NULL;
9402 +       const gchar* _tmp2_ = NULL;
9403 +       gchar* _tmp3_ = NULL;
9404 +       _tmp0_ = self->arg;
9405 +       _tmp1_ = self->name;
9406 +       _tmp2_ = self->collate;
9407 +       _tmp3_ = g_strdup_printf ("(%s %s ? %s)", _tmp0_, _tmp1_, _tmp2_);
9408 +       result = _tmp3_;
9409 +       return result;
9410 +}
9411 +
9412 +
9413 +gchar* rygel_lms_sql_operator_to_string (RygelLMSSqlOperator* self) {
9414 +       g_return_val_if_fail (self != NULL, NULL);
9415 +       return RYGEL_LMS_SQL_OPERATOR_GET_CLASS (self)->to_string (self);
9416 +}
9417 +
9418 +
9419 +static void rygel_lms_sql_operator_class_init (RygelLMSSqlOperatorClass * klass) {
9420 +       rygel_lms_sql_operator_parent_class = g_type_class_peek_parent (klass);
9421 +       ((RygelLMSSqlOperatorClass *) klass)->to_string = rygel_lms_sql_operator_real_to_string;
9422 +       G_OBJECT_CLASS (klass)->finalize = rygel_lms_sql_operator_finalize;
9423 +}
9424 +
9425 +
9426 +static void rygel_lms_sql_operator_instance_init (RygelLMSSqlOperator * self) {
9427 +}
9428 +
9429 +
9430 +static void rygel_lms_sql_operator_finalize (GObject* obj) {
9431 +       RygelLMSSqlOperator * self;
9432 +       self = G_TYPE_CHECK_INSTANCE_CAST (obj, RYGEL_LMS_TYPE_SQL_OPERATOR, RygelLMSSqlOperator);
9433 +       _g_free0 (self->name);
9434 +       _g_free0 (self->arg);
9435 +       _g_free0 (self->collate);
9436 +       G_OBJECT_CLASS (rygel_lms_sql_operator_parent_class)->finalize (obj);
9437 +}
9438 +
9439 +
9440 +GType rygel_lms_sql_operator_get_type (void) {
9441 +       static volatile gsize rygel_lms_sql_operator_type_id__volatile = 0;
9442 +       if (g_once_init_enter (&rygel_lms_sql_operator_type_id__volatile)) {
9443 +               static const GTypeInfo g_define_type_info = { sizeof (RygelLMSSqlOperatorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) rygel_lms_sql_operator_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (RygelLMSSqlOperator), 0, (GInstanceInitFunc) rygel_lms_sql_operator_instance_init, NULL };
9444 +               GType rygel_lms_sql_operator_type_id;
9445 +               rygel_lms_sql_operator_type_id = g_type_register_static (G_TYPE_OBJECT, "RygelLMSSqlOperator", &g_define_type_info, 0);
9446 +               g_once_init_leave (&rygel_lms_sql_operator_type_id__volatile, rygel_lms_sql_operator_type_id);
9447 +       }
9448 +       return rygel_lms_sql_operator_type_id__volatile;
9449 +}
9450 +
9451 +
9452 +
9453 -- 
9454 1.8.3.1
9455