4 * @file gmyth/gmyth_stringlist.c
6 * @brief <p> This component contains functions for dealing with the stringlist
7 * format of the mythprotocol.
9 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
10 * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU Lesser General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "gmyth_stringlist.h"
34 #include "gmyth_debug.h"
36 static void gmyth_string_list_class_init(GMythStringListClass * klass);
37 static void gmyth_string_list_init(GMythStringList * object);
39 static void gmyth_string_list_dispose(GObject * object);
40 static void gmyth_string_list_finalize(GObject * object);
42 G_DEFINE_TYPE(GMythStringList, gmyth_string_list, G_TYPE_OBJECT)
43 static void gmyth_string_list_class_init(GMythStringListClass * klass)
45 GObjectClass *gobject_class;
47 gobject_class = (GObjectClass *) klass;
49 gobject_class->dispose = gmyth_string_list_dispose;
50 gobject_class->finalize = gmyth_string_list_finalize;
54 gmyth_string_list_init(GMythStringList * gmyth_string_list)
56 gmyth_string_list->glist = NULL;
60 gmyth_string_list_dispose(GObject * object)
62 GMythStringList *gmyth_string_list = GMYTH_STRING_LIST(object);
64 gmyth_string_list_clear_all(gmyth_string_list);
66 G_OBJECT_CLASS(gmyth_string_list_parent_class)->dispose(object);
70 gmyth_string_list_finalize(GObject * object)
72 //GMythStringList *gmyth_string_list = GMYTH_STRING_LIST(object);
74 g_signal_handlers_destroy(object);
76 G_OBJECT_CLASS(gmyth_string_list_parent_class)->finalize(object);
79 /** Creates a new instance of GStringList.
81 * @return a new instance of GStringList.
84 gmyth_string_list_new()
86 GMythStringList *gmyth_string_list =
87 GMYTH_STRING_LIST(g_object_new(GMYTH_STRING_LIST_TYPE, NULL));
89 return gmyth_string_list;
92 /** Appends a guint64 to the string list.
94 * @param strlist The GMythStringList instance.
95 * @param value The guint64 to be appended.
97 * @return The appended guint64 converted to a GString object.
100 gmyth_string_list_append_int(GMythStringList * strlist, const gint value)
102 GString *value_str = g_string_new("");
104 g_string_printf(value_str, "%d", value);
106 strlist->glist = g_list_append(strlist->glist, value_str);
111 /** Appends a guint64 to the string list.
113 * @param strlist The GMythStringList instance.
114 * @param value The guint64 to be appended.
116 * @return The appended guint64 converted to a GString object.
119 gmyth_string_list_append_uint64(GMythStringList * strlist,
122 GString *tmp_str1 = g_string_new("");
123 GString *tmp_str2 = g_string_new("");
125 gmyth_debug("value = %llu.\n", value);
127 gulong l2 = ((guint64) value & 0xffffffff);
128 gulong l1 = ((guint64) value >> 32);
130 /* high order part of guint64 value */
131 g_string_printf(tmp_str1, "%lu", l1);
133 gmyth_debug("[%s] uint64 (high) = %s\n", __FUNCTION__, tmp_str1->str);
135 strlist->glist = g_list_append(strlist->glist, tmp_str1);
137 /* low order part of guint64 value */
138 g_string_printf(tmp_str2, "%lu", l2);
140 gmyth_debug("[%s] uint64 (low) = %s\n", __FUNCTION__, tmp_str2->str);
142 strlist->glist = g_list_append(strlist->glist, tmp_str2);
147 /** Appends a gint64 to the string list.
149 * @param strlist The GMythStringList instance.
150 * @param value The gint64 to be appended.
152 * @return The appended gint64 converted to a GString object.
155 gmyth_string_list_append_int64(GMythStringList * strlist, const gint64 value)
157 GString *tmp_str1 = g_string_new("");
158 GString *tmp_str2 = g_string_new("");
160 gmyth_debug("value = %lld.\n", value);
162 glong l2 = ((gint64) value & 0xffffffff);
163 glong l1 = ((gint64) value >> 32);
165 /* high order part of gint64 value */
166 g_string_printf(tmp_str1, "%ld", l1);
168 gmyth_debug("[%s] int64 (high) = %s\n", __FUNCTION__, tmp_str1->str);
170 strlist->glist = g_list_append(strlist->glist, tmp_str1);
172 /* low order part of gint64 value */
173 g_string_printf(tmp_str2, "%ld", l2);
175 gmyth_debug("[%s] int64 (low) = %s\n", __FUNCTION__, tmp_str2->str);
177 strlist->glist = g_list_append(strlist->glist, tmp_str2);
182 /** Appends a char array to the string list.
184 * @param strlist The GMythStringList instance.
185 * @param value The char array to be appended.
187 * @return The appended char array converted to a GString object.
190 gmyth_string_list_append_char_array(GMythStringList * strlist,
193 GString *tmp_str = NULL;
195 g_return_val_if_fail(strlist != NULL, NULL);
197 tmp_str = g_string_new(value);
199 strlist->glist = g_list_append(strlist->glist, tmp_str);
204 /** Appends a string to the string list.
206 * @param strlist The GMythStringList instance.
207 * @param value The string to be appended.
209 * @return The appended string itself.
212 gmyth_string_list_append_string(GMythStringList * strlist, GString * value)
214 g_return_val_if_fail(strlist != NULL, NULL);
219 g_list_append(strlist->glist, g_string_new(value->str));
223 strlist->glist = g_list_append(strlist->glist, NULL);
229 /** Gets an integer value from the string list at the given position.
231 * @param strlist The GMythStringList instance.
232 * @param index the integer position in the list, starting with zero.
233 * @return The integer value.
236 gmyth_string_list_get_int(GMythStringList * strlist, const gint index)
238 //TODO: Create static method check_index()
239 GString *tmp_str = NULL;
241 g_return_val_if_fail(strlist != NULL, 0);
243 tmp_str = (GString *) g_list_nth_data(strlist->glist, index);
245 if (NULL == tmp_str || NULL == tmp_str->str || strlen(tmp_str->str) <= 0)
248 return (gint) ( /* 0x00000000ffffffffL & (gint64) */
249 g_ascii_strtoull(tmp_str->str, NULL, 10));
252 /** Gets a guint64 value from the string list at the given position.
253 * According to the Mythtv protocol, the 64 bits value is formed by
256 * @param strlist The GMythStringList instance.
257 * @param index the index of the first string forming the 64 bits value.
258 * Index starts with zero.
259 * @return The guint64 value.
262 gmyth_string_list_get_uint64(GMythStringList * strlist, const gint index)
264 //TODO: Create static method check_index()
265 guint64 ret_value = 0;
268 g_return_val_if_fail(strlist != NULL, 0);
270 const GString *tmp_str1 =
271 (GString *) g_list_nth_data(strlist->glist, index);
272 const GString *tmp_str2 =
273 (GString *) g_list_nth_data(strlist->glist, index + 1);
275 if (tmp_str1 != NULL)
276 gmyth_debug("[%s] seek high bytes = %s\n", __FUNCTION__, tmp_str1->str);
277 if (tmp_str2 == NULL || strlen(tmp_str2->str) > 0)
282 gmyth_debug("[%s] seek low bytes = %s\n", __FUNCTION__, tmp_str2->str);
285 guint64 l1 = ((guint64) g_ascii_strtoull(tmp_str1->str, NULL, 10) /*& 0xffffffff */
288 if (tmp_str2 != NULL && tmp_str2->str != NULL && strlen(tmp_str2->str) > 0)
290 l2 = ((guint64) g_ascii_strtoull(tmp_str2->str, NULL, 10)
300 gmyth_debug("[%s]\t[l1 == %llu, l2 == %llu]\n", __FUNCTION__, l1, l2);
302 ret_value = ((guint64) (l2) /*& 0xffffffff */ ) | ((guint64) l1 << 32);
304 gmyth_debug("[%s] returning uint64 value = %llu\n", __FUNCTION__,
310 /** Gets a gint64 value from the string list at the given position.
311 * According to the Mythtv protocol, the 64 bits value is formed by
314 * @param strlist The GMythStringList instance.
315 * @param index the index of the first string forming the 64 bits value.
316 * Index starts with zero.
317 * @return The gint64 value.
320 gmyth_string_list_get_int64(GMythStringList * strlist, const gint index)
322 //TODO: Create static method check_index()
323 gint64 ret_value = 0;
326 g_return_val_if_fail(strlist != NULL, 0);
328 const GString *tmp_str1 =
329 (GString *) g_list_nth_data(strlist->glist, index);
330 const GString *tmp_str2 =
331 (GString *) g_list_nth_data(strlist->glist, index + 1);
333 if (tmp_str1 != NULL)
334 gmyth_debug("[%s] seek high bytes = %s\n", __FUNCTION__, tmp_str1->str);
335 if (tmp_str2 == NULL || strlen(tmp_str2->str) > 0)
340 gmyth_debug("[%s] seek low bytes = %s\n", __FUNCTION__, tmp_str2->str);
343 gint64 l1 = ((guint64) g_ascii_strtoull(tmp_str1->str, NULL, 10) /*& 0xffffffff */
346 if (tmp_str2 != NULL && tmp_str2->str != NULL && strlen(tmp_str2->str) > 0)
348 l2 = ((gint64) g_ascii_strtoull(tmp_str2->str, NULL, 10)
358 gmyth_debug("[%s]\t[l1 == %lld, l2 == %lld]\n", __FUNCTION__, l1, l2);
360 ret_value = ((gint64) (l2) /*& 0xffffffff */ ) | ((gint64) l1 << 32);
362 gmyth_debug("[%s] returning int64 value = %lld\n", __FUNCTION__, ret_value);
368 /** Gets a string from the string list at the given position. The GString must be deallocated.
370 * @param strlist The GMythStringList instance.
371 * @param index the string position in the list, starting with zero.
372 * @return A pointer to the string data.
375 gmyth_string_list_get_string(GMythStringList * strlist, const gint index)
379 if (!strlist || !(strlist->glist))
381 gmyth_debug("%s received Null arguments", __FUNCTION__);
385 ret = (GString *) g_list_nth_data(strlist->glist, index);
387 return g_string_new(ret->str);
392 gmyth_string_list_clear_element(GString * str_elem, void *data_aux)
394 if (str_elem != NULL)
395 g_string_free(str_elem, TRUE);
398 /** Removes all strings from the string list.
400 * @param strlist The GMythStringList instance.
403 gmyth_string_list_clear_all(GMythStringList * strlist)
405 if (strlist != NULL && strlist->glist)
407 g_list_foreach(strlist->glist,
408 (GFunc) gmyth_string_list_clear_element, NULL);
409 g_list_free(strlist->glist);
410 strlist->glist = NULL;
414 /** Retrieves the number of elements in the string list.
416 * @param strlist The GMythStringList instance.
417 * @return the string list length.
420 gmyth_string_list_length(GMythStringList * strlist)
422 if (!(strlist != NULL && strlist->glist != NULL))
425 return g_list_length(strlist->glist);