예제 #1
0
        /// <summary>
        /// Creates a new <see cref="AutomaticProgressReporter" /> class.
        /// </summary>
        /// <remarks>This class does not take ownership of and dispose of <paramref name="connection" />.</remarks>
        /// <param name="connection">A connection.</param>
        /// <param name="request">A request.</param>
        /// <param name="interval">A progress interval.</param>
        /// <param name="cancellationToken">A cancellation token.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="connection" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="request" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="interval" />
        /// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
        /// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
        /// <exception cref="OperationCanceledException">Thrown if <paramref name="cancellationToken" />
        /// is cancelled.</exception>
        public static AutomaticProgressReporter Create(
            IConnection connection,
            Message request,
            TimeSpan interval,
            CancellationToken cancellationToken)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }

            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (!TimeoutUtilities.IsValid(interval))
            {
                throw new ArgumentOutOfRangeException(
                    nameof(interval),
                    interval,
                    Strings.Plugin_TimeoutOutOfRange);
            }

            cancellationToken.ThrowIfCancellationRequested();

            return new AutomaticProgressReporter(
                connection,
                request,
                interval,
                cancellationToken);
        }
예제 #2
0
        private void Initialize(IEnvironmentVariableReader reader,
                                Lazy <IPluginDiscoverer> pluginDiscoverer,
                                Func <TimeSpan, IPluginFactory> pluginFactoryCreator,
                                Lazy <string> pluginsCacheDirectoryPath)
        {
            EnvironmentVariableReader = reader ?? throw new ArgumentNullException(nameof(reader));
            _discoverer = pluginDiscoverer ?? throw new ArgumentNullException(nameof(pluginDiscoverer));
            _pluginsCacheDirectoryPath = pluginsCacheDirectoryPath ?? throw new ArgumentNullException(nameof(pluginsCacheDirectoryPath));

            if (pluginFactoryCreator == null)
            {
                throw new ArgumentNullException(nameof(pluginFactoryCreator));
            }
#if IS_DESKTOP
            _rawPluginPaths = reader.GetEnvironmentVariable(EnvironmentVariableConstants.DesktopPluginPaths);
#else
            _rawPluginPaths = reader.GetEnvironmentVariable(EnvironmentVariableConstants.CorePluginPaths);
#endif
            if (string.IsNullOrEmpty(_rawPluginPaths))
            {
                _rawPluginPaths = reader.GetEnvironmentVariable(EnvironmentVariableConstants.PluginPaths);
            }

            _connectionOptions = ConnectionOptions.CreateDefault(reader);

            var idleTimeoutInSeconds = EnvironmentVariableReader.GetEnvironmentVariable(EnvironmentVariableConstants.IdleTimeout);
            var idleTimeout          = TimeoutUtilities.GetTimeout(idleTimeoutInSeconds, PluginConstants.IdleTimeout);

            _pluginFactory         = pluginFactoryCreator(idleTimeout);
            _pluginOperationClaims = new ConcurrentDictionary <PluginRequestKey, Lazy <Task <IReadOnlyList <OperationClaim> > > >();
            _pluginUtilities       = new ConcurrentDictionary <string, Lazy <IPluginMulticlientUtilities> >(
                StringComparer.OrdinalIgnoreCase);
        }
예제 #3
0
        /// <summary>
        /// Sets a new request timeout.
        /// </summary>
        /// <param name="requestTimeout">The new request timeout.</param>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="requestTimeout" />
        /// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
        /// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
        public void SetRequestTimeout(TimeSpan requestTimeout)
        {
            if (!TimeoutUtilities.IsValid(requestTimeout))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(requestTimeout),
                          requestTimeout,
                          Strings.Plugin_TimeoutOutOfRange);
            }

            RequestTimeout = requestTimeout;
        }
예제 #4
0
        /// <summary>
        /// Instantiates a new <see cref="ConnectionOptions" /> class.
        /// </summary>
        /// <param name="protocolVersion">The plugin protocol version.</param>
        /// <param name="minimumProtocolVersion">The minimum plugin protocol version.</param>
        /// <param name="handshakeTimeout">The plugin handshake timeout.</param>
        /// <param name="requestTimeout">The plugin request timeout.</param>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="protocolVersion" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="minimumProtocolVersion" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="protocolVersion" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="protocolVersion" />
        /// is less than <paramref name="minimumProtocolVersion" />.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="handshakeTimeout" />
        /// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
        /// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
        /// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="requestTimeout" />
        /// is either less than <see cref="ProtocolConstants.MinTimeout" /> or greater than
        /// <see cref="ProtocolConstants.MaxTimeout" />.</exception>
        public ConnectionOptions(
            SemanticVersion protocolVersion,
            SemanticVersion minimumProtocolVersion,
            TimeSpan handshakeTimeout,
            TimeSpan requestTimeout)
        {
            if (protocolVersion == null)
            {
                throw new ArgumentNullException(nameof(protocolVersion));
            }

            if (minimumProtocolVersion == null)
            {
                throw new ArgumentNullException(nameof(minimumProtocolVersion));
            }

            if (minimumProtocolVersion > protocolVersion)
            {
                throw new ArgumentOutOfRangeException(
                          nameof(protocolVersion),
                          protocolVersion,
                          string.Format(
                              CultureInfo.CurrentCulture,
                              Strings.Plugin_ProtocolVersionOutOfRange,
                              nameof(protocolVersion),
                              nameof(minimumProtocolVersion)));
            }

            if (!TimeoutUtilities.IsValid(handshakeTimeout))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(handshakeTimeout),
                          handshakeTimeout,
                          Strings.Plugin_TimeoutOutOfRange);
            }

            if (!TimeoutUtilities.IsValid(requestTimeout))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(requestTimeout),
                          requestTimeout,
                          Strings.Plugin_TimeoutOutOfRange);
            }

            ProtocolVersion        = protocolVersion;
            MinimumProtocolVersion = minimumProtocolVersion;
            HandshakeTimeout       = handshakeTimeout;
            RequestTimeout         = requestTimeout;
        }
