#include "private.h"
const MIMERFC1766 MimeRfc1766[] =
{
    { 0x0436, L"af",    IDS_RFC1766_LCID0436 },
    { 0x041C, L"sq",    IDS_RFC1766_LCID041C },
    { 0x0001, L"ar",    IDS_RFC1766_LCID0001 },
    { 0x0401, L"ar-sa", IDS_RFC1766_LCID0401 },
    { 0x0801, L"ar-iq", IDS_RFC1766_LCID0801 },
    { 0x0C01, L"ar-eg", IDS_RFC1766_LCID0C01 },
    { 0x1001, L"ar-ly", IDS_RFC1766_LCID1001 },
    { 0x1401, L"ar-dz", IDS_RFC1766_LCID1401 },
    { 0x1801, L"ar-ma", IDS_RFC1766_LCID1801 },
    { 0x1C01, L"ar-tn", IDS_RFC1766_LCID1C01 },
    { 0x2001, L"ar-om", IDS_RFC1766_LCID2001 },
    { 0x2401, L"ar-ye", IDS_RFC1766_LCID2401 },
    { 0x2801, L"ar-sy", IDS_RFC1766_LCID2801 },
    { 0x2C01, L"ar-jo", IDS_RFC1766_LCID2C01 },
    { 0x3001, L"ar-lb", IDS_RFC1766_LCID3001 },
    { 0x3401, L"ar-kw", IDS_RFC1766_LCID3401 },
    { 0x3801, L"ar-ae", IDS_RFC1766_LCID3801 },
    { 0x3C01, L"ar-bh", IDS_RFC1766_LCID3C01 },
    { 0x4001, L"ar-qa", IDS_RFC1766_LCID4001 },
    { 0x042D, L"eu",    IDS_RFC1766_LCID042D },
    { 0x0402, L"bg",    IDS_RFC1766_LCID0402 },
    { 0x0423, L"be",    IDS_RFC1766_LCID0423 },
    { 0x0403, L"ca",    IDS_RFC1766_LCID0403 },
    { 0x0004, L"zh",    IDS_RFC1766_LCID0004 },
    { 0x1404, L"zh-mo", IDS_RFC1766_LCID1404 },
    { 0x0404, L"zh-tw", IDS_RFC1766_LCID0404 },
    { 0x0804, L"zh-cn", IDS_RFC1766_LCID0804 },
    { 0x0C04, L"zh-hk", IDS_RFC1766_LCID0C04 },
    { 0x1004, L"zh-sg", IDS_RFC1766_LCID1004 },
    { 0x041A, L"hr",    IDS_RFC1766_LCID041A },
    { 0x0405, L"cs",    IDS_RFC1766_LCID0405 },
    { 0x0406, L"da",    IDS_RFC1766_LCID0406 },
    { 0x0413, L"nl",    IDS_RFC1766_LCID0413 },
    { 0x0813, L"nl-be", IDS_RFC1766_LCID0813 },
    { 0x0009, L"en",    IDS_RFC1766_LCID0009 },
    { 0x2409, L"en",    IDS_RFC1766_LCID2409 },
    { 0x0409, L"en-us", IDS_RFC1766_LCID0409 },
    { 0x0809, L"en-gb", IDS_RFC1766_LCID0809 },
    { 0x0C09, L"en-au", IDS_RFC1766_LCID0C09 },
    { 0x1009, L"en-ca", IDS_RFC1766_LCID1009 },
    { 0x1409, L"en-nz", IDS_RFC1766_LCID1409 },
    { 0x1809, L"en-ie", IDS_RFC1766_LCID1809 },
    { 0x1C09, L"en-za", IDS_RFC1766_LCID1C09 },
    { 0x3009, L"en-zw", IDS_RFC1766_LCID3009 },
    { 0x2009, L"en-jm", IDS_RFC1766_LCID2009 },
    { 0x2809, L"en-bz", IDS_RFC1766_LCID2809 },
    { 0x2C09, L"en-tt", IDS_RFC1766_LCID2C09 },
    { 0x3409, L"en-ph", IDS_RFC1766_LCID3409 },
    { 0x0425, L"et",    IDS_RFC1766_LCID0425 },
    { 0x0438, L"fo",    IDS_RFC1766_LCID0438 },
    { 0x0429, L"fa",    IDS_RFC1766_LCID0429 },
    { 0x040B, L"fi",    IDS_RFC1766_LCID040B },
    { 0x040C, L"fr",    IDS_RFC1766_LCID040C },
    { 0x080C, L"fr-be", IDS_RFC1766_LCID080C },
    { 0x0C0C, L"fr-ca", IDS_RFC1766_LCID0C0C },
    { 0x100C, L"fr-ch", IDS_RFC1766_LCID100C },
    { 0x140C, L"fr-lu", IDS_RFC1766_LCID140C },
    { 0x180C, L"fr-mc", IDS_RFC1766_LCID180C },
    { 0x043C, L"gd",    IDS_RFC1766_LCID043C },
    { 0x0407, L"de",    IDS_RFC1766_LCID0407 },
    { 0x0807, L"de-ch", IDS_RFC1766_LCID0807 },
    { 0x0C07, L"de-at", IDS_RFC1766_LCID0C07 },
    { 0x1007, L"de-lu", IDS_RFC1766_LCID1007 },
    { 0x1407, L"de-li", IDS_RFC1766_LCID1407 },
    { 0x0408, L"el",    IDS_RFC1766_LCID0408 },
    { 0x040D, L"he",    IDS_RFC1766_LCID040D },
    { 0x0439, L"hi",    IDS_RFC1766_LCID0439 },
    { 0x040E, L"hu",    IDS_RFC1766_LCID040E },
    { 0x040F, L"is",    IDS_RFC1766_LCID040F },
    { 0x0421, L"id",    IDS_RFC1766_LCID0421 },
    { 0x0410, L"it",    IDS_RFC1766_LCID0410 },
    { 0x0810, L"it-ch", IDS_RFC1766_LCID0810 },
    { 0x0411, L"ja",    IDS_RFC1766_LCID0411 },
    { 0x0412, L"ko",    IDS_RFC1766_LCID0412 },
    { 0x0426, L"lv",    IDS_RFC1766_LCID0426 },
    { 0x0427, L"lt",    IDS_RFC1766_LCID0427 },
    { 0x042F, L"mk",    IDS_RFC1766_LCID042F },
    { 0x043E, L"ms",    IDS_RFC1766_LCID043E },
    { 0x043A, L"mt",    IDS_RFC1766_LCID043A },
    { 0x0415, L"pl",    IDS_RFC1766_LCID0415 },
    { 0x0416, L"pt-br", IDS_RFC1766_LCID0416 },
    { 0x0816, L"pt",    IDS_RFC1766_LCID0816 },
    { 0x0417, L"rm",    IDS_RFC1766_LCID0417 },
    { 0x0418, L"ro",    IDS_RFC1766_LCID0418 },
    { 0x0818, L"ro-md", IDS_RFC1766_LCID0818 },
    { 0x0419, L"ru",    IDS_RFC1766_LCID0419 },
    { 0x0819, L"ru-md", IDS_RFC1766_LCID0819 },
    { 0x0C1A, L"sr",    IDS_RFC1766_LCID0C1A },
    { 0x081A, L"sr",    IDS_RFC1766_LCID081A },
    { 0x041B, L"sk",    IDS_RFC1766_LCID041B },
    { 0x0424, L"sl",    IDS_RFC1766_LCID0424 },
    { 0x042E, L"sb",    IDS_RFC1766_LCID042E },
    { 0x040A, L"es",    IDS_RFC1766_LCID040A },
    { 0x080A, L"es-mx", IDS_RFC1766_LCID080A },
    { 0x0C0A, L"es",    IDS_RFC1766_LCID0C0A },
    { 0x100A, L"es-gt", IDS_RFC1766_LCID100A },
    { 0x140A, L"es-cr", IDS_RFC1766_LCID140A },
    { 0x180A, L"es-pa", IDS_RFC1766_LCID180A },
    { 0x1C0A, L"es-do", IDS_RFC1766_LCID1C0A },
    { 0x200A, L"es-ve", IDS_RFC1766_LCID200A },
    { 0x240A, L"es-co", IDS_RFC1766_LCID240A },
    { 0x280A, L"es-pe", IDS_RFC1766_LCID280A },
    { 0x2C0A, L"es-ar", IDS_RFC1766_LCID2C0A },
    { 0x300A, L"es-ec", IDS_RFC1766_LCID300A },
    { 0x340A, L"es-cl", IDS_RFC1766_LCID340A },
    { 0x380A, L"es-uy", IDS_RFC1766_LCID380A },
    { 0x3C0A, L"es-py", IDS_RFC1766_LCID3C0A },
    { 0x400A, L"es-bo", IDS_RFC1766_LCID400A },
    { 0x440A, L"es-sv", IDS_RFC1766_LCID440A },
    { 0x480A, L"es-hn", IDS_RFC1766_LCID480A },
    { 0x4C0A, L"es-ni", IDS_RFC1766_LCID4C0A },
    { 0x500A, L"es-pr", IDS_RFC1766_LCID500A },
    { 0x0430, L"sx",    IDS_RFC1766_LCID0430 },
    { 0x041D, L"sv",    IDS_RFC1766_LCID041D },
    { 0x081D, L"sv-fi", IDS_RFC1766_LCID081D },
    { 0x041E, L"th",    IDS_RFC1766_LCID041E },
    { 0x0431, L"ts",    IDS_RFC1766_LCID0431 },
    { 0x0432, L"tn",    IDS_RFC1766_LCID0432 },
    { 0x041F, L"tr",    IDS_RFC1766_LCID041F },
    { 0x0422, L"uk",    IDS_RFC1766_LCID0422 },
    { 0x0420, L"ur",    IDS_RFC1766_LCID0420 },
    { 0x0443, L"uz",    IDS_RFC1766_LCID0443 },
    { 0x0843, L"uz",    IDS_RFC1766_LCID0843 },
    { 0x042A, L"vi",    IDS_RFC1766_LCID042A },
    { 0x0434, L"xh",    IDS_RFC1766_LCID0434 },
    { 0x043D, L"yi",    IDS_RFC1766_LCID043D },
    { 0x0435, L"zu",    IDS_RFC1766_LCID0435 },
    { 0x042B, L"hy",    IDS_RFC1766_LCID042B },
    { 0x0437, L"ka",    IDS_RFC1766_LCID0437 },
    { 0x043F, L"kk",    IDS_RFC1766_LCID043F },
    { 0x0441, L"sw",    IDS_RFC1766_LCID0441 },
    { 0x0444, L"tt",    IDS_RFC1766_LCID0444 },
    { 0x0445, L"bn",    IDS_RFC1766_LCID0445 },
    { 0x0446, L"pa",    IDS_RFC1766_LCID0446 },
    { 0x0447, L"gu",    IDS_RFC1766_LCID0447 },
    { 0x0448, L"or",    IDS_RFC1766_LCID0448 },
    { 0x0449, L"ta",    IDS_RFC1766_LCID0449 },
    { 0x044A, L"te",    IDS_RFC1766_LCID044A },
    { 0x044B, L"kn",    IDS_RFC1766_LCID044B },
    { 0x044C, L"ml",    IDS_RFC1766_LCID044C },
    { 0x044D, L"as",    IDS_RFC1766_LCID044D },
    { 0x044E, L"mr",    IDS_RFC1766_LCID044E },
    { 0x083E, L"ms",    IDS_RFC1766_LCID083E },
    { 0x0861, L"ne",    IDS_RFC1766_LCID0861 },
    { 0x044F, L"sa",    IDS_RFC1766_LCID044F },
//  Sync W2K NLS, remove 0x0827 RFC1766 entry
//  { 0x0827, L"lt",    IDS_RFC1766_LCID0827 },
    { 0x0457, L"kok",   IDS_RFC1766_LCID0457 },

// Following rfc1766 names are over already published MAX_RFC1766_NAME
// We have to modify them for IE5 release, will do better later

//  { 0x082C, L"x-az-cyrillic", IDS_RFC1766_LCID082C },
//  { 0x042C, L"x-az-latin",    IDS_RFC1766_LCID042C },
    { 0x0414, L"no",   IDS_RFC1766_LCID0414 },
    { 0x0414, L"nb-no",   IDS_RFC1766_LCID0414 },
    { 0x0814, L"nn-no",   IDS_RFC1766_LCID0814 },
    { 0x082C, L"az",    IDS_RFC1766_LCID082C },
    { 0x042C, L"az",    IDS_RFC1766_LCID042C },
// More stuffs from Whistler NLS
    { 0x0440, L"kz",    IDS_RFC1766_LCID0440 },
    { 0x0450, L"mn",    IDS_RFC1766_LCID0450 },
    { 0x0456, L"gl",    IDS_RFC1766_LCID0456 },
    { 0x045A, L"syr",   IDS_RFC1766_LCID045A },
    { 0x0465, L"div",   IDS_RFC1766_LCID0465 },
// Whistler bug#350772, for Hispanic US
    { 0x540A, L"es-us", IDS_RFC1766_LCID540A },
};

