// used by send and send_reg (message types with payload) protected internal virtual void do_send(OtpOutputStream header, OtpOutputStream payload) { lock(this) { try { if (traceLevel >= OtpTrace.Type.sendThreshold) { // Need to decode header and output buffer to show trace message! // First make OtpInputStream, then decode. try { if (traceLevel >= OtpTrace.Type.wireThreshold) { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); Erlang.Binary hb = header.ToBinary(); Erlang.Binary ob = payload.ToBinary(); System.Text.StringBuilder s = new System.Text.StringBuilder(); s.AppendFormat("-> {0} {1} (header_sz={2}, msg_sz={3})\n" + " Header: {4}\n" + " Msg: {5}", headerType(h), h.ToString(), hb.size(), ob.size(), hb.ToBinaryString(), ob.ToBinaryString()); OtpTrace.TraceEvent(s.ToString()); h = null; hb = null; ob = null; } else { Erlang.Object h = (header.getOtpInputStream(5)).read_any(); OtpTrace.TraceEvent("-> " + headerType(h) + " " + h.ToString()); Erlang.Object o = (payload.getOtpInputStream(0)).read_any(); OtpTrace.TraceEvent(" " + o.ToString()); h = null; o = null; } } catch (Erlang.Exception e) { OtpTrace.TraceEvent(" " + "can't decode output buffer:" + e); } } header.writeTo((System.IO.Stream) socket.GetStream()); payload.writeTo((System.IO.Stream) socket.GetStream()); long written = header.count() + payload.count(); sentBytes += written; sentMsgs++; if (onReadWrite != null) onReadWrite(this, Operation.Write, written, sentBytes, sentMsgs); } catch (System.Exception e) { close(); throw e; } } }