// Copyright 2010-2015, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef MOZC_WIN32_BASE_INPUT_DLL_H_
#define MOZC_WIN32_BASE_INPUT_DLL_H_

#include <windows.h>

// Structures and flags bellow have not been included header files in Windows
// SDK.  You can see the original source of this information at the following
// page.
// - http://msdn.microsoft.com/en-us/library/bb847907.aspx
// - http://msdn.microsoft.com/en-us/library/bb847908.aspx

// Flags used in LAYOUTORTIP::dwFlags.
// Also might be used in LAYOUTORTIP::dwFlags based on observations.
#define LOT_DEFAULT    0x0001
#define LOT_DISABLED   0x0002

// Flags used in LAYOUTORTIPPROFILE::dwProfileType
#define LOTP_INPUTPROCESSOR  1
#define LOTP_KEYBOARDLAYOUT  2

// Flags used with InstallLayoutOrTipUserReg.
#define ILOT_UNINSTALL                 0x00000001
#define ILOT_DEFPROFILE                0x00000002
#define ILOT_NOAPPLYTOCURRENTSESSION   0x00000020
#define ILOT_CLEANINSTALL              0x00000040
#define ILOT_DISABLED                  0x00000080

// Flags used with SetDefaultLayoutOrTip.
#define SDLOT_NOAPPLYTOCURRENTSESSION  0x00000001
#define SDLOT_APPLYTOCURRENTTHREAD     0x00000002

// Structure used with EnumLayoutOrTipForSetup API.
typedef struct tagLAYOUTORTIP {
  DWORD dwFlags;
  WCHAR szId[MAX_PATH];
  WCHAR szName[MAX_PATH];
} LAYOUTORTIP;

// Structure used with EnumEnabledLayoutOrTip API.
typedef struct tagLAYOUTORTIPPROFILE {
  DWORD  dwProfileType;
  LANGID langid;
  CLSID  clsid;
  GUID   guidProfile;
  GUID   catid;
  DWORD  dwSubstituteLayout;
  DWORD  dwFlags;
  WCHAR  szId[MAX_PATH];
} LAYOUTORTIPPROFILE;

// Returns a function pointer to the EnumEnabledLayoutOrTip API, which
// is available on Vista or later via input.dll to enumerates all enabled
// keyboard layouts or text services of the specified user setting.
//
// EnumEnabledLayoutOrTip:
//   URL:
//     http://msdn.microsoft.com/en-us/library/bb847907.aspx
//   Return Value:
//     TRUE: The function was successful.
//     FALSE: An unspecified error occurred.
extern "C" __declspec(dllimport)
UINT WINAPI EnumEnabledLayoutOrTip(
    __in_opt  LPCWSTR pszUserReg,
    __in_opt  LPCWSTR pszSystemReg,
    __in_opt  LPCWSTR pszSoftwareReg,
    __out     LAYOUTORTIPPROFILE *pLayoutOrTipProfile,
    __in      UINT uBufLength);

// Returns a function pointer to the EnumEnabledLayoutOrTip API, which
// is available on Vista or later via input.dll to enumerates the installed
// keyboard layouts and text services.
//
// EnumLayoutOrTipForSetup:
//   URL:
//     http://msdn.microsoft.com/en-us/library/bb847908.aspx
//   Return Value:
//     |pLayoutOrTip == nullptr|
//        The number of elements to be returned.
//     |pLayoutOrTip != nullptr|
//        The number of elements actually copied to |pLayoutOrTip|.
extern "C" __declspec(dllimport)
UINT WINAPI EnumLayoutOrTipForSetup(
    __in                     LANGID langid,
    __out_ecount(uBufLength) LAYOUTORTIP *pLayoutOrTip,
    __in                     UINT uBufLength,
    __in                     DWORD dwFlags);

