<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -2,6 +2,8 @@
 #define CALLBACK_H_
 
 #include &lt;glib.h&gt;
+#define _XOPEN_SOURCE //glibc2 needs this
+#include &lt;time.h&gt;
 #include &quot;lfmobjects.h&quot;
 
 typedef void (*utf8_callback)(const gchar* utf8, guint utf8_length, gpointer user_data, GError* error);
@@ -12,7 +14,7 @@ typedef void (*artists_callback)(lfmartist** artists, gpointer user_data, GError
 typedef void (*tags_callback)(lfmtag** tags,  gpointer user_data, GError* error);
 typedef void (*tracks_callback)(lfmtrack** tracks,  gpointer user_data, GError* error);
 
-typedef void (*date_time_callback)(GTimeVal date_time, gpointer user_data, GError* error);
+typedef void (*date_time_callback)(struct tm, gpointer user_data, GError* error);
 
 typedef void (*albums_callback)(lfmalbum** albums,  gpointer user_data, GError* error);
 typedef void (*events_callback)(lfmevent** events,  gpointer user_data, GError* error);</diff>
      <filename>callback.h</filename>
    </modified>
    <modified>
      <diff>@@ -195,9 +195,36 @@ void token_get_signature(const gchar* token, const gchar* method_name)
 //Simple parser
 //
 
-gboolean parse_boolean(const gchar* boolean, size_t user_size, GError** error)
+//0,1, true, false
+gboolean parse_boolean(const gchar* boolean, size_t bsize, GError** error)
 {
-	return TRUE;
+	gunichar bchar = g_utf8_get_char(boolean);
+	
+	if(bchar == '0')
+		return FALSE;
+	else if(bchar == '1')
+		return TRUE;
+	else if(g_utf8_strlen(boolean, bsize) == 4 || g_utf8_strlen(boolean, bsize) == 5)
+	{	
+		gchar* uncase = g_utf8_strdown(boolean, bsize);
+	
+		if(strcmp(uncase, &quot;true&quot;) == 0)
+		{
+			g_free(uncase);
+			return TRUE;
+		}
+		else if(strcmp(uncase, &quot;false&quot;) == 0)
+		{
+			g_free(uncase);
+			return FALSE;
+		}		
+	}
+		
+	gchar* error_message = utf8_get_null_terminated(boolean, bsize);	
+		
+	*error = g_error_new(1, 1, error_message);
+	g_free(error_message);
+	return FALSE;	
 }
 
 guint parse_uint(const gchar* buffer, size_t buffer_size, GError** error)
@@ -205,11 +232,32 @@ guint parse_uint(const gchar* buffer, size_t buffer_size, GError** error)
 	return g_ascii_strtoull(buffer, NULL, 10);
 }
 
-GTimeVal parse_date_time(const gchar* date_time, size_t date_time_size, GError** error)
+void init_tm(struct tm* ptm)
+{
+	ptm-&gt;tm_hour = 0;
+	ptm-&gt;tm_isdst = 0;
+	ptm-&gt;tm_mday = 0;
+	ptm-&gt;tm_min = 0;
+	ptm-&gt;tm_mon = 0;
+	ptm-&gt;tm_sec = 0;
+	ptm-&gt;tm_wday = 0;
+	ptm-&gt;tm_yday = 0;
+	ptm-&gt;tm_year = 0;
+}
+
+struct tm parse_date_time(const gchar* date_time, size_t date_time_size, GError** error)
 {
-	GTimeVal test;
-	return test;
-	//return utf82date(date_time);
+	gchar* dt_string = utf8_get_null_terminated(date_time, date_time_size);
+
+	struct tm tm;
+	init_tm(&amp;tm);
+ 
+ 	const char* not_processed = strptime(dt_string, &quot;%a, %d %b %Y %H:%M:%S %z&quot;, &amp;tm); 
+    
+    if(!not_processed || *not_processed != '\0')
+		*error = g_error_new(1, 1, &quot;Cannot convert '%s' to date time&quot;, dt_string);
+	
+	return tm;
 }
 
 glong utf8_strsize(const gchar* string)
@@ -232,7 +280,7 @@ const enum data_type error_data_type = DATA_UTF8;
 struct xml_parser
 {
 	const lfmget* call;
-	guint in_level;
+	gboolean collect;
 	gpointer callback;
 	gpointer user_data;
 	gchar** texts;
@@ -249,6 +297,37 @@ void** get_paths(const struct xml_parser* parser)
 		return (void**)parser-&gt;call-&gt;path;
 }
 
