Пример #1
0
            public IWampCancellableInvocation Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter,
                                                                InvocationDetails details,
                                                                TMessage[] arguments)
            {
                TMessage number = arguments[0];
                int      n      = formatter.Deserialize <int>(number);

                for (int i = 0; i < n; i++)
                {
                    caller.Result(WampObjectFormatter.Value,
                                  new YieldOptions {
                        Progress = true
                    },
                                  new object[] { i });
                }

                caller.Result(WampObjectFormatter.Value,
                              new YieldOptions(),
                              new object[] { n });

                return(null);
            }
Пример #2
0
        public int FlushTestaments(string scope = WampTestamentScope.Destroyed)
        {
            InvocationDetails invocationDetails = WampInvocationContext.Current.InvocationDetails;

            long sessionId = (long)invocationDetails.Caller;

            int result = 0;

            lock (mLock)
            {
                IImmutableList <Testament> testaments;

                if (mSessionIdToTestaments.TryGetValue(sessionId, out testaments))
                {
                    result = testaments.Count;
                }

                mSessionIdToTestaments = mSessionIdToTestaments.Remove(sessionId);

                return(result);
            }
        }
Пример #3
0
            protected override object InvokeSync <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter,
                                                            InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords,
                                                            out IDictionary <string, object> outputs)
            {
                object[] unpacked =
                    this.UnpackParameters(formatter, arguments, argumentsKeywords)
                    .ToArray();

                string name = (string)unpacked[0];

                outputs = new Dictionary <string, object>();

                outputs["length"] = name.Length;

                for (int i = 0; i < 10; i++)
                {
                    string argumentName = "item" + (i + 1);
                    outputs[argumentName] = string.Format("{0} {1}", name, i);
                }

                return(null);
            }
Пример #4
0
        private InvocationDetails GetInvocationDetails(InvocationDetails details)
        {
            if (!(details is InvocationDetailsExtended casted))
            {
                return(details);
            }

            InvocationDetails result = new InvocationDetails(casted);

            CallOptions callerOptions = casted.CallerOptions;

            if (Options.DiscloseCaller == true &&
                callerOptions.DiscloseMe == false)
            {
                throw new WampException(WampErrors.DiscloseMeNotAllowed);
            }

            if (Options.DiscloseCaller == true ||
                callerOptions.DiscloseMe == true)
            {
                result.Caller = casted.CallerSession;

                result.CallerAuthenticationId   = casted.AuthenticationId;
                result.CallerAuthenticationRole = casted.AuthenticationRole;
            }

            if (callerOptions.ReceiveProgress == true)
            {
                result.ReceiveProgress = true;
            }

            if (Options.Match != WampMatchPattern.Exact)
            {
                result.Procedure = casted.ProcedureUri;
            }

            return(result);
        }
        private async Task InnerInvokeAsync <TMessage>(IWampRawRpcOperationRouterCallback caller,
                                                       IWampFormatter <TMessage> formatter,
                                                       InvocationDetails details,
                                                       TMessage[] arguments,
                                                       IDictionary <string, TMessage> argumentsKeywords,
                                                       CancellationToken cancellationToken)
        {
            try
            {
                Task <object> task =
                    InvokeAsync(caller,
                                formatter,
                                details,
                                arguments,
                                argumentsKeywords,
                                cancellationToken);

                object result = await task;

                CallResult(caller, result);
            }
            catch (Exception ex)
            {
                mLogger.ErrorFormat(ex, "An error occured while calling {ProcedureUri}", this.Procedure);

                WampException wampException = ex as WampException;

                if (wampException == null)
                {
                    wampException = ConvertExceptionToRuntimeException(ex);
                }

                IWampErrorCallback callback = new WampRpcErrorCallback(caller);

                callback.Error(wampException);
            }
        }
Пример #6
0
 public void Invocation(long requestId, long registrationId, InvocationDetails details, object[] arguments)
 {
     Send(mInvocation4, requestId, registrationId, details, arguments);
 }
Пример #7
0
 public void Invocation(long requestId, long registrationId, InvocationDetails details)
 {
     Send(mInvocation3, requestId, registrationId, details);
 }
 public void Invocation(long requestId, long registrationId, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
 {
     mCallee.Invocation(requestId, registrationId, details, arguments, argumentsKeywords);
 }
 public void Invocation(long requestId, long registrationId, InvocationDetails details, TMessage[] arguments)
 {
     mCallee.Invocation(requestId, registrationId, details, arguments);
 }
Пример #10
0
 public IWampCancellableInvocation Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments)
 {
     return(InnerInvoke(caller, formatter, details, arguments, null));
 }
