| 181 | void AppendOpenFileQueryDictEntryDirectory<false>(DBusMessageIter&) {} |
| 182 | |
| 183 | void 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 | } |
no test coverage detected