AbstractServer.pm.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #########################################################################
  2. #  OpenKore - Bus System
  3. #
  4. #  This software is open source, licensed under the GNU General Public
  5. #  License, version 2.
  6. #  Basically, this means that you're allowed to modify and distribute
  7. #  this software. However, if you distribute modified versions, you MUST
  8. #  also distribute the source code.
  9. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  10. #
  11. #  $Revision$
  12. #  $Id$
  13. #
  14. #########################################################################
  15. ##
  16. # MODULE DESCRIPTION: Abstract bus server
  17. #
  18. # This module implements a bare-bones bus server. It knows how to parse
  19. # messages, but knows nothing about the actual protocol.
  20. # This module is used by the official bus server implementation and
  21. # should not be used directly.
  22. #
  23. # This class is derived from @MODULE(Base::Server) and extends the client object
  24. # with the following members:
  25. # <dl class="hashkeys">
  26. # <dt>int ID</dt>
  27. # <dd>An ID for this client (<b>client ID</b>). This ID is unique in this Bus::AbstractServer object.
  28. # In other words, the same Bus::AbstractServer object will not have two clients with the
  29. # same ID.</dd>
  30. #
  31. # <dt>Bytes buffer</dt>
  32. # <dd>A buffer for network data. Don't use this.</dd>
  33. # </dl>
  34. package Bus::Server::AbstractServer;
  35. use strict;
  36. use warnings;
  37. no warnings 'redefine';
  38. use Base::Server;
  39. use base qw(Base::Server);
  40. use Bus::Messages qw(serialize);
  41. use Bus::MessageParser;
  42. use Log qw(debug);
  43. ##
  44. # Bus::Server::AbstractServer->new([int port, String bind])
  45. # port: Start the server at the specified port.
  46. # bind: Bind the server at the specified IP.
  47. #
  48. # Create a new bus server. See Base::Server->new() for a description of the parameters.
  49. sub new {
  50. my ($class, $port, $bind) = @_;
  51. my $self;
  52. $self = $class->SUPER::new($port, $bind);
  53. $self->{BAS_maxID} = 0;
  54. $self->{BAS_busClients} = {};
  55. return $self;
  56. }
  57. ##
  58. # $Bus_Server_AbstractServer->send(int clientID, String messageID, args)
  59. # Returns: 1 on success, 0 when failed to send data through the socket, -1 if the specified client doesn't exist.
  60. #
  61. # Send a message to the specified client.
  62. sub send {
  63. my ($self, $clientID, $messageID, $args) = @_;
  64. my $client = $self->{BAS_busClients}{$clientID};
  65. if ($client) {
  66. return $client->send(serialize($messageID, $args));
  67. } else {
  68. return -1;
  69. }
  70. }
  71. sub getBusClient {
  72. my ($self, $clientID) = @_;
  73. return $self->{BAS_busClients}{$clientID};
  74. }
  75. #######################################
  76. ### CATEGORY: Abstract methods
  77. #######################################
  78. ##
  79. # $Bus_Server_AbstractServer->messageReceived(client, String messageID, args)
  80. #
  81. # Process a bus message.
  82. sub messageReceived {
  83. }
  84. #######################################
  85. # Abstract method implementations
  86. #######################################
  87. sub onClientNew {
  88. my ($self, $client) = @_;
  89. $client->{BAS_parser} = new Bus::MessageParser();
  90. $client->{ID} = $self->{BAS_maxID};
  91. $self->{BAS_maxID}++;
  92. $self->{BAS_busClients}{$client->{ID}} = $client;
  93. debug("New client: " . $client->getIP() . " ($client->{ID})n", "bus");
  94. }
  95. sub onClientExit {
  96. my ($self, $client) = @_;
  97. debug("Client disconnected: " . $client->getIP() . " ($client->{ID})n", "bus");
  98. delete $self->{BAS_busClients}{$client->{ID}};
  99. }
  100. sub onClientData {
  101. my ($self, $client, $data) = @_;
  102. my $parser = $client->{BAS_parser};
  103. $parser->add($data);
  104. my $ID;
  105. while (my $args = $parser->readNext($ID)) {
  106. $self->messageReceived($client, $ID, $args);
  107. }
  108. }
  109. return 1;