Пример #11
0
        protected override object InvokeSync <TMessage>
            (IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details,
            TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords,
            out IDictionary <string, object> outputs)
        {
            WampInvocationContext.Current = new WampInvocationContext(details);

            try
            {
                object[] unpacked =
                    UnpackParameters(formatter, arguments, argumentsKeywords)
                    .ToArray();

                object[] parameters =
                    mHelper.GetArguments(unpacked);

                object instance = mInstanceProvider();

                ValidateInstanceType(instance, mMethod);

                object result =
                    mMethodInvoker(instance, parameters);

                outputs = mHelper.GetOutOrRefValues(parameters);

                return(result);
            }
            finally
            {
                WampInvocationContext.Current = null;
            }
        }
Пример #12
0
        public long RegisterInvocation(RemoteWampCalleeDetails operation, IWampRawRpcOperationRouterCallback callback, InvocationDetails options, object[] arguments = null, IDictionary <string, object> argumentsKeywords = null)
        {
            lock (mLock)
            {
                WampRpcInvocation invocation =
                    new WampRpcInvocation
                        (operation, callback, options, arguments, argumentsKeywords);

                long invocationId = mRequestIdToInvocation.Add(invocation);

                invocation.InvocationId = invocationId;

                mOperationToInvocations.Add(operation, invocation);

                IWampCaller caller = GetCaller(callback);

                if (caller != null)
                {
                    if (!mCallerToInvocations.ContainsKey(caller))
                    {
                        RegisterDisconnectionNotifier(callback);
                    }

                    mCallerToInvocations.Add(caller, invocation);
                }

                IWampClientProperties properties = invocation.Operation.Callee as IWampClientProperties;

                if (properties.HelloDetails?.Roles?.Callee?.Features?.CallCanceling == true)
                {
                    mCallbackToInvocation.Add(callback, invocation);
                }

                return(invocationId);
            }
        }
Пример #13
0
 public IWampCancellableInvocation Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details,
                                                     TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
 {
     return(null);
 }
Пример #14
0
 public IWampCancellableInvocation Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details,
                                                     TMessage[] arguments)
 {
     this.Details = details;
     return(null);
 }
Пример #15
0
 public int Add2(int x, int y)
 {
     Details = WampInvocationContext.Current.InvocationDetails;
     return(x + y);
 }
Пример #16
0
 public void Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
 {
     InnerInvoke(caller, formatter, details, arguments, argumentsKeywords);
 }
Пример #17
0
 public void Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments)
 {
     InnerInvoke(caller, formatter, details, arguments, null);
 }
Пример #18
0
 protected abstract void InnerInvoke <TMessage>
     (IWampRawRpcOperationRouterCallback caller,
     IWampFormatter <TMessage> formatter,
     InvocationDetails details,
     TMessage[] arguments,
     IDictionary <string, TMessage> argumentsKeywords);
Пример #19
0
 public void Invocation(long requestId, long registrationId, InvocationDetails details, object[] arguments, IDictionary <string, object> argumentsKeywords)
 {
     Send(mInvocation5, requestId, registrationId, details, arguments, argumentsKeywords);
 }
Пример #20
0
        protected override IWampCancellableInvocation InnerInvoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
        {
            try
            {
                object result =
                    InvokeSync(caller,
                               formatter,
                               details,
                               arguments,
                               argumentsKeywords,
                               out IDictionary <string, object> outputs);

                CallResult(caller, result, outputs);
            }
            catch (WampException ex)
            {
                mLogger.ErrorFormat(ex, "An error occured while calling {ProcedureUri}", this.Procedure);
                IWampErrorCallback callback = new WampRpcErrorCallback(caller);
                callback.Error(ex);
            }
            catch (Exception ex)
            {
                WampException      wampException = ConvertExceptionToRuntimeException(ex);
                IWampErrorCallback callback      = new WampRpcErrorCallback(caller);
                callback.Error(wampException);
            }

            return(null);
        }
Пример #21
0
 protected override IWampCancellableInvocation InnerInvoke <TMessage>
     (IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
 {
     mAction();
     caller.Result(formatter, new YieldOptions());
     return(null);
 }
Пример #22
0
 public WampMessage <object> Invocation(long requestId, long registrationId, InvocationDetails details, object[] arguments, IDictionary <string, object> argumentsKeywords)
 {
     return(mSerializer.SerializeRequest(mInvocation5, new object[] { requestId, registrationId, details, arguments, argumentsKeywords }));
 }
Пример #23
0
 public IWampCancellableInvocation Invoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details)
 {
     return(null);
 }
