No more parseIncomingMessage:
Code: Select all
Index: src/functions.pl
===================================================================
--- src/functions.pl (revision 7788)
+++ src/functions.pl (working copy)
@@ -694,26 +694,8 @@
if (defined($data) && length($data) > 0) {
Benchmark::begin("parseMsg") if DEBUG;
- my $type;
$incomingMessages->add($data);
- while ($data = $incomingMessages->readNext(\$type)) {
- if ($type == Network::MessageTokenizer::KNOWN_MESSAGE) {
- parseIncomingMessage($data);
- } else {
- if ($type == Network::MessageTokenizer::UNKNOWN_MESSAGE) {
- # Unknown message - ignore it
- my $messageID = Network::MessageTokenizer::getMessageID($data);
- if (!existsInList($config{debugPacket_exclude}, $messageID)) {
- warning TF("Packet Tokenizer: Unknown switch: %s\n", $messageID), "connection";
- visualDump($data, "<< Received unknown packet") if ($config{debugPacket_unparsed});
- }
- } elsif ($config{debugPacket_received}) {
- debug "Received account ID\n", "parseMsg", 0 ;
- }
- # Pass it along to the client, whatever it is
- $net->clientSend($data);
- }
- }
+ $net->clientSend($packetParser->processTokenizer($incomingMessages));
$net->clientFlush() if (UNIVERSAL::isa($net, 'Network::XKoreProxy'));
Benchmark::end("parseMsg") if DEBUG;
}
@@ -723,6 +705,7 @@
if (defined($data) && length($data) > 0) {
my $type;
$outgoingClientMessages->add($data);
+ # $net->serverSend($messageSender->processTokenizer($outgoingClientMessages, <callback object ?>));
while ($data = $outgoingClientMessages->readNext(\$type)) {
parseOutgoingClientMessage($data);
}
@@ -1004,7 +987,7 @@
}
my $switch = Network::MessageTokenizer::getMessageID($msg);
- parseMessage_pre('ro_sent', $switch, $msg, $sendMsg);
+ parseMessage_pre('Network::Send', $switch, $msg, $sendMsg);
my $serverType = $masterServer->{serverType};
@@ -1315,8 +1298,8 @@
sub parseMessage_pre {
my ($mode, $switch, $msg, $realMsg) = @_;
my ($title, $config_suffix, $desc_key, $dumpMethod5_word, $hook) = @{{
- 'received' => ['<< Received packet:', 'received', 'Recv', 'recv', 'parseMsg/pre'],
- 'ro_sent' => ['<< Sent by RO client:', 'ro_sent', 'Send', 'send', 'RO_sendMsg_pre'],
+ 'Network::Receive' => ['<< Received packet:', 'received', 'Recv', 'recv', 'parseMsg/pre'],
+ 'Network::Send' => ['<< Sent by RO client:', 'ro_sent', 'Send', 'send', 'RO_sendMsg_pre'],
}->{$mode}};
if ($config{'debugPacket_'.$config_suffix} && !existsInList($config{'debugPacket_exclude'}, $switch) ||
Index: src/Network/PacketParser.pm
===================================================================
--- src/Network/PacketParser.pm (revision 7791)
+++ src/Network/PacketParser.pm (working copy)
@@ -310,4 +310,69 @@
return $hook_args{return};
}
+sub processTokenizer {
+ my ($self, $tokenizer) = @_;
+
+ my $result = '';
+ my $type;
+ while (my $message = $tokenizer->readNext(\$type)) {
+ if ($type == Network::MessageTokenizer::KNOWN_MESSAGE) {
+ my $switch = Network::MessageTokenizer::getMessageID($message);
+
+ main::parseMessage_pre($self->{hook_prefix}, $switch, $message, $message);
+
+ my $willMangle = $self->willMangle($switch);
+ # If we're running in X-Kore mode, pass the message back to the RO client.
+ $result .= $message unless $willMangle;
+
+ $self->{lastPacketTime} = time;
+ if (my $args = $self->parse($message)) {
+ # Use the new object-oriented packet parser
+ if ($config{debugPacket_received} == 3 &&
+ existsInList($config{'debugPacket_include'}, $switch)) {
+ my $switch = $args->{switch};
+ my $packet = $packetParser->{packet_list}{$switch};
+ my ($name, $packString, $varNames) = @{$packet};
+
+ my @vars = ();
+ for my $varName (@{$varNames}) {
+ message "$varName = $args->{$varName}\n";
+ }
+ }
+
+ if ($willMangle) {
+ my $ret = $self->mangle($args);
+ if (!$ret) {
+ # Packet was not mangled
+ $result .= $args->{RAW_MSG};
+ } elsif ($ret == 1) {
+ # Packet was mangled
+ $result .= $packetParser->reconstruct($args);
+ } else {
+ # Packet was suppressed
+ }
+ }
+ }
+
+ } elsif ($type == Network::MessageTokenizer::ACCOUNT_ID) {
+ $result .= $message;
+
+ } elsif ($type == Network::MessageTokenizer::UNKNOWN_MESSAGE) {
+ # Unknown message - ignore it
+ my $switch = Network::MessageTokenizer::getMessageID($message);
+ if (!existsInList($config{debugPacket_exclude}, $switch)) {
+ warning TF("Packet Tokenizer: Unknown switch: %s\n", $switch), "connection";
+ visualDump($message, "<< Received unknown packet") if ($config{debugPacket_unparsed});
+ }
+ # Pass it along to the client, whatever it is
+ $result .= $message;
+
+ } else {
+ die "Packet Tokenizer: Unknown type: $type";
+ }
+ }
+
+ return $result;
+}
+
1;
Now, parse() and processTokenizer() need to be able to use object argument to look handlers in (currently it uses $self), and additional arguments to pass to handlers ($client in case of Base::RagnarokServer). Something like $PacketParser->parse($bytes, $object, $arg1, $arg2...). Also, maybe $args hashref for packet handlers should always be the first argument, so handlers would be called as $object->$handler($args, $arg1, $arg2...)? Currently, $client is positioned before $bytes in Base::RagnarokServer.
Object classes with handlers would include currently existing ServerType stuff (handlers should be moved away to separate module later but will work as is), {Base::Ragnarok,Network::XKore2}::{Account,Char,Map}Server, and new modules to replace parseOutgoingClientMessage and such.