summaryrefslogtreecommitdiff
path: root/src/administration.cpp
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-10-12 14:13:32 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-10-12 14:13:32 +0200
commit035bf5c318515406912678716e059b8e8546ce02 (patch)
tree0e70f7b1bbdf7aa149cd856306806565950667e1 /src/administration.cpp
parentb6990df3d783da0a09e8b6a825d9ebeb7314466a (diff)
contact search filter
Diffstat (limited to 'src/administration.cpp')
-rw-r--r--src/administration.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/administration.cpp b/src/administration.cpp
index 6e6cfb4..a6f7187 100644
--- a/src/administration.cpp
+++ b/src/administration.cpp
@@ -882,9 +882,20 @@ a_err administration::contact_remove(contact data)
return A_ERR_NOT_FOUND;
}
-u32 administration::contact_count()
+u32 administration::contact_count(contact_filter* filter)
{
- return list_size(&g_administration.contacts);
+ if (!filter) return list_size(&g_administration.contacts);
+
+ u32 count = 0;
+ list_iterator_start(&g_administration.contacts);
+ while (list_iterator_hasnext(&g_administration.contacts)) {
+ contact c = *(contact *)list_iterator_next(&g_administration.contacts);
+
+ if (!strops::contains(c.name, filter->name_filter)) continue;
+ count++;
+ }
+ list_iterator_stop(&g_administration.contacts);
+ return count;
}
u32 administration::contact_get_all(contact* buffer)
@@ -901,19 +912,22 @@ u32 administration::contact_get_all(contact* buffer)
return write_cursor;
}
-u32 administration::contact_get_partial_list(u32 page_index, u32 page_size, contact* buffer)
+u32 administration::contact_get_partial_list(u32 page_index, u32 page_size, contact* buffer, contact_filter* filter)
{
assert(buffer);
u32 write_cursor = 0;
u32 read_start = page_index * page_size;
+ u32 read_cursor = 0;
list_iterator_start(&g_administration.contacts);
while (list_iterator_hasnext(&g_administration.contacts)) {
contact c = *(contact *)list_iterator_next(&g_administration.contacts);
- if (g_administration.contacts.iter_pos <= read_start) continue;
+ if (!strops::contains(c.name, filter->name_filter)) continue;
+
+ if (++read_cursor <= read_start) continue;
buffer[write_cursor++] = c;
if (write_cursor >= page_size) break;