diff options
author | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-24 21:37:13 +0000 |
---|---|---|
committer | jeremy@chromium.org <jeremy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-24 21:37:13 +0000 |
commit | 37eedd8a6922e9810fd35df3a609126edf1c7a05 (patch) | |
tree | 26ee21747afcf74a4e03d9f2865769e7f4b7dff1 /chrome/common/mach_message_source_mac.cc | |
parent | 22bb1a47a2fa1510c525c7dfe8c8d14058a337ba (diff) | |
download | chromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.zip chromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.tar.gz chromium_src-37eedd8a6922e9810fd35df3a609126edf1c7a05.tar.bz2 |
Add class to encapsulate a CF Mach Message Source and handle it's liftime.
This class handles adding a listener on Mach port to the current CFRunloop and
calling a delegate when a message is received on that port.
Review URL: http://codereview.chromium.org/11331
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5936 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/common/mach_message_source_mac.cc')
-rw-r--r-- | chrome/common/mach_message_source_mac.cc | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/chrome/common/mach_message_source_mac.cc b/chrome/common/mach_message_source_mac.cc new file mode 100644 index 0000000..1249d8a --- /dev/null +++ b/chrome/common/mach_message_source_mac.cc @@ -0,0 +1,66 @@ +// Copyright (c) 2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/common/mach_message_source_mac.h" + +#include "base/logging.h" + +MachMessageSource::MachMessageSource(mach_port_t port, + MachPortListener* msg_listener, + bool* success) { + DCHECK(msg_listener); + DCHECK(success); + DCHECK(port != MACH_PORT_NULL); + + CFMachPortContext port_context = {0}; + port_context.info = msg_listener; + + scoped_cftyperef<CFMachPortRef> cf_mach_port_ref( + CFMachPortCreateWithPort(kCFAllocatorDefault, + port, + MachMessageSource::OnReceiveMachMessage, + &port_context, + NULL)); + + if (cf_mach_port_ref.get() == NULL) { + LOG(WARNING) << "CFMachPortCreate failed"; + *success = false; + return; + } + + // Create a RL source. + machport_runloop_ref_.reset( + CFMachPortCreateRunLoopSource(kCFAllocatorDefault, + cf_mach_port_ref.get(), + 0)); + + if (machport_runloop_ref_.get() == NULL) { + LOG(WARNING) << "CFMachPortCreateRunLoopSource failed"; + *success = false; + return; + } + + CFRunLoopAddSource(CFRunLoopGetCurrent(), + machport_runloop_ref_.get(), + kCFRunLoopCommonModes); + *success = true; +} + +MachMessageSource::~MachMessageSource() { + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), + machport_runloop_ref_.get(), + kCFRunLoopCommonModes); +} + +// static +void MachMessageSource::OnReceiveMachMessage(CFMachPortRef port, void* msg, + CFIndex size, void* closure) { + MachPortListener *msg_listener = static_cast<MachPortListener*>(closure); + size_t msg_size = (size < 0) ? 0 : static_cast<size_t>(size); + DCHECK(msg && msg_size > 0); // this should never happen! + + if (msg_listener && msg && msg_size > 0) { + msg_listener->OnMachMessageReceived(msg, msg_size); + } +} |