/*
 * Win16 BiDi functions
 * Copyright 2000 Erez Volk
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 * NOTE: Right now, most of these functions do nothing.
 */

#include <stdarg.h>
#include <string.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "wine/winuser16.h"
#include "winerror.h"
#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(relay);

/***********************************************************************
 *		ChangeDialogTemplate   (USER.905)
 * FIXME: The prototypes of this function have not been found yet.
 */
LONG WINAPI ChangeDialogTemplate16(void) { FIXME("stub (no prototype)\n"); return 0; }

/***********************************************************************
 *		BiDiMessageBoxEx   (USER.910)
 * FIXME: The prototypes of this function have not been found yet.
 */
LONG WINAPI BiDiMessageBoxEx16(void) { FIXME("stub (no prototype)\n"); return 0; }


/******************************************************************************
 *                    ChangeKeyboardCodePage [USER.924]
 * Change the keyboard layouts to a new pair.
 * If the language IDs are set to -1, the language is not to be changed.
 */
DWORD WINAPI ChangeKeyboardCodePage16( UINT16 iLangLeft, UINT16 iLangRight )
{
    FIXME( "( %hu, %hu ): stub\n", iLangLeft, iLangRight );
    return 0;
}


/******************************************************************************
 *                    ChangeKeyboardLanguage [USER.912]
 * Change the keyboard layouts to a new pair.
 *
 * RETURNS
 *    The old keyboard layout pair.
 */
DWORD WINAPI ChangeKeyboardLanguage16( UINT16 iLangLeft, UINT16 iLangRight )
{
    FIXME( "( %hu, %hu ): stub\n", iLangLeft, iLangRight );
    return 0;
}


/******************************************************************************
 *                    CreateDialogIndirectParamML [USER.916]
 */
HWND16 WINAPI CreateDialogIndirectParamML16( HINSTANCE16 hinstWnd,
                                             const void * lpvDlgTmp,
                                             HWND16 hwndOwner,
                                             DLGPROC16 dlgProc,
                                             LPARAM lParamInit,
                                             UINT16 iCodePage, UINT16 iLang,
                                             LPCSTR lpDlgName,
                                             HINSTANCE16 hinstLoad )
{
    FIXME( "( %04hx, %p, %04hx, %p, %08lx, %hu, %hu, %p, %04hx ): stub\n",
           hinstWnd, lpvDlgTmp, hwndOwner, dlgProc, lParamInit,
           iCodePage, iLang, lpDlgName, hinstLoad );
    return 0;
}


/******************************************************************************
 *                    DialogBoxIndirectParamML [USER.918]
 */
HWND16 WINAPI DialogBoxIndirectParamML16( HINSTANCE16 hinstWnd,
                                          HGLOBAL16 hglbDlgTemp,
                                          HWND16 hwndOwner,
                                          DLGPROC16 dlgprc,
                                          LPARAM lParamInit,
                                          UINT16 iCodePage, UINT16 iLang,
                                          LPCSTR lpDlgName,
                                          HINSTANCE16 hinstLoad )
{
    FIXME( "( %04hx, %04hx, %04hx, %p, %08lx, %hu, %hu, %p, %04hx ): stub\n",
           hinstWnd, hglbDlgTemp, hwndOwner, dlgprc, lParamInit,
           iCodePage, iLang, lpDlgName, hinstLoad );
    return 0;
}



/******************************************************************************
 *                    FindLanguageResource [USER.923]
 */
HRSRC16 WINAPI FindLanguageResource16( HINSTANCE16 hinst, LPCSTR lpRes,
                                       LPCSTR lpResType, UINT16 iLang )
{
    FIXME( "( %04hx, %p, %p, %hu ): stub\n", hinst, lpRes, lpResType, iLang );
    return 0;
}


/******************************************************************************
 *                    GetAppCodePage [USER.915]
 * Returns the code page and language of the window
 *
 * RETURNS
 *    The low word contains the code page, the high word contains the resource language.
 */
DWORD WINAPI GetAppCodePage16( HWND16 hwnd )
{
    FIXME( "( %04hx ): stub\n", hwnd );
    return 0;
}


/******************************************************************************
 *                    GetBaseCodePage [USER.922]
 * Returns the base code page and resource language.
 * For example, Hebrew windows will return HebrewCodePage in the low word
 * and English in the high word.
 */
DWORD WINAPI GetBaseCodePage16( void )
{
    FIXME( ": stub\n" );
    return 0;
}



/******************************************************************************
 *                    GetCodePageSystemFont [USER.913]
 * Returns the stock font for the requested code page.
 */
HFONT16 WINAPI GetCodePageSystemFont16( UINT16 iFont, UINT16 iCodePage )
{
    FIXME( "( %hu, %hu ): stub\n", iFont, iCodePage );
    return 0;
}



/******************************************************************************
 *                    GetLanguageName [USER.907]
 * Returns the name of one language in (possibly) a different language.
 * Currently only handles language 0 (english).
 *
 * RETURNS
 *    Success: The number of bytes copied to the buffer, not including the null.
 *    Failure: 0
 */
