Exemplo n.º 1
0
        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);
            }
        }