eventmachine-eventmachine 0.12.7 → 0.12.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/{docs/README → README} +21 -13
  2. data/Rakefile +14 -4
  3. data/docs/DEFERRABLES +0 -5
  4. data/docs/INSTALL +2 -4
  5. data/docs/LEGAL +1 -1
  6. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
  7. data/docs/PURE_RUBY +0 -2
  8. data/docs/RELEASE_NOTES +0 -2
  9. data/docs/SMTP +0 -7
  10. data/docs/SPAWNED_PROCESSES +0 -4
  11. data/docs/TODO +0 -2
  12. data/eventmachine.gemspec +17 -8
  13. data/examples/ex_channel.rb +43 -0
  14. data/examples/ex_queue.rb +2 -0
  15. data/examples/helper.rb +2 -0
  16. data/ext/cmain.cpp +119 -20
  17. data/ext/cplusplus.cpp +15 -6
  18. data/ext/ed.cpp +303 -93
  19. data/ext/ed.h +49 -22
  20. data/ext/em.cpp +368 -42
  21. data/ext/em.h +43 -6
  22. data/ext/eventmachine.h +21 -8
  23. data/ext/eventmachine_cpp.h +1 -0
  24. data/ext/extconf.rb +4 -0
  25. data/ext/kb.cpp +1 -2
  26. data/ext/pipe.cpp +1 -3
  27. data/ext/project.h +21 -0
  28. data/ext/rubymain.cpp +232 -32
  29. data/ext/ssl.cpp +38 -1
  30. data/ext/ssl.h +5 -1
  31. data/java/src/com/rubyeventmachine/Application.java +7 -3
  32. data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
  33. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
  34. data/lib/{protocols → em}/buftok.rb +16 -5
  35. data/lib/em/callback.rb +26 -0
  36. data/lib/em/channel.rb +57 -0
  37. data/lib/em/connection.rb +505 -0
  38. data/lib/em/deferrable.rb +144 -165
  39. data/lib/em/file_watch.rb +54 -0
  40. data/lib/em/future.rb +24 -25
  41. data/lib/em/messages.rb +1 -1
  42. data/lib/em/process_watch.rb +44 -0
  43. data/lib/em/processes.rb +58 -52
  44. data/lib/em/protocols/header_and_content.rb +138 -0
  45. data/lib/em/protocols/httpclient.rb +263 -0
  46. data/lib/em/protocols/httpclient2.rb +582 -0
  47. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  48. data/lib/em/protocols/linetext2.rb +160 -0
  49. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  50. data/lib/em/protocols/object_protocol.rb +39 -0
  51. data/lib/em/protocols/postgres3.rb +247 -0
  52. data/lib/em/protocols/saslauth.rb +175 -0
  53. data/lib/em/protocols/smtpclient.rb +331 -0
  54. data/lib/em/protocols/smtpserver.rb +547 -0
  55. data/lib/em/protocols/stomp.rb +200 -0
  56. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  57. data/lib/em/protocols.rb +35 -0
  58. data/lib/em/queue.rb +61 -0
  59. data/lib/em/spawnable.rb +53 -56
  60. data/lib/em/streamer.rb +92 -74
  61. data/lib/em/timers.rb +55 -0
  62. data/lib/em/version.rb +3 -0
  63. data/lib/eventmachine.rb +1008 -1298
  64. data/lib/evma.rb +1 -1
  65. data/lib/jeventmachine.rb +106 -101
  66. data/lib/pr_eventmachine.rb +47 -36
  67. data/tasks/project.rake +2 -1
  68. data/tests/client.crt +31 -0
  69. data/tests/client.key +51 -0
  70. data/tests/test_attach.rb +18 -0
  71. data/tests/test_basic.rb +108 -54
  72. data/tests/test_channel.rb +63 -0
  73. data/tests/test_connection_count.rb +2 -2
  74. data/tests/test_epoll.rb +109 -110
  75. data/tests/test_errors.rb +36 -36
  76. data/tests/test_exc.rb +22 -25
  77. data/tests/test_file_watch.rb +49 -0
  78. data/tests/test_futures.rb +77 -93
  79. data/tests/test_hc.rb +2 -2
  80. data/tests/test_httpclient.rb +55 -52
  81. data/tests/test_httpclient2.rb +110 -112
  82. data/tests/test_inactivity_timeout.rb +30 -0
  83. data/tests/test_kb.rb +8 -9
  84. data/tests/test_ltp2.rb +274 -277
  85. data/tests/test_next_tick.rb +91 -65
  86. data/tests/test_object_protocol.rb +37 -0
  87. data/tests/test_process_watch.rb +48 -0
  88. data/tests/test_processes.rb +56 -23
  89. data/tests/test_proxy_connection.rb +92 -0
  90. data/tests/test_pure.rb +1 -5
  91. data/tests/test_queue.rb +44 -0
  92. data/tests/test_running.rb +9 -14
  93. data/tests/test_sasl.rb +32 -34
  94. data/tests/test_send_file.rb +175 -176
  95. data/tests/test_servers.rb +37 -41
  96. data/tests/test_smtpserver.rb +47 -55
  97. data/tests/test_spawn.rb +284 -291
  98. data/tests/test_ssl_args.rb +1 -1
  99. data/tests/test_ssl_methods.rb +1 -1
  100. data/tests/test_ssl_verify.rb +82 -0
  101. data/tests/test_timers.rb +81 -88
  102. data/tests/test_ud.rb +0 -7
  103. data/tests/testem.rb +1 -1
  104. metadata +53 -37
  105. data/lib/em/eventable.rb +0 -39
  106. data/lib/eventmachine_version.rb +0 -31
  107. data/lib/protocols/header_and_content.rb +0 -129
  108. data/lib/protocols/httpcli2.rb +0 -803
  109. data/lib/protocols/httpclient.rb +0 -270
  110. data/lib/protocols/linetext2.rb +0 -161
  111. data/lib/protocols/postgres.rb +0 -261
  112. data/lib/protocols/saslauth.rb +0 -179
  113. data/lib/protocols/smtpclient.rb +0 -308
  114. data/lib/protocols/smtpserver.rb +0 -556
  115. data/lib/protocols/stomp.rb +0 -153
  116. data/tests/test_eventables.rb +0 -77
