branches/gmyth-0.1b/src/gmyth_stringlist.c
author rosfran
Tue Feb 06 00:33:35 2007 +0000 (2007-02-06)
branchtrunk
changeset 326 81b1f3006eb2
permissions -rw-r--r--
[svn r328] Some fixes on program info, and some memory clean ups.
renatofilho@320
     1
/**
renatofilho@320
     2
 * GMyth Library
renatofilho@320
     3
 *
renatofilho@320
     4
 * @file gmyth/gmyth_stringlist.c
renatofilho@320
     5
 * 
renatofilho@320
     6
 * @brief <p> This component contains functions for dealing with the stringlist
renatofilho@320
     7
 * format of the mythprotocol.
renatofilho@320
     8
 * 
renatofilho@320
     9
 * Copyright (C) 2006 INdT - Instituto Nokia de Tecnologia.
renatofilho@320
    10
 * @author Hallyson Luiz de Morais Melo <hallyson.melo@indt.org.br>
renatofilho@320
    11
 *
renatofilho@320
    12
 *//*
renatofilho@320
    13
 * 
renatofilho@320
    14
 * This program is free software; you can redistribute it and/or modify
renatofilho@320
    15
 * it under the terms of the GNU Lesser General Public License as published by
renatofilho@320
    16
 * the Free Software Foundation; either version 2 of the License, or
renatofilho@320
    17
 * (at your option) any later version.
renatofilho@320
    18
 *
renatofilho@320
    19
 * This program is distributed in the hope that it will be useful,
renatofilho@320
    20
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
renatofilho@320
    21
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
renatofilho@320
    22
 * GNU General Public License for more details.
renatofilho@320
    23
 *
renatofilho@320
    24
 * You should have received a copy of the GNU Lesser General Public License
renatofilho@320
    25
 * along with this program; if not, write to the Free Software
renatofilho@320
    26
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
renatofilho@320
    27
 */
renatofilho@320
    28
 
renatofilho@320
    29
#ifdef HAVE_CONFIG_H
renatofilho@320
    30
#include "config.h"
renatofilho@320
    31
#endif
renatofilho@320
    32
renatofilho@320
    33
#include "gmyth_stringlist.h"
renatofilho@320
    34
 
renatofilho@320
    35
#include "gmyth_debug.h"
renatofilho@320
    36
renatofilho@320
    37
static void gmyth_string_list_class_init          (GMythStringListClass *klass);
renatofilho@320
    38
static void gmyth_string_list_init                (GMythStringList *object);
renatofilho@320
    39
renatofilho@320
    40
static void gmyth_string_list_dispose  (GObject *object);
renatofilho@320
    41
static void gmyth_string_list_finalize (GObject *object);
renatofilho@320
    42
renatofilho@320
    43
G_DEFINE_TYPE(GMythStringList, gmyth_string_list, G_TYPE_OBJECT)
renatofilho@320
    44
    
renatofilho@320
    45
static void
renatofilho@320
    46
gmyth_string_list_class_init (GMythStringListClass *klass)
renatofilho@320
    47
{
renatofilho@320
    48
	GObjectClass *gobject_class;
renatofilho@320
    49
renatofilho@320
    50
    gobject_class = (GObjectClass *) klass;
renatofilho@320
    51
	
renatofilho@320
    52
    gobject_class->dispose  = gmyth_string_list_dispose;
renatofilho@320
    53
    gobject_class->finalize = gmyth_string_list_finalize;	
renatofilho@320
    54
}
renatofilho@320
    55
renatofilho@320
    56
static void
renatofilho@320
    57
gmyth_string_list_init (GMythStringList *gmyth_string_list)
renatofilho@320
    58
{
renatofilho@320
    59
	gmyth_string_list->glist = NULL;
renatofilho@320
    60
}
renatofilho@320
    61
renatofilho@320
    62
static void
renatofilho@320
    63
