Misc code fixes
[maevies] / src / mvs-watc-movie.c
1 /*
2  * mvs-watc-movie.c
3  *
4  * This file is part of maevies
5  * Copyright (C) 2010 Simón Pena <spenap@gmail.com>
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  */
18
19 #include <string.h>
20
21 #include "mvs-watc-movie.h"
22
23 G_DEFINE_TYPE (MvsWatcMovie, mvs_watc_movie, G_TYPE_OBJECT)
24
25 enum {
26         PROP_0,
27         PROP_NAME,
28         PROP_STINGERS,
29         PROP_YEAR,
30 };
31
32 #define GET_PRIVATE(o) \
33   (G_TYPE_INSTANCE_GET_PRIVATE ((o), MVS_TYPE_WATC_MOVIE, MvsWatcMoviePrivate))
34
35 struct _MvsWatcMoviePrivate {
36         gchar *name;
37         int stingers;
38         gchar *year;
39 };
40
41 static void
42 mvs_watc_movie_get_property (GObject *object, guint property_id,
43                          GValue *value, GParamSpec *pspec)
44 {
45         MvsWatcMovie *self = MVS_WATC_MOVIE (object);
46
47         switch (property_id) {
48         case PROP_NAME:
49                 g_value_set_string (value, self->priv->name);
50                 break;
51         case PROP_STINGERS:
52                 g_value_set_enum (value, self->priv->stingers);
53                 break;
54         case PROP_YEAR:
55                 g_value_set_string (value, self->priv->year);
56                 break;
57         default:
58                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
59         }
60 }
61
62 static void
63 mvs_watc_movie_set_property (GObject *object, guint property_id,
64                          const GValue *value, GParamSpec *pspec)
65 {
66         MvsWatcMovie *self = MVS_WATC_MOVIE (object);
67
68         switch (property_id) {
69         case PROP_NAME:
70                 mvs_watc_movie_set_name (self, g_value_get_string (value));
71                 break;
72         case PROP_STINGERS:
73                 mvs_watc_movie_set_stingers (self, g_value_get_int (value));
74                 break;
75         case PROP_YEAR:
76                 mvs_watc_movie_set_year (self, g_value_get_string (value));
77                 break;
78         default:
79                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
80         }
81 }
82
83 static void
84 mvs_watc_movie_finalize (GObject *object)
85 {
86         MvsWatcMovie *self = MVS_WATC_MOVIE (object);
87
88         g_free (self->priv->name);
89         g_free (self->priv->year);
90
91         G_OBJECT_CLASS (mvs_watc_movie_parent_class)->finalize (object);
92 }
93
94 static void
95 mvs_watc_movie_class_init (MvsWatcMovieClass *klass)
96 {
97         GObjectClass *object_class = G_OBJECT_CLASS (klass);
98
99         g_type_class_add_private (klass, sizeof (MvsWatcMoviePrivate));
100
101         object_class->get_property = mvs_watc_movie_get_property;
102         object_class->set_property = mvs_watc_movie_set_property;
103         object_class->finalize = mvs_watc_movie_finalize;
104
105         g_object_class_install_property
106                 (object_class, PROP_NAME,
107                  g_param_spec_string ("name", "Movie name",
108                                  "The movie name",
109                                  NULL,
110                                  G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
111
112         g_object_class_install_property
113                 (object_class, PROP_STINGERS,
114                  g_param_spec_int ("stingers", "Movie stingers",
115                                  "Tells if movie has stingers",
116                                  0,
117                                  MVS_STINGERS_LAST,
118                                  MVS_STINGERS_UNKNOWN,
119                                  G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
120
121         g_object_class_install_property
122                 (object_class, PROP_YEAR,
123                  g_param_spec_string ("year", "Movie year",
124                                  "The movie year",
125                                  NULL,
126                                  G_PARAM_READWRITE));
127 }
128
129 static void
130 mvs_watc_movie_init (MvsWatcMovie *self)
131 {
132         self->priv = GET_PRIVATE (self);
133
134         self->priv->name = NULL;
135         self->priv->stingers = MVS_STINGERS_UNKNOWN;
136         self->priv->year = NULL;
137 }
138
139 MvsWatcMovie*
140 mvs_watc_movie_new (const gchar *raw_name)
141 {
142         MvsWatcMovie *instance = g_object_new (MVS_TYPE_WATC_MOVIE, NULL);
143         int len = strlen (raw_name);
144
145         /* The raw name comes with the format
146          * $(MOVIE_NAME) $(YEAR)$(STINGERS)
147          *
148          * If stingers are present, actual length is len-1.
149          * If date is present, actual length is len-6
150          * */
151
152         if (g_str_has_suffix (raw_name, "*")) {
153                 instance->priv->stingers = MVS_STINGERS_YES;
154                 len--;
155         }
156         else if (g_str_has_suffix (raw_name, "?")) {
157                 instance->priv->stingers = MVS_STINGERS_UNKNOWN;
158                 len--;
159         }
160         else
161                 instance->priv->stingers = MVS_STINGERS_NO;
162
163         if (raw_name[len-1] == ')') {
164                 len = len -6;
165
166                 gchar *year = g_strndup (raw_name + len +1, 4);
167                 mvs_watc_movie_set_year (instance, year);
168                 g_free (year);
169         }
170
171         gchar *name = g_strndup (raw_name, len);
172
173         mvs_watc_movie_set_name (instance, name);
174
175         g_free (name);
176         return instance;
177 }
178
179 gboolean
180 mvs_watc_movie_set_name (MvsWatcMovie *self, const gchar *name)
181 {
182         g_return_val_if_fail (MVS_IS_WATC_MOVIE (self), FALSE);
183
184         g_free (self->priv->name);
185
186         self->priv->name = g_strdup (name);
187
188         return TRUE;
189 }
190
191 gboolean
192 mvs_watc_movie_set_stingers (MvsWatcMovie *self, int stingers)
193 {
194         g_return_val_if_fail (MVS_IS_WATC_MOVIE (self), FALSE);
195         g_return_val_if_fail (stingers == MVS_STINGERS_UNKNOWN ||
196                               stingers == MVS_STINGERS_YES ||
197                               stingers == MVS_STINGERS_NO, FALSE);
198
199         self->priv->stingers = stingers;
200
201         return TRUE;
202 }
203
204 const gchar*
205 mvs_watc_movie_get_name (MvsWatcMovie *self)
206 {
207         g_return_val_if_fail (MVS_IS_WATC_MOVIE (self), NULL);
208
209         return self->priv->name;
210 }
211
212 int
213 mvs_watc_movie_get_stingers (MvsWatcMovie *self)
214 {
215         g_return_val_if_fail (MVS_IS_WATC_MOVIE (self), FALSE);
216
217         return self->priv->stingers;
218 }
219
220 void
221 mvs_watc_movie_print (MvsWatcMovie *self)
222 {
223         const gchar *has_stingers = NULL;
224         g_return_if_fail (MVS_IS_WATC_MOVIE (self));
225
226         if (self->priv->stingers == MVS_STINGERS_NO)
227                 has_stingers = "No";
228         else if (self->priv->stingers == MVS_STINGERS_YES)
229                 has_stingers = "Yes";
230         else
231                 has_stingers = "Unknown";
232
233         g_print ("[Name]: %s\n", self->priv->name);
234         g_print ("[Stingers]: %s\n", has_stingers);
235         g_print ("[Year]: %s\n",
236                  self->priv->year ? self->priv->year : " - ");
237 }
238
239 gboolean
240 mvs_watc_movie_set_year (MvsWatcMovie *self, const gchar *year)
241 {
242         g_return_val_if_fail (MVS_IS_WATC_MOVIE (self), FALSE);
243
244         g_free (self->priv->year);
245
246         self->priv->year = g_strdup (year);
247
248         return self->priv->year != NULL;
249 }
250
251 const gchar*
252 mvs_watc_movie_get_year (MvsWatcMovie *self)
253 {
254         return self->priv->year;
255 }