parse method

int parse(
  1. DC data,
  2. int offset,
  3. int ends
)

Implementation

int parse(DC data, int offset, int ends) {
  _originalOffset = offset;

  if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

  previousCommand = command;

  command = (data[offset] >> 6);

  if (command == IIPPacketCommand.Event) {
    event = (data[offset++] & 0x3f);

    if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

    resourceId = data.getUint32(offset);
    offset += 4;
  } else if (command == IIPPacketCommand.Report) {
    report = (data[offset++] & 0x3f);

    if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

    callbackId = data.getUint32(offset);
    offset += 4;
  } else {
    previousAction = action;
    action = (data[offset++] & 0x3f);

    if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

    callbackId = data.getUint32(offset);
    offset += 4;
  }

  if (command == IIPPacketCommand.Event) {
    if (event == IIPPacketEvent.ResourceReassigned) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      newResourceId = data.getUint32(offset);
      offset += 4;
    } else if (event == IIPPacketEvent.ResourceDestroyed) {
      // nothing to parse
    } else if (event == IIPPacketEvent.ChildAdded ||
        event == IIPPacketEvent.ChildRemoved) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      childId = data.getUint32(offset);
      offset += 4;
    } else if (event == IIPPacketEvent.Renamed) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      resourceName = data.getString(offset, cl);

      offset += cl;
    } else if (event == IIPPacketEvent.PropertyUpdated ||
        event == IIPPacketEvent.EventOccurred) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      methodIndex = data[offset++];

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    }
    // else if (event == IIPPacketEvent.EventOccurred)
    // {
    //     if (_notEnough(offset, ends, 5))
    //         return -_dataLengthNeeded;

    //     methodIndex = data[offset++];

    //     var cl = data.getUint32( offset);
    //     offset += 4;

    //     if (_notEnough(offset, ends, cl))
    //         return -_dataLengthNeeded;

    //     content = data.clip(offset, cl);
    //     offset += cl;

    // }
    // Attribute
    else if (event == IIPPacketEvent.AttributesUpdated) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      var cl = data.getUint32(offset);
      offset += 4;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      //@TODO: fix this
      //content = data.clip(offset, cl);

      offset += cl;
    }
  } else if (command == IIPPacketCommand.Request) {
    if (action == IIPPacketAction.AttachResource) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.ReattachResource) {
      if (_notEnough(offset, ends, 12)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;

      resourceAge = data.getUint64(offset);
      offset += 8;
    } else if (action == IIPPacketAction.DetachResource) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.CreateResource) {
      if (_notEnough(offset, ends, 12)) return -_dataLengthNeeded;

      storeId = data.getUint32(offset);
      offset += 4;
      resourceId = data.getUint32(offset);
      offset += 4;

      var cl = data.getUint32(offset);
      offset += 4;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      //@TODO: fix this
      //content = data.clip(offset, cl);
    } else if (action == IIPPacketAction.DeleteResource) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.AddChild ||
        action == IIPPacketAction.RemoveChild) {
      if (_notEnough(offset, ends, 8)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
      childId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.RenameResource) {
      if (_notEnough(offset, ends, 6)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      resourceName = data.getString(offset, cl);
      offset += cl;
    } else if (action == IIPPacketAction.TemplateFromClassName) {
      if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

      var cl = data[offset++];

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      className = data.getString(offset, cl);
      offset += cl;
    } else if (action == IIPPacketAction.TemplateFromClassId) {
      if (_notEnough(offset, ends, 16)) return -_dataLengthNeeded;

      classId = data.getGuid(offset);
      offset += 16;
    } else if (action == IIPPacketAction.TemplateFromResourceId) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.QueryLink ||
        action == IIPPacketAction.LinkTemplates) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      resourceLink = data.getString(offset, cl);
      offset += cl;
    } else if (action == IIPPacketAction.ResourceChildren ||
        action == IIPPacketAction.ResourceParents) {
      if (_notEnough(offset, ends, 4)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.ResourceHistory) {
      if (_notEnough(offset, ends, 20)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;

      fromDate = data.getDateTime(offset);
      offset += 8;

      toDate = data.getDateTime(offset);
      offset += 8;
    } else if (action == IIPPacketAction.InvokeFunction) {
      if (_notEnough(offset, ends, 6)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;

      methodIndex = data[offset++];

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    } else if (action == IIPPacketAction.Listen ||
        action == IIPPacketAction.Unlisten) {
      if (_notEnough(offset, ends, 5)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;

      methodIndex = data[offset++];
    }
    // else if (action == IIPPacketAction.GetProperty)
    // {
    //     if (_notEnough(offset, ends, 5))
    //         return -_dataLengthNeeded;

    //     resourceId = data.getUint32(offset);
    //     offset += 4;

    //     methodIndex = data[offset++];

    // }
    // else if (action == IIPPacketAction.GetPropertyIfModified)
    // {
    //     if (_notEnough(offset, ends, 9))
    //         return -_dataLengthNeeded;

    //     resourceId = data.getUint32(offset);
    //     offset += 4;

    //     methodIndex = data[offset++];

    //     resourceAge = data.getUint64(offset);
    //     offset += 8;

    // }
    else if (action == IIPPacketAction.SetProperty) {
      if (_notEnough(offset, ends, 6)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;

      methodIndex = data[offset++];
      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    }
    // Attributes
    else if (action == IIPPacketAction.UpdateAllAttributes ||
        action == IIPPacketAction.GetAttributes ||
        action == IIPPacketAction.UpdateAttributes ||
        action == IIPPacketAction.ClearAttributes) {
      if (_notEnough(offset, ends, 8)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
      var cl = data.getUint32(offset);
      offset += 4;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      //@TODO: fix this
      //content = data.clip(offset, cl);
      offset += cl;
    } else if (action == IIPPacketAction.KeepAlive) {
      if (_notEnough(offset, ends, 12)) return -_dataLengthNeeded;

      currentTime = data.getDateTime(offset);
      offset += 8;
      interval = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.ProcedureCall) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      procedure = data.getString(offset, cl);
      offset += cl;

      if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

      var parsed = TransmissionType.parse(data, offset, ends);

      if (dataType == null) return -parsed.size;

      offset += parsed.size;
    } else if (action == IIPPacketAction.StaticCall) {
      if (_notEnough(offset, ends, 18)) return -_dataLengthNeeded;

      classId = data.getGuid(offset);
      offset += 16;

      methodIndex = data[offset++];

      var parsed = TransmissionType.parse(data, offset, ends);

      if (dataType == null) return -parsed.size;

      offset += parsed.size;
    }
  } else if (command == IIPPacketCommand.Reply) {
    if (action == IIPPacketAction.AttachResource ||
        action == IIPPacketAction.ReattachResource) {
      if (_notEnough(offset, ends, 26)) return -_dataLengthNeeded;

      classId = data.getGuid(offset);
      offset += 16;

      resourceAge = data.getUint64(offset);
      offset += 8;

      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      resourceLink = data.getString(offset, cl);
      offset += cl;

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    } else if (action == IIPPacketAction.DetachResource) {
      // nothing to do
    } else if (action == IIPPacketAction.CreateResource) {
      if (_notEnough(offset, ends, 20)) return -_dataLengthNeeded;

      resourceId = data.getUint32(offset);
      offset += 4;
    } else if (action == IIPPacketAction.DetachResource) {
      // nothing to do
    }
    // Inquire
    else if (action == IIPPacketAction.TemplateFromClassName ||
        action == IIPPacketAction.TemplateFromClassId ||
        action == IIPPacketAction.TemplateFromResourceId ||
        action == IIPPacketAction.QueryLink ||
        action == IIPPacketAction.ResourceChildren ||
        action == IIPPacketAction.ResourceParents ||
        action == IIPPacketAction.ResourceHistory ||
        action == IIPPacketAction.LinkTemplates
        // Attribute
        ||
        action == IIPPacketAction.GetAllAttributes ||
        action == IIPPacketAction.GetAttributes) {
      if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    } else if (action == IIPPacketAction.InvokeFunction ||
        action == IIPPacketAction.ProcedureCall ||
        action == IIPPacketAction.StaticCall) {
      if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    } else if (action == IIPPacketAction.SetProperty ||
        action == IIPPacketAction.Listen ||
        action == IIPPacketAction.Unlisten) {
      // nothing to do
    } else if (action == IIPPacketAction.KeepAlive) {
      if (_notEnough(offset, ends, 12)) return -_dataLengthNeeded;

      currentTime = data.getDateTime(offset);
      offset += 8;
      jitter = data.getUint32(offset);
      offset += 4;
    }
  } else if (command == IIPPacketCommand.Report) {
    if (report == IIPPacketReport.ManagementError) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      errorCode = data.getUint16(offset);
      offset += 2;
    } else if (report == IIPPacketReport.ExecutionError) {
      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      errorCode = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, 2)) return -_dataLengthNeeded;

      var cl = data.getUint16(offset);
      offset += 2;

      if (_notEnough(offset, ends, cl)) return -_dataLengthNeeded;

      errorMessage = data.getString(offset, cl);
      offset += cl;
    } else if (report == IIPPacketReport.ProgressReport) {
      if (_notEnough(offset, ends, 8)) return -_dataLengthNeeded;

      progressValue = data.getInt32(offset);
      offset += 4;
      progressMax = data.getInt32(offset);
      offset += 4;
    } else if (report == IIPPacketReport.ChunkStream) {
      if (_notEnough(offset, ends, 1)) return -_dataLengthNeeded;

      var parsed = TransmissionType.parse(data, offset, ends);

      if (parsed.type == null) return -parsed.size;

      dataType = parsed.type;
      offset += parsed.size;
    }
  }

  return offset - _originalOffset;
}