refactor(cpp/core): file_watcher usa file_poll_diff
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
#include "file_watcher.h"
|
#include "file_watcher.h"
|
||||||
|
|
||||||
|
#include "core/file_poll_diff.h"
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -280,4 +282,29 @@ const char* file_watcher_last_error(const FileWatcher* w) { return w ? w->last_
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
// Helper portable basado en file_poll_diff (puro). Comun a todas las plataformas.
|
||||||
|
// ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
std::vector<FileEvent> file_watcher_events_from_diff(
|
||||||
|
const std::vector<FileSnapshotEntry>& before,
|
||||||
|
const std::vector<FileSnapshotEntry>& after) {
|
||||||
|
|
||||||
|
// Convertir a fn_ui::FileEntry para llamar a la funcion pura.
|
||||||
|
std::vector<fn_ui::FileEntry> a, b;
|
||||||
|
a.reserve(before.size());
|
||||||
|
b.reserve(after.size());
|
||||||
|
for (const auto& e : before) a.push_back({e.path, e.size, e.mtime});
|
||||||
|
for (const auto& e : after) b.push_back({e.path, e.size, e.mtime});
|
||||||
|
|
||||||
|
fn_ui::FileDiff diff = fn_ui::file_poll_diff(a, b);
|
||||||
|
|
||||||
|
std::vector<FileEvent> out;
|
||||||
|
out.reserve(diff.added.size() + diff.modified.size() + diff.removed.size());
|
||||||
|
for (const auto& p : diff.added) out.push_back({p, FileEvent::Created});
|
||||||
|
for (const auto& p : diff.modified) out.push_back({p, FileEvent::Modified});
|
||||||
|
for (const auto& p : diff.removed) out.push_back({p, FileEvent::Deleted});
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace fn
|
} // namespace fn
|
||||||
|
|||||||
@@ -7,7 +7,12 @@
|
|||||||
// Otros: stub (poll() devuelve siempre vacio)
|
// Otros: stub (poll() devuelve siempre vacio)
|
||||||
//
|
//
|
||||||
// API no bloqueante: poll() drena los eventos disponibles desde la ultima llamada.
|
// API no bloqueante: poll() drena los eventos disponibles desde la ultima llamada.
|
||||||
|
//
|
||||||
|
// Para plataformas sin backend nativo, el caller puede usar la helper
|
||||||
|
// file_watcher_events_from_diff que delega en `file_poll_diff` (puro) para
|
||||||
|
// derivar FileEvents a partir de dos snapshots tomados con stat()/opendir().
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -21,6 +26,14 @@ struct FileEvent {
|
|||||||
Kind kind;
|
Kind kind;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Snapshot de filesystem (forma simple, identica al fn_ui::FileEntry de
|
||||||
|
// file_poll_diff_cpp_core). Se replica aqui para no acoplar headers en apps.
|
||||||
|
struct FileSnapshotEntry {
|
||||||
|
std::string path;
|
||||||
|
uint64_t size = 0;
|
||||||
|
int64_t mtime = 0;
|
||||||
|
};
|
||||||
|
|
||||||
// Crea un watcher vacio. El caller llama destroy.
|
// Crea un watcher vacio. El caller llama destroy.
|
||||||
FileWatcher* file_watcher_create();
|
FileWatcher* file_watcher_create();
|
||||||
|
|
||||||
@@ -38,4 +51,14 @@ std::vector<FileEvent> file_watcher_poll(FileWatcher* w);
|
|||||||
// Devuelve el mensaje del ultimo error (vacio si no hay).
|
// Devuelve el mensaje del ultimo error (vacio si no hay).
|
||||||
const char* file_watcher_last_error(const FileWatcher* w);
|
const char* file_watcher_last_error(const FileWatcher* w);
|
||||||
|
|
||||||
|
// Helper portable: convierte dos snapshots de FS en FileEvents usando la
|
||||||
|
// logica pura `file_poll_diff_cpp_core`. Util en plataformas sin inotify/
|
||||||
|
// RDCW o como fallback de polling. El caller construye los snapshots con
|
||||||
|
// stat()/opendir().
|
||||||
|
//
|
||||||
|
// Mapeo: added -> Created, modified -> Modified, removed -> Deleted.
|
||||||
|
std::vector<FileEvent> file_watcher_events_from_diff(
|
||||||
|
const std::vector<FileSnapshotEntry>& before,
|
||||||
|
const std::vector<FileSnapshotEntry>& after);
|
||||||
|
|
||||||
} // namespace fn
|
} // namespace fn
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ purity: impure
|
|||||||
signature: "fn::FileWatcher* fn::file_watcher_create(); void fn::file_watcher_destroy(fn::FileWatcher*); bool fn::file_watcher_add(fn::FileWatcher*, const char* path); std::vector<fn::FileEvent> fn::file_watcher_poll(fn::FileWatcher*); const char* fn::file_watcher_last_error(const fn::FileWatcher*)"
|
signature: "fn::FileWatcher* fn::file_watcher_create(); void fn::file_watcher_destroy(fn::FileWatcher*); bool fn::file_watcher_add(fn::FileWatcher*, const char* path); std::vector<fn::FileEvent> fn::file_watcher_poll(fn::FileWatcher*); const char* fn::file_watcher_last_error(const fn::FileWatcher*)"
|
||||||
description: "Watcher de archivos/directorios cross-platform (Linux inotify, Windows ReadDirectoryChangesW). API no bloqueante: registra paths con add() y consulta eventos con poll(). Cada poll() drena todos los eventos pendientes desde la llamada anterior."
|
description: "Watcher de archivos/directorios cross-platform (Linux inotify, Windows ReadDirectoryChangesW). API no bloqueante: registra paths con add() y consulta eventos con poll(). Cada poll() drena todos los eventos pendientes desde la llamada anterior."
|
||||||
tags: [filesystem, watcher, inotify, file_events, io]
|
tags: [filesystem, watcher, inotify, file_events, io]
|
||||||
uses_functions: []
|
uses_functions: ["file_poll_diff_cpp_core"]
|
||||||
uses_types: []
|
uses_types: []
|
||||||
returns: []
|
returns: []
|
||||||
returns_optional: false
|
returns_optional: false
|
||||||
|
|||||||
Reference in New Issue
Block a user