gmyth_string_list_dispose  (GObject *object)
renatofilho@320
    64
{
renatofilho@320
    65
	GMythStringList *gmyth_string_list = GMYTH_STRING_LIST(object);
renatofilho@320
    66
renatofilho@320
    67
	if (gmyth_string_list->glist)
renatofilho@320
    68
		gmyth_string_list_clear_all(gmyth_string_list);
renatofilho@320
    69
renatofilho@320
    70
	G_OBJECT_CLASS (gmyth_string_list_parent_class)->dispose (object);
renatofilho@320
    71
}
renatofilho@320
    72
renatofilho@320
    73
static void
renatofilho@320
    74
gmyth_string_list_finalize (GObject *object)
renatofilho@320
    75
{
renatofilho@320
    76
	//GMythStringList *gmyth_string_list = GMYTH_STRING_LIST(object);
renatofilho@320
    77
renatofilho@320
    78
	g_signal_handlers_destroy (object);
renatofilho@320
    79
renatofilho@320
    80
	G_OBJECT_CLASS (gmyth_string_list_parent_class)->finalize (object);
renatofilho@320
    81
}
renatofilho@320
    82
renatofilho@320
    83
/** Creates a new instance of GStringList.
renatofilho@320
    84
 * 
renatofilho@320
    85
 * @return a new instance of GStringList.
renatofilho@320
    86
 */
renatofilho@320
    87
GMythStringList *
renatofilho@320
    88
gmyth_string_list_new ()
renatofilho@320
    89
{
renatofilho@320
    90
    GMythStringList *gmyth_string_list = GMYTH_STRING_LIST (g_object_new (GMYTH_STRING_LIST_TYPE, NULL));
renatofilho@320
    91
    return gmyth_string_list;
renatofilho@320
    92
}
renatofilho@320
    93
renatofilho@320
    94
/** Appends a guint64 to the string list.
renatofilho@320
    95
 * 
renatofilho@320
    96
 * @param strlist The GMythStringList instance.
renatofilho@320
    97
 * @param value The guint64 to be appended.
renatofilho@320
    98
 * 
renatofilho@320
    99
 * @return The appended guint64 converted to a GString object.
renatofilho@320
   100
 */
renatofilho@320
   101
GString*
renatofilho@320
   102
gmyth_string_list_append_int ( GMythStringList *strlist, const gint value )
renatofilho@320
   103
{
renatofilho@320
   104
	GString *tmp_str = g_string_new ("");
renatofilho@320
   105
renatofilho@320
   106
	g_string_printf (tmp_str, "%d", value);
renatofilho@320
   107
renatofilho@320
   108
	gmyth_string_list_append_string (strlist, tmp_str);
renatofilho@320
   109
renatofilho@320
   110
	return tmp_str;	
renatofilho@320
   111
}
renatofilho@320
   112
renatofilho@320
   113
/** Appends a guint64 to the string list.
renatofilho@320
   114
 * 
renatofilho@320
   115
 * @param strlist The GMythStringList instance.
renatofilho@320
   116
 * @param value The guint64 to be appended.
renatofilho@320
   117
 * 
renatofilho@320
   118
 * @return The appended guint64 converted to a GString object.
renatofilho@320
   119
 */
renatofilho@320
   120
GString*
renatofilho@320
   121
gmyth_string_list_append_uint64 ( GMythStringList *strlist, const guint64 value)
renatofilho@320
   122
{
renatofilho@320
   123
	GString *tmp_str1 = g_string_new ("");
renatofilho@320
   124
	GString *tmp_str2 = g_string_new ("");
renatofilho@320
   125
	gmyth_debug ( "value = %llu.\n", value);
renatofilho@320
   126
renatofilho@320
   127
	gulong l2 = ( (guint64)value & 0xffffffff  );
renatofilho@320
   128
	gulong l1 = ( (guint64)value >> 32 );
renatofilho@320
   129
  
renatofilho@320
   130
	/* high order part of guint64 value */
renatofilho@320
   131
	g_string_printf (tmp_str1, "%lu", l1);
renatofilho@320
   132
	
renatofilho@320
   133
	gmyth_debug( "[%s] uint64 (high) = %s\n", __FUNCTION__, tmp_str1->str );
renatofilho@320
   134
renatofilho@320
   135
	//gmyth_string_list_append_string (strlist, tmp_str1);
renatofilho@320
   136
	strlist->glist = g_list_append( strlist->glist, tmp_str1 );
renatofilho@320
   137
renatofilho@320
   138
 	/* low order part of guint64 value */
renatofilho@320
   139
	g_string_printf (tmp_str2, "%lu", l2);
renatofilho@320
   140
renatofilho@320
   141
	gmyth_debug( "[%s] uint64 (low) = %s\n", __FUNCTION__, tmp_str2->str );
renatofilho@320
   142
renatofilho@320
   143
	strlist->glist = g_list_append( strlist->glist, tmp_str2 );
renatofilho@320
   144
renatofilho@320
   145
	//gmyth_string_list_append_string (strlist, tmp_str2);
renatofilho@320
   146
renatofilho@320
   147
	return tmp_str2;	
renatofilho@320
   148
}
renatofilho@320
   149