@@ -1,8 +1,11 @@
1
- $Id$
2
-
3
1
  = RUBY/EventMachine
4
2
 
5
3
  Homepage:: http://rubyeventmachine.com
4
+ Rubyforge Page:: http://rubyforge.org/projects/eventmachine
5
+ Google Group:: http://groups.google.com/group/eventmachine
6
+ Mailing List:: http://rubyforge.org/pipermail/eventmachine-talk
7
+ RDoc:: http://eventmachine.rubyforge.org
8
+ IRC:: ##eventmachine on irc.freenode.net
6
9
  Copyright:: (C) 2006-07 by Francis Cianfrocca. All Rights Reserved.
7
10
  Email:: gmail address: garbagecat10
8
11
 
@@ -57,18 +60,23 @@ improved.
57
60
 
58
61
  Here's a fully-functional echo server written with EventMachine:
59
62
 
60
- require 'rubygems'
61
- require 'eventmachine'
63
+ require 'eventmachine'
62
64
 
63
- module EchoServer
64
- def receive_data data
65
- send_data ">>>you sent: #{data}"
66
- close_connection if data =~ /quit/i
67
- end
68
- end
65
+ module EchoServer
66
+ def post_init
67
+ puts "-- someone connected to the echo server!"
68
+ end
69
69
 
70
- EventMachine::run {
71
- EventMachine::start_server "192.168.0.100", 8081, EchoServer
72
- }
70
+ def receive_data data
71
+ send_data ">>>you sent: #{data}"
72
+ close_connection if data =~ /quit/i
73
+ end
73
74
 
75
+ def unbind
76
+ puts "-- someone disconnected from the echo server!"
77
+ end
78
+ end
74
79
 
80
+ EventMachine::run {
81
+ EventMachine::start_server "127.0.0.1", 8081, EchoServer
82
+ }
data/Rakefile CHANGED
@@ -87,8 +87,8 @@ Spec = Gem::Specification.new do |s|
87
87
  s.platform = Gem::Platform::RUBY
88
88
 
89
89
  s.has_rdoc = true
90
- s.rdoc_options = %w(--title EventMachine --main docs/README --line-numbers)
91
- s.extra_rdoc_files = Dir['docs/*']
90
+ s.rdoc_options = %w(--title EventMachine --main README --line-numbers -x lib/em/version -x lib/emva -x lib/evma/ -x lib/pr_eventmachine -x lib/jeventmachine)
91
+ s.extra_rdoc_files = Dir['README,docs/*']
92
92
 
93
93
  s.files = `git ls-files`.split("\n")
94
94
 
@@ -124,7 +124,7 @@ of EventMachine is to enable programs to easily interface with other programs
124
124
  using TCP/IP, especially if custom protocols are required.
125
125
  EOD
126
126
 
127
- require 'lib/eventmachine_version'
127
+ require 'lib/em/version'
128
128
  s.version = EventMachine::VERSION
129
129
  end
130
130
 
@@ -132,6 +132,10 @@ if RUBY_PLATFORM =~ /mswin/
132
132
  Spec.platform = 'x86-mswin32-60'
133
133
  Spec.files += %w[ lib/rubyeventmachine.so lib/fastfilereaderext.so ]
134
134
  Spec.extensions = nil
135
+ elsif RUBY_PLATFORM =~ /java/
136
+ Spec.platform = 'java'
137
+ Spec.files += %w[ lib/em_reactor.jar ]
138
+ Spec.extensions = nil
135
139
  end
136
140
 
