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;
}