renatofilho@320
   150
/** Appends a gint64 to the string list.
renatofilho@320
   151
 * 
renatofilho@320
   152
 * @param strlist The GMythStringList instance.
renatofilho@320
   153
 * @param value The gint64 to be appended.
renatofilho@320
   154
 * 
renatofilho@320
   155
 * @return The appended gint64 converted to a GString object.
renatofilho@320
   156
 */
renatofilho@320
   157
GString*
renatofilho@320
   158
gmyth_string_list_append_int64 ( GMythStringList *strlist, const gint64 value)
renatofilho@320
   159
{
renatofilho@320
   160
	GString *tmp_str1 = g_string_new ("");
renatofilho@320
   161
	GString *tmp_str2 = g_string_new ("");
renatofilho@320
   162
	gmyth_debug ( "value = %lld.\n", value );
renatofilho@320
   163
renatofilho@320
   164
	glong l2 = ( (gint64)value & 0xffffffff  );
renatofilho@320
   165
	glong l1 = ( (gint64)value >> 32 );
renatofilho@320
   166
  
renatofilho@320
   167
	/* high order part of gint64 value */
renatofilho@320
   168
	g_string_printf (tmp_str1, "%ld", l1);
renatofilho@320
   169
	
renatofilho@320
   170
	gmyth_debug( "[%s] int64 (high) = %s\n", __FUNCTION__, tmp_str1->str );
renatofilho@320
   171
renatofilho@320
   172
	//gmyth_string_list_append_string (strlist, tmp_str1);
renatofilho@320
   173
	strlist->glist = g_list_append( strlist->glist, tmp_str1 );
renatofilho@320
   174
renatofilho@320
   175
 	/* low order part of gint64 value */
renatofilho@320
   176
	g_string_printf (tmp_str2, "%ld", l2);
renatofilho@320
   177
renatofilho@320
   178
	gmyth_debug( "[%s] int64 (low) = %s\n", __FUNCTION__, tmp_str2->str );
renatofilho@320
   179
renatofilho@320
   180
	strlist->glist = g_list_append( strlist->glist, tmp_str2 );
renatofilho@320
   181
renatofilho@320
   182
	return tmp_str2;
renatofilho@320
   183
}
renatofilho@320
   184
renatofilho@320
   185
/** Appends a char array to the string list.
renatofilho@320
   186
 * 
renatofilho@320
   187
 * @param strlist The GMythStringList instance.
renatofilho@320
   188
 * @param value The char array to be appended.
renatofilho@320
   189
 * 
renatofilho@320
   190
 * @return The appended char array converted to a GString object.
renatofilho@320
   191
 */
renatofilho@320
   192
GString*
renatofilho@320
   193
gmyth_string_list_append_char_array ( GMythStringList *strlist, const gchar* value )
renatofilho@320
   194
{
renatofilho@320
   195
	GString *tmp_str = NULL;
renatofilho@320
   196
	
renatofilho@320
   197
	g_return_val_if_fail( strlist != NULL, NULL );
renatofilho@320
   198
	
renatofilho@320
   199
	tmp_str = g_string_new (value);
renatofilho@320
   200
renatofilho@320
   201
	g_return_val_if_fail( tmp_str != NULL, NULL );
renatofilho@320
   202
renatofilho@320
   203
	gmyth_string_list_append_string (strlist, tmp_str);
renatofilho@320
   204
renatofilho@320
   205
	return tmp_str;		
renatofilho@320
   206
}
renatofilho@320
   207
