blather 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +2 -2
- data/Rakefile +30 -18
- data/ext/Makefile +149 -0
- data/ext/mkmf.log +30 -0
- data/ext/push_parser.bundle +0 -0
- data/ext/push_parser.c +231 -0
- data/ext/push_parser.o +0 -0
- data/lib/blather.rb +3 -7
- data/lib/blather/client.rb +247 -4
- data/lib/blather/roster.rb +0 -9
- data/lib/blather/stanza/{disco.rb → iq/disco.rb} +3 -1
- data/lib/blather/stanza/{disco → iq/discos}/disco_info.rb +5 -3
- data/lib/blather/stanza/{disco → iq/discos}/disco_items.rb +2 -0
- data/lib/blather/stanza/iq/query.rb +1 -1
- data/lib/blather/stanza/iq/roster.rb +2 -2
- data/lib/blather/xmpp_node.rb +1 -1
- data/spec/blather/stanza/{discos → iq/discos}/disco_info_spec.rb +12 -12
- data/spec/blather/stanza/{discos → iq/discos}/disco_items_spec.rb +1 -1
- data/spec/blather/stanza/iq/query_spec.rb +0 -7
- data/spec/blather/stanza/iq/roster_spec.rb +21 -21
- data/spec/blather/stanza/pubsub/event_spec.rb +13 -0
- data/spec/build_safe.rb +20 -0
- metadata +19 -68
- data/VERSION.yml +0 -4
- data/examples/pubsub/cli.rb +0 -64
- data/examples/pubsub/ping_pong.rb +0 -18
- data/examples/pubsub/pubsub_dsl.rb +0 -52
- data/examples/pubsub_client.rb +0 -39
- data/examples/rosterprint.rb +0 -14
- data/examples/xmpp4r/echo.rb +0 -35
- data/lib/blather/client/client.rb +0 -165
- data/lib/blather/client/dsl.rb +0 -99
- data/lib/blather/client/pubsub.rb +0 -53
- data/lib/blather/client/pubsub/node.rb +0 -27
- data/lib/blather/stanza/pubsub.rb +0 -33
- data/lib/blather/stanza/pubsub/affiliations.rb +0 -52
- data/lib/blather/stanza/pubsub/errors.rb +0 -9
- data/lib/blather/stanza/pubsub/event.rb +0 -21
- data/lib/blather/stanza/pubsub/items.rb +0 -59
- data/lib/blather/stanza/pubsub/owner.rb +0 -9
- data/lib/blather/stanza/pubsub/subscriptions.rb +0 -57
- data/spec/blather/stanza/pubsub/affiliations_spec.rb +0 -46
- data/spec/blather/stanza/pubsub/items_spec.rb +0 -59
- data/spec/blather/stanza/pubsub/subscriptions_spec.rb +0 -63
- data/spec/blather/stanza/pubsub_spec.rb +0 -26
- data/spec/fixtures/pubsub.rb +0 -157
data/README.rdoc
CHANGED
@@ -67,7 +67,7 @@ There are 5 different types of guards:
|
|
67
67
|
# Equivalent to stanza.chat?
|
68
68
|
message :chat?
|
69
69
|
|
70
|
-
# Hash with
|
70
|
+
# Hash with value (:body => 'exit')
|
71
71
|
# Calls the key on the stanza and checks for equality
|
72
72
|
# Equivalent to stanza.body == 'exit'
|
73
73
|
message :body => 'exit'
|
@@ -100,4 +100,4 @@ There are 5 different types of guards:
|
|
100
100
|
= License
|
101
101
|
|
102
102
|
Please see LICENSE
|
103
|
-
The LibXML-Ruby license can be found in its directory
|
103
|
+
The LibXML-Ruby license can be found in its directory
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = 'blather'
|
8
|
-
gem.
|
8
|
+
gem.summary = 'An evented XMPP library written on EventMachine and libxml-ruby'
|
9
9
|
|
10
10
|
gem.email = 'sprsquish@gmail.com'
|
11
11
|
gem.homepage = 'http://github.com/sprsquish/blather'
|
@@ -13,11 +13,13 @@ begin
|
|
13
13
|
|
14
14
|
gem.rubyforge_project = 'squishtech'
|
15
15
|
|
16
|
-
gem.extensions =
|
16
|
+
gem.extensions = ['Rakefile']
|
17
17
|
|
18
18
|
gem.add_dependency 'eventmachine', '>= 0.12.6'
|
19
19
|
gem.add_dependency 'libxml-ruby', '>= 1.1.3'
|
20
20
|
|
21
|
+
gem.files = FileList['examples/**/*', 'lib/**/*', 'ext/*'].to_a
|
22
|
+
|
21
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
22
24
|
end
|
23
25
|
rescue LoadError
|
@@ -46,8 +48,6 @@ rescue LoadError
|
|
46
48
|
end
|
47
49
|
|
48
50
|
|
49
|
-
task :default => :test
|
50
|
-
|
51
51
|
begin
|
52
52
|
require 'hanna/rdoctask'
|
53
53
|
|
@@ -71,28 +71,40 @@ rescue LoadError
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
|
75
|
-
task :build => :extensions
|
76
|
-
task :extension => :build
|
74
|
+
MAKE = ENV['MAKE'] || (RUBY_PLATFORM =~ /mswin/ ? 'nmake' : 'make')
|
77
75
|
|
78
|
-
ext
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
76
|
+
namespace :ext do
|
77
|
+
ext_sources = FileList['ext/*.{rb,c}']
|
78
|
+
|
79
|
+
desc 'Compile the makefile'
|
80
|
+
file 'ext/Makefile' => ext_sources do
|
81
|
+
chdir('ext') { ruby 'extconf.rb' }
|
82
|
+
end
|
83
|
+
|
84
|
+
desc "make extension"
|
85
|
+
task :make => ext_sources + ['ext/Makefile'] do
|
86
|
+
chdir('ext') { sh MAKE }
|
87
|
+
end
|
88
|
+
|
89
|
+
desc 'Build push parser'
|
90
|
+
task :build => :make
|
84
91
|
|
85
|
-
namespace :extensions do
|
86
92
|
desc 'Clean extensions'
|
87
93
|
task :clean do
|
88
|
-
|
94
|
+
chdir 'ext' do
|
89
95
|
sh "rm -f Makefile"
|
90
96
|
sh "rm -f *.{o,so,bundle,log}"
|
91
97
|
end
|
92
98
|
end
|
93
99
|
end
|
94
100
|
|
95
|
-
|
96
|
-
|
97
|
-
|
101
|
+
# If running under rubygems...
|
102
|
+
__DIR__ ||= File.expand_path(File.dirname(__FILE__))
|
103
|
+
if Gem.path.any? {|path| %r(^#{Regexp.escape path}) =~ __DIR__}
|
104
|
+
task :default => :gem_build
|
105
|
+
else
|
106
|
+
task :default => ['ext:build', :test]
|
98
107
|
end
|
108
|
+
|
109
|
+
desc ":default build when running under rubygems."
|
110
|
+
task :gem_build => 'ext:build'
|
data/ext/Makefile
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
|
2
|
+
SHELL = /bin/sh
|
3
|
+
|
4
|
+
#### Start of system configuration section. ####
|
5
|
+
|
6
|
+
srcdir = .
|
7
|
+
topdir = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0
|
8
|
+
hdrdir = $(topdir)
|
9
|
+
VPATH = $(srcdir):$(topdir):$(hdrdir)
|
10
|
+
prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr
|
11
|
+
exec_prefix = $(prefix)
|
12
|
+
sitedir = $(DESTDIR)/Library/Ruby/Site
|
13
|
+
rubylibdir = $(libdir)/ruby/$(ruby_version)
|
14
|
+
docdir = $(datarootdir)/doc/$(PACKAGE)
|
15
|
+
dvidir = $(docdir)
|
16
|
+
datarootdir = $(prefix)/share
|
17
|
+
archdir = $(rubylibdir)/$(arch)
|
18
|
+
sbindir = $(exec_prefix)/sbin
|
19
|
+
psdir = $(docdir)
|
20
|
+
localedir = $(datarootdir)/locale
|
21
|
+
htmldir = $(docdir)
|
22
|
+
datadir = $(datarootdir)
|
23
|
+
includedir = $(prefix)/include
|
24
|
+
infodir = $(DESTDIR)/usr/share/info
|
25
|
+
sysconfdir = $(prefix)/etc
|
26
|
+
mandir = $(DESTDIR)/usr/share/man
|
27
|
+
libdir = $(exec_prefix)/lib
|
28
|
+
sharedstatedir = $(prefix)/com
|
29
|
+
oldincludedir = $(DESTDIR)/usr/include
|
30
|
+
pdfdir = $(docdir)
|
31
|
+
sitearchdir = $(sitelibdir)/$(sitearch)
|
32
|
+
bindir = $(exec_prefix)/bin
|
33
|
+
localstatedir = $(prefix)/var
|
34
|
+
sitelibdir = $(sitedir)/$(ruby_version)
|
35
|
+
libexecdir = $(exec_prefix)/libexec
|
36
|
+
|
37
|
+
CC = gcc
|
38
|
+
LIBRUBY = $(LIBRUBY_SO)
|
39
|
+
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
40
|
+
LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
|
41
|
+
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)
|
42
|
+
|
43
|
+
RUBY_EXTCONF_H =
|
44
|
+
CFLAGS = -fno-common -arch ppc -arch i386 -Os -pipe -fno-common -DOS_UNIX -DBUILD_FOR_RUBY
|
45
|
+
INCFLAGS = -I. -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -I/usr/include/libxml2
|
46
|
+
CPPFLAGS =
|
47
|
+
CXXFLAGS = $(CFLAGS)
|
48
|
+
DLDFLAGS = -L. -arch ppc -arch i386
|
49
|
+
LDSHARED = cc -arch ppc -arch i386 -pipe -bundle -undefined dynamic_lookup
|
50
|
+
AR = ar
|
51
|
+
EXEEXT =
|
52
|
+
|
53
|
+
RUBY_INSTALL_NAME = ruby
|
54
|
+
RUBY_SO_NAME = ruby
|
55
|
+
arch = universal-darwin9.0
|
56
|
+
sitearch = universal-darwin9.0
|
57
|
+
ruby_version = 1.8
|
58
|
+
ruby = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
|
59
|
+
RUBY = $(ruby)
|
60
|
+
RM = rm -f
|
61
|
+
MAKEDIRS = mkdir -p
|
62
|
+
INSTALL = /usr/bin/install -c
|
63
|
+
INSTALL_PROG = $(INSTALL) -m 0755
|
64
|
+
INSTALL_DATA = $(INSTALL) -m 644
|
65
|
+
COPY = cp
|
66
|
+
|
67
|
+
#### End of system configuration section. ####
|
68
|
+
|
69
|
+
preload =
|
70
|
+
|
71
|
+
libpath = . $(libdir)
|
72
|
+
LIBPATH = -L"." -L"$(libdir)"
|
73
|
+
DEFFILE =
|
74
|
+
|
75
|
+
CLEANFILES = mkmf.log
|
76
|
+
DISTCLEANFILES =
|
77
|
+
|
78
|
+
extout =
|
79
|
+
extout_prefix =
|
80
|
+
target_prefix =
|
81
|
+
LOCAL_LIBS =
|
82
|
+
LIBS = $(LIBRUBYARG_SHARED) -lxml2 -lpthread -ldl -lm
|
83
|
+
SRCS = push_parser.c
|
84
|
+
OBJS = push_parser.o
|
85
|
+
TARGET = push_parser
|
86
|
+
DLLIB = $(TARGET).bundle
|
87
|
+
EXTSTATIC =
|
88
|
+
STATIC_LIB =
|
89
|
+
|
90
|
+
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
91
|
+
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
92
|
+
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
93
|
+
|
94
|
+
TARGET_SO = $(DLLIB)
|
95
|
+
CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
|
96
|
+
CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
|
97
|
+
|
98
|
+
all: $(DLLIB)
|
99
|
+
static: $(STATIC_LIB)
|
100
|
+
|
101
|
+
clean:
|
102
|
+
@-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
|
103
|
+
|
104
|
+
distclean: clean
|
105
|
+
@-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
|
106
|
+
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
|
107
|
+
|
108
|
+
realclean: distclean
|
109
|
+
install: install-so install-rb
|
110
|
+
|
111
|
+
install-so: $(RUBYARCHDIR)
|
112
|
+
install-so: $(RUBYARCHDIR)/$(DLLIB)
|
113
|
+
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
|
114
|
+
$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
|
115
|
+
install-rb: pre-install-rb install-rb-default
|
116
|
+
install-rb-default: pre-install-rb-default
|
117
|
+
pre-install-rb: Makefile
|
118
|
+
pre-install-rb-default: Makefile
|
119
|
+
$(RUBYARCHDIR):
|
120
|
+
$(MAKEDIRS) $@
|
121
|
+
|
122
|
+
site-install: site-install-so site-install-rb
|
123
|
+
site-install-so: install-so
|
124
|
+
site-install-rb: install-rb
|
125
|
+
|
126
|
+
.SUFFIXES: .c .m .cc .cxx .cpp .C .o
|
127
|
+
|
128
|
+
.cc.o:
|
129
|
+
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
130
|
+
|
131
|
+
.cxx.o:
|
132
|
+
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
133
|
+
|
134
|
+
.cpp.o:
|
135
|
+
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
136
|
+
|
137
|
+
.C.o:
|
138
|
+
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
|
139
|
+
|
140
|
+
.c.o:
|
141
|
+
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
|
142
|
+
|
143
|
+
$(DLLIB): $(OBJS)
|
144
|
+
@-$(RM) $@
|
145
|
+
$(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
$(OBJS): ruby.h defines.h
|
data/ext/mkmf.log
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
have_library: checking for main() in -lxml2... -------------------- yes
|
2
|
+
|
3
|
+
"gcc -o conftest -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -arch ppc -arch i386 -Os -pipe -fno-common conftest.c -L"." -L"/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib" -L. -arch ppc -arch i386 -lruby -lxml2 -lpthread -ldl -lm "
|
4
|
+
checked program was:
|
5
|
+
/* begin */
|
6
|
+
1: /*top*/
|
7
|
+
2: int main() { return 0; }
|
8
|
+
3: int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
|
9
|
+
/* end */
|
10
|
+
|
11
|
+
--------------------
|
12
|
+
|
13
|
+
find_header: checking for #include <libxml/parser.h>
|
14
|
+
... -------------------- yes
|
15
|
+
|
16
|
+
"gcc -E -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -Os -pipe -fno-common conftest.c -o conftest.i"
|
17
|
+
conftest.c:1:27: error: libxml/parser.h: No such file or directory
|
18
|
+
checked program was:
|
19
|
+
/* begin */
|
20
|
+
1: #include <libxml/parser.h>
|
21
|
+
/* end */
|
22
|
+
|
23
|
+
"gcc -E -I. -I/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin9.0 -I. -Os -pipe -fno-common -I/usr/include/libxml2 conftest.c -o conftest.i"
|
24
|
+
checked program was:
|
25
|
+
/* begin */
|
26
|
+
1: #include <libxml/parser.h>
|
27
|
+
/* end */
|
28
|
+
|
29
|
+
--------------------
|
30
|
+
|
Binary file
|
data/ext/push_parser.c
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
/*
|
2
|
+
* Most of this was ripped from libxml-ruby's SAX handler
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include <libxml/parser.h>
|
6
|
+
#include <ruby.h>
|
7
|
+
|
8
|
+
xmlSAXHandler saxHandler;
|
9
|
+
|
10
|
+
static VALUE
|
11
|
+
push_parser_raise_error (
|
12
|
+
xmlErrorPtr error)
|
13
|
+
{
|
14
|
+
rb_raise(rb_eStandardError, "%s", rb_str_new2((const char*)error->message));
|
15
|
+
return Qnil;
|
16
|
+
}
|
17
|
+
|
18
|
+
static VALUE
|
19
|
+
push_parser_initialize (
|
20
|
+
VALUE self,
|
21
|
+
VALUE handler)
|
22
|
+
{
|
23
|
+
xmlParserCtxtPtr ctxt;
|
24
|
+
ctxt = xmlCreatePushParserCtxt(&saxHandler, (void *)handler, NULL, 0, NULL);
|
25
|
+
|
26
|
+
if (!ctxt)
|
27
|
+
return push_parser_raise_error(&xmlLastError);
|
28
|
+
|
29
|
+
ctxt->sax2 = 1;
|
30
|
+
|
31
|
+
rb_iv_set(self, "@__libxml_push_parser", Data_Wrap_Struct(rb_cData, 0, xmlFreeParserCtxt, ctxt));
|
32
|
+
|
33
|
+
return self;
|
34
|
+
}
|
35
|
+
|
36
|
+
static VALUE
|
37
|
+
push_parser_close (
|
38
|
+
VALUE self)
|
39
|
+
{
|
40
|
+
xmlParserCtxtPtr ctxt;
|
41
|
+
Data_Get_Struct(rb_iv_get(self, "@__libxml_push_parser"), xmlParserCtxt, ctxt);
|
42
|
+
|
43
|
+
if (xmlParseChunk(ctxt, "", 0, 1)) {
|
44
|
+
return push_parser_raise_error(&xmlLastError);
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
return Qtrue;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
static VALUE
|
52
|
+
push_parser_receive (
|
53
|
+
VALUE self,
|
54
|
+
VALUE chunk)
|
55
|
+
{
|
56
|
+
const char *data = StringValuePtr(chunk);
|
57
|
+
int length = RSTRING_LEN(chunk);
|
58
|
+
|
59
|
+
xmlParserCtxtPtr ctxt;
|
60
|
+
Data_Get_Struct(rb_iv_get(self, "@__libxml_push_parser"), xmlParserCtxt, ctxt);
|
61
|
+
|
62
|
+
// Chunk through in 4KB chunks so as not to overwhelm the buffers
|
63
|
+
int i;
|
64
|
+
int chunkSize = length < 4096 ? length : 4096;
|
65
|
+
for (i = 0; i < length; i += chunkSize) {
|
66
|
+
xmlParseChunk(ctxt, data+i, chunkSize, 0);
|
67
|
+
}
|
68
|
+
if ((i -= length) > 0)
|
69
|
+
xmlParseChunk(ctxt, data+(length-i), i, 0);
|
70
|
+
|
71
|
+
return self;
|
72
|
+
}
|
73
|
+
|
74
|
+
/*********
|
75
|
+
CALLBACKS
|
76
|
+
**********/
|
77
|
+
static void
|
78
|
+
push_parser_start_document_callback (
|
79
|
+
void *ctx)
|
80
|
+
{
|
81
|
+
VALUE handler = (VALUE) ctx;
|
82
|
+
if (handler != Qnil)
|
83
|
+
rb_funcall (handler, rb_intern("on_start_document"), 0);
|
84
|
+
}
|
85
|
+
|
86
|
+
static void
|
87
|
+
push_parser_end_document_callback (
|
88
|
+
void *ctx)
|
89
|
+
{
|
90
|
+
VALUE handler = (VALUE) ctx;
|
91
|
+
if (handler != Qnil)
|
92
|
+
rb_funcall (handler, rb_intern("on_end_document"), 0);
|
93
|
+
}
|
94
|
+
|
95
|
+
static void
|
96
|
+
push_parser_start_element_ns_callback (
|
97
|
+
void * ctx,
|
98
|
+
const xmlChar * localname,
|
99
|
+
const xmlChar * prefix,
|
100
|
+
const xmlChar * URI,
|
101
|
+
int nb_namespaces,
|
102
|
+
const xmlChar ** namespaces,
|
103
|
+
int nb_attributes,
|
104
|
+
int nb_defaulted,
|
105
|
+
const xmlChar ** attributes)
|
106
|
+
{
|
107
|
+
VALUE handler = (VALUE) ctx;
|
108
|
+
if (handler == Qnil)
|
109
|
+
return;
|
110
|
+
|
111
|
+
VALUE attrHash = rb_hash_new();
|
112
|
+
VALUE nsHash = rb_hash_new();
|
113
|
+
|
114
|
+
if (attributes)
|
115
|
+
{
|
116
|
+
/* Each attribute is an array of [localname, prefix, URI, value, end] */
|
117
|
+
int i;
|
118
|
+
for (i = 0; i < nb_attributes * 5; i += 5)
|
119
|
+
{
|
120
|
+
rb_hash_aset( attrHash,
|
121
|
+
rb_str_new2((const char*)attributes[i+0]),
|
122
|
+
rb_str_new((const char*)attributes[i+3], attributes[i+4] - attributes[i+3]));
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
126
|
+
if (namespaces)
|
127
|
+
{
|
128
|
+
int i;
|
129
|
+
for (i = 0; i < nb_namespaces * 2; i += 2)
|
130
|
+
{
|
131
|
+
rb_hash_aset( nsHash,
|
132
|
+
namespaces[i+0] ? rb_str_new2((const char*)namespaces[i+0]) : Qnil,
|
133
|
+
namespaces[i+1] ? rb_str_new2((const char*)namespaces[i+1]) : Qnil);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
rb_funcall(handler, rb_intern("on_start_element_ns"), 5,
|
138
|
+
rb_str_new2((const char*)localname),
|
139
|
+
attrHash,
|
140
|
+
prefix ? rb_str_new2((const char*)prefix) : Qnil,
|
141
|
+
URI ? rb_str_new2((const char*)URI) : Qnil,
|
142
|
+
nsHash);
|
143
|
+
}
|
144
|
+
|
145
|
+
static void
|
146
|
+
push_parser_end_element_ns_callback (
|
147
|
+
void * ctx,
|
148
|
+
const xmlChar * localname,
|
149
|
+
const xmlChar * prefix,
|
150
|
+
const xmlChar * URI)
|
151
|
+
{
|
152
|
+
VALUE handler = (VALUE) ctx;
|
153
|
+
if (handler == Qnil)
|
154
|
+
return;
|
155
|
+
|
156
|
+
rb_funcall(handler, rb_intern("on_end_element_ns"), 3,
|
157
|
+
rb_str_new2((const char*)localname),
|
158
|
+
prefix ? rb_str_new2((const char*)prefix) : Qnil,
|
159
|
+
URI ? rb_str_new2((const char*)URI) : Qnil);
|
160
|
+
}
|
161
|
+
|
162
|
+
|
163
|
+
static void
|
164
|
+
push_parser_characters_callback (
|
165
|
+
void *ctx,
|
166
|
+
const char *chars,
|
167
|
+
int len)
|
168
|
+
{
|
169
|
+
VALUE handler = (VALUE) ctx;
|
170
|
+
if (handler != Qnil)
|
171
|
+
rb_funcall (handler, rb_intern("on_characters"), 1, rb_str_new(chars, len));
|
172
|
+
}
|
173
|
+
|
174
|
+
static void
|
175
|
+
push_parser_structured_error_callback (
|
176
|
+
void *ctx,
|
177
|
+
xmlErrorPtr error)
|
178
|
+
{
|
179
|
+
VALUE handler = (VALUE) ctx;
|
180
|
+
if (handler != Qnil)
|
181
|
+
rb_funcall (handler, rb_intern("on_error"), 1, rb_str_new2((const char*)error->message));
|
182
|
+
}
|
183
|
+
|
184
|
+
xmlSAXHandler saxHandler = {
|
185
|
+
0, //internalSubset
|
186
|
+
0, //isStandalone
|
187
|
+
0, //hasInternalSubset
|
188
|
+
0, //hasExternalSubset
|
189
|
+
0, //resolveEntity
|
190
|
+
0, //getEntity
|
191
|
+
0, //entityDecl
|
192
|
+
0, //notationDecl
|
193
|
+
0, //attributeDecl
|
194
|
+
0, //elementDecl
|
195
|
+
0, //unparsedEntityDecl
|
196
|
+
0, //setDocumentLocator
|
197
|
+
(startDocumentSAXFunc) push_parser_start_document_callback,
|
198
|
+
(endDocumentSAXFunc) push_parser_end_document_callback,
|
199
|
+
0, //startElement
|
200
|
+
0, //endElement
|
201
|
+
0, //reference
|
202
|
+
(charactersSAXFunc) push_parser_characters_callback,
|
203
|
+
0, //ignorableWhitespace
|
204
|
+
0, //processingInstruction
|
205
|
+
0, //comment
|
206
|
+
0, //warning
|
207
|
+
(errorSAXFunc) push_parser_structured_error_callback,
|
208
|
+
0, //fatalError
|
209
|
+
0, //getParameterEntity
|
210
|
+
0, //cdataBlock
|
211
|
+
0, //externalSubset
|
212
|
+
XML_SAX2_MAGIC,
|
213
|
+
0, //_private
|
214
|
+
(startElementNsSAX2Func) push_parser_start_element_ns_callback,
|
215
|
+
(endElementNsSAX2Func) push_parser_end_element_ns_callback,
|
216
|
+
(xmlStructuredErrorFunc) push_parser_structured_error_callback
|
217
|
+
};
|
218
|
+
|
219
|
+
void
|
220
|
+
Init_push_parser()
|
221
|
+
{
|
222
|
+
/* SaxPushParser */
|
223
|
+
VALUE mLibXML = rb_define_module("LibXML");
|
224
|
+
VALUE mXML = rb_define_module_under(mLibXML, "XML");
|
225
|
+
VALUE cXMLSaxPushParser = rb_define_class_under(mXML, "SaxPushParser", rb_cObject);
|
226
|
+
|
227
|
+
/* Instance Methods */
|
228
|
+
rb_define_method(cXMLSaxPushParser, "initialize", push_parser_initialize, 1);
|
229
|
+
rb_define_method(cXMLSaxPushParser, "receive", push_parser_receive, 1);
|
230
|
+
rb_define_method(cXMLSaxPushParser, "close", push_parser_close, 0);
|
231
|
+
}
|