Пример #24
0
            protected override object InvokeSync <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords, out IDictionary <string, object> outputs)
            {
                outputs = null;

                int argumentsLength = 0;

                if (arguments != null)
                {
                    argumentsLength = arguments.Length;
                }

                int argumentKeyWordsLength = 0;

                if (argumentsKeywords != null)
                {
                    argumentKeyWordsLength = argumentsKeywords.Count;
                }

                return(new int[] { argumentsLength, argumentKeyWordsLength });
            }
Пример #25
0
        protected override IWampCancellableInvocation InnerInvoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
        {
            try
            {
                object result =
                    InvokeSync(caller,
                               formatter,
                               details,
                               arguments,
                               argumentsKeywords,
                               out IDictionary <string, object> outputs);

                return(OnResult(caller, result, outputs));
            }
            catch (WampException ex)
            {
                HandleException(caller, ex);
            }
            catch (Exception ex)
            {
                HandleException(caller, ex);
            }

            return(null);
        }
Пример #26
0
 protected abstract Task <object> InvokeAsync <TMessage>
     (IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords, CancellationToken cancellationToken);
Пример #27
0
 protected abstract object InvokeSync <TMessage>
     (IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords, out IDictionary <string, object> outputs);
Пример #28
0
        protected override IWampCancellableInvocation InnerInvoke <TMessage>(IWampRawRpcOperationRouterCallback caller, IWampFormatter <TMessage> formatter, InvocationDetails details, TMessage[] arguments, IDictionary <string, TMessage> argumentsKeywords)
        {
            CancellationTokenSourceInvocation result = null;
            CancellationToken token = CancellationToken.None;

            if (SupportsCancellation)
            {
                CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
                result = new CancellationTokenSourceInvocation(cancellationTokenSource);
                token  = cancellationTokenSource.Token;
            }

            Task task =
                InnerInvokeAsync(caller,
                                 formatter,
                                 details,
                                 arguments,
                                 argumentsKeywords,
                                 token);

            return(result);
        }
