[ACPPAGE] Convert CLayerUIPropPage to use CPropertyPageImpl
[reactos.git] / dll / shellext / acppage / CLayerStringList.hpp
1 /*
2 * PROJECT: ReactOS Compatibility Layer Shell Extension
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: CLayerStringList implementation
5 * COPYRIGHT: Copyright 2015-2017 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8
9 /* TODO: Use HSDB instead of PDB */
10 class CLayerStringList :
11 public CComObjectRootEx<CComMultiThreadModelNoCS>,
12 public IEnumString
13 {
14 public:
15 CLayerStringList()
16 :m_root(TAGID_NULL), m_layer(TAGID_NULL)
17 {
18 WCHAR buf[MAX_PATH];
19 SdbGetAppPatchDir(NULL, buf, MAX_PATH);
20 StringCchCatW(buf, _countof(buf), L"\\sysmain.sdb");
21 m_db = SdbOpenDatabase(buf, DOS_PATH);
22 Reset();
23 }
24
25 ~CLayerStringList()
26 {
27 SdbCloseDatabase(m_db);
28 }
29
30 virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched)
31 {
32 if (pceltFetched)
33 *pceltFetched = 0;
34
35 while (celt && m_layer)
36 {
37 TAGID nameid = SdbFindFirstTag(m_db, m_layer, TAG_NAME);
38 if (!nameid)
39 return S_FALSE;
40
41 LPWSTR name = SdbGetStringTagPtr(m_db, nameid);
42 if (!name)
43 return S_FALSE;
44
45 ULONG Size = wcslen(name) + 1;
46
47 *rgelt = (LPOLESTR)::CoTaskMemAlloc(Size * sizeof(WCHAR));
48 StringCchCopyW(*rgelt, Size, name);
49
50 if (pceltFetched)
51 (*pceltFetched)++;
52
53 m_layer = SdbFindNextTag(m_db, m_root, m_layer);
54 celt--;
55 rgelt++;
56 }
57 return celt ? S_FALSE : S_OK;
58 }
59
60 virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt)
61 {
62 while (m_layer && celt)
63 {
64 m_layer = SdbFindNextTag(m_db, m_root, m_layer);
65 --celt;
66 }
67 return celt ? S_FALSE : S_OK;
68 }
69
70 virtual HRESULT STDMETHODCALLTYPE Reset()
71 {
72 m_root = m_layer = TAGID_NULL;
73 if (m_db)
74 {
75 m_root = SdbFindFirstTag(m_db, TAGID_ROOT, TAG_DATABASE);
76 if (m_root != TAGID_NULL)
77 {
78 m_layer = SdbFindFirstTag(m_db, m_root, TAG_LAYER);
79 return S_OK;
80 }
81 }
82 return E_FAIL;
83 }
84
85 virtual HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum)
86 {
87 return E_NOTIMPL;
88 }
89
90 protected:
91 PDB m_db;
92 TAGID m_root;
93 TAGID m_layer;
94
95 public:
96 BEGIN_COM_MAP(CLayerStringList)
97 COM_INTERFACE_ENTRY_IID(IID_IEnumString, IEnumString)
98 END_COM_MAP()
99 };
100