137
141
  # this is a hack right now, it requires installing msysgit in the global path so it can use tar/curl/etc.
@@ -181,6 +185,7 @@ namespace :win32 do
181
185
  end
182
186
  end
183
187
 
188
+ desc "build binary win32 gem"
184
189
  task :gem => :build_openssl do
185
190
  Rake::Task['build'].invoke
186
191
  Rake::Task['gem'].invoke
@@ -220,7 +225,7 @@ namespace :ext do
220
225
  end
221
226
  end
222
227
  end
223
-
228
+
224
229
  namespace :java do
225
230
  # This task creates the JRuby JAR file and leaves it in the lib directory.
226
231
  # This step is required before executing the jgem task.
@@ -244,6 +249,11 @@ namespace :java do
244
249
  sh "jar -cf em_reactor.jar com/rubyeventmachine/*.class"
245
250
  end
246
251
  end
252
+
253
+ desc "build a java binary gem"
254
+ task :gem => :build do
255
+ Rake::Task['gem'].invoke
256
+ end
247
257
  end
248
258
 
249
259
  task :gemspec => :clobber do
data/docs/DEFERRABLES CHANGED
@@ -1,10 +1,5 @@
1
- $Id$
2
-
3
- [DOCUMENT UNDER CONSTRUCTION]
4
-
5
1
  EventMachine (EM) adds two different formalisms for lightweight concurrency to the Ruby programmer's toolbox: spawned processes and deferrables. This note will show you how to use deferrables. For more information, see the separate document LIGHTWEIGHT_CONCURRENCY.
6
2
 
7
-
8
3
  === What are Deferrables?
9
4
 
10
5
  EventMachine's Deferrable borrows heavily from the "deferred" object in Python's "Twisted" event-handling framework. Here's a minimal example that illustrates Deferrable:
data/docs/INSTALL CHANGED
@@ -1,5 +1,3 @@
1
- $Id$
2
-
3
1
  If you have obtained an EventMachine source-tarball (.tar.gz):
4
2
  unzip and untar the tarball, and enter the directory that is
5
3
  created. In that directory, say:
@@ -7,8 +5,8 @@ ruby setup.rb
7
5
  (You may need to be root to execute this command.)
8
6
 
9
7
  To create documentation for EventMachine, simply type:
10
- rdoc
11
- in the distro directory. Rdocs will be created in subdirectory doc.
8
+ rake rdoc
9
+ in the distro directory. Rdocs will be created in subdirectory rdoc.
12
10
 
13
11
  If you have obtained a gem version of EventMachine, install it in the
14
12
  usual way (gem install eventmachine). You may need superuser privileges
data/docs/LEGAL CHANGED
@@ -19,7 +19,7 @@ setup.rb
19
19
  the GNU LGPL, Lesser General Public License version 2.1.
20
20
 
21
21
 
22
- lib/protocols/buftok.rb
22
+ lib/em/buftok.rb
23
23
  This file is Copyright (C) 2007 by Tony Arcieri. This file is
24
24
  covered by the terms of Ruby's License (see the file COPYING).
25
25
 
@@ -1,5 +1,3 @@
1
- $Id$
2
-
3
1
  EventMachine (EM) adds two different formalisms for lightweight concurrency to the Ruby programmer's toolbox: spawned processes and deferrables. This note will show you how to use them.
4
2
 
5
3
 
data/docs/PURE_RUBY CHANGED
@@ -1,5 +1,3 @@
1
- $Id$
2
-
3
1
  EventMachine is supplied in three alternative versions.
4
2
 
5
3
  1) A version that includes a Ruby extension written in C++. This version requires compilation;
data/docs/RELEASE_NOTES CHANGED
@@ -1,5 +1,3 @@
1
- $Id$
2
-
3
1
  RUBY/EventMachine RELEASE NOTES
4
2
 
5
3
  --------------------------------------------------
data/docs/SMTP CHANGED
@@ -1,9 +1,2 @@
1
- $Id$
2
-
3
-
4
- [DOCUMENT UNDER CONSTRUCTION]
5
-
6
1
  This note details the usage of EventMachine's built-in support for SMTP. EM supports both client and server connections, which will be described in separate sections.
7
2
 
8
-
9
-
@@ -1,7 +1,3 @@
1
- $Id$
2
-
3
- [DOCUMENT UNDER CONSTRUCTION]
4
-
5
1
  EventMachine (EM) adds two different formalisms for lightweight concurrency to the Ruby programmer's toolbox: spawned processes and deferrables. This note will show you how to use spawned processes. For more information, see the separate document LIGHTWEIGHT_CONCURRENCY.
6
2
 
7
3
 
data/docs/TODO CHANGED
@@ -1,5 +1,3 @@
1
- $Id$
2
-
3
1
  TODO List:
4
2
 
5
3
  12Aug06: Noticed by Don Stocks. A TCP connect-request that results
