1 /*
2  * Copyright (C) 2012 W. Michael Petullo.
3  *
4  * Contact: W. Michael Petullo <mike@flyn.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public License
8  * as published by the Free Software Foundation; version 2.1 of
9  * the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19  * 02110-1301 USA
20  *
21  */
22 
23 #include <grilo.h>
24 #include <libdmapsharing/dmap.h>
25 
26 #include "grl-daap-compat.h"
27 #include "grl-common.h"
28 #include "grl-daap-record.h"
29 
30 struct GrlDaapRecordPrivate {
31   guint64 filesize;
32   char *location;
33   char *format;
34   gint mediakind;
35   char *title;
36   char *album;
37   char *sort_album;
38   char *artist;
39   char *sort_artist;
40   char *genre;
41   gboolean has_video;
42   gint rating;
43   gint32 duration;
44   gint32 track;
45   gint32 year;
46   gint32 firstseen;
47   gint32 mtime;
48   gint32 disc;
49   gint32 bitrate;
50 };
51 
52 enum {
53   PROP_0,
54   PROP_LOCATION,
55   PROP_TITLE,
56   PROP_RATING,
57   PROP_FILESIZE,
58   PROP_ALBUM,
59   PROP_SORT_ALBUM,
60   PROP_ARTIST,
61   PROP_SORT_ARTIST,
62   PROP_GENRE,
63   PROP_FORMAT,
64   PROP_MEDIAKIND,
65   PROP_DURATION,
66   PROP_TRACK,
67   PROP_YEAR,
68   PROP_FIRSTSEEN,
69   PROP_MTIME,
70   PROP_DISC,
71   PROP_BITRATE,
72   PROP_HAS_VIDEO
73 };
74 
75 static void
grl_daap_record_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)76 grl_daap_record_set_property (GObject *object,
77                               guint prop_id,
78                               const GValue *value,
79                               GParamSpec *pspec)
80 {
81   GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
82 
83   switch (prop_id) {
84   case PROP_LOCATION:
85     g_free (record->priv->location);
86     record->priv->location = g_value_dup_string (value);
87     break;
88   case PROP_TITLE:
89     g_free (record->priv->title);
90     record->priv->title = g_value_dup_string (value);
91     break;
92   case PROP_ALBUM:
93     g_free (record->priv->album);
94     record->priv->album = g_value_dup_string (value);
95     break;
96   case PROP_SORT_ALBUM:
97     g_free (record->priv->sort_album);
98     record->priv->sort_album = g_value_dup_string (value);
99     break;
100   case PROP_ARTIST:
101     g_free (record->priv->artist);
102     record->priv->artist = g_value_dup_string (value);
103     break;
104   case PROP_SORT_ARTIST:
105     g_free (record->priv->sort_artist);
106     record->priv->sort_artist = g_value_dup_string (value);
107     break;
108   case PROP_GENRE:
109     g_free (record->priv->genre);
110     record->priv->genre = g_value_dup_string (value);
111     break;
112   case PROP_FORMAT:
113     g_free (record->priv->format);
114     record->priv->format = g_value_dup_string (value);
115     break;
116   case PROP_MEDIAKIND:
117     record->priv->mediakind = g_value_get_enum (value);
118     break;
119   case PROP_RATING:
120     record->priv->rating = g_value_get_int (value);
121     break;
122   case PROP_FILESIZE:
123     record->priv->filesize = g_value_get_uint64 (value);
124     break;
125   case PROP_DURATION:
126     record->priv->duration = g_value_get_int (value);
127     break;
128   case PROP_TRACK:
129     record->priv->track = g_value_get_int (value);
130     break;
131   case PROP_YEAR:
132     record->priv->year = g_value_get_int (value);
133     break;
134   case PROP_FIRSTSEEN:
135     record->priv->firstseen = g_value_get_int (value);
136     break;
137   case PROP_MTIME:
138     record->priv->mtime = g_value_get_int (value);
139     break;
140   case PROP_DISC:
141     record->priv->disc = g_value_get_int (value);
142     break;
143   case PROP_BITRATE:
144     record->priv->bitrate = g_value_get_int (value);
145     break;
146   case PROP_HAS_VIDEO:
147     record->priv->has_video = g_value_get_boolean (value);
148     break;
149   default:
150     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
151     break;
152   }
153 }
154 
155 static void
grl_daap_record_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)156 grl_daap_record_get_property (GObject *object,
157                               guint prop_id,
158                               GValue *value,
159                               GParamSpec *pspec)
160 {
161   GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
162 
163   switch (prop_id) {
164   case PROP_LOCATION:
165     g_value_set_static_string (value, record->priv->location);
166     break;
167   case PROP_TITLE:
168     g_value_set_static_string (value, record->priv->title);
169     break;
170   case PROP_ALBUM:
171     g_value_set_static_string (value, record->priv->album);
172     break;
173   case PROP_SORT_ALBUM:
174     g_value_set_static_string (value, record->priv->sort_album);
175     break;
176   case PROP_ARTIST:
177     g_value_set_static_string (value, record->priv->artist);
178     break;
179   case PROP_SORT_ARTIST:
180     g_value_set_static_string (value, record->priv->sort_artist);
181     break;
182   case PROP_GENRE:
183     g_value_set_static_string (value, record->priv->genre);
184     break;
185   case PROP_FORMAT:
186     g_value_set_static_string (value, record->priv->format);
187     break;
188   case PROP_MEDIAKIND:
189     g_value_set_enum (value, record->priv->mediakind);
190     break;
191   case PROP_RATING:
192     g_value_set_int (value, record->priv->rating);
193     break;
194   case PROP_FILESIZE:
195     g_value_set_uint64 (value, record->priv->filesize);
196     break;
197   case PROP_DURATION:
198     g_value_set_int (value, record->priv->duration);
199     break;
200   case PROP_TRACK:
201     g_value_set_int (value, record->priv->track);
202     break;
203   case PROP_YEAR:
204     g_value_set_int (value, record->priv->year);
205     break;
206   case PROP_FIRSTSEEN:
207     g_value_set_int (value, record->priv->firstseen);
208     break;
209   case PROP_MTIME:
210     g_value_set_int (value, record->priv->mtime);
211     break;
212   case PROP_DISC:
213     g_value_set_int (value, record->priv->disc);
214     break;
215   case PROP_BITRATE:
216     g_value_set_int (value, record->priv->bitrate);
217     break;
218   case PROP_HAS_VIDEO:
219     g_value_set_boolean (value, record->priv->has_video);
220     break;
221   default:
222     G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
223     break;
224   }
225 }
226 
227 GrlDaapRecord *
grl_daap_record_new(void)228 grl_daap_record_new (void)
229 {
230   return SIMPLE_DAAP_RECORD (g_object_new (TYPE_SIMPLE_DAAP_RECORD, NULL));
231 }
232 
233 GInputStream *
grl_daap_record_read(DmapAvRecord * record,GError ** error)234 grl_daap_record_read (DmapAvRecord *record, GError **error)
235 {
236   GFile *file;
237   GInputStream *stream;
238 
239   file = g_file_new_for_uri (SIMPLE_DAAP_RECORD (record)->priv->location);
240   stream = G_INPUT_STREAM (g_file_read (file, NULL, error));
241 
242   g_object_unref (file);
243 
244   return stream;
245 }
246 
247 static void
grl_daap_record_init(GrlDaapRecord * record)248 grl_daap_record_init (GrlDaapRecord *record)
249 {
250   record->priv = SIMPLE_DAAP_RECORD_GET_PRIVATE (record);
251 }
252 
253 static void grl_daap_record_finalize (GObject *object);
254 
255 static void
grl_daap_record_class_init(GrlDaapRecordClass * klass)256 grl_daap_record_class_init (GrlDaapRecordClass *klass)
257 {
258   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
259 
260   gobject_class->set_property = grl_daap_record_set_property;
261   gobject_class->get_property = grl_daap_record_get_property;
262   gobject_class->finalize     = grl_daap_record_finalize;
263 
264   g_object_class_override_property (gobject_class, PROP_LOCATION, "location");
265   g_object_class_override_property (gobject_class, PROP_TITLE, "title");
266   g_object_class_override_property (gobject_class, PROP_ALBUM, "songalbum");
267   g_object_class_override_property (gobject_class, PROP_SORT_ALBUM, "sort-album");
268   g_object_class_override_property (gobject_class, PROP_ARTIST, "songartist");
269   g_object_class_override_property (gobject_class, PROP_SORT_ARTIST, "sort-artist");
270   g_object_class_override_property (gobject_class, PROP_GENRE, "songgenre");
271   g_object_class_override_property (gobject_class, PROP_FORMAT, "format");
272   g_object_class_override_property (gobject_class, PROP_RATING, "rating");
273   g_object_class_override_property (gobject_class, PROP_FILESIZE, "filesize");
274   g_object_class_override_property (gobject_class, PROP_DURATION, "duration");
275   g_object_class_override_property (gobject_class, PROP_TRACK, "track");
276   g_object_class_override_property (gobject_class, PROP_YEAR, "year");
277   g_object_class_override_property (gobject_class, PROP_FIRSTSEEN, "firstseen");
278   g_object_class_override_property (gobject_class, PROP_MTIME, "mtime");
279   g_object_class_override_property (gobject_class, PROP_DISC, "disc");
280   g_object_class_override_property (gobject_class, PROP_BITRATE, "bitrate");
281   g_object_class_override_property (gobject_class, PROP_HAS_VIDEO, "has-video");
282   g_object_class_override_property (gobject_class, PROP_MEDIAKIND, "mediakind");
283 }
284 
285 static void
grl_daap_record_daap_iface_init(gpointer iface,gpointer data)286 grl_daap_record_daap_iface_init (gpointer iface, gpointer data)
287 {
288   DmapAvRecordInterface *daap_record = iface;
289 
290   g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DMAP_TYPE_AV_RECORD);
291 
292   daap_record->read = grl_daap_record_read;
293 }
294 
295 static void
grl_daap_record_dmap_iface_init(gpointer iface,gpointer data)296 grl_daap_record_dmap_iface_init (gpointer iface, gpointer data)
297 {
298   DmapRecordInterface *dmap_record = iface;
299 
300   g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD);
301 }
302 
303 
G_DEFINE_TYPE_WITH_CODE(GrlDaapRecord,grl_daap_record,G_TYPE_OBJECT,G_ADD_PRIVATE (GrlDaapRecord)G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD,grl_daap_record_daap_iface_init)G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD,grl_daap_record_dmap_iface_init))304 G_DEFINE_TYPE_WITH_CODE (GrlDaapRecord, grl_daap_record, G_TYPE_OBJECT,
305                          G_ADD_PRIVATE (GrlDaapRecord)
306                          G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD, grl_daap_record_daap_iface_init)
307                          G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_daap_record_dmap_iface_init))
308 
309 static void
310 grl_daap_record_finalize (GObject *object)
311 {
312   GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object);
313 
314   g_free (record->priv->location);
315   g_free (record->priv->title);
316   g_free (record->priv->album);
317   g_free (record->priv->sort_album);
318   g_free (record->priv->artist);
319   g_free (record->priv->sort_artist);
320   g_free (record->priv->genre);
321   g_free (record->priv->format);
322 
323   G_OBJECT_CLASS (grl_daap_record_parent_class)->finalize (object);
324 }
325