// this is a special method that's not awaited public async Task StartWaitingForEvents(RemoteEvent remoteEvent) { while (true) { try { var operation = await _database.ReadOperationAsync(CancellationToken.None).ConfigureAwait(false); switch (operation) { case IscCodes.op_event: var dbHandle = await _database.Xdr.ReadInt32Async(CancellationToken.None).ConfigureAwait(false); var buffer = await _database.Xdr.ReadBufferAsync(CancellationToken.None).ConfigureAwait(false); var ast = new byte[8]; await _database.Xdr.ReadBytesAsync(ast, 8, CancellationToken.None).ConfigureAwait(false); var eventId = await _database.Xdr.ReadInt32Async(CancellationToken.None).ConfigureAwait(false); remoteEvent.EventCounts(buffer); await remoteEvent.Database.QueueEventsAsync(remoteEvent, CancellationToken.None).ConfigureAwait(false); break; default: Debug.Assert(false); break; } } catch (Exception) when(Volatile.Read(ref _closing)) { return; } catch (Exception ex) { remoteEvent.EventError(ex); break; } } }
public async Task WaitForEventsAsync(RemoteEvent remoteEvent) { while (true) { try { var operation = await _database.ReadOperationAsync().ConfigureAwait(false); switch (operation) { case IscCodes.op_event: var dbHandle = _database.Xdr.ReadInt32(); var buffer = _database.Xdr.ReadBuffer(); var ast = new byte[8]; _database.Xdr.ReadBytes(ast, 8); var eventId = _database.Xdr.ReadInt32(); remoteEvent.EventCounts(buffer); break; default: Debug.Assert(false); break; } } catch (Exception) when(_disposing) { return; } catch (Exception ex) when(!_disposing) { remoteEvent.EventError(ex); break; } } }
private async ValueTask <byte[]> ReceiveSliceResponseAsync(ArrayDesc desc, CancellationToken cancellationToken = default) { try { var operation = await _database.ReadOperationAsync(cancellationToken).ConfigureAwait(false); if (operation == IscCodes.op_slice) { var isVariying = false; var elements = 0; var length = await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false); length = await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false); switch (desc.DataType) { case IscCodes.blr_text: case IscCodes.blr_text2: case IscCodes.blr_cstring: case IscCodes.blr_cstring2: elements = length / desc.Length; length += elements * ((4 - desc.Length) & 3); break; case IscCodes.blr_varying: case IscCodes.blr_varying2: elements = length / desc.Length; isVariying = true; break; case IscCodes.blr_short: length = length * desc.Length; break; } if (isVariying) { using (var ms = new MemoryStream()) { var xdr = new XdrReaderWriter(new DataProviderStreamWrapper(ms)); for (var i = 0; i < elements; i++) { var buffer = await _database.Xdr.ReadOpaqueAsync(await _database.Xdr.ReadInt32Async(cancellationToken).ConfigureAwait(false), cancellationToken).ConfigureAwait(false); await xdr.WriteBufferAsync(buffer, buffer.Length, cancellationToken).ConfigureAwait(false); } await xdr.FlushAsync(cancellationToken).ConfigureAwait(false); return(ms.ToArray()); } } else { return(await _database.Xdr.ReadOpaqueAsync(length, cancellationToken).ConfigureAwait(false)); } } else { await _database.ReadResponseAsync(operation, cancellationToken).ConfigureAwait(false); return(null); } } catch (IOException ex) { throw IscException.ForIOException(ex); } }