xml/libxml2libs/src/libxml2/libxml2_xlink.c
changeset 0 e35f40988205
child 20 889504eac4fb
equal deleted inserted replaced
-1:000000000000 0:e35f40988205
       
     1 /*
       
     2  * libxml2_xlink.c : implementation of the hyperlinks detection module
       
     3  *                   This version supports both XML XLinks and HTML simple links
       
     4  *
       
     5  * See Copyright for the status of this software.
       
     6  *
       
     7  * daniel@veillard.com
       
     8  * Portion Copyright © 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. 
       
     9  */
       
    10 
       
    11 #define IN_LIBXML
       
    12 #include "xmlenglibxml.h"
       
    13 
       
    14 #ifdef LIBXML_XPTR_ENABLED
       
    15 #include <string.h> /* for memset() only */
       
    16 #ifdef HAVE_CTYPE_H
       
    17 #include <ctype.h>
       
    18 #endif
       
    19 #ifdef HAVE_STDLIB_H
       
    20 #include <stdlib.h>
       
    21 #endif
       
    22 #ifdef HAVE_SYS_STAT_H
       
    23 #include <sys/stat.h>
       
    24 #endif
       
    25 #ifdef HAVE_FCNTL_H
       
    26 #include <fcntl.h>
       
    27 #endif
       
    28 #ifdef HAVE_UNISTD_H
       
    29 #include <unistd.h>
       
    30 #endif
       
    31 #ifdef HAVE_ZLIB_H
       
    32 #include <zlib.h>
       
    33 #endif
       
    34 
       
    35 #include <libxml2_xmlmemory.h>
       
    36 #include <libxml2_tree.h>
       
    37 #include <libxml2_parser.h>
       
    38 #include <libxml2_valid.h>
       
    39 #include <libxml2_xlink.h>
       
    40 #include <libxml2_globals.h>
       
    41 
       
    42 #define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/")
       
    43 #define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/")
       
    44 
       
    45 /****************************************************************
       
    46  *                                                              *
       
    47  *           Default setting and related functions              *
       
    48  *                                                              *
       
    49  ****************************************************************/
       
    50 
       
    51 /**
       
    52  * xlinkGetDefaultHandler:
       
    53  *
       
    54  * Get the default xlink handler.
       
    55  *
       
    56  * Returns the current xlinkHandlerPtr value.
       
    57  */
       
    58 xlinkHandlerPtr
       
    59 xlinkGetDefaultHandler(void) {
       
    60     return(xlinkDefaultHandler);
       
    61 }
       
    62 
       
    63 
       
    64 /**
       
    65  * xlinkSetDefaultHandler:
       
    66  * @param handler the new value for the xlink handler block
       
    67  *
       
    68  * Set the default xlink handlers
       
    69  */
       
    70 void
       
    71 xlinkSetDefaultHandler(xlinkHandlerPtr handler) {
       
    72     xlinkDefaultHandler = handler;
       
    73 }
       
    74 
       
    75 /**
       
    76  * xlinkGetDefaultDetect:
       
    77  *
       
    78  * Get the default xlink detection routine
       
    79  *
       
    80  * Returns the current function or NULL;
       
    81  */
       
    82 xlinkNodeDetectFunc
       
    83 xlinkGetDefaultDetect   (void) {
       
    84     return(xlinkDefaultDetect);
       
    85 }
       
    86 
       
    87 /**
       
    88  * xlinkSetDefaultDetect:
       
    89  * @param func pointer to the new detection routine.
       
    90  *
       
    91  * Set the default xlink detection routine
       
    92  */
       
    93 void
       
    94 xlinkSetDefaultDetect   (xlinkNodeDetectFunc func) {
       
    95     xlinkDefaultDetect = func;
       
    96 }
       
    97 
       
    98 /****************************************************************
       
    99  *                                                              *
       
   100  *                  The detection routines                      *
       
   101  *                                                              *
       
   102  ****************************************************************/
       
   103 
       
   104 
       
   105 /**
       
   106  * xlinkIsLink:
       
   107  * @param doc the document containing the node
       
   108  * @param node the node pointer itself
       
   109  *
       
   110  * Check whether the given node carries the attributes needed
       
   111  * to be a link element (or is one of the linking elements issued
       
   112  * from the (X)HTML DtDs).
       
   113  * This routine don't try to do full checking of the link validity
       
   114  * but tries to detect and return the appropriate link type.
       
   115  *
       
   116  * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no
       
   117  *         link detected.
       
   118  */
       
   119 xlinkType
       
   120 xlinkIsLink     (xmlDocPtr doc, xmlNodePtr node) {
       
   121     xmlChar *type = NULL, *role = NULL;
       
   122     xlinkType ret = XLINK_TYPE_NONE;
       
   123 
       
   124     if (node == NULL) return(XLINK_TYPE_NONE);
       
   125     if (doc == NULL) doc = node->doc;
       
   126     if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
       
   127         /*
       
   128          * This is an HTML document.
       
   129          */
       
   130     } else if ((node->ns != NULL) &&
       
   131                (xmlStrEqual(node->ns->href, XHTML_NAMESPACE))) {
       
   132         /*
       
   133          * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@
       
   134          */
       
   135         /*
       
   136          * This is an XHTML element within an XML document
       
   137          * Check whether it's one of the element able to carry links
       
   138          * and in that case if it holds the attributes.
       
   139          */
       
   140     }
       
   141 
       
   142     /*
       
   143      * We don't prevent a-priori having XML Linking constructs on
       
   144      * XHTML elements
       
   145      */
       
   146     type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE);
       
   147     if (type != NULL) {
       
   148         if (xmlStrEqual(type, BAD_CAST "simple")) {
       
   149             ret = XLINK_TYPE_SIMPLE;
       
   150         } if (xmlStrEqual(type, BAD_CAST "extended")) {
       
   151             role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE);
       
   152             if (role != NULL) {
       
   153                 xmlNsPtr xlink;
       
   154                 xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE);
       
   155                 if (xlink == NULL) {
       
   156                     /* Humm, fallback method */
       
   157                     if (xmlStrEqual(role, BAD_CAST"xlink:external-linkset"))
       
   158                         ret = XLINK_TYPE_EXTENDED_SET;
       
   159                 } else {
       
   160                     xmlChar buf[200];
       
   161                     snprintf((char *) buf, sizeof(buf), "%s:external-linkset",
       
   162                              (char *) xlink->prefix);
       
   163                     buf[sizeof(buf) - 1] = 0;
       
   164                     if (xmlStrEqual(role, buf))
       
   165                         ret = XLINK_TYPE_EXTENDED_SET;
       
   166 
       
   167                 }
       
   168 
       
   169             }
       
   170             ret = XLINK_TYPE_EXTENDED;
       
   171         }
       
   172     }
       
   173 
       
   174     if (type != NULL) xmlFree(type);
       
   175     if (role != NULL) xmlFree(role);
       
   176     return(ret);
       
   177 }
       
   178 #endif /* LIBXML_XPTR_ENABLED */