// Returns a function pointer to the InstallLayoutOrTip API, which is
// available on Vista or later via input.dll to enable the specified
// keyboard layouts or text services for the current user.
//
// InstallLayoutOrTip:
//   URL:
//     http://msdn.microsoft.com/en-us/library/bb847909.aspx
//   Remarks:
//     The string format of the layout list is:
//       <LangID 1>:<KLID 1>;[...<LangID N>:<KLID N>
//     The string format of the text service profile list is:
//       <LangID 1>:{CLSID of TIP}{GUID of LanguageProfile};
//     where GUID should be like {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
//     This format seems to be corresponding to the registry key, e.g.
//       HKLM\SOFTWARE\Microsoft\CTF\TIP\{CLSID of TIP}\LanguageProfile\
//       {Land ID}\{GUID of LanguageProfile}
//   Return Value:
//     TRUE: The function was successful.
//     FALSE: An unspecified error occurred.
extern "C" __declspec(dllimport)
BOOL WINAPI InstallLayoutOrTip(
    __in      LPCWSTR psz,
    __in      DWORD dwFlags);

// Returns a function pointer to the InstallLayoutOrTipUserReg API, which
// is available on Vista or later via input.dll to enable the specified
// keyboard layouts or text services for the specified user.
//
// InstallLayoutOrTipUserReg:
//   URL:
//     http://msdn.microsoft.com/en-us/library/bb847910.aspx
//   Remarks:
//     The string format of the layout list is:
//       <LangID 1>:<KLID 1>;[...<LangID N>:<KLID N>
//     The string format of the text service profile list is:
//       <LangID 1>:{CLSID of TIP}{GUID of LanguageProfile};
//     where GUID should be like {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
//     This format seems to be corresponding to the registry key, e.g.
//       HKLM\SOFTWARE\Microsoft\CTF\TIP\{CLSID of TIP}\LanguageProfile\
//       {Land ID}\{GUID of LanguageProfile}
//   Return Value:
//     TRUE: The function was successful.
//     FALSE: An unspecified error occurred.
//   Observational Facts:
//     Like ImmInstallIME API, calling InstallLayoutOrTipUserReg from 32-bit
//     process to install x64 binaries is not recommended.  Otherwise, we
//     will see some weird issues like b/2931871.
extern "C" __declspec(dllimport)
BOOL WINAPI InstallLayoutOrTipUserReg(
    __in_opt  LPCWSTR pszUserReg,
    __in_opt  LPCWSTR pszSystemReg,
    __in_opt  LPCWSTR pszSoftwareReg,
    __in      LPCWSTR psz,
    __in      DWORD dwFlags);

// Returns a function pointer to the SetDefaultLayoutOrTip API, which sets
// the specified keyboard layout or a text service as the default input item
// of the current user.
//
// SetDefaultLayoutOrTip:
//   URL:
//     http://msdn.microsoft.com/en-us/library/bb847915.aspx
//   Remarks:
//     The string format of the layout list is:
//       <LangID 1>:<KLID 1>;[...<LangID N>:<KLID N>
//     The string format of the text service profile list is:
//       <LangID 1>:{CLSID of TIP}{GUID of LanguageProfile};
//     where GUID should be like {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
//     This format seems to be corresponding to the registry key, e.g.
//       HKLM\SOFTWARE\Microsoft\CTF\TIP\{CLSID of TIP}\LanguageProfile\
//       {Land ID}\{GUID of LanguageProfile}
//   Return Value:
//     TRUE: The function was successful.
//     FALSE: An unspecified error occurred.
//   Observational Facts:
//     This API seems to be designed to modify per user settings, like HKCU,
//     so that the current user can modify it with his/her privileges.  In
//     oother words, no administrative privilege is required.
//     SetDefaultLayoutOrTipUserReg might be a phantom, which only exists in
//     MSDN Library.
//     This function returns fail if it is called to install an IME which is
//     not enabled (if we use undocumented terms to explain the condition,
//     "The IME is not listed in the Preload key").  It seems that the caller
//     is responsible to enable (e.g. calling InstallLayoutOrTipUserReg)
//     the target IME before call this function to set the IME default.
extern "C" __declspec(dllimport)
BOOL WINAPI SetDefaultLayoutOrTip(
    __in  LPCWSTR psz,
    DWORD dwFlags);

#endif  // MOZC_WIN32_BASE_INPUT_DLL_H_