UINT WINAPI GetLanguageName16( UINT16 iLang, UINT16 iName,
                               LPSTR lpszName, UINT16 cbBuffer )
{
    if ( (iLang == 0) && (iName == 0) ) {
        if ( !lpszName || cbBuffer < 8 ) {
            SetLastError( ERROR_INVALID_PARAMETER );
            return 0;
        }
        strcpy( lpszName, "English" );
        return 7;
    }

    FIXME( "( %hu, %hu, %p, %hu ): No BiDi16\n", iLang, iName, lpszName, cbBuffer );
    return 0;
}


/******************************************************************************
 *                    GetNumLanguages [USER.906]
 * Returns the number of languages in the system.
 */
UINT WINAPI GetNumLanguages16( void )
{
    FIXME( ": No Bidi16\n" );
    return 1;
}



/******************************************************************************
 *                    GetProcessDefaultLayout [USER.1001]
 *
 * Gets the default layout for parentless windows.
 * Right now, just returns 0 (left-to-right).
 *
 * RETURNS
 *    Success: Nonzero
 *    Failure: Zero
 */
BOOL16 WINAPI GetProcessDefaultLayout16( DWORD *pdwDefaultLayout )
{
    FIXME( "( %p ): no BiDi16\n", pdwDefaultLayout );
    return GetProcessDefaultLayout( pdwDefaultLayout );
}


/******************************************************************************
 *                   LoadLanguageString [USER.919]
 * Loads a string for a specific language.
 *
 * RETURNS
 *    SUCCESS: The length of the string loaded.
 *    FAILURE: Zero.
 */
UINT16 WINAPI LoadLanguageString16( HINSTANCE16 hinst, UINT16 id, UINT16 iLang,
                                    LPSTR lpszText, INT16 nBytes )
{
    FIXME( "( %04hx, %hu, %hu, %p, %hd ): stub\n", hinst, id, iLang, lpszText, nBytes );
    return 0;
}



/******************************************************************************
 *                   LoadSystemLanguageString [USER.902]
 * Loads a string which is in one of the system language modules.
 *
 * RETURNS
 *    Success: The length of the string loaded
 *    Failure: Zero
 */
UINT WINAPI LoadSystemLanguageString16( HINSTANCE16 hinstCaller, UINT16 id,
                                        LPSTR lpszText, INT16 nBytes, UINT16 iLang )
{
    FIXME( "( %04hx, %hu, %p, %hd, %hu ): stub\n", hinstCaller, id, lpszText, nBytes, iLang );
    return 0;
}


/***********************************************************************
 *           MessageBoxEx [USER.930]
 * The multilingual version of MessageBox.
 */
INT16 WINAPI MessageBoxEx16( HWND16 hwndParent, LPCSTR lpszText,
                             LPCSTR lpszTitle, UINT16 fuStyle, UINT16 iLang )
{
    FIXME( "( %04hx, %p, %p, %hu, %hu ): stub\n", hwndParent, lpszText, lpszTitle,
           fuStyle, iLang );
    return 0;
}


/***********************************************************************
 *           QueryCodePage   [USER.914]
 * Query code page specific data.
 */
LRESULT WINAPI QueryCodePage16( UINT16 idxLang, UINT16 msg,
                                WPARAM16 wParam, LPARAM lParam )
{
    FIXME( "( %hu, %hu, %04hx, %08lx ): stub\n", idxLang, msg, wParam, lParam );
    return 0;
}

/***********************************************************************
 *           SetAppCodePage   [USER.920]
 * Set the code page and language of the window to new values.
 *
 * RETURNS
 *    The low word contains the old code page, the high word contains
 *       the old resource language.
 */
DWORD WINAPI SetAppCodePage16( HWND16 hwnd, UINT16 iCodePage, UINT16 iLang,
                               UINT16 fRedraw )
{
    FIXME( "( %04hx, %hu, %hu, %hu ): stub\n", hwnd, iCodePage, iLang, fRedraw );
    return 0;
}

/***********************************************************************
 *           SetDlgItemTextEx   [USER.911]
 * Sets the title or text of a control in a dialog box.
 * Currently only works for language 0 (english)
 */
void WINAPI SetDlgItemTextEx16( HWND16 hwnd, INT16 id,
                                LPCSTR lpszText, UINT16 iLang )
{
    FIXME( "( %04hx, %hd, %p, %hu ): stub\n", hwnd, id, lpszText, iLang );
}

/******************************************************************************
 *                    SetProcessDefaultLayout [USER.1000]
 *
 * Sets the default layout for parentless windows.
 * Right now, only accepts 0 (left-to-right).
 *
 * RETURNS
 *    Success: Nonzero
 *    Failure: Zero
 */
BOOL16 WINAPI SetProcessDefaultLayout16( DWORD dwDefaultLayout )
{
    FIXME( "( %08x ): No BiDi16\n", dwDefaultLayout );
    return SetProcessDefaultLayout( dwDefaultLayout );
}

/******************************************************************************
 *                    SetWindowTextEx [USER.909]
 * Sets the given window's title to the specified text in the specified language.
 */
void WINAPI SetWindowTextEx16( HWND16 hwnd, LPCSTR lpsz, UINT16 iLang )
{
    FIXME( "( %04hx, %p, %hu ): stub\n", hwnd, lpsz, iLang );
}