data/eventmachine.gemspec CHANGED
@@ -2,27 +2,36 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{eventmachine}
5
- s.version = "0.12.7"
5
+ s.version = "0.12.8"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Francis Cianfrocca"]
9
- s.date = %q{2009-03-07}
10
- s.description = %q{EventMachine implements a fast, single-threaded engine for arbitrary network communications. It's extremely easy to use in Ruby. EventMachine wraps all interactions with IP sockets, allowing programs to concentrate on the implementation of network protocols. It can be used to create both network servers and clients. To create a server or client, a Ruby program only needs to specify the IP address and port, and provide a Module that implements the communications protocol. Implementations of several standard network protocols are provided with the package, primarily to serve as examples. The real goal of EventMachine is to enable programs to easily interface with other programs using TCP/IP, especially if custom protocols are required.}
9
+ s.date = %q{2009-05-22}
10
+ s.description = %q{EventMachine implements a fast, single-threaded engine for arbitrary network
11
+ communications. It's extremely easy to use in Ruby. EventMachine wraps all
12
+ interactions with IP sockets, allowing programs to concentrate on the
13
+ implementation of network protocols. It can be used to create both network
14
+ servers and clients. To create a server or client, a Ruby program only needs
15
+ to specify the IP address and port, and provide a Module that implements the
16
+ communications protocol. Implementations of several standard network protocols
17
+ are provided with the package, primarily to serve as examples. The real goal
18
+ of EventMachine is to enable programs to easily interface with other programs
19
+ using TCP/IP, especially if custom protocols are required.
20
+ }
11
21
  s.email = %q{garbagecat10@gmail.com}
12
22
  s.extensions = ["ext/extconf.rb", "ext/fastfilereader/extconf.rb"]
13
- s.extra_rdoc_files = ["docs/ChangeLog", "docs/COPYING", "docs/DEFERRABLES", "docs/EPOLL", "docs/GNU", "docs/INSTALL", "docs/KEYBOARD", "docs/LEGAL", "docs/LIGHTWEIGHT_CONCURRENCY", "docs/PURE_RUBY", "docs/README", "docs/RELEASE_NOTES", "docs/SMTP", "docs/SPAWNED_PROCESSES", "docs/TODO"]
14
- s.files = [".gitignore", "Rakefile", "docs/COPYING", "docs/ChangeLog", "docs/DEFERRABLES", "docs/EPOLL", "docs/GNU", "docs/INSTALL", "docs/KEYBOARD", "docs/LEGAL", "docs/LIGHTWEIGHT_CONCURRENCY", "docs/PURE_RUBY", "docs/README", "docs/RELEASE_NOTES", "docs/SMTP", "docs/SPAWNED_PROCESSES", "docs/TODO", "eventmachine.gemspec", "ext/binder.cpp", "ext/binder.h", "ext/cmain.cpp", "ext/cplusplus.cpp", "ext/ed.cpp", "ext/ed.h", "ext/em.cpp", "ext/em.h", "ext/emwin.cpp", "ext/emwin.h", "ext/epoll.cpp", "ext/epoll.h", "ext/eventmachine.h", "ext/eventmachine_cpp.h", "ext/extconf.rb", "ext/fastfilereader/extconf.rb", "ext/fastfilereader/mapper.cpp", "ext/fastfilereader/mapper.h", "ext/fastfilereader/rubymain.cpp", "ext/files.cpp", "ext/files.h", "ext/kb.cpp", "ext/page.cpp", "ext/page.h", "ext/pipe.cpp", "ext/project.h", "ext/rubymain.cpp", "ext/sigs.cpp", "ext/sigs.h", "ext/ssl.cpp", "ext/ssl.h", "java/.classpath", "java/.project", "java/src/com/rubyeventmachine/Application.java", "java/src/com/rubyeventmachine/Connection.java", "java/src/com/rubyeventmachine/ConnectionFactory.java", "java/src/com/rubyeventmachine/DefaultConnectionFactory.java", "java/src/com/rubyeventmachine/EmReactor.java", "java/src/com/rubyeventmachine/EmReactorException.java", "java/src/com/rubyeventmachine/EventableChannel.java", "java/src/com/rubyeventmachine/EventableDatagramChannel.java", "java/src/com/rubyeventmachine/EventableSocketChannel.java", "java/src/com/rubyeventmachine/PeriodicTimer.java", "java/src/com/rubyeventmachine/Timer.java", "java/src/com/rubyeventmachine/tests/ApplicationTest.java", "java/src/com/rubyeventmachine/tests/ConnectTest.java", "java/src/com/rubyeventmachine/tests/EMTest.java", "java/src/com/rubyeventmachine/tests/TestDatagrams.java", "java/src/com/rubyeventmachine/tests/TestServers.java", "java/src/com/rubyeventmachine/tests/TestTimers.java", "lib/em/deferrable.rb", "lib/em/eventable.rb", "lib/em/future.rb", "lib/em/messages.rb", "lib/em/processes.rb", "lib/em/spawnable.rb", "lib/em/streamer.rb", "lib/eventmachine.rb", "lib/eventmachine_version.rb", "lib/evma.rb", "lib/evma/callback.rb", "lib/evma/container.rb", "lib/evma/factory.rb", "lib/evma/protocol.rb", "lib/evma/reactor.rb", "lib/jeventmachine.rb", "lib/pr_eventmachine.rb", "lib/protocols/buftok.rb", "lib/protocols/header_and_content.rb", "lib/protocols/httpcli2.rb", "lib/protocols/httpclient.rb", "lib/protocols/line_and_text.rb", "lib/protocols/linetext2.rb", "lib/protocols/memcache.rb", "lib/protocols/postgres.rb", "lib/protocols/saslauth.rb", "lib/protocols/smtpclient.rb", "lib/protocols/smtpserver.rb", "lib/protocols/stomp.rb", "lib/protocols/tcptest.rb", "setup.rb", "tasks/cpp.rake", "tasks/project.rake", "tasks/tests.rake", "tests/test_attach.rb", "tests/test_basic.rb", "tests/test_connection_count.rb", "tests/test_defer.rb", "tests/test_epoll.rb", "tests/test_error_handler.rb", "tests/test_errors.rb", "tests/test_eventables.rb", "tests/test_exc.rb", "tests/test_futures.rb", "tests/test_handler_check.rb", "tests/test_hc.rb", "tests/test_httpclient.rb", "tests/test_httpclient2.rb", "tests/test_kb.rb", "tests/test_ltp.rb", "tests/test_ltp2.rb", "tests/test_next_tick.rb", "tests/test_processes.rb", "tests/test_pure.rb", "tests/test_running.rb", "tests/test_sasl.rb", "tests/test_send_file.rb", "tests/test_servers.rb", "tests/test_smtpclient.rb", "tests/test_smtpserver.rb", "tests/test_spawn.rb", "tests/test_ssl_args.rb", "tests/test_ssl_methods.rb", "tests/test_timers.rb", "tests/test_ud.rb", "tests/testem.rb", "web/whatis"]
15
23
  s.has_rdoc = true
24
+ s.files = [".gitignore", "README", "Rakefile", "docs/COPYING", "docs/ChangeLog", "docs/DEFERRABLES", "docs/EPOLL", "docs/GNU", "docs/INSTALL", "docs/KEYBOARD", "docs/LEGAL", "docs/LIGHTWEIGHT_CONCURRENCY", "docs/PURE_RUBY", "docs/RELEASE_NOTES", "docs/SMTP", "docs/SPAWNED_PROCESSES", "docs/TODO", "eventmachine.gemspec", "examples/ex_channel.rb", "examples/ex_queue.rb", "examples/helper.rb", "ext/binder.cpp", "ext/binder.h", "ext/cmain.cpp", "ext/cplusplus.cpp", "ext/ed.cpp", "ext/ed.h", "ext/em.cpp", "ext/em.h", "ext/emwin.cpp", "ext/emwin.h", "ext/epoll.cpp", "ext/epoll.h", "ext/eventmachine.h", "ext/eventmachine_cpp.h", "ext/extconf.rb", "ext/fastfilereader/extconf.rb", "ext/fastfilereader/mapper.cpp", "ext/fastfilereader/mapper.h", "ext/fastfilereader/rubymain.cpp", "ext/files.cpp", "ext/files.h", "ext/kb.cpp", "ext/page.cpp", "ext/page.h", "ext/pipe.cpp", "ext/project.h", "ext/rubymain.cpp", "ext/sigs.cpp", "ext/sigs.h", "ext/ssl.cpp", "ext/ssl.h", "java/.classpath", "java/.project", "java/src/com/rubyeventmachine/Application.java", "java/src/com/rubyeventmachine/Connection.java", "java/src/com/rubyeventmachine/ConnectionFactory.java", "java/src/com/rubyeventmachine/DefaultConnectionFactory.java", "java/src/com/rubyeventmachine/EmReactor.java", "java/src/com/rubyeventmachine/EmReactorException.java", "java/src/com/rubyeventmachine/EventableChannel.java", "java/src/com/rubyeventmachine/EventableDatagramChannel.java", "java/src/com/rubyeventmachine/EventableSocketChannel.java", "java/src/com/rubyeventmachine/PeriodicTimer.java", "java/src/com/rubyeventmachine/Timer.java", "java/src/com/rubyeventmachine/tests/ApplicationTest.java", "java/src/com/rubyeventmachine/tests/ConnectTest.java", "java/src/com/rubyeventmachine/tests/EMTest.java", "java/src/com/rubyeventmachine/tests/TestDatagrams.java", "java/src/com/rubyeventmachine/tests/TestServers.java", "java/src/com/rubyeventmachine/tests/TestTimers.java", "lib/em/buftok.rb", "lib/em/callback.rb", "lib/em/channel.rb", "lib/em/connection.rb", "lib/em/deferrable.rb", "lib/em/file_watch.rb", "lib/em/future.rb", "lib/em/messages.rb", "lib/em/process_watch.rb", "lib/em/processes.rb", "lib/em/protocols.rb", "lib/em/protocols/header_and_content.rb", "lib/em/protocols/httpclient.rb", "lib/em/protocols/httpclient2.rb", "lib/em/protocols/line_and_text.rb", "lib/em/protocols/linetext2.rb", "lib/em/protocols/memcache.rb", "lib/em/protocols/object_protocol.rb", "lib/em/protocols/postgres3.rb", "lib/em/protocols/saslauth.rb", "lib/em/protocols/smtpclient.rb", "lib/em/protocols/smtpserver.rb", "lib/em/protocols/stomp.rb", "lib/em/protocols/tcptest.rb", "lib/em/queue.rb", "lib/em/spawnable.rb", "lib/em/streamer.rb", "lib/em/timers.rb", "lib/em/version.rb", "lib/eventmachine.rb", "lib/evma.rb", "lib/evma/callback.rb", "lib/evma/container.rb", "lib/evma/factory.rb", "lib/evma/protocol.rb", "lib/evma/reactor.rb", "lib/jeventmachine.rb", "lib/pr_eventmachine.rb", "setup.rb", "tasks/cpp.rake", "tasks/project.rake", "tasks/tests.rake", "tests/client.crt", "tests/client.key", "tests/test_attach.rb", "tests/test_basic.rb", "tests/test_channel.rb", "tests/test_connection_count.rb", "tests/test_defer.rb", "tests/test_epoll.rb", "tests/test_error_handler.rb", "tests/test_errors.rb", "tests/test_exc.rb", "tests/test_file_watch.rb", "tests/test_futures.rb", "tests/test_handler_check.rb", "tests/test_hc.rb", "tests/test_httpclient.rb", "tests/test_httpclient2.rb", "tests/test_inactivity_timeout.rb", "tests/test_kb.rb", "tests/test_ltp.rb", "tests/test_ltp2.rb", "tests/test_next_tick.rb", "tests/test_object_protocol.rb", "tests/test_process_watch.rb", "tests/test_processes.rb", "tests/test_proxy_connection.rb", "tests/test_pure.rb", "tests/test_queue.rb", "tests/test_running.rb", "tests/test_sasl.rb", "tests/test_send_file.rb", "tests/test_servers.rb", "tests/test_smtpclient.rb", "tests/test_smtpserver.rb", "tests/test_spawn.rb", "tests/test_ssl_args.rb", "tests/test_ssl_methods.rb", "tests/test_ssl_verify.rb", "tests/test_timers.rb", "tests/test_ud.rb", "tests/testem.rb", "web/whatis"]
16
25
  s.homepage = %q{http://rubyeventmachine.com}
17
- s.rdoc_options = ["--title", "EventMachine", "--main", "docs/README", "--line-numbers"]
26
+ s.rdoc_options = ["--title", "EventMachine", "--main", "README", "--line-numbers", "-x", "lib/em/version", "-x", "lib/emva", "-x", "lib/evma/", "-x", "lib/pr_eventmachine", "-x", "lib/jeventmachine"]
18
27
  s.require_paths = ["lib"]
19
28
  s.rubyforge_project = %q{eventmachine}
20
- s.rubygems_version = %q{1.3.1}
29
+ s.rubygems_version = %q{1.3.3}
21
30
  s.summary = %q{Ruby/EventMachine library}
22
31
 
23
32
  if s.respond_to? :specification_version then
24
33
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
- s.specification_version = 2
34
+ s.specification_version = 3
26
35
 
27
36
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
37
  else
@@ -0,0 +1,43 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ EM.run do
4
+
5
+ # Create a channel to push data to, this could be stocks...
6
+ RandChannel = EM::Channel.new
7
+
8
+ # The server simply subscribes client connections to the channel on connect,
9
+ # and unsubscribes them on disconnect.
10
+ class Server < EM::Connection
11
+ def self.start(host = '127.0.0.1', port = 8000)
12
+ EM.start_server(host, port, self)
13
+ end
14
+
15
+ def post_init
16
+ @sid = RandChannel.subscribe { |m| send_data "#{m.inspect}\n" }
17
+ end
18
+
19
+ def unbind
20
+ RandChannel.unsubscribe @sid
21
+ end
22
+ end
23
+ Server.start
24
+
25
+ # Two client connections, that just print what they receive.
26
+ 2.times do
27
+ EM.connect('127.0.0.1', 8000) do |c|
28
+ c.extend EM::P::LineText2
29
+ def c.receive_line(line)
30
+ puts "Subscriber: #{signature} got #{line}"
31
+ end
32
+ EM.add_timer(2) { c.close_connection }
33
+ end
34
+ end
35
+
36
+ # This part of the example is more fake, but imagine sleep was in fact a
37
+ # long running calculation to achieve the value.
38
+ 40.times do
39
+ EM.defer lambda { v = sleep(rand * 2); RandChannel << [Time.now, v] }
40
+ end
41
+
42
+ EM.add_timer(5) { EM.stop }
43
+ end
@@ -0,0 +1,2 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
@@ -0,0 +1,2 @@
1
+ $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
+ require 'eventmachine'
data/ext/cmain.cpp CHANGED
@@ -99,10 +99,10 @@ extern "C" const char *evma_install_oneshot_timer (int seconds)
99
99
  evma_connect_to_server
100
100
  **********************/
101
101
 
102
- extern "C" const char *evma_connect_to_server (const char *server, int port)
102
+ extern "C" const char *evma_connect_to_server (const char *bind_addr, int bind_port, const char *server, int port)
103
103
  {
104
104
  ensure_eventmachine("evma_connect_to_server");
105
- return EventMachine->ConnectToServer (server, port);
105
+ return EventMachine->ConnectToServer (bind_addr, bind_port, server, port);
106
106
  }
107
107
 
108
108
  /***************************
@@ -183,7 +183,45 @@ extern "C" const char *evma_open_keyboard()
183
183
  return EventMachine->OpenKeyboard();
184
184
  }
185
185
 
186
+ /*******************
187
+ evma_watch_filename
188
+ *******************/
186
189
 
190
+ extern "C" const char *evma_watch_filename (const char *fname)
191
+ {
192
+ ensure_eventmachine("evma_watch_filename");
193
+ return EventMachine->WatchFile(fname);
194
+ }
195
+
196
+ /*********************
197
+ evma_unwatch_filename
198
+ *********************/
199
+
200
+ extern "C" void evma_unwatch_filename (const char *sig)
201
+ {
202
+ ensure_eventmachine("evma_unwatch_file");
203
+ EventMachine->UnwatchFile(sig);
204
+ }
205
+
206
+ /**************
207
+ evma_watch_pid
208
+ **************/
209
+
210
+ extern "C" const char *evma_watch_pid (int pid)
211
+ {
212
+ ensure_eventmachine("evma_watch_pid");
213
+ return EventMachine->WatchPid(pid);
214
+ }
215
+
216
+ /****************
217
+ evma_unwatch_pid
218
+ ****************/
219
+
220
+ extern "C" void evma_unwatch_pid (const char *sig)
221
+ {
222
+ ensure_eventmachine("evma_unwatch_pid");
223
+ EventMachine->UnwatchPid(sig);
224
+ }
187
225
 
188
226
  /****************************
189
227
  evma_send_data_to_connection
@@ -264,17 +302,17 @@ extern "C" void evma_start_tls (const char *binding)
264
302
  evma_set_tls_parms
265
303
  ******************/
266
304
 
267
- extern "C" void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filename)
305
+ extern "C" void evma_set_tls_parms (const char *binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer)
268
306
  {
269
307
  ensure_eventmachine("evma_set_tls_parms");
270
308
  EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
271
309
  if (ed)
272
- ed->SetTlsParms (privatekey_filename, certchain_filename);
310
+ ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false));
273
311
  }
