static gchar * htmlview_render_item (itemPtr item, guint viewMode, gboolean summaryMode) { renderParamPtr params; gchar *output = NULL, *baseUrl = NULL; nodePtr node; xmlDocPtr doc; xmlNodePtr xmlNode; const gchar *text_direction = NULL; gboolean isMergedItemset; debug_enter ("htmlview_render_item"); /* don't use node from htmlView_priv as this would be wrong for folders and other merged item sets */ node = node_from_id (item->nodeId); isMergedItemset = (node != htmlView_priv.node); /* do the XML serialization */ doc = xmlNewDoc ("1.0"); xmlNode = xmlNewDocNode (doc, NULL, "itemset", NULL); xmlDocSetRootElement (doc, xmlNode); item_to_xml(item, xmlDocGetRootElement (doc)); text_direction = htmlview_get_item_direction (item); if (IS_FEED (node)) { xmlNodePtr feed; feed = xmlNewChild (xmlDocGetRootElement (doc), NULL, "feed", NULL); feed_to_xml (node, feed); } /* do the XSLT rendering */ params = render_parameter_new (); if (NULL != node_get_base_url (node)) { baseUrl = common_uri_escape (node_get_base_url (node)); render_parameter_add (params, "baseUrl='%s'", baseUrl); } render_parameter_add (params, "summary='%d'", summaryMode?1:0); render_parameter_add (params, "showFeedName='%d'", isMergedItemset?1:0); render_parameter_add (params, "single='%d'", (viewMode == ITEMVIEW_SINGLE_ITEM)?1:0); render_parameter_add (params, "txtDirection='%s'", text_direction); render_parameter_add (params, "appDirection='%s'", common_get_app_direction ()); output = render_xml (doc, "item", params); /* For debugging use: xmlSaveFormatFile("/tmp/test.xml", doc, 1); */ xmlFreeDoc (doc); g_free (baseUrl); debug_exit ("htmlview_render_item"); return output; }
char* list_to_xml_params(list l) { char* pnode,*dnode; item np; pnode = ""; for(np = l;np != NULL;np=np->next) { dnode = __s(XML_PAR,item_to_xml(np)); pnode = __s("%s%s",pnode,dnode); } return __s(XML_PARS,pnode); }
char* item_to_xml(item it) { char *dnode; item np; switch(it->type) { case RPC_TYPE_BASE64: dnode = __s(XML_B64,it->value.b64); break; case RPC_TYPE_BOOL: dnode = __s(XML_BOOL,it->value.b); break; case RPC_TYPE_DOUBLE: dnode = __s(XML_DBLE,it->value.d); break; case RPC_TYPE_DATE: dnode = __s(XML_DATE,it->value.date); break; case RPC_TYPE_INT: case RPC_TYPE_I4: dnode = __s(XML_INT,it->value.i); break; case RPC_TYPE_STRING: dnode = __s(XML_STR,it->value.s); break; case RPC_TYPE_ARRAY:/*a bit more complicate*/ dnode = ""; for(np = it->value.array;np!=NULL;np=np->next) dnode = __s("%s%s", dnode,item_to_xml(np)); dnode = __s(XML_ARR,dnode); break; default: dnode = XML_NIL; break; } return __s(XML_VALUE,dnode); }