Example #1
0
  public static ZprotoExample recv(Socket input) {
    assert (input != null);
    ZprotoExample self = new ZprotoExample(0);
    ZFrame frame = null;

    try {
      //  Read valid message frame from socket; we loop over any
      //  garbage data we might receive from badly-connected peers
      while (true) {
        //  If we're reading from a ROUTER socket, get routingId
        if (input.getType() == ZMQ.ROUTER) {
          self.routingId = ZFrame.recvFrame(input);
          if (self.routingId == null) return null; //  Interrupted
          if (!self.routingId.hasData()) return null; //  Empty Frame (eg recv-timeout)
          if (!input.hasReceiveMore()) throw new IllegalArgumentException();
        }
        //  Read and parse command in frame
        frame = ZFrame.recvFrame(input);
        if (frame == null) return null; //  Interrupted

        //  Get and check protocol signature
        self.needle = ByteBuffer.wrap(frame.getData());
        int signature = self.getNumber2();
        if (signature == (0xAAA0 | 0)) break; //  Valid signature

        //  Protocol assertion, drop message
        while (input.hasReceiveMore()) {
          frame.destroy();
          frame = ZFrame.recvFrame(input);
        }
        frame.destroy();
      }

      //  Get message id, which is first byte in frame
      self.id = self.getNumber1();
      int listSize;
      int hashSize;

      switch (self.id) {
        case LOG:
          {
            self.sequence = self.getNumber2();
            self.version = self.getNumber2();
            if (self.version != 3) throw new IllegalArgumentException();
            self.level = self.getNumber1();
            self.event = self.getNumber1();
            self.node = self.getNumber2();
            self.peer = self.getNumber2();
            self.time = self.getNumber8();
            self.host = self.getString();
            self.data = self.getLongString();
          }
          break;

        case STRUCTURES:
          {
            self.sequence = self.getNumber2();
            listSize = (int) self.getNumber4();
            self.aliases = new ArrayList<String>();
            while (listSize-- > 0) {
              String string = self.getLongString();
              self.aliases.add(string);
            }
            hashSize = (int) self.getNumber4();
            self.headers = new HashMap<String, String>();
            while (hashSize-- > 0) {
              String key = self.getString();
              String value = self.getLongString();

              self.headers.put(key, value);
            }
          }
          break;

        case BINARY:
          {
            self.sequence = self.getNumber2();
            self.flags = self.getBlock(4);
            self.public_key = self.getBlock((int) self.getNumber4());
            ByteBuffer bbIdentifier = ByteBuffer.wrap(self.getBlock(16));
            self.identifier = new UUID(bbIdentifier.getLong(), bbIdentifier.getLong());
            //  Get next frame, leave current untouched
            if (!input.hasReceiveMore()) throw new IllegalArgumentException();
            self.address = ZFrame.recvFrame(input);
            self.content = new ZMsg();
            if (input.hasReceiveMore()) self.content.add(ZFrame.recvFrame(input));
          }
          break;

        case TYPES:
          {
            self.sequence = self.getNumber2();
            self.client_forename = self.getString();
            self.client_surname = self.getString();
            self.client_mobile = self.getString();
            self.client_email = self.getString();
            self.supplier_forename = self.getString();
            self.supplier_surname = self.getString();
            self.supplier_mobile = self.getString();
            self.supplier_email = self.getString();
          }
          break;

        default:
          throw new IllegalArgumentException();
      }

      return self;

    } catch (Exception e) {
      //  Error returns
      System.out.printf("E: malformed message '%d'\n", self.id);
      self.destroy();
      return null;
    } finally {
      if (frame != null) frame.destroy();
    }
  }