Ejemplo n.º 1
0
  private void handleFastPath(ByteBuffer buf, Link link, int typeAndFlags) {
    // Number of bytes in updateData field (including header (1+1 or 2
    // bytes))
    int length = buf.readVariableUnsignedShort();

    if (!cap(buf, length, length, link, false))
      // Wait for full packet to arrive
      return;

    int type = typeAndFlags & 0x3;
    int securityFlags = (typeAndFlags >> 6) & 0x3;

    // Assertions
    {
      if (type != PROTOCOL_FASTPATH)
        throw new RuntimeException(
            "Unknown protocol. Expected protocol: 0 (FastPath). Actual protocol: "
                + type
                + ", data: "
                + buf
                + ".");

      switch (securityFlags) {
        case FASTPATH_OUTPUT_SECURE_CHECKSUM:
          // TODO
          throw new RuntimeException("Secure checksum is not supported in FastPath packets.");
        case FASTPATH_OUTPUT_ENCRYPTED:
          // TODO
          throw new RuntimeException("Encryption is not supported in FastPath packets.");
      }
    }

    // TODO: optional FIPS information, when FIPS is selected
    // TODO: optional data signature (checksum), when checksum or FIPS is
    // selected

    // Array of FastPath update fields
    while (buf.cursor < buf.length) {

      int updateHeader = buf.readUnsignedByte();

      int size = buf.readUnsignedShortLE();

      int updateCode = updateHeader & 0xf;
      int fragmentation = (updateHeader >> 4) & 0x3;
      int compression = (updateHeader >> 6) & 0x3;

      if (verbose)
        System.out.println(
            "["
                + this
                + "] INFO: FastPath update received. UpdateCode: "
                + updateCode
                + ", fragmentation: "
                + fragmentation
                + ", compression: "
                + compression
                + ", size: "
                + size
                + ".");

      ByteBuffer data = buf.readBytes(size);
      buf.putMetadata("fragmentation", fragmentation);
      buf.putMetadata("compression", compression);

      switch (updateCode) {
        case FASTPATH_UPDATETYPE_ORDERS:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_ORDERS.");
          pushDataToPad(ORDERS_PAD, data);
          break;

        case FASTPATH_UPDATETYPE_BITMAP:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_BITMAP.");
          pushDataToPad(BITMAP_PAD, data);
          break;

        case FASTPATH_UPDATETYPE_PALETTE:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_PALETTE.");
          pushDataToPad(PALETTE_PAD, data);
          break;

        case FASTPATH_UPDATETYPE_SYNCHRONIZE:
          // @see http://msdn.microsoft.com/en-us/library/cc240625.aspx
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_SYNCHRONIZE.");

          data.unref();

          if (size != 0)
            throw new RuntimeException(
                "Size of FastPath synchronize packet must be 0. UpdateCode: "
                    + updateCode
                    + ", fragmentation: "
                    + fragmentation
                    + ", compression: "
                    + compression
                    + ", size: "
                    + size
                    + ", data: "
                    + data
                    + ".");
          break;

        case FASTPATH_UPDATETYPE_SURFCMDS:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_SURFCMDS.");

          break;

        case FASTPATH_UPDATETYPE_PTR_NULL:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_PTR_NULL.");

          break;

        case FASTPATH_UPDATETYPE_PTR_DEFAULT:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_PTR_DEFAULT.");

          break;

        case FASTPATH_UPDATETYPE_PTR_POSITION:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_PTR_POSITION.");

          break;

        case FASTPATH_UPDATETYPE_COLOR:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_COLOR.");

          break;

        case FASTPATH_UPDATETYPE_CACHED:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_CACHED.");

          break;

        case FASTPATH_UPDATETYPE_POINTER:
          if (verbose) System.out.println("[" + this + "] INFO: FASTPATH_UPDATETYPE_POINTER.");

          break;

        default:
          throw new RuntimeException(
              "Unknown FastPath update. UpdateCode: "
                  + updateCode
                  + ", fragmentation: "
                  + fragmentation
                  + ", compression: "
                  + compression
                  + ", size: "
                  + size
                  + ", data: "
                  + data
                  + ".");
      }
      buf.unref();
    }
  }