+gboolean is_correct_structure(const gchar* current_element, GMarkupParseContext* context, const gchar** path)
+{
+	const GSList* list = g_markup_parse_context_get_element_stack(context);	
+	
+	const gchar** last_path = path;
+	
+	while(*last_path)
+	{
+		last_path++;
+	}
+	
+	last_path--;
+	
+	const gchar** current_path = last_path;
+	
+	/*if(strcmp(current_element, *current_path) != 0)
+		return FALSE;
+	
+	current_path--;*/	
+	
+	while(path &lt;= current_path)
+	{
+		if(strcmp(*current_path, list-&gt;data) != 0)
+			return FALSE;
+		current_path--;
+		list = g_slist_next(list); 
+	}
+	
+	return TRUE;	
+}
+
 void xml_parse_start
 (
 	GMarkupParseContext* context,
@@ -261,8 +340,6 @@ void xml_parse_start
 {	
 	struct xml_parser* parser = user_data;
 	
-	const gchar* criteria_name = get_paths(parser)[parser-&gt;in_level];
-	
 	if(strcmp(element_name, &quot;lfm&quot;) == 0)
 	{
 		const gchar** name_iterator = attribute_names;
@@ -280,10 +357,10 @@ void xml_parse_start
 			value_iterator++;
 		}
 	}
-	else if(strcmp(element_name, criteria_name) == 0)
-		parser-&gt;in_level++;
+	else if(is_correct_structure(element_name, context, get_paths(parser))) 
+		parser-&gt;collect = TRUE;
 		
-	if(parser-&gt;is_error &amp;&amp; parser-&gt;in_level == 1)
+	if(parser-&gt;is_error &amp;&amp; parser-&gt;collect)
 	{
 		const gchar** name_iterator = attribute_names;
 		const gchar** value_iterator = attribute_values;
@@ -309,13 +386,10 @@ void invoke_callback(enum data_type type, const gchar* text, size_t text_len, gp
 	{		
 		case DATA_DATE_TIME:
 		{
-			GTimeVal dt;
+			struct tm dt;
 			
 			if(error)
-			{
-				dt.tv_sec = 0;
-				dt.tv_usec = 0;
-			}	
+				init_tm(&amp;dt);
 			else
 				dt = parse_date_time(text, text_len, &amp;error);
 						
@@ -432,13 +506,11 @@ void xml_parse_end
 )
 {
 	struct xml_parser* parser = user_data;
-	
-	const gchar* criteria_name = get_paths(parser)[parser-&gt;in_level - 1];
 
-	if(strcmp(element_name, criteria_name) != 0)
+	if(!is_correct_structure(element_name, context, get_paths(parser)))
 		return;
 	
-	parser-&gt;in_level--;
+	parser-&gt;collect = FALSE;
 	
 	guint* uint_iterator = parser-&gt;text_lengths;
 	guint text_len = 0;
@@ -456,7 +528,7 @@ void xml_parse_end
 		if(text_len == 0)
 		{
 			//nothing found
-			*error = g_error_new_literal(0, 1, &quot;No data delivered&quot;);
+			*error = g_error_new_literal(1, 1, &quot;No data delivered&quot;);
 		}
 		else
 		{
@@ -520,7 +592,7 @@ void xml_parse_text
 {
 	struct xml_parser* parser = user_data;
 	
-	if(countv(get_paths(parser)) != (parser-&gt;in_level))
+	if(!parser-&gt;collect)
 		return; //not in desired structure
 	
 	addv(gchar, parser-&gt;texts,  g_memdup(text, text_len));
@@ -705,13 +777,14 @@ void proxy_request(lfmproxy* proxy, const lfmget* call, const lfmparametervalue*
 	
 	struct xml_parser* parser = g_new(struct xml_parser, 1);
 	parser-&gt;call = call;
-	parser-&gt;in_level = 0;
+	parser-&gt;collect = FALSE;
 	parser-&gt;callback = callback;
 	parser-&gt;user_data = user_data;
 	parser-&gt;texts = g_new(gchar*, 1);
 	*parser-&gt;texts = NULL;
 	parser-&gt;text_lengths = g_new(size_t, 1);
 	*parser-&gt;text_lengths = 0;
+	parser-&gt;is_error = FALSE;
 	
 	//create new parse context
 	GMarkupParseContext* context = g_markup_parse_context_new</diff>
      <filename>communication.c</filename>
    </modified>
    <modified>
      <diff>@@ -43,3 +43,12 @@ void xwax_vprint(const char* module_name, const char* format, va_list args)
 	g_free(output);
 	g_print(&quot;\n&quot;);
 }
+
+gchar* utf8_get_null_terminated(const gchar* string, size_t string_size)
+{
+	gchar* buffer = g_new0(gchar, string_size + 1);
+	
+	g_utf8_strncpy(buffer, string, g_utf8_strlen(string, string_size));
+	
+	return buffer;
+}</diff>
      <filename>include.c</filename>
    </modified>
    <modified>
      <diff>@@ -68,3 +68,5 @@ enum image_size
 	IMAGE_MEDIUM,
 	IMAGE_LARGE
 };
+
+gchar* utf8_get_null_terminated(const gchar* string, size_t string_size);</diff>
      <filename>include.h</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,13 @@
 
 static GCond* cond = NULL; 
 
-void mbid(const gchar* mchar, size_t msize, gpointer user_data, GError* error)
+void dt(struct tm dt, gpointer user_data, GError* error)
 {
-	g_printerr(error-&gt;message);
+	if(error)
+		g_printerr(error-&gt;message);
+	else
+		g_print(&quot;(DT) Sec: %d&quot;, dt.tm_sec);
+	
 	g_cond_broadcast(cond);	
 }
 
@@ -12,7 +16,7 @@ int main(int argc, const char* args[])
 {	
 	lastfm_init();
 	cond = g_cond_new();
-	artist_get_musicbrainz_id(&quot;cher&quot;, mbid, NULL);
+	artist_get_published_date_time(&quot;cher&quot;, dt, NULL);	
 	
 	GMutex* mutex = g_mutex_new();   
 	g_cond_wait(cond, mutex);</diff>
      <filename>lastfm.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>29a9480c849a6204a71dc3a978b963393698125d</id>
    </parent>
  </parents>
  <author>
    <name>LCID Fire</name>
    <email>lcid-fire@gmx.net</email>
  </author>
  <url>http://github.com/LCID-Fire/liblastfm/commit/249a4206a67a92ac923231d0da09a51b5c81cd1a</url>
  <id>249a4206a67a92ac923231d0da09a51b5c81cd1a</id>
  <committed-date>2008-07-08T17:35:36-07:00</committed-date>
  <authored-date>2008-07-08T17:35:36-07:00</authored-date>
  <message>Fixed some parsing</message>
  <tree>4b74d8f46e4769a04f02a51a1a48b779c991e20a</tree>
  <committer>
    <name>LCID Fire</name>
    <email>lcid-fire@gmx.net</email>
  </committer>
</commit>