274
312
 
275
- /**************
313
+ /******************
276
314
  evma_get_peer_cert
277
- **************/
315
+ ******************/
278
316
 
279
317
  #ifdef WITH_SSL
280
318
  extern "C" X509 *evma_get_peer_cert (const char *binding)
@@ -287,6 +325,20 @@ extern "C" X509 *evma_get_peer_cert (const char *binding)
287
325
  }
288
326
  #endif
289
327
 
328
+ /********************
329
+ evma_accept_ssl_peer
330
+ ********************/
331
+
332
+ #ifdef WITH_SSL
333
+ extern "C" void evma_accept_ssl_peer (const char *binding)
334
+ {
335
+ ensure_eventmachine("evma_accept_ssl_peer");
336
+ ConnectionDescriptor *cd = dynamic_cast <ConnectionDescriptor*> (Bindable_t::GetObject (binding));
337
+ if (cd)
338
+ cd->AcceptSslPeer();
339
+ }
340
+ #endif
341
+
290
342
  /*****************
291
343
  evma_get_peername
292
344
  *****************/
@@ -392,22 +444,22 @@ extern "C" const char *evma__write_file (const char *filename)
392
444
  evma_get_comm_inactivity_timeout
393
445
  ********************************/
394
446
 
395
- extern "C" int evma_get_comm_inactivity_timeout (const char *binding, int *value)
447
+ extern "C" float evma_get_comm_inactivity_timeout (const char *binding)
396
448
  {
397
449
  ensure_eventmachine("evma_get_comm_inactivity_timeout");
398
450
  EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
399
451
  if (ed) {
400
- return ed->GetCommInactivityTimeout (value);
452
+ return ed->GetCommInactivityTimeout();
401
453
  }
402
454
  else
403
- return 0; //Perhaps this should be an exception. Access to an unknown binding.
455
+ return 0.0; //Perhaps this should be an exception. Access to an unknown binding.
404
456
  }
