示例#1
0
 private static async Task SendReadyNotificationToViewers()
 {
     if (Conductor.ArgDict.ContainsKey("relaunch"))
     {
         Logger.Write($"Resuming after relaunch.");
         var viewersString = Conductor.ArgDict["viewers"];
         var viewerIDs     = viewersString.Split(",".ToCharArray());
         await CasterSocket.NotifyViewersRelaunchedScreenCasterReady(viewerIDs);
     }
     else
     {
         await CasterSocket.NotifyRequesterUnattendedReady(Conductor.RequesterID);
     }
 }
示例#2
0
        public static void Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
                CursorIconWatcher = new CursorIconWatcher(Conductor);
                var screenCaster     = new WinScreenCaster(CursorIconWatcher);
                var clipboardService = new WinClipboardService();
                var casterSocket     = new CasterSocket(new WinInput(), screenCaster, new WinAudioCapturer(), clipboardService);
                Conductor = new Conductor(casterSocket, screenCaster);
                Conductor.ProcessArgs(args);

                Conductor.Connect().ContinueWith(async(task) =>
                {
                    await Conductor.CasterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName, Conductor.DeviceID);
                    if (Win32Interop.GetCurrentDesktop(out var currentDesktopName))
                    {
                        Logger.Write($"Setting initial desktop to {currentDesktopName}.");
                        if (Win32Interop.SwitchToInputDesktop())
                        {
                            CurrentDesktopName = currentDesktopName;
                        }
                        else
                        {
                            Logger.Write("Failed to set initial desktop.");
                        }
                    }
                    else
                    {
                        Logger.Write("Failed to get initial desktop name.");
                    }
                    await CheckForRelaunch();
                    Conductor.IdleTimer = new IdleTimer(Conductor.Viewers);
                    Conductor.IdleTimer.Start();
                    CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;
                    clipboardService.BeginWatching();

                    await HandleConnection(Conductor);
                });

                Thread.Sleep(Timeout.Infinite);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw;
            }
        }
示例#3
0
文件: Viewer.cs 项目: xickwy/Remotely
 public Viewer(CasterSocket casterSocket,
               IScreenCapturer screenCapturer,
               IClipboardService clipboardService,
               IWebRtcSessionFactory webRtcSessionFactory,
               IAudioCapturer audioCapturer)
 {
     Capturer             = screenCapturer;
     CasterSocket         = casterSocket;
     WebRtcSessionFactory = webRtcSessionFactory;
     EncoderParams        = new EncoderParameters();
     ImageQuality         = defaultImageQuality;
     ClipboardService     = clipboardService;
     ClipboardService.ClipboardTextChanged += ClipboardService_ClipboardTextChanged;
     AudioCapturer = audioCapturer;
     AudioCapturer.AudioSampleReady += AudioCapturer_AudioSampleReady;
 }
示例#4
0
        public MainWindowViewModel()
        {
            Current = this;
            if (!OSUtils.IsLinux)
            {
                return;
            }
            var screenCaster = new LinuxScreenCaster();
            var casterSocket = new CasterSocket(new X11Input(), screenCaster, new LinuxAudioCapturer(), new LinuxClipboardService());

            Conductor = new Conductor(casterSocket, screenCaster);

            Conductor.SessionIDChanged    += SessionIDChanged;
            Conductor.ViewerRemoved       += ViewerRemoved;
            Conductor.ViewerAdded         += ViewerAdded;
            Conductor.ScreenCastRequested += ScreenCastRequested;
        }
示例#5
0
 private async Task InitializeWebRtc(Viewer viewer, CasterSocket casterSocket)
 {
     try
     {
         viewer.RtcSession = new WebRtcSession();
         viewer.RtcSession.LocalSdpReady += async(sender, sdp) =>
         {
             await casterSocket.SendRtcOfferToBrowser(sdp, viewer.ViewerConnectionID);
         };
         viewer.RtcSession.IceCandidateReady += async(sender, args) =>
         {
             await casterSocket.SendIceCandidateToBrowser(args.candidate, args.sdpMlineIndex, args.sdpMid, viewer.ViewerConnectionID);
         };
         await viewer.RtcSession.Init();
     }
     catch (Exception ex)
     {
         Logger.Write(ex);
     }
 }
