private void ThreadHandler(object o) { try { while (GetEventsCountLocked() > 0) { var operation = _database.NextOperation(); switch (operation) { case IscCodes.op_response: _database.ReadResponse(); continue; case IscCodes.op_exit: case IscCodes.op_disconnect: Close(); return; case IscCodes.op_event: var dbHandle = _database.ReadInt32(); var buffer = _database.ReadBuffer(); var ast = _database.ReadBytes(8); var eventId = _database.ReadInt32(); RemoteEvent currentEvent; if (_events.TryRemove(eventId, out currentEvent)) { // Notify new event counts currentEvent.EventCounts(buffer); } continue; } } } catch (ThreadAbortException) { return; } catch { return; } }
private byte[] ReceiveSliceResponse(ArrayDesc desc) { try { int operation = _database.ReadOperation(); if (operation == IscCodes.op_slice) { // Read slice length bool isVariying = false; int elements = 0; int length = _database.ReadInt32(); length = _database.ReadInt32(); 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) { XdrStream xdr = new XdrStream(); for (int i = 0; i < elements; i++) { byte[] buffer = _database.ReadOpaque(_database.ReadInt32()); xdr.WriteBuffer(buffer, buffer.Length); } return(xdr.ToArray()); } else { return(_database.ReadOpaque(length)); } } else { _database.SetOperation(operation); _database.ReadResponse(); return(null); } } catch (IOException) { throw new IscException(IscCodes.isc_net_read_err); } }