Exemple #1
0
        private void ClientThread()
        {
            ThreadId = NativeMethods.GetCurrentThreadId();

            var clientCreated =
                new NativeMethods.QmlDebugClientCreated(ClientCreated);
            var clientDestroyed =
                new NativeMethods.QmlDebugClientDestroyed(ClientDestroyed);
            var clientConnected =
                new NativeMethods.QmlDebugClientConnected(ClientConnected);
            var clientDisconnected =
                new NativeMethods.QmlDebugClientDisconnected(ClientDisconnected);
            var clientMessageReceived =
                new NativeMethods.QmlDebugClientMessageReceived(ClientMessageReceived);

            try {
                NativeMethods.DebugClientThread(
                    clientCreated, clientDestroyed,
                    clientConnected, clientDisconnected,
                    clientMessageReceived);
            } finally {
                State = DebugClientState.Unavailable;
                GC.KeepAlive(clientCreated);
                GC.KeepAlive(clientDestroyed);
                GC.KeepAlive(clientConnected);
                GC.KeepAlive(clientDisconnected);
                GC.KeepAlive(clientMessageReceived);
            }
        }
 void IConnectionEventSink.NotifyStateTransition(
     DebugClient client,
     DebugClientState oldState,
     DebugClientState newState)
 {
     sink.NotifyStateTransition(client, oldState, newState);
 }
Exemple #3
0
 void ClientDisconnected(IntPtr qmlDebugClient)
 {
     if (qmlDebugClient != client)
     {
         return;
     }
     State = DebugClientState.Disconnected;
 }
Exemple #4
0
 void ClientDestroyed(IntPtr qmlDebugClient)
 {
     if (qmlDebugClient != client)
     {
         return;
     }
     State = DebugClientState.Unavailable;
 }
Exemple #5
0
 void ClientConnected(IntPtr qmlDebugClient)
 {
     if (qmlDebugClient != client || Disposing)
     {
         return;
     }
     State = DebugClientState.Connected;
     clientConnected.Set();
 }
Exemple #6
0
 public bool Disconnect()
 {
     if (State != DebugClientState.Connected)
     {
         return(false);
     }
     State = DebugClientState.Disconnecting;
     return(NativeMethods.DebugClientDisconnect(client));
 }
Exemple #7
0
        void ClientCreated(IntPtr qmlDebugClient)
        {
            if (client != IntPtr.Zero || Disposing)
            {
                return;
            }

            client = qmlDebugClient;
            State  = DebugClientState.Disconnected;
            clientCreated.Set();
        }
Exemple #8
0
        public EventWaitHandle StartLocalServer(string fileName)
        {
            if (State != DebugClientState.Disconnected)
            {
                return(null);
            }

            clientConnected = new EventWaitHandle(false, EventResetMode.ManualReset);
            State           = DebugClientState.Connecting;
            var fileNameData = Encoding.UTF8.GetBytes(fileName);

            if (!NativeMethods.DebugClientStartLocalServer(client,
                                                           fileNameData, fileNameData.Length))
            {
                return(null);
            }

            uint timeout = (uint)QtVsToolsPackage.Instance.Options.QmlDebuggerTimeout;

            if (timeout != 0)
            {
                _ = Task.Run(() =>
                {
                    var connectTimer = new System.Diagnostics.Stopwatch();
                    connectTimer.Start();

                    while (!clientConnected.WaitOne(100))
                    {
                        if (sink.QueryRuntimeFrozen())
                        {
                            connectTimer.Restart();
                        }
                        else
                        {
                            if (connectTimer.ElapsedMilliseconds > timeout)
                            {
                                if (!Disposing)
                                {
                                    clientConnected.Set();
                                }

                                if (Atomic(() => State == DebugClientState.Connected,
                                           () => State = DebugClientState.Disconnecting))
                                {
                                    NativeMethods.DebugClientDisconnect(client);
                                }
                            }
                        }
                    }
                });
            }

            return(clientConnected);
        }
Exemple #9
0
        public EventWaitHandle Connect(string hostName, ushort hostPort)
        {
            if (State != DebugClientState.Disconnected)
            {
                return(null);
            }

            clientConnected = new EventWaitHandle(false, EventResetMode.ManualReset);
            State           = DebugClientState.Connecting;
            if (string.IsNullOrEmpty(hostName))
            {
                hostName = "localhost";
            }
            var hostNameData = Encoding.UTF8.GetBytes(hostName);

            uint timeout = (uint)QtVsToolsPackage.Instance.Options.QmlDebuggerTimeout;

            _ = Task.Run(() =>
            {
                var connectTimer = new System.Diagnostics.Stopwatch();
                connectTimer.Start();

                var probe = new Socket(
                    AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                while (!probe.Connected &&
                       (timeout == 0 || connectTimer.ElapsedMilliseconds < timeout))
                {
                    try {
                        probe.Connect(hostName, hostPort);
                    } catch {
                        Thread.Sleep(3000);
                    }
                }

                if (probe.Connected)
                {
                    probe.Disconnect(false);

                    NativeMethods.DebugClientConnect(client,
                                                     hostNameData, hostNameData.Length, hostPort);
                    connectTimer.Restart();

                    uint connectionTimeout = Math.Max(3000, timeout / 20);
                    while (!clientConnected.WaitOne(1000))
                    {
                        if (sink.QueryRuntimeFrozen())
                        {
                            connectTimer.Restart();
                        }
                        else
                        {
                            if (connectTimer.ElapsedMilliseconds > connectionTimeout)
                            {
                                if (!Disposing)
                                {
                                    clientConnected.Set();
                                }

                                if (Atomic(() => State == DebugClientState.Connected,
                                           () => State = DebugClientState.Disconnecting))
                                {
                                    NativeMethods.DebugClientDisconnect(client);
                                }
                            }
                            else
                            {
                                NativeMethods.DebugClientConnect(client,
                                                                 hostNameData, hostNameData.Length, hostPort);
                            }
                        }
                    }
                }
            });

            return(clientConnected);
        }