xlink.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2.  * 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@w3.org
  8.  */
  9. #ifdef WIN32
  10. #include "win32config.h"
  11. #else
  12. #include "config.h"
  13. #endif
  14. #include <stdio.h>
  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. #include <libxml/xmlmemory.h>
  35. #include <libxml/tree.h>
  36. #include <libxml/parser.h>
  37. #include <libxml/valid.h>
  38. #include <libxml/xlink.h>
  39. #define XLINK_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xlink/namespace/")
  40. #define XHTML_NAMESPACE (BAD_CAST "http://www.w3.org/1999/xhtml/")
  41. /****************************************************************
  42.  * *
  43.  *           Default setting and related functions *
  44.  * *
  45.  ****************************************************************/
  46.  
  47. xlinkHandlerPtr xlinkDefaultHandler = NULL;
  48. xlinkNodeDetectFunc xlinkDefaultDetect = NULL;
  49. /**
  50.  * xlinkGetDefaultHandler:
  51.  *
  52.  * Get the default xlink handler.
  53.  *
  54.  * Returns the current xlinkHandlerPtr value.
  55.  */
  56. xlinkHandlerPtr
  57. xlinkGetDefaultHandler(void) {
  58.     return(xlinkDefaultHandler);
  59. }
  60. /**
  61.  * xlinkGetDefaultHandler:
  62.  * @handler:  the new value for the xlink handler block
  63.  *
  64.  * Set the default xlink handlers
  65.  */
  66. void
  67. xlinkSetDefaultHandler(xlinkHandlerPtr handler) {
  68.     xlinkDefaultHandler = handler;
  69. }
  70. /**
  71.  * xlinkGetDefaultDetect:
  72.  *
  73.  * Get the default xlink detection routine
  74.  *
  75.  * Returns the current function or NULL;
  76.  */
  77. xlinkNodeDetectFunc
  78. xlinkGetDefaultDetect (void) {
  79.     return(xlinkDefaultDetect);
  80. }
  81. /**
  82.  * xlinkSetDefaultDetect:
  83.  * @func: pointer to the new detction routine.
  84.  *
  85.  * Set the default xlink detection routine
  86.  */
  87. void 
  88. xlinkSetDefaultDetect (xlinkNodeDetectFunc func) {
  89.     xlinkDefaultDetect = func;
  90. }
  91. /****************************************************************
  92.  * *
  93.  *                  The detection routines *
  94.  * *
  95.  ****************************************************************/
  96.  
  97. /**
  98.  * xlinkIsLink:
  99.  * @doc:  the document containing the node
  100.  * @node:  the node pointer itself
  101.  *
  102.  * Check whether the given node carries the attributes needed
  103.  * to be a link element (or is one of the linking elements issued
  104.  * from the (X)HTML DtDs).
  105.  * This routine don't try to do full checking of the link validity
  106.  * but tries to detect and return the appropriate link type.
  107.  *
  108.  * Returns the xlinkType of the node (XLINK_TYPE_NONE if there is no
  109.  *         link detected.
  110.  */
  111. xlinkType 
  112. xlinkIsLink (xmlDocPtr doc, xmlNodePtr node) {
  113.     xmlChar *type = NULL, *role = NULL;
  114.     xlinkType ret = XLINK_TYPE_NONE;
  115.     if (node == NULL) return(XLINK_TYPE_NONE);
  116.     if (doc == NULL) doc = node->doc;
  117.     if ((doc != NULL) && (doc->type == XML_HTML_DOCUMENT_NODE)) {
  118.         /*
  119.  * This is an HTML document.
  120.  */
  121.     } else if ((node->ns != NULL) &&
  122.                (!xmlStrcmp(node->ns->href, XHTML_NAMESPACE))) {
  123. /*
  124.  * !!!! We really need an IS_XHTML_ELEMENT function from HTMLtree.h @@@
  125.  */
  126.         /*
  127.  * This is an XHTML element within an XML document
  128.  * Check whether it's one of the element able to carry links
  129.  * and in that case if it holds the attributes.
  130.  */
  131.     }
  132.     /*
  133.      * We don't prevent a-priori having XML Linking constructs on
  134.      * XHTML elements
  135.      */
  136.     type = xmlGetNsProp(node, BAD_CAST"type", XLINK_NAMESPACE);
  137.     if (type != NULL) {
  138. if (xmlStrcmp(type, BAD_CAST "simple")) {
  139.             ret = XLINK_TYPE_SIMPLE;
  140. } if (xmlStrcmp(type, BAD_CAST "extended")) {
  141.     role = xmlGetNsProp(node, BAD_CAST "role", XLINK_NAMESPACE);
  142.     if (role != NULL) {
  143. xmlNsPtr xlink;
  144. xlink = xmlSearchNs(doc, node, XLINK_NAMESPACE);
  145. if (xlink == NULL) {
  146.     /* Humm, fallback method */
  147.     if (!xmlStrcmp(role, BAD_CAST"xlink:external-linkset")) 
  148. ret = XLINK_TYPE_EXTENDED_SET;
  149. } else {
  150.     xmlChar buf[200];
  151. #ifdef HAVE_SNPRINTF
  152.     snprintf((char *) buf, 199, "%s:external-linkset",
  153.      (char *) xlink->prefix);
  154. #else
  155.     sprintf((char *) buf, "%s:external-linkset",
  156.     (char *) xlink->prefix);
  157. #endif
  158.     if (!xmlStrcmp(role, buf))
  159. ret = XLINK_TYPE_EXTENDED_SET;
  160. }
  161.     }
  162.     ret = XLINK_TYPE_EXTENDED;
  163. }
  164.     }
  165.     if (type != NULL) xmlFree(type);
  166.     if (role != NULL) xmlFree(role);
  167.     return(ret);
  168. }