renatofilho@320
   208
/** Appends a string to the string list.
renatofilho@320
   209
 * 
renatofilho@320
   210
 * @param strlist The GMythStringList instance.
renatofilho@320
   211
 * @param value The string to be appended.
renatofilho@320
   212
 * 
renatofilho@320
   213
 * @return The appended string itself. 
renatofilho@320
   214
 */
renatofilho@320
   215
GString*
renatofilho@320
   216
gmyth_string_list_append_string ( GMythStringList *strlist, GString *value )
renatofilho@320
   217
{
renatofilho@320
   218
	g_return_val_if_fail( strlist != NULL, NULL );
renatofilho@320
   219
renatofilho@320
   220
	strlist->glist = g_list_append (strlist->glist, value);
renatofilho@320
   221
renatofilho@320
   222
	return value;
renatofilho@320
   223
}
renatofilho@320
   224
renatofilho@320
   225
/** Gets an integer value from the string list at the given position.
renatofilho@320
   226
 * 
renatofilho@320
   227
 * @param strlist The GMythStringList instance.
renatofilho@320
   228
 * @param index the integer position in the list, starting with zero.
renatofilho@320
   229
 * @return The integer value.
renatofilho@320
   230
 */
renatofilho@320
   231
gint
renatofilho@320
   232
gmyth_string_list_get_int ( GMythStringList *strlist, const gint index )
renatofilho@320
   233
{
renatofilho@320
   234
	//TODO: Create static method check_index()
renatofilho@320
   235
	GString *tmp_str = NULL;
renatofilho@320
   236
	
renatofilho@320
   237
	g_return_val_if_fail( strlist != NULL, 0 );
renatofilho@320
   238
renatofilho@320
   239
	tmp_str = (GString *) g_list_nth_data (strlist->glist, index);
renatofilho@320
   240
renatofilho@320
   241
	g_return_val_if_fail( tmp_str != NULL && tmp_str->str != NULL, 0 );
renatofilho@320
   242
	
renatofilho@320
   243
	return (gint) ( /* 0x00000000ffffffffL &  (gint64)*/g_ascii_strtoull ( tmp_str->str, NULL, 10 ) );
renatofilho@320
   244
}
renatofilho@320
   245
renatofilho@320
   246
/** Gets a guint64 value from the string list at the given position.
renatofilho@320
   247
 * According to the Mythtv protocol, the 64 bits value is formed by
renatofilho@320
   248
 * two strings.
renatofilho@320
   249
 * 
renatofilho@320
   250
 * @param strlist The GMythStringList instance.
renatofilho@320
   251
 * @param index the index of the first string forming the 64 bits value. 
renatofilho@320
   252
 * Index starts with zero.
renatofilho@320
   253
 * @return The guint64 value.
renatofilho@320
   254
 */
renatofilho@320
   255
guint64
renatofilho@320
   256