UINT g_cRfc1766 = ARRAYSIZE(MimeRfc1766);
//
//  CEnumCodePage implementation
//
CEnumCodePage::CEnumCodePage(DWORD grfFlags, LANGID LangId, MIMECONTF dwSource) : _dwLevel( grfFlags ), _LangId( LangId), dwMimeSource(dwSource)
{
    DebugMsg(DM_TRACE, TEXT("constructor of CEnumCodePage 0x%08x"), this);
    DllAddRef();

    _cRef = 1;
    _iCur = 0;
}

CEnumCodePage::~CEnumCodePage()
{
    DebugMsg(DM_TRACE, TEXT("destructor of CEnumCodePage 0x%08x"), this);
    DllRelease();
}

STDAPI CEnumCodePage::QueryInterface(REFIID riid, void **ppvObj)
{
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::QueryInterface called."));
    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumCodePage))
    {
        *ppvObj = SAFECAST(this, IEnumCodePage*);
        AddRef();
        return NOERROR;
    }
    *ppvObj = NULL;
    return E_NOINTERFACE;
}

STDAPI_(ULONG) CEnumCodePage::AddRef()
{
    _cRef++;
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::AddRef called. _cRef=%d"), _cRef);
    return _cRef;
}

STDAPI_(ULONG) CEnumCodePage::Release()
{
    _cRef--;
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Release called. _cRef=%d"), _cRef);
    if (0 < _cRef)
        return _cRef;

    delete this;
    return 0;    
}

