// Copyright (c) 2013 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.

#ifndef CHROME_TEST_CHROMEDRIVER_KEYCODE_TEXT_CONVERSION_H_
#define CHROME_TEST_CHROMEDRIVER_KEYCODE_TEXT_CONVERSION_H_

#include <string>

#include "base/strings/string16.h"
#include "build/build_config.h"
#include "ui/events/keycodes/keyboard_codes.h"

// These functions only support conversion of characters in the BMP
// (Basic Multilingual Plane).

// Coverts a key code and modifiers to the UTF8 text that would be produced
// with the current keyboard layout, or "" if no character would be produced.
// Returns "" if the produced text contains characters outside the BMP. If an
// error occurs |error_msg| will be set to the error message and will return
// false.
bool ConvertKeyCodeToText(ui::KeyboardCode key_code,
                          int modifiers,
                          std::string* text,
                          std::string* error_msg);

// Converts a character to the key code and modifiers that would produce
// the character using the current keyboard layout. Returns true on success.
// If an error occurs |error_msg| will be set to the error message, otherwise
// it will be set to the empty string.
bool ConvertCharToKeyCode(base::char16 key,
                          ui::KeyboardCode* key_code,
                          int *necessary_modifiers,
                          std::string* error_msg);

#if defined(OS_WIN)
bool SwitchToUSKeyboardLayout();
#endif

#if defined(USE_X11)
// Use the ozone implementation when there is no X display.
bool ConvertKeyCodeToTextOzone(ui::KeyboardCode key_code,
                               int modifiers,
                               std::string* text,
                               std::string* error_msg);
bool ConvertCharToKeyCodeOzone(base::char16 key,
                               ui::KeyboardCode* key_code,
                               int* necessary_modifiers,
                               std::string* error_msg);
#endif

#endif  // CHROME_TEST_CHROMEDRIVER_KEYCODE_TEXT_CONVERSION_H_
