Files
oak-editor/engine/src/capi/disk.cpp
T
Mike-Solar e9f173916f engine: complete C ABI facade (liboakengine oakengine_* surface)
The full pure-C facade used by the app: node/project/timeline/viewer/
undo/task/events/serializer/playback/preview/renderer/gizmo/color/
audio/footage/proxy/encoding/exporter/config/disk/ipc/plugin/worker
families, plus undo-group semantics, display renderer handles,
NodeFactory accessors, and per-family pure-C engine tests.
2026-07-26 22:43:00 +08:00

188 lines
4.3 KiB
C++

/***
Oak - Non-Linear Video Editor
Copyright (C) 2026 Oak Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
***/
#include "oakengine/disk.h"
#include <cstring>
#include <QByteArray>
#include <QString>
#include <QWidget>
#include "node/project.h"
#include "render/diskmanager.h"
namespace
{
int write_string(const QString &s, char *buf, int buf_size)
{
const QByteArray utf8 = s.toUtf8();
const int len = int(utf8.size());
if (buf && buf_size > 0) {
const int n = qMin(len, buf_size - 1);
std::memcpy(buf, utf8.constData(), size_t(n));
buf[n] = '\0';
}
return len;
}
olive::DiskManager *manager()
{
return olive::DiskManager::instance();
}
olive::DiskCacheFolder *folder_from_path(olive::DiskManager *m,
const char *path)
{
if (!m) {
return nullptr;
}
if (!path || std::strlen(path) == 0) {
return m->get_default_cache_folder();
}
return m->get_open_folder(QString::fromUtf8(path));
}
struct SettingsHandlerState {
oakengine_disk_settings_fn fn = nullptr;
void *userdata = nullptr;
};
SettingsHandlerState g_settings_handler;
void cpp_settings_handler(olive::DiskCacheFolder *folder, QWidget *parent)
{
if (!g_settings_handler.fn || !folder) {
return;
}
const QByteArray path = folder->get_path().toUtf8();
g_settings_handler.fn(path.constData(), parent, g_settings_handler.userdata);
}
} // namespace
extern "C" int oakengine_disk_create_instance(void)
{
olive::DiskManager::create_instance();
return manager() ? OAKENGINE_OK : OAKENGINE_E_FAILED;
}
extern "C" int oakengine_disk_destroy_instance(void)
{
olive::DiskManager::destroy_instance();
return OAKENGINE_OK;
}
extern "C" int oakengine_disk_set_settings_handler(
oakengine_disk_settings_fn fn, void *userdata)
{
g_settings_handler.fn = fn;
g_settings_handler.userdata = userdata;
olive::DiskManager::set_show_disk_cache_settings_handler(
fn ? cpp_settings_handler : olive::DiskManager::ShowDiskCacheSettingsHandler{});
return OAKENGINE_OK;
}
extern "C" int oakengine_disk_show_settings_dialog(const char *path,
void *parent_window)
{
olive::DiskManager *m = manager();
if (!m) {
return OAKENGINE_E_STATE;
}
olive::DiskCacheFolder *folder = folder_from_path(m, path);
if (!folder) {
return OAKENGINE_E_FAILED;
}
m->show_disk_cache_settings_dialog(folder,
static_cast<QWidget *>(parent_window));
return OAKENGINE_OK;
}
extern "C" int oakengine_disk_show_change_confirmation_dialog(
void *parent_window)
{
return olive::DiskManager::show_disk_cache_change_confirmation_dialog(
static_cast<QWidget *>(parent_window))
? 1
: 0;
}
extern "C" int oakengine_disk_clear_cache(const char *path)
{
olive::DiskManager *m = manager();
if (!m) {
return 0;
}
olive::DiskCacheFolder *folder = folder_from_path(m, path);
if (!folder) {
return 0;
}
return m->clear_disk_cache(folder->get_path()) ? 1 : 0;
}
extern "C" int oakengine_disk_get_default_cache_path(char *buf, int buf_size)
{
olive::DiskManager *m = manager();
if (!m) {
return OAKENGINE_E_STATE;
}
return write_string(m->get_default_cache_path(), buf, buf_size);
}
extern "C" int oakengine_disk_set_default_cache_path(const char *path)
{
if (!path) {
return OAKENGINE_E_INVALID;
}
olive::DiskManager *m = manager();
if (!m) {
return OAKENGINE_E_STATE;
}
m->get_default_cache_folder()->set_path(QString::fromUtf8(path));
return OAKENGINE_OK;
}
extern "C" void *oakengine_disk_get_open_folder(const char *path)
{
return folder_from_path(manager(), path);
}
extern "C" int oakengine_disk_invalidate_project(OakEngineProject *project)
{
olive::DiskManager *m = manager();
if (!m) {
return OAKENGINE_E_STATE;
}
emit m->invalidate_project(reinterpret_cast<olive::Project *>(project));
return OAKENGINE_OK;
}