STDAPI CEnumCodePage::Clone(IEnumCodePage **ppEnumCodePage)
{
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Clone called."));
    return E_NOTIMPL;
}

STDAPI CEnumCodePage::Next(ULONG celt, PMIMECPINFO rgcpInfo, ULONG *pceltFetched)
{    
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Next called."));


    UINT cNum = 0;
    MIMECPINFO cpInfo;

    if (dwMimeSource &  MIMECONTF_MIME_REGISTRY)
    {
        if (NULL != g_pMimeDatabaseReg && NULL != rgcpInfo)
        {
            if (0 == _iCur)
                if (S_OK != g_pMimeDatabaseReg->EnumCodePageInfo())
                    return E_FAIL;

            while (cNum < celt)
            {
                HRESULT hr = g_pMimeDatabaseReg->GetCodePageInfoWithIndex(_iCur++, &cpInfo);
                if (SUCCEEDED(hr))
                {
                    if (_dwLevel == (cpInfo.dwFlags & _dwLevel))
                    {
                        *(rgcpInfo + cNum) = cpInfo;
                        cNum++;
                    }
                }
                else
                    break;
            }
            if (NULL != pceltFetched)
                *pceltFetched = cNum;
            return (0 < cNum)? S_OK: S_FALSE;
        }
        else
            return E_FAIL;
    } 

    while (cNum < celt)
    {
        if (SUCCEEDED(g_pMimeDatabase->GetCodePageInfoWithIndex(_iCur++, _LangId, &cpInfo)))
        {
            if (_dwLevel == (cpInfo.dwFlags & _dwLevel) &&
                (cpInfo.dwFlags & dwMimeSource))
            {
                *(rgcpInfo + cNum) = cpInfo;
                cNum++;
            }
        }
        else
            break;
    }

    if (NULL != pceltFetched)
       *pceltFetched = cNum;

    return (0 < cNum)? S_OK: S_FALSE;

}


