protected bool SendRTMPMessage(BaseRTMPProtocol pTo, AmfMessage message, bool trackResponse = false, bool recycleMessageBody = true)
{
switch (message.MessageType)
{
case Defines.RM_HEADER_MESSAGETYPE_INVOKE:
if (message.InvokeFunction != Defines.RM_INVOKE_FUNCTION_RESULT)
{
if (!_nextInvokeId.ContainsKey(pTo.Id))
{
Logger.FATAL("Unable to get next invoke ID");
return false;
}
if (trackResponse)
{
uint invokeId = _nextInvokeId[pTo.Id];
_nextInvokeId[pTo.Id] = invokeId + 1;
message.InvokeId = invokeId;
if (!_resultMessageTracking.ContainsKey(pTo.Id))
_resultMessageTracking[pTo.Id] = new Dictionary<uint, AmfMessage>();
//do not store stupid useless amount of data needed by onbwcheck
if (message.InvokeFunction == Defines.RM_INVOKE_FUNCTION_ONBWCHECK)
_resultMessageTracking[pTo.Id][invokeId] = _onBWCheckStrippedMessage;
else
_resultMessageTracking[pTo.Id][invokeId] = message;
recycleMessageBody = false;
}
else
{
message.InvokeId = 0;
}
//return pTo.SendMessage(message,true);
}
return pTo.SendMessage( message, true, recycleMessageBody);
case Defines.RM_HEADER_MESSAGETYPE_FLEXSTREAMSEND:
case Defines.RM_HEADER_MESSAGETYPE_WINACKSIZE:
case Defines.RM_HEADER_MESSAGETYPE_PEERBW:
case Defines.RM_HEADER_MESSAGETYPE_USRCTRL:
case Defines.RM_HEADER_MESSAGETYPE_ABORTMESSAGE:
return pTo.SendMessage( message, true, recycleMessageBody);
default:
Logger.FATAL("Unable to send message:\n{0}", message.ToString());
return false;
}
}