/*
 * 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( /* undocumented on MSDN */
        [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);")