gmyth_string_list_get_uint64 ( GMythStringList *strlist, const gint index )
renatofilho@320
   257
{
renatofilho@320
   258
	//TODO: Create static method check_index()
renatofilho@320
   259
	guint64 ret_value = 0;
renatofilho@320
   260
	guint64 l2 = 0;
renatofilho@320
   261
renatofilho@320
   262
	g_return_val_if_fail( strlist != NULL, 0 );
renatofilho@320
   263
  
renatofilho@320
   264
	const GString *tmp_str1 = (GString *) g_list_nth_data (strlist->glist, index);
renatofilho@320
   265
	const GString *tmp_str2 = (GString *) g_list_nth_data (strlist->glist, index+1);
renatofilho@320
   266
renatofilho@320
   267
	if ( tmp_str1 != NULL )
renatofilho@320
   268
		gmyth_debug ( "[%s] seek high bytes = %s\n", __FUNCTION__, tmp_str1->str );
renatofilho@320
   269
	if ( tmp_str2 == NULL || strlen( tmp_str2->str ) > 0 ) {
renatofilho@320
   270
	} else {
renatofilho@320
   271
		gmyth_debug ( "[%s] seek low bytes = %s\n", __FUNCTION__, tmp_str2->str );
renatofilho@320
   272
	}
renatofilho@320
   273
	
renatofilho@320
   274
	guint64 l1 = ( (guint64)g_ascii_strtoull (tmp_str1->str, NULL, 10) /*& 0xffffffff*/  );
renatofilho@320
   275
	if ( tmp_str2 != NULL && tmp_str2->str != NULL && strlen(tmp_str2->str) > 0 ) {
renatofilho@320
   276
		l2 = ( (guint64)g_ascii_strtoull (tmp_str2->str, NULL, 10) /*& 0xffffffff*/  );
renatofilho@320
   277
	} else {
renatofilho@320
   278
		l2 = l1;
renatofilho@320
   279
		l1 = 0;
renatofilho@320
   280
	}
renatofilho@320
   281
renatofilho@320
   282
	gmyth_debug ( "[%s]\t[l1 == %llu, l2 == %llu]\n", __FUNCTION__, l1, l2 );
renatofilho@320
   283
	
renatofilho@320
   284
	ret_value = ((guint64)(l2) /*& 0xffffffff*/) | ((guint64)l1 << 32);
renatofilho@320
   285
  
renatofilho@320
   286
	gmyth_debug( "[%s] returning uint64 value = %llu\n", __FUNCTION__, ret_value );	
renatofilho@320
   287
	
renatofilho@320
   288
	return ret_value;
renatofilho@320
   289
}
renatofilho@320
   290
renatofilho@320
   291
/** Gets a gint64 value from the string list at the given position.
renatofilho@320
   292
 * According to the Mythtv protocol, the 64 bits value is formed by
renatofilho@320
   293
 * two strings.
renatofilho@320
   294
 * 
renatofilho@320
   295
 * @param strlist The GMythStringList instance.
renatofilho@320
   296
 * @param index the index of the first string forming the 64 bits value. 
renatofilho@320
   297
 * Index starts with zero.
renatofilho@320
   298
 * @return The gint64 value.
renatofilho@320
   299
 */
renatofilho@320
   300
gint64
renatofilho@320
   301
gmyth_string_list_get_int64 ( GMythStringList *strlist, const gint index )
renatofilho@320
   302
{
renatofilho@320
   303
	//TODO: Create static method check_index()
renatofilho@320
   304
	gint64 ret_value = 0;
renatofilho@320
   305
	gint64 l2 = 0;
renatofilho@320
   306
renatofilho@320
   307
	g_return_val_if_fail( strlist != NULL, 0 );
renatofilho@320
   308
  
renatofilho@320
   309
	const GString *tmp_str1 = (GString *) g_list_nth_data (strlist->glist, index);
renatofilho@320
   310
	const GString *tmp_str2 = (GString *) g_list_nth_data (strlist->glist, index+1);
renatofilho@320
   311
renatofilho@320
   312
	if ( tmp_str1 != NULL )
renatofilho@320
   313
		gmyth_debug ( "[%s] seek high bytes = %s\n", __FUNCTION__, tmp_str1->str );
renatofilho@320
   314
	if ( tmp_str2 == NULL || strlen( tmp_str2->str ) > 0 ) {
renatofilho@320
   315
	} else {
renatofilho@320
   316
		gmyth_debug ( "[%s] seek low bytes = %s\n", __FUNCTION__, tmp_str2->str );
renatofilho@320
   317
	}
renatofilho@320
   318
	
renatofilho@320
   319
	gint64 l1 = ( (guint64)g_ascii_strtoull (tmp_str1->str, NULL, 10) /*& 0xffffffff*/  );
renatofilho@320
   320
	if ( tmp_str2 != NULL && tmp_str2->str != NULL && strlen(tmp_str2->str) > 0 ) {
renatofilho@320
   321
		l2 = ( (gint64)g_ascii_strtoull (tmp_str2->str, NULL, 10) /*& 0xffffffff*/  );
renatofilho@320
   322
	} else {
renatofilho@320
   323
		l2 = l1;
renatofilho@320
   324
		l1 = 0;
renatofilho@320
   325
	}
renatofilho@320
   326
renatofilho@320
   327
	gmyth_debug ( "[%s]\t[l1 == %lld, l2 == %lld]\n", __FUNCTION__, l1, l2 );
renatofilho@320
   328
	
renatofilho@320
   329
	ret_value = ((gint64)(l2) /*& 0xffffffff*/) | ((gint64)l1 << 32);
renatofilho@320
   330
  
renatofilho@320
   331
	gmyth_debug( "[%s] returning int64 value = %lld\n", __FUNCTION__, ret_value );	
renatofilho@320
   332
	
renatofilho@320
   333
	return ret_value;
renatofilho@320
   334
}
renatofilho@320
   335