예제 #5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SymmetricHandshake" /> class.
        /// </summary>
        /// <param name="connection">A connection.</param>
        /// <param name="handshakeTimeout">The handshake timeout.</param>
        /// <param name="protocolVersion">The handshaker's protocol version.</param>
        /// <param name="minimumProtocolVersion">The handshaker's minimum protocol version.</param>
        public SymmetricHandshake(
            IConnection connection,
            TimeSpan handshakeTimeout,
            SemanticVersion protocolVersion,
            SemanticVersion minimumProtocolVersion)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }

            if (!TimeoutUtilities.IsValid(handshakeTimeout))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(handshakeTimeout),
                          handshakeTimeout,
                          Strings.Plugin_TimeoutOutOfRange);
            }

            if (protocolVersion == null)
            {
                throw new ArgumentNullException(nameof(protocolVersion));
            }

            if (minimumProtocolVersion == null)
            {
                throw new ArgumentNullException(nameof(minimumProtocolVersion));
            }

            _connection                       = connection;
            _handshakeTimeout                 = handshakeTimeout;
            _protocolVersion                  = protocolVersion;
            _minimumProtocolVersion           = minimumProtocolVersion;
            _handshakeFailedResponse          = new HandshakeResponse(MessageResponseCode.Error, protocolVersion: null);
            _responseSentTaskCompletionSource = new TaskCompletionSource <int>();
            _timeoutCancellationTokenSource   = new CancellationTokenSource(handshakeTimeout);

            _timeoutCancellationTokenSource.Token.Register(() =>
            {
                _responseSentTaskCompletionSource.TrySetCanceled();
            });

            CancellationToken = _timeoutCancellationTokenSource.Token;

            if (!_connection.MessageDispatcher.RequestHandlers.TryAdd(MessageMethod.Handshake, this))
            {
                throw new ArgumentException(Strings.Plugin_HandshakeRequestHandlerAlreadyExists, nameof(connection));
            }
        }
예제 #6
0
        /// <summary>
        /// Instantiates a <see cref="ConnectionOptions" /> class with default values.
        /// </summary>
        /// <param name="reader">An environment variable reader.</param>
        /// <returns>A <see cref="ConnectionOptions" />.</returns>
        public static ConnectionOptions CreateDefault(IEnvironmentVariableReader reader = null)
        {
            reader = reader ?? new EnvironmentVariableWrapper();

            var handshakeTimeoutInSeconds = reader.GetEnvironmentVariable(EnvironmentVariableConstants.HandshakeTimeout);
            var requestTimeoutInSeconds   = reader.GetEnvironmentVariable(EnvironmentVariableConstants.RequestTimeout);

            var handshakeTimeout = TimeoutUtilities.GetTimeout(handshakeTimeoutInSeconds, ProtocolConstants.HandshakeTimeout);
            var requestTimeout   = TimeoutUtilities.GetTimeout(requestTimeoutInSeconds, ProtocolConstants.RequestTimeout);

            return(new ConnectionOptions(
                       protocolVersion: ProtocolConstants.CurrentVersion,
                       minimumProtocolVersion: ProtocolConstants.Version100,
                       handshakeTimeout: handshakeTimeout,
                       requestTimeout: requestTimeout));
        }
        public InitializeRequest(string clientVersion, string culture, TimeSpan requestTimeout)
        {
            if (string.IsNullOrEmpty(clientVersion))
            {
                throw new ArgumentException(Strings.ArgumentCannotBeNullOrEmpty, nameof(clientVersion));
            }

            if (string.IsNullOrEmpty(culture))
            {
                throw new ArgumentException(Strings.ArgumentCannotBeNullOrEmpty, nameof(culture));
            }

            if (!TimeoutUtilities.IsValid(requestTimeout))
            {
                throw new ArgumentOutOfRangeException(
                          nameof(requestTimeout),
                          requestTimeout,
                          Strings.Plugin_TimeoutOutOfRange);
            }

            ClientVersion  = clientVersion;
            Culture        = culture;
            RequestTimeout = requestTimeout;
        }