bayserver-core 2.2.0
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.
- checksums.yaml +7 -0
- data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
- data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
- data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
- data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
- data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
- data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
- data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
- data/lib/baykit/bayserver/agent/package.rb +3 -0
- data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
- data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
- data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
- data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
- data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
- data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
- data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
- data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
- data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
- data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
- data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
- data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
- data/lib/baykit/bayserver/bay_dockers.rb +60 -0
- data/lib/baykit/bayserver/bay_exception.rb +12 -0
- data/lib/baykit/bayserver/bay_log.rb +148 -0
- data/lib/baykit/bayserver/bay_message.rb +20 -0
- data/lib/baykit/bayserver/bayserver.rb +529 -0
- data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
- data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
- data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
- data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
- data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
- data/lib/baykit/bayserver/bcf/package.rb +6 -0
- data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
- data/lib/baykit/bayserver/config_exception.rb +25 -0
- data/lib/baykit/bayserver/constants.rb +8 -0
- data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
- data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
- data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
- data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
- data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
- data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
- data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
- data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
- data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
- data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
- data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
- data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
- data/lib/baykit/bayserver/docker/city.rb +22 -0
- data/lib/baykit/bayserver/docker/club.rb +45 -0
- data/lib/baykit/bayserver/docker/docker.rb +8 -0
- data/lib/baykit/bayserver/docker/harbor.rb +34 -0
- data/lib/baykit/bayserver/docker/log.rb +17 -0
- data/lib/baykit/bayserver/docker/package.rb +12 -0
- data/lib/baykit/bayserver/docker/permission.rb +18 -0
- data/lib/baykit/bayserver/docker/port.rb +39 -0
- data/lib/baykit/bayserver/docker/reroute.rb +17 -0
- data/lib/baykit/bayserver/docker/secure.rb +22 -0
- data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
- data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
- data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
- data/lib/baykit/bayserver/docker/town.rb +30 -0
- data/lib/baykit/bayserver/docker/trouble.rb +17 -0
- data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
- data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
- data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
- data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
- data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
- data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
- data/lib/baykit/bayserver/http_exception.rb +33 -0
- data/lib/baykit/bayserver/mem_usage.rb +104 -0
- data/lib/baykit/bayserver/protocol/command.rb +21 -0
- data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
- data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
- data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
- data/lib/baykit/bayserver/protocol/package.rb +15 -0
- data/lib/baykit/bayserver/protocol/packet.rb +63 -0
- data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
- data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
- data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
- data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
- data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
- data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
- data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
- data/lib/baykit/bayserver/sink.rb +22 -0
- data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
- data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
- data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
- data/lib/baykit/bayserver/tours/package.rb +4 -0
- data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
- data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
- data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
- data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
- data/lib/baykit/bayserver/tours/tour.rb +195 -0
- data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
- data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
- data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
- data/lib/baykit/bayserver/train/train.rb +54 -0
- data/lib/baykit/bayserver/train/train_runner.rb +32 -0
- data/lib/baykit/bayserver/util/byte_array.rb +54 -0
- data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
- data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
- data/lib/baykit/bayserver/util/char_util.rb +22 -0
- data/lib/baykit/bayserver/util/cities.rb +45 -0
- data/lib/baykit/bayserver/util/class_util.rb +17 -0
- data/lib/baykit/bayserver/util/counter.rb +23 -0
- data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
- data/lib/baykit/bayserver/util/executor_service.rb +81 -0
- data/lib/baykit/bayserver/util/groups.rb +110 -0
- data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
- data/lib/baykit/bayserver/util/headers.rb +194 -0
- data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
- data/lib/baykit/bayserver/util/http_status.rb +60 -0
- data/lib/baykit/bayserver/util/http_util.rb +157 -0
- data/lib/baykit/bayserver/util/io_util.rb +32 -0
- data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
- data/lib/baykit/bayserver/util/key_val.rb +15 -0
- data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
- data/lib/baykit/bayserver/util/locale.rb +30 -0
- data/lib/baykit/bayserver/util/md5_password.rb +24 -0
- data/lib/baykit/bayserver/util/message.rb +56 -0
- data/lib/baykit/bayserver/util/mimes.rb +27 -0
- data/lib/baykit/bayserver/util/object_factory.rb +13 -0
- data/lib/baykit/bayserver/util/object_store.rb +74 -0
- data/lib/baykit/bayserver/util/postman.rb +35 -0
- data/lib/baykit/bayserver/util/reusable.rb +13 -0
- data/lib/baykit/bayserver/util/selector.rb +141 -0
- data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
- data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
- data/lib/baykit/bayserver/util/string_util.rb +73 -0
- data/lib/baykit/bayserver/util/sys_util.rb +138 -0
- data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
- data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
- data/lib/baykit/bayserver/util/valve.rb +15 -0
- data/lib/baykit/bayserver/version.rb +7 -0
- data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
- data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
- data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
- metadata +189 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
require 'baykit/bayserver/util/class_util'
|
|
2
|
+
|
|
3
|
+
module Baykit
|
|
4
|
+
module BayServer
|
|
5
|
+
module Protocol
|
|
6
|
+
class ProtocolHandler
|
|
7
|
+
include Baykit::BayServer::Util::Reusable # implements
|
|
8
|
+
|
|
9
|
+
include Baykit::BayServer::Util
|
|
10
|
+
|
|
11
|
+
attr :packet_unpacker
|
|
12
|
+
attr :packet_packer
|
|
13
|
+
attr :command_unpacker
|
|
14
|
+
attr :command_packer
|
|
15
|
+
attr :packet_store
|
|
16
|
+
attr :server_mode
|
|
17
|
+
attr_accessor :ship
|
|
18
|
+
|
|
19
|
+
def to_s()
|
|
20
|
+
return ClassUtil.get_local_name(self.class) + " ship=" + ship.to_s
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##################################################
|
|
24
|
+
# Implements Reusable
|
|
25
|
+
##################################################
|
|
26
|
+
def reset()
|
|
27
|
+
@command_unpacker.reset()
|
|
28
|
+
@command_packer.reset()
|
|
29
|
+
@packet_unpacker.reset()
|
|
30
|
+
@packet_packer.reset()
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
##################################################
|
|
34
|
+
# Abstract methods
|
|
35
|
+
##################################################
|
|
36
|
+
|
|
37
|
+
def protocol()
|
|
38
|
+
raise NotImplementedError()
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# Get max of request data size (maybe not packet size)
|
|
43
|
+
#
|
|
44
|
+
def max_req_packet_data_size()
|
|
45
|
+
raise NotImplementedError()
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Get max of response data size (maybe not packet size)
|
|
50
|
+
#
|
|
51
|
+
def max_res_packet_data_size()
|
|
52
|
+
raise NotImplementedError()
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
##################################################
|
|
56
|
+
# Other methods
|
|
57
|
+
##################################################
|
|
58
|
+
def bytes_received(buf)
|
|
59
|
+
return @packet_unpacker.bytes_received(buf)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/grand_agent'
|
|
2
|
+
require 'baykit/bayserver/util/object_store'
|
|
3
|
+
require 'baykit/bayserver/util/string_util'
|
|
4
|
+
|
|
5
|
+
module Baykit
|
|
6
|
+
module BayServer
|
|
7
|
+
module Protocol
|
|
8
|
+
class ProtocolHandlerStore < Baykit::BayServer::Util::ObjectStore
|
|
9
|
+
include Baykit::BayServer::Agent
|
|
10
|
+
include Baykit::BayServer::Util
|
|
11
|
+
|
|
12
|
+
class AgentListener
|
|
13
|
+
include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
|
|
14
|
+
|
|
15
|
+
def add(agt)
|
|
16
|
+
ProtocolHandlerStore.proto_map.values().each {|ifo| ifo.add_agent(agt) }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def remove(agt)
|
|
20
|
+
ProtocolHandlerStore.proto_map.values().each { |ifo| ifo.remove_agent(agt) }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ProtocolInfo
|
|
26
|
+
attr :protocol
|
|
27
|
+
attr :server_mode
|
|
28
|
+
attr :protocol_handler_factory
|
|
29
|
+
attr :stores
|
|
30
|
+
|
|
31
|
+
def initialize(proto, svr_mode, proto_hnd_factory)
|
|
32
|
+
@protocol = proto
|
|
33
|
+
@server_mode = svr_mode
|
|
34
|
+
@protocol_handler_factory = proto_hnd_factory
|
|
35
|
+
|
|
36
|
+
# Agent ID => ProtocolHandlerStore
|
|
37
|
+
@stores = {}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def add_agent(agt)
|
|
41
|
+
store = PacketStore.get_store(@protocol, agt.agent_id);
|
|
42
|
+
@stores[agt.agent_id] = ProtocolHandlerStore.new(@protocol, @server_mode, @protocol_handler_factory, store);
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def remove_agent(agt)
|
|
46
|
+
@stores.delete(agt.agent_id);
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class << self
|
|
52
|
+
attr :proto_map
|
|
53
|
+
end
|
|
54
|
+
@proto_map = {}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
attr :protocol
|
|
58
|
+
attr :server_mode
|
|
59
|
+
|
|
60
|
+
def initialize(proto, svr_mode, proto_hnd_factory, pkt_store)
|
|
61
|
+
super()
|
|
62
|
+
@protocol = proto
|
|
63
|
+
@server_mode = svr_mode
|
|
64
|
+
@factory = -> do
|
|
65
|
+
return proto_hnd_factory.create_protocol_handler(pkt_store)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def print_usage(indent)
|
|
70
|
+
BayLog.info("%sProtocolHandlerStore(%s%s) Usage:", StringUtil.indent(indent), @protocol, @server_mode ? "s" : "c")
|
|
71
|
+
super(indent+1)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
######################################################
|
|
75
|
+
# class methods
|
|
76
|
+
######################################################
|
|
77
|
+
def self.init()
|
|
78
|
+
GrandAgent.add_lifecycle_listener(AgentListener.new())
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def self.get_store(protocol, svr_mode, agent_id)
|
|
82
|
+
return @proto_map[construct_protocol(protocol, svr_mode)].stores[agent_id]
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.get_stores(agent_id)
|
|
86
|
+
store_list = []
|
|
87
|
+
@proto_map.values.each do |ifo|
|
|
88
|
+
store_list.append(ifo.stores[agent_id])
|
|
89
|
+
end
|
|
90
|
+
return store_list
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.register_protocol(protocol, svr_mode, proto_hnd_factory)
|
|
94
|
+
if !@proto_map.include?(construct_protocol(protocol, svr_mode))
|
|
95
|
+
@proto_map[construct_protocol(protocol, svr_mode)] = ProtocolInfo.new(protocol, svr_mode, proto_hnd_factory)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self.construct_protocol(protocol, svr_mode)
|
|
100
|
+
if(svr_mode)
|
|
101
|
+
return protocol + "-s"
|
|
102
|
+
else
|
|
103
|
+
return protocol + "-c"
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Ship sinks!!
|
|
3
|
+
# Exception thrown by some bugs
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
module Baykit
|
|
7
|
+
module BayServer
|
|
8
|
+
class Sink < StandardError
|
|
9
|
+
|
|
10
|
+
def initialize(fmt = nil, *args)
|
|
11
|
+
super(if fmt == nil
|
|
12
|
+
""
|
|
13
|
+
elsif args == nil
|
|
14
|
+
sprintf("%s", fmt)
|
|
15
|
+
else
|
|
16
|
+
sprintf(fmt, *args)
|
|
17
|
+
end + "(>_<)")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'baykit/bayserver/util/counter'
|
|
2
|
+
module Baykit
|
|
3
|
+
module BayServer
|
|
4
|
+
module Taxi
|
|
5
|
+
class Taxi
|
|
6
|
+
include Baykit::BayServer::Util
|
|
7
|
+
#
|
|
8
|
+
# abstract method
|
|
9
|
+
#
|
|
10
|
+
# depart()
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
attr :taxi_id_counter
|
|
15
|
+
end
|
|
16
|
+
@taxi_id_counter = Counter.new()
|
|
17
|
+
|
|
18
|
+
attr :taxi_id;
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
@taxi_id = Taxi.taxi_id_counter.next()
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_s()
|
|
25
|
+
return "Taxi##{@taxi_id}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def run()
|
|
29
|
+
BayLog.trace("%s Start taxi on: %s", self, Thread.current.name);
|
|
30
|
+
self.depart();
|
|
31
|
+
BayLog.trace("%s End taxi on: %s", self, Thread.current.name);
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'baykit/bayserver/util/executor_service'
|
|
2
|
+
|
|
3
|
+
module Baykit
|
|
4
|
+
module BayServer
|
|
5
|
+
module Taxi
|
|
6
|
+
class TaxiRunner
|
|
7
|
+
include Baykit::BayServer::Util
|
|
8
|
+
|
|
9
|
+
# define class instance accessor
|
|
10
|
+
class << self
|
|
11
|
+
attr :exe
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def TaxiRunner.init(num_agents)
|
|
15
|
+
@exe = ExecutorService.new("TaxiRunner", num_agents)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def TaxiRunner.post(taxi)
|
|
19
|
+
begin
|
|
20
|
+
@exe.submit(taxi)
|
|
21
|
+
return true
|
|
22
|
+
rescue => e
|
|
23
|
+
BayLog.error_e(e)
|
|
24
|
+
return false
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'baykit/bayserver/taxi/taxi'
|
|
2
|
+
require 'baykit/bayserver/taxi/taxi_runner'
|
|
3
|
+
require 'baykit/bayserver/agent/next_socket_action'
|
|
4
|
+
|
|
5
|
+
require 'baykit/bayserver/util/valve'
|
|
6
|
+
require 'baykit/bayserver/util/string_util'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
module Baykit
|
|
10
|
+
module BayServer
|
|
11
|
+
module Tours
|
|
12
|
+
class ReadFileTaxi < Baykit::BayServer::Taxi::Taxi
|
|
13
|
+
include Baykit::BayServer::Util::Valve #implements
|
|
14
|
+
|
|
15
|
+
include Baykit::BayServer::Agent
|
|
16
|
+
include Baykit::BayServer::Taxi
|
|
17
|
+
include Baykit::BayServer::Util
|
|
18
|
+
|
|
19
|
+
attr :infile
|
|
20
|
+
attr :ch_valid
|
|
21
|
+
attr :data_listener
|
|
22
|
+
attr :buf
|
|
23
|
+
attr :buf_size
|
|
24
|
+
attr :running
|
|
25
|
+
attr :lock
|
|
26
|
+
|
|
27
|
+
def initialize(buf_size)
|
|
28
|
+
super()
|
|
29
|
+
@buf_size = buf_size
|
|
30
|
+
@buf = StringUtil.alloc(buf_size)
|
|
31
|
+
@lock = Monitor.new()
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def to_s()
|
|
35
|
+
return super.to_s() + " " + @data_listener.to_s()
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def init(infile, data_listener)
|
|
39
|
+
@data_listener = data_listener
|
|
40
|
+
@infile = infile
|
|
41
|
+
@ch_valid = true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
######################################################
|
|
45
|
+
# implements Valve
|
|
46
|
+
######################################################
|
|
47
|
+
|
|
48
|
+
def open_valve()
|
|
49
|
+
@lock.synchronize do
|
|
50
|
+
next_run()
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
######################################################
|
|
55
|
+
# implements Taxi
|
|
56
|
+
######################################################
|
|
57
|
+
|
|
58
|
+
def depart()
|
|
59
|
+
@lock.synchronize do
|
|
60
|
+
begin
|
|
61
|
+
@buf.clear()
|
|
62
|
+
@infile.read(@buf_size, @buf)
|
|
63
|
+
|
|
64
|
+
if @buf.length == 0
|
|
65
|
+
@data_listener.notify_eof()
|
|
66
|
+
close()
|
|
67
|
+
return
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
act = @data_listener.notify_read(@buf, nil)
|
|
71
|
+
|
|
72
|
+
@running = false
|
|
73
|
+
if act == NextSocketAction::CONTINUE
|
|
74
|
+
next_run()
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
rescue Exception => e
|
|
78
|
+
BayLog.error_e(e)
|
|
79
|
+
close()
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def next_run()
|
|
86
|
+
if @running
|
|
87
|
+
# If running, not posted because next run exists
|
|
88
|
+
return
|
|
89
|
+
end
|
|
90
|
+
@running = true
|
|
91
|
+
TaxiRunner.post(self)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def close()
|
|
95
|
+
@ch_valid = false
|
|
96
|
+
@infile.close()
|
|
97
|
+
@data_listener.notify_close()
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Baykit
|
|
2
|
+
module BayServer
|
|
3
|
+
module Tours
|
|
4
|
+
|
|
5
|
+
module ReqContentHandler
|
|
6
|
+
#
|
|
7
|
+
# interface
|
|
8
|
+
#
|
|
9
|
+
# void onReadContent(Tour tur, byte[] buf, int start, int len) throws IOException;
|
|
10
|
+
# void onEndContent(Tour tur) throws IOException, HttpException;
|
|
11
|
+
# void onAbort(Tour tur);
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
#DEV_NULL = nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class DevNullReqContentHandler
|
|
18
|
+
include ReqContentHandler # implements
|
|
19
|
+
def on_read_content(tur, buf, start, len)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def on_end_content(tur)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def on_abort(tur)
|
|
26
|
+
return false
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
module ReqContentHandler
|
|
31
|
+
DEV_NULL = DevNullReqContentHandler.new()
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'baykit/bayserver/train/train'
|
|
2
|
+
|
|
3
|
+
require 'baykit/bayserver/tours/tour'
|
|
4
|
+
require 'baykit/bayserver/util/string_util'
|
|
5
|
+
require 'baykit/bayserver/util/http_status'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
module Baykit
|
|
9
|
+
module BayServer
|
|
10
|
+
module Tours
|
|
11
|
+
class SendFileTrain < Baykit::BayServer::Train::Train
|
|
12
|
+
|
|
13
|
+
include Baykit::BayServer::Util
|
|
14
|
+
|
|
15
|
+
attr :file
|
|
16
|
+
|
|
17
|
+
def initialize(tur, file)
|
|
18
|
+
super(tur)
|
|
19
|
+
@file = file
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
######################################################
|
|
23
|
+
# implements Train
|
|
24
|
+
######################################################
|
|
25
|
+
|
|
26
|
+
def run()
|
|
27
|
+
|
|
28
|
+
@tour.res.set_consume_listener do |len, resume| end
|
|
29
|
+
|
|
30
|
+
size = @tour.ship.protocol_handler.max_packet_data_size
|
|
31
|
+
buf = StringUtil.alloc(size)
|
|
32
|
+
File.open(file, "r") do |fd|
|
|
33
|
+
begin
|
|
34
|
+
while true
|
|
35
|
+
|
|
36
|
+
while !@tour.res.available
|
|
37
|
+
sleep(0.1)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
begin
|
|
41
|
+
fd.sysread(size, buf);
|
|
42
|
+
rescue EOFError => e
|
|
43
|
+
break
|
|
44
|
+
rescue Exception => e
|
|
45
|
+
@tour.res.send_error(@tour_id, HttpStatus::INTERNAL_SERVER_ERROR, e)
|
|
46
|
+
break
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
@tour.res.send_content(@tour_id, buf, 0, buf.length);
|
|
50
|
+
|
|
51
|
+
while !@tour.res.available
|
|
52
|
+
sleep(0.1)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
@tour.res.end_content(@tour_id)
|
|
57
|
+
rescue Exception => e
|
|
58
|
+
BayLog.error_e(e);
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'baykit/bayserver/agent/next_socket_action'
|
|
2
|
+
require 'baykit/bayserver/watercraft/yacht'
|
|
3
|
+
require 'baykit/bayserver/util/string_util'
|
|
4
|
+
require 'baykit/bayserver/util/reusable'
|
|
5
|
+
|
|
6
|
+
module Baykit
|
|
7
|
+
module BayServer
|
|
8
|
+
module Tours
|
|
9
|
+
class SendFileYacht < Baykit::BayServer::WaterCraft::Yacht
|
|
10
|
+
|
|
11
|
+
include Baykit::BayServer::Agent
|
|
12
|
+
include Baykit::BayServer::Util
|
|
13
|
+
|
|
14
|
+
attr :tour
|
|
15
|
+
attr :tour_id
|
|
16
|
+
|
|
17
|
+
attr :file_name
|
|
18
|
+
attr :file_len
|
|
19
|
+
attr :file_wrote_len
|
|
20
|
+
|
|
21
|
+
def initialize
|
|
22
|
+
super
|
|
23
|
+
reset()
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def to_s()
|
|
27
|
+
return "filyt##{@yacht_id}/#{@object_id} tour=#{@tour} id=#{@tour_id}";
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
######################################################
|
|
31
|
+
# implements Reusable
|
|
32
|
+
######################################################
|
|
33
|
+
|
|
34
|
+
def reset()
|
|
35
|
+
@file_wrote_len = 0
|
|
36
|
+
@file_len = 0
|
|
37
|
+
@tour = nil
|
|
38
|
+
@tour_id = 0
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
######################################################
|
|
42
|
+
# implements Yacht
|
|
43
|
+
######################################################
|
|
44
|
+
|
|
45
|
+
def notify_read(buf, adr)
|
|
46
|
+
@file_wrote_len += buf.length
|
|
47
|
+
BayLog.trace("%s read file %d bytes: total=%d/%d", self, buf.length, @file_wrote_len, @file_len)
|
|
48
|
+
available = @tour.res.send_content(@tour_id, buf, 0, buf.length)
|
|
49
|
+
|
|
50
|
+
if available
|
|
51
|
+
return NextSocketAction::CONTINUE;
|
|
52
|
+
else
|
|
53
|
+
return NextSocketAction::SUSPEND;
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def notify_eof()
|
|
59
|
+
BayLog.trace("%s EOF(^o^) %s", self, @file_name)
|
|
60
|
+
@tour.res.end_content(@tour_id)
|
|
61
|
+
return NextSocketAction::CLOSE
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def notify_close()
|
|
65
|
+
BayLog.trace("File closed: %s", @file_name)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def check_timeout(duration)
|
|
69
|
+
BayLog.trace("Check timeout: %s", @file_name)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
######################################################
|
|
73
|
+
# Custom methods
|
|
74
|
+
######################################################
|
|
75
|
+
|
|
76
|
+
def init(tur, file_name, tp)
|
|
77
|
+
init_yacht()
|
|
78
|
+
@tour = tur
|
|
79
|
+
@tour_id = tur.id()
|
|
80
|
+
@file_name = file_name
|
|
81
|
+
@file_len = File.size(file_name)
|
|
82
|
+
#file = File.open(file_name, "rb")
|
|
83
|
+
tur.res.set_consume_listener do |len, resume|
|
|
84
|
+
if resume
|
|
85
|
+
tp.open_valve();
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|