public static BaseWorldTcpMessage ReadMessage(IncomingMessage inMessage)
 {
     BaseWorldTcpMessage rv;
     byte[] data = inMessage.ReadBytes();
     IncomingMessage subMsg = new IncomingMessage(data, inMessage);
     WorldTcpMessageType messageType = subMsg.ReadWorldTcpMessageType();
     switch (messageType) {
         case WorldTcpMessageType.CharacterResponse:
             rv = new WorldCharacterResponseMessage();
             break;
         case WorldTcpMessageType.CharacterCreateResponse:
             rv = new WorldCharacterCreateResponseMessage();
             break;
         case WorldTcpMessageType.CharacterDeleteResponse:
             rv = new WorldCharacterDeleteResponseMessage();
             break;
         case WorldTcpMessageType.CharacterSelectResponse:
             rv = new WorldCharacterSelectResponseMessage();
             break;
         default:
             log.ErrorFormat("Unhandled world tcp message type: {0}", messageType);
             return null;
     }
     log.InfoFormat("WorldTcpMessageFactory got message type: {0}", messageType);
     rv.ParseWorldTcpMessage(subMsg);
     return rv;
 }