michael@0: // Copyright (c) 2008 The Chromium Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: michael@0: #ifndef CHROME_COMMON_MACH_MESSAGE_SOURCE_MAC_H_ michael@0: #define CHROME_COMMON_MACH_MESSAGE_SOURCE_MAC_H_ michael@0: michael@0: #include michael@0: michael@0: #include "base/scoped_cftyperef.h" michael@0: michael@0: // Handles registering and cleaning up after a CFRunloopSource for a Mach port. michael@0: // Messages received on the port are piped through to a delegate. michael@0: // michael@0: // Example: michael@0: // class MyListener : public MachMessageSource::MachPortListener { michael@0: // public: michael@0: // void OnMachMessageReceived(void* mach_msg, size_t size) { michael@0: // printf("received message on Mach port\n"); michael@0: // } michael@0: // }; michael@0: // michael@0: // mach_port_t a_port = ...; michael@0: // MyListener listener; michael@0: // bool success = false; michael@0: // MachMessageSource message_source(port, listener, &success); michael@0: // michael@0: // if (!success) { michael@0: // exit(1); // Couldn't register mach runloop source. michael@0: // } michael@0: // michael@0: // CFRunLoopRun(); // Process messages on runloop... michael@0: class MachMessageSource { michael@0: public: michael@0: // Classes that want to listen on a Mach port can implement michael@0: // OnMachMessageReceived, |mach_msg| is a pointer to the raw message data and michael@0: // |size| is the buffer size; michael@0: class MachPortListener { michael@0: public: michael@0: virtual void OnMachMessageReceived(void* mach_msg, size_t size) = 0; michael@0: }; michael@0: michael@0: // |listener| is a week reference passed to CF, it needs to remain in michael@0: // existence till this object is destroeyd. michael@0: MachMessageSource(mach_port_t port, michael@0: MachPortListener* listener, michael@0: bool* success); michael@0: ~MachMessageSource(); michael@0: michael@0: private: michael@0: // Called by CF when a new message arrives on the Mach port. michael@0: static void OnReceiveMachMessage(CFMachPortRef port, void* msg, CFIndex size, michael@0: void* closure); michael@0: michael@0: scoped_cftyperef machport_runloop_ref_; michael@0: DISALLOW_COPY_AND_ASSIGN(MachMessageSource); michael@0: }; michael@0: michael@0: #endif // CHROME_COMMON_MACH_MESSAGE_SOURCE_MAC_H_