joomer-efsw-file-monitoring/src/efsw/FileWatcherCWrapper.cpp

142 lines
4.5 KiB
C++

#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;
efsw_pfn_handle_missed_fileactions mFnMissedFa;
public:
Watcher_CAPI( efsw_watcher watcher, efsw_pfn_fileaction_callback fn, void* param,
efsw_pfn_handle_missed_fileactions fnfa ) :
mWatcher( watcher ), mFn( fn ), mParam( param ), mFnMissedFa( fnfa ) {}
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 );
}
void handleMissedFileActions( efsw::WatchID watchid, const std::string& dir ) {
if ( mFnMissedFa ) {
mFnMissedFa( mWatcher, watchid, dir.c_str() );
}
}
};
/*************************************************************************************************
* globals
*/
static std::vector<Watcher_CAPI*> g_callbacks;
Watcher_CAPI* find_callback( efsw_watcher watcher, efsw_pfn_fileaction_callback fn, void* param ) {
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 && callback->mParam == param )
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_API void efsw_clearlasterror() {
efsw::Errors::Log::clearLastError();
}
efsw_watchid efsw_addwatch( efsw_watcher watcher, const char* directory,
efsw_pfn_fileaction_callback callback_fn, int recursive, void* param ) {
return efsw_addwatch_withoptions( watcher, directory, callback_fn, recursive, 0, 0, param,
nullptr );
}
efsw_watchid
efsw_addwatch_withoptions( efsw_watcher watcher, const char* directory,
efsw_pfn_fileaction_callback callback_fn, int recursive,
efsw_watcher_option* options, int options_number, void* param,
efsw_pfn_handle_missed_fileactions callback_fn_missed_file_actions ) {
Watcher_CAPI* callback = find_callback( watcher, callback_fn, param );
if ( callback == NULL ) {
callback = new Watcher_CAPI( watcher, callback_fn, param, callback_fn_missed_file_actions );
g_callbacks.push_back( callback );
}
std::vector<efsw::WatcherOption> watcher_options{};
for ( int i = 0; i < options_number; i++ ) {
efsw_watcher_option* option = &options[i];
watcher_options.emplace_back(
efsw::WatcherOption{ static_cast<efsw::Option>( option->option ), option->value } );
}
return ( (efsw::FileWatcher*)watcher )
->addWatch( std::string( directory ), callback, TOBOOL( recursive ), watcher_options );
}
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();
}