/// <summary> /// This method supports the Fluorine infrastructure and is not intended to be used directly from your code. /// </summary> /// <param name="amfMessage"></param> public void WriteMessage(AMFMessage amfMessage) { try { WriteShort(amfMessage.Version); var headerCount = amfMessage.HeaderCount; WriteShort(headerCount); for (var i = 0; i < headerCount; i++) { WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0); } var bodyCount = amfMessage.BodyCount; WriteShort(bodyCount); for (var i = 0; i < bodyCount; i++) { var responseBody = amfMessage.GetBodyAt(i) as ResponseBody; if (responseBody != null && !responseBody.IgnoreResults) { responseBody.WriteBody(amfMessage.ObjectEncoding, this); } else { var amfBody = amfMessage.GetBodyAt(i); ValidationUtils.ObjectNotNull(amfBody, "amfBody"); amfBody.WriteBody(amfMessage.ObjectEncoding, this); } } } catch (Exception exception) { if (Log.IsFatalEnabled) Log.Fatal(String.Format(Resources.Amf_SerializationFail), exception); throw; } }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for(int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader amfHeader = amfMessage.GetHeaderAt(i); if( amfHeader != null && amfHeader.Name != null ) hashtable[amfHeader.Name] = amfHeader.Content; } this["AmfHeaders"] = hashtable; }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for (int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader amfHeader = amfMessage.GetHeaderAt(i); if (amfHeader != null && amfHeader.Name != null) { hashtable[amfHeader.Name] = amfHeader.Content; } } this["AmfHeaders"] = hashtable; }
public AMFRequestHeaders(AMFMessage amfMessage) { this["EventType"] = "AmfHeaders"; Hashtable hashtable = new Hashtable(); for (int i = 0; i < amfMessage.HeaderCount; i++) { AMFHeader headerAt = amfMessage.GetHeaderAt(i); if ((headerAt != null) && (headerAt.Name != null)) { hashtable[headerAt.Name] = headerAt.Content; } } this["AmfHeaders"] = hashtable; }
private void BeginResponseFlexCall(IAsyncResult ar) { try { AmfRequestData amfRequestData = ar.AsyncState as AmfRequestData; if (amfRequestData != null) { HttpWebResponse response = (HttpWebResponse)amfRequestData.Request.EndGetResponse(ar); if (response != null) { //Get response and deserialize Stream responseStream = response.GetResponseStream(); if (responseStream != null) { AMFDeserializer amfDeserializer = new AMFDeserializer(responseStream); AMFMessage responseMessage = amfDeserializer.ReadAMFMessage(); AMFBody responseBody = responseMessage.GetBodyAt(0); for (int i = 0; i < responseMessage.HeaderCount; i++) { AMFHeader header = responseMessage.GetHeaderAt(i); if (header.Name == AMFHeader.RequestPersistentHeader) _netConnection.AddHeader(header.Name, header.MustUnderstand, header.Content); } object message = responseBody.Content; if (message is ErrorMessage) { /* ASObject status = new ASObject(); status["level"] = "error"; status["code"] = "NetConnection.Call.Failed"; status["description"] = (result as ErrorMessage).faultString; status["details"] = result; _netConnection.RaiseNetStatus(status); */ if (amfRequestData.Call != null) { PendingCall call = amfRequestData.Call; call.Result = message; call.Status = Messaging.Rtmp.Service.Call.STATUS_INVOCATION_EXCEPTION; amfRequestData.Callback.ResultReceived(call); } if (amfRequestData.Responder != null) { StatusFunction statusFunction = amfRequestData.Responder.GetType().GetProperty("Status").GetValue(amfRequestData.Responder, null) as StatusFunction; if (statusFunction != null) statusFunction(new Fault(message as ErrorMessage)); } } else if (message is AcknowledgeMessage) { AcknowledgeMessage ack = message as AcknowledgeMessage; if (_netConnection.ClientId == null && ack.HeaderExists(MessageBase.FlexClientIdHeader)) _netConnection.SetClientId(ack.GetHeader(MessageBase.FlexClientIdHeader) as string); if (amfRequestData.Call != null) { PendingCall call = amfRequestData.Call; call.Result = ack.body; call.Status = Messaging.Rtmp.Service.Call.STATUS_SUCCESS_RESULT; amfRequestData.Callback.ResultReceived(call); } if (amfRequestData.Responder != null) { Delegate resultFunction = amfRequestData.Responder.GetType().GetProperty("Result").GetValue(amfRequestData.Responder, null) as Delegate; if (resultFunction != null) { ParameterInfo[] arguments = resultFunction.Method.GetParameters(); object result = TypeHelper.ChangeType(ack.body, arguments[0].ParameterType); resultFunction.DynamicInvoke(result); } } } } else _netConnection.RaiseNetStatus("Could not aquire ResponseStream"); } else _netConnection.RaiseNetStatus("Could not aquire HttpWebResponse"); } } catch (Exception ex) { _netConnection.RaiseNetStatus(ex); } }
private void BeginResponseFlashCall(IAsyncResult ar) { try { AmfRequestData amfRequestData = ar.AsyncState as AmfRequestData; if (amfRequestData != null) { HttpWebResponse response = (HttpWebResponse)amfRequestData.Request.EndGetResponse(ar); if (response != null) { //Get response and deserialize Stream responseStream = response.GetResponseStream(); if (responseStream != null) { AMFDeserializer amfDeserializer = new AMFDeserializer(responseStream); AMFMessage responseMessage = amfDeserializer.ReadAMFMessage(); AMFBody responseBody = responseMessage.GetBodyAt(0); for (int i = 0; i < responseMessage.HeaderCount; i++) { AMFHeader header = responseMessage.GetHeaderAt(i); if (header.Name == AMFHeader.RequestPersistentHeader) _netConnection.AddHeader(header.Name, header.MustUnderstand, header.Content); } if (amfRequestData.Call != null) { PendingCall call = amfRequestData.Call; call.Result = responseBody.Content; call.Status = responseBody.Target.EndsWith(AMFBody.OnStatus) ? Messaging.Rtmp.Service.Call.STATUS_INVOCATION_EXCEPTION : Messaging.Rtmp.Service.Call.STATUS_SUCCESS_RESULT; amfRequestData.Callback.ResultReceived(call); } if (amfRequestData.Responder != null) { if (responseBody.Target.EndsWith(AMFBody.OnStatus)) { StatusFunction statusFunction = amfRequestData.Responder.GetType().GetProperty("Status").GetValue(amfRequestData.Responder, null) as StatusFunction; if (statusFunction != null) statusFunction(new Fault(responseBody.Content)); } else { Delegate resultFunction = amfRequestData.Responder.GetType().GetProperty("Result").GetValue(amfRequestData.Responder, null) as Delegate; if (resultFunction != null) { ParameterInfo[] arguments = resultFunction.Method.GetParameters(); object result = TypeHelper.ChangeType(responseBody.Content, arguments[0].ParameterType); resultFunction.DynamicInvoke(result); } } } } else _netConnection.RaiseNetStatus("Could not aquire ResponseStream"); } else _netConnection.RaiseNetStatus("Could not aquire HttpWebResponse"); } } catch (Exception ex) { _netConnection.RaiseNetStatus(ex); } }
public void WriteMessage(AMFMessage amfMessage) { try { base.WriteShort(amfMessage.Version); int headerCount = amfMessage.HeaderCount; base.WriteShort(headerCount); for(int i = 0; i < headerCount; i++) { this.WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0); } int bodyCount = amfMessage.BodyCount; base.WriteShort(bodyCount); for(int i = 0; i < bodyCount; i++) { ResponseBody responseBody = amfMessage.GetBodyAt(i) as ResponseBody; if (responseBody != null && !responseBody.IgnoreResults) { //Try to catch serialization errors if (this.BaseStream.CanSeek) { long position = this.BaseStream.Position; try { responseBody.WriteBody(amfMessage.ObjectEncoding, this); } catch (Exception exception) { this.BaseStream.Seek(position, SeekOrigin.Begin); //this.BaseStream.Position = position; #if !SILVERLIGHT if (log.IsFatalEnabled) log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception); #endif ErrorResponseBody errorResponseBody; if (responseBody.RequestBody.IsEmptyTarget) { object content = responseBody.RequestBody.Content; if (content is IList) content = (content as IList)[0]; IMessage message = content as IMessage; MessageException messageException = new MessageException(exception); messageException.FaultCode = __Res.GetString(__Res.Amf_SerializationFail); errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, message, messageException); } else errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, exception); try { errorResponseBody.WriteBody(amfMessage.ObjectEncoding, this); } #if !SILVERLIGHT catch (Exception exception2) { if (log.IsFatalEnabled) log.Fatal(__Res.GetString(__Res.Amf_ResponseFail), exception2); throw; } #else catch (Exception) { throw; } #endif } } else responseBody.WriteBody(amfMessage.ObjectEncoding, this); } else { AMFBody amfBody = amfMessage.GetBodyAt(i); FluorineFx.Util.ValidationUtils.ObjectNotNull(amfBody, "amfBody"); amfBody.WriteBody(amfMessage.ObjectEncoding, this); } } } #if !SILVERLIGHT catch(Exception exception) { if( log.IsFatalEnabled ) log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception); throw; } #else catch (Exception) { throw; } #endif }