summaryrefslogtreecommitdiff
path: root/NET/worlds/network/netPacketReader.java
blob: b42f3573cce13fc598dfdcaea6762e566305ed1b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package NET.worlds.network;

import NET.worlds.console.StatNetMUNode;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Vector;

public class netPacketReader extends Thread {
   private Vector<receivedNetPacket> _msgQ;
   private ServerInputStream _in;
   private WorldServer _serv;
   private static Class<receivedNetPacket>[] msgTable = new Class[255];

   static {
      String basePath = "NET.worlds.network.";
      Vector<String> cmdList = new netCmds().recvCmdList();

      for (int i = 0; i < cmdList.size(); i++) {
         String cmdName = basePath + cmdList.elementAt(i);

         try {
            Class<receivedNetPacket> tmpCmdClass = (Class<receivedNetPacket>)Class.forName(cmdName);
            receivedNetPacket tmpInstance = tmpCmdClass.newInstance();
            int indx = tmpInstance.msgID();

            assert indx > -1;

            assert msgTable[indx] == null;

            msgTable[indx] = tmpCmdClass;
         } catch (NoSuchMethodError var11) {
            NoSuchMethodError e = var11;
            synchronized (System.out) {
               System.out.println("netPacketReader:: " + e.getClass().getName() + " creating " + cmdName);
               System.out.println("netPacketReader:: Exception: " + e.getMessage());
               e.printStackTrace(System.out);
            }

            assert false;
         } catch (Exception var12) {
            Exception e = var12;
            synchronized (System.out) {
               System.out.println("netPacketReader:: " + e.getClass().getName() + " creating " + cmdName);
               System.out.println("netPacketReader:: Exception: " + e.getMessage());
               e.printStackTrace(System.out);
            }

            assert false;
         }
      }
   }

   public netPacketReader(ServerInputStream in) {
      this._in = in;
      this._msgQ = new Vector<receivedNetPacket>();
   }

   public netPacketReader(WorldServer serv, ServerInputStream in) {
      this._serv = serv;
      this._in = in;
      this._msgQ = new Vector<receivedNetPacket>();
      this._in.setVersion(this.getVersion());
   }

   public void setVersion(int vers) {
      this._in.setVersion(vers);
   }

   public int getVersion() {
      return this._serv.getVersion();
   }

   public void put(receivedNetPacket pkt) {
      this._msgQ.addElement(pkt);
   }

   public receivedNetPacket get() {
      assert this._msgQ != null;

      if (this._msgQ.isEmpty()) {
         return null;
      } else {
         receivedNetPacket packet = this._msgQ.firstElement();
         this._msgQ.removeElement(packet);
         return packet;
      }
   }

   public int count() {
      return this._msgQ.size();
   }

   private final void buildMsg() throws IOException {
      this._in.readPacketSize();
      byte[] packetData = new byte[this._in.bytesLeft() + 1];
      packetData[0] = (byte)(this._in.bytesLeft() + 1);
      this._in.readFully(packetData, 1, this._in.bytesLeft());
      StatNetMUNode netStat = StatNetMUNode.getNode();
      netStat.addBytesRcvd(packetData.length);
      netStat.addPacketsRcvd(1);
      ServerInputStream in = new ServerInputStream(new ByteArrayInputStream(packetData));
      in.readPacketSize();
      if ((WorldServer.getDebugLevel() & 2048) > 0) {
         synchronized (System.out) {
            System.out.print(this._serv + ": recv[");

            for (int i = 0; i < packetData.length; i++) {
               System.out.print(Integer.toString(packetData[i] & 255, 16) + " ");
            }

            System.out.println("]");
         }
      }

      receivedNetPacket packet = null;
      ObjID objID = new ObjID();
      objID.parseNetData(in);
      boolean isCO = objID.shortID() == 254;
      int cmdType = in.readUnsignedByte();
      if (cmdType < msgTable.length && msgTable[cmdType] != null) {
         do {
            if (isCO) {
               objID = new ObjID();
               objID.parseNetData(in);
            }

            try {
               packet = msgTable[cmdType].newInstance();
            } catch (Exception var8) {
               System.out.println(var8 + ": " + var8.getMessage());

               assert false;
            }

            packet.init(objID);
            packet.parseNetData(in);
            this._msgQ.addElement(packet);
            yield();
         } while (!in.isEmpty() && isCO);

         assert in.isEmpty();
      } else {
         System.out.println("UNKNOWN SERVER MSG#" + String.valueOf(cmdType));
         in.skipBytes(in.bytesLeft());

         assert in.isEmpty();
      }
   }

   @Override
   public void run() {
      try {
         while (true) {
            this.buildMsg();
         }
      } catch (IOException var2) {
         this._msgQ.addElement(new ExceptionCmd(var2));
      }
   }
}