#include #include #include #include #include "administration.hpp" administration g_administration; void administration_create() { list_init(&g_administration.contacts); list_init(&g_administration.projects); strncpy(g_administration.path, "[unsaved project]", sizeof(g_administration.path)); // @localize } void administration_destroy() { list_destroy(&g_administration.contacts); list_destroy(&g_administration.projects); } bool administration_create_contact(contact data) { contact* new_contact = (contact*)malloc(sizeof(contact)); memcpy((void*)new_contact, (void*)&data, sizeof(contact)); list_append(&g_administration.contacts, new_contact); g_administration.next_id++; return true; } bool administration_update_contact(contact data) { list_iterator_start(&g_administration.contacts); while (list_iterator_hasnext(&g_administration.contacts)) { contact* c = (contact *)list_iterator_next(&g_administration.contacts); if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); list_iterator_stop(&g_administration.contacts); return true; } } list_iterator_stop(&g_administration.contacts); return false; } bool administration_remove_contact(contact data) { list_iterator_start(&g_administration.contacts); while (list_iterator_hasnext(&g_administration.contacts)) { contact* c = (contact *)list_iterator_next(&g_administration.contacts); if (strcmp(c->id, data.id) == 0) { list_iterator_stop(&g_administration.contacts); list_delete(&g_administration.contacts, c); return true; } } list_iterator_stop(&g_administration.contacts); return false; } s32 administration_create_id() { return g_administration.next_id; } u32 administration_get_contact_count() { return list_size(&g_administration.contacts); } u32 administration_get_contacts(u32 page_index, u32 page_size, contact* buffer) { assert(buffer); u32 write_cursor = 0; u32 read_start = page_index * page_size; 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; buffer[write_cursor++] = c; if (write_cursor >= page_size) break; } list_iterator_stop(&g_administration.contacts); return write_cursor; } char* administration_get_file_path() { return g_administration.path; } u32 administration_get_project_count() { return list_size(&g_administration.projects); } u32 administration_get_projects(u32 page_index, u32 page_size, project* buffer) { assert(buffer); u32 write_cursor = 0; u32 read_start = page_index * page_size; list_iterator_start(&g_administration.projects); while (list_iterator_hasnext(&g_administration.projects)) { project c = *(project *)list_iterator_next(&g_administration.projects); if (g_administration.projects.iter_pos <= read_start) continue; buffer[write_cursor++] = c; if (write_cursor >= page_size) break; } list_iterator_stop(&g_administration.projects); return write_cursor; } void administration_cancel_project(project data) { data.end_date = time(NULL); data.state = project_state::CANCELLED; administration_update_project(data); } char* administration_project_get_status_string(project data) { switch(data.state) { case project_state::RUNNING: return "project.state.running"; break; case project_state::PAUSED: return "project.state.paused"; break; case project_state::CANCELLED: return "project.state.cancelled"; break; } } bool administration_create_project(project data) { data.state = project_state::RUNNING; data.start_date = time(NULL); data.end_date = 0; project* new_project = (project*)malloc(sizeof(project)); memcpy((void*)new_project, (void*)&data, sizeof(project)); list_append(&g_administration.projects, new_project); g_administration.next_id++; return true; } bool administration_update_project(project data) { list_iterator_start(&g_administration.projects); while (list_iterator_hasnext(&g_administration.projects)) { project* c = (project *)list_iterator_next(&g_administration.projects); if (strcmp(c->id, data.id) == 0) { memcpy(c, &data, sizeof(data)); list_iterator_stop(&g_administration.projects); return true; } } list_iterator_stop(&g_administration.projects); return false; } bool administration_remove_project(project data) { list_iterator_start(&g_administration.projects); while (list_iterator_hasnext(&g_administration.projects)) { project* c = (project *)list_iterator_next(&g_administration.projects); if (strcmp(c->id, data.id) == 0) { list_iterator_stop(&g_administration.projects); list_delete(&g_administration.projects, c); return true; } } list_iterator_stop(&g_administration.projects); return false; }