Exemplo n.º 1
0
        public async Task SendMessage(string message, string orgName, string senderConnectionID, HubConnection hubConnection)
        {
            try
            {
                if (await MessageLock.WaitAsync(30000))
                {
                    ChatSession chatSession;
                    if (!ChatClients.Contains(senderConnectionID))
                    {
                        var rcBinaryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ScreenCast", OSUtils.ScreenCastExecutableFileName);
                        var procID       = await AppLauncher.LaunchChatService(orgName, senderConnectionID, hubConnection);

                        var clientPipe = new NamedPipeClientStream(".", "Remotely_Chat" + senderConnectionID, PipeDirection.InOut, PipeOptions.Asynchronous);
                        clientPipe.Connect(15000);
                        if (!clientPipe.IsConnected)
                        {
                            Logger.Write("Failed to connect to chat host.");
                            return;
                        }
                        chatSession = new ChatSession()
                        {
                            PipeStream = clientPipe, ProcessID = procID
                        };
                        ChatClients.Add(senderConnectionID, chatSession, CacheItemPolicy);
                    }

                    chatSession = (ChatSession)ChatClients.Get(senderConnectionID);

                    if (!chatSession.PipeStream.IsConnected)
                    {
                        ChatClients.Remove(senderConnectionID);
                        await hubConnection.SendAsync("DisplayMessage", "Chat disconnected.  Please try again.", "Chat disconnected.");

                        return;
                    }

                    using (var sw = new StreamWriter(chatSession.PipeStream, leaveOpen: true))
                    {
                        await sw.WriteLineAsync(message);

                        await sw.FlushAsync();
                    }

                    _ = Task.Run(async() => { await ReadFromStream(chatSession.PipeStream, senderConnectionID, hubConnection); });
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
            finally
            {
                MessageLock.Release();
            }
        }
Exemplo n.º 2
0
        public async Task SendMessage(string senderName,
                                      string message,
                                      string orgName,
                                      bool disconnected,
                                      string senderConnectionID,
                                      HubConnection hubConnection)
        {
            if (!await MessageLock.WaitAsync(30000))
            {
                Logger.Write("Timed out waiting for chat message lock.", Shared.Enums.EventType.Warning);
                return;
            }

            try
            {
                ChatSession chatSession;
                if (!ChatClients.Contains(senderConnectionID))
                {
                    if (disconnected)
                    {
                        // Don't start a new session just to show a disconnected message.
                        return;
                    }

                    var procID = await AppLauncher.LaunchChatService(orgName, senderConnectionID, hubConnection);

                    if (procID > 0)
                    {
                        Logger.Write($"Chat app started.  Process ID: {procID}");
                    }
                    else
                    {
                        Logger.Write($"Chat app did not start successfully.");
                        return;
                    }

                    var clientPipe = new NamedPipeClientStream(".", "Remotely_Chat" + senderConnectionID, PipeDirection.InOut, PipeOptions.Asynchronous);
                    clientPipe.Connect(15000);
                    if (!clientPipe.IsConnected)
                    {
                        Logger.Write("Failed to connect to chat host.");
                        return;
                    }
                    chatSession = new ChatSession()
                    {
                        PipeStream = clientPipe, ProcessID = procID
                    };
                    _ = Task.Run(async() => { await ReadFromStream(chatSession.PipeStream, senderConnectionID, hubConnection); });
                    ChatClients.Add(senderConnectionID, chatSession, CacheItemPolicy);
                }

                chatSession = (ChatSession)ChatClients.Get(senderConnectionID);

                if (!chatSession.PipeStream.IsConnected)
                {
                    ChatClients.Remove(senderConnectionID);
                    await hubConnection.SendAsync("DisplayMessage", "Chat disconnected.  Please try again.", "Chat disconnected.", senderConnectionID);

                    return;
                }

                using var sw = new StreamWriter(chatSession.PipeStream, leaveOpen: true);
                var chatMessage = new ChatMessage(senderName, message, disconnected);
                await sw.WriteLineAsync(JsonSerializer.Serialize(chatMessage));

                await sw.FlushAsync();
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
            finally
            {
                MessageLock.Release();
            }
        }