|
Boost Users : |
Subject: [Boost-users] Compile error OSX Callback problem for FSEventsCallback
From: Bill McLean (bill_at_[hidden])
Date: 2009-01-03 16:59:12
I'm trying to code up a FSEvent callback using a member function. I may be
suffering from a case of the post holiday stupids :)
I am using both the boost::bind and boost::function libraries. I have the
following declaration for declaring the signature of the FSEventCallback:
typedef boost::function<void (
ConstFSEventStreamRef streamRef, // _1
void *clientCallBackInfo, // _2
size_t numEvents, // _3
void *eventPaths, // _4
const FSEventStreamEventFlags eventFlags[], // _5
const FSEventStreamEventId eventIds[] // _6
)> FSEventCallbackT;
The above typedef has been derived from the OSX FSEvent API definition for
the FSEventStreamCallback:
typedef void ( *FSEventStreamCallback)(
ConstFSEventStreamRef streamRef,
void *clientCallBackInfo,
size_t numEvents,
void *eventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[]
);
The skeleton of the struct that has the member function that is to be the
call back is defined as:
struct osx::detail {
// Callback type definition
static const CFAbsoluteTime LATENCY = 2.0;
static const unsigned BUF_SIZE = 32768;
CFStringRef pathToWatch;
CFArrayRef pathsToWatch;
FSEventStreamRef streamRef;
void *callbackInfo;
CFRunLoopRef mainLoop;
boost::mutex event_mutex;
typedef boost::mutex::scoped_lock lock_type;
FSEventCallbackT callBack;
// public methods
detail(
const boost::filesystem::path& base_path
);
~detail() {
stop();
}
void stop();
void FSEventTriggered(
ConstFSEventStreamRef streamRef, // _1
void *clientCallBackInfo, // _2
size_t numEvents, // _3
void *eventPaths, // _4
const FSEventStreamEventFlags eventFlags[], // _5
const FSEventStreamEventId eventIds[] // _6
);
item get_item();
};
In the constructor I get a single compile error in the call to
FSEventStreamCreate:
osx::detail::detail(
const boost::filesystem::path& base_path
) :
base_path(base_path),
stopped(false),
pathToWatch(CFStringCreateWithCString(NULL,base_pa
th.string().c_str(), kCFStringEncodingUTF8)),
pathsToWatch(CFArrayCreate(NULL, (const void **)
&pathToWatch, 1, NULL))
{
callBack = boost::bind(&fsmon ::
osx::detail::FSEventTriggered, this, _1, _2, _3, _4, _5, _6);
streamRef = FSEventStreamCreate(NULL,
&callBack,
callbackInfo,
pathsToWatch,
kFSEventStreamEventIdSinceNow,
LATENCY,
kFSEventStreamCreateFlagNone
);
...
}
/Users/bill/ardev/CurrentDev/InternalLibs/fsmon/osxExample.cpp:111: error:
cannot convert 'FSEventCallbackT*' to 'void (*)(const __FSEventStream*,
void*, size_t, void*, const FSEventStreamEventFlags*, const
FSEventStreamEventId*)' for argument '2' to '__FSEventStream*
FSEventStreamCreate(const __CFAllocator*, void (*)(const __FSEventStream*,
void*, size_t, void*, const FSEventStreamEventFlags*, const
FSEventStreamEventId*), FSEventStreamContext*, const __CFArray*,
FSEventStreamEventId, CFTimeInterval, FSEventStreamCreateFlags)'
The typdef for FSEventCallbackT should be the same as the
void (*)(const __FSEventStream*, void*, size_t, void*, const
FSEventStreamEventFlags*, const FSEventStreamEventId*).
I do not see what I am doing incorrectly. Thanks in advance.
Bill
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net