$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
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