MCPcopy Create free account
hub / github.com/InteractiveComputerGraphics/SPlisHSPlasH / AppendSingleFilter

Function AppendSingleFilter

extern/nfd/nfd_portal.cpp:183–247  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

181void AppendOpenFileQueryDictEntryDirectory<false>(DBusMessageIter&) {}
182
183void AppendSingleFilter(DBusMessageIter& base_iter, const nfdnfilteritem_t& filter) {
184 DBusMessageIter filter_list_struct_iter;
185 DBusMessageIter filter_sublist_iter;
186 DBusMessageIter filter_sublist_struct_iter;
187 dbus_message_iter_open_container(
188 &base_iter, DBUS_TYPE_STRUCT, nullptr, &filter_list_struct_iter);
189 // count number of file extensions
190 size_t sep = 1;
191 for (const char* p = filter.spec; *p; ++p) {
192 if (*p == L',') {
193 ++sep;
194 }
195 }
196 {
197 const size_t name_len = strlen(filter.name);
198 const size_t spec_len = strlen(filter.spec);
199 char* buf = static_cast<char*>(alloca(sep + name_len + 2 + spec_len + 1));
200 char* buf_end = buf;
201 buf_end = copy(filter.name, filter.name + name_len, buf_end);
202 *buf_end++ = ' ';
203 *buf_end++ = '(';
204 const char* spec_ptr = filter.spec;
205 do {
206 *buf_end++ = *spec_ptr;
207 if (*spec_ptr == ',') *buf_end++ = ' ';
208 ++spec_ptr;
209 } while (*spec_ptr != '\0');
210 *buf_end++ = ')';
211 *buf_end = '\0';
212 dbus_message_iter_append_basic(&filter_list_struct_iter, DBUS_TYPE_STRING, &buf);
213 }
214 {
215 dbus_message_iter_open_container(
216 &filter_list_struct_iter, DBUS_TYPE_ARRAY, "(us)", &filter_sublist_iter);
217 const char* extn_begin = filter.spec;
218 const char* extn_end = extn_begin;
219 while (true) {
220 dbus_message_iter_open_container(
221 &filter_sublist_iter, DBUS_TYPE_STRUCT, nullptr, &filter_sublist_struct_iter);
222 {
223 const unsigned zero = 0;
224 dbus_message_iter_append_basic(
225 &filter_sublist_struct_iter, DBUS_TYPE_UINT32, &zero);
226 }
227 do {
228 ++extn_end;
229 } while (*extn_end != ',' && *extn_end != '\0');
230 char* buf = static_cast<char*>(alloca(2 + (extn_end - extn_begin) + 1));
231 char* buf_end = buf;
232 *buf_end++ = '*';
233 *buf_end++ = '.';
234 buf_end = copy(extn_begin, extn_end, buf_end);
235 *buf_end = '\0';
236 dbus_message_iter_append_basic(&filter_sublist_struct_iter, DBUS_TYPE_STRING, &buf);
237 dbus_message_iter_close_container(&filter_sublist_iter, &filter_sublist_struct_iter);
238 if (*extn_end == '\0') {
239 break;
240 }

Calls 1

copyFunction · 0.70

Tested by

no test coverage detected