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)
9 /* TODO: Use HSDB instead of PDB */
10 class CLayerStringList :
11 public CComObjectRootEx<CComMultiThreadModelNoCS>,
16 :m_root(TAGID_NULL), m_layer(TAGID_NULL)
19 SdbGetAppPatchDir(NULL, buf, MAX_PATH);
20 StringCchCatW(buf, _countof(buf), L"\\sysmain.sdb");
21 m_db = SdbOpenDatabase(buf, DOS_PATH);
27 SdbCloseDatabase(m_db);
30 virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched)
35 while (celt && m_layer)
37 TAGID nameid = SdbFindFirstTag(m_db, m_layer, TAG_NAME);
41 LPWSTR name = SdbGetStringTagPtr(m_db, nameid);
45 ULONG Size = wcslen(name) + 1;
47 *rgelt = (LPOLESTR)::CoTaskMemAlloc(Size * sizeof(WCHAR));
48 StringCchCopyW(*rgelt, Size, name);
53 m_layer = SdbFindNextTag(m_db, m_root, m_layer);
57 return celt ? S_FALSE : S_OK;
60 virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt)
62 while (m_layer && celt)
64 m_layer = SdbFindNextTag(m_db, m_root, m_layer);
67 return celt ? S_FALSE : S_OK;
70 virtual HRESULT STDMETHODCALLTYPE Reset()
72 m_root = m_layer = TAGID_NULL;
75 m_root = SdbFindFirstTag(m_db, TAGID_ROOT, TAG_DATABASE);
76 if (m_root != TAGID_NULL)
78 m_layer = SdbFindFirstTag(m_db, m_root, TAG_LAYER);
85 virtual HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum)
96 BEGIN_COM_MAP(CLayerStringList)
97 COM_INTERFACE_ENTRY_IID(IID_IEnumString, IEnumString)