public int SignalStream(string aStreamName, Stream aStream) {
var payload = new TByteBuffer();
if (!IsPublished && connection.AutoPublish)
Publish();
if (IsPublished) {
// ekStreamHeader, includes stream name, no stream data
var streamNameUtf8 = Encoding.UTF8.GetBytes(aStreamName);
var streamID = connection.getConnectionHashCode(streamNameUtf8);
payload.Prepare(ID);
payload.Prepare((Int32) 0); // tick
payload.Prepare((Int32) TEventKind.ekStreamHeader); // event kind
payload.Prepare(streamID);
payload.Prepare(aStreamName);
payload.PrepareApply();
payload.QWrite(ID);
payload.QWrite((Int32) 0); // tick
var eventKindIndex = payload.WriteCursor;
payload.QWrite((Int32) TEventKind.ekStreamHeader); // event kind
payload.QWrite(streamID);
var bodyIndex = payload.WriteCursor;
payload.QWrite(aStreamName);
var res = connection.WriteCommand(TConnectionPlatform.TCommands.icEvent, payload.Buffer);
if (res > 0) {
// ekStreamBody, only buffer size chunks of data
// prepare Payload to same value but aStreamName stripped
// fixup event kind
payload.WriteStart(eventKindIndex);
payload.QWrite((Int32) TEventKind.ekStreamBody);
payload.WriteStart(bodyIndex);
// prepare room for body data
payload.PrepareStart();
payload.PrepareSize(TConnection.MaxStreamBodyBuffer);
payload.PrepareApply();
// write pointer in ByteBuffer is still at beginning of stream read buffer!
// but buffer is already created on correct length
Int32 readSize;
do {
readSize = ReadBytesFromStream(payload, aStream);
//ReadSize = aStream.Read(Payload.Buffer, BodyIndex, Connection.MaxStreamBodyBuffer);
if (readSize == TConnection.MaxStreamBodyBuffer)
res = connection.WriteCommand(TConnectionPlatform.TCommands.icEvent, payload.Buffer);
// reset write position
payload.WriteStart(bodyIndex);
} while ((readSize == TConnection.MaxStreamBodyBuffer) && (res > 0));
if (res > 0) {
// clip ByteBuffer to bytes read from stream
// write pointer in ByteBuffer is still at beginning of stream read buffer!
payload.PrepareStart();
payload.PrepareSize(readSize);
payload.PrepareApplyAndTrim();
// fixup event kind
payload.WriteStart(eventKindIndex);
payload.QWrite((Int32) TEventKind.ekStreamTail);
res = connection.WriteCommand(TConnectionPlatform.TCommands.icEvent, payload.Buffer);
}
}
return res;
}
else
return TConnection.iceNotEventPublished;
}