gboolean ug_download_list_save (GList* list, const gchar* download_file) { UgetRelation* relation; UgMarkup* markup; guint index; markup = ug_markup_new (); if (ug_markup_write_start (markup, download_file, TRUE) == FALSE) { ug_markup_free (markup); return FALSE; } for (index = 0; list; list = list->next, index++) { relation = UG_DATASET_RELATION ((UgDataset*) list->data); if (relation) relation->index = index; if (list->next == NULL) break; } ug_markup_write_element_start (markup, "UgDownloadList version='1'"); for (; list; list = list->prev) { ug_markup_write_element_start (markup, "download"); ug_data_write_markup ((UgData*) list->data, markup); ug_markup_write_element_end (markup, "download"); } ug_markup_write_element_end (markup, "UgDownloadList"); ug_markup_write_end (markup); return TRUE; }
static void ug_string_list_to_markup (GList** string_list, UgMarkup* markup) { GList* link; for (link = g_list_last (*string_list); link; link = link->prev) { ug_markup_write_element_start (markup, "string value='%s'", link->data); ug_markup_write_element_end (markup, "string"); } }
static void ug_int_list_to_markup (GList** list, UgMarkup* markup) { GList* link; guint value; for (link = g_list_last (*list); link; link = link->prev) { value = GPOINTER_TO_INT (link->data); ug_markup_write_element_start (markup, "int value='%d'", value); ug_markup_write_element_end (markup, "int"); } }
gboolean ug_setting_save (UgSetting* setting, const gchar* file) { UgMarkup* markup; markup = ug_markup_new (); if (ug_markup_write_start (markup, file, TRUE)) { ug_markup_write_element_start (markup, "UgSetting version='1'"); ug_data_write_markup ((UgData*) setting, markup); ug_markup_write_element_end (markup, "UgSetting"); ug_markup_write_end (markup); return TRUE; } return FALSE; }
gboolean ug_category_list_save (GList* list, const gchar* file) { UgCategoryGetAllFunc get_all; UgCategory* category; UgMarkup* markup; GList* link; guint index; markup = ug_markup_new (); if (ug_markup_write_start (markup, file, TRUE) == FALSE) { ug_markup_free (markup); return FALSE; } ug_markup_write_element_start (markup, "UgCategoryList version='1'"); for (list = g_list_last (list); list; list = list->prev) { category = list->data; get_all = category->funcs->get_all; // create UgCategory.indices category->indices = get_all (category); for (link = category->indices; link; link = link->next) { index = UG_DATASET_RELATION ((UgDataset*) link->data)->index; link->data = GINT_TO_POINTER (index); } // output ug_markup_write_element_start (markup, "category"); ug_data_write_markup ((UgData*) list->data, markup); ug_markup_write_element_end (markup, "category"); // free UgCategory.indices g_list_free (category->indices); category->indices = NULL; } ug_markup_write_element_end (markup, "UgCategoryList"); ug_markup_write_end (markup); return TRUE; }
static void ug_dataset_to_markup (UgDataset* dataset, UgMarkup* markup) { const UgData1Interface* iface; UgDatalist* datalist; guint index; for (index = 0; index < dataset->data_len; index += 2) { // output from tail to head datalist = ug_datalist_last (dataset->data[index]); for (; datalist; datalist = datalist->prev) { iface = datalist->iface; if (iface->entry == NULL) continue; ug_markup_write_element_start (markup, "DataClass name='%s'", iface->name); ug_data1_write_markup ((UgData1*)datalist, markup); ug_markup_write_element_end (markup, "DataClass"); } } }
void ug_data1_write_markup (UgData1* data, UgMarkup* markup) { const UgDataEntry* entry; union { gpointer src; gchar* v_string; gint v_int; guint v_uint; gint64 v_int64; gdouble v_double; } value; entry = data->iface->entry; if (entry == NULL) return; for (; entry->name; entry++) { value.src = ((guint8*) data) + entry->offset; switch (entry->type) { case UG_TYPE_STRING: value.v_string = *(gchar**)value.src; if (value.v_string) { // ug_markup_write_element_start() must use with ug_markup_write_element_end() ug_markup_write_element_start (markup, "%s value='%s'", entry->name, value.v_string); ug_markup_write_element_end (markup, entry->name); } break; case UG_TYPE_INT: value.v_int = *(gint*)value.src; // if (value.v_int) { // ug_markup_write_element_start() must use with ug_markup_write_element_end() ug_markup_write_element_start (markup, "%s value='%d'", entry->name, value.v_int); ug_markup_write_element_end (markup, entry->name); // } break; case UG_TYPE_UINT: value.v_uint = *(guint*)value.src; // if (value.v_int) { // ug_markup_write_element_start() must use with ug_markup_write_element_end() ug_markup_write_element_start (markup, "%s value='%u'", entry->name, value.v_uint); ug_markup_write_element_end (markup, entry->name); // } break; case UG_TYPE_INT64: value.v_int64 = *(gint64*)value.src; // if (value.v_int64) { // ug_markup_write_element_start() must use with ug_markup_write_element_end() //#if defined (_MSC_VER) || defined (__MINGW32__) // ug_markup_write_element_start (markup, "%s value='%I64d'", entry->name, value.v_int64); //#else // C99 Standard ug_markup_write_element_start (markup, "%s value='%lld'", entry->name, value.v_int64); //#endif ug_markup_write_element_end (markup, entry->name); // } break; case UG_TYPE_DOUBLE: value.v_double = *(gdouble*)value.src; // if (value.v_double) { // ug_markup_write_element_start() must use with ug_markup_write_element_end() ug_markup_write_element_start (markup, "%s value='%f'", entry->name, value.v_double); ug_markup_write_element_end (markup, entry->name); // } break; case UG_TYPE_INSTANCE: value.src = *(gpointer*) value.src; if (value.src == NULL) break; case UG_TYPE_STATIC: ug_markup_write_element_start (markup, entry->name); ug_data1_write_markup (value.src, markup); ug_markup_write_element_end (markup, entry->name); break; case UG_TYPE_CUSTOM: // ug_markup_write_element_start() must use with ug_markup_write_element_end() if (entry->writer) { ug_markup_write_element_start (markup, entry->name); ((UgWriteFunc) entry->writer) (value.src, markup); ug_markup_write_element_end (markup, entry->name); } break; default: break; } // End of switch (entry->type) } }