summaryrefslogtreecommitdiffstats
path: root/tclxml/include/tcldom-libxml2/tcldom-libxml2.h
diff options
context:
space:
mode:
Diffstat (limited to 'tclxml/include/tcldom-libxml2/tcldom-libxml2.h')
-rw-r--r--tclxml/include/tcldom-libxml2/tcldom-libxml2.h266
1 files changed, 266 insertions, 0 deletions
diff --git a/tclxml/include/tcldom-libxml2/tcldom-libxml2.h b/tclxml/include/tcldom-libxml2/tcldom-libxml2.h
new file mode 100644
index 0000000..98fd3c8
--- /dev/null
+++ b/tclxml/include/tcldom-libxml2/tcldom-libxml2.h
@@ -0,0 +1,266 @@
+
+/* tcldom-libxml2.h --
+ *
+ * libxml2 wrapper for TclDOM.
+ *
+ * Copyright (c) 2005-2008 Explain
+ * http://www.explain.com.au/
+ * Copyright (c) 2002-2003 Zveno Pty Ltd
+ * http://www.zveno.com/
+ *
+ * See the file "LICENSE" for information on usage and
+ * redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * $Id: tcldom-libxml2.h,v 1.1.1.1 2009/01/16 22:11:49 joye Exp $
+ */
+
+#ifndef __TCLDOM_LIBXML2_H__
+#define __TCLDOM_LIBXML2_H__
+
+#include <tcldom/tcldom.h>
+#include <tclxml/tclxml.h>
+#include <tclxml-libxml2/docObj.h>
+#include <tclxml-libxml2/tclxml-libxml2Decls.h>
+#include <libxml/tree.h>
+#include <libxml/xmlschemas.h>
+
+/*
+ * For C++ compilers, use extern "C"
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * These macros are used to control whether functions are being declared for
+ * import or export in Windows,
+ * They map to no-op declarations on non-Windows systems.
+ * Assumes that tcl.h defines DLLEXPORT & DLLIMPORT correctly.
+ * The default build on windows is for a DLL, which causes the DLLIMPORT
+ * and DLLEXPORT macros to be nonempty. To build a static library, the
+ * macro STATIC_BUILD should be defined before the inclusion of tcl.h
+ *
+ * If a function is being declared while it is being built
+ * to be included in a shared library, then it should have the DLLEXPORT
+ * storage class. If is being declared for use by a module that is going to
+ * link against the shared library, then it should have the DLLIMPORT storage
+ * class. If the symbol is beind declared for a static build or for use from a
+ * stub library, then the storage class should be empty.
+ *
+ * The convention is that a macro called BUILD_xxxx, where xxxx is the
+ * name of a library we are building, is set on the compile line for sources
+ * that are to be placed in the library. When this macro is set, the
+ * storage class will be set to DLLEXPORT. At the end of the header file, the
+ * storage class will be reset to DLLIMPORt.
+ */
+
+#undef TCL_STORAGE_CLASS
+#ifdef BUILD_Tcldom_libxml2
+# define TCL_STORAGE_CLASS DLLEXPORT
+#else
+# ifdef USE_TCL_STUBS
+# define TCL_STORAGE_CLASS
+# else
+# define TCL_STORAGE_CLASS DLLIMPORT
+# endif
+#endif
+
+/*
+ * The following function is required to be defined in all stubs aware
+ * extensions of TclDOM. The function is actually implemented in the stub
+ * library, not the main Tcldom library, although there is a trivial
+ * implementation in the main library in case an extension is statically
+ * linked into an application.
+ */
+
+EXTERN CONST char * Tcldom_libxml2_InitStubs _ANSI_ARGS_((Tcl_Interp *interp,
+ CONST char *version, int exact));
+
+#ifndef USE_TCLDOMXML_STUBS
+
+/*
+ * When not using stubs, make it a macro.
+ */
+
+#define Tcldom_libxml2_InitStubs(interp, version, exact) \
+ Tcl_PkgRequire(interp, "dom::generic", version, exact)
+
+#endif
+
+/*
+ * DOM-specific data structure to hook onto documents.
+ */
+
+typedef struct TclDOM_libxml2_Document {
+ Tcl_Interp *interp;
+ TclXML_libxml2_Document *tDocPtr; /* Pointer back to main document structure */
+ Tcl_Obj *objPtr; /* An object to hold onto for this document */
+ Tcl_Command cmd; /* Tcl command for this document */
+
+ Tcl_HashTable *nodes;
+ int nodeCntr;
+
+ /*
+ * Validation support
+ */
+
+ xmlSchemaPtr schema; /* XML Schemas */
+ /* xmlRelaxNGPtr relaxng; */
+
+ /*
+ * Event support.
+ *
+ * These tables are indexed by xmlNodePtr.
+ */
+
+ Tcl_HashTable *captureListeners;
+ Tcl_HashTable *bubbleListeners;
+
+ /*
+ * Optimisation: boolean flag to indicate whether an
+ * event listener is registered for an event type.
+ * If no event listeners are registered then there is
+ * no point in propagating the event.
+ */
+
+ int listening[TCLDOM_NUM_EVENT_TYPES];
+
+} TclDOM_libxml2_Document;
+
+/*
+ * Node management
+ */
+
+/*
+ * "nodes" are overloaded: they can be either a libxml2 xmlNodePtr or
+ * an event, which is defined by this module.
+ */
+
+typedef struct _TclDOM_libxml2_Node TclDOM_libxml2_Node;
+
+#define TCLDOM_LIBXML2_NODE_NODE 0
+#define TCLDOM_LIBXML2_NODE_EVENT 1
+
+/*
+ * Data structure to support Events
+ */
+
+typedef struct TclDOM_libxml2_Event {
+ TclDOM_libxml2_Node *tNodePtr; /* Generic node structure for this event */
+ TclDOM_libxml2_Document *ownerDocument; /* Toplevel Document for this event */
+
+ enum TclDOM_EventTypes type; /* Enumerate rep of event type */
+ Tcl_Obj *typeObjPtr; /* For user defined event type */
+
+ int stopPropagation;
+ int preventDefault;
+ int dispatched;
+
+ Tcl_Obj *altKey;
+ Tcl_Obj *attrName;
+ Tcl_Obj *attrChange;
+ Tcl_Obj *bubbles;
+ Tcl_Obj *button;
+ Tcl_Obj *cancelable;
+ Tcl_Obj *clientX;
+ Tcl_Obj *clientY;
+ Tcl_Obj *ctrlKey;
+ Tcl_Obj *currentNode;
+ Tcl_Obj *detail;
+ Tcl_Obj *eventPhase;
+ Tcl_Obj *metaKey;
+ Tcl_Obj *newValue;
+ Tcl_Obj *prevValue;
+ Tcl_Obj *relatedNode;
+ Tcl_Obj *screenX;
+ Tcl_Obj *screenY;
+ Tcl_Obj *shiftKey;
+ Tcl_Obj *target;
+ Tcl_Obj *timeStamp;
+ Tcl_Obj *view;
+} TclDOM_libxml2_Event;
+
+typedef void (TclDOM_libxml2_Node_FreeHookProc) _ANSI_ARGS_((ClientData clientData));
+
+struct _TclDOM_libxml2_Node {
+ union {
+ xmlNodePtr nodePtr;
+ TclDOM_libxml2_Event *eventPtr;
+ } ptr;
+
+ int type; /* Distinguish between libxml2 nodes and events */
+
+ char *token; /* string rep of this node */
+ Tcl_Command cmd; /* Tcl command that access this structure */
+
+ void *objs; /* Opaque object for tracking Tcl_Obj's that refer to this node */
+
+ ClientData apphook; /* Application hook - not used by TclXML or TclDOM */
+ TclDOM_libxml2_Node_FreeHookProc *appfree;
+};
+
+/*
+ * Public API
+ */
+
+Tcl_Obj * TclDOM_libxml2_CreateObjFromDoc _ANSI_ARGS_((Tcl_Interp *interp, xmlDocPtr docPtr));
+Tcl_Obj * TclDOM_libxml2_CreateObjFromNode _ANSI_ARGS_((Tcl_Interp *interp, xmlNodePtr nodePtr));
+int TclDOM_libxml2_GetNodeFromObj _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, xmlNodePtr *nodePtrPtr));
+int TclDOM_libxml2_GetTclNodeFromObj _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, TclDOM_libxml2_Node **tNodePtrPtr));
+int TclDOM_libxml2_GetEventFromObj _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, TclDOM_libxml2_Event **eventPtrPtr));
+int TclDOM_libxml2_GetTclEventFromObj _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *objPtr, TclDOM_libxml2_Node **tNodePtrPtr));
+
+int TclDOM_PostMutationEvent _ANSI_ARGS_((Tcl_Interp *interp,
+ TclXML_libxml2_Document *tDocPtr,
+ Tcl_Obj *nodeObjPtr,
+ enum TclDOM_EventTypes type,
+ Tcl_Obj *typeObjPtr,
+ Tcl_Obj *bubblesPtr,
+ Tcl_Obj *cancelablePtr,
+ Tcl_Obj *relatedNodePtr,
+ Tcl_Obj *prevValuePtr,
+ Tcl_Obj *newValuePtr,
+ Tcl_Obj *attrNamePtr,
+ Tcl_Obj *attrChangePtr));
+int TclDOM_AddEventListener _ANSI_ARGS_((Tcl_Interp *interp,
+ TclXML_libxml2_Document *tDocPtr,
+ void *tokenPtr, /* xmlNodePtr or xmlDocPtr */
+ enum TclDOM_EventTypes type,
+ Tcl_Obj *typeObjPtr,
+ Tcl_Obj *listenerPtr,
+ int capturer));
+Tcl_Obj * TclDOM_GetEventListener _ANSI_ARGS_((Tcl_Interp *interp,
+ TclXML_libxml2_Document *tDocPtr,
+ void *tokenPtr,
+ enum TclDOM_EventTypes type,
+ Tcl_Obj *typeObjPtr,
+ int capturer));
+int TclDOM_RemoveEventListener _ANSI_ARGS_((Tcl_Interp *interp,
+ TclXML_libxml2_Document *tDocPtr,
+ void *tokenPtr,
+ enum TclDOM_EventTypes type,
+ Tcl_Obj *typeObjPtr,
+ Tcl_Obj *listenerPtr,
+ int capturer));
+int TclDOM_DispatchEvent _ANSI_ARGS_((Tcl_Interp *interp,
+ Tcl_Obj *nodeObjPtr,
+ Tcl_Obj *eventObjPtr,
+ TclDOM_libxml2_Event *eventPtr));
+
+/*
+ * Accessor functions => Stubs
+ */
+
+/*
+#include <tcldom-libxml2/tcldomlibxml2Decls.h>
+
+#undef TCL_STORAGE_CLASS
+#define TCL_STORAGE_CLASS DLLIMPORT
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TCLDOM_LIBXML2_H__ */