annotate foosdk/sdk/libPPUI/CEnumString.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <memory>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "pp-COM-macros.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 namespace PP {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class CEnumString : public IEnumString {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 typedef pfc::chain_list_v2_t<pfc::array_t<TCHAR> > t_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 struct shared_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 t_data m_data;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 pfc::mutex m_sync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 typedef std::shared_ptr<shared_t> shared_ptr_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 CEnumString(t_data && in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 m_shared = std::make_shared<shared_t>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 m_shared->m_data = std::move(in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 CEnumString(const t_data & in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 m_shared = std::make_shared<shared_t>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 m_shared->m_data = in;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 CEnumString() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 m_shared = std::make_shared< shared_t >();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 void SetStrings(t_data && data) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 m_shared->m_data = std::move(data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 static pfc::array_t<TCHAR> stringToBuffer(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 pfc::array_t<TCHAR> arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 arr.set_size(pfc::stringcvt::estimate_utf8_to_wide(in));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 pfc::stringcvt::convert_utf8_to_wide_unchecked(arr.get_ptr(), in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return arr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void AddString(const TCHAR * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 m_shared->m_data.insert_last()->set_data_fromptr(in, _tcslen(in) + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 void AddStringU(const char * in, t_size len) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 pfc::array_t<TCHAR> & arr = *m_shared->m_data.insert_last();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 arr.set_size(pfc::stringcvt::estimate_utf8_to_wide(in, len));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 pfc::stringcvt::convert_utf8_to_wide(arr.get_ptr(), arr.get_size(), in, len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 void AddStringU(const char * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 *m_shared->m_data.insert_last() = stringToBuffer(in);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void ResetStrings() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 m_shared->m_data.remove_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 typedef ImplementCOMRefCounter<CEnumString> TImpl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 COM_QI_BEGIN()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 COM_QI_ENTRY(IUnknown)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 COM_QI_ENTRY(IEnumString)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 COM_QI_END()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 if (rgelt == NULL) return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 ULONG done = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 while (done < celt && m_walk.is_valid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 rgelt[done] = CoStrDup(m_walk->get_ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 ++m_walk; ++done;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 if (pceltFetched != NULL) *pceltFetched = done;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 return done == celt ? S_OK : S_FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 HRESULT STDMETHODCALLTYPE Skip(ULONG celt) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 while (celt > 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 if (m_walk.is_empty()) return S_FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 --celt; ++m_walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 HRESULT STDMETHODCALLTYPE Reset() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 myReset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 PFC_INSYNC(m_shared->m_sync);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 *ppenum = new TImpl(*this); return S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void myReset() { m_walk = m_shared->m_data.first(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 static TCHAR * CoStrDup(const TCHAR * in) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 const size_t lenBytes = (_tcslen(in) + 1) * sizeof(TCHAR);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 TCHAR * out = reinterpret_cast<TCHAR*>(CoTaskMemAlloc(lenBytes));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 if (out) memcpy(out, in, lenBytes);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 shared_ptr_t m_shared;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 t_data::const_iterator m_walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 }