/** Gets information on available services and their versions from Opera. */
  private HostInfo getHostInfo() {
    Response response = executeCommand(ScopeCommand.HOST_INFO, null);

    try {
      return HostInfo.parseFrom(response.getPayload());
    } catch (InvalidProtocolBufferException ex) {
      throw new WebDriverException("Error while parsing host info");
    }
  }
  /** Gets the supported services from Opera and calls methods to enable the ones we requested. */
  public void init() {
    waitState.setProfile(product);
    waitForHandshake();

    hostInfo = getHostInfo();
    createUmsServices(OperaFlags.ENABLE_DEBUGGER, hostInfo);

    connect();

    List<String> wantedServices = new ArrayList<String>();

    boolean ecmascriptService = false;
    for (Service service : hostInfo.getServiceListList()) {
      if (service.getName().equals("ecmascript")) {
        ecmascriptService = true;
        break;
      }
    }
    if (ecmascriptService) {
      wantedServices.add("ecmascript");
    } else {
      wantedServices.add("ecmascript-debugger");
    }

    wantedServices.add("exec");
    wantedServices.add("window-manager");
    wantedServices.add("core");

    if (versions.containsKey("prefs")) {
      wantedServices.add("prefs");
    }

    if (versions.containsKey("desktop-window-manager")) {
      wantedServices.add("desktop-window-manager");
    }

    if (versions.containsKey("system-input")) {
      wantedServices.add("system-input");
    }

    if (versions.containsKey("desktop-utils")) {
      wantedServices.add("desktop-utils");
    }

    if (versions.containsKey("selftest")) {
      wantedServices.add("selftest");
    }

    // wantedServices.add("console-logger");
    // wantedServices.add("http-logger");
    wantedServices.add("cookie-manager");

    enableServices(wantedServices);

    initializeServices(OperaFlags.ENABLE_DEBUGGER);
  }
  public boolean isOperaIdleAvailable() {
    for (ScopeProtos.Service service : hostInfo.getServiceListList()) {
      if (service.getName().equals("core")) {
        String version = service.getVersion();

        // Version 1.1 introduced some important fixes, and we don't want to use idle detection
        // without this.
        boolean ok = VersionUtil.compare(version, "1.1") >= 0;
        logger.finer("core service version check: " + ok + " (" + version + ")");
        return ok;
      }
    }

    logger.severe("core service not found");
    return false;
  }