405
457
 
406
458
  /********************************
407
459
  evma_set_comm_inactivity_timeout
408
460
  ********************************/
409
461
 
410
- extern "C" int evma_set_comm_inactivity_timeout (const char *binding, int *value)
462
+ extern "C" int evma_set_comm_inactivity_timeout (const char *binding, float value)
411
463
  {
412
464
  ensure_eventmachine("evma_set_comm_inactivity_timeout");
413
465
  EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
@@ -491,22 +543,22 @@ extern "C" int evma_get_outbound_data_size (const char *binding)
491
543
  }
492
544
 
493
545
 
494
- /***********
495
- evma__epoll
496
- ***********/
546
+ /**************
547
+ evma_set_epoll
548
+ **************/
497
549
 
498
- extern "C" void evma__epoll()
550
+ extern "C" void evma_set_epoll (int use)
499
551
  {
500
- bUseEpoll = 1;
552
+ bUseEpoll = !!use;
501
553
  }
502
554
 
503
- /************
504
- evma__kqueue
505
- ************/
555
+ /***************
556
+ evma_set_kqueue
557
+ ***************/
506
558
 
507
- extern "C" void evma__kqueue()
559
+ extern "C" void evma_set_kqueue (int use)
508
560
  {
509
- bUseKqueue = 1;
561
+ bUseKqueue = !!use;
510
562
  }
