gchar * node_default_render (nodePtr node) { gchar *result; xmlDocPtr doc; doc = node_to_xml (node); result = render_xml (doc, NODE_TYPE(node)->id, NULL); xmlFreeDoc (doc); return result; }
char* cardtree_to_xml(cardtree_t* ct, const char *path) { a_string_t *res; GtkTreeIter iter; gboolean path_exists; if (path==NULL) path_exists = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(ct->_store),&iter); else path_exists = gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(ct->_store),&iter,path); if (!path_exists) return NULL; res = a_strnew("<?xml version=\"1.0\"?>\n"); a_strcat(res,"<cardtree>\n"); node_to_xml(res,GTK_TREE_MODEL(ct->_store),&iter,1); a_strcat(res,"</cardtree>\n"); return a_strfinalize(res); }
void plist_to_xml(plist_t plist, char **plist_xml, uint32_t * length) { xmlDocPtr plist_doc = NULL; xmlNodePtr root_node = NULL; struct xml_node root = { NULL, 0 }; int size = 0; if (!plist || !plist_xml || *plist_xml) return; plist_doc = new_xml_plist(); root_node = xmlDocGetRootElement(plist_doc); root.xml = root_node; char *current_locale = setlocale(LC_NUMERIC, NULL); char *saved_locale = NULL; if (current_locale) { saved_locale = strdup(current_locale); } if (saved_locale) { setlocale(LC_NUMERIC, "POSIX"); } node_to_xml(plist, &root); xmlChar* tmp = NULL; xmlDocDumpMemory(plist_doc, &tmp, &size); if (size >= 0 && tmp) { /* make sure to copy the terminating 0-byte */ *plist_xml = (char*)malloc((size+1) * sizeof(char)); memcpy(*plist_xml, tmp, size+1); *length = size; xmlFree(tmp); tmp = NULL; } xmlFreeDoc(plist_doc); if (saved_locale) { setlocale(LC_NUMERIC, saved_locale); free(saved_locale); } }
static void node_to_xml(node_t* node, void *xml_struct) { struct xml_node *xstruct = NULL; plist_data_t node_data = NULL; xmlNodePtr child_node = NULL; char isStruct = FALSE; char isUIDNode = FALSE; const xmlChar *tag = NULL; char *val = NULL; //for base64 char *valtmp = NULL; uint32_t i = 0; if (!node) return; xstruct = (struct xml_node *) xml_struct; node_data = plist_get_data(node); switch (node_data->type) { case PLIST_BOOLEAN: { if (node_data->boolval) tag = XPLIST_TRUE; else tag = XPLIST_FALSE; } break; case PLIST_UINT: tag = XPLIST_INT; val = (char*)malloc(64); if (node_data->length == 16) { (void)snprintf(val, 64, "%"PRIu64, node_data->intval); } else { (void)snprintf(val, 64, "%"PRIi64, node_data->intval); } break; case PLIST_REAL: tag = XPLIST_REAL; val = (char*)malloc(64); (void)snprintf(val, 64, "%f", node_data->realval); break; case PLIST_STRING: tag = XPLIST_STRING; val = strdup((char*) node_data->strval); break; case PLIST_KEY: tag = XPLIST_KEY; val = strdup((char*) node_data->strval); break; case PLIST_DATA: tag = XPLIST_DATA; if (node_data->length) { size_t len = node_data->length; valtmp = base64encode(node_data->buff, &len); val = format_string(valtmp, len, 68, xstruct->depth); free(valtmp); } break; case PLIST_ARRAY: tag = XPLIST_ARRAY; isStruct = TRUE; break; case PLIST_DICT: tag = XPLIST_DICT; isStruct = TRUE; break; case PLIST_DATE: tag = XPLIST_DATE; { time_t timev = (time_t)node_data->timeval.tv_sec + MAC_EPOCH; struct tm *btime = gmtime(&timev); if (btime) { val = (char*)malloc(24); memset(val, 0, 24); if (strftime(val, 24, "%Y-%m-%dT%H:%M:%SZ", btime) <= 0) { free (val); val = NULL; } } } break; case PLIST_UID: // special case for keyed encoding tag = XPLIST_DICT; isStruct = TRUE; isUIDNode = TRUE; node_data->type = PLIST_DICT; node_attach(node, new_key_node("CF$UID")); node_attach(node, new_uint_node(node_data->intval)); break; default: break; } for (i = 0; i < xstruct->depth; i++) { xmlNodeAddContent(xstruct->xml, BAD_CAST("\t")); } if (node_data->type == PLIST_STRING || node_data->type == PLIST_KEY) { /* make sure we convert the following predefined xml entities */ /* < = < > = > ' = ' " = " & = & */ child_node = xmlNewTextChild(xstruct->xml, NULL, tag, BAD_CAST(val)); } else child_node = xmlNewChild(xstruct->xml, NULL, tag, BAD_CAST(val)); xmlNodeAddContent(xstruct->xml, BAD_CAST("\n")); if (val) { free(val); } //add return for structured types if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) xmlNodeAddContent(child_node, BAD_CAST("\n")); //make sure we don't produce <data/> if it's empty if ((node_data->type == PLIST_DATA) && !val) { xmlNodeAddContent(child_node, BAD_CAST("\n")); for (i = 0; i < xstruct->depth; i++) { xmlNodeAddContent(child_node, BAD_CAST("\t")); } } if (isStruct) { struct xml_node child = { child_node, xstruct->depth + 1 }; node_iterator_t *ni = node_iterator_create(node->children); node_t *ch; while ((ch = node_iterator_next(ni))) { node_to_xml(ch, &child); } node_iterator_destroy(ni); } //fix indent for structured types if (node_data->type == PLIST_ARRAY || node_data->type == PLIST_DICT) { for (i = 0; i < xstruct->depth; i++) { xmlNodeAddContent(child_node, BAD_CAST("\t")); } } if (isUIDNode) { unsigned int num = node_n_children(node); unsigned int j; for (j = num; j > 0; j--) { node_t* ch = node_nth_child(node, j-1); node_detach(node, ch); node_destroy(ch); } node_data->type = PLIST_UID; } return; }
gboolean node_to_xml(a_string_t* res, GtkTreeModel *store, GtkTreeIter* iter, int depth) { int i; gboolean leaf; gchar* node; gchar* id; gchar* length_string; gchar* comment; GtkTreeIter child; do { gtk_tree_model_get(store,iter, C_LEAF,&leaf, C_NODE,&node, C_ID,&id, C_LENGTH,&length_string, C_COMMENT,&comment, -1); for(i=0;i<depth;i++) a_strcat(res," "); if (leaf) { a_strcat(res,"<data>"); a_strcat(res,node); a_strcat(res,"</data>\n"); } else { a_strcat(res,"<node name=\""); a_strcat(res,node); a_strcat(res,"\""); if (id) { a_strcat(res," id=\""); a_strcat(res,id); a_strcat(res,"\""); } if (length_string) { a_strcat(res," length=\""); a_strcat(res,length_string); a_strcat(res,"\""); } if (comment) { a_strcat(res," comment=\""); a_strcat(res,comment); a_strcat(res,"\""); } if (gtk_tree_model_iter_children(store,&child,iter)) { a_strcat(res,">\n"); node_to_xml(res,store,&child,depth+1); for(i=0;i<depth;i++) a_strcat(res," "); a_strcat(res,"</node>\n"); } else { a_strcat(res," />\n"); } } } while (gtk_tree_model_iter_next(store,iter)); if (node) g_free(node); if (id) g_free(id); if (length_string) g_free(length_string); if (comment) g_free(comment); return TRUE; }