/*
 * Copyright (C) 2004 Mike McCormack
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

import "unknwn.idl";

interface IStream;

/* FIXME: LANDID is defined in winnt.h and mlang.h in the platform SDK */
cpp_quote("#ifndef __WINE_WINNT_H")
typedef WORD LANGID;
cpp_quote("#endif")

[
  object,
  pointer_default(unique)
]
interface IMLangCodePages : IUnknown
{
    HRESULT GetCharCodePages(      
        [in] WCHAR chSrc,
        DWORD *pdwCodePages);
    HRESULT GetStrCodePages(      
        [in, size_is(cchSrc)] const WCHAR *pszSrc,
        [in] long cchSrc,
        [in] DWORD dwPriorityCodePages,
        [out] DWORD *pdwCodePages,
        [out] long *pcchCodePages);
    HRESULT CodePageToCodePages(      
        [in] UINT uCodePage,
        [out] DWORD *pdwCodePages);
    HRESULT CodePagesToCodePage(      
        [in] DWORD dwCodePages,
        [in] UINT uDefaultCodePage,
        [out] UINT *puCodePage);
};

[
  object,
  pointer_default(unique)
]
interface IMLangFontLink : IMLangCodePages
{
    HRESULT GetFontCodePages(
        [in] HDC hDC,
        [in] HFONT hFont,
        [out] DWORD *pdwCodePages );

    HRESULT MapFont(      
        [in] HDC hDC,
        [in] DWORD dwCodePages,
        [in] HFONT hSrcFont,
        [out] HFONT *phDestFont);

    HRESULT ReleaseFont(      
        [in] HFONT hFont);

    HRESULT ResetFontMapping();
};

[
  object,
  pointer_default(unique)
]
interface IEnumScript : IUnknown
{
    const USHORT MAX_SCRIPT_NAME = 48;
    const USHORT MAX_MIMEFACE_NAME = 32;

    typedef BYTE SCRIPT_ID;
    typedef __int64 SCRIPT_IDS;

    typedef enum tagSCRIPTCONTF
    {
        sidDefault = 0,
        sidMerge = sidDefault + 1,
        sidAsciiSym = sidMerge + 1,
        sidAsciiLatin = sidAsciiSym + 1,
        sidLatin = sidAsciiLatin + 1,
        sidGreek = sidLatin + 1,
        sidCyrillic = sidGreek + 1,
        sidArmenian = sidCyrillic + 1,
        sidHebrew = sidArmenian + 1,
        sidArabic = sidHebrew + 1,
        sidDevanagari = sidArabic + 1,
        sidBengali = sidDevanagari + 1,
        sidGurmukhi = sidBengali + 1,
        sidGujarati = sidGurmukhi + 1,
        sidOriya = sidGujarati + 1,
        sidTamil = sidOriya + 1,
        sidTelugu = sidTamil + 1,
        sidKannada = sidTelugu + 1,
        sidMalayalam = sidKannada + 1,
        sidThai = sidMalayalam + 1,
        sidLao = sidThai + 1,
        sidTibetan = sidLao + 1,
        sidGeorgian = sidTibetan + 1,
        sidHangul = sidGeorgian + 1,
        sidKana = sidHangul + 1,
        sidBopomofo = sidKana + 1,
        sidHan = sidBopomofo + 1,
        sidEthiopic = sidHan + 1,
        sidCanSyllabic = sidEthiopic + 1,
        sidCherokee = sidCanSyllabic + 1,
        sidYi = sidCherokee + 1,
        sidBraille = sidYi + 1,
        sidRunic = sidBraille + 1,
        sidOgham = sidRunic + 1,
        sidSinhala = sidOgham + 1,
        sidSyriac = sidSinhala + 1,
        sidBurmese = sidSyriac + 1,
        sidKhmer = sidBurmese + 1,
        sidThaana = sidKhmer + 1,
        sidMongolian = sidThaana + 1,
        sidUserDefined = sidMongolian + 1,
        sidLim = sidUserDefined + 1,
        sidFEFirst = sidHangul,
        sidFELast = sidHan
    } SCRIPTCONTF;

    typedef enum tagSCRIPTFONTCONTF
    {
        SCRIPTCONTF_FIXED_FONT = 0x1,
        SCRIPTCONTF_PROPORTIONAL_FONT = 0x2,
        SCRIPTCONTF_SCRIPT_USER = 0x10000,
        SCRIPTCONTF_SCRIPT_HIDE = 0x20000,
        SCRIPTCONTF_SCRIPT_SYSTEM = 0x40000
    } SCRIPTFONTCONTF;

