/*
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "unknwn.idl";
#endif

interface IStream;

cpp_quote("#define CPIOD_PEEK          0x40000000")
cpp_quote("#define CPIOD_FORCE_PROMPT  0x80000000")

[
  object,
  uuid(359f3443-bd4a-11d0-b188-00aa0038c969),
  pointer_default(unique)
]
interface IMLangCodePages : IUnknown
{
    HRESULT GetCharCodePages(      
        [in] WCHAR chSrc,
        [out] 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,
  uuid(359f3441-bd4a-11d0-b188-00aa0038c969),
  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,
  uuid(ae5f1430-388b-11d2-8380-00c04f8f5da1),
  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,
  uuid(dccfc162-2b38-11d2-b7ec-00c04f8f5d9a),
  pointer_default(unique)
]
interface IMLangFontLink2 : IMLangCodePages
{
    typedef struct tagUNICODERANGE
    {
        WCHAR wcFrom;
        WCHAR wcTo;
    } UNICODERANGE;

    typedef [unique] IMLangFontLink2 *PMLANGFONTLINK2;

    HRESULT GetFontCodePages(
        [in] HDC hDC,
        [in] HFONT hFont,
        [out] DWORD *pdwCodePages );

    HRESULT ReleaseFont(
        [in] HFONT hFont);

    HRESULT ResetFontMapping();

    HRESULT MapFont(
        [in] HDC hDC,
        [in] DWORD dwCodePages,
        [in] WCHAR chSrc,
        [out] HFONT *pFont);

    HRESULT GetFontUnicodeRanges(
        [in] HDC hDC,
        [in,out] UINT *puiRanges,
        [out] UNICODERANGE* pUranges);

    HRESULT GetScriptFontInfo(
        [in] SCRIPT_ID sid,
        [in] DWORD dwFlags,
        [in,out] UINT *puiFonts,
        [out] SCRIPTFONTINFO* pScriptFont);

    HRESULT CodePageToScriptID(
        [in] UINT uiCodePage,
        [out] SCRIPT_ID *pSid);
}

[
 object,
 uuid(c04d65ce-b70d-11d0-b188-00aa0038c969),
 pointer_default(unique)
]
interface IMLangString : IUnknown
{
#ifdef NEWMLSTR
    HRESULT LockMLStr(
        [in] LONG lPos,
        [in] DWORD dwFlags,
        [out] DWORD* pdwCookie,
        [out] LONG* plActualPos,
        [out] LONG* plActualLen);

    HRESULT UnlockMLStr(
        [in] DWORD dwCookie);
#else
    HRESULT Sync(
        [in] BOOL fNoAccess);
#endif
    HRESULT GetLength(
        [out, retval] LONG* plLen);
    HRESULT SetMLStr(
        [in] LONG lDestPos,
        [in] LONG lDestLen,
        [in] IUnknown *pSrcMLStr,
        [in] LONG lSrcPos,
        [in] LONG lSrcLen);
#ifdef NEWMLSTR
    HRESULT RegisterAttr(
        [in] IUnknown *pUnk,
        [out] DWORD* pdwCookie);
    HRESULT UnregisterAttr(
        [in] DWORD dwCookie);
    HRESULT EnumAttr(
        [out] IEnumUnknown **ppEnumUnk);
    HRESULT FindAttr(
        [in] REFIID riid,
        [in] LPARAM lParam,
        [out] IUnknown **ppUnk);
#else
    HRESULT GetMLStr(
        [in] LONG lSrcPos,
        [in] LONG lSrcLen,
        [in] IUnknown *pUnkOuter,
        [in] DWORD dwClsContext,
        [in] const IID* piid,
        [out] IUnknown** ppDestMLStr,
        [out] LONG* plDestPos,
        [out] LONG* plDestLen);
#endif
}

[
 object,
 uuid(f5be2ee1-bfd7-11d0-b188-00aa0038c969),
 pointer_default(unique)
]
interface IMLangLineBreakConsole : IUnknown
{
    HRESULT BreakLineML(
        [in] IMLangString* pSrcMLStr,
        [in] LONG lSrcPos,
        [in] LONG lSrcLen,
        [in] LONG cMinColumns,
        [in] LONG cMaxColumns,
        [out] LONG* plLineLen,
        [out] LONG* plSkipLen);

    HRESULT BreakLineW(
        [in] LCID locale,
        [in, size_is(cchSrc)] const WCHAR* pszSrc,
        [in] LONG cchSrc,
        [in] LONG cMaxColumns,
        [out] LONG* pcchLine,
        [out] LONG* pcchSkip );

    HRESULT BreakLineA(
        [in] LCID locale,
        [in] UINT uCodePage,
        [in, size_is(cchSrc)] const CHAR* pszSrc,
        [in] LONG cchSrc,
        [in] LONG cMaxColumns,
        [out] LONG* pcchLine,
        [out] LONG* pcchSkip);
}

[
  object,
  uuid(275c23e3-3747-11d0-9fea-00aa003f8646),
  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,
  uuid(d66d6f98-cdaa-11d0-b822-00c04fc9b31f),
  pointer_default(unique)
]
interface IMLangConvertCharset : IUnknown
{
    typedef enum tagMLCONVCHARF
    {
        MLCONVCHARF_AUTODETECT      = 1,
        MLCONVCHARF_ENTITIZE        = 2,
        MLCONVCHARF_NCR_ENTITIZE    = 2,
        MLCONVCHARF_NAME_ENTITIZE   = 4,
        MLCONVCHARF_USEDEFCHAR      = 8,
        MLCONVCHARF_NOBESTFITCHARS  = 16,
        MLCONVCHARF_DETECTJPN       = 32
    } MLCONVCHAR;

    typedef enum tagMLCPF
    {
        MLDETECTF_MAILNEWS              = 0x0001,
        MLDETECTF_BROWSER               = 0x0002,
        MLDETECTF_VALID                 = 0x0004,
        MLDETECTF_VALID_NLS             = 0x0008,
        MLDETECTF_PRESERVE_ORDER        = 0x0010,
        MLDETECTF_PREFERRED_ONLY        = 0x0020,
        MLDETECTF_FILTER_SPECIALCHAR    = 0x0040,
        MLDETECTF_EURO_UTF8             = 0x0080
    } MLCP;

    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);
}

[
    uuid(d66d6f99-cdaa-11d0-b822-00c04fc9b31f)
]
coclass CMLangConvertCharset
{
    [default] interface IMLangConvertCharset;
}

[
  object,
  uuid(3dc39d1d-c030-11d0-b81b-00c04fc9b31f),
  pointer_default(unique)
]
interface IEnumRfc1766 : IUnknown
{
    const USHORT MAX_RFC1766_NAME = 6;
    const USHORT MAX_LOCALE_NAME = 32;

    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,
  uuid(275c23e1-3747-11d0-9fea-00aa003f8646),
  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,
  uuid(dccfc164-2b38-11d2-b7ec-00c04f8f5d9a),
  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,size_is(cchWideChar)] 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(
        [in] UINT uiCodePage,
        [in] HWND hwnd,
        [in] DWORD dwfIODControl);
}

[
    object,
    uuid(4e5868ab-b157-4623-9acc-6a1d9caebe04),
    pointer_default(unique)
]
interface IMultiLanguage3 : IMultiLanguage2
{
    typedef [unique] IMultiLanguage3 *LPMULTILANGUAGE3;
    HRESULT DetectOutboundCodePage(
        [in] DWORD dwFlags,
        [in] LPCWSTR lpWideCharStr,
        [in] UINT cchWideChar,
        [in] UINT *puiPreferredCodePages,
        [in] UINT nPreferredCodePages,
        [in] UINT *puiDetectedCodePages,
        [in, out] UINT *pnDetectedCodePages,
        [in] WCHAR *lpSpecialChar);

    HRESULT DetectOutboundCodePageInIStream(
        [in] DWORD dwFlags,
        [in] IStream *pStrIn,
        [in] UINT *puiPreferredCodePages,
        [in] UINT nPreferredCodePages,
        [in] UINT *puiDetectedCodePages,
        [in, out] UINT *pnDetectedCodePages,
        [in] WCHAR *lpSpecialChar);
}

[
    uuid(275C23E2-3747-11d0-9FEA-00AA003f8646)
]
coclass CMultiLanguage
{
    [default] interface IMultiLanguage;
    interface IMLangCodePages;
    interface IMLangFontLink;
    /* interface IMLangLineBreakConsole; */
    interface IMLangFontLink2;
}

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 GetGlobalFontLinkObject(void **unknown);")
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);")