public void Register(byte dataMarker, IDataHandler handler) { lock (_handlers) { VerifyDisposed(); if (IsLocked) { throw new TempException(string.Format("Gateway is already locked. Cannot register handler for marker {0}", dataMarker)); } if (_handlers[dataMarker] != null) { throw new TempException(string.Format("Data handler with marker {0} is already registered", dataMarker)); } if (handler == null) { return; } IManagedDataHandler managedDataHandler = GetManagedDataHandler(handler); if (managedDataHandler == null) { return; } _handlers[dataMarker] = managedDataHandler; } }
private INativeDataHandler GetNativeDataHandler(IDataHandler handler) { INativeDataHandler nativeDataHandler = handler as INativeDataHandler; if (nativeDataHandler != null) { return(nativeDataHandler); } IManagedDataHandler managedDataHandler = handler as IManagedDataHandler; if (managedDataHandler != null) { return(new NativeDataHandlerRouter(managedDataHandler)); } return(null); }
unsafe private void Read(Stream stream) { byte[] dataReadBuffer = new byte[DataBufferMaxSize]; byte[] headerReadBuffer = new byte[sizeof(byte) + sizeof(int)]; while (!_disposed) { try { int read = stream.Read(headerReadBuffer, 0, headerReadBuffer.Length); byte dataMarker; int dataSize; if (read == 0) { continue; } fixed(byte *headerReadBufferPointer = headerReadBuffer) { dataMarker = *(headerReadBufferPointer); dataSize = *(int *)(headerReadBufferPointer + 1); } if (dataSize > dataReadBuffer.Length) { LoggingProvider.Current.Log(TraceEventType.Error, string.Format("Attempt to read data bigger than buffer. Buffer size: {0}. Data size: {1}", dataReadBuffer.Length, dataSize)); continue; } stream.Read(dataReadBuffer, 0, dataSize); NativeArray array = NativeArray.Copy(dataReadBuffer, dataSize); IManagedDataHandler handler = _handlers[dataMarker]; if (handler == null || handler.HandlePackage(array)) { array.Dispose(); } } catch (ObjectDisposedException objectDisposedException) { LoggingProvider.Current.Log(TraceEventType.Information, objectDisposedException); return; } catch (Exception exception) { LoggingProvider.Current.Log(TraceEventType.Warning, exception); break; } } }
public NativeDataHandlerRouter(IManagedDataHandler managedDataHandler) { _managedDataHandler = managedDataHandler; _handlePackageCallback = new ManagedCallbackHolder <NativeMethods.DataHandlerRouter.HandlePackage>(HandlePackage); _nativeDataHandler = NativeMethods.DataHandlerRouter.Create(_handlePackageCallback.Callback); }