STDAPI CEnumCodePage::Reset()
{
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Reset called."));
    _iCur = 0;
    return NOERROR;
}

STDAPI CEnumCodePage::Skip(ULONG celt)
{
    DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Skip called."));
    _iCur += celt;
    return NOERROR;
}

//
//  CEnumRfc1766 implementation
//
CEnumRfc1766::CEnumRfc1766(MIMECONTF dwSource, LANGID LangId) : _LangID(LangId)
{
    DebugMsg(DM_TRACE, TEXT("constructor of CEnumRfc1766 0x%08x"), this);
    dwMimeSource = dwSource;
    DllAddRef();
    _cRef = 1;
    _uCur = 0;
}

CEnumRfc1766::~CEnumRfc1766()
{
    DebugMsg(DM_TRACE, TEXT("destructor of CEnumRfc1766 0x%08x"), this);
    DllRelease();
}

STDAPI CEnumRfc1766::QueryInterface(REFIID riid, void **ppvObj)
{
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::QueryInterface called."));
    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumRfc1766))
    {
        *ppvObj = SAFECAST(this, IEnumRfc1766*);
        AddRef();
        return NOERROR;
    }
    *ppvObj = NULL;
    return E_NOINTERFACE;
}

STDAPI_(ULONG) CEnumRfc1766::AddRef()
{
    _cRef++;
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::AddRef called. _cRef=%d"), _cRef);
    return _cRef;
}