示例#6
0
        public MainWindowViewModel()
        {
            Current = this;

            CursorIconWatcher           = new CursorIconWatcher(Conductor);
            CursorIconWatcher.OnChange += CursorIconWatcher_OnChange;

            var screenCaster     = new WinScreenCaster(CursorIconWatcher);
            var clipboardService = new WinClipboardService();

            clipboardService.BeginWatching();
            var casterSocket = new CasterSocket(new WinInput(), screenCaster, new WinAudioCapturer(), clipboardService);

            Conductor = new Conductor(casterSocket, screenCaster);

            Conductor.SessionIDChanged    += SessionIDChanged;
            Conductor.ViewerRemoved       += ViewerRemoved;
            Conductor.ViewerAdded         += ViewerAdded;
            Conductor.ScreenCastRequested += ScreenCastRequested;
        }
示例#7
0
文件: Viewer.cs 项目: xickwy/Remotely
        public async Task InitializeWebRtc()
        {
            try
            {
                var iceServers = await CasterSocket.GetIceServers();

                RtcSession = WebRtcSessionFactory.GetNewSession(this);
                RtcSession.LocalSdpReady += async(sender, sdp) =>
                {
                    await CasterSocket.SendRtcOfferToBrowser(sdp.Content, ViewerConnectionID, iceServers);
                };
                RtcSession.IceCandidateReady += async(sender, candidate) =>
                {
                    await CasterSocket.SendIceCandidateToBrowser(candidate.Content, candidate.SdpMlineIndex, candidate.SdpMid, ViewerConnectionID);
                };

                await RtcSession.Init(iceServers);
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
        }
示例#8
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendScreenSize(int width, int height)
 {
     await SendToViewer(() => RtcSession.SendScreenSize(width, height),
                        () => CasterSocket.SendScreenSize(width, height, ViewerConnectionID));
 }
示例#9
0
        public static async Task Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

                BuildServices();

                Conductor    = Services.GetRequiredService <Conductor>();
                CasterSocket = Services.GetRequiredService <ICasterSocket>();
                Conductor.ProcessArgs(args);

                SystemEvents.SessionEnding += async(s, e) =>
                {
                    if (e.Reason == SessionEndReasons.SystemShutdown)
                    {
                        await CasterSocket.DisconnectAllViewers();
                    }
                };

                var deviceInitService = Services.GetRequiredService <IDeviceInitService>();

                var activationUri = Services.GetRequiredService <IClickOnceService>().GetActivationUri();
                if (Uri.TryCreate(activationUri, UriKind.Absolute, out var result))
                {
                    var host = $"{result.Scheme}://{result.Authority}";

                    if (!string.IsNullOrWhiteSpace(host))
                    {
                        Conductor.UpdateHost(host);
                        using var httpClient = new HttpClient();
                        try
                        {
                            var url   = $"{host.TrimEnd('/')}/api/branding";
                            var query = HttpUtility.ParseQueryString(result.Query);
                            if (query?.AllKeys?.Contains("organizationid") == true)
                            {
                                url += $"?organizationId={query["organizationid"]}";
                                Conductor.UpdateOrganizationId(query["organizationid"]);
                            }
                            var branding = await httpClient.GetFromJsonAsync <BrandingInfo>(url).ConfigureAwait(false);

                            if (branding != null)
                            {
                                deviceInitService.SetBrandingInfo(branding);
                            }
                        }
                        catch { }
                    }
                }

                await deviceInitService.GetInitParams().ConfigureAwait(false);


                if (Conductor.Mode == Core.Enums.AppMode.Chat)
                {
                    StartUiThreads(false);
                    _ = Task.Run(async() =>
                    {
                        var chatService = Services.GetRequiredService <IChatClientService>();
                        await chatService.StartChat(Conductor.RequesterID, Conductor.OrganizationName);
                    });
                }
                else if (Conductor.Mode == Core.Enums.AppMode.Unattended)
                {
                    StartUiThreads(false);
                    App.Current.Dispatcher.Invoke(() =>
                    {
                        App.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
                    });
                    _ = Task.Run(StartScreenCasting);
                }
                else
                {
                    StartUiThreads(true);
                }

                WaitForAppExit();
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
                throw;
            }
        }
