Esempio n. 1
0
        public override async ValueTask StartAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
        {
            try
            {
                await _database.Xdr.WriteAsync(IscCodes.op_service_start, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(Handle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(0, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBufferAsync(spb.ToArray(), spb.Length, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                try
                {
                    await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);
                }
                catch (IscException)
                {
                    throw;
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 2
0
 protected virtual void SendAttachToBuffer(ServiceParameterBufferBase spb, string service)
 {
     _database.Xdr.Write(IscCodes.op_service_attach);
     _database.Xdr.Write(0);
     _database.Xdr.Write(service);
     _database.Xdr.WriteBuffer(spb.ToArray());
 }
Esempio n. 3
0
        public override async ValueTask QueryAsync(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer, CancellationToken cancellationToken = default)
        {
            try
            {
                await _database.Xdr.WriteAsync(IscCodes.op_service_info, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(Handle, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(GdsDatabase.Incarnation, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBufferAsync(spb.ToArray(), spb.Length, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteBufferAsync(requestBuffer, requestLength, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.WriteAsync(bufferLength, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                var response = (GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

                var responseLength = bufferLength;

                if (response.Data.Length < bufferLength)
                {
                    responseLength = response.Data.Length;
                }

                Buffer.BlockCopy(response.Data, 0, buffer, 0, responseLength);
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 4
0
        public override void Query(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer)
        {
            try
            {
                _database.Xdr.Write(IscCodes.op_service_info);
                _database.Xdr.Write(Handle);
                _database.Xdr.Write(GdsDatabase.Incarnation);
                _database.Xdr.WriteBuffer(spb.ToArray(), spb.Length);
                _database.Xdr.WriteBuffer(requestBuffer, requestLength);
                _database.Xdr.Write(bufferLength);

                _database.Xdr.Flush();

                var response = (GenericResponse)_database.ReadResponse();

                var responseLength = bufferLength;

                if (response.Data.Length < bufferLength)
                {
                    responseLength = response.Data.Length;
                }

                Buffer.BlockCopy(response.Data, 0, buffer, 0, responseLength);
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 5
0
    private async Task <byte[]> QueryServiceAsync(byte[] items, ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        var shouldClose = false;

        if (State == FbServiceState.Closed)
        {
            await OpenAsync(cancellationToken).ConfigureAwait(false);

            shouldClose = true;
        }
        try
        {
            var buffer = new byte[QueryBufferSize];
            await _svc.QueryAsync(spb, items.Length, items, buffer.Length, buffer, cancellationToken).ConfigureAwait(false);

            return(buffer);
        }
        finally
        {
            if (shouldClose)
            {
                await CloseAsync(cancellationToken).ConfigureAwait(false);
            }
        }
    }
Esempio n. 6
0
        public override async ValueTask AttachAsync(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey, CancellationToken cancellationToken = default)
        {
            try
            {
                await SendAttachToBufferAsync(spb, service, cancellationToken).ConfigureAwait(false);

                await Database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                var response = await Database.ReadResponseAsync(cancellationToken).ConfigureAwait(false);

                if (response is ContAuthResponse)
                {
                    while (response is ContAuthResponse contAuthResponse)
                    {
                        Connection.AuthBlock.Start(contAuthResponse.ServerData, contAuthResponse.AcceptPluginName, contAuthResponse.IsAuthenticated, contAuthResponse.ServerKeys);

                        await Connection.AuthBlock.SendContAuthToBufferAsync(Database.Xdr, cancellationToken).ConfigureAwait(false);

                        await Database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                        response = await Connection.AuthBlock.ProcessContAuthResponseAsync(Database.Xdr, cancellationToken).ConfigureAwait(false);

                        response = await(Database as GdsDatabase).ProcessCryptCallbackResponseIfNeededAsync(response, cryptKey, cancellationToken).ConfigureAwait(false);
                    }
                    var genericResponse = (GenericResponse)response;
                    await base.ProcessAttachResponseAsync(genericResponse, cancellationToken).ConfigureAwait(false);

                    if (genericResponse.Data.Any())
                    {
                        await Database.AuthBlock.SendWireCryptToBufferAsync(Database.Xdr, cancellationToken).ConfigureAwait(false);

                        await Database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);

                        await Database.AuthBlock.ProcessWireCryptResponseAsync(Database.Xdr, Connection, cancellationToken).ConfigureAwait(false);
                    }
                }
                else
                {
                    response = await(Database as GdsDatabase).ProcessCryptCallbackResponseIfNeededAsync(response, cryptKey, cancellationToken).ConfigureAwait(false);
                    await ProcessAttachResponseAsync((GenericResponse)response, cancellationToken).ConfigureAwait(false);

                    Database.AuthBlock.Complete();
                }
            }
            catch (IscException)
            {
                await Database.SafelyDetachAsync(cancellationToken).ConfigureAwait(false);

                throw;
            }
            catch (IOException ex)
            {
                await Database.SafelyDetachAsync(cancellationToken).ConfigureAwait(false);

                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 7
0
    private protected void ProcessServiceOutput(ServiceParameterBufferBase spb)
    {
        string line;

        while ((line = GetNextLine(spb)) != null)
        {
            OnServiceOutput(line);
        }
    }
Esempio n. 8
0
    private protected async Task ProcessServiceOutputAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        string line;

        while ((line = await GetNextLineAsync(spb, cancellationToken).ConfigureAwait(false)) != null)
        {
            OnServiceOutput(line);
        }
    }
Esempio n. 9
0
        protected virtual async ValueTask SendAttachToBufferAsync(ServiceParameterBufferBase spb, string service, CancellationToken cancellationToken = default)
        {
            await _database.Xdr.WriteAsync(IscCodes.op_service_attach, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(0, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteAsync(service, cancellationToken).ConfigureAwait(false);

            await _database.Xdr.WriteBufferAsync(spb.ToArray(), cancellationToken).ConfigureAwait(false);
        }
Esempio n. 10
0
    private protected string GetNextLine(ServiceParameterBufferBase spb)
    {
        var info = Query(new byte[] { IscCodes.isc_info_svc_line }, spb);

        if (info.Count == 0)
        {
            return(null);
        }
        return(info[0] as string);
    }
Esempio n. 11
0
    private protected async Task <string> GetNextLineAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        var info = await QueryAsync(new byte[] { IscCodes.isc_info_svc_line }, spb, cancellationToken).ConfigureAwait(false);

        if (info.Count == 0)
        {
            return(null);
        }
        return(info[0] as string);
    }
Esempio n. 12
0
 public override void Attach(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey)
 {
     try
     {
         SendAttachToBuffer(spb, service);
         _database.Xdr.Flush();
         ProcessAttachResponse((GenericResponse)_database.ReadResponse());
     }
     catch (IOException ex)
     {
         _database.Detach();
         throw IscException.ForIOException(ex);
     }
 }
Esempio n. 13
0
        public override async ValueTask AttachAsync(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey, CancellationToken cancellationToken = default)
        {
            try
            {
                await SendAttachToBufferAsync(spb, service, cancellationToken).ConfigureAwait(false);

                await _database.Xdr.FlushAsync(cancellationToken).ConfigureAwait(false);
                await ProcessAttachResponseAsync((GenericResponse)await _database.ReadResponseAsync(cancellationToken).ConfigureAwait(false), cancellationToken).ConfigureAwait(false);
            }
            catch (IOException ex)
            {
                await _database.DetachAsync(cancellationToken).ConfigureAwait(false);

                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 14
0
    private protected async Task StartTaskAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        if (State == FbServiceState.Closed)
        {
            throw new InvalidOperationException("Service is Closed.");
        }

        try
        {
            await _svc.StartAsync(spb, cancellationToken).ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            throw FbException.Create(ex);
        }
    }
    public override void Start(ServiceParameterBufferBase spb)
    {
        ClearStatusVector();

        var svcHandle = Handle;
        var reserved  = 0;

        _fbClient.isc_service_start(
            _statusVector,
            ref svcHandle,
            ref reserved,
            spb.Length,
            spb.ToArray());

        ProcessStatusVector(_statusVector);
    }
Esempio n. 16
0
    private protected void StartTask(ServiceParameterBufferBase spb)
    {
        if (State == FbServiceState.Closed)
        {
            throw new InvalidOperationException("Service is Closed.");
        }

        try
        {
            _svc.Start(spb);
        }
        catch (Exception ex)
        {
            throw FbException.Create(ex);
        }
    }
Esempio n. 17
0
        public override void Attach(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey)
        {
            try
            {
                SendAttachToBuffer(spb, service);
                Database.Xdr.Flush();
                var response = Database.ReadResponse();
                if (response is ContAuthResponse)
                {
                    while (response is ContAuthResponse contAuthResponse)
                    {
                        Connection.AuthBlock.Start(contAuthResponse.ServerData, contAuthResponse.AcceptPluginName, contAuthResponse.IsAuthenticated, contAuthResponse.ServerKeys);

                        Connection.AuthBlock.SendContAuthToBuffer(Database.Xdr);
                        Database.Xdr.Flush();
                        response = Connection.AuthBlock.ProcessContAuthResponse(Database.Xdr);
                        response = (Database as GdsDatabase).ProcessCryptCallbackResponseIfNeeded(response, cryptKey);
                    }
                    var genericResponse = (GenericResponse)response;
                    base.ProcessAttachResponse(genericResponse);

                    if (genericResponse.Data.Any())
                    {
                        Database.AuthBlock.SendWireCryptToBuffer(Database.Xdr);
                        Database.Xdr.Flush();
                        Database.AuthBlock.ProcessWireCryptResponse(Database.Xdr, Connection);
                    }
                }
                else
                {
                    response = (Database as GdsDatabase).ProcessCryptCallbackResponseIfNeeded(response, cryptKey);
                    ProcessAttachResponse((GenericResponse)response);
                    Database.AuthBlock.Complete();
                }
            }
            catch (IscException)
            {
                Database.SafelyDetach();
                throw;
            }
            catch (IOException ex)
            {
                Database.SafelyDetach();
                throw IscException.ForIOException(ex);
            }
        }
    public override ValueTask StartAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        ClearStatusVector();

        var svcHandle = Handle;
        var reserved  = 0;

        _fbClient.isc_service_start(
            _statusVector,
            ref svcHandle,
            ref reserved,
            spb.Length,
            spb.ToArray());

        ProcessStatusVector(_statusVector);

        return(ValueTask2.CompletedTask);
    }
Esempio n. 19
0
    private protected async Task <List <object> > QueryAsync(byte[] items, ServiceParameterBufferBase spb, CancellationToken cancellationToken = default)
    {
        var result = new List <object>();

        await QueryAsync(items, spb, (truncated, item) =>
        {
            if (item is string stringItem)
            {
                if (!truncated)
                {
                    result.Add(stringItem);
                }
                else
                {
                    var lastValue            = result[result.Count - 1] as string;
                    result[result.Count - 1] = lastValue + stringItem;
                }
                return(Task.CompletedTask);
            }

            if (item is byte[] byteArrayItem)
            {
                if (!truncated)
                {
                    result.Add(byteArrayItem);
                }
                else
                {
                    var lastValue       = result[result.Count - 1] as byte[];
                    var lastValueLength = lastValue.Length;
                    Array.Resize(ref lastValue, lastValue.Length + byteArrayItem.Length);
                    Array.Copy(byteArrayItem, 0, lastValue, lastValueLength, byteArrayItem.Length);
                }
                return(Task.CompletedTask);
            }

            result.Add(item);

            return(Task.CompletedTask);
        }, cancellationToken).ConfigureAwait(false);

        return(result);
    }
    public override void Attach(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey)
    {
        FesDatabase.CheckCryptKeyForSupport(cryptKey);

        ClearStatusVector();

        var svcHandle = Handle;

        _fbClient.isc_service_attach(
            _statusVector,
            (short)service.Length,
            service,
            ref svcHandle,
            spb.Length,
            spb.ToArray());

        ProcessStatusVector(_statusVector);

        Handle = svcHandle;
    }
    public override void Query(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer)
    {
        ClearStatusVector();

        var svcHandle = Handle;
        var reserved  = 0;

        _fbClient.isc_service_query(
            _statusVector,
            ref svcHandle,
            ref reserved,
            spb.Length,
            spb.ToArray(),
            (short)requestLength,
            requestBuffer,
            (short)buffer.Length,
            buffer);

        ProcessStatusVector(_statusVector);
    }
Esempio n. 22
0
    private protected List <object> Query(byte[] items, ServiceParameterBufferBase spb)
    {
        var result = new List <object>();

        Query(items, spb, (truncated, item) =>
        {
            if (item is string stringItem)
            {
                if (!truncated)
                {
                    result.Add(stringItem);
                }
                else
                {
                    var lastValue            = result[result.Count - 1] as string;
                    result[result.Count - 1] = lastValue + stringItem;
                }
                return;
            }

            if (item is byte[] byteArrayItem)
            {
                if (!truncated)
                {
                    result.Add(byteArrayItem);
                }
                else
                {
                    var lastValue       = result[result.Count - 1] as byte[];
                    var lastValueLength = lastValue.Length;
                    Array.Resize(ref lastValue, lastValue.Length + byteArrayItem.Length);
                    Array.Copy(byteArrayItem, 0, lastValue, lastValueLength, byteArrayItem.Length);
                }
                return;
            }

            result.Add(item);
        });
        return(result);
    }
    public override ValueTask QueryAsync(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer, CancellationToken cancellationToken = default)
    {
        ClearStatusVector();

        var svcHandle = Handle;
        var reserved  = 0;

        _fbClient.isc_service_query(
            _statusVector,
            ref svcHandle,
            ref reserved,
            spb.Length,
            spb.ToArray(),
            (short)requestLength,
            requestBuffer,
            (short)buffer.Length,
            buffer);

        ProcessStatusVector(_statusVector);

        return(ValueTask2.CompletedTask);
    }
    public override ValueTask AttachAsync(ServiceParameterBufferBase spb, string dataSource, int port, string service, byte[] cryptKey, CancellationToken cancellationToken = default)
    {
        FesDatabase.CheckCryptKeyForSupport(cryptKey);

        ClearStatusVector();

        var svcHandle = Handle;

        _fbClient.isc_service_attach(
            _statusVector,
            (short)service.Length,
            service,
            ref svcHandle,
            spb.Length,
            spb.ToArray());

        ProcessStatusVector(_statusVector);

        Handle = svcHandle;

        return(ValueTask2.CompletedTask);
    }
Esempio n. 25
0
    private byte[] QueryService(byte[] items, ServiceParameterBufferBase spb)
    {
        var shouldClose = false;

        if (State == FbServiceState.Closed)
        {
            Open();
            shouldClose = true;
        }
        try
        {
            var buffer = new byte[QueryBufferSize];
            _svc.Query(spb, items.Length, items, buffer.Length, buffer);
            return(buffer);
        }
        finally
        {
            if (shouldClose)
            {
                Close();
            }
        }
    }
Esempio n. 26
0
        public override void Start(ServiceParameterBufferBase spb)
        {
            try
            {
                _database.Xdr.Write(IscCodes.op_service_start);
                _database.Xdr.Write(Handle);
                _database.Xdr.Write(0);
                _database.Xdr.WriteBuffer(spb.ToArray(), spb.Length);
                _database.Xdr.Flush();

                try
                {
                    _database.ReadResponse();
                }
                catch (IscException)
                {
                    throw;
                }
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Esempio n. 27
0
 public abstract void Query(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer);
Esempio n. 28
0
 public abstract ValueTask StartAsync(ServiceParameterBufferBase spb, CancellationToken cancellationToken = default);
Esempio n. 29
0
    private protected async Task QueryAsync(byte[] items, ServiceParameterBufferBase spb, Func <bool, object, Task> queryResponseAction, CancellationToken cancellationToken = default)
    {
        var pos       = 0;
        var truncated = false;
        var type      = default(int);

        var buffer = await QueryServiceAsync(items, spb, cancellationToken).ConfigureAwait(false);

        while ((type = buffer[pos++]) != IscCodes.isc_info_end)
        {
            if (type == IscCodes.isc_info_truncated)
            {
                buffer = await QueryServiceAsync(items, spb, cancellationToken).ConfigureAwait(false);

                pos       = 0;
                truncated = true;
                continue;
            }

            switch (type)
            {
            case IscCodes.isc_info_svc_version:
            case IscCodes.isc_info_svc_get_license_mask:
            case IscCodes.isc_info_svc_capabilities:
            case IscCodes.isc_info_svc_get_licensed_users:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, (int)IscHelper.VaxInteger(buffer, pos, 4)).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_server_version:
            case IscCodes.isc_info_svc_implementation:
            case IscCodes.isc_info_svc_get_env:
            case IscCodes.isc_info_svc_get_env_lock:
            case IscCodes.isc_info_svc_get_env_msg:
            case IscCodes.isc_info_svc_user_dbpath:
            case IscCodes.isc_info_svc_line:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, Encoding2.Default.GetString(buffer, pos, length)).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_to_eof:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                var block = new byte[length];
                Array.Copy(buffer, pos, block, 0, length);
                await queryResponseAction(truncated, block).ConfigureAwait(false);

                pos      += length;
                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_svr_db_info:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseDatabasesInfo(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_get_users:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseUserData(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_get_config:
            {
                var length = GetLength(buffer, 2, ref pos);
                if (length == 0)
                {
                    continue;
                }
                await queryResponseAction(truncated, ParseServerConfig(buffer, ref pos)).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_svc_stdin:
            {
                var length = GetLength(buffer, 4, ref pos);
                await queryResponseAction(truncated, length).ConfigureAwait(false);

                truncated = false;
                break;
            }

            case IscCodes.isc_info_data_not_ready:
            {
                await queryResponseAction(truncated, typeof(void)).ConfigureAwait(false);

                truncated = false;
                break;
            }
            }
        }
    }
Esempio n. 30
0
 public abstract ValueTask QueryAsync(ServiceParameterBufferBase spb, int requestLength, byte[] requestBuffer, int bufferLength, byte[] buffer, CancellationToken cancellationToken = default);