summaryrefslogtreecommitdiff
path: root/src/core/doc_fragment.c
blob: 6b466965f3d2b0bf6f72effcc489078bbd3563a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * This file is part of libdom.
 * Licensed under the MIT License,
 *                http://www.opensource.org/licenses/mit-license.php
 * Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
 * Copyright 2009 Bo Yang <struggleyb.nku@gmail.com>
 */

#include <libwapcaplet/libwapcaplet.h>

#include <dom/core/node.h>

#include "core/document.h"
#include "core/doc_fragment.h"
#include "core/node.h"
#include "utils/utils.h"

/**
 * A DOM document fragment
 */
struct dom_document_fragment {
	struct dom_node_internal base;		/**< Base node */
};

static struct dom_node_vtable df_vtable = {
	DOM_NODE_VTABLE
};

static struct dom_node_protect_vtable df_protect_vtable = {
	DOM_DF_PROTECT_VTABLE
};

/**
 * Create a document fragment
 *
 * \param doc     The owning document
 * \param name    The name of the node to create
 * \param value   The text content of the node
 * \param result  Pointer to location to receive created node
 * \return DOM_NO_ERR                on success,
 *         DOM_NO_MEM_ERR            on memory exhaustion.
 *
 * ::doc, ::name and ::value will have their reference counts increased.
 *
 * The returned node will already be referenced.
 */
dom_exception _dom_document_fragment_create(struct dom_document *doc,
		struct lwc_string_s *name, struct dom_string *value,
		struct dom_document_fragment **result)
{
	struct dom_document_fragment *f;
	dom_exception err;

	/* Allocate the comment node */
	f = _dom_document_alloc(doc, NULL,
			sizeof(struct dom_document_fragment));
	if (f == NULL)
		return DOM_NO_MEM_ERR;


	f->base.base.vtable = &df_vtable;
	f->base.vtable = &df_protect_vtable;

	/* And initialise the node */
	err = _dom_document_fragment_initialise(&f->base, doc, 
			DOM_DOCUMENT_FRAGMENT_NODE, name, value, NULL, NULL);
	if (err != DOM_NO_ERR) {
		_dom_document_alloc(doc, f, 0);
		return err;
	}

	*result = f;

	return DOM_NO_ERR;
}

/**
 * Destroy a document fragment
 *
 * \param doc   The owning document
 * \param frag  The document fragment to destroy
 *
 * The contents of ::frag will be destroyed and ::frag will be freed.
 */
void _dom_document_fragment_destroy(struct dom_document *doc,
		struct dom_document_fragment *frag)
{
	/* Finalise base class */
	_dom_document_fragment_finalise(doc, &frag->base);

	/* Destroy fragment */
	_dom_document_alloc(doc, frag, 0);
}

/*-----------------------------------------------------------------------*/

/* Overload protected functions */

/* The virtual destroy function of this class */
void _dom_df_destroy(struct dom_node_internal *node)
{
	_dom_document_fragment_destroy(node->owner,
			(struct dom_document_fragment *) node);
}

/* The memory allocator of this class */
dom_exception _dom_df_alloc(struct dom_document *doc,
		struct dom_node_internal *n, struct dom_node_internal **ret)
{
	UNUSED(n);
	struct dom_document_fragment *a;
	
	a = _dom_document_alloc(doc, NULL,
			sizeof(struct dom_document_fragment));
	if (a == NULL)
		return DOM_NO_MEM_ERR;
	
	*ret = (dom_node_internal *) a;
	dom_node_set_owner(*ret, doc);

	return DOM_NO_ERR;
}

/* The copy constructor of this class */
dom_exception _dom_df_copy(struct dom_node_internal *new, 
		struct dom_node_internal *old)
{
	return _dom_node_copy(new, old);
}