bayserver-core 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/lib/baykit/bayserver/agent/accept_handler.rb +97 -0
  3. data/lib/baykit/bayserver/agent/channel_listener.rb +35 -0
  4. data/lib/baykit/bayserver/agent/command_receiver.rb +75 -0
  5. data/lib/baykit/bayserver/agent/grand_agent.rb +319 -0
  6. data/lib/baykit/bayserver/agent/grand_agent_monitor.rb +217 -0
  7. data/lib/baykit/bayserver/agent/next_socket_action.rb +14 -0
  8. data/lib/baykit/bayserver/agent/non_blocking_handler.rb +433 -0
  9. data/lib/baykit/bayserver/agent/package.rb +3 -0
  10. data/lib/baykit/bayserver/agent/signal/signal_agent.rb +165 -0
  11. data/lib/baykit/bayserver/agent/signal/signal_proxy.rb +18 -0
  12. data/lib/baykit/bayserver/agent/signal/signal_sender.rb +99 -0
  13. data/lib/baykit/bayserver/agent/spin_handler.rb +140 -0
  14. data/lib/baykit/bayserver/agent/transporter/data_listener.rb +38 -0
  15. data/lib/baykit/bayserver/agent/transporter/package.rb +3 -0
  16. data/lib/baykit/bayserver/agent/transporter/plain_transporter.rb +55 -0
  17. data/lib/baykit/bayserver/agent/transporter/secure_transporter.rb +81 -0
  18. data/lib/baykit/bayserver/agent/transporter/spin_read_transporter.rb +111 -0
  19. data/lib/baykit/bayserver/agent/transporter/spin_write_transporter.rb +125 -0
  20. data/lib/baykit/bayserver/agent/transporter/transporter.rb +466 -0
  21. data/lib/baykit/bayserver/agent/upgrade_exception.rb +11 -0
  22. data/lib/baykit/bayserver/bay_dockers.rb +60 -0
  23. data/lib/baykit/bayserver/bay_exception.rb +12 -0
  24. data/lib/baykit/bayserver/bay_log.rb +148 -0
  25. data/lib/baykit/bayserver/bay_message.rb +20 -0
  26. data/lib/baykit/bayserver/bayserver.rb +529 -0
  27. data/lib/baykit/bayserver/bcf/bcf_document.rb +44 -0
  28. data/lib/baykit/bayserver/bcf/bcf_element.rb +30 -0
  29. data/lib/baykit/bayserver/bcf/bcf_key_val.rb +19 -0
  30. data/lib/baykit/bayserver/bcf/bcf_object.rb +15 -0
  31. data/lib/baykit/bayserver/bcf/bcf_parser.rb +180 -0
  32. data/lib/baykit/bayserver/bcf/package.rb +6 -0
  33. data/lib/baykit/bayserver/bcf/parse_exception.rb +15 -0
  34. data/lib/baykit/bayserver/config_exception.rb +25 -0
  35. data/lib/baykit/bayserver/constants.rb +8 -0
  36. data/lib/baykit/bayserver/docker/base/club_base.rb +117 -0
  37. data/lib/baykit/bayserver/docker/base/docker_base.rb +66 -0
  38. data/lib/baykit/bayserver/docker/base/inbound_data_listener.rb +89 -0
  39. data/lib/baykit/bayserver/docker/base/inbound_handler.rb +42 -0
  40. data/lib/baykit/bayserver/docker/base/inbound_ship.rb +341 -0
  41. data/lib/baykit/bayserver/docker/base/inbound_ship_store.rb +65 -0
  42. data/lib/baykit/bayserver/docker/base/port_base.rb +228 -0
  43. data/lib/baykit/bayserver/docker/base/reroute_base.rb +28 -0
  44. data/lib/baykit/bayserver/docker/built_in/built_in_city_docker.rb +303 -0
  45. data/lib/baykit/bayserver/docker/built_in/built_in_harbor_docker.rb +226 -0
  46. data/lib/baykit/bayserver/docker/built_in/built_in_log_docker.rb +302 -0
  47. data/lib/baykit/bayserver/docker/built_in/built_in_permission_docker.rb +242 -0
  48. data/lib/baykit/bayserver/docker/built_in/built_in_secure_docker.rb +157 -0
  49. data/lib/baykit/bayserver/docker/built_in/built_in_town_docker.rb +117 -0
  50. data/lib/baykit/bayserver/docker/built_in/built_in_trouble_docker.rb +57 -0
  51. data/lib/baykit/bayserver/docker/built_in/log_boat.rb +71 -0
  52. data/lib/baykit/bayserver/docker/built_in/log_item.rb +18 -0
  53. data/lib/baykit/bayserver/docker/built_in/log_item_factory.rb +18 -0
  54. data/lib/baykit/bayserver/docker/built_in/log_items.rb +287 -0
  55. data/lib/baykit/bayserver/docker/built_in/write_file_taxi.rb +101 -0
  56. data/lib/baykit/bayserver/docker/city.rb +22 -0
  57. data/lib/baykit/bayserver/docker/club.rb +45 -0
  58. data/lib/baykit/bayserver/docker/docker.rb +8 -0
  59. data/lib/baykit/bayserver/docker/harbor.rb +34 -0
  60. data/lib/baykit/bayserver/docker/log.rb +17 -0
  61. data/lib/baykit/bayserver/docker/package.rb +12 -0
  62. data/lib/baykit/bayserver/docker/permission.rb +18 -0
  63. data/lib/baykit/bayserver/docker/port.rb +39 -0
  64. data/lib/baykit/bayserver/docker/reroute.rb +17 -0
  65. data/lib/baykit/bayserver/docker/secure.rb +22 -0
  66. data/lib/baykit/bayserver/docker/send_file/directory_train.rb +123 -0
  67. data/lib/baykit/bayserver/docker/send_file/file_content_handler.rb +43 -0
  68. data/lib/baykit/bayserver/docker/send_file/send_file_docker.rb +71 -0
  69. data/lib/baykit/bayserver/docker/town.rb +30 -0
  70. data/lib/baykit/bayserver/docker/trouble.rb +17 -0
  71. data/lib/baykit/bayserver/docker/warp/package.rb +4 -0
  72. data/lib/baykit/bayserver/docker/warp/warp_data.rb +84 -0
  73. data/lib/baykit/bayserver/docker/warp/warp_data_listener.rb +112 -0
  74. data/lib/baykit/bayserver/docker/warp/warp_docker.rb +273 -0
  75. data/lib/baykit/bayserver/docker/warp/warp_handler.rb +38 -0
  76. data/lib/baykit/bayserver/docker/warp/warp_ship.rb +166 -0
  77. data/lib/baykit/bayserver/docker/warp/warp_ship_store.rb +111 -0
  78. data/lib/baykit/bayserver/http_exception.rb +33 -0
  79. data/lib/baykit/bayserver/mem_usage.rb +104 -0
  80. data/lib/baykit/bayserver/protocol/command.rb +21 -0
  81. data/lib/baykit/bayserver/protocol/command_handler.rb +9 -0
  82. data/lib/baykit/bayserver/protocol/command_packer.rb +49 -0
  83. data/lib/baykit/bayserver/protocol/command_unpacker.rb +13 -0
  84. data/lib/baykit/bayserver/protocol/package.rb +15 -0
  85. data/lib/baykit/bayserver/protocol/packet.rb +63 -0
  86. data/lib/baykit/bayserver/protocol/packet_factory.rb +13 -0
  87. data/lib/baykit/bayserver/protocol/packet_packer.rb +30 -0
  88. data/lib/baykit/bayserver/protocol/packet_part_accessor.rb +122 -0
  89. data/lib/baykit/bayserver/protocol/packet_store.rb +139 -0
  90. data/lib/baykit/bayserver/protocol/packet_unpacker.rb +17 -0
  91. data/lib/baykit/bayserver/protocol/protocol_exception.rb +17 -0
  92. data/lib/baykit/bayserver/protocol/protocol_handler.rb +64 -0
  93. data/lib/baykit/bayserver/protocol/protocol_handler_factory.rb +14 -0
  94. data/lib/baykit/bayserver/protocol/protocol_handler_store.rb +109 -0
  95. data/lib/baykit/bayserver/sink.rb +22 -0
  96. data/lib/baykit/bayserver/taxi/taxi.rb +38 -0
  97. data/lib/baykit/bayserver/taxi/taxi_runner.rb +31 -0
  98. data/lib/baykit/bayserver/tours/content_consume_listener.rb +20 -0
  99. data/lib/baykit/bayserver/tours/package.rb +4 -0
  100. data/lib/baykit/bayserver/tours/read_file_taxi.rb +102 -0
  101. data/lib/baykit/bayserver/tours/req_content_handler.rb +37 -0
  102. data/lib/baykit/bayserver/tours/send_file_train.rb +65 -0
  103. data/lib/baykit/bayserver/tours/send_file_yacht.rb +93 -0
  104. data/lib/baykit/bayserver/tours/tour.rb +195 -0
  105. data/lib/baykit/bayserver/tours/tour_req.rb +251 -0
  106. data/lib/baykit/bayserver/tours/tour_res.rb +400 -0
  107. data/lib/baykit/bayserver/tours/tour_store.rb +121 -0
  108. data/lib/baykit/bayserver/train/train.rb +54 -0
  109. data/lib/baykit/bayserver/train/train_runner.rb +32 -0
  110. data/lib/baykit/bayserver/util/byte_array.rb +54 -0
  111. data/lib/baykit/bayserver/util/byte_buffer.rb +13 -0
  112. data/lib/baykit/bayserver/util/cgi_util.rb +165 -0
  113. data/lib/baykit/bayserver/util/char_util.rb +22 -0
  114. data/lib/baykit/bayserver/util/cities.rb +45 -0
  115. data/lib/baykit/bayserver/util/class_util.rb +17 -0
  116. data/lib/baykit/bayserver/util/counter.rb +23 -0
  117. data/lib/baykit/bayserver/util/data_consume_listener.rb +13 -0
  118. data/lib/baykit/bayserver/util/executor_service.rb +81 -0
  119. data/lib/baykit/bayserver/util/groups.rb +110 -0
  120. data/lib/baykit/bayserver/util/gzip_compressor.rb +55 -0
  121. data/lib/baykit/bayserver/util/headers.rb +194 -0
  122. data/lib/baykit/bayserver/util/host_matcher.rb +48 -0
  123. data/lib/baykit/bayserver/util/http_status.rb +60 -0
  124. data/lib/baykit/bayserver/util/http_util.rb +157 -0
  125. data/lib/baykit/bayserver/util/io_util.rb +32 -0
  126. data/lib/baykit/bayserver/util/ip_matcher.rb +67 -0
  127. data/lib/baykit/bayserver/util/key_val.rb +15 -0
  128. data/lib/baykit/bayserver/util/key_val_list_parser.rb +53 -0
  129. data/lib/baykit/bayserver/util/locale.rb +30 -0
  130. data/lib/baykit/bayserver/util/md5_password.rb +24 -0
  131. data/lib/baykit/bayserver/util/message.rb +56 -0
  132. data/lib/baykit/bayserver/util/mimes.rb +27 -0
  133. data/lib/baykit/bayserver/util/object_factory.rb +13 -0
  134. data/lib/baykit/bayserver/util/object_store.rb +74 -0
  135. data/lib/baykit/bayserver/util/postman.rb +35 -0
  136. data/lib/baykit/bayserver/util/reusable.rb +13 -0
  137. data/lib/baykit/bayserver/util/selector.rb +141 -0
  138. data/lib/baykit/bayserver/util/simple_buffer.rb +53 -0
  139. data/lib/baykit/bayserver/util/simple_inspect.rb +12 -0
  140. data/lib/baykit/bayserver/util/string_util.rb +73 -0
  141. data/lib/baykit/bayserver/util/sys_util.rb +138 -0
  142. data/lib/baykit/bayserver/util/url_decoder.rb +42 -0
  143. data/lib/baykit/bayserver/util/url_encoder.rb +19 -0
  144. data/lib/baykit/bayserver/util/valve.rb +15 -0
  145. data/lib/baykit/bayserver/version.rb +7 -0
  146. data/lib/baykit/bayserver/watercraft/boat.rb +43 -0
  147. data/lib/baykit/bayserver/watercraft/ship.rb +104 -0
  148. data/lib/baykit/bayserver/watercraft/yacht.rb +42 -0
  149. metadata +189 -0
