/** * \brief Serializes a \c LALInferenceVariables structure into a VOTable XML %node * * This function takes a \c LALInferenceVariables structure and serializes it into a VOTable * \c PARAM %node identified by the given name. The returned \c xmlNode can then be * embedded into an existing %node hierarchy or turned into a full VOTable document. * * \param vars [in] Pointer to the \c LALInferenceVariables structure to be serialized * * \return A pointer to a \c xmlNode that holds the VOTable fragment that represents * the \c LALInferenceVariables structure. * In case of an error, a null-pointer is returned.\n * \b Important: the caller is responsible to free the allocated memory (when the * fragment isn't needed anymore) using \c xmlFreeNode. Alternatively, \c xmlFreeDoc * can be used later on when the returned fragment has been embedded in a XML document. * * \sa LALInferenceVariableItem2VOTParamNode * * \author John Veitch * */ xmlNodePtr XLALInferenceVariables2VOTParamNode (LALInferenceVariables *const vars) { /* set up local variables */ /*const char *fn = __func__;*/ xmlNodePtr xmlChildNodeList = NULL; xmlNodePtr xmlChild; LALInferenceVariableItem *marker=vars->head; /* Walk through the LALInferenceVariables adding each one */ while(marker){ xmlChild = (LALInferenceVariableItem2VOTParamNode(marker)); marker=marker->next; if(!xmlChild) { /* clean up */ /* if(xmlChildNodeList) xmlFreeNodeList(xmlChildNodeList); */ XLALPrintWarning("Couldn't create PARAM node for %s\n", marker->name); /* XLAL_ERROR_NULL(fn, XLAL_EFAILED); */ continue; } if(!xmlChildNodeList) xmlChildNodeList=xmlChild; else xmlAddSibling(xmlChildNodeList,xmlChild); } return(xmlChildNodeList); }
void Node::addText(const std::string& text) { // Allocate a new text node xmlNodePtr whitespace = xmlNewText( reinterpret_cast<const xmlChar*>(text.c_str()) ); // Add the newly allocated text as sibling of this node xmlAddSibling(_xmlNode, whitespace); }
static xmlNodePtr authkey_getxml(const char* username, xmlNsPtr ns, char** msg) { FILE *authfile; char *line = NULL, *id, *data; xmlNodePtr firstnode = NULL, newnode; ssize_t len = 0; size_t n = 0; /* get authorized_keys file */ if ((authfile = open_authfile(username, "r", NULL, msg)) == NULL) { return (NULL); } while((len = getline(&line, &n, authfile)) != -1) { /* get the second space to locate comment/id */ id = strchr((data = strchr(line, ' ')) + 1, ' '); if (id == NULL) { free(line); xmlFreeNodeList(firstnode); *msg = strdup("Invalid authorized key format."); return (NULL); } /* divide comment/id from data... */ id[0] = '\0'; id++; /* ... and data from algorithm */ data[0] = '\0'; data++; /* remove the newline in the end if any */ if (line[len - 1] == '\n') { line[len - 1] = '\0'; } /* create xml data */ newnode = xmlNewNode(ns, BAD_CAST "authorized-key"); xmlNewChild(newnode, ns, BAD_CAST "name", BAD_CAST id); xmlNewChild(newnode, ns, BAD_CAST "key-data", BAD_CAST data); xmlNewChild(newnode, ns, BAD_CAST "algorithm", BAD_CAST line); /* prepare returning node list */ if (firstnode == NULL) { firstnode = newnode; } else { xmlAddSibling(firstnode, newnode); } } free(line); return(firstnode); }
int main() { xmlDocPtr doc; xmlNodePtr racine, premier_prod, nouv_prod; // Ouverture du fichier XML xmlKeepBlanksDefault(0); doc = xmlParseFile("catalogue.xml"); if (doc == NULL) { fprintf(stderr, "Document XML invalide\n"); return EXIT_FAILURE; } // Récupération de la racine racine = xmlDocGetRootElement(doc); if (racine == NULL) { fprintf(stderr, "Document XML vierge\n"); xmlFreeDoc(doc); return EXIT_FAILURE; } // Récupération du premier produit premier_prod = obtenir_premier_produit(doc); if (premier_prod == NULL) { fprintf(stderr, "Impossible de trouver le premier produit\n"); xmlFreeDoc(doc); return EXIT_FAILURE; } // Ajout d'un nouveau produit avant le premier produit (en tête) nouv_prod = creer_produit("CD0YAH", "Autocollant Developpez.com", "0.80"); if (nouv_prod) { xmlAddPrevSibling(premier_prod, nouv_prod); } // Ajout d'un nouveau produit après le premier produit nouv_prod = creer_produit("U0TZ6K", "Lot de 10 autocollants Developpez.com", "5.00"); if (nouv_prod) { xmlAddNextSibling(premier_prod, nouv_prod); } // Ajout d'un nouveau produit en fin/queue nouv_prod = creer_produit("ZQEYAN", "Mug Developpez.com", "4.00"); if (nouv_prod) { xmlAddSibling(premier_prod, nouv_prod); } // Affichage de l'arbre DOM tel qu'il est en mémoire xmlDocFormatDump(stdout, doc, 1); // Libération de la mémoire xmlFreeDoc(doc); return EXIT_SUCCESS; }
/* * call-seq: * node.sibling(node) -> XML::Node * * Add the specified node as a sibling of this node. */ static VALUE rxml_node_sibling_set(VALUE self, VALUE rnode) { xmlNodePtr cnode, pnode, ret; VALUE obj; if (rb_obj_is_kind_of(rnode, cXMLNode) == Qfalse) rb_raise(rb_eTypeError, "Must pass an XML::Node object"); Data_Get_Struct(self, xmlNode, pnode); Data_Get_Struct(rnode, xmlNode, cnode); ret = xmlAddSibling(pnode, cnode); if (ret == NULL) rxml_raise(&xmlLastError); if (ret->_private == NULL) obj = rxml_node_wrap(cXMLNode, ret); else obj = (VALUE) ret->_private; return obj; }
static xmlNodePtr msWFSDumpLayer11(mapObj *map, layerObj *lp, xmlNsPtr psNsOws) { rectObj ext; xmlNodePtr psRootNode, psNode; const char *value = NULL; const char *encoding = NULL; char *encoded=NULL; char *valueToFree; char **tokens; int n=0,i=0; encoding = msOWSLookupMetadata(&(map->web.metadata), "FO", "encoding"); if (!encoding) encoding = "ISO-8859-1"; psRootNode = xmlNewNode(NULL, BAD_CAST "FeatureType"); /*if there is an encoding using it on some of the items*/ psNode = msOWSCommonxmlNewChildEncoded(psRootNode, NULL, "Name", lp->name, encoding); if (lp->name && strlen(lp->name) > 0 && (msIsXMLTagValid(lp->name) == MS_FALSE || isdigit(lp->name[0]))) xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: The layer name '%s' might contain spaces or " "invalid characters or may start with a number. This could lead to potential problems")); value = msOWSLookupMetadata(&(lp->metadata), "FO", "title"); if (!value) value =(const char*)lp->name; psNode = msOWSCommonxmlNewChildEncoded(psRootNode, NULL, "Title", value, encoding); value = msOWSLookupMetadata(&(lp->metadata), "FO", "abstract"); if (value) psNode = msOWSCommonxmlNewChildEncoded(psRootNode, NULL, "Abstract", value, encoding); value = msOWSLookupMetadata(&(lp->metadata), "FO", "keywordlist"); if (value) { if (encoding) encoded = msGetEncodedString(value, encoding); else encoded = msGetEncodedString(value, "ISO-8859-1"); msLibXml2GenerateList( xmlNewChild(psRootNode, psNsOws, BAD_CAST "Keywords", NULL), NULL, "Keyword", encoded, ',' ); msFree(encoded); } /*support DefaultSRS and OtherSRS*/ valueToFree = msOWSGetProjURN(&(map->projection),&(map->web.metadata),"FO",MS_FALSE); if (!valueToFree) valueToFree = msOWSGetProjURN(&(lp->projection), &(lp->metadata), "FO", MS_FALSE); if (valueToFree) { tokens = msStringSplit(valueToFree, ' ', &n); if (tokens && n > 0) { psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "DefaultSRS", BAD_CAST tokens[0]); for (i=1; i<n; i++) psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "OtherSRS", BAD_CAST tokens[i]); msFreeCharArray(tokens, n); } } else xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Mandatory mapfile parameter: (at least one of) MAP.PROJECTION, LAYER.PROJECTION or wfs/ows_srs metadata was missing in this context.")); free(valueToFree); valueToFree = NULL; /*TODO: adevertize only gml3?*/ psNode = xmlNewNode(NULL, BAD_CAST "OutputFormats"); xmlAddChild(psRootNode, psNode); { char *formats_list = msWFSGetOutputFormatList( map, lp, "1.1.0" ); int iformat, n; char **tokens; n = 0; tokens = msStringSplit(formats_list, ',', &n); for( iformat = 0; iformat < n; iformat++ ) xmlNewChild(psNode, NULL, BAD_CAST "Format", BAD_CAST tokens[iformat] ); msFree( formats_list ); msFreeCharArray( tokens, n ); } /*bbox*/ if (msOWSGetLayerExtent(map, lp, "FO", &ext) == MS_SUCCESS) { /*convert to latlong*/ if (lp->projection.numargs > 0) { if (!pj_is_latlong(&lp->projection.proj)) msProjectRect(&lp->projection, NULL, &ext); } else if (map->projection.numargs > 0 && !pj_is_latlong(&map->projection.proj)) msProjectRect(&map->projection, NULL, &ext); xmlAddChild(psRootNode, msOWSCommonWGS84BoundingBox( psNsOws, 2, ext.minx, ext.miny, ext.maxx, ext.maxy)); } else { xmlNewChild(psRootNode, psNsOws, BAD_CAST "WGS84BoundingBox", NULL); xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional WGS84BoundingBox could not be established for this layer. Consider setting the EXTENT in the LAYER object, or wfs_extent metadata. Also check that your data exists in the DATA statement")); } value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_href"); if (value) { psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "MetadataURL", BAD_CAST value); value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_format"); if (!value) value = msStrdup("text/html"); /* default */ xmlNewProp(psNode, BAD_CAST "format", BAD_CAST value); value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_type"); if (!value) value = msStrdup("FGDC"); /* default */ xmlNewProp(psNode, BAD_CAST "type", BAD_CAST value); } return psRootNode; }
xmlNodePtr msWFSDumpLayer11(mapObj *map, layerObj *lp, xmlNsPtr psNsOws, int nWFSVersion, const char* validate_language) { rectObj ext; xmlNodePtr psRootNode, psNode; const char *value = NULL; char *valueToFree; char **tokens; int n=0,i=0; psRootNode = xmlNewNode(NULL, BAD_CAST "FeatureType"); /* add namespace to layer name */ value = msOWSLookupMetadata(&(map->web.metadata), "FO", "namespace_prefix"); /* FIXME? Should probably be applied to WFS 1.1 as well, but the addition */ /* of the prefix can be disruptive for clients */ if( value == NULL && nWFSVersion >= OWS_2_0_0 ) value = MS_DEFAULT_NAMESPACE_PREFIX; if(value) { n = strlen(value)+strlen(lp->name)+1+1; valueToFree = (char *) msSmallMalloc(sizeof(char*)*n); snprintf(valueToFree, n, "%s%s%s", (value ? value : ""), (value ? ":" : ""), lp->name); psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "Name", BAD_CAST valueToFree); msFree(valueToFree); } else { psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "Name", BAD_CAST lp->name); } if (lp->name && strlen(lp->name) > 0 && (msIsXMLTagValid(lp->name) == MS_FALSE || isdigit(lp->name[0]))) { char szTmp[512]; snprintf(szTmp, sizeof(szTmp), "WARNING: The layer name '%s' might contain spaces or " "invalid characters or may start with a number. This could lead to potential problems", lp->name); xmlAddSibling(psNode, xmlNewComment(BAD_CAST szTmp)); } value = msOWSLookupMetadataWithLanguage(&(lp->metadata), "FO", "title", validate_language); if (!value) value =(const char*)lp->name; psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "Title", BAD_CAST value); value = msOWSLookupMetadataWithLanguage(&(lp->metadata), "FO", "abstract", validate_language); if (value) psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "Abstract", BAD_CAST value); value = msOWSLookupMetadataWithLanguage(&(lp->metadata), "FO", "keywordlist", validate_language); if(value) msLibXml2GenerateList( xmlNewChild(psRootNode, psNsOws, BAD_CAST "Keywords", NULL), NULL, "Keyword", value, ',' ); /*support DefaultSRS and OtherSRS*/ valueToFree = msOWSGetProjURN(&(map->projection),&(map->web.metadata),"FO",MS_FALSE); if (!valueToFree) valueToFree = msOWSGetProjURN(&(lp->projection), &(lp->metadata), "FO", MS_FALSE); if (valueToFree) { tokens = msStringSplit(valueToFree, ' ', &n); if (tokens && n > 0) { if( nWFSVersion == OWS_1_1_0 ) psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "DefaultSRS", BAD_CAST tokens[0]); else psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "DefaultCRS", BAD_CAST tokens[0]); for (i=1; i<n; i++) { if( nWFSVersion == OWS_1_1_0 ) psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "OtherSRS", BAD_CAST tokens[i]); else psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "OtherCRS", BAD_CAST tokens[i]); } msFreeCharArray(tokens, n); } } else xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Mandatory mapfile parameter: (at least one of) MAP.PROJECTION, LAYER.PROJECTION or wfs/ows_srs metadata was missing in this context.")); free(valueToFree); valueToFree = NULL; /*TODO: adevertize only gml3?*/ psNode = xmlNewNode(NULL, BAD_CAST "OutputFormats"); xmlAddChild(psRootNode, psNode); { char *formats_list = msWFSGetOutputFormatList( map, lp, nWFSVersion ); int iformat, n; char **tokens; n = 0; tokens = msStringSplit(formats_list, ',', &n); for( iformat = 0; iformat < n; iformat++ ) xmlNewChild(psNode, NULL, BAD_CAST "Format", BAD_CAST tokens[iformat] ); msFree( formats_list ); msFreeCharArray( tokens, n ); } /*bbox*/ if (msOWSGetLayerExtent(map, lp, "FO", &ext) == MS_SUCCESS) { /*convert to latlong*/ if (lp->projection.numargs > 0) msOWSProjectToWGS84(&lp->projection, &ext); else msOWSProjectToWGS84(&map->projection, &ext); xmlAddChild(psRootNode, msOWSCommonWGS84BoundingBox( psNsOws, 2, ext.minx, ext.miny, ext.maxx, ext.maxy)); } else { xmlNewChild(psRootNode, psNsOws, BAD_CAST "WGS84BoundingBox", NULL); xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional WGS84BoundingBox could not be established for this layer. Consider setting the EXTENT in the LAYER object, or wfs_extent metadata. Also check that your data exists in the DATA statement")); } value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_href"); if (value) { if( nWFSVersion >= OWS_2_0_0 ) { psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "MetadataURL", NULL); xmlNewProp(psNode, BAD_CAST "xlink:href", BAD_CAST value); value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_about"); if( value != NULL ) xmlNewProp(psNode, BAD_CAST "about", BAD_CAST value); } else { psNode = xmlNewChild(psRootNode, NULL, BAD_CAST "MetadataURL", BAD_CAST value); value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_format"); if (!value) value = msStrdup("text/html"); /* default */ xmlNewProp(psNode, BAD_CAST "format", BAD_CAST value); value = msOWSLookupMetadata(&(lp->metadata), "FO", "metadataurl_type"); if (!value) value = msStrdup("FGDC"); /* default */ xmlNewProp(psNode, BAD_CAST "type", BAD_CAST value); } } return psRootNode; }
/** * gstyle_palette_save_to_xml: * @self: a #GstylePalette * @file: a #GFile * @error: (nullable): a #GError location or %NULL * * Save a palette to Gnome-Builder .xml palette format. * * Returns: %TRUE if succesfull, %FALSE otherwise. */ gboolean gstyle_palette_save_to_xml (GstylePalette *self, GFile *file, GError **error) { g_autofree gchar *file_path = NULL; const gchar *id; const gchar *name; xmlDocPtr doc; xmlNodePtr root_node; xmlNodePtr palette_node; xmlNodePtr color_node; gint n_colors; gint succes; gchar *header = "Copyright (C) 2016 GNOME Builder Team at irc.gimp.net/#gnome-builder\n" \ "This program is free software: you can redistribute it and/or modify\n" \ "it under the terms of the GNU General Public License as published by\n" \ "the Free Software Foundation, either version 3 of the License, or\n" \ "(at your option) any later version.\n\n" \ "This program is distributed in the hope that it will be useful,\n" \ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" \ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" \ "GNU General Public License for more details.\n\n" \ "You should have received a copy of the GNU General Public License\n" \ "along with this program. If not, see <http://www.gnu.org/licenses/>\n"; g_return_val_if_fail (GSTYLE_IS_PALETTE (self), FALSE); g_return_val_if_fail (G_IS_FILE (file), FALSE); doc = xmlNewDoc(CHAR_TO_XML ("1.0")); root_node = xmlNewDocComment (doc, CHAR_TO_XML (header)); xmlDocSetRootElement(doc, root_node); palette_node = xmlNewNode (NULL, CHAR_TO_XML ("palette")); xmlAddSibling (root_node, palette_node); id = gstyle_palette_get_id (self); name = gstyle_palette_get_name (self); xmlNewProp (palette_node, CHAR_TO_XML ("id"), CHAR_TO_XML (id)); if (self->gettext_domain) { xmlNewProp (palette_node, CHAR_TO_XML ("_name"), CHAR_TO_XML (name)); xmlNewProp (palette_node, CHAR_TO_XML ("gettext-domain"), CHAR_TO_XML (self->gettext_domain)); } else xmlNewProp (palette_node, CHAR_TO_XML ("name"), CHAR_TO_XML (name)); n_colors = gstyle_palette_get_len (self); for (gint i = 0; i < n_colors; ++i) { const GstyleColor *color; const gchar *color_name; g_autofree gchar *color_string = NULL; color = gstyle_palette_get_color_at_index (self, i); color_name = gstyle_color_get_name ((GstyleColor *)color); if (gstyle_color_get_kind ((GstyleColor *)color) == GSTYLE_COLOR_KIND_PREDEFINED) color_string = gstyle_color_to_string ((GstyleColor *)color, GSTYLE_COLOR_KIND_RGB_HEX6); else color_string = gstyle_color_to_string ((GstyleColor *)color, GSTYLE_COLOR_KIND_ORIGINAL); color_node = xmlNewChild (palette_node, NULL, CHAR_TO_XML ("color"), NULL); xmlNewProp (color_node, CHAR_TO_XML ("name"), CHAR_TO_XML (color_name)); xmlNewProp (color_node, CHAR_TO_XML ("value"), CHAR_TO_XML (color_string)); } file_path = g_file_get_path (file); succes = xmlSaveFormatFileEnc (file_path, doc, "UTF-8", 1); xmlFreeDoc(doc); if (succes == -1) { g_set_error (error, GSTYLE_PALETTE_ERROR, GSTYLE_PALETTE_ERROR_FILE, _("Unable to save %s\n"), file_path); return FALSE; } else { gstyle_palette_set_changed (self, FALSE); return TRUE; } }
static DiaSvgRenderer * new_svg_renderer(DiagramData *data, const char *filename) { DiaSvgRenderer *renderer; SvgRenderer *svg_renderer; FILE *file; gchar buf[512]; time_t time_now; Rectangle *extent; const char *name; xmlDtdPtr dtd; file = g_fopen(filename, "w"); if (file==NULL) { message_error(_("Can't open output file %s: %s\n"), dia_message_filename(filename), strerror(errno)); return NULL; } fclose(file); /* we need access to our base object */ renderer = DIA_SVG_RENDERER (g_object_new(SVG_TYPE_RENDERER, NULL)); renderer->filename = g_strdup(filename); renderer->dash_length = 1.0; renderer->dot_length = 0.2; renderer->saved_line_style = LINESTYLE_SOLID; /* apparently most svg readers don't like small values, especially not in the viewBox attribute */ renderer->scale = 20.0; /* set up the root node */ renderer->doc = xmlNewDoc((const xmlChar *)"1.0"); renderer->doc->encoding = xmlStrdup((const xmlChar *)"UTF-8"); renderer->doc->standalone = FALSE; dtd = xmlCreateIntSubset(renderer->doc, (const xmlChar *)"svg", (const xmlChar *)"-//W3C//DTD SVG 1.0//EN", (const xmlChar *)"http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd"); xmlAddChild((xmlNodePtr) renderer->doc, (xmlNodePtr) dtd); renderer->root = xmlNewDocNode(renderer->doc, NULL, (const xmlChar *)"svg", NULL); xmlAddSibling(renderer->doc->children, (xmlNodePtr) renderer->root); /* add namespaces to make strict parsers happy, e.g. Firefox */ svg_renderer = SVG_RENDERER (renderer); /* set the extents of the SVG document */ extent = &data->extents; g_snprintf(buf, sizeof(buf), "%dcm", (int)ceil((extent->right - extent->left))); xmlSetProp(renderer->root, (const xmlChar *)"width", (xmlChar *) buf); g_snprintf(buf, sizeof(buf), "%dcm", (int)ceil((extent->bottom - extent->top))); xmlSetProp(renderer->root, (const xmlChar *)"height", (xmlChar *) buf); g_snprintf(buf, sizeof(buf), "%d %d %d %d", (int)floor(extent->left * renderer->scale), (int)floor(extent->top * renderer->scale), (int)ceil((extent->right - extent->left) * renderer->scale), (int)ceil((extent->bottom - extent->top) * renderer->scale)); xmlSetProp(renderer->root, (const xmlChar *)"viewBox", (xmlChar *) buf); xmlSetProp(renderer->root,(const xmlChar *)"xmlns", (const xmlChar *)"http://www.w3.org/2000/svg"); xmlSetProp(renderer->root,(const xmlChar *)"xmlns", (const xmlChar *)"http://www.w3.org/2000/svg"); xmlSetProp(renderer->root,(const xmlChar *)"xmlns:xlink", (const xmlChar *)"http://www.w3.org/1999/xlink"); time_now = time(NULL); name = g_get_user_name(); #if 0 /* some comments at the top of the file ... */ xmlAddChild(renderer->root, xmlNewText("\n")); xmlAddChild(renderer->root, xmlNewComment("Dia-Version: "VERSION)); xmlAddChild(renderer->root, xmlNewText("\n")); g_snprintf(buf, sizeof(buf), "File: %s", dia->filename); xmlAddChild(renderer->root, xmlNewComment(buf)); xmlAddChild(renderer->root, xmlNewText("\n")); g_snprintf(buf, sizeof(buf), "Date: %s", ctime(&time_now)); buf[strlen(buf)-1] = '\0'; /* remove the trailing new line */ xmlAddChild(renderer->root, xmlNewComment(buf)); xmlAddChild(renderer->root, xmlNewText("\n")); g_snprintf(buf, sizeof(buf), "For: %s", name); xmlAddChild(renderer->root, xmlNewComment(buf)); xmlAddChild(renderer->root, xmlNewText("\n\n")); xmlNewChild(renderer->root, NULL, "title", dia->filename); #endif return renderer; }
xmlNodePtr msOWSCommonServiceIdentification(xmlNsPtr psNsOws, mapObj *map, const char *servicetype, const char *version, const char *namespaces) { const char *value = NULL; xmlNodePtr psRootNode = NULL; xmlNodePtr psNode = NULL; if (_validateNamespace(psNsOws) == MS_FAILURE) psNsOws = xmlNewNs(psRootNode, BAD_CAST MS_OWSCOMMON_OWS_NAMESPACE_URI, BAD_CAST MS_OWSCOMMON_OWS_NAMESPACE_PREFIX); /* create element name */ psRootNode = xmlNewNode(psNsOws, BAD_CAST "ServiceIdentification"); /* add child elements */ value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "title"); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "Title", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_title\" missing for ows:Title")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "abstract"); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "Abstract", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_abstract\" was missing for ows:Abstract")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "keywordlist"); if (value) { psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "Keywords", NULL); msLibXml2GenerateList(psNode, psNsOws, "Keyword", value, ','); } else { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_keywordlist\" was missing for ows:KeywordList")); } psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "ServiceType", BAD_CAST servicetype); xmlNewProp(psNode, BAD_CAST "codeSpace", BAD_CAST MS_OWSCOMMON_OGC_CODESPACE); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "ServiceTypeVersion", BAD_CAST version); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "fees"); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "Fees", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_fees\" was missing for ows:Fees")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "accessconstraints"); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "AccessConstraints", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_accessconstraints\" was missing for ows:AccessConstraints")); } return psRootNode; }
xmlNodePtr msOWSCommonServiceProvider(xmlNsPtr psNsOws, xmlNsPtr psNsXLink, mapObj *map, const char *namespaces) { const char *value = NULL; xmlNodePtr psNode = NULL; xmlNodePtr psRootNode = NULL; xmlNodePtr psSubNode = NULL; xmlNodePtr psSubSubNode = NULL; xmlNodePtr psSubSubSubNode = NULL; if (_validateNamespace(psNsOws) == MS_FAILURE) psNsOws = xmlNewNs(psRootNode, BAD_CAST MS_OWSCOMMON_OWS_NAMESPACE_URI, BAD_CAST MS_OWSCOMMON_OWS_NAMESPACE_PREFIX); psRootNode = xmlNewNode(psNsOws, BAD_CAST "ServiceProvider"); /* add child elements */ value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactorganization"); psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "ProviderName", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Mandatory metadata \"ows_contactorganization\" was missing for ows:ProviderName")); } psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "ProviderSite", NULL); xmlNewNsProp(psNode, psNsXLink, BAD_CAST "type", BAD_CAST "simple"); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "service_onlineresource"); xmlNewNsProp(psNode, psNsXLink, BAD_CAST "href", BAD_CAST value); if (!value) { xmlAddSibling(psNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_service_onlineresource\" was missing for ows:ProviderSite/@xlink:href")); } psNode = xmlNewChild(psRootNode, psNsOws, BAD_CAST "ServiceContact", NULL); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactperson"); psSubNode = xmlNewChild(psNode, psNsOws, BAD_CAST "IndividualName", BAD_CAST value); if (!value) { xmlAddSibling(psSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactperson\" was missing for ows:IndividualName")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactposition"); psSubNode = xmlNewChild(psNode, psNsOws, BAD_CAST "PositionName", BAD_CAST value); if (!value) { xmlAddSibling(psSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactposition\" was missing for ows:PositionName")); } psSubNode = xmlNewChild(psNode, psNsOws, BAD_CAST "ContactInfo", NULL); psSubSubNode = xmlNewChild(psSubNode, psNsOws, BAD_CAST "Phone", NULL); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactvoicetelephone"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "Voice", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactvoicetelephone\" was missing for ows:Voice")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactfacsimiletelephone"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "Facsimile", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactfacsimiletelephone\" was missing for ows:Facsimile")); } psSubSubNode = xmlNewChild(psSubNode, psNsOws, BAD_CAST "Address", NULL); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "address"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "DeliveryPoint", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_address\" was missing for ows:DeliveryPoint")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "city"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "City", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_city\" was missing for ows:City")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "stateorprovince"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "AdministrativeArea", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_stateorprovince\" was missing for ows:AdministrativeArea")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "postcode"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "PostalCode", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_postcode\" was missing for ows:PostalCode")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "country"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "Country", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_country\" was missing for ows:Country")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactelectronicmailaddress"); psSubSubSubNode = xmlNewChild(psSubSubNode, psNsOws, BAD_CAST "ElectronicMailAddress", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactelectronicmailaddress\" was missing for ows:ElectronicMailAddress")); } psSubSubNode = xmlNewChild(psSubNode, psNsOws, BAD_CAST "OnlineResource", NULL); xmlNewNsProp(psSubSubNode, psNsXLink, BAD_CAST "type", BAD_CAST "simple"); value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "service_onlineresource"); xmlNewNsProp(psSubSubNode, psNsXLink, BAD_CAST "href", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_service_onlineresource\" was missing for ows:OnlineResource/@xlink:href")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "hoursofservice"); psSubSubNode = xmlNewChild(psSubNode, psNsOws, BAD_CAST "HoursOfService", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_hoursofservice\" was missing for ows:HoursOfService")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "contactinstructions"); psSubSubNode = xmlNewChild(psSubNode, psNsOws, BAD_CAST "ContactInstructions", BAD_CAST value); if (!value) { xmlAddSibling(psSubSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_contactinstructions\" was missing for ows:ContactInstructions")); } value = msOWSLookupMetadata(&(map->web.metadata), namespaces, "role"); psSubNode = xmlNewChild(psNode, psNsOws, BAD_CAST "Role", BAD_CAST value); if (!value) { xmlAddSibling(psSubNode, xmlNewComment(BAD_CAST "WARNING: Optional metadata \"ows_role\" was missing for ows:Role")); } return psRootNode; }
/* This function replaces processingInstruction */ void mxslt_sax_processing_instruction(void * ctx, const xmlChar * target, const xmlChar * data) { xmlParserCtxtPtr ctxt=(xmlParserCtxtPtr)ctx; mxslt_doc_t * document=(mxslt_get_state()->document); mxslt_pi_style_t * style_pi; mxslt_pi_param_t * param_pi; mxslt_pi_base_t * base_pi; char * type = NULL, * tmp; xmlNodePtr pi; int status; /* WARNING: don't change this array! Look below! */ static const mxslt_attr_search_t xml_stylesheet[] = { { (xmlChar *)"href", mxslt_sizeof_str("href") }, { (xmlChar *)"media", mxslt_sizeof_str("media") }, { (xmlChar *)"type", mxslt_sizeof_str("type") } }; /* WARNING: don't change this array! Look below! */ static const mxslt_attr_search_t mxslt_param[] = { { (xmlChar *)"name", mxslt_sizeof_str("name") }, { (xmlChar *)"value", mxslt_sizeof_str("value") } }; /* WARNING: don't change this array! Look below! */ static const mxslt_attr_search_t mxslt_base[] = { { (xmlChar *)"value", mxslt_sizeof_str("value") } }; /* This array _must_ have the same number of elements * as the array xml_stylesheet */ char * xml_stylesheet_values[] = { NULL, NULL, NULL }; enum xml_stylesheet_types { t_href=0, t_media, t_type }; /* This array _must_ have the same number of elements * as the array mxslt_param */ char * mxslt_param_values[] = { NULL, NULL }; enum mxslt_param_types { t_name=0, t_select }; /* This array _must_ have the same number of elements * as the array mxslt_base */ char * mxslt_base_values[] = { NULL }; enum mxslt_base_types { t_value=0 }; mxslt_doc_debug_print(document, MXSLT_DBG_LIBXML, "processing instruction \"%s\", attributes |%s|\n", target, data); /* Ignore pi when we're parsing the stylesheet */ if(document->flags & MXSLT_STYLE) return; /* Create a new pi node */ pi=xmlNewPI(target, data); if(!pi) return; /* Check if target is a known pi */ switch(target[0]) { case 'x': if(!xmlStrEqual(target+1, (xmlChar *)"xml-stylesheet"+1)) break; /* Get href, type and media from attribute list */ status=mxslt_get_static_attr((char *)data, xml_stylesheet, xml_stylesheet_values, mxslt_sizeof_array(xml_stylesheet)); if(status != MXSLT_OK) { if(xml_stylesheet_values[0]) xfree(xml_stylesheet_values[0]); if(xml_stylesheet_values[1]) xfree(xml_stylesheet_values[1]); if(xml_stylesheet_values[2]) xfree(xml_stylesheet_values[2]); goto error; } if(xml_stylesheet_values[t_type] && xml_stylesheet_values[t_href]) { /* Decode type */ type=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_type], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); /* Skip blanks before type */ for(tmp=type; MXSLT_IS_BLANK(*tmp); tmp++) ; /* compare type string */ if(!strncmp(tmp, "text/xml", mxslt_sizeof_str("text/xml")) || !strncmp(tmp, "text/xsl", mxslt_sizeof_str("text/xsl"))) { /* trailing spaces are allowed */ for(tmp+=mxslt_sizeof_str("text/x?l"); MXSLT_IS_BLANK(*tmp); tmp++) ; /* Check there's nothing else beside them */ if(*tmp != '\0') { xmlFree(type); break; } /* Type is ok, add parameter to processing * instruction */ style_pi=(mxslt_pi_style_t *)xmalloc(sizeof(mxslt_pi_style_t)); style_pi->type=MXSLT_PI_STDST; style_pi->ctype=type; style_pi->href=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_href], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); if(xml_stylesheet_values[t_media]) style_pi->media=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_media], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); else style_pi->media=NULL; /* tie up xmlNode and style_pi */ XML_LINK_PI(document, pi, style_pi); } else { mxslt_error(document, "warning - <xml-stylesheet type=\"... unknown: '%s'!\n", type); xmlFree(type); } } else { if(!xml_stylesheet_values[t_href]) mxslt_error(document, "warning - <xml-stylesheet href=\"... is missing, skipping PI!\n"); if(!xml_stylesheet_values[t_type]) mxslt_error(document, "warning - <xml-stylesheet type=\"... is missing, skipping PI!\n"); } if(xml_stylesheet_values[t_media]) xfree(xml_stylesheet_values[t_media]); if(xml_stylesheet_values[t_href]) xfree(xml_stylesheet_values[t_href]); if(xml_stylesheet_values[t_type]) xfree(xml_stylesheet_values[t_type]); break; case 'm': if(target[1] != 'o' || target[2] != 'd' || target[3] != 'x' || target[4] != 's' || target[5] != 'l' || target[6] != 't' || target[7] != '-') break; switch(target[8]) { case 'b': if(!xmlStrEqual(target+8, (xmlChar *)"modxslt-base"+8)) { mxslt_error(document, "warning - unknown modxslt PI: %s in %s\n", target, document->localfile); break; } /* Read modxslt-base */ status=mxslt_get_static_attr((char *)data, mxslt_base, mxslt_base_values, mxslt_sizeof_array(mxslt_base)); if(status != MXSLT_OK) { if(mxslt_base_values[0]) xfree(mxslt_base_values[0]); goto error; } /* Verify we got the base */ if(!mxslt_base_values[0]) { mxslt_error(document, "warning - <modxslt-base ... base=\" is missing, skipping PI\n", target, document->localfile); break; } /* Remember the pi we found */ base_pi=(mxslt_pi_base_t *)(xmalloc(sizeof(mxslt_pi_base_t))); base_pi->type=MXSLT_PI_UBASE; base_pi->file=(char *)xmlCanonicPath((xmlChar *)mxslt_base_values[0]); base_pi->directory=xmlParserGetDirectory(mxslt_base_values[0]); xfree(mxslt_base_values[0]); /* Switch base in the current context */ if(ctxt->input->filename) xmlFree((char *)ctxt->input->filename); if(ctxt->directory) xmlFree(ctxt->directory); /* Remember those information */ ctxt->input->filename=(char *)xmlStrdup((xmlChar *)base_pi->file); ctxt->directory=(char *)xmlStrdup((xmlChar *)base_pi->directory); /* tie up xmlNode and style_pi */ XML_LINK_PI(document, pi, base_pi); break; case 'p': if(!xmlStrEqual(target+8, (xmlChar *)"modxslt-param"+8)) { mxslt_error(document, "warning - unknown modxslt PI: %s in %s\n", target, document->localfile); break; } status=mxslt_get_static_attr((char *)data, mxslt_param, mxslt_param_values, mxslt_sizeof_array(mxslt_param)); if(status != MXSLT_OK) { if(mxslt_param_values[0]) xfree(mxslt_param_values[0]); if(mxslt_param_values[1]) xfree(mxslt_param_values[1]); goto error; } if(mxslt_param_values[t_name]) { /* Allocate and create pi */ param_pi=(mxslt_pi_param_t *)xmalloc(sizeof(mxslt_pi_param_t)); param_pi->type=MXSLT_PI_PARAM; param_pi->param=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)mxslt_param_values[t_name], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); param_pi->value=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)mxslt_param_values[t_select], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); /* Link pi to list of pis */ XML_LINK_PI(document, pi, param_pi); } else { mxslt_error(document, "warning - modxslt-param specified without ``name'' attribute in `%s'\n", document->localfile); } /* Free memory up */ if(mxslt_param_values[t_select]) xfree(mxslt_param_values[t_select]); if(mxslt_param_values[t_name]) xfree(mxslt_param_values[t_name]); break; case 's': if(!xmlStrEqual(target+8, (xmlChar *)"modxslt-stylesheet"+8)) { mxslt_error(document, "warning - unknown modxslt PI: %s in %s\n", target, document->localfile); break; } status=mxslt_get_static_attr((char *)data, xml_stylesheet, xml_stylesheet_values, mxslt_sizeof_array(xml_stylesheet)); if(status != MXSLT_OK) { if(xml_stylesheet_values[0]) xfree(xml_stylesheet_values[0]); if(xml_stylesheet_values[1]) xfree(xml_stylesheet_values[1]); if(xml_stylesheet_values[2]) xfree(xml_stylesheet_values[2]); goto error; } if(xml_stylesheet_values[t_type]) { /* Decode type */ type=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_type], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); /* Skip blanks before type */ for(tmp=type; MXSLT_IS_BLANK(*tmp); tmp++) ; /* compare type string */ if(!strncmp(tmp, "text/xml", mxslt_sizeof_str("text/xml")) || !strncmp(tmp, "text/xsl", mxslt_sizeof_str("text/xsl"))) { /* trailing spaces are allowed */ for(tmp+=mxslt_sizeof_str("text/x?l"); MXSLT_IS_BLANK(*tmp); tmp++) ; /* Check there's nothing else beside them */ if(*tmp != '\0') { mxslt_error(document, "warning - <modxslt-stylesheet type=\"... trailing junk: '%s'!\n", type); xmlFree(type); break; } /* Type is ok, add parameter to processing * instruction */ style_pi=(mxslt_pi_style_t *)xmalloc(sizeof(mxslt_pi_style_t)); style_pi->type=MXSLT_PI_MODST; style_pi->ctype=type; if(xml_stylesheet_values[t_href]) style_pi->href=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_href], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); else style_pi->href=NULL; if(xml_stylesheet_values[t_media]) style_pi->media=(char *)xmlStringDecodeEntities(ctxt, (xmlChar *)xml_stylesheet_values[t_media], XML_SUBSTITUTE_REF|XML_SUBSTITUTE_PEREF, 0, 0, 0); else style_pi->media=NULL; /* Link to nodes chain */ XML_LINK_PI(document, pi, style_pi); } else { mxslt_error(document, "warning - <modxslt-stylesheet type=\"... unknown: '%s'!\n", type); xmlFree(type); } } if(xml_stylesheet_values[t_media]) xfree(xml_stylesheet_values[t_media]); if(xml_stylesheet_values[t_href]) xfree(xml_stylesheet_values[t_href]); if(xml_stylesheet_values[t_type]) xfree(xml_stylesheet_values[t_type]); break; default: mxslt_error(document, "warning - unknown modxslt PI: %s in %s\n", target, document->localfile); break; } break; } /* Taken from `processingInstruction' */ switch(ctxt->inSubset) { case 1: xmlAddChild((xmlNodePtr)ctxt->myDoc->intSubset, pi); return; case 2: xmlAddChild((xmlNodePtr)ctxt->myDoc->extSubset, pi); return; } if(!ctxt->myDoc->children || !ctxt->node) { xmlAddChild((xmlNodePtr)ctxt->myDoc, pi); return; } if(ctxt->node->type == XML_ELEMENT_NODE) xmlAddChild(ctxt->node, pi); else xmlAddSibling(ctxt->node, pi); return; error: mxslt_error(document, "warning - weird data while processing PI: %s in %s\n", target, document->localfile); xmlFreeNode(pi); return; }