SimpleClient.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: Low-level bus client implementation.
  17. #
  18. # This module is a bare-bones implementation of a bus client. It can
  19. # only parse messages, but knows nothing about the actual protocol.
  20. package Bus::SimpleClient;
  21. use strict;
  22. use warnings;
  23. no warnings 'redefine';
  24. use IO::Socket::INET;
  25. use Modules 'register';
  26. use Bus::Messages qw(serialize);
  27. use Bus::MessageParser;
  28. use Utils qw(dataWaiting);
  29. use Utils::Exceptions;
  30. ##
  31. # Bus::Client->new(String host, int port)
  32. # host: host address of the IPC manager.
  33. # port: port number of the IPC manager.
  34. #
  35. # Create a new Bus::Client object.
  36. #
  37. # Throws a SocketException if unable to connect.
  38. sub new {
  39. my ($class, $host, $port) = @_;
  40. my %self;
  41. $self{sock} = new IO::Socket::INET(
  42. PeerHost => $host,
  43. PeerPort => $port,
  44. Proto => 'tcp',
  45. Timeout => 4
  46. );
  47. if (!$self{sock}) {
  48. SocketException->throw("$!");
  49. }
  50. $self{sock}->autoflush(0);
  51. $self{parser} = new Bus::MessageParser();
  52. return bless %self, $class;
  53. }
  54. sub DESTROY {
  55. my ($self) = @_;
  56. $self->{sock}->close if ($self->{sock});
  57. }
  58. ##
  59. # void $Bus_Client->send(String messageID, args)
  60. #
  61. # Send a message through the bus. Throws IOException if it fails.
  62. sub send {
  63. my ($self, $MID, $args) = @_;
  64. eval {
  65. $self->{sock}->send(serialize($MID, $args), 0);
  66. $self->{sock}->flush();
  67. };
  68. if ($@) {
  69. IOException->throw($@);
  70. }
  71. }
  72. ##
  73. # Scalar* $Bus_Client->readNext(String* messageID)
  74. # messageID: If a message has been read, then the message ID will be stored here.
  75. # Returns: Either a reference to a hash or a reference to an array, as the message arguments.
  76. #          Or returns undef if there is no complete message on the socket yet.
  77. #
  78. # Read the next message from the bus, if any. This method returns undef immediately
  79. # when there are no messages.
  80. #
  81. # Throws IOException if reading from the socket fails.
  82. sub readNext {
  83. my ($self, $ID) = @_;
  84. if (dataWaiting($self->{sock})) {
  85. my $data;
  86. eval {
  87. $self->{sock}->recv($data, 1024 * 32, 0);
  88. };
  89. if ($@) {
  90. IOException->throw($@);
  91. } elsif (!defined $data || length($data) == 0) {
  92. IOException->throw("Bus server closed connection.");
  93. }
  94. $self->{parser}->add($data);
  95. }
  96. return $self->{parser}->readNext($ID);
  97. }
  98. 1;