]> err.no Git - sope/blob - sope-xml/DOM/DOM+JS.m
fixed an uninit var on Cocoa
[sope] / sope-xml / DOM / DOM+JS.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
6   SOPE is free software; you can redistribute it and/or modify it under
7   the terms of the GNU Lesser General Public License as published by the
8   Free Software Foundation; either version 2, or (at your option) any
9   later version.
10
11   SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12   WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
14   License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with SOPE; see the file COPYING.  If not, write to the
18   Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19   02111-1307, USA.
20 */
21
22 #include <DOM/DOMDocument.h>
23 #include <DOM/DOMImplementation.h>
24 #include <DOM/DOMCharacterData.h>
25 #include <DOM/DOMAttribute.h>
26 #include <DOM/DOMElement.h>
27 #include <DOM/DOMDocumentType.h>
28 #include <DOM/DOMProcessingInstruction.h>
29 #include "NSObject+StringValue.h"
30 #include "common.h"
31
32 /*
33   Differences to DOM JavaScript
34
35     Differences are due to JavaScript bridge retain-cycle issues with parent
36     properties (properties are cached by the JS engine, while function return
37     values are not) ...
38     
39     Node:
40       original property | SKYRiX function
41       parentNode        | getParentNode()
42       childNodes        | getChildNodes()
43       firstChild        | getFirstChild()
44       lastChild         | getLastChild()
45       previousSibling   | getPreviousSibling()
46       nextSibling       | getNextSibling()
47       attributes        | getAttributes()
48       ownerDocument     | getOwnerDocument()
49
50     Attr:
51       ownerElement      | getOwnerElement()
52       
53     Document:
54       original property | SKYRiX function
55       documentElement   | getDocumentElement()
56 */
57
58 @implementation NGDOMImplementation(JSSupport)
59
60 - (id)_jsfunc_createDocument:(NSArray *)_args {
61   NSString *nsuri = nil, *qname = nil, *doctype = nil;
62   unsigned count;
63
64   count = [_args count];
65   if (count > 0) nsuri   = [[_args objectAtIndex:0] stringValue];
66   if (count > 1) qname   = [[_args objectAtIndex:1] stringValue];
67   if (count > 2) doctype = [[_args objectAtIndex:2] stringValue];
68
69   return [self createDocumentWithName:qname
70                namespaceURI:nsuri
71                documentType:doctype];
72 }
73
74 - (id)_jsfunc_createDocumentType:(NSArray *)_args {
75   NSString *qname = nil, *pubId = nil, *sysId = nil;
76   unsigned count;
77
78   count = [_args count];
79   if (count > 0) qname = [[_args objectAtIndex:0] stringValue];
80   if (count > 1) pubId = [[_args objectAtIndex:1] stringValue];
81   if (count > 2) sysId = [[_args objectAtIndex:2] stringValue];
82   
83   return [self createDocumentType:qname publicId:pubId systemId:sysId];
84 }
85
86 @end /* NGDOMImplementation(JSSupport) */
87
88 @implementation NGDOMDocument(JSSupport)
89
90 - (id)_jsprop_doctype {
91   return [self doctype];
92 }
93 - (id)_jsprop_implementation {
94   return [self implementation];
95 }
96
97 - (id)_jsfunc_getDocumentElement:(NSArray *)_args {
98   return [self documentElement];
99 }
100
101 /* lookup */
102
103 - (id)_jsfunc_getElementsByTagName:(NSArray *)_args {
104   unsigned count;
105   if ((count = [_args count]) == 0) return nil;
106
107   if (count == 1)
108     return [self getElementsByTagName:[[_args objectAtIndex:0] stringValue]];
109   else {
110     return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
111                  namespaceURI:[[_args objectAtIndex:0] stringValue]];
112   }
113 }
114 - (id)_jsfunc_getElementsByTagNameNS:(NSArray *)_args {
115   return [self _jsfunc_getElementsByTagName:_args];
116 }
117
118 - (id)_jsfunc_getElementById:(NSArray *)_args {
119   unsigned count;
120   if ((count = [_args count]) == 0) return nil;
121
122   return [self getElementById:[[_args objectAtIndex:0] stringValue]];
123 }
124
125 /* factory */
126
127 - (id)_jsfunc_createElement:(NSArray *)_args {
128   unsigned count;
129   if ((count = [_args count]) == 0) return nil;
130   if (count == 1)
131     return [self createElement:[[_args objectAtIndex:0] stringValue]];
132   else {
133     return [self createElement:[[_args objectAtIndex:1] stringValue]
134                  namespaceURI:[[_args objectAtIndex:0] stringValue]];
135   }
136 }
137 - (id)_jsfunc_createElementNS:(NSArray *)_args {
138   return [self _jsfunc_createElement:_args];
139 }
140
141 - (id)_jsfunc_createDocumentFragment:(NSArray *)_args {
142   return [self createDocumentFragment];
143 }
144 - (id)_jsfunc_createTextNode:(NSArray *)_args {
145   unsigned count;
146   if ((count = [_args count]) == 0) return nil;
147   return [self createTextNode:[[_args objectAtIndex:0] stringValue]];
148 }
149 - (id)_jsfunc_createComment:(NSArray *)_args {
150   unsigned count;
151   if ((count = [_args count]) == 0) return nil;
152   return [self createComment:[[_args objectAtIndex:0] stringValue]];
153 }
154 - (id)_jsfunc_createCDATASection:(NSArray *)_args {
155   unsigned count;
156   if ((count = [_args count]) == 0) return nil;
157   return [self createCDATASection:[[_args objectAtIndex:0] stringValue]];
158 }
159
160 - (id)_jsfunc_createProcessingInstruction:(NSArray *)_args {
161   unsigned count;
162   if ((count = [_args count]) < 2) return nil;
163
164   return [self createProcessingInstruction:
165                  [[_args objectAtIndex:0] stringValue]
166                data:[[_args objectAtIndex:1] stringValue]];
167 }
168 - (id)_jsfunc_createAttribute:(NSArray *)_args {
169   unsigned count;
170   if ((count = [_args count]) == 0) return nil;
171   if (count == 1)
172     return [self createAttribute:[[_args objectAtIndex:0] stringValue]];
173   else {
174     return [self createAttribute:[[_args objectAtIndex:1] stringValue]
175                  namespaceURI:[[_args objectAtIndex:0] stringValue]];
176   }
177 }
178 - (id)_jsfunc_createAttributeNS:(NSArray *)_args {
179   return [self _jsfunc_createAttribute:_args];
180 }
181
182 - (id)_jsfunc_createEntityReference:(NSArray *)_args {
183   unsigned count;
184   if ((count = [_args count]) == 0) return nil;
185   return [self createEntityReference:[[_args objectAtIndex:0] stringValue]];
186 }
187
188 @end /* NGDOMDocument(JSSupport) */
189
190 @implementation NGDOMNode(JSSupport)
191
192 - (NSString *)_jsprop_nodeName {
193   return [self nodeName];
194 }
195 - (NSString *)_jsprop_nodeValue {
196   return [self nodeValue];
197 }
198 - (NSNumber *)_jsprop_nodeType {
199   return [NSNumber numberWithShort:[self nodeType]];
200 }
201
202 - (NSString *)_jsprop_namespaceURI {
203   return [self namespaceURI];
204 }
205 - (NSString *)_jsprop_prefix {
206   return [self prefix];
207 }
208 - (NSString *)_jsprop_localName {
209   return [self localName];
210 }
211
212 - (id)_jsfunc_getParentNode:(NSArray *)_args {
213   return [self parentNode];
214 }
215 - (id)_jsfunc_getChildNodes:(NSArray *)_args {
216   return [self childNodes];
217 }
218 - (id)_jsfunc_getFirstChild:(NSArray *)_args {
219   return [self firstChild];
220 }
221 - (id)_jsfunc_getLastChild:(NSArray *)_args {
222   return [self lastChild];
223 }
224 - (id)_jsfunc_getPreviousSibling:(NSArray *)_args {
225   return [self previousSibling];
226 }
227 - (id)_jsfunc_getNextSibling:(NSArray *)_args {
228   return [self nextSibling];
229 }
230 - (id)_jsfunc_getAttributes:(NSArray *)_args {
231   return [self attributes];
232 }
233 - (id)_jsfunc_getOwnerDocument:(NSArray *)_args {
234   return [self ownerDocument];
235 }
236
237 - (NSNumber *)_jsfunc_hasChildNodes:(NSArray *)_args {
238   return [NSNumber numberWithBool:[self hasChildNodes]];
239 }
240
241 - (id)_jsfunc_normalize:(NSArray *)_args {
242   return nil;
243 }
244
245 - (id)_jsfunc_appendChild:(NSArray *)_args {
246   unsigned i, count;
247   id last = nil;
248   for (i = 0, count = [_args count]; i < count; i++)
249     last = [self appendChild:[_args objectAtIndex:i]];
250   return last;
251 }
252 - (id)_jsfunc_removeChild:(NSArray *)_args {
253   unsigned i, count;
254   id last = nil;
255   for (i = 0, count = [_args count]; i < count; i++)
256     last = [self removeChild:[_args objectAtIndex:i]];
257   return last;
258 }
259
260 // #warning some JS DOMNode API missing
261
262 @end /* NGDOMNode(JSSupport) */
263
264 @implementation NGDOMCharacterData(JSSupport)
265
266 - (void)_jsprop_data:(NSString *)_data {
267   _data = [_data stringValue];
268   [self setData:_data];
269 }
270 - (NSString *)_jsprop_data {
271   return [self data];
272 }
273
274 - (NSNumber *)_jsprop_length {
275   return [NSNumber numberWithInt:[self length]];
276 }
277
278 - (NSString *)_jsfunc_substringData:(NSArray *)_args {
279   unsigned count;
280   if ((count = [_args count]) < 2) return nil;
281   return [self substringData:[[_args objectAtIndex:0] intValue]
282                count:[[_args objectAtIndex:1] intValue]];
283 }
284 - (id)_jsfunc_appendData:(NSArray *)_args {
285   unsigned i, count;
286   for (i = 0, count = [_args count]; i < count; i++)
287     [self appendData:[[_args objectAtIndex:i] stringValue]];
288   return self;
289 }
290 - (id)_jsfunc_insertData:(NSArray *)_args {
291   unsigned count;
292   if ((count = [_args count]) == 0) return nil;
293   if (count == 1)
294     [self insertData:[[_args objectAtIndex:0] stringValue] offset:0];
295   else {
296     [self insertData:[[_args objectAtIndex:0] stringValue]
297           offset:[[_args objectAtIndex:1] intValue]];
298   }
299   return self;
300 }
301 - (id)_jsfunc_deleteData:(NSArray *)_args {
302   unsigned count;
303   if ((count = [_args count]) < 2) return nil;
304   [self deleteData:[[_args objectAtIndex:0] intValue]
305         count:[[_args objectAtIndex:1] intValue]];
306   return self;
307 }
308 - (id)_jsfunc_replaceData:(NSArray *)_args {
309   unsigned count;
310   if ((count = [_args count]) < 3) return nil;
311   [self replaceData:[[_args objectAtIndex:0] intValue]
312         count:[[_args objectAtIndex:1] intValue]
313         with:[[_args objectAtIndex:2] stringValue]];
314   return self;
315 }
316
317 @end /* NGDOMCharacterData(JSSupport) */
318
319 @implementation NGDOMAttribute(JSSupport)
320
321 - (NSString *)_jsprop_name {
322   return [self name];
323 }
324 - (NSNumber *)_jsprop_specified {
325   return [NSNumber numberWithBool:[self specified]];
326 }
327
328 - (void)_jsprop_value:(NSString *)_value {
329   [self setValue:[_value stringValue]];
330 }
331 - (NSString *)_jsprop_value {
332   return [self value];
333 }
334
335 - (id)_jsfunc_getOwnerElement:(NSArray *)_args {
336   return [self ownerElement];
337 }
338
339 @end /* NGDOMAttribute(JSSupport) */
340
341 @implementation NGDOMElement(JSSupport)
342
343 - (NSString *)_jsprop_tagName {
344   return [self tagName];
345 }
346
347 /* attributes */
348
349 - (NSString *)_jsfunc_getAttribute:(NSArray *)_args {
350   unsigned count;
351   
352   if ((count = [_args count]) == 0) return nil;
353   return [self attribute:[[_args objectAtIndex:0] stringValue]];
354 }
355 - (NSString *)_jsfunc_getAttributeNS:(NSArray *)_args {
356   unsigned count;
357   
358   if ((count = [_args count]) == 0) return nil;
359   return [self attribute:[[_args objectAtIndex:1] stringValue]
360                namespaceURI:[[_args objectAtIndex:0] stringValue]];
361 }
362
363 - (id)_jsfunc_setAttribute:(NSArray *)_args {
364   unsigned count;
365   
366   if ((count = [_args count]) < 2) return nil;
367   [self setAttribute:[[_args objectAtIndex:0] stringValue]
368         value:[[_args objectAtIndex:1] stringValue]];
369   return self;
370 }
371 - (id)_jsfunc_setAttributeNS:(NSArray *)_args {
372   unsigned count;
373   
374   if ((count = [_args count]) < 3) return nil;
375   [self setAttribute:[[_args objectAtIndex:1] stringValue]
376         namespaceURI:[[_args objectAtIndex:0] stringValue]
377         value:[[_args objectAtIndex:2] stringValue]];
378   return self;
379 }
380
381 - (id)_jsfunc_removeAttribute:(NSArray *)_args {
382   unsigned i, count;
383   for (i = 0, count = [_args count]; i < count; i++)
384     [self removeAttribute:[[_args objectAtIndex:i] stringValue]];
385   return self;
386 }
387 - (id)_jsfunc_removeAttributeNS:(NSArray *)_args {
388   unsigned count;
389   if ((count = [_args count]) < 2) return nil;
390   [self removeAttribute:[[_args objectAtIndex:1] stringValue]
391         namespaceURI:[[_args objectAtIndex:0] stringValue]];
392   return self;
393 }
394
395 - (id)_jsfunc_getAttributeNode:(NSArray *)_args {
396   unsigned count;
397   
398   if ((count = [_args count]) == 0) return nil;
399   return [[self attributes] namedItem:[[_args objectAtIndex:0] stringValue]];
400 }
401 - (id)_jsfunc_setAttributeNode:(NSArray *)_args {
402   unsigned i, count;
403   id last = nil;
404
405   for (i = 0, count = [_args count]; i < count; i++)
406     last = [self setAttributeNode:[_args objectAtIndex:i]];
407   return last;
408 }
409 - (id)_jsfunc_removeAttributeNode:(NSArray *)_args {
410   unsigned i, count;
411   id last = nil;
412
413   for (i = 0, count = [_args count]; i < count; i++)
414     last = [self removeAttributeNode:[_args objectAtIndex:i]];
415   return last;
416 }
417
418 /* lookup */
419
420 - (id)_jsfunc_getElementsByTagName:(NSArray *)_args {
421   unsigned count;
422   
423   if ((count = [_args count]) < 1) return nil;
424   
425   if (count == 1)
426     return [self getElementsByTagName:[[_args objectAtIndex:0] stringValue]];
427   else {
428     return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
429                  namespaceURI:[[_args objectAtIndex:0] stringValue]];
430   }
431 }
432 - (id)_jsfunc_getElementsByTagNameNS:(NSArray *)_args {
433   unsigned count;
434   
435   if ((count = [_args count]) < 2) return nil;
436   return [self getElementsByTagName:[[_args objectAtIndex:1] stringValue]
437                namespaceURI:[[_args objectAtIndex:0] stringValue]];
438 }
439
440 @end /* NGDOMElement(JSSupport) */
441
442 @implementation NGDOMDocumentType(JSSupport)
443
444 - (NSString *)_jsprop_name {
445   return [self name];
446 }
447 - (NSString *)_jsprop_publicId {
448   return [self publicId];
449 }
450 - (NSString *)_jsprop_systemId {
451   return [self systemId];
452 }
453 - (NSString *)_jsprop_internalSubset {
454   return [self internalSubset];
455 }
456
457 @end /* NGDOMDocumentType(JSSupport) */
458
459 @implementation NGDOMProcessingInstruction(JSSupport)
460
461 - (NSString *)_jsprop_target {
462   return [self target];
463 }
464
465 - (void)_jsprop_data:(NSString *)_data {
466   [self setData:[_data stringValue]];
467 }
468 - (NSString *)_jsprop_data {
469   return [self data];
470 }
471
472 @end /* NGDOMProcessingInstruction(JSSupport) */