@@ -0,0 +1,33 @@
1
+ require 'baykit/bayserver/bay_exception'
2
+ require 'baykit/bayserver/util/http_status'
3
+
4
+ module Baykit
5
+ module BayServer
6
+
7
+ class HttpException < BayException
8
+ include Baykit::BayServer::Util
9
+
10
+ attr :status # Http status
11
+ attr_accessor :location # for 302
12
+
13
+ def initialize(status, fmt=nil, *args)
14
+ super(fmt, *args)
15
+ @status = status
16
+ if @status < 300 || @status >= 600
17
+ raise RuntimeError.new "IllegalArgument"
18
+ end
19
+ end
20
+
21
+ def message
22
+ "HTTP #{@status} #{super}"
23
+ end
24
+
25
+ def self.moved_temp(location)
26
+ e = HttpException.new(HttpStatus::MOVED_TEMPORARILY, location)
27
+ e.location = location
28
+ return e
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,104 @@
1
+ require 'baykit/bayserver/bayserver'
2
+ require 'baykit/bayserver/agent/grand_agent'
3
+ require 'baykit/bayserver/protocol/protocol_handler_store'
4
+ require 'baykit/bayserver/protocol/packet_store'
5
+ require 'baykit/bayserver/tours/tour_store'
6
+ require 'baykit/bayserver/docker/base/inbound_ship_store'
7
+ require 'baykit/bayserver/docker/warp/warp_docker'
8
+
9
+ require 'baykit/bayserver/util/string_util'
10
+
11
+ module Baykit
12
+ module BayServer
13
+ class MemUsage
14
+ include Baykit::BayServer
15
+ include Baykit::BayServer::Agent
16
+ include Baykit::BayServer::Protocol
17
+ include Baykit::BayServer::Tours
18
+ include Baykit::BayServer::Docker::Warp
19
+ include Baykit::BayServer::Docker::Base
20
+ include Baykit::BayServer::Util
21
+
22
+ class AgentListener
23
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener
24
+
25
+ def add(agt)
26
+ MemUsage.mem_usages[agt.agent_id] = MemUsage.new(agt.agent_id);
27
+ end
28
+
29
+ def remove(agt)
30
+ MemUsage.mem_usages.delete(agt.agent_id)
31
+ end
32
+ end
33
+
34
+ class << self
35
+ attr :mem_usages
36
+ end
37
+ # Agent ID => MemUsage
38
+ @mem_usages = {}
39
+
40
+ attr :agent_id
41
+
42
+ def initialize(agt_id)
43
+ @agent_id = agt_id
44
+ end
45
+
46
+ def print_usage(indent)
47
+ InboundShipStore.get_store(@agent_id).print_usage(indent+1)
48
+ ProtocolHandlerStore.get_stores(@agent_id).each do |store|
49
+ store.print_usage(indent+1)
50
+ end
51
+ PacketStore.get_stores(@agent_id).each do |store|
52
+ store.print_usage(indent+1)
53
+ end
54
+ TourStore.get_store(@agent_id).print_usage(indent+1);
55
+ BayServer.cities.cities.each do |city|
56
+ print_city_usage(nil, city, indent)
57
+ end
58
+
59
+ BayServer.ports.each do |port|
60
+ port.cities.cities().each do |city|
61
+ print_city_usage(port, city, indent)
62
+ end
63
+ end
64
+ end
65
+
66
+
67
+ def print_city_usage(port, city, indent)
68
+ if port == nil
69
+ pname = ""
70
+ else
71
+ pname = "@#{port}"
72
+ end
73
+
74
+ city.clubs().each do |club|
75
+ if club.kind_of?(WarpDocker)
76
+ BayLog.info("%sClub(%s%s) Usage:", StringUtil.indent(indent), club, pname);
77
+ club.get_ship_store(@agent_id).print_usage(indent+1)
78
+ end
79
+ end
80
+ city.towns().each do |town|
81
+ town.clubs().each do |club|
82
+ if club.kind_of?(WarpDocker)
83
+ BayLog.info("%sClub(%s%s) Usage:", StringUtil.indent(indent), club, pname);
84
+ club.get_ship_store(@agent_id).print_usage(indent+1)
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+
91
+ ######################################################
92
+ # Class methods
93
+ ######################################################
94
+ def self.init()
95
+ GrandAgent.add_lifecycle_listener(AgentListener.new());
96
+ end
97
+
98
+ def self.get(agent_id)
99
+ return @mem_usages[agent_id]
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,21 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ class Command
5
+
6
+ # abstract methods
7
+ #
8
+ # unpack(P packet)
9
+ # pack(P packet)
10
+ # handle(H handler)
11
+
12
+ attr :type
13
+
14
+ def initialize(type)
15
+ @type = type
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,9 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ module CommandHandler
5
+ include Baykit::BayServer::Util::Reusable # implements
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ require 'baykit/bayserver/util/data_consume_listener'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Protocol
6
+ class CommandPacker
7
+ include Baykit::BayServer::Util::Reusable # implements
8
+
9
+ include Baykit::BayServer::Util
10
+
11
+ attr :pkt_packer
12
+ attr :pkt_store
13
+
14
+ def initialize(pkt_packer, store)
15
+ @pkt_packer = pkt_packer
16
+ @pkt_store = store
17
+ end
18
+
19
+ def reset()
20
+
21
+ end
22
+
23
+ def post(sip, cmd, &lisnr)
24
+ pkt = @pkt_store.rent(cmd.type)
25
+ begin
26
+ cmd.pack(pkt)
27
+ @pkt_packer.post(sip.postman, pkt) do
28
+ @pkt_store.Return(pkt)
29
+ if lisnr != nil
30
+ lisnr.call()
31
+ end
32
+ end
33
+ rescue IOError => e
34
+ @pkt_store.Return(pkt)
35
+ raise e
36
+ end
37
+ end
38
+
39
+ def flush(sip)
40
+ @pkt_packer.flush(sip.postman)
41
+ end
42
+
43
+ def end(sip)
44
+ @pkt_packer.end(sip.postman)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,13 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ class CommandUnPacker
5
+ include Baykit::BayServer::Util::Reusable # implements
6
+
7
+ # interface
8
+ #
9
+ # packet_received(pkt)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ require 'baykit/bayserver/protocol/packet'
2
+ require 'baykit/bayserver/protocol/packet_part_accessor'
3
+ require 'baykit/bayserver/protocol/packet_packer'
4
+ require 'baykit/bayserver/protocol/packet_unpacker'
5
+ require 'baykit/bayserver/protocol/packet_store'
6
+ require 'baykit/bayserver/protocol/packet_factory'
7
+ require 'baykit/bayserver/protocol/command'
8
+ require 'baykit/bayserver/protocol/command_packer'
9
+ require 'baykit/bayserver/protocol/command_unpacker'
10
+ require 'baykit/bayserver/protocol/command_handler'
11
+ require 'baykit/bayserver/protocol/protocol_exception'
12
+ require 'baykit/bayserver/protocol/protocol_handler'
13
+ require 'baykit/bayserver/protocol/protocol_handler_factory'
14
+ require 'baykit/bayserver/protocol/protocol_handler_store'
15
+
@@ -0,0 +1,63 @@
1
+ require 'baykit/bayserver/util/string_util'
2
+ require 'baykit/bayserver/util/class_util'
3
+
4
+ #
5
+ # Packet format
6
+ # +---------------------------+
7
+ # + Header(type, length etc) +
8
+ # +---------------------------+
9
+ # + Data(payload data) +
10
+ # +---------------------------+
11
+ #
12
+ module Baykit
13
+ module BayServer
14
+ module Protocol
15
+ class Packet
16
+ include Baykit::BayServer::Util
17
+ include Baykit::BayServer::Util::Reusable # implements
18
+
19
+ INITIAL_BUF_SIZE = 8192 * 4
20
+
21
+ attr :type
22
+ attr :buf
23
+ attr_accessor :buf_len
24
+ attr :header_len
25
+ attr :max_data_len
26
+
27
+ def initialize(type, header_len, max_data_len)
28
+ @type = type
29
+ @header_len = header_len
30
+ @max_data_len = max_data_len
31
+ @buf = StringUtil.alloc(INITIAL_BUF_SIZE)
32
+ reset
33
+ end
34
+
35
+ def reset
36
+ @buf.clear()
37
+ header_len.times do |i| @buf << 0 end
38
+ @buf_len = header_len
39
+ end
40
+
41
+ def data_len()
42
+ return @buf_len - @header_len
43
+ end
44
+
45
+ def expand
46
+ @buf = StringUtil.realloc(@buf, @buf.length * 2)
47
+ end
48
+
49
+ def new_header_accessor()
50
+ return PacketPartAccessor.new(self, 0, @header_len)
51
+ end
52
+
53
+ def new_data_accessor()
54
+ return PacketPartAccessor.new(self, @header_len, -1)
55
+ end
56
+
57
+ def to_s
58
+ return "pkt[#{ClassUtil.get_local_name(self.class)}(#{@type})]"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,13 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ class PacketFactory
5
+
6
+ # abstract methods
7
+ #
8
+ # create_packet(type)
9
+
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ class PacketPacker
5
+ include Baykit::BayServer::Util::Reusable # implements
6
+
7
+ def reset()
8
+ end
9
+
10
+ def post(postman, pkt, &lisnr)
11
+ if postman == nil || pkt == nil || lisnr == nil
12
+ raise Sink.new()
13
+ end
14
+ postman.post(pkt.buf[0, pkt.buf_len], nil, pkt) do
15
+ lisnr.call()
16
+ end
17
+ end
18
+
19
+ def flush(postman)
20
+ postman.flush()
21
+ end
22
+
23
+ def end(postman)
24
+ postman.post_end()
25
+ end
26
+
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,122 @@
1
+ require 'baykit/bayserver/sink'
2
+ require 'baykit/bayserver/util/string_util'
3
+
4
+ module Baykit
5
+ module BayServer
6
+ module Protocol
7
+ class PacketPartAccessor
8
+ include Baykit::BayServer
9
+ include Baykit::BayServer::Util
10
+
11
+ attr :packet
12
+ attr :start
13
+ attr :max_len
14
+ attr :pos
15
+
16
+ def initialize(pkt, start, max_len)
17
+ @packet = pkt
18
+ @start = start
19
+ @max_len = max_len
20
+ @pos = 0
21
+ end
22
+
23
+ def put_byte(b)
24
+ buf = StringUtil.alloc(1)
25
+ buf << b
26
+ put_bytes(buf, 0, 1)
27
+ end
28
+
29
+ def put_bytes(buf, ofs=0, len=buf.length)
30
+ if len > 0
31
+ check_write(len)
32
+ #while(@start + @pos + len > @packet.buf.length)
33
+ # packet.expand()
34
+ #end
35
+ begin
36
+ @packet.buf[@start + @pos, len] = buf[ofs, len]
37
+ rescue IndexError => e
38
+ raise IndexError.new("data exceeds packet size: len=#{len} pktlen=#{buf.length - @start}")
39
+ end
40
+
41
+ forward(len)
42
+ end
43
+ end
44
+
45
+ def put_short(val)
46
+ h = val >> 8 & 0xFF
47
+ l = val & 0xFF
48
+ buf = StringUtil.alloc(2)
49
+ buf << h << l
50
+ put_bytes(buf)
51
+ end
52
+
53
+ def put_int(val)
54
+ b1 = val >> 24 & 0xFF
55
+ b2 = val >> 16 & 0xFF
56
+ b3 = val >> 8 & 0xFF
57
+ b4 = val & 0xFF
58
+ buf = StringUtil.alloc(4)
59
+ buf << b1 << b2 << b3 << b4
60
+ put_bytes(buf)
61
+ end
62
+
63
+ def put_string(str)
64
+ if str == nil
65
+ raise Sink.new("nil")
66
+ end
67
+ put_bytes(StringUtil.to_bytes(str))
68
+ end
69
+
70
+ def get_byte
71
+ buf = StringUtil.alloc(1)
72
+ get_bytes(buf, 0, 1)
73
+ buf[0].codepoints[0]
74
+ end
75
+
76
+ def get_bytes(buf, ofs=0, len=buf.length)
77
+ if buf == nil
78
+ raise Sink.new("nil")
79
+ end
80
+
81
+ check_read(len)
82
+ buf[ofs, len] = @packet.buf[@start + @pos, len]
83
+ @pos += len
84
+ end
85
+
86
+ def get_short
87
+ h = get_byte
88
+ l = get_byte
89
+ h << 8 | l
90
+ end
91
+
92
+ def get_int
93
+ b1 = get_byte
94
+ b2 = get_byte
95
+ b3 = get_byte
96
+ b4 = get_byte
97
+ b1 << 24 | b2 << 16 | b3 << 8 | b4
98
+ end
99
+
100
+ def check_read(len)
101
+ max_len = (@max_len >= 0) ? @max_len : (@packet.buf_len - @start)
102
+ if @pos + len > max_len
103
+ raise Sink.new("Invalid array index")
104
+ end
105
+ end
106
+
107
+ def check_write(len)
108
+ if @max_len > 0 && @pos + len > @max_len
109
+ raise Sink.new("Buffer overflow")
110
+ end
111
+ end
112
+
113
+ def forward(len)
114
+ @pos += len
115
+ if @start + @pos > @packet.buf_len
116
+ @packet.buf_len = @start + @pos
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,139 @@
1
+ require 'baykit/bayserver/agent/grand_agent'
2
+ require 'baykit/bayserver/util/object_store'
3
+ require 'baykit/bayserver/protocol/packet_factory'
4
+
5
+ module Baykit
6
+ module BayServer
7
+ module Protocol
8
+ class PacketStore
9
+ include Baykit::BayServer::Util::Reusable # implements
10
+
11
+ include Baykit::BayServer::Agent
12
+ include Baykit::BayServer::Util
13
+
14
+ class AgentListener
15
+ include Baykit::BayServer::Agent::GrandAgent::GrandAgentLifecycleListener # implements
16
+
17
+ def add(agt)
18
+ PacketStore.proto_map.values().each do |ifo|
19
+ ifo.add_agent(agt.agent_id);
20
+ end
21
+ end
22
+
23
+ def remove(agt)
24
+ PacketStore.proto_map.values().each do |ifo|
25
+ ifo.remove_agent(agt.agent_id);
26
+ end
27
+ end
28
+ end
29
+
30
+
31
+ class ProtocolInfo
32
+ attr :protocol
33
+ attr :packet_factory
34
+
35
+ # Agent ID => PacketStore
36
+ attr :stores
37
+
38
+ def initialize(proto, pkt_factory)
39
+ @protocol = proto
40
+ @packet_factory = pkt_factory
41
+ @stores = {}
42
+ end
43
+
44
+ def add_agent(agt_id)
45
+ store = PacketStore.new(@protocol, @packet_factory);
46
+ @stores[agt_id] = store;
47
+ end
48
+
49
+ def remove_agent(agt_id)
50
+ @stores.delete(agt_id);
51
+ end
52
+
53
+ end
54
+
55
+ class << self
56
+ attr :proto_map
57
+ end
58
+ @proto_map = {}
59
+
60
+ attr :protocol
61
+ attr :store_map
62
+ attr :factory
63
+
64
+ def initialize(proto, factory)
65
+ @protocol = proto
66
+ @factory = factory
67
+ @store_map = {}
68
+ end
69
+
70
+ def reset
71
+ @store_map.values.each do |store|
72
+ store.reset
73
+ end
74
+ end
75
+
76
+ def rent(type)
77
+ if type == nil
78
+ raise RuntimeError.new("Nil argument")
79
+ end
80
+
81
+ store = @store_map[type]
82
+ if store == nil
83
+ store = ObjectStore.new(lambda do
84
+ if @factory.kind_of?(PacketFactory)
85
+ return @factory.create_packet(type)
86
+ else
87
+ # lambda
88
+ return @factory.call(type)
89
+ end
90
+ end)
91
+ @store_map[type] = store
92
+ end
93
+ return store.rent
94
+ end
95
+
96
+ def Return(pkt)
97
+ store = @store_map[pkt.type]
98
+ #puts "Return packet #{pkt}"
99
+ store.Return(pkt)
100
+ end
101
+
102
+
103
+ def print_usage(indent)
104
+ BayLog.info("%sPacketStore(%s) usage nTypes=%d", StringUtil.indent(indent), @protocol, @store_map.keys().size)
105
+ @store_map.keys.each do |type|
106
+ BayLog.info("%sType: %s", StringUtil.indent(indent+1), type)
107
+ @store_map[type].print_usage(indent+2)
108
+ end
109
+ end
110
+
111
+ ######################################################
112
+ # class methods
113
+ ######################################################
114
+ def self.init()
115
+ GrandAgent.add_lifecycle_listener(AgentListener.new())
116
+ end
117
+
118
+ def self.get_store(protocol, agent_id)
119
+ return @proto_map[protocol].stores[agent_id]
120
+ end
121
+
122
+ def self.register_protocol(protocol, factory)
123
+ if !@proto_map.include?(protocol)
124
+ @proto_map[protocol] = PacketStore::ProtocolInfo.new(protocol, factory)
125
+ end
126
+ end
127
+
128
+ def self.get_stores(agent_id)
129
+ store_list = []
130
+ @proto_map.values.each do |ifo|
131
+ store_list.append(ifo.stores[agent_id])
132
+ end
133
+ return store_list
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+
@@ -0,0 +1,17 @@
1
+ require 'baykit/bayserver/util/reusable'
2
+
3
+ module Baykit
4
+ module BayServer
5
+ module Protocol
6
+ class PacketUnPacker
7
+ include Baykit::BayServer::Util::Reusable # implements
8
+
9
+ #
10
+ # interface
11
+ #
12
+ # bytes_received(bytes)
13
+ #
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ module Baykit
2
+ module BayServer
3
+ module Protocol
4
+ class ProtocolException < StandardError
5
+ def initialize(fmt = nil, *args)
6
+ super(if fmt == nil
7
+ nil
8
+ elsif args == nil
9
+ sprintf("%s", fmt)
10
+ else
11
+ sprintf(fmt, *args)
12
+ end)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end