Skip to content

Commit

Permalink
fix #1284
Browse files Browse the repository at this point in the history
  • Loading branch information
alainm23 committed May 11, 2024
1 parent 46ff4b9 commit 28b2498
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 47 deletions.
49 changes: 44 additions & 5 deletions core/Services/CalDAV/Core.vala
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,15 @@ public class Services.CalDAV.Core : GLib.Object {
</x0:propfind>
""";
// vala-lint=naming-convention
public static string GET_SYNC_TOKEN_REQUEST = """
<x0:propfind xmlns:x0="DAV:">
<x0:prop>
<x0:sync-token/>
</x0:prop>
</x0:propfind>
""";
// vala-lint=naming-convention
public static string CREATE_TASKLIST_REQUEST = """
<x0:mkcol xmlns:x0="DAV:">
Expand Down Expand Up @@ -646,18 +655,17 @@ public class Services.CalDAV.Core : GLib.Object {
foreach (GXml.DomElement element in response) {
GXml.DomHTMLCollection status = element.get_elements_by_tag_name ("d:status");
string ics = get_task_ics_from_url (element);
bool is_vtodo = is_vtodo (element);

if (!is_vtodo) {
continue;
}

if (status.length > 0 && status.get_element (0).text_content == "HTTP/1.1 404 Not Found") {
Objects.Item? item = Services.Database.get_default ().get_item_by_ics (ics);
if (item != null) {
Services.Database.get_default ().delete_item (item);
}
} else {
if (!is_vtodo (element)) {
continue;
}

string vtodo = yield get_vtodo_by_url (project.id, ics);

ICal.Component ical = new ICal.Component.from_string (vtodo);
Expand Down Expand Up @@ -892,6 +900,37 @@ public class Services.CalDAV.Core : GLib.Object {
return return_value;
}

public async HttpResponse get_sync_token (Objects.Project project) {
var server_url = Services.Settings.get_default ().settings.get_string ("caldav-server-url");
var username = Services.Settings.get_default ().settings.get_string ("caldav-username");

var url = "%s/remote.php/dav/calendars/%s/%s/".printf (server_url, username, project.id);
var message = new Soup.Message ("PROPFIND", url);

HttpResponse return_value = new HttpResponse ();

try {
yield set_credential (message);
message.set_request_body_from_bytes ("application/xml", new Bytes ((GET_SYNC_TOKEN_REQUEST).data));

GLib.Bytes stream = yield session.send_and_read_async (message, GLib.Priority.HIGH, null);

print_root ("get_tasklist", (string) stream.get_data ());

GXml.DomDocument doc = new GXml.Document.from_string ((string) stream.get_data ());
GXml.DomHTMLCollection sync_token_collection = doc.get_elements_by_tag_name ("d:sync-token");

if (sync_token_collection.length > 0) {
return_value.status = true;
return_value.data = sync_token_collection.get_element (0).text_content;
}
} catch (Error e) {
debug (e.message);
}

return return_value;
}

/*
* Task
*/
Expand Down
94 changes: 57 additions & 37 deletions src/Dialogs/Project.vala
Original file line number Diff line number Diff line change
Expand Up @@ -310,50 +310,70 @@ public class Dialogs.Project : Adw.Window {
submit_button.is_loading = true;

if (!is_creating) {
if (project.backend_type == BackendType.LOCAL) {
update_project ();
} else {
add_project ();
}
}


private void update_project () {
if (project.backend_type == BackendType.LOCAL) {
Services.Database.get_default ().update_project (project);
hide_destroy ();
} else if (project.backend_type == BackendType.TODOIST) {
Services.Todoist.get_default ().update.begin (project, (obj, res) => {
Services.Todoist.get_default ().update.end (res);
Services.Database.get_default ().update_project (project);
hide_destroy ();
} else if (project.backend_type == BackendType.TODOIST) {
Services.Todoist.get_default ().update.begin (project, (obj, res) => {
Services.Todoist.get_default ().update.end (res);
});
} else if (project.backend_type == BackendType.CALDAV) {
Services.CalDAV.Core.get_default ().update_tasklist.begin (project, (obj, res) => {
if (Services.CalDAV.Core.get_default ().update_tasklist.end (res)) {
Services.Database.get_default ().update_project (project);
hide_destroy ();
});
} else if (project.backend_type == BackendType.CALDAV) {
Services.CalDAV.Core.get_default ().update_tasklist.begin (project, (obj, res) => {
if (Services.CalDAV.Core.get_default ().update_tasklist.end (res)) {
Services.Database.get_default ().update_project (project);
hide_destroy ();
}
});
}
} else {
project.child_order = Services.Database.get_default ().get_projects_by_backend_type (project.backend_type).size;
if (project.backend_type == BackendType.LOCAL || project.backend_type == BackendType.NONE) {
project.id = Util.get_default ().generate_id (project);
project.backend_type = BackendType.LOCAL;
Services.Database.get_default ().insert_project (project);
go_project (project.id_string);
} else if (project.backend_type == BackendType.TODOIST) {
Services.Todoist.get_default ().add.begin (project, (obj, res) => {
HttpResponse response = Services.Todoist.get_default ().add.end (res);
}
});
}
}

private void add_project () {
project.child_order = Services.Database.get_default ().get_projects_by_backend_type (project.backend_type).size;

if (project.backend_type == BackendType.LOCAL || project.backend_type == BackendType.NONE) {
project.id = Util.get_default ().generate_id (project);
project.backend_type = BackendType.LOCAL;

Services.Database.get_default ().insert_project (project);
go_project (project.id_string);
} else if (project.backend_type == BackendType.TODOIST) {
Services.Todoist.get_default ().add.begin (project, (obj, res) => {
HttpResponse response = Services.Todoist.get_default ().add.end (res);

if (response.status) {
project.id = response.data;
Services.Database.get_default ().insert_project (project);
go_project (project.id_string);
}
});
} else if (project.backend_type == BackendType.CALDAV) {
project.id = Util.get_default ().generate_id (project);
project.backend_type = BackendType.CALDAV;

Services.CalDAV.Core.get_default ().add_tasklist.begin (project, (obj, res) => {
if (Services.CalDAV.Core.get_default ().add_tasklist.end (res)) {
Services.CalDAV.Core.get_default ().get_sync_token.begin (project, (obj, res) => {
HttpResponse response = Services.CalDAV.Core.get_default ().get_sync_token.end (res);

if (response.status) {
project.sync_id = response.data;
}

if (response.status) {
project.id = response.data;
Services.Database.get_default ().insert_project (project);
go_project (project.id_string);
}
});
} else if (project.backend_type == BackendType.CALDAV) {
project.id = Util.get_default ().generate_id (project);
project.backend_type = BackendType.CALDAV;
Services.CalDAV.Core.get_default ().add_tasklist.begin (project, (obj, res) => {
if (Services.CalDAV.Core.get_default ().add_tasklist.end (res)) {
Services.Database.get_default ().insert_project (project);
go_project (project.id_string);
}
});
}
});
}
});
}
}

Expand Down
22 changes: 17 additions & 5 deletions src/Layouts/ProjectRow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -707,11 +707,15 @@ public class Layouts.ProjectRow : Gtk.ListBoxRow {
refresh_item.clicked.connect (() => {
menu_popover.popdown ();

is_loading = true;
Services.CalDAV.Core.get_default ().sync_tasklist.begin (project, (obj, res) => {
Services.CalDAV.Core.get_default ().sync_tasklist.end (res);
is_loading = false;
});
if (project.sync_id == "") {
is_loading = true;
Services.CalDAV.Core.get_default ().refresh_tasklist.begin (project, (obj, res) => {
Services.CalDAV.Core.get_default ().refresh_tasklist.end (res);
is_loading = false;
});
} else {
sync_project ();
}
});

delete_item.clicked.connect (() => {
Expand Down Expand Up @@ -740,6 +744,14 @@ public class Layouts.ProjectRow : Gtk.ListBoxRow {
});
}

private void sync_project () {
is_loading = true;
Services.CalDAV.Core.get_default ().sync_tasklist.begin (project, (obj, res) => {
Services.CalDAV.Core.get_default ().sync_tasklist.end (res);
is_loading = false;
});
}

private void update_listbox_revealer () {
if (listbox_revealer.reveal_child) {
project.collapsed = true;
Expand Down

0 comments on commit 28b2498

Please sign in to comment.