renatofilho@320
   336
renatofilho@320
   337
/** Gets a string from the string list at the given position.
renatofilho@320
   338
 * 
renatofilho@320
   339
 * @param strlist The GMythStringList instance.
renatofilho@320
   340
 * @param index the string position in the list, starting with zero.
renatofilho@320
   341
 * @return A pointer to the string data.
renatofilho@320
   342
 */
renatofilho@320
   343
GString*
renatofilho@320
   344
gmyth_string_list_get_string ( GMythStringList *strlist, const gint index )
renatofilho@320
   345
{
renatofilho@320
   346
	if (!strlist || !(strlist->glist)) {
renatofilho@320
   347
		g_warning ("%s received Null arguments", __FUNCTION__);
renatofilho@320
   348
		return NULL;
renatofilho@320
   349
	}
renatofilho@320
   350
renatofilho@320
   351
	return (GString *) g_list_nth_data (strlist->glist, index);
renatofilho@320
   352
}
renatofilho@320
   353
renatofilho@320
   354
renatofilho@320
   355
#if 0
renatofilho@320
   356
static void
renatofilho@320
   357
gmyth_string_list_clear_element( GString *str_elem, void *data_aux )
renatofilho@320
   358
{
renatofilho@320
   359
	if ( str_elem != NULL ) {
renatofilho@320
   360
		g_string_free( str_elem, TRUE );
renatofilho@320
   361
	}
renatofilho@320
   362
}
renatofilho@320
   363
#endif
renatofilho@320
   364
renatofilho@320
   365
/** Removes all strings from the string list.
renatofilho@320
   366
 * 
renatofilho@320
   367
 * @param strlist The GMythStringList instance.
renatofilho@320
   368
 */
renatofilho@320
   369
void
renatofilho@320
   370
gmyth_string_list_clear_all ( GMythStringList *strlist )
renatofilho@320
   371
{
renatofilho@320
   372
	if ( strlist != NULL && strlist->glist ) {
renatofilho@320
   373
	        //g_list_foreach( strlist->glist, (GFunc)gmyth_string_list_clear_element, NULL );
renatofilho@320
   374
		g_list_free (strlist->glist);
renatofilho@320
   375
		strlist->glist = NULL;
renatofilho@320
   376
	}
renatofilho@320
   377
}
renatofilho@320
   378
renatofilho@320
   379
/** Retrieves the number of elements in the string list.
renatofilho@320
   380
 * 
renatofilho@320
   381
 * @param strlist The GMythStringList instance.
renatofilho@320
   382
 * @return the string list length.
renatofilho@320
   383
 */
renatofilho@320
   384
gint
renatofilho@320
   385
gmyth_string_list_length ( GMythStringList *strlist )
renatofilho@320
   386
{
renatofilho@320
   387
	g_return_val_if_fail( strlist != NULL && strlist->glist != NULL, 0 );
renatofilho@320
   388
renatofilho@320
   389
	return g_list_length (strlist->glist);
renatofilho@320
   390
}