    typedef struct tagSCRIPFONTINFO
    {
        SCRIPT_IDS scripts;
        WCHAR wszFont[MAX_MIMEFACE_NAME];
    } SCRIPTFONTINFO, *PSCRIPTFONTINFO;

    typedef struct tagSCRIPTINFO {
        SCRIPT_ID ScriptId;
        UINT uiCodePage;
        WCHAR wszDescription[MAX_SCRIPT_NAME];
        WCHAR wszFixedWidthFont[MAX_MIMEFACE_NAME];
        WCHAR wszProportionalFont[MAX_MIMEFACE_NAME];
    } SCRIPTINFO, *PSCRIPTINFO;

    HRESULT Clone( 
        [out] IEnumScript **ppEnum);

    HRESULT Next(      
        [in] ULONG celt,
        [out] PSCRIPTINFO rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Reset();

    HRESULT Skip(      
        [in] ULONG celt);
};

[
  object,
  pointer_default(unique)
]
interface IEnumCodePage : IUnknown
{
    const USHORT MAX_MIMECP_NAME = 64;
    const USHORT MAX_MIMECSET_NAME = 50;

    typedef enum tagMIMECONTF
    {
        MIMECONTF_MAILNEWS = 0x00000001,
        MIMECONTF_BROWSER = 0x00000002,
        MIMECONTF_MINIMAL = 0x00000004,
        MIMECONTF_IMPORT = 0x00000008,
        MIMECONTF_SAVABLE_MAILNEWS = 0x00000100,
        MIMECONTF_SAVABLE_BROWSER = 0x00000200,
        MIMECONTF_EXPORT = 0x00000400,
        MIMECONTF_PRIVCONVERTER = 0x00010000,
        MIMECONTF_VALID = 0x00020000,
        MIMECONTF_VALID_NLS = 0x00040000,
        MIMECONTF_MIME_IE4 = 0x10000000,
        MIMECONTF_MIME_LATEST = 0x20000000,
        MIMECONTF_MIME_REGISTRY = 0x40000000
    } MIMECONTF;

    typedef struct tagMIMECPINFO {
        DWORD dwFlags;
        UINT uiCodePage;
        UINT uiFamilyCodePage;
        WCHAR wszDescription[MAX_MIMECP_NAME];
        WCHAR wszWebCharset[MAX_MIMECSET_NAME];
        WCHAR wszHeaderCharset[MAX_MIMECSET_NAME];
        WCHAR wszBodyCharset[MAX_MIMECSET_NAME];
        WCHAR wszFixedWidthFont[MAX_MIMEFACE_NAME];
        WCHAR wszProportionalFont[MAX_MIMEFACE_NAME];
        BYTE bGDICharset;
    } MIMECPINFO, *PMIMECPINFO;

    typedef struct tagMIMECSETINFO
    {
        UINT uiCodePage;
        UINT uiInternetEncoding;
        WCHAR wszCharset[MAX_MIMECSET_NAME];
    } MIMECSETINFO, *PMIMECSETINFO;

    HRESULT Clone( 
        [out] IEnumCodePage **ppEnum);

    HRESULT Next(      
        [in] ULONG celt,
        [out] PMIMECPINFO rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Reset();

    HRESULT Skip(      
        [in] ULONG celt);
};

[
  object,
  pointer_default(unique)
]
interface IMLangConvertCharset : IUnknown
{
    HRESULT Initialize(      
        [in] UINT uiSrcCodePage,
        [in] UINT uiDstCodePage,
        [in] DWORD dwProperty);

    HRESULT GetSourceCodePage(      
        [out] UINT *puiSrcCodePage);

    HRESULT GetDestinationCodePage(      
        [out] UINT *puiDstCodePage);

    HRESULT GetProperty(      
        [out] DWORD *pdwProperty);

    HRESULT DoConversion(      
        [in] BYTE *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] BYTE *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT DoConversionToUnicode(      
        [in] CHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] WCHAR *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT DoConversionFromUnicode(      
        [in] WCHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] CHAR *pDstStr,
        [in,out] UINT *pcDstSize);
};

[
  object,
  pointer_default(unique)
]
interface IEnumRfc1766 : IUnknown
{
    typedef struct tagRFC1766INFO
    {
        LCID lcid;
        WCHAR wszRfc1766[MAX_RFC1766_NAME];
        WCHAR wszLocaleName[MAX_LOCALE_NAME];
    } RFC1766INFO, *PRFC1766INFO;

    HRESULT Clone( 
        [out] IEnumRfc1766 **ppEnum);