示例#10
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendScreenData(string selectedScreen, string[] displayNames)
 {
     await SendToViewer(() => RtcSession.SendScreenData(selectedScreen, displayNames),
                        () => CasterSocket.SendScreenData(selectedScreen, displayNames, ViewerConnectionID));
 }
示例#11
0
        public async Task ParseMessage(byte[] message)
        {
            try
            {
                var baseDto = MessagePackSerializer.Deserialize <BinaryDtoBase>(message);

                switch (baseDto.DtoType)
                {
                case BinaryDtoType.MouseMove:
                case BinaryDtoType.MouseDown:
                case BinaryDtoType.MouseUp:
                case BinaryDtoType.Tap:
                case BinaryDtoType.MouseWheel:
                case BinaryDtoType.KeyDown:
                case BinaryDtoType.KeyUp:
                case BinaryDtoType.CtrlAltDel:
                case BinaryDtoType.ToggleBlockInput:
                case BinaryDtoType.ClipboardTransfer:
                case BinaryDtoType.KeyPress:
                {
                    if (!Viewer.HasControl)
                    {
                        return;
                    }
                }
                break;

                default:
                    break;
                }

                switch (baseDto.DtoType)
                {
                case BinaryDtoType.SelectScreen:
                    SelectScreen(message);
                    break;

                case BinaryDtoType.MouseMove:
                    MouseMove(message);
                    break;

                case BinaryDtoType.MouseDown:
                    MouseDown(message);
                    break;

                case BinaryDtoType.MouseUp:
                    MouseUp(message);
                    break;

                case BinaryDtoType.Tap:
                    Tap(message);
                    break;

                case BinaryDtoType.MouseWheel:
                    MouseWheel(message);
                    break;

                case BinaryDtoType.KeyDown:
                    KeyDown(message);
                    break;

                case BinaryDtoType.KeyUp:
                    KeyUp(message);
                    break;

                case BinaryDtoType.CtrlAltDel:
                    await CasterSocket.SendCtrlAltDel();

                    break;

                case BinaryDtoType.AutoQualityAdjust:
                    SetAutoQualityAdjust(message);
                    break;

                case BinaryDtoType.ToggleAudio:
                    ToggleAudio(message);
                    break;

                case BinaryDtoType.ToggleBlockInput:
                    ToggleBlockInput(message);
                    break;

                case BinaryDtoType.ClipboardTransfer:
                    ClipboardTransfer(message);
                    break;

                case BinaryDtoType.KeyPress:
                    await KeyPress(message);

                    break;

                case BinaryDtoType.QualityChange:
                    QualityChange(message);
                    break;

                case BinaryDtoType.File:
                    await DownloadFile(message);

                    break;

                default:
                    break;
                }
            }
            catch (Exception ex)
            {
                Logger.Write(ex);
            }
        }
示例#12
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendCursorChange(CursorInfo cursorInfo)
 {
     await SendToViewer(() => RtcSession.SendCursorChange(cursorInfo),
                        () => CasterSocket.SendCursorChange(cursorInfo, ViewerConnectionID));
 }
示例#13
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendMachineName(string machineName)
 {
     await SendToViewer(() => RtcSession.SendMachineName(machineName),
                        () => CasterSocket.SendMachineName(machineName, ViewerConnectionID));
 }
示例#14
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendClipboardText(string clipboardText)
 {
     await SendToViewer(() => RtcSession.SendClipboardText(clipboardText),
                        () => CasterSocket.SendClipboardText(clipboardText, ViewerConnectionID));
 }
示例#15
0
文件: Viewer.cs 项目: xickwy/Remotely
 public async Task SendAudioSample(byte[] audioSample)
 {
     await SendToViewer(() => RtcSession.SendAudioSample(audioSample),
                        () => CasterSocket.SendAudioSample(audioSample, ViewerConnectionID));
 }
示例#16
0
 public async Task SendScreenSize(int width, int height, string viewerID)
 {
     await SendToViewer(() => RtcSession.SendScreenSize(width, height),
                        () => CasterSocket.SendScreenSize(width, height, viewerID));
 }
示例#17
0
 public void SetMessageHandlers(IKeyboardMouseInput keyboardMouse)
 {
     CasterSocket = new CasterSocket(Connection, this, keyboardMouse);
 }
示例#18
0
 public async Task Connect()
 {
     await CasterSocket.Connect(Host);
 }