chromium/remoting/host/win/rdp_desktop_session.h

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_HOST_WIN_RDP_DESKTOP_SESSION_H_
#define REMOTING_HOST_WIN_RDP_DESKTOP_SESSION_H_

#include <wrl/client.h>

#include <memory>

#include "base/win/atl.h"
// chromoting_lib.h contains MIDL-generated declarations.
#include "remoting/host/win/chromoting_lib.h"
#include "remoting/host/win/rdp_client.h"

namespace remoting {

// Implements IRdpDesktopSession interface providing a way to host RdpClient
// objects in a COM component.
class __declspec(uuid(RDP_DESKTOP_SESSION_CLSID)) RdpDesktopSession
    : public ATL::CComObjectRootEx<ATL::CComSingleThreadModel>,
      public ATL::CComCoClass<RdpDesktopSession, &__uuidof(RdpDesktopSession)>,
      public IRdpDesktopSession,
      public RdpClient::EventHandler {
 public:
  // Declare a class factory which must not lock the ATL module. This is the
  // same as DECLARE_CLASSFACTORY() with the exception that
  // ATL::CComObjectNoLock is used unconditionally.
  //
  // By default ATL generates locking class factories (by wrapping them in
  // ATL::CComObjectCached) for classes hosted in a DLL. This class is compiled
  // into a DLL but it is registered as an out-of-process class, so its class
  // factory should not use locking.
  typedef ATL::CComCreator<ATL::CComObjectNoLock<ATL::CComClassFactory>>
      _ClassFactoryCreatorClass;

  RdpDesktopSession();
  ~RdpDesktopSession() override;

  // IRdpDesktopSession implementation.
  STDMETHOD(Connect)
  (long width,
   long height,
   long dpi_x,
   long dpi_y,
   BSTR terminal_id,
   DWORD port_number,
   IRdpDesktopSessionEventHandler* event_handler) override;
  STDMETHOD(Disconnect)() override;
  STDMETHOD(ChangeResolution)
  (long width, long height, long dpi_x, long dpi_y) override;
  STDMETHOD(InjectSas)() override;

  DECLARE_NO_REGISTRY()

 private:
  // RdpClient::EventHandler interface.
  void OnRdpConnected() override;
  void OnRdpClosed() override;

  BEGIN_COM_MAP(RdpDesktopSession)
  COM_INTERFACE_ENTRY(IRdpDesktopSession)
  COM_INTERFACE_ENTRY(IUnknown)
  END_COM_MAP()

  // Implements loading and instantiation of the RDP ActiveX client.
  std::unique_ptr<RdpClient> client_;

  // Holds a reference to the caller's EventHandler, through which notifications
  // are dispatched. Released in Disconnect(), to prevent further notifications.
  Microsoft::WRL::ComPtr<IRdpDesktopSessionEventHandler> event_handler_;

  DECLARE_PROTECT_FINAL_CONSTRUCT()
};

}  // namespace remoting

#endif  // REMOTING_HOST_WIN_RDP_DESKTOP_SESSION_H_