public static void HandleGetDesktopResponse(Client client, GetDesktopResponse packet) { if (client.Value == null || client.Value.FrmRdp == null) return; if (packet.Image == null) return; if (client.Value.StreamCodec == null) client.Value.StreamCodec = new UnsafeStreamCodec(packet.Quality, packet.Monitor, packet.Resolution); if (client.Value.StreamCodec.ImageQuality != packet.Quality || client.Value.StreamCodec.Monitor != packet.Monitor || client.Value.StreamCodec.Resolution != packet.Resolution) { if (client.Value.StreamCodec != null) client.Value.StreamCodec.Dispose(); client.Value.StreamCodec = new UnsafeStreamCodec(packet.Quality, packet.Monitor, packet.Resolution); } using (MemoryStream ms = new MemoryStream(packet.Image)) { client.Value.FrmRdp.UpdateImage(client.Value.StreamCodec.DecodeData(ms), true); } packet.Image = null; if (client.Value != null && client.Value.FrmRdp != null && client.Value.FrmRdp.IsStarted) new GetDesktop(packet.Quality, packet.Monitor).Execute(client); }
public static void HandleGetDesktopResponse(Client client, GetDesktopResponse packet) { if (client.Value.FrmRdp == null) return; if (packet.Image == null) { if (client.Value.FrmRdp != null) client.Value.FrmRdp.UpdateImage(client.Value.LastDesktop); client.Value.LastDesktop = null; client.Value.LastDesktopSeen = true; return; } // we can not dispose all bitmaps here, cause they are later used again in `client.Value.LastDesktop` if (client.Value.LastDesktop == null) { if (client.Value.StreamCodec != null) { client.Value.StreamCodec.Dispose(); } client.Value.StreamCodec = new UnsafeStreamCodec(); if (client.Value.LastQuality != packet.Quality || client.Value.LastMonitor != packet.Monitor) { client.Value.LastQuality = packet.Quality; client.Value.LastMonitor = packet.Monitor; } using (MemoryStream ms = new MemoryStream(packet.Image)) { Bitmap newScreen = client.Value.StreamCodec.DecodeData(ms); client.Value.LastDesktop = newScreen; if (client.Value.FrmRdp != null) client.Value.FrmRdp.UpdateImage(newScreen, true); newScreen = null; } } else { using (MemoryStream ms = new MemoryStream(packet.Image)) { lock (client.Value.StreamCodec) { if (client.Value.LastQuality != packet.Quality || client.Value.LastMonitor != packet.Monitor) { if (client.Value.StreamCodec != null) { client.Value.StreamCodec.Dispose(); } client.Value.StreamCodec = new UnsafeStreamCodec(); client.Value.LastQuality = packet.Quality; client.Value.LastMonitor = packet.Monitor; } Bitmap newScreen = client.Value.StreamCodec.DecodeData(ms); client.Value.LastDesktop = newScreen; if (client.Value.FrmRdp != null) client.Value.FrmRdp.UpdateImage(newScreen, true); newScreen = null; } } } packet.Image = null; client.Value.LastDesktopSeen = true; }