enumcp.cpp
上传用户:xhy777
上传日期:2007-02-14
资源大小:24088k
文件大小:19k
源码类别:

系统编程

开发平台:

Visual C++

  1. #include "private.h"
  2. const MIMERFC1766 MimeRfc1766[] =
  3. {
  4.     { 0x0436, L"af",    IDS_RFC1766_LCID0436 },
  5.     { 0x041C, L"sq",    IDS_RFC1766_LCID041C },
  6.     { 0x0001, L"ar",    IDS_RFC1766_LCID0001 },
  7.     { 0x0401, L"ar-sa", IDS_RFC1766_LCID0401 },
  8.     { 0x0801, L"ar-iq", IDS_RFC1766_LCID0801 },
  9.     { 0x0C01, L"ar-eg", IDS_RFC1766_LCID0C01 },
  10.     { 0x1001, L"ar-ly", IDS_RFC1766_LCID1001 },
  11.     { 0x1401, L"ar-dz", IDS_RFC1766_LCID1401 },
  12.     { 0x1801, L"ar-ma", IDS_RFC1766_LCID1801 },
  13.     { 0x1C01, L"ar-tn", IDS_RFC1766_LCID1C01 },
  14.     { 0x2001, L"ar-om", IDS_RFC1766_LCID2001 },
  15.     { 0x2401, L"ar-ye", IDS_RFC1766_LCID2401 },
  16.     { 0x2801, L"ar-sy", IDS_RFC1766_LCID2801 },
  17.     { 0x2C01, L"ar-jo", IDS_RFC1766_LCID2C01 },
  18.     { 0x3001, L"ar-lb", IDS_RFC1766_LCID3001 },
  19.     { 0x3401, L"ar-kw", IDS_RFC1766_LCID3401 },
  20.     { 0x3801, L"ar-ae", IDS_RFC1766_LCID3801 },
  21.     { 0x3C01, L"ar-bh", IDS_RFC1766_LCID3C01 },
  22.     { 0x4001, L"ar-qa", IDS_RFC1766_LCID4001 },
  23.     { 0x042D, L"eu",    IDS_RFC1766_LCID042D },
  24.     { 0x0402, L"bg",    IDS_RFC1766_LCID0402 },
  25.     { 0x0423, L"be",    IDS_RFC1766_LCID0423 },
  26.     { 0x0403, L"ca",    IDS_RFC1766_LCID0403 },
  27.     { 0x0004, L"zh",    IDS_RFC1766_LCID0004 },
  28.     { 0x1404, L"zh",    IDS_RFC1766_LCID1404 },
  29.     { 0x0404, L"zh-tw", IDS_RFC1766_LCID0404 },
  30.     { 0x0804, L"zh-cn", IDS_RFC1766_LCID0804 },
  31.     { 0x0C04, L"zh-hk", IDS_RFC1766_LCID0C04 },
  32.     { 0x1004, L"zh-sg", IDS_RFC1766_LCID1004 },
  33.     { 0x041A, L"hr",    IDS_RFC1766_LCID041A },
  34.     { 0x0405, L"cs",    IDS_RFC1766_LCID0405 },
  35.     { 0x0406, L"da",    IDS_RFC1766_LCID0406 },
  36.     { 0x0413, L"nl",    IDS_RFC1766_LCID0413 },
  37.     { 0x0813, L"nl-be", IDS_RFC1766_LCID0813 },
  38.     { 0x0009, L"en",    IDS_RFC1766_LCID0009 },
  39.     { 0x2409, L"en",    IDS_RFC1766_LCID2409 },
  40.     { 0x0409, L"en-us", IDS_RFC1766_LCID0409 },
  41.     { 0x0809, L"en-gb", IDS_RFC1766_LCID0809 },
  42.     { 0x0C09, L"en-au", IDS_RFC1766_LCID0C09 },
  43.     { 0x1009, L"en-ca", IDS_RFC1766_LCID1009 },
  44.     { 0x1409, L"en-nz", IDS_RFC1766_LCID1409 },
  45.     { 0x1809, L"en-ie", IDS_RFC1766_LCID1809 },
  46.     { 0x1C09, L"en-za", IDS_RFC1766_LCID1C09 },
  47.     { 0x3009, L"en-zw", IDS_RFC1766_LCID3009 },
  48.     { 0x2009, L"en-jm", IDS_RFC1766_LCID2009 },
  49.     { 0x2809, L"en-bz", IDS_RFC1766_LCID2809 },
  50.     { 0x2C09, L"en-tt", IDS_RFC1766_LCID2C09 },
  51.     { 0x3409, L"en-ph", IDS_RFC1766_LCID3409 },
  52.     { 0x0425, L"et",    IDS_RFC1766_LCID0425 },
  53.     { 0x0438, L"fo",    IDS_RFC1766_LCID0438 },
  54.     { 0x0429, L"fa",    IDS_RFC1766_LCID0429 },
  55.     { 0x040B, L"fi",    IDS_RFC1766_LCID040B },
  56.     { 0x040C, L"fr",    IDS_RFC1766_LCID040C },
  57.     { 0x080C, L"fr-be", IDS_RFC1766_LCID080C },
  58.     { 0x0C0C, L"fr-ca", IDS_RFC1766_LCID0C0C },
  59.     { 0x100C, L"fr-ch", IDS_RFC1766_LCID100C },
  60.     { 0x140C, L"fr-lu", IDS_RFC1766_LCID140C },
  61.     { 0x180C, L"fr-mc", IDS_RFC1766_LCID180C },
  62.     { 0x043C, L"gd",    IDS_RFC1766_LCID043C },
  63.     { 0x0407, L"de",    IDS_RFC1766_LCID0407 },
  64.     { 0x0807, L"de-ch", IDS_RFC1766_LCID0807 },
  65.     { 0x0C07, L"de-at", IDS_RFC1766_LCID0C07 },
  66.     { 0x1007, L"de-lu", IDS_RFC1766_LCID1007 },
  67.     { 0x1407, L"de-li", IDS_RFC1766_LCID1407 },
  68.     { 0x0408, L"el",    IDS_RFC1766_LCID0408 },
  69.     { 0x040D, L"he",    IDS_RFC1766_LCID040D },
  70.     { 0x0439, L"hi",    IDS_RFC1766_LCID0439 },
  71.     { 0x040E, L"hu",    IDS_RFC1766_LCID040E },
  72.     { 0x040F, L"is",    IDS_RFC1766_LCID040F },
  73.     { 0x0421, L"id",    IDS_RFC1766_LCID0421 },
  74.     { 0x0410, L"it",    IDS_RFC1766_LCID0410 },
  75.     { 0x0810, L"it-ch", IDS_RFC1766_LCID0810 },
  76.     { 0x0411, L"ja",    IDS_RFC1766_LCID0411 },
  77.     { 0x0412, L"ko",    IDS_RFC1766_LCID0412 },
  78.     { 0x0426, L"lv",    IDS_RFC1766_LCID0426 },
  79.     { 0x0427, L"lt",    IDS_RFC1766_LCID0427 },
  80.     { 0x042F, L"mk",    IDS_RFC1766_LCID042F },
  81.     { 0x043E, L"ms",    IDS_RFC1766_LCID043E },
  82.     { 0x043A, L"mt",    IDS_RFC1766_LCID043A },
  83.     { 0x0415, L"pl",    IDS_RFC1766_LCID0415 },
  84.     { 0x0416, L"pt-br", IDS_RFC1766_LCID0416 },
  85.     { 0x0816, L"pt",    IDS_RFC1766_LCID0816 },
  86.     { 0x0417, L"rm",    IDS_RFC1766_LCID0417 },
  87.     { 0x0418, L"ro",    IDS_RFC1766_LCID0418 },
  88.     { 0x0818, L"ro-mo", IDS_RFC1766_LCID0818 },
  89.     { 0x0419, L"ru",    IDS_RFC1766_LCID0419 },
  90.     { 0x0819, L"ru-mo", IDS_RFC1766_LCID0819 },
  91.     { 0x0C1A, L"sr",    IDS_RFC1766_LCID0C1A },
  92.     { 0x081A, L"sr",    IDS_RFC1766_LCID081A },
  93.     { 0x041B, L"sk",    IDS_RFC1766_LCID041B },
  94.     { 0x0424, L"sl",    IDS_RFC1766_LCID0424 },
  95.     { 0x042E, L"sb",    IDS_RFC1766_LCID042E },
  96.     { 0x040A, L"es",    IDS_RFC1766_LCID040A },
  97.     { 0x080A, L"es-mx", IDS_RFC1766_LCID080A },
  98.     { 0x0C0A, L"es",    IDS_RFC1766_LCID0C0A },
  99.     { 0x100A, L"es-gt", IDS_RFC1766_LCID100A },
  100.     { 0x140A, L"es-cr", IDS_RFC1766_LCID140A },
  101.     { 0x180A, L"es-pa", IDS_RFC1766_LCID180A },
  102.     { 0x1C0A, L"es-do", IDS_RFC1766_LCID1C0A },
  103.     { 0x200A, L"es-ve", IDS_RFC1766_LCID200A },
  104.     { 0x240A, L"es-co", IDS_RFC1766_LCID240A },
  105.     { 0x280A, L"es-pe", IDS_RFC1766_LCID280A },
  106.     { 0x2C0A, L"es-ar", IDS_RFC1766_LCID2C0A },
  107.     { 0x300A, L"es-ec", IDS_RFC1766_LCID300A },
  108.     { 0x340A, L"es-cl", IDS_RFC1766_LCID340A },
  109.     { 0x380A, L"es-uy", IDS_RFC1766_LCID380A },
  110.     { 0x3C0A, L"es-py", IDS_RFC1766_LCID3C0A },
  111.     { 0x400A, L"es-bo", IDS_RFC1766_LCID400A },
  112.     { 0x440A, L"es-sv", IDS_RFC1766_LCID440A },
  113.     { 0x480A, L"es-hn", IDS_RFC1766_LCID480A },
  114.     { 0x4C0A, L"es-ni", IDS_RFC1766_LCID4C0A },
  115.     { 0x500A, L"es-pr", IDS_RFC1766_LCID500A },
  116.     { 0x0430, L"sx",    IDS_RFC1766_LCID0430 },
  117.     { 0x041D, L"sv",    IDS_RFC1766_LCID041D },
  118.     { 0x081D, L"sv-fi", IDS_RFC1766_LCID081D },
  119.     { 0x041E, L"th",    IDS_RFC1766_LCID041E },
  120.     { 0x0431, L"ts",    IDS_RFC1766_LCID0431 },
  121.     { 0x0432, L"tn",    IDS_RFC1766_LCID0432 },
  122.     { 0x041F, L"tr",    IDS_RFC1766_LCID041F },
  123.     { 0x0422, L"uk",    IDS_RFC1766_LCID0422 },
  124.     { 0x0420, L"ur",    IDS_RFC1766_LCID0420 },
  125.     { 0x0443, L"uz",    IDS_RFC1766_LCID0443 },
  126.     { 0x0843, L"uz",    IDS_RFC1766_LCID0843 },
  127.     { 0x042A, L"vi",    IDS_RFC1766_LCID042A },
  128.     { 0x0434, L"xh",    IDS_RFC1766_LCID0434 },
  129.     { 0x043D, L"yi",    IDS_RFC1766_LCID043D },
  130.     { 0x0435, L"zu",    IDS_RFC1766_LCID0435 },
  131.     { 0x042B, L"hy",    IDS_RFC1766_LCID042B },
  132.     { 0x0437, L"ka",    IDS_RFC1766_LCID0437 },
  133.     { 0x043F, L"kk",    IDS_RFC1766_LCID043F },
  134.     { 0x0441, L"sw",    IDS_RFC1766_LCID0441 },
  135.     { 0x0444, L"tt",    IDS_RFC1766_LCID0444 },
  136.     { 0x0445, L"bn",    IDS_RFC1766_LCID0445 },
  137.     { 0x0446, L"pa",    IDS_RFC1766_LCID0446 },
  138.     { 0x0447, L"gu",    IDS_RFC1766_LCID0447 },
  139.     { 0x0448, L"or",    IDS_RFC1766_LCID0448 },
  140.     { 0x0449, L"ta",    IDS_RFC1766_LCID0449 },
  141.     { 0x044A, L"te",    IDS_RFC1766_LCID044A },
  142.     { 0x044B, L"kn",    IDS_RFC1766_LCID044B },
  143.     { 0x044C, L"ml",    IDS_RFC1766_LCID044C },
  144.     { 0x044D, L"as",    IDS_RFC1766_LCID044D },
  145.     { 0x044E, L"mr",    IDS_RFC1766_LCID044E },
  146.     { 0x083E, L"ms",    IDS_RFC1766_LCID083E },
  147.     { 0x0861, L"ne",    IDS_RFC1766_LCID0861 },
  148.     { 0x044F, L"sa",    IDS_RFC1766_LCID044F },
  149.     { 0x0827, L"it",    IDS_RFC1766_LCID0827 },
  150.     { 0x0457, L"x-kok", IDS_RFC1766_LCID0457 },
  151. // Following rfc1766 names are over already published MAX_RFC1766_NAME
  152. // We have to modify them for IE5 release, will do better later
  153. //  { 0x082C, L"x-az-cyrillic", IDS_RFC1766_LCID082C },
  154. //  { 0x042C, L"x-az-latin",    IDS_RFC1766_LCID042C },
  155. //  { 0x0414, L"no-nyn",IDS_RFC1766_LCID0414 },
  156. //  { 0x0814, L"no-bok",IDS_RFC1766_LCID0814 },
  157.     { 0x0414, L"no",    IDS_RFC1766_LCID0414 },
  158.     { 0x0814, L"no",    IDS_RFC1766_LCID0814 },
  159.     { 0x082C, L"az",    IDS_RFC1766_LCID082C },
  160.     { 0x042C, L"az",    IDS_RFC1766_LCID042C },
  161. };
  162. UINT g_cRfc1766 = ARRAYSIZE(MimeRfc1766);
  163. //
  164. //  CEnumCodePage implementation
  165. //
  166. CEnumCodePage::CEnumCodePage(DWORD grfFlags, LANGID LangId, MIMECONTF dwSource) : _dwLevel( grfFlags ), _LangId( LangId), dwMimeSource(dwSource)
  167. {
  168.     DebugMsg(DM_TRACE, TEXT("constructor of CEnumCodePage 0x%08x"), this);
  169.     DllAddRef();
  170.     _cRef = 1;
  171.     _iCur = 0;
  172. }
  173. CEnumCodePage::~CEnumCodePage()
  174. {
  175.     DebugMsg(DM_TRACE, TEXT("destructor of CEnumCodePage 0x%08x"), this);
  176.     DllRelease();
  177. }
  178. STDAPI CEnumCodePage::QueryInterface(REFIID riid, void **ppvObj)
  179. {
  180.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::QueryInterface called."));
  181.     if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumCodePage))
  182.     {
  183.         *ppvObj = SAFECAST(this, IEnumCodePage*);
  184.         AddRef();
  185.         return NOERROR;
  186.     }
  187.     *ppvObj = NULL;
  188.     return E_NOINTERFACE;
  189. }
  190. STDAPI_(ULONG) CEnumCodePage::AddRef()
  191. {
  192.     _cRef++;
  193.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::AddRef called. _cRef=%d"), _cRef);
  194.     return _cRef;
  195. }
  196. STDAPI_(ULONG) CEnumCodePage::Release()
  197. {
  198.     _cRef--;
  199.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Release called. _cRef=%d"), _cRef);
  200.     if (0 < _cRef)
  201.         return _cRef;
  202.     delete this;
  203.     return 0;    
  204. }
  205. STDAPI CEnumCodePage::Clone(IEnumCodePage **ppEnumCodePage)
  206. {
  207.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Clone called."));
  208.     return E_NOTIMPL;
  209. }
  210. STDAPI CEnumCodePage::Next(ULONG celt, PMIMECPINFO rgcpInfo, ULONG *pceltFetched)
  211. {    
  212.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Next called."));
  213.     UINT cNum = 0;
  214.     MIMECPINFO cpInfo;
  215.     if (dwMimeSource &  MIMECONTF_MIME_REGISTRY)
  216.     {
  217.         if (NULL != g_pMimeDatabaseReg && NULL != rgcpInfo)
  218.         {
  219.             if (0 == _iCur)
  220.                 if (S_OK != g_pMimeDatabaseReg->EnumCodePageInfo())
  221.                     return E_FAIL;
  222.             while (cNum < celt)
  223.             {
  224.                 HRESULT hr = g_pMimeDatabaseReg->GetCodePageInfoWithIndex(_iCur++, &cpInfo);
  225.                 if (SUCCEEDED(hr))
  226.                 {
  227.                     if (_dwLevel == (cpInfo.dwFlags & _dwLevel))
  228.                     {
  229.                         *(rgcpInfo + cNum) = cpInfo;
  230.                         cNum++;
  231.                     }
  232.                 }
  233.                 else
  234.                     break;
  235.             }
  236.             if (NULL != pceltFetched)
  237.                 *pceltFetched = cNum;
  238.             return (0 < cNum)? S_OK: S_FALSE;
  239.         }
  240.         else
  241.             return E_FAIL;
  242.     } 
  243.     while (cNum < celt)
  244.     {
  245.         if (SUCCEEDED(g_pMimeDatabase->GetCodePageInfoWithIndex(_iCur++, _LangId, &cpInfo)))
  246.         {
  247.             if (_dwLevel == (cpInfo.dwFlags & _dwLevel) &&
  248.                 (cpInfo.dwFlags & dwMimeSource))
  249.             {
  250.                 *(rgcpInfo + cNum) = cpInfo;
  251.                 cNum++;
  252.             }
  253.         }
  254.         else
  255.             break;
  256.     }
  257.     if (NULL != pceltFetched)
  258.        *pceltFetched = cNum;
  259.     return (0 < cNum)? S_OK: S_FALSE;
  260. }
  261. STDAPI CEnumCodePage::Reset()
  262. {
  263.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Reset called."));
  264.     _iCur = 0;
  265.     return NOERROR;
  266. }
  267. STDAPI CEnumCodePage::Skip(ULONG celt)
  268. {
  269.     DebugMsg(DM_TRACE, TEXT("CEnumCodePage::Skip called."));
  270.     _iCur += celt;
  271.     return NOERROR;
  272. }
  273. //
  274. //  CEnumRfc1766 implementation
  275. //
  276. CEnumRfc1766::CEnumRfc1766(MIMECONTF dwSource, LANGID LangId) : _LangID(LangId)
  277. {
  278.     DebugMsg(DM_TRACE, TEXT("constructor of CEnumRfc1766 0x%08x"), this);
  279.     dwMimeSource = dwSource;
  280.     DllAddRef();
  281.     _cRef = 1;
  282.     _uCur = 0;
  283. }
  284. CEnumRfc1766::~CEnumRfc1766()
  285. {
  286.     DebugMsg(DM_TRACE, TEXT("destructor of CEnumRfc1766 0x%08x"), this);
  287.     DllRelease();
  288. }
  289. STDAPI CEnumRfc1766::QueryInterface(REFIID riid, void **ppvObj)
  290. {
  291.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::QueryInterface called."));
  292.     if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumRfc1766))
  293.     {
  294.         *ppvObj = SAFECAST(this, IEnumRfc1766*);
  295.         AddRef();
  296.         return NOERROR;
  297.     }
  298.     *ppvObj = NULL;
  299.     return E_NOINTERFACE;
  300. }
  301. STDAPI_(ULONG) CEnumRfc1766::AddRef()
  302. {
  303.     _cRef++;
  304.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::AddRef called. _cRef=%d"), _cRef);
  305.     return _cRef;
  306. }
  307. STDAPI_(ULONG) CEnumRfc1766::Release()
  308. {
  309.     _cRef--;
  310.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Release called. _cRef=%d"), _cRef);
  311.     if (0 < _cRef)
  312.         return _cRef;
  313.     delete this;
  314.     return 0;    
  315. }
  316. STDAPI CEnumRfc1766::Clone(IEnumRfc1766 **ppEnumRfc1766)
  317. {
  318.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Clone called."));
  319.     return E_NOTIMPL;
  320. }
  321. STDAPI CEnumRfc1766::Next(ULONG celt, PRFC1766INFO rgRfc1766Info, ULONG *pceltFetched)
  322. {
  323.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Next called."));
  324.     if (g_pMimeDatabaseReg && (dwMimeSource &  MIMECONTF_MIME_REGISTRY))
  325.     {
  326.         g_pMimeDatabaseReg->EnsureRfc1766Table();
  327.         if (NULL != g_pRfc1766Reg && NULL != rgRfc1766Info)
  328.         {
  329.             UINT cNum = 0;
  330.             while (cNum < celt)
  331.             {
  332.                 if (_uCur < g_cRfc1766)
  333.                 {
  334.                     (rgRfc1766Info + cNum)->lcid = g_pRfc1766Reg[_uCur].lcid;
  335.                     MultiByteToWideChar(CP_ACP, 0, g_pRfc1766Reg[_uCur].szRfc1766, -1, (rgRfc1766Info + cNum)->wszRfc1766, MAX_RFC1766_NAME);
  336.                     (rgRfc1766Info + cNum)->wszRfc1766[MAX_RFC1766_NAME-1] = 0;
  337.                     MultiByteToWideChar(CP_ACP, 0, g_pRfc1766Reg[_uCur].szLocaleName, -1, (rgRfc1766Info + cNum)->wszLocaleName, MAX_LOCALE_NAME);
  338.                     (rgRfc1766Info + cNum)->wszLocaleName[MAX_LOCALE_NAME-1] = 0;
  339.                     cNum++;
  340.                     _uCur++;
  341.                 }
  342.                 else
  343.                     break;
  344.             }
  345.             if (NULL != pceltFetched)
  346.                 *pceltFetched = cNum;
  347.             return (0 < cNum)? S_OK: S_FALSE;
  348.         }
  349.         else
  350.             return E_FAIL;
  351.     }
  352.     if (NULL != rgRfc1766Info)
  353.     {
  354.         UINT cNum = 0;
  355.         while (cNum < celt)
  356.         {
  357.             if (_uCur < g_cRfc1766)
  358.             {
  359.                 (rgRfc1766Info + cNum)->lcid = MimeRfc1766[_uCur].LcId;
  360.                 MLStrCpyNW((rgRfc1766Info + cNum)->wszRfc1766, MimeRfc1766[_uCur].szRfc1766, MAX_RFC1766_NAME);
  361.                 (rgRfc1766Info + cNum)->wszRfc1766[MAX_RFC1766_NAME-1] = 0; 
  362.                 
  363.                 if (!_LoadStringExW(g_hInst, MimeRfc1766[_uCur].uidLCID, (rgRfc1766Info + cNum)->wszLocaleName, 
  364.                                     MAX_LOCALE_NAME, _LangID))
  365.                 {
  366.                         // Last try, switch to English, US
  367.                         if (!_LoadStringExW(g_hInst, MimeRfc1766[_uCur].uidLCID, (rgRfc1766Info + cNum)->wszLocaleName, 
  368.                                        MAX_LOCALE_NAME, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)))
  369.                              (rgRfc1766Info + cNum)->wszLocaleName[0] = 0x0000;
  370.                 }
  371.                 (rgRfc1766Info + cNum)->wszLocaleName[MAX_LOCALE_NAME-1] = 0;
  372.                 cNum++;
  373.                 _uCur++;
  374.             }
  375.             else
  376.                 break;
  377.         }
  378.         if (NULL != pceltFetched)
  379.             *pceltFetched = cNum;
  380.         return (0 < cNum)? S_OK: S_FALSE;
  381.     }
  382.     else
  383.         return E_FAIL;
  384. }
  385. STDAPI CEnumRfc1766::Reset()
  386. {
  387.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Reset called."));
  388.     _uCur = 0;
  389.     return NOERROR;
  390. }
  391. STDAPI CEnumRfc1766::Skip(ULONG celt)
  392. {
  393.     DebugMsg(DM_TRACE, TEXT("CEnumRfc1766::Skip called."));
  394.     _uCur += celt;
  395.     return NOERROR;
  396. }
  397. //
  398. // CEnumScript implementation
  399. //
  400. CEnumScript::CEnumScript(DWORD grfFlags, LANGID LangId, MIMECONTF dwSource) : _dwLevel(grfFlags), _LangId( LangId)
  401. {
  402.     DebugMsg(DM_TRACE, TEXT("constructor of CEnumScript 0x%08x"), this);
  403.     DllAddRef();
  404.     _cRef = 1;
  405.     _uCur = 0;
  406. }
  407. CEnumScript::~CEnumScript()
  408. {
  409.     DebugMsg(DM_TRACE, TEXT("destructor of CEnumScript 0x%08x"), this);
  410.     DllRelease();
  411. }
  412. STDAPI CEnumScript::QueryInterface(REFIID riid, void **ppvObj)
  413. {
  414.     DebugMsg(DM_TRACE, TEXT("CEnumScript::QueryInterface called."));
  415.     if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumScript))
  416.     {
  417.         *ppvObj = SAFECAST(this, IEnumScript*);
  418.         AddRef();
  419.         return NOERROR;
  420.     }
  421.     *ppvObj = NULL;
  422.     return E_NOINTERFACE;
  423. }
  424. STDAPI_(ULONG) CEnumScript::AddRef()
  425. {
  426.     _cRef++;
  427.     DebugMsg(DM_TRACE, TEXT("CEnumScript::AddRef called. _cRef=%d"), _cRef);
  428.     return _cRef;
  429. }
  430. STDAPI_(ULONG) CEnumScript::Release()
  431. {
  432.     _cRef--;
  433.     DebugMsg(DM_TRACE, TEXT("CEnumScript::Release called. _cRef=%d"), _cRef);
  434.     if (0 < _cRef)
  435.         return _cRef;
  436.     delete this;
  437.     return 0;    
  438. }
  439. STDAPI CEnumScript::Clone(IEnumScript **ppEnumScript)
  440. {
  441.     DebugMsg(DM_TRACE, TEXT("CEnumScript::Clone called."));
  442.     return E_NOTIMPL;
  443. }
  444. STDAPI CEnumScript::Next(ULONG celt, PSCRIPTINFO rgScriptInfo, ULONG *pceltFetched)
  445. {    
  446.     DebugMsg(DM_TRACE, TEXT("CEnumScript::Next called."));
  447.     if (!_dwLevel)
  448.         _dwLevel = ~0;
  449.     if (NULL != rgScriptInfo)
  450.     {
  451.         UINT cNum = 0;
  452.         LANGID LangId = _LangId;
  453.         while (cNum < celt)
  454.         {
  455.             if (_uCur < g_cScript)
  456.             {
  457.                 if (!(ScriptTable[_uCur].dwFlags & _dwLevel))
  458.                 { 
  459.                     _uCur++;
  460.                     continue;
  461.                 }
  462.                 (rgScriptInfo + cNum)->ScriptId = ScriptTable[_uCur].sid;
  463.                 (rgScriptInfo + cNum)->uiCodePage = ScriptTable[_uCur].uiCodePage;
  464.                 (rgScriptInfo + cNum)->wszDescription[0] = 0x0000;
  465.                 if (!_LoadStringExW(g_hInst, ScriptTable[_uCur].uidDescription, (rgScriptInfo + cNum)->wszDescription, 
  466.                                     MAX_SCRIPT_NAME, LangId))
  467.                 {
  468.                         // Last try, switch to English, US
  469.                         LangId = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
  470.                         _LoadStringExW(g_hInst, ScriptTable[_uCur].uidDescription, (rgScriptInfo + cNum)->wszDescription, 
  471.                                        MAX_SCRIPT_NAME, LangId);
  472.                 }
  473.                 (rgScriptInfo + cNum)->wszFixedWidthFont[0] = 0x0000;
  474.                 if (ScriptTable[_uCur].uidFixedWidthFont)
  475.                 {
  476.                     _LoadStringExW(g_hInst, ScriptTable[_uCur].uidFixedWidthFont, (rgScriptInfo + cNum)->wszFixedWidthFont,
  477.                                    MAX_MIMEFACE_NAME, LangId);
  478.                 }
  479.                 (rgScriptInfo + cNum)->wszProportionalFont[0] = 0x0000;
  480.                 if (ScriptTable[_uCur].uidProportionalFont)
  481.                 {
  482.                     _LoadStringExW(g_hInst, ScriptTable[_uCur].uidProportionalFont, (rgScriptInfo + cNum)->wszProportionalFont,
  483.                                    MAX_MIMEFACE_NAME, LangId);
  484.                 }
  485.                 cNum++;
  486.                 _uCur++;
  487.             }
  488.             else
  489.                 break;
  490.         }
  491.         if (NULL != pceltFetched)
  492.             *pceltFetched = cNum;
  493.         return (0 < cNum)? S_OK: S_FALSE;
  494.     }
  495.     else
  496.         return E_FAIL;
  497. }
  498. STDAPI CEnumScript::Reset()
  499. {
  500.     DebugMsg(DM_TRACE, TEXT("CEnumScript::Reset called."));
  501.     _uCur = 0;
  502.     return NOERROR;
  503. }
  504. STDAPI CEnumScript::Skip(ULONG celt)
  505. {
  506.     DebugMsg(DM_TRACE, TEXT("CEnumScript::Skip called."));
  507.     _uCur += celt;
  508.     return NOERROR;
  509. }