511
563
 
512
564
 
@@ -584,3 +636,50 @@ extern "C" int evma_send_file_data_to_connection (const char *binding, const cha
584
636
  return 0;
585
637
  }
586
638
 
639
+
640
+ /****************
641
+ evma_start_proxy
642
+ *****************/
643
+
644
+ extern "C" void evma_start_proxy (const char *from, const char *to)
645
+ {
646
+ ensure_eventmachine("evma_start_proxy");
647
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from));
648
+ if (ed)
649
+ ed->StartProxy(to);
650
+ }
651
+
652
+
653
+ /***************
654
+ evma_stop_proxy
655
+ ****************/
656
+
657
+ extern "C" void evma_stop_proxy (const char *from)
658
+ {
659
+ ensure_eventmachine("evma_stop_proxy");
660
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (from));
661
+ if (ed)
662
+ ed->StopProxy();
663
+ }
664
+
665
+
666
+ /***************************
667
+ evma_get_heartbeat_interval
668
+ ****************************/
669
+
670
+ extern "C" float evma_get_heartbeat_interval()
671
+ {
672
+ ensure_eventmachine("evma_get_heartbeat_interval");
673
+ return EventMachine->GetHeartbeatInterval();
674
+ }
675
+
676
+
677
+ /***************************
678
+ evma_set_heartbeat_interval
679
+ ****************************/
680
+
681
+ extern "C" int evma_set_heartbeat_interval(float interval)
682
+ {
683
+ ensure_eventmachine("evma_set_heartbeat_interval");
684
+ return EventMachine->SetHeartbeatInterval(interval);
685
+ }
data/ext/cplusplus.cpp CHANGED
@@ -33,7 +33,7 @@ EM::Run
33
33
 