STDAPI_(ULONG) CEnumRfc1766::Release()
{
    _cRef--;
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Release called. _cRef=%d"), _cRef);
    if (0 < _cRef)
        return _cRef;

    delete this;
    return 0;    
}

STDAPI CEnumRfc1766::Clone(IEnumRfc1766 **ppEnumRfc1766)
{
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Clone called."));
    return E_NOTIMPL;
}

STDAPI CEnumRfc1766::Next(ULONG celt, PRFC1766INFO rgRfc1766Info, ULONG *pceltFetched)
{
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Next called."));

    if (g_pMimeDatabaseReg && (dwMimeSource &  MIMECONTF_MIME_REGISTRY))
    {
        g_pMimeDatabaseReg->EnsureRfc1766Table();
        if (NULL != g_pRfc1766Reg && NULL != rgRfc1766Info)
        {
            UINT cNum = 0;

            while (cNum < celt)
            {
                if (_uCur < g_cRfc1766)
                {
                    (rgRfc1766Info + cNum)->lcid = g_pRfc1766Reg[_uCur].lcid;
                    MultiByteToWideChar(CP_ACP, 0, g_pRfc1766Reg[_uCur].szRfc1766, -1, (rgRfc1766Info + cNum)->wszRfc1766, MAX_RFC1766_NAME);
                    (rgRfc1766Info + cNum)->wszRfc1766[MAX_RFC1766_NAME-1] = 0;
                    MultiByteToWideChar(CP_ACP, 0, g_pRfc1766Reg[_uCur].szLocaleName, -1, (rgRfc1766Info + cNum)->wszLocaleName, MAX_LOCALE_NAME);
                    (rgRfc1766Info + cNum)->wszLocaleName[MAX_LOCALE_NAME-1] = 0;
                    cNum++;
                    _uCur++;
                }
                else
                    break;
            }
            if (NULL != pceltFetched)
                *pceltFetched = cNum;
            return (0 < cNum)? S_OK: S_FALSE;
        }
        else
            return E_FAIL;
    }
    if (NULL != rgRfc1766Info)
    {
        UINT cNum = 0;

        while (cNum < celt)
        {
            if (_uCur < g_cRfc1766)
            {
                (rgRfc1766Info + cNum)->lcid = MimeRfc1766[_uCur].LcId;
                MLStrCpyNW((rgRfc1766Info + cNum)->wszRfc1766, MimeRfc1766[_uCur].szRfc1766, MAX_RFC1766_NAME);

                (rgRfc1766Info + cNum)->wszRfc1766[MAX_RFC1766_NAME-1] = 0; 
                
                if (!_LoadStringExW(g_hInst, MimeRfc1766[_uCur].uidLCID, (rgRfc1766Info + cNum)->wszLocaleName, 
                                    MAX_LOCALE_NAME, _LangID))
                {
                        // Last try, switch to English, US
                        if (!_LoadStringExW(g_hInst, MimeRfc1766[_uCur].uidLCID, (rgRfc1766Info + cNum)->wszLocaleName, 
                                       MAX_LOCALE_NAME, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)))
                             (rgRfc1766Info + cNum)->wszLocaleName[0] = 0x0000;
                }
                (rgRfc1766Info + cNum)->wszLocaleName[MAX_LOCALE_NAME-1] = 0;

                cNum++;
                _uCur++;
            }
            else
                break;
        }
        if (NULL != pceltFetched)
            *pceltFetched = cNum;
        return (0 < cNum)? S_OK: S_FALSE;
    }
    else
        return E_FAIL;
}

STDAPI CEnumRfc1766::Reset()
{
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Reset called."));
    _uCur = 0;
    return NOERROR;
}

STDAPI CEnumRfc1766::Skip(ULONG celt)
{
    DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Skip called."));
    _uCur += celt;
    return NOERROR;
}