    HRESULT Next(      
        [in] ULONG celt,
        [out] PRFC1766INFO rgelt,
        [out] ULONG *pceltFetched);

    HRESULT Reset();

    HRESULT Skip(      
        [in] ULONG celt);
};

[
  object,
  pointer_default(unique)
]
interface IMultiLanguage : IUnknown
{
    HRESULT GetNumberOfCodePageInfo(      
        [out] UINT *pcCodePage);

    HRESULT GetCodePageInfo(      
        [in] UINT uiCodePage,
        [out] PMIMECPINFO pCodePageInfo);

    HRESULT GetFamilyCodePage(      
        [in] UINT uiCodePage,
        [out] UINT *puiFamilyCodePage);

    HRESULT EnumCodePages(      
        [in] DWORD grfFlags,
        [out] IEnumCodePage **ppEnumCodePage);

    HRESULT GetCharsetInfo(      
        [in] BSTR Charset,
        [in] PMIMECSETINFO pCharsetInfo);

    HRESULT IsConvertible(      
        [in] DWORD dwSrcEncoding,
        [in] DWORD dwDstEncoding);

    HRESULT ConvertString(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwSrcEncoding,
        [in] DWORD dwDstEncoding,
        [in] BYTE *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] BYTE *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringToUnicode(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] CHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] WCHAR *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringFromUnicode(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] WCHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] CHAR *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringReset();

    HRESULT GetRfc1766FromLcid(      
        [in] LCID Locale,
        [out] BSTR *pbstrRfc1766);

    HRESULT GetLcidFromRfc1766(      
        [out] LCID *pLocale,
        [in] BSTR bstrRfc1766);

    HRESULT EnumRfc1766(      
        [out] IEnumRfc1766 **ppEnumRfc1766);

    HRESULT GetRfc1766Info(      
        [in] LCID Locale,
        [out] PRFC1766INFO pRfc1766Info);

    HRESULT CreateConvertCharset(      
        [in] UINT uiSrcCodePage,
        [in] UINT uiDstCodePage,
        [in] DWORD dwProperty,
        [out] IMLangConvertCharset **ppMLangConvertCharset);

};

[
  object,
  pointer_default(unique)
]
interface IMultiLanguage2 : IUnknown
{
    typedef struct tagDetectEncodingInfo
    {
        UINT nLangID;
        UINT nCodePage;
        INT nDocPercent;
        INT nConfidence;
    } DetectEncodingInfo, *pDetectEncodingInfo;

    HRESULT GetNumberOfCodePageInfo(      
        [out] UINT *pcCodePage);

    HRESULT GetCodePageInfo(      
        [in] UINT uiCodePage,
        [in] LANGID LangId,
        [out] PMIMECPINFO pCodePageInfo);

    HRESULT GetFamilyCodePage(      
        [in] UINT uiCodePage,
        [out] UINT *puiFamilyCodePage);

    HRESULT EnumCodePages(      
        [in] DWORD grfFlags,
        [in] LANGID LangId,
        [out] IEnumCodePage **ppEnumCodePage);

    HRESULT GetCharsetInfo(      
        [in] BSTR Charset,
        [in] PMIMECSETINFO pCharsetInfo);

    HRESULT IsConvertible(      
        [in] DWORD dwSrcEncoding,
        [in] DWORD dwDstEncoding);

