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.
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