diff --git a/include/webfuse/adapter/mountpoint.h b/include/webfuse/adapter/mountpoint.h index 0dba1cd..7936b83 100644 --- a/include/webfuse/adapter/mountpoint.h +++ b/include/webfuse/adapter/mountpoint.h @@ -8,6 +8,10 @@ extern "C" struct wf_mountpoint; +typedef void +wf_mountpoint_ondispose_fn( + struct wf_mountpoint * mountpoint); + extern struct wf_mountpoint * wf_mountpoint_create( char const * path); @@ -20,6 +24,11 @@ extern char const * wf_mountpoint_get_path( struct wf_mountpoint const * mountpoint); +extern void +wf_mountpoint_set_ondispose( + struct wf_mountpoint * mountpoint, + wf_mountpoint_ondispose_fn * ondispose); + #ifdef __cplusplus } #endif diff --git a/lib/webfuse/adapter/api.c b/lib/webfuse/adapter/api.c index 370a55e..64f55a3 100644 --- a/lib/webfuse/adapter/api.c +++ b/lib/webfuse/adapter/api.c @@ -158,3 +158,11 @@ wf_mountpoint_get_path( { return wf_impl_mountpoint_get_path(mountpoint); } + +void +wf_mountpoint_set_ondispose( + struct wf_mountpoint * mountpoint, + wf_mountpoint_ondispose_fn * ondispose) +{ + wf_impl_mountpoint_set_ondispose(mountpoint, ondispose); +} diff --git a/lib/webfuse/adapter/impl/mountpoint.c b/lib/webfuse/adapter/impl/mountpoint.c index 55535d6..ade1223 100644 --- a/lib/webfuse/adapter/impl/mountpoint.c +++ b/lib/webfuse/adapter/impl/mountpoint.c @@ -6,14 +6,23 @@ struct wf_mountpoint { char * path; + wf_mountpoint_ondispose_fn * ondispose; }; +static void wf_impl_mountpoint_default_ondispose( + struct wf_mountpoint * mountpoint) +{ + (void) mountpoint; + // empty +} + struct wf_mountpoint * wf_impl_mountpoint_create( char const * path) { struct wf_mountpoint * mountpoint = malloc(sizeof(struct wf_mountpoint)); mountpoint->path = strdup(path); + mountpoint->ondispose = &wf_impl_mountpoint_default_ondispose; return mountpoint; } @@ -22,6 +31,8 @@ void wf_impl_mountpoint_dispose( struct wf_mountpoint * mountpoint) { + mountpoint->ondispose(mountpoint); + free(mountpoint->path); free(mountpoint); } @@ -32,3 +43,11 @@ wf_impl_mountpoint_get_path( { return mountpoint->path; } + +void +wf_impl_mountpoint_set_ondispose( + struct wf_mountpoint * mountpoint, + wf_mountpoint_ondispose_fn * ondispose) +{ + mountpoint->ondispose = ondispose; +} diff --git a/lib/webfuse/adapter/impl/mountpoint.h b/lib/webfuse/adapter/impl/mountpoint.h index eb0145c..a7041f8 100644 --- a/lib/webfuse/adapter/impl/mountpoint.h +++ b/lib/webfuse/adapter/impl/mountpoint.h @@ -1,6 +1,8 @@ #ifndef WF_IMPL_MOUNTPOINT_H #define WF_IMPL_MOUNTPOINT_H +#include "webfuse/adapter/mountpoint.h" + #ifdef __cplusplus extern "C" { @@ -18,6 +20,10 @@ extern char const * wf_impl_mountpoint_get_path( struct wf_mountpoint const * mountpoint); +extern void +wf_impl_mountpoint_set_ondispose( + struct wf_mountpoint * mointpoint, + wf_mountpoint_ondispose_fn * ondispose); #ifdef __cplusplus } diff --git a/test/adapter/test_mountpoint.cc b/test/adapter/test_mountpoint.cc index e21d176..a3d82c6 100644 --- a/test/adapter/test_mountpoint.cc +++ b/test/adapter/test_mountpoint.cc @@ -1,12 +1,45 @@ #include +#include #include "webfuse/adapter/mountpoint.h" +namespace +{ + class MockMountpointDisposer + { + public: + MOCK_METHOD1(ondispose, void(wf_mountpoint * mountpoint)); + }; + + MockMountpointDisposer * global_disposer = nullptr; + + void ondispose(wf_mountpoint * mountpoint) + { + global_disposer->ondispose(mountpoint); + } +} + TEST(mountpoint, get_path) { wf_mountpoint * mountpoint = wf_mountpoint_create("/some/path"); - ASSERT_NE(nullptr, mountpoint); + ASSERT_STREQ("/some/path", wf_mountpoint_get_path(mountpoint)); wf_mountpoint_dispose(mountpoint); } + + + +TEST(mountpoint, ondispose) +{ + MockMountpointDisposer disposer; + global_disposer = &disposer; + + wf_mountpoint * mountpoint = wf_mountpoint_create("/some/path"); + ASSERT_NE(nullptr, mountpoint); + + wf_mountpoint_set_ondispose(mountpoint, ondispose); + EXPECT_CALL(disposer, ondispose(mountpoint)).Times(1); + + wf_mountpoint_dispose(mountpoint); +} \ No newline at end of file