//
// CEnumScript implementation
//
CEnumScript::CEnumScript(DWORD grfFlags, LANGID LangId, MIMECONTF dwSource) : _dwLevel(grfFlags), _LangId( LangId)
{
    DebugMsg(DM_TRACE, TEXT("constructor of CEnumScript 0x%08x"), this);
    DllAddRef();

    _cRef = 1;
    _uCur = 0;
}

CEnumScript::~CEnumScript()
{
    DebugMsg(DM_TRACE, TEXT("destructor of CEnumScript 0x%08x"), this);
    DllRelease();
}

STDAPI CEnumScript::QueryInterface(REFIID riid, void **ppvObj)
{
    DebugMsg(DM_TRACE, TEXT("CEnumScript::QueryInterface called."));
    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumScript))
    {
        *ppvObj = SAFECAST(this, IEnumScript*);
        AddRef();
        return NOERROR;
    }
    *ppvObj = NULL;
    return E_NOINTERFACE;
}

STDAPI_(ULONG) CEnumScript::AddRef()
{
    _cRef++;
    DebugMsg(DM_TRACE, TEXT("CEnumScript::AddRef called. _cRef=%d"), _cRef);
    return _cRef;
}

STDAPI_(ULONG) CEnumScript::Release()
{
    _cRef--;
    DebugMsg(DM_TRACE, TEXT("CEnumScript::Release called. _cRef=%d"), _cRef);
    if (0 < _cRef)
        return _cRef;

    delete this;
    return 0;    
}

STDAPI CEnumScript::Clone(IEnumScript **ppEnumScript)
{
    DebugMsg(DM_TRACE, TEXT("CEnumScript::Clone called."));
    return E_NOTIMPL;
}

STDAPI CEnumScript::Next(ULONG celt, PSCRIPTINFO rgScriptInfo, ULONG *pceltFetched)
{    
    DebugMsg(DM_TRACE, TEXT("CEnumScript::Next called."));

    if (!_dwLevel)
        _dwLevel = ~0;

    if (NULL != rgScriptInfo)
    {
        UINT cNum = 0;
        LANGID LangId = _LangId;

        while (cNum < celt)
        {
            if (_uCur < g_cScript)
            {
                if (!(ScriptTable[_uCur].dwFlags & _dwLevel))
                { 
                    _uCur++;
                    continue;
                }

                (rgScriptInfo + cNum)->ScriptId = ScriptTable[_uCur].sid;

                (rgScriptInfo + cNum)->uiCodePage = ScriptTable[_uCur].uiCodePage;

                (rgScriptInfo + cNum)->wszDescription[0] = 0x0000;

                if (!_LoadStringExW(g_hInst, ScriptTable[_uCur].uidDescription, (rgScriptInfo + cNum)->wszDescription, 
                                    MAX_SCRIPT_NAME, LangId))
                {
                        // Last try, switch to English, US
                        LangId = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
                        _LoadStringExW(g_hInst, ScriptTable[_uCur].uidDescription, (rgScriptInfo + cNum)->wszDescription, 
                                       MAX_SCRIPT_NAME, LangId);
                }

                (rgScriptInfo + cNum)->wszFixedWidthFont[0] = 0x0000;
                if (ScriptTable[_uCur].uidFixedWidthFont)
                {
                    _LoadStringExW(g_hInst, ScriptTable[_uCur].uidFixedWidthFont, (rgScriptInfo + cNum)->wszFixedWidthFont,
                                   MAX_MIMEFACE_NAME, LangId);
                }

                (rgScriptInfo + cNum)->wszProportionalFont[0] = 0x0000;
                if (ScriptTable[_uCur].uidProportionalFont)
                {
                    _LoadStringExW(g_hInst, ScriptTable[_uCur].uidProportionalFont, (rgScriptInfo + cNum)->wszProportionalFont,
                                   MAX_MIMEFACE_NAME, LangId);
                }

                cNum++;
                _uCur++;
            }
            else
                break;
        }

        if (NULL != pceltFetched)
            *pceltFetched = cNum;
        return (0 < cNum)? S_OK: S_FALSE;
    }
    else
        return E_FAIL;
}


STDAPI CEnumScript::Reset()
{
    DebugMsg(DM_TRACE, TEXT("CEnumScript::Reset called."));
    _uCur = 0;
    return NOERROR;
}

STDAPI CEnumScript::Skip(ULONG celt)
{
    DebugMsg(DM_TRACE, TEXT("CEnumScript::Skip called."));
    _uCur += celt;
    return NOERROR;
}

