PageRenderTime 46ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/dashdesigner/rtv_parser.c

https://gitlab.com/libreems-suite/megatunix
C | 208 lines | 180 code | 23 blank | 5 comment | 19 complexity | 72542c6ebb099eaa309c8d5362c98e67 MD5 | raw file
Possible License(s): GPL-2.0
  1. #include <configfile.h>
  2. #include <getfiles.h>
  3. #include <libxml/parser.h>
  4. #include <libxml/tree.h>
  5. #include <rtv_parser.h>
  6. #include <stdio.h>
  7. #include <strings.h>
  8. #include <xmlbase.h>
  9. GtkTreeStore *store = NULL;
  10. void retrieve_rt_vars(void)
  11. {
  12. gchar **files = NULL;
  13. GArray *classes = NULL;
  14. Rtv_Data *rtv_data = NULL;
  15. gint i = 0;
  16. /*printf("retrieve rt_vars from mtx realtime maps\n");*/
  17. files = get_files(NULL,REALTIME_MAPS_DATA_DIR,"xml",&classes);
  18. if (!files)
  19. return;
  20. while(files[i])
  21. i++;
  22. rtv_data = g_new0(Rtv_Data, 1);
  23. rtv_data->persona_hash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,info_free);
  24. rtv_data->persona_array = g_array_new(FALSE,TRUE,sizeof(Persona_Info *));
  25. rtv_data->total_files = i;
  26. load_rtvars(files,rtv_data);
  27. g_array_free(classes,TRUE);
  28. g_strfreev(files);
  29. g_hash_table_destroy(rtv_data->persona_hash);
  30. g_array_free(rtv_data->persona_array,TRUE);
  31. g_free(rtv_data);
  32. }
  33. void load_rtvars(gchar **files, Rtv_Data *rtv_data)
  34. {
  35. GtkTreeIter iter;
  36. GtkTreeIter parent;
  37. gboolean xml_result = FALSE;
  38. xmlDoc *doc = NULL;
  39. xmlNode *root_element = NULL;
  40. Persona_Info *info = NULL;
  41. gint total = 0;
  42. gpointer orig = NULL;
  43. gpointer value = NULL;
  44. gchar * persona = NULL;
  45. gchar * tmpbuf = NULL;
  46. gchar * section = NULL;
  47. gchar ** vector = NULL;
  48. gchar *dlog_name = NULL;
  49. gchar *int_name = NULL;
  50. gchar *element = NULL;
  51. gint icount = 0;
  52. gint len = 0;
  53. gint tmpi = 0;
  54. gint i = 0;
  55. gint j = 0;
  56. guint k = 0;
  57. gint rtvcount = 0;
  58. gint personas = 0;
  59. LIBXML_TEST_VERSION
  60. while (files[i])
  61. {
  62. doc = xmlReadFile (files[i], NULL, 0);
  63. root_element = xmlDocGetRootElement(doc);
  64. if (!doc)
  65. {
  66. printf("XML PARSE FAILURE %s\n",files[i]);
  67. continue;
  68. }
  69. xml_result = parse_rtv_xml_for_dash(root_element,rtv_data);
  70. i++;
  71. xmlFreeDoc(doc);
  72. }
  73. xmlCleanupParser();
  74. store = gtk_tree_store_new(NUM_COLS,G_TYPE_STRING,G_TYPE_STRING);
  75. /*printf("Total number of uniq vars is %i\n",len);*/
  76. for (i=0;i<(gint)rtv_data->persona_array->len;i++)
  77. {
  78. info = NULL;
  79. info = g_array_index(rtv_data->persona_array,Persona_Info *,i);
  80. gtk_tree_store_append(store,&parent,NULL);
  81. gtk_tree_store_set(store,&parent,VARNAME_COL,info->persona,-1);
  82. for (j=0;j<(gint)g_list_length(info->rtv_list);j++)
  83. {
  84. gtk_tree_store_append(store,&iter,&parent);
  85. element = (gchar *)g_list_nth_data(info->rtv_list,j);
  86. int_name = (gchar *)g_hash_table_lookup(info->int_ext_hash,element);
  87. gtk_tree_store_set(store,&iter,VARNAME_COL,element,DATASOURCE_COL,int_name,-1);
  88. }
  89. }
  90. }
  91. gboolean parse_rtv_xml_for_dash(xmlNode *node, Rtv_Data *rtv_data)
  92. {
  93. Persona_Info *info = NULL;
  94. xmlNode *cur_node = NULL;
  95. /* Iterate down... */
  96. for (cur_node = node; cur_node;cur_node = cur_node->next)
  97. {
  98. if (cur_node->type == XML_ELEMENT_NODE)
  99. {
  100. if (g_ascii_strcasecmp((gchar *)cur_node->name,"realtime_map") == 0)
  101. load_rtv_defaults(cur_node,rtv_data,&info);
  102. if (g_ascii_strcasecmp((gchar *)cur_node->name,"derived") == 0)
  103. parse_derived_var(cur_node,rtv_data,info);
  104. }
  105. if (!parse_rtv_xml_for_dash(cur_node->children,rtv_data))
  106. return FALSE;
  107. }
  108. return TRUE;
  109. }
  110. void load_rtv_defaults(xmlNode *node, Rtv_Data *rtv_data, Persona_Info **persona_info)
  111. {
  112. Persona_Info *info = NULL;
  113. gpointer orig = NULL;
  114. gpointer value = NULL;
  115. gchar * persona = NULL;
  116. if (!generic_xml_gchar_find(node,"persona",&persona))
  117. {
  118. printf("MISSING \"persona\" key in RTV XML, contact author!\n");
  119. return;
  120. }
  121. if (g_hash_table_lookup_extended(rtv_data->persona_hash,persona,&orig,&value))
  122. info = (Persona_Info *)value;
  123. else /* We just disovered this persona, CREATE the hashtable for it and store */
  124. {
  125. info = g_new0(Persona_Info, 1);
  126. info->hash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL);
  127. info->int_ext_hash = g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free);
  128. info->rtv_list = NULL;
  129. info->persona = g_strdup(persona);
  130. g_hash_table_insert(rtv_data->persona_hash,g_strdup(persona),(gpointer)info);
  131. g_array_append_val(rtv_data->persona_array,info);
  132. }
  133. g_free(persona);
  134. *persona_info = info;
  135. }
  136. void parse_derived_var(xmlNode *node, Rtv_Data *rtv_data, Persona_Info *info)
  137. {
  138. gpointer orig = NULL;
  139. gpointer value = NULL;
  140. gchar *dlog_gui_name = NULL;
  141. gchar * tmpbuf = NULL;
  142. gchar ** vector = NULL;
  143. guint k = 0;
  144. gint tmpi = 0;
  145. g_return_if_fail(info);
  146. generic_xml_gchar_find(node,"dlog_gui_name",&dlog_gui_name);
  147. if(generic_xml_gchar_find(node,"internal_names",&tmpbuf))
  148. {
  149. vector = g_strsplit(tmpbuf,",",-1);
  150. g_free(tmpbuf);
  151. for (k=0;k<g_strv_length(vector);k++)
  152. {
  153. /* If we know about it, increase it's ref count */
  154. if (g_hash_table_lookup_extended(info->hash,vector[k],&orig,&value))
  155. {
  156. tmpi = (GINT)value + 1;
  157. g_hash_table_replace(info->hash,g_strdup(vector[k]),GINT_TO_POINTER(tmpi));
  158. }
  159. else
  160. {
  161. /*printf("inserting var %s with value %i\n",vector[k],1);*/
  162. g_hash_table_insert(info->hash,g_strdup(vector[k]),GINT_TO_POINTER(1));
  163. g_hash_table_insert(info->int_ext_hash,g_strdup(dlog_gui_name),g_strdup(vector[k]));
  164. info->rtv_list = g_list_prepend(info->rtv_list,g_strdup(dlog_gui_name));
  165. }
  166. }
  167. g_strfreev(vector);
  168. g_free(dlog_gui_name);
  169. }
  170. info->rtv_list = g_list_sort(info->rtv_list,sort);
  171. }
  172. gint sort(gconstpointer a, gconstpointer b)
  173. {
  174. return g_ascii_strcasecmp((gchar *)a, (gchar *)b);
  175. }
  176. void info_free(gpointer data)
  177. {
  178. Persona_Info *info = (Persona_Info *)data;
  179. g_hash_table_destroy(info->hash);
  180. g_hash_table_destroy(info->int_ext_hash);
  181. g_list_foreach(info->rtv_list, (GFunc)g_free, NULL);
  182. g_list_free(info->rtv_list);
  183. g_free(info->persona);
  184. g_free(info);
  185. }