/*
 * 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;

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

[
  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
{
    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] 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);")
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);")
