Exemple #1
0
        public void QueueEvents(RemoteEvent remoteEvent)
        {
            try
            {
                if (_eventManager == null)
                {
                    ConnectionRequest(out var auxHandle, out var ipAddress, out var portNumber);
                    _eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber);
                    var dummy = _eventManager.WaitForEventsAsync(remoteEvent);
                }

                remoteEvent.LocalId++;

                var epb     = remoteEvent.BuildEpb();
                var epbData = epb.ToArray();

                Xdr.Write(IscCodes.op_que_events);
                Xdr.Write(_handle);
                Xdr.WriteBuffer(epbData);
                Xdr.Write(AddressOfAstRoutine);
                Xdr.Write(ArgumentToAstRoutine);
                Xdr.Write(remoteEvent.LocalId);

                Xdr.Flush();

                var response = (GenericResponse)ReadResponse();

                remoteEvent.RemoteId = response.ObjectHandle;
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
Exemple #2
0
        public void QueueEvents(RemoteEvent remoteEvent)
        {
            lock (this)
            {
                lock (this.events.SyncRoot)
                {
                    if (!this.events.ContainsKey(remoteEvent.LocalId))
                    {
                        this.events.Add(remoteEvent.LocalId, remoteEvent);
                    }
                }

#if     (!NETCF)
                if (this.thread == null ||
                    (this.thread.ThreadState != ThreadState.Running && this.thread.ThreadState != ThreadState.Background))
#else
                if (this.thread == null)
#endif
                {
                    this.thread = new Thread(new ThreadStart(ThreadHandler));
                    this.thread.Start();
                    this.thread.IsBackground = true;
                }
            }
        }
        public void QueueEvents(RemoteEvent remoteEvent)
        {
            lock (this)
            {
                if (!this.events.ContainsKey(remoteEvent.LocalId))
                {
                    lock (this.events.SyncRoot)
                    {
                        this.events.Add(remoteEvent.LocalId, remoteEvent);
                    }
                }

#if     (!NET_CF)
                if (this.eventsThread == null ||
                    (this.eventsThread.ThreadState != ThreadState.Running &&
                     this.eventsThread.ThreadState != ThreadState.Background))
#else
                if (this.eventsThread == null)
#endif
                {
#if (NET_CF)
                    this.eventsThread = new Thread(new ThreadStart(() => ThreadHandler(this.syncControl)));
#else
                    this.eventsThread = new Thread(new ThreadStart(() => ThreadHandler(this.syncContext)));
#endif
                    this.eventsThread.IsBackground = true;
                    this.eventsThread.Name         = "FirebirdClient - Events Thread";
                    this.eventsThread.Start();
                }
            }
        }
 public void CancelEvents(RemoteEvent remoteEvent)
 {
     lock (this.events.SyncRoot)
     {
         this.events.Remove(remoteEvent.LocalId);
     }
 }
Exemple #5
0
        public override void QueueEvents(RemoteEvent remoteEvent)
        {
            try
            {
                if (_eventManager == null)
                {
                    var(auxHandle, ipAddress, portNumber, timeout) = ConnectionRequest();
                    _eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber, timeout);
                    _eventManager.Open();
                    var dummy = _eventManager.StartWaitingForEvents(remoteEvent);
                }

                remoteEvent.LocalId++;

                var epb     = remoteEvent.BuildEpb();
                var epbData = epb.ToArray();

                Xdr.Write(IscCodes.op_que_events);
                Xdr.Write(_handle);
                Xdr.WriteBuffer(epbData);
                Xdr.Write(AddressOfAstRoutine);
                Xdr.Write(ArgumentToAstRoutine);
                Xdr.Write(remoteEvent.LocalId);

                Xdr.Flush();

                var response = (GenericResponse)ReadResponse();

                remoteEvent.RemoteId = response.ObjectHandle;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
 public FbRemoteEvent(string connectionString)
 {
     _connection = new FbConnectionInternal(new FbConnectionString(connectionString));
     _connection.Connect();
     _revent = new RemoteEvent(_connection.Database);
     _revent.EventCountsCallback = OnRemoteEventCounts;
     _revent.EventErrorCallback  = OnRemoteEventError;
     _synchronizationContext     = SynchronizationContext.Current ?? new SynchronizationContext();
 }
        /// <summary>
        /// Adds a remote event.
        /// </summary>
        /// <param name="eventName">The name of the event to use.</param>
        /// <param name="evt">The RemoteEvent delegate method to add.</param>
        public void AddRemoteEvent(string eventName, RemoteEvent evt)
        {
            if (Events.ContainsKey(eventName))
            {
                throw new InvalidOperationException(String.Format("Event \"{0}\" already exists!", eventName));
            }

            Events.TryAdd(eventName, evt);
        }
Exemple #8
0
        private void OnWindowClosed(RemoteEvent obj)
        {
            var vm = ViewModelMapper.GetViewModel(obj.Payload);

            _remoteWindowOperationsBus.Publish(new RemoteWindowOperationEvent()
            {
                RemoteEvent = obj, ViewModel = vm
            }, this);
        }
        public void AddEventHandler(uint topId, uint bottomId, Func <uint, uint, uint> handler)
        {
            var remoteEvent = new RemoteEvent()
            {
                TopId        = topId,
                BottomId     = bottomId,
                EventHandler = handler,
            };

            RemoteEvents.Add(remoteEvent);
        }
Exemple #10
0
        public void Open()
        {
            if (_revent != null)
            {
                throw new InvalidOperationException($"{nameof(FbRemoteEvent)} already open.");
            }

            _connection.Connect();
            _revent = new RemoteEvent(_connection.Database);
            _revent.EventCountsCallback = OnRemoteEventCounts;
            _revent.EventErrorCallback  = OnRemoteEventError;
            _synchronizationContext     = SynchronizationContext.Current ?? new SynchronizationContext();
        }
        private async Task OpenImpl(AsyncWrappingCommonArgs async)
        {
            if (_revent != null)
            {
                throw new InvalidOperationException($"{nameof(FbRemoteEvent)} already open.");
            }

            await _connection.Connect(async).ConfigureAwait(false);

            _revent = new RemoteEvent(_connection.Database);
            _revent.EventCountsCallback = OnRemoteEventCounts;
            _revent.EventErrorCallback  = OnRemoteEventError;
            _synchronizationContext     = SynchronizationContext.Current ?? new SynchronizationContext();
        }
        public byte[] Serialize(RemoteEvent obj)
        {
            var payload = obj.Payload;

            var seri = JsonConvert.SerializeObject(payload, _serializerSettings);

            var payloadBa = Encoding.Default.GetBytes(seri);
            var rv        = new byte[payloadBa.Length + 1];

            rv[0] = (byte)obj.Type;
            Array.Copy(payloadBa, 0, rv, 1, payloadBa.Length);

            return(rv);
        }
Exemple #13
0
        public async Task OpenAsync(CancellationToken cancellationToken = default)
        {
            if (_revent != null)
            {
                throw new InvalidOperationException($"{nameof(FbRemoteEvent)} already open.");
            }

            await _connection.ConnectAsync(cancellationToken).ConfigureAwait(false);

            _revent = new RemoteEvent(_connection.Database);
            _revent.EventCountsCallback = OnRemoteEventCounts;
            _revent.EventErrorCallback  = OnRemoteEventError;
            _synchronizationContext     = SynchronizationContext.Current ?? new SynchronizationContext();
        }
Exemple #14
0
        /// <include file='Doc/en_EN/FbRemoteEvent.xml'	path='doc/class[@name="FbRemoteEvent"]/constructor[@name="ctor(FbConnection, System.Array)"]/*'/>
        public FbRemoteEvent(FbConnection connection, string[] events)
        {
            if (connection == null || connection.State != System.Data.ConnectionState.Open)
            {
                throw new InvalidOperationException("Connection must valid and open");
            }
            this.connection = connection;
            this.revent     = connection.InnerConnection.Database.CreateEvent();
            this.revent.EventCountsCallback = new EventCountsCallback(this.OnRemoteEventCounts);

            if (events != null)
            {
                this.AddEvents(events);
            }
        }
Exemple #15
0
        public RpcClient(ISerializer serializer, TimeSpan rpcTimeout, IThreadDispatcher threadDispatcher)
        {
            using (EneterTrace.Entering())
            {
                if (serializer == null)
                {
                    string anError = "Input parameter serializer is null.";
                    EneterTrace.Error(anError);
                    throw new ArgumentNullException(anError);
                }

                mySerializer = serializer;
                myRpcTimeout = rpcTimeout;

#if !NETSTANDARD
                ServiceInterfaceChecker.CheckForClient <TServiceInterface>();

                // Dynamically implement and instantiate the given interface as the proxy.
                Proxy = ProxyProvider.CreateInstance <TServiceInterface>(CallMethod, SubscribeEvent, UnsubscribeEvent);
#endif

                // Store remote methods.
                foreach (MethodInfo aMethodInfo in typeof(TServiceInterface).GetMethods())
                {
                    Type         aReturnType   = aMethodInfo.ReturnType;
                    Type[]       anArgTypes    = aMethodInfo.GetParameters().Select(x => x.ParameterType).ToArray();
                    RemoteMethod aRemoteMethod = new RemoteMethod(aReturnType, anArgTypes);
                    myRemoteMethods[aMethodInfo.Name] = aRemoteMethod;
                }

                // Store remote events.
                foreach (EventInfo anEventInfo in typeof(TServiceInterface).GetEvents())
                {
                    if (anEventInfo.EventHandlerType.IsGenericType)
                    {
                        RemoteEvent aRemoteEvent = new RemoteEvent(anEventInfo.EventHandlerType.GetGenericArguments()[0]);
                        myRemoteEvents[anEventInfo.Name] = aRemoteEvent;
                    }
                    else
                    {
                        RemoteEvent aRemoteEvent = new RemoteEvent(typeof(EventArgs));
                        myRemoteEvents[anEventInfo.Name] = aRemoteEvent;
                    }
                }

                myThreadDispatcher = threadDispatcher;
            }
        }
Exemple #16
0
        public void QueueEvents(RemoteEvent remoteEvent)
        {
            lock (this)
            {
                _events[remoteEvent.LocalId] = remoteEvent;

                // Jiri Cincura: I'm pretty sure this is a race condition.
                if (_eventsThread == null || _eventsThread.ThreadState.HasFlag(ThreadState.Stopped | ThreadState.Unstarted))
                {
                    _eventsThread = new Thread(ThreadHandler);
                    _eventsThread.IsBackground = true;
                    _eventsThread.Name         = "FirebirdClient - Events Thread";
                    _eventsThread.Start();
                }
            }
        }
Exemple #17
0
        public void CancelEvents(RemoteEvent events)
        {
            try
            {
                Xdr.Write(IscCodes.op_cancel_events);
                Xdr.Write(_handle);
                Xdr.Write(events.LocalId);

                Xdr.Flush();

                ReadResponse();
            }
            catch (IOException ex)
            {
                throw IscException.ForErrorCode(IscCodes.isc_network_error, ex);
            }
        }
Exemple #18
0
        public FbRemoteEvent(FbConnection connection, params string[] events)
        {
            if (connection == null || connection.State != System.Data.ConnectionState.Open)
            {
                throw new InvalidOperationException("Connection must be valid and open");
            }

            _connection = connection;
            _revent     = connection.InnerConnection.Database.CreateEvent();
            _revent.EventCountsCallback = new RemoteEventCountsCallback(OnRemoteEventCounts);
            _synchronizationContext     = SynchronizationContext.Current ?? new SynchronizationContext();

            if (events != null)
            {
                AddEvents(events);
            }
        }
Exemple #19
0
        public override void CancelEvents(RemoteEvent events)
        {
            try
            {
                Xdr.Write(IscCodes.op_cancel_events);
                Xdr.Write(_handle);
                Xdr.Write(events.LocalId);

                Xdr.Flush();

                ReadResponse();
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
        public void QueueEvents(RemoteEvent events)
        {
            if (this.eventManager == null)
            {
                string ipAddress  = string.Empty;
                int    portNumber = 0;
                int    auxHandle  = 0;

                this.ConnectionRequest(out auxHandle, out ipAddress, out portNumber);

                this.eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber);
            }

            lock (this.SyncObject)
            {
                try
                {
                    events.LocalId = ++this.eventsId;

                    EventParameterBuffer epb = events.ToEpb();

                    this.Write(IscCodes.op_que_events); // Op codes
                    this.Write(this.handle);            // Database	object id
                    this.WriteBuffer(epb.ToArray());    // Event description block
                    this.Write(0);                      // Address of ast routine
                    this.Write(0);                      // Argument	to ast routine
                    this.Write(events.LocalId);         // Client side id of remote	event

                    this.Flush();

                    GenericResponse response = (GenericResponse)this.ReadResponse();

                    // Update event	Remote event ID
                    events.RemoteId = response.ObjectHandle;

                    // Enqueue events in the event manager
                    this.eventManager.QueueEvents(events);
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
Exemple #21
0
        public void QueueEvents(RemoteEvent events)
        {
            if (_eventManager == null)
            {
                string ipAddress  = string.Empty;
                int    portNumber = 0;
                int    auxHandle  = 0;

                ConnectionRequest(out auxHandle, out ipAddress, out portNumber);

                _eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber);
            }

            lock (SyncObject)
            {
                try
                {
                    events.LocalId = Interlocked.Increment(ref _eventsId);

                    // Enqueue events in the event manager
                    _eventManager.QueueEvents(events);

                    EventParameterBuffer epb = events.ToEpb();

                    XdrStream.Write(IscCodes.op_que_events);
                    XdrStream.Write(_handle);                                     // Database object id
                    XdrStream.WriteBuffer(epb.ToArray());                         // Event description block
                    XdrStream.Write(0);                                           // Address of ast routine
                    XdrStream.Write(0);                                           // Argument to ast routine
                    XdrStream.Write(events.LocalId);                              // Client side id of remote event

                    XdrStream.Flush();

                    GenericResponse response = (GenericResponse)ReadResponse();

                    // Update event	Remote event ID
                    events.RemoteId = response.ObjectHandle;
                }
                catch (IOException ex)
                {
                    throw IscException.ForErrorCode(IscCodes.isc_net_read_err, ex);
                }
            }
        }
Exemple #22
0
        public override async ValueTask CancelEventsAsync(RemoteEvent events, CancellationToken cancellationToken = default)
        {
            try
            {
                await Xdr.WriteAsync(IscCodes.op_cancel_events, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(_handle, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(events.LocalId, cancellationToken).ConfigureAwait(false);

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

                await ReadResponseAsync(cancellationToken).ConfigureAwait(false);
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Exemple #23
0
        public override async Task CancelEvents(RemoteEvent events, AsyncWrappingCommonArgs async)
        {
            try
            {
                await Xdr.Write(IscCodes.op_cancel_events, async).ConfigureAwait(false);

                await Xdr.Write(_handle, async).ConfigureAwait(false);

                await Xdr.Write(events.LocalId, async).ConfigureAwait(false);

                await Xdr.Flush(async).ConfigureAwait(false);

                await ReadResponse(async).ConfigureAwait(false);
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Exemple #24
0
        public override async Task QueueEvents(RemoteEvent remoteEvent, AsyncWrappingCommonArgs async)
        {
            try
            {
                if (_eventManager == null)
                {
                    var(auxHandle, ipAddress, portNumber) = await ConnectionRequest(async).ConfigureAwait(false);

                    _eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber);
                    await _eventManager.Open(async).ConfigureAwait(false);

                    var dummy = _eventManager.WaitForEvents(remoteEvent, new AsyncWrappingCommonArgs(true));
                }

                remoteEvent.LocalId++;

                var epb     = remoteEvent.BuildEpb();
                var epbData = epb.ToArray();

                await Xdr.Write(IscCodes.op_que_events, async).ConfigureAwait(false);

                await Xdr.Write(_handle, async).ConfigureAwait(false);

                await Xdr.WriteBuffer(epbData, async).ConfigureAwait(false);

                await Xdr.Write(AddressOfAstRoutine, async).ConfigureAwait(false);

                await Xdr.Write(ArgumentToAstRoutine, async).ConfigureAwait(false);

                await Xdr.Write(remoteEvent.LocalId, async).ConfigureAwait(false);

                await Xdr.Flush(async).ConfigureAwait(false);

                var response = (GenericResponse) await ReadResponse(async).ConfigureAwait(false);

                remoteEvent.RemoteId = response.ObjectHandle;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Exemple #25
0
        public override async ValueTask QueueEventsAsync(RemoteEvent remoteEvent, CancellationToken cancellationToken = default)
        {
            try
            {
                if (_eventManager == null)
                {
                    var(auxHandle, ipAddress, portNumber, timeout) = await ConnectionRequestAsync(cancellationToken).ConfigureAwait(false);

                    _eventManager = new GdsEventManager(auxHandle, ipAddress, portNumber, timeout);
                    await _eventManager.OpenAsync(cancellationToken).ConfigureAwait(false);

                    var dummy = _eventManager.StartWaitingForEvents(remoteEvent);
                }

                remoteEvent.LocalId++;

                var epb     = remoteEvent.BuildEpb();
                var epbData = epb.ToArray();

                await Xdr.WriteAsync(IscCodes.op_que_events, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(_handle, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteBufferAsync(epbData, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(AddressOfAstRoutine, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(ArgumentToAstRoutine, cancellationToken).ConfigureAwait(false);

                await Xdr.WriteAsync(remoteEvent.LocalId, cancellationToken).ConfigureAwait(false);

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

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

                remoteEvent.RemoteId = response.ObjectHandle;
            }
            catch (IOException ex)
            {
                throw IscException.ForIOException(ex);
            }
        }
Exemple #26
0
        // 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;
                }
            }
        }
Exemple #27
0
        public async Task WaitForEvents(RemoteEvent remoteEvent, AsyncWrappingCommonArgs async)
        {
            while (true)
            {
                try
                {
                    var operation = await _database.ReadOperation(async).ConfigureAwait(false);

                    switch (operation)
                    {
                    case IscCodes.op_event:
                        var dbHandle = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                        var buffer = await _database.Xdr.ReadBuffer(async).ConfigureAwait(false);

                        var ast = new byte[8];
                        await _database.Xdr.ReadBytes(ast, 8, async).ConfigureAwait(false);

                        var eventId = await _database.Xdr.ReadInt32(async).ConfigureAwait(false);

                        await remoteEvent.EventCounts(buffer, async).ConfigureAwait(false);

                        break;

                    default:
                        Debug.Assert(false);
                        break;
                    }
                }
                catch (Exception) when(Volatile.Read(ref _closing))
                {
                    return;
                }
                catch (Exception ex)
                {
                    remoteEvent.EventError(ex);
                    break;
                }
            }
        }
        public void CancelEvents(RemoteEvent events)
        {
            lock (SyncObject)
            {
                try
                {
                    Write(IscCodes.op_cancel_events);
                    Write(_handle);                                 // Database object id
                    Write(events.LocalId);                          // Event ID

                    Flush();

                    ReadResponse();

                    _eventManager.CancelEvents(events);
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }
Exemple #29
0
        public void CancelEvents(RemoteEvent events)
        {
            lock (SyncObject)
            {
                try
                {
                    XdrStream.Write(IscCodes.op_cancel_events);
                    XdrStream.Write(_handle);                                 // Database object id
                    XdrStream.Write(events.LocalId);                          // Event ID

                    XdrStream.Flush();

                    ReadResponse();

                    _eventManager.CancelEvents(events);
                }
                catch (IOException ex)
                {
                    throw IscException.ForErrorCode(IscCodes.isc_net_read_err, ex);
                }
            }
        }
Exemple #30
0
        public void CancelEvents(RemoteEvent events)
        {
            lock (this)
            {
                try
                {
                    this.Send.Write(IscCodes.op_cancel_events);                         // Op code
                    this.Send.Write(this.handle);                                       // Database	object id
                    this.Send.Write(events.LocalId);                                    // Event ID

                    this.Send.Flush();

                    this.ReadGenericResponse();

                    this.eventManager.CancelEvents(events);
                }
                catch (IOException)
                {
                    throw new IscException(IscCodes.isc_net_read_err);
                }
            }
        }