Пример #29
0
        /// <summary>
        /// Generates the ProcessPipDetails for a given Pip
        /// </summary>
        public ProcessPipDetails GenerateProcessPipDetails(Process pip)
        {
            ProcessPipDetails processPipDetails = new ProcessPipDetails();

            InvocationDetails invoDetails = new InvocationDetails
            {
                Executable           = pip.Executable.IsValid ? pip.Executable.Path.ToString(PathTable): null,
                ToolDescription      = pip.ToolDescription.IsValid ? pip.ToolDescription.ToString(StringTable) : null,
                ResponseFilePath     = pip.ResponseFile.IsValid ? pip.ResponseFile.Path.ToString(PathTable) : null,
                Arguments            = pip.Arguments.IsValid ? pip.Arguments.ToString(PathTable) : null,
                ResponseFileContents = pip.ResponseFileData.IsValid ? pip.ResponseFileData.ToString(PathTable) : null,
            };

            invoDetails.EnvironmentVariables = pip.EnvironmentVariables.
                                               Select(x => new KeyValuePair <string, string>
                                                          (x.Name.ToString(StringTable), x.Value.IsValid ? x.Value.ToString(PathTable) : null))
                                               .ToList();
            invoDetails.EnvironmentVariables    = invoDetails.EnvironmentVariables.Any() ? invoDetails.EnvironmentVariables : null;
            processPipDetails.InvocationDetails = invoDetails;

            InputOutputDetails inOutDetails = new InputOutputDetails
            {
                STDInFile    = pip.StandardInput.File.IsValid ? pip.StandardInput.File.Path.ToString(PathTable): null,
                STDOut       = pip.StandardOutput.IsValid ? pip.StandardOutput.Path.ToString(PathTable): null,
                STDError     = pip.StandardError.IsValid ? pip.StandardError.Path.ToString() : null,
                STDDirectory = pip.StandardDirectory.IsValid ? pip.StandardDirectory.ToString(PathTable) : null,
                WarningRegex = pip.WarningRegex.IsValid ? pip.WarningRegex.Pattern.ToString(StringTable) : null,
                ErrorRegex   = pip.ErrorRegex.IsValid ? pip.ErrorRegex.Pattern.ToString(StringTable) : null,
                STDInData    = pip.StandardInputData.IsValid ? pip.StandardInputData.ToString(PathTable) : null
            };

            processPipDetails.InputOutputDetails = inOutDetails;

            DirectoryDetails dirDetails = new DirectoryDetails
            {
                WorkingDirectory      = pip.WorkingDirectory.IsValid ? pip.WorkingDirectory.ToString(PathTable) : null,
                UniqueOutputDirectory = pip.UniqueOutputDirectory.IsValid ? pip.UniqueOutputDirectory.ToString(PathTable) : null,
                TempDirectory         = pip.TempDirectory.IsValid ? pip.TempDirectory.ToString(PathTable) : null,
            };

            if (pip.AdditionalTempDirectories.IsValid)
            {
                dirDetails.ExtraTempDirectories = pip.AdditionalTempDirectories.
                                                  Select(x => x.ToString(PathTable))
                                                  .ToList();
            }
            dirDetails.ExtraTempDirectories    = dirDetails.ExtraTempDirectories.Any() ? dirDetails.ExtraTempDirectories : null;
            processPipDetails.DirectoryDetails = dirDetails;

            AdvancedOptions advancedOptions = new AdvancedOptions
            {
                TimeoutWarning                 = pip.WarningTimeout.GetValueOrDefault(),
                TimeoutError                   = pip.Timeout.GetValueOrDefault(),
                SuccessCodes                   = pip.SuccessExitCodes.ToList(),
                Semaphores                     = pip.Semaphores.Select(x => x.Name.ToString(StringTable)).ToList(),
                HasUntrackedChildProcesses     = pip.HasUntrackedChildProcesses,
                ProducesPathIndependentOutputs = pip.ProducesPathIndependentOutputs,
                OutputsMustRemainWritable      = pip.OutputsMustRemainWritable,
                AllowPreserveOutputs           = pip.AllowPreserveOutputs
            };

            advancedOptions.SuccessCodes      = advancedOptions.SuccessCodes.Any() ? advancedOptions.SuccessCodes : null;
            advancedOptions.Semaphores        = advancedOptions.Semaphores.Any() ? advancedOptions.Semaphores : null;
            processPipDetails.AdvancedOptions = advancedOptions;

            ProcessInputOutputDetails procInOutDetails = new ProcessInputOutputDetails
            {
                FileDependencies      = pip.Dependencies.Select(x => x.IsValid ? x.Path.ToString(PathTable) : null).ToList(),
                DirectoryDependencies = pip.DirectoryDependencies.Select(x => x.IsValid ? x.Path.ToString(PathTable) : null).ToList(),
                OrderDependencies     = pip.OrderDependencies.Select(x => x.Value).ToList(),
                FileOutputs           = pip.FileOutputs.Select(x => x.IsValid ? x.Path.ToString(PathTable) : null).ToList(),
                DirectoryOuputs       = pip.DirectoryOutputs.Select(x => x.IsValid ? x.Path.ToString(PathTable) : null).ToList(),
                UntrackedPaths        = pip.UntrackedPaths.Select(x => x.IsValid ? x.ToString(PathTable) : null).ToList(),
                UntrackedScopes       = pip.UntrackedScopes.Select(x => x.IsValid ? x.ToString(PathTable) : null).ToList(),
            };

            procInOutDetails.FileDependencies           = procInOutDetails.FileDependencies.Any() ? procInOutDetails.FileDependencies : null;
            procInOutDetails.DirectoryDependencies      = procInOutDetails.DirectoryDependencies.Any() ? procInOutDetails.DirectoryDependencies : null;
            procInOutDetails.OrderDependencies          = procInOutDetails.OrderDependencies.Any() ? procInOutDetails.OrderDependencies : null;
            procInOutDetails.FileOutputs                = procInOutDetails.FileOutputs.Any() ? procInOutDetails.FileOutputs : null;
            procInOutDetails.DirectoryOuputs            = procInOutDetails.DirectoryOuputs.Any() ? procInOutDetails.DirectoryOuputs : null;
            procInOutDetails.UntrackedPaths             = procInOutDetails.UntrackedPaths.Any() ? procInOutDetails.UntrackedPaths : null;
            procInOutDetails.UntrackedScopes            = procInOutDetails.UntrackedScopes.Any() ? procInOutDetails.UntrackedScopes : null;
            processPipDetails.ProcessInputOutputDetails = procInOutDetails;

            ServiceDetails servDetails = new ServiceDetails
            {
                IsService              = pip.IsService,
                ShutdownProcessPipId   = pip.ShutdownProcessPipId.Value,
                ServicePipDependencies = pip.ServicePipDependencies.Select(x => x.Value).ToList(),
                IsStartOrShutdownKind  = pip.IsStartOrShutdownKind
            };

            servDetails.ServicePipDependencies = servDetails.ServicePipDependencies.Any() ? servDetails.ServicePipDependencies : null;
            processPipDetails.ServiceDetails   = servDetails;

            return(processPipDetails);
        }
 public void Invocation(long requestId, long registrationId, InvocationDetails details)
 {
     mCallee.Invocation(requestId, registrationId, details);
 }