sources/Google.Solutions.IapDesktop.Extensions.Session/ToolWindows/Session/SessionCommands.cs (249 lines of code) (raw):
//
// Copyright 2023 Google LLC
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
using Google.Solutions.Common.Util;
using Google.Solutions.IapDesktop.Application.Windows;
using Google.Solutions.IapDesktop.Core.ObjectModel;
using Google.Solutions.IapDesktop.Extensions.Session.Properties;
using Google.Solutions.Mvvm.Binding.Commands;
using Google.Solutions.Mvvm.Controls;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Google.Solutions.IapDesktop.Extensions.Session.ToolWindows.Session
{
[Service]
public class SessionCommands
{
public SessionCommands(ISessionBroker sessionBroker)
{
this.EnterFullScreenOnSingleScreen = new FullScreenCommand(
"&Full screen",
FullScreenMode.SingleScreen);
this.EnterFullScreenOnAllScreens = new FullScreenCommand(
"&Full screen (multiple displays)",
FullScreenMode.AllScreens);
this.Close = new CloseCommand();
this.ShowSecurityScreen = new ShowSecurityScreenCommand();
this.ShowTaskManager = new ShowTaskManagerCommand();
this.Logoff = new LogoffCommand();
this.Reconnect = new ReconnectCommand();
this.TypeClipboardText = new TypeClipboardTextCommand();
this.TransferFiles = new TransferFilesCommand();
this.CloseAll = new CloseAllCommand(sessionBroker);
this.CloseAllButThis = new CloseAllButThisCommand(sessionBroker);
}
//---------------------------------------------------------------------
// Context commands.
//---------------------------------------------------------------------
public IContextCommand<ISession> EnterFullScreenOnSingleScreen { get; }
public IContextCommand<ISession> EnterFullScreenOnAllScreens { get; }
public IContextCommand<ISession> Close { get; }
public IContextCommand<ISession> ShowSecurityScreen { get; }
public IContextCommand<ISession> ShowTaskManager { get; }
public IContextCommand<ISession> Logoff { get; }
public IContextCommand<ISession> Reconnect { get; }
public IContextCommand<ISession> TypeClipboardText { get; }
public IContextCommand<ISession> TransferFiles { get; }
public IContextCommand<ISession> CloseAll { get; }
public IContextCommand<ISession> CloseAllButThis { get; }
//---------------------------------------------------------------------
// Generic session commands.
//---------------------------------------------------------------------
private abstract class SessionCommandBase : MenuCommandBase<ISession>
{
protected SessionCommandBase(string text) : base(text)
{
}
protected override bool IsAvailable(ISession session)
{
return true; // Always available, but possibly disabled.
}
}
private class TransferFilesCommand : SessionCommandBase
{
public TransferFilesCommand()
: base("&Transfer files...")
{
this.Image = Resources.DownloadFile_16;
this.ActivityText = "Transferring files";
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session.IsConnected &&
session.CanTransferFiles;
}
public override Task ExecuteAsync(ISession session)
{
return session.TransferFilesAsync();
}
}
private class CloseCommand : SessionCommandBase
{
public CloseCommand()
: base("&Close")
{
this.Image = Resources.Disconnect_16;
this.ShortcutKeys = Keys.Control | Keys.F4;
this.ActivityText = "Disconnecting";
}
protected override bool IsEnabled(ISession session)
{
return session != null && session.IsConnected;
}
public override void Execute(ISession session)
{
session.Close();
}
}
private class CloseAllCommand : SessionCommandBase
{
private readonly ISessionBroker broker;
public CloseAllCommand(ISessionBroker broker)
: base("Close &all")
{
this.broker = broker.ExpectNotNull(nameof(broker));
}
protected override bool IsEnabled(ISession _)
{
return true;
}
public override void Execute(ISession _)
{
foreach (var session in this.broker.Sessions)
{
session.Close();
}
}
}
private class CloseAllButThisCommand : SessionCommandBase
{
private readonly ISessionBroker broker;
public CloseAllButThisCommand(ISessionBroker broker)
: base("Close &others")
{
this.broker = broker.ExpectNotNull(nameof(broker));
}
protected override bool IsEnabled(ISession _)
{
return true;
}
public override void Execute(ISession current)
{
foreach (var session in this.broker.Sessions)
{
if (session != current)
{
session.Close();
}
}
}
}
//---------------------------------------------------------------------
// RDP session commands.
//---------------------------------------------------------------------
private class FullScreenCommand : SessionCommandBase
{
private readonly FullScreenMode mode;
public FullScreenCommand(
string text,
FullScreenMode mode) : base(text)
{
this.mode = mode;
this.Image = Resources.Fullscreen_16;
this.ActivityText = "Activating full screen";
//
// NB. Don't set shortcut key here as the RDP control
// traps the key already.
//
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected &&
rdpSession.CanEnterFullScreen;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.TrySetFullscreen(this.mode);
}
}
private class ShowSecurityScreenCommand : SessionCommandBase
{
public ShowSecurityScreenCommand()
: base("Show &security screen (send Ctrl+Alt+Esc)")
{
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.ShowSecurityScreen();
}
}
private class ShowTaskManagerCommand : SessionCommandBase
{
public ShowTaskManagerCommand()
: base("Open &task manager (send Ctrl+Shift+Esc)")
{
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.ShowTaskManager();
}
}
private class LogoffCommand : SessionCommandBase
{
public LogoffCommand()
: base("Sign o&ut")
{
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.Logoff();
}
}
private class ReconnectCommand : SessionCommandBase
{
public ReconnectCommand()
: base("&Reconnect")
{
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.Reconnect();
}
}
private class TypeClipboardTextCommand : SessionCommandBase
{
public TypeClipboardTextCommand()
: base("&Type clipboard text")
{
}
protected override bool IsEnabled(ISession session)
{
return session != null &&
session is IRdpSession rdpSession &&
rdpSession.IsConnected;
}
public override void Execute(ISession session)
{
var rdpSession = (IRdpSession)session;
rdpSession.SendText(ClipboardUtil.GetText());
}
}
}
}