Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
query-file-info.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2//
3// Created by Michael Kowalski on 4/30/25.
4//
5
6#include "query-file-info.h"
7
8#include <iostream>
9#include <unordered_set>
10#include <utility>
11
12namespace Inkscape::UI {
13
14static std::unordered_set<QueryFileInfo*> pending_operations;
15
16QueryFileInfo::QueryFileInfo(const std::string& path_to_test, std::function<void (Glib::RefPtr<Gio::FileInfo>)> on_result):
17 _on_result(std::move(on_result)) {
18
19 _file = Gio::File::create_for_path(path_to_test);
20 _operation = Gio::Cancellable::create();
21 _file->query_info_async([this](auto& r) { results_callback(this, r); }, _operation);
22 pending_operations.insert(this);
23}
24
26 pending_operations.erase(this);
27 _operation->cancel();
28}
29
30void QueryFileInfo::results_callback(QueryFileInfo* self, Glib::RefPtr<Gio::AsyncResult>& result) {
31 if (pending_operations.contains(self)) {
32 self->results(result);
33 pending_operations.erase(self);
34 }
35}
36
37void QueryFileInfo::results(Glib::RefPtr<Gio::AsyncResult>& result) const {
38 try {
39 auto info = _file->query_info_finish(result);
40 _on_result(info);
41 }
42 catch (Glib::Error& ex) {
43 if (ex.code() == 1) {
44 // path points to nonexistent object
45 _on_result({});
46 return;
47 }
48 std::cerr << "Async file query error: " << ex.what() << ", " << ex.code() << std::endl;
49 }
50}
51
52} // namespace
Glib::RefPtr< Gio::Cancellable > _operation
Glib::RefPtr< Gio::File > _file
static void results_callback(QueryFileInfo *self, Glib::RefPtr< Gio::AsyncResult > &result)
std::function< void(Glib::RefPtr< Gio::FileInfo >)> _on_result
void results(Glib::RefPtr< Gio::AsyncResult > &result) const
QueryFileInfo(const std::string &path_to_test, std::function< void(Glib::RefPtr< Gio::FileInfo >)> on_result)
Css & result
User interface code.
Definition desktop.h:113
static std::unordered_set< QueryFileInfo * > pending_operations
STL namespace.