#include <efsw/efsw.h> #include <efsw/efsw.hpp> #include <vector> #define TOBOOL( i ) ( ( i ) == 0 ? false : true ) /*************************************************************************************************/ class Watcher_CAPI : public efsw::FileWatchListener { public: efsw_watcher mWatcher; efsw_pfn_fileaction_callback mFn; void* mParam; public: Watcher_CAPI( efsw_watcher watcher, efsw_pfn_fileaction_callback fn, void* param ) : mWatcher( watcher ), mFn( fn ), mParam( param ) {} void handleFileAction( efsw::WatchID watchid, const std::string& dir, const std::string& filename, efsw::Action action, std::string oldFilename = "" ) { mFn( mWatcher, watchid, dir.c_str(), filename.c_str(), (enum efsw_action)action, oldFilename.c_str(), mParam ); } }; /************************************************************************************************* * globals */ static std::vector<Watcher_CAPI*> g_callbacks; Watcher_CAPI* find_callback( efsw_watcher watcher, efsw_pfn_fileaction_callback fn ) { for ( std::vector<Watcher_CAPI*>::iterator i = g_callbacks.begin(); i != g_callbacks.end(); ++i ) { Watcher_CAPI* callback = *i; if ( callback->mFn == fn && callback->mWatcher == watcher ) return *i; } return NULL; } Watcher_CAPI* remove_callback( efsw_watcher watcher ) { std::vector<Watcher_CAPI*>::iterator i = g_callbacks.begin(); while ( i != g_callbacks.end() ) { Watcher_CAPI* callback = *i; if ( callback->mWatcher == watcher ) i = g_callbacks.erase( i ); else ++i; } return NULL; } /*************************************************************************************************/ efsw_watcher efsw_create( int generic_mode ) { return ( efsw_watcher ) new efsw::FileWatcher( TOBOOL( generic_mode ) ); } void efsw_release( efsw_watcher watcher ) { remove_callback( watcher ); delete (efsw::FileWatcher*)watcher; } const char* efsw_getlasterror() { static std::string log_str; log_str = efsw::Errors::Log::getLastErrorLog(); return log_str.c_str(); } efsw_watchid efsw_addwatch( efsw_watcher watcher, const char* directory, efsw_pfn_fileaction_callback callback_fn, int recursive, void* param ) { Watcher_CAPI* callback = find_callback( watcher, callback_fn ); if ( callback == NULL ) { callback = new Watcher_CAPI( watcher, callback_fn, param ); g_callbacks.push_back( callback ); } return ( (efsw::FileWatcher*)watcher ) ->addWatch( std::string( directory ), callback, TOBOOL( recursive ) ); } void efsw_removewatch( efsw_watcher watcher, const char* directory ) { ( (efsw::FileWatcher*)watcher )->removeWatch( std::string( directory ) ); } void efsw_removewatch_byid( efsw_watcher watcher, efsw_watchid watchid ) { ( (efsw::FileWatcher*)watcher )->removeWatch( watchid ); } void efsw_watch( efsw_watcher watcher ) { ( (efsw::FileWatcher*)watcher )->watch(); } void efsw_follow_symlinks( efsw_watcher watcher, int enable ) { ( (efsw::FileWatcher*)watcher )->followSymlinks( TOBOOL( enable ) ); } int efsw_follow_symlinks_isenabled( efsw_watcher watcher ) { return (int)( (efsw::FileWatcher*)watcher )->followSymlinks(); } void efsw_allow_outofscopelinks( efsw_watcher watcher, int allow ) { ( (efsw::FileWatcher*)watcher )->allowOutOfScopeLinks( TOBOOL( allow ) ); } int efsw_outofscopelinks_isallowed( efsw_watcher watcher ) { return (int)( (efsw::FileWatcher*)watcher )->allowOutOfScopeLinks(); }