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); }
void ClientDisconnected(IntPtr qmlDebugClient) { if (qmlDebugClient != client) { return; } State = DebugClientState.Disconnected; }
void ClientDestroyed(IntPtr qmlDebugClient) { if (qmlDebugClient != client) { return; } State = DebugClientState.Unavailable; }
void ClientConnected(IntPtr qmlDebugClient) { if (qmlDebugClient != client || Disposing) { return; } State = DebugClientState.Connected; clientConnected.Set(); }
public bool Disconnect() { if (State != DebugClientState.Connected) { return(false); } State = DebugClientState.Disconnecting; return(NativeMethods.DebugClientDisconnect(client)); }
void ClientCreated(IntPtr qmlDebugClient) { if (client != IntPtr.Zero || Disposing) { return; } client = qmlDebugClient; State = DebugClientState.Disconnected; clientCreated.Set(); }
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); }
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); }