// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import "oaidl.idl";
import "ocidl.idl";

[
  object,
  uuid(e051a481-6345-4ba1-bdb1-cf7929955268),
  dual,
  nonextensible,
  helpstring("IDaemonControl Interface"),
  pointer_default(unique)
]
interface IDaemonControl : IDispatch {
  [ id(1), helpstring("Returns a filtered copy of the daemon's configuration. "
                      "Only 'host_id' and 'xmpp_login' values are returned, "
                      "because any other values may contain security-sensitive "
                      "information.") ]
  HRESULT GetConfig([out, retval] BSTR* config_out);

  [ id(2), helpstring("Returns a string representing the version of "
                      "the daemon.") ]
  HRESULT GetVersion([out, retval] BSTR* version_out);

  [ id(3), helpstring("Replaces the existing daemon's configuration with "
                      "the specified settings.") ]
  HRESULT SetConfig([in] BSTR config);

  [ id(4), helpstring("Sets the owner window for any windows shown by "
                      "the daemon controller.") ]
  HRESULT SetOwnerWindow([in] LONG_PTR owner_window);

  [ id(5), helpstring("Starts the daemon.") ]
  HRESULT StartDaemon();

  [ id(6), helpstring("Stops the daemon.") ]
  HRESULT StopDaemon();

  [ id(7), helpstring("Modifies the existing daemon's configuration by "
                      "merging it with the specified settings. The 'host_id' "
                      "and 'xmpp_login' values cannot be modified, and must "
                      "not be passed to this method.") ]
  HRESULT UpdateConfig([in] BSTR config);
};

[
  object,
  uuid(655bd819-c08c-4b04-80c2-f160739ff6ef),
  dual,
  nonextensible,
  helpstring("IDaemonControl2 Interface"),
  pointer_default(unique)
]
interface IDaemonControl2 : IDaemonControl {
  [ id(8), helpstring("Retrieves the user's consent to collect crash dumps "
                      "and gather usage statistics.") ]
  HRESULT GetUsageStatsConsent([out] BOOL* allowed,
                               [out] BOOL* set_by_policy);

  [ id(9), helpstring("Records the user's consent to collect crash dumps "
                      "and gather usage statistics.") ]
  HRESULT SetUsageStatsConsent([in] BOOL allowed);
};

[
  object,
  uuid(b59b96da-83cb-40ee-9b91-c377400fc3e3),
  nonextensible,
  helpstring("IRdpDesktopSessionEventHandler Interface"),
  pointer_default(unique)
]
interface IRdpDesktopSessionEventHandler : IUnknown {
  [ id(1), helpstring("Notifies that an RDP connection has been established "
                      "successfully.") ]
  HRESULT OnRdpConnected();

  [ id(2), helpstring("Notifies the delegate that the RDP connection has been "
                      "closed.") ]
  HRESULT OnRdpClosed();
};

[
  object,
  uuid(6a7699f0-ee43-43e7-aa30-a6738f9bd470),
  nonextensible,
  helpstring("IRdpDesktopSession Interface"),
  pointer_default(unique)
]
interface IRdpDesktopSession : IUnknown {
  [ id(1), helpstring("Initiates a loopback RDP connection to spawn a new "
                      "Windows session. |width| and |height| specify the "
                      "initial screen resolution. |terminal_id| specifies a "
                      "unique value to be used to identify this connection.") ]
  HRESULT Connect([in] long width, [in] long height, [in] BSTR terminal_id,
                  [in] IRdpDesktopSessionEventHandler* event_handler);

  [ id(2), helpstring("Shuts down the connection created by Connect().") ]
  HRESULT Disconnect();

  [ id(3), helpstring("Changes the screen resolution.") ]
  HRESULT ChangeResolution([in] long width, [in] long height);

  [ id(4), helpstring("Sends Secure Attention Sequence to the session.") ]
  HRESULT InjectSas();
};

[
  uuid(b6396c45-b0cc-456b-9f49-f12964ee6df4),
  version(1.0),
  helpstring("Chromoting 1.0 Type Library")
]
library ChromotingLib {
  importlib("stdole2.tlb");

  [
    uuid(@DAEMON_CONTROLLER_CLSID@),
    helpstring("ElevatedController Class")
  ]
  coclass ElevatedController {
    [default] interface IDaemonControl2;
  };

  [
    uuid(@RDP_DESKTOP_SESSION_CLSID@),
    helpstring("RdpDesktopSession Class")
  ]
  coclass RdpDesktopSession {
    [default] interface IRdpDesktopSession;
  };
};