34
34
  void EM::Run (void (*start_func)())
35
35
  {
36
- evma__epoll();
36
+ evma_set_epoll (1);
37
37
  evma_initialize_library (EM::Callback);
38
38
  if (start_func)
39
39
  AddTimer (0, start_func);
@@ -115,13 +115,13 @@ void EM::Connection::Close (bool afterWriting)
115
115
  }
116
116
 
117
117
 
118
- /***********************
119
- EM::Connection::Connect
120
- ***********************/
118
+ /***************************
119
+ EM::Connection::BindConnect
120
+ ***************************/
121
121
 
122
- void EM::Connection::Connect (const char *host, int port)
122
+ void EM::Connection::BindConnect (const char *bind_addr, int bind_port, const char *host, int port)
123
123
  {
124
- Signature = evma_connect_to_server (host, port);
124
+ Signature = evma_connect_to_server (bind_addr, bind_port, host, port);
125
125
  #ifdef OS_SOLARIS8
126
126
  Eventables.insert( std::map<std::string,EM::Eventable*>::value_type (Signature, this));
127
127
  #else
@@ -129,6 +129,15 @@ void EM::Connection::Connect (const char *host, int port)
129
129
  #endif
130
130
  }
131
131
 
132
+ /***********************
133
+ EM::Connection::Connect
134
+ ***********************/
135
+
136
+ void EM::Connection::Connect (const char *host, int port)
137
+ {
138
+ this->BindConnect(NULL, 0, host, port);
139
+ }
140
+
132
141
  /*******************
133
142
  EM::Acceptor::Start
134
143
  *******************/