    HRESULT ConvertString(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwSrcEncoding,
        [in] DWORD dwDstEncoding,
        [in] BYTE *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] BYTE *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringToUnicode(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] CHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] WCHAR *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringFromUnicode(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] WCHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] CHAR *pDstStr,
        [in,out] UINT *pcDstSize);

    HRESULT ConvertStringReset();

    HRESULT GetRfc1766FromLcid(      
        [in] LCID Locale,
        [out] BSTR *pbstrRfc1766);

    HRESULT GetLcidFromRfc1766(      
        [out] LCID *pLocale,
        [in] BSTR bstrRfc1766);

    HRESULT EnumRfc1766(      
        [in] LANGID LangId,
        [out] IEnumRfc1766 **ppEnumRfc1766);

    HRESULT GetRfc1766Info(      
        [in] LCID Locale,
        [in] LANGID LangId,
        [out] PRFC1766INFO pRfc1766Info);

    HRESULT CreateConvertCharset(      
        [in] UINT uiSrcCodePage,
        [in] UINT uiDstCodePage,
        [in] DWORD dwProperty,
        [out] IMLangConvertCharset **ppMLangConvertCharset);

    HRESULT ConvertStringInIStream(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwFlag,
        [in] WCHAR *lpFallBack,
        [in] DWORD dwSrcEncoding,
        [in] DWORD dwDstEncoding,
        [in] IStream *pstmIn,
        [in] IStream *pstmOut);

    HRESULT ConvertStringToUnicodeEx(      
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] CHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] WCHAR *pDstStr,
        [in,out] UINT *pcDstSize,
        [in] DWORD dwFlag,
        [in] WCHAR *lpFallBack);

    HRESULT ConvertStringFromUnicodeEx(
        [in,out] DWORD *pdwMode,
        [in] DWORD dwEncoding,
        [in] WCHAR *pSrcStr,
        [in,out] UINT *pcSrcSize,
        [in] CHAR *pDstStr,
        [in,out] UINT *pcDstSize,
        [in] DWORD dwFlag,
        [in] WCHAR *lpFallBack);

    HRESULT DetectCodepageInIStream(      
        [in] DWORD dwFlag,
        [in] DWORD dwPrefWinCodePage,
        [in] IStream *pstmIn,
        [in,out] DetectEncodingInfo *lpEncoding,
        [in,out] INT *pnScores);

    HRESULT DetectInputCodepage(      
        [in] DWORD dwFlag,
        [in] DWORD dwPrefWinCodePage,
        [in] CHAR *pSrcStr,
        [in,out] INT *pcSrcSize,
        [in,out] DetectEncodingInfo *lpEncoding,
        [in,out] INT *pnScores);

    HRESULT ValidateCodePage(
        [in] UINT uiCodePage,
        [in] HWND hwnd);

    HRESULT GetCodePageDescription(      
        [in] UINT uiCodePage,
        [in] LCID lcid,
        [in,out] LPWSTR lpWideCharStr,
        [in] int cchWideChar);

    HRESULT IsCodePageInstallable(
        [in] UINT uiCodePage);

    HRESULT SetMimeDBSource(      
        [in] MIMECONTF dwSource);

    HRESULT GetNumberOfScripts(      
        [out] UINT *pnScripts);

    HRESULT EnumScripts(      
        [in] DWORD dwFlags,
        [in] LANGID LangId,
        [out] IEnumScript **ppEnumScript);

    HRESULT ValidateCodePageEx( /* undocumented on MSDN */
        [in] UINT uiCodePage,
        [in] HWND hwnd,
        [in] DWORD dwfIODControl);
};

cpp_quote("STDAPI LcidToRfc1766A(LCID, LPSTR, INT);")
cpp_quote("STDAPI LcidToRfc1766W(LCID, LPWSTR, INT);")
cpp_quote("#define LcidToRfc1766 WINELIB_NAME_AW(LcidToRfc1766)")

cpp_quote("STDAPI Rfc1766ToLcidA(LCID *, LPCSTR);")
cpp_quote("STDAPI Rfc1766ToLcidW(LCID *, LPCWSTR);")
cpp_quote("#define Rfc1766ToLcid WINELIB_NAME_AW(Rfc1766ToLcid)")

cpp_quote("STDAPI IsConvertINetStringAvailable(DWORD, DWORD);")
cpp_quote("STDAPI ConvertINetString(LPDWORD, DWORD, DWORD, LPCSTR, LPINT, LPSTR, LPINT);")
cpp_quote("STDAPI ConvertINetMultiByteToUnicode(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);")
cpp_quote("STDAPI ConvertINetUnicodeToMultiByte(LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT);")

cpp_quote("DEFINE_GUID(CLSID_CMultiLanguage, 0x275c23e2, 0x3747, 0x11d0, 0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);")
cpp_quote("DEFINE_GUID(IID_IMLangCodePages, 0x359F3443,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);")
cpp_quote("DEFINE_GUID(IID_IMLangFontLink, 0x359F3441,0xBD4A,0x11D0,0xB1,0x88,0x00,0xAA,0x00,0x38,0xC9,0x69);")
cpp_quote("DEFINE_GUID(IID_IMultiLanguage2, 0xDCCFC164,0x2B38,0x11d2,0xB7,0xEC,0x00,0xC0,0x4F,0x8F,0x5D,0x9A);")
cpp_quote("DEFINE_GUID(IID_IMultiLanguage, 0x275c23e1,0x3747,0x11d0,0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);")
cpp_quote("DEFINE_GUID(IID_IEnumCodePage, 0x275c23e3,0x3747,0x11d0,0x9f,0xea,0x00,0xaa,0x00,0x3f,0x86,0x46);")
cpp_quote("DEFINE_GUID(IID_IEnumScript, 0xae5f1430,0x388b,0x11d2,0x83,0x80,0x00,0xc0,0x4f